From 9cb9bad3c838f3db37f698253b0a1e6cd5906423 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Wed, 30 Aug 2023 22:10:25 -0500 Subject: [PATCH] fix: rework of equipment packet modification to be more vanilla-like --- .../listener/PlayerGameListener.java | 51 +++++++++++-------- .../hmccosmetics/util/InventoryUtils.java | 11 ++++ 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java index 9cf752cc..1283ff38 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java @@ -19,6 +19,7 @@ import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticBalloonType; import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticEmoteType; import com.hibiscusmc.hmccosmetics.gui.Menu; import com.hibiscusmc.hmccosmetics.gui.Menus; +import com.hibiscusmc.hmccosmetics.nms.NMSHandlers; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; import com.hibiscusmc.hmccosmetics.user.CosmeticUsers; import com.hibiscusmc.hmccosmetics.user.manager.UserEmoteManager; @@ -264,7 +265,13 @@ public class PlayerGameListener implements Listener { event.setCancelled(true); return; } - Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> user.updateCosmetic(CosmeticSlot.OFFHAND), 2); + Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> { + user.updateCosmetic(CosmeticSlot.OFFHAND); + List viewers = PacketManager.getViewers(user.getEntity().getLocation()); + if (viewers.isEmpty()) return; + viewers.remove(user.getPlayer()); + NMSHandlers.getHandler().equipmentSlotUpdate(user.getEntity().getEntityId(), EquipmentSlot.HAND, event.getPlayer().getInventory().getItemInMainHand(), viewers); + }, 2); } @EventHandler(priority = EventPriority.NORMAL) @@ -482,28 +489,30 @@ public class PlayerGameListener implements Listener { } List> armor = event.getPacket().getSlotStackPairLists().read(0); - for (EquipmentSlot equipmentSlot : EquipmentSlot.values()) { - if (equipmentSlot.equals(EquipmentSlot.HAND)) { - if (user.getPlayer() == event.getPlayer()) continue; // When a player scrolls real fast, it messes up the mainhand. This fixes it - Pair pair = new Pair<>(EnumWrappers.ItemSlot.MAINHAND, user.getPlayer().getInventory().getItemInMainHand()); - armor.add(pair); - continue; - } - if (equipmentSlot.equals(EquipmentSlot.OFF_HAND)) { - if (Settings.isCosmeticForceOffhandCosmeticShow() && user.hasCosmeticInSlot(CosmeticSlot.OFFHAND)) { - ItemStack item = user.getUserCosmeticItem(CosmeticSlot.OFFHAND); - if (item == null) continue; - Pair pair = new Pair<>(EnumWrappers.ItemSlot.OFFHAND, item); - armor.add(pair); + for (int i = 0; i < armor.size(); i++) { + com.comphenix.protocol.wrappers.Pair pair = armor.get(i); + switch (pair.getFirst()) { + case MAINHAND -> { + if (user.getPlayer() == event.getPlayer()) continue; // When a player scrolls real fast, it messes up the mainhand. This fixes it + armor.set(i, new Pair<>(pair.getFirst(), user.getPlayer().getInventory().getItemInMainHand())); + } + case OFFHAND -> { + if (Settings.isCosmeticForceOffhandCosmeticShow() && user.hasCosmeticInSlot(CosmeticSlot.OFFHAND)) { + ItemStack item = user.getUserCosmeticItem(CosmeticSlot.OFFHAND); + if (item == null) continue; + Pair offhandPair = new Pair<>(EnumWrappers.ItemSlot.OFFHAND, item); + armor.set(i, offhandPair); + } + } + default -> { + CosmeticArmorType cosmeticArmor = (CosmeticArmorType) user.getCosmetic(InventoryUtils.getItemSlotToCosmeticSlot(pair.getFirst())); + if (cosmeticArmor == null) continue; + ItemStack item = user.getUserCosmeticItem(cosmeticArmor); + if (item == null) continue; + Pair armorPair = new Pair<>(InventoryUtils.itemBukkitSlot(cosmeticArmor.getEquipSlot()), item); + armor.set(i, armorPair); } - continue; } - CosmeticArmorType cosmeticArmor = (CosmeticArmorType) user.getCosmetic(InventoryUtils.BukkitCosmeticSlot(equipmentSlot)); - if (cosmeticArmor == null) continue; - ItemStack item = user.getUserCosmeticItem(cosmeticArmor); - if (item == null) continue; - Pair pair = new Pair<>(InventoryUtils.itemBukkitSlot(cosmeticArmor.getEquipSlot()), item); - armor.add(pair); } event.getPacket().getSlotStackPairLists().write(0, armor); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/InventoryUtils.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/InventoryUtils.java index e600738b..18c75154 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/InventoryUtils.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/InventoryUtils.java @@ -52,6 +52,17 @@ public class InventoryUtils { }; } + public static CosmeticSlot getItemSlotToCosmeticSlot(final EnumWrappers.ItemSlot slot) { + return switch (slot) { + case HEAD -> CosmeticSlot.HELMET; + case CHEST -> CosmeticSlot.CHESTPLATE; + case LEGS -> CosmeticSlot.LEGGINGS; + case FEET -> CosmeticSlot.BOOTS; + case OFFHAND -> CosmeticSlot.OFFHAND; + case MAINHAND -> CosmeticSlot.MAINHAND; + }; + } + public static CosmeticSlot BukkitCosmeticSlot(EquipmentSlot slot) { return switch (slot) { case HAND -> CosmeticSlot.MAINHAND;