diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticArmorType.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticArmorType.java index d2be5a76..e31e8523 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticArmorType.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticArmorType.java @@ -27,20 +27,26 @@ public class CosmeticArmorType extends Cosmetic { @Override public void update(@NotNull CosmeticUser user) { + if (user.getUserEmoteManager().isPlayingEmote()) return; Entity entity = Bukkit.getEntity(user.getUniqueId()); if (entity == null) return; - if (user.getUserEmoteManager().isPlayingEmote()) return; // There has to be a better way of doing this... + if (!Settings.isCosmeticForceOffhandCosmeticShow() + && equipSlot.equals(EquipmentSlot.OFF_HAND) + && ((user.getEntity() instanceof Player) && !user.getPlayer().getInventory().getItemInOffHand().getType().isAir())) return; + ItemStack item = getItem(user); + if (item == null) return; + NMSHandlers.getHandler().equipmentSlotUpdate(entity.getEntityId(), equipSlot, item, PacketManager.getViewers(entity.getLocation())); + } + + public ItemStack getItem(@NotNull CosmeticUser user) { ItemStack cosmeticItem = user.getUserCosmeticItem(this); - if (!(entity instanceof HumanEntity humanEntity)) return; - ItemStack equippedItem = humanEntity.getInventory().getItem(equipSlot); + if (!(user.getEntity() instanceof HumanEntity humanEntity)) return null; if (Settings.getShouldAddEnchants(equipSlot)) { + ItemStack equippedItem = humanEntity.getInventory().getItem(equipSlot); cosmeticItem.addUnsafeEnchantments(equippedItem.getEnchantments()); } // Basically, if force offhand is off AND there is no item in an offhand slot, then the equipment packet to add the cosmetic - if (!Settings.isCosmeticForceOffhandCosmeticShow() - && equipSlot.equals(EquipmentSlot.OFF_HAND) - && ((entity instanceof Player) && !user.getPlayer().getInventory().getItemInOffHand().getType().isAir())) return; - NMSHandlers.getHandler().equipmentSlotUpdate(entity.getEntityId(), equipSlot, cosmeticItem, PacketManager.getViewers(entity.getLocation())); + return cosmeticItem; } public EquipmentSlot getEquipSlot() { diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/NMSHandler.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/NMSHandler.java index d9284acc..61a5d120 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/NMSHandler.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/NMSHandler.java @@ -7,8 +7,10 @@ import org.bukkit.Location; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import java.util.HashMap; import java.util.List; public interface NMSHandler { @@ -35,6 +37,12 @@ public interface NMSHandler { List sendTo ); + void equipmentSlotUpdate( + int entityId, + HashMap equipment, + List sendTo + ); + void hideNPCName( Player player, String NPCName); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java index 64526101..e5aa7578 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java @@ -193,9 +193,27 @@ public class CosmeticUser { } public void updateCosmetic() { + bulkUpdateCosmetic(); + } + + private void bulkUpdateCosmetic() { + MessagesUtil.sendDebugMessages("bulkUpdateCosmetic - start"); + HashMap items = new HashMap<>(); + for (Cosmetic cosmetic : getCosmetics()) { + if (cosmetic instanceof CosmeticArmorType armorType) { + if (getUserEmoteManager().isPlayingEmote()) return; + if (!Settings.isCosmeticForceOffhandCosmeticShow() + && armorType.getEquipSlot().equals(EquipmentSlot.OFF_HAND) + && !getPlayer().getInventory().getItemInOffHand().getType().isAir()) continue; + items.put(InventoryUtils.getEquipmentSlot(armorType.getSlot()), armorType.getItem(this)); + continue; + } updateCosmetic(cosmetic.getSlot()); } + if (items.isEmpty()) return; + NMSHandlers.getHandler().equipmentSlotUpdate(getEntity().getEntityId(), items, PlayerUtils.getNearbyPlayers(getEntity().getLocation())); + MessagesUtil.sendDebugMessages("bulkUpdateCosmetic - end - " + items.size()); } public ItemStack getUserCosmeticItem(CosmeticSlot slot) { diff --git a/v1_18_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_18_R2/NMSHandler.java b/v1_18_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_18_R2/NMSHandler.java index 9190d99e..21a5b8b4 100644 --- a/v1_18_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_18_R2/NMSHandler.java +++ b/v1_18_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_18_R2/NMSHandler.java @@ -28,6 +28,7 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { @@ -102,6 +103,27 @@ public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void equipmentSlotUpdate( + int entityId, + HashMap equipment, + List sendTo + ) { + + List> pairs = new ArrayList<>(); + + for (org.bukkit.inventory.EquipmentSlot slot : equipment.keySet()) { + EquipmentSlot nmsSlot = CraftEquipmentSlot.getNMS(slot); + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(equipment.get(slot)); + + Pair pair = new Pair<>(nmsSlot, nmsItem); + pairs.add(pair); + } + + ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void slotUpdate( diff --git a/v1_19_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R1/NMSHandler.java b/v1_19_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R1/NMSHandler.java index 8252b95a..e857ea5c 100644 --- a/v1_19_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R1/NMSHandler.java +++ b/v1_19_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R1/NMSHandler.java @@ -28,6 +28,7 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { @@ -101,6 +102,27 @@ public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void equipmentSlotUpdate( + int entityId, + HashMap equipment, + List sendTo + ) { + + List> pairs = new ArrayList<>(); + + for (org.bukkit.inventory.EquipmentSlot slot : equipment.keySet()) { + EquipmentSlot nmsSlot = CraftEquipmentSlot.getNMS(slot); + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(equipment.get(slot)); + + Pair pair = new Pair<>(nmsSlot, nmsItem); + pairs.add(pair); + } + + ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void slotUpdate( diff --git a/v1_19_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R2/NMSHandler.java b/v1_19_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R2/NMSHandler.java index 07cfd3ea..8f5b7a6e 100644 --- a/v1_19_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R2/NMSHandler.java +++ b/v1_19_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R2/NMSHandler.java @@ -28,6 +28,7 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { @@ -102,6 +103,27 @@ public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void equipmentSlotUpdate( + int entityId, + HashMap equipment, + List sendTo + ) { + + List> pairs = new ArrayList<>(); + + for (org.bukkit.inventory.EquipmentSlot slot : equipment.keySet()) { + EquipmentSlot nmsSlot = CraftEquipmentSlot.getNMS(slot); + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(equipment.get(slot)); + + Pair pair = new Pair<>(nmsSlot, nmsItem); + pairs.add(pair); + } + + ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void slotUpdate( diff --git a/v1_19_R3/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R3/NMSHandler.java b/v1_19_R3/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R3/NMSHandler.java index 9189f0e3..5f649969 100644 --- a/v1_19_R3/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R3/NMSHandler.java +++ b/v1_19_R3/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_19_R3/NMSHandler.java @@ -34,6 +34,7 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { @@ -115,6 +116,27 @@ public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void equipmentSlotUpdate( + int entityId, + HashMap equipment, + List sendTo + ) { + + List> pairs = new ArrayList<>(); + + for (org.bukkit.inventory.EquipmentSlot slot : equipment.keySet()) { + EquipmentSlot nmsSlot = CraftEquipmentSlot.getNMS(slot); + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(equipment.get(slot)); + + Pair pair = new Pair<>(nmsSlot, nmsItem); + pairs.add(pair); + } + + ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void slotUpdate( diff --git a/v1_20_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R1/NMSHandler.java b/v1_20_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R1/NMSHandler.java index 593a0137..08c528c5 100644 --- a/v1_20_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R1/NMSHandler.java +++ b/v1_20_R1/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R1/NMSHandler.java @@ -33,6 +33,7 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { @@ -114,6 +115,27 @@ public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void equipmentSlotUpdate( + int entityId, + HashMap equipment, + List sendTo + ) { + + List> pairs = new ArrayList<>(); + + for (org.bukkit.inventory.EquipmentSlot slot : equipment.keySet()) { + EquipmentSlot nmsSlot = CraftEquipmentSlot.getNMS(slot); + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(equipment.get(slot)); + + Pair pair = new Pair<>(nmsSlot, nmsItem); + pairs.add(pair); + } + + ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void slotUpdate( diff --git a/v1_20_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R2/NMSHandler.java b/v1_20_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R2/NMSHandler.java index f1985bac..f54194be 100644 --- a/v1_20_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R2/NMSHandler.java +++ b/v1_20_R2/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R2/NMSHandler.java @@ -33,6 +33,7 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { @@ -114,6 +115,27 @@ public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void equipmentSlotUpdate( + int entityId, + HashMap equipment, + List sendTo + ) { + + List> pairs = new ArrayList<>(); + + for (org.bukkit.inventory.EquipmentSlot slot : equipment.keySet()) { + EquipmentSlot nmsSlot = CraftEquipmentSlot.getNMS(slot); + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(equipment.get(slot)); + + Pair pair = new Pair<>(nmsSlot, nmsItem); + pairs.add(pair); + } + + ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void slotUpdate( diff --git a/v1_20_R3/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R3/NMSHandler.java b/v1_20_R3/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R3/NMSHandler.java index 17f136ee..1c9207fa 100644 --- a/v1_20_R3/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R3/NMSHandler.java +++ b/v1_20_R3/src/main/java/com/hibiscusmc/hmccosmetics/nms/v1_20_R3/NMSHandler.java @@ -33,6 +33,7 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { @@ -114,6 +115,27 @@ public class NMSHandler implements com.hibiscusmc.hmccosmetics.nms.NMSHandler { for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void equipmentSlotUpdate( + int entityId, + HashMap equipment, + List sendTo + ) { + + List> pairs = new ArrayList<>(); + + for (org.bukkit.inventory.EquipmentSlot slot : equipment.keySet()) { + EquipmentSlot nmsSlot = CraftEquipmentSlot.getNMS(slot); + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(equipment.get(slot)); + + Pair pair = new Pair<>(nmsSlot, nmsItem); + pairs.add(pair); + } + + ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void slotUpdate(