From f8bc649799ea6a680af004bac08593ec7e332fd7 Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Fri, 14 Jan 2022 17:42:40 -0500 Subject: [PATCH] Fixed issue with odd behaviour when interacting with non-cosmetic helmet with a cosmetic applied --- .../fisher2911/hmccosmetics/HMCCosmetics.java | 5 +- .../hmccosmetics/config/ItemSerializer.java | 3 - .../hmccosmetics/gui/CosmeticsMenu.java | 2 - .../hmccosmetics/gui/DyeSelectorGui.java | 3 - .../listener/InventoryListener.java | 40 +++++ .../fisher2911/hmccosmetics/user/User.java | 12 +- .../hmccosmetics/user/UserManager.java | 140 +++++++++--------- 7 files changed, 122 insertions(+), 83 deletions(-) create mode 100644 src/main/java/io/github/fisher2911/hmccosmetics/listener/InventoryListener.java diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java index 33f8a28c..c808a338 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java @@ -7,6 +7,7 @@ import io.github.fisher2911.hmccosmetics.command.CosmeticsCommand; import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.gui.CosmeticsMenu; import io.github.fisher2911.hmccosmetics.listener.ClickListener; +import io.github.fisher2911.hmccosmetics.listener.InventoryListener; import io.github.fisher2911.hmccosmetics.listener.JoinListener; import io.github.fisher2911.hmccosmetics.listener.RespawnListener; import io.github.fisher2911.hmccosmetics.listener.TeleportListener; @@ -15,6 +16,7 @@ import io.github.fisher2911.hmccosmetics.message.Messages; import io.github.fisher2911.hmccosmetics.user.UserManager; import me.mattstudios.mf.base.CommandManager; import org.bstats.bukkit.Metrics; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.plugin.java.JavaPlugin; import java.util.Arrays; @@ -57,7 +59,8 @@ public class HMCCosmetics extends JavaPlugin { List.of(new JoinListener(this), new ClickListener(this), new TeleportListener(this), - new RespawnListener(this)). + new RespawnListener(this), + new InventoryListener(this)). forEach(listener -> this.getServer().getPluginManager().registerEvents(listener, this) ); diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/config/ItemSerializer.java b/src/main/java/io/github/fisher2911/hmccosmetics/config/ItemSerializer.java index 42ccdac0..85f1530c 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/config/ItemSerializer.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/config/ItemSerializer.java @@ -100,9 +100,6 @@ public class ItemSerializer implements TypeSerializer { Material.class, Material.AIR); final int amount = amountNode.getInt(); final Component name = StringUtils.parse(nameNode.getString()); -// Adventure.MINI_MESSAGE.parse( -// Utils.replaceIfNull(nameNode.getString(), "") -// ); final boolean unbreakable = unbreakableNode.getBoolean(); final boolean glowing = glowingNode.getBoolean(); diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java index 7b5ffeef..20b3eba0 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticsMenu.java @@ -60,8 +60,6 @@ public class CosmeticsMenu { if (gui instanceof final DyeSelectorGui dyeSelectorGui) { dyeSelectorGui.getGui(user, armorItem).open(player); - } else { - player.sendMessage(gui.getClass().toString()); } } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java b/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java index 6d3ef248..7d335502 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java @@ -1,6 +1,5 @@ package io.github.fisher2911.hmccosmetics.gui; -import dev.triumphteam.gui.builder.item.ItemBuilder; import dev.triumphteam.gui.guis.Gui; import dev.triumphteam.gui.guis.GuiItem; import io.github.fisher2911.hmccosmetics.HMCCosmetics; @@ -9,10 +8,8 @@ import io.github.fisher2911.hmccosmetics.user.User; import io.github.fisher2911.hmccosmetics.util.builder.ColorBuilder; import net.kyori.adventure.text.Component; import org.bukkit.Color; -import org.bukkit.Material; import org.bukkit.entity.HumanEntity; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.LeatherArmorMeta; import java.util.Map; import java.util.Optional; diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/listener/InventoryListener.java b/src/main/java/io/github/fisher2911/hmccosmetics/listener/InventoryListener.java new file mode 100644 index 00000000..892d28ed --- /dev/null +++ b/src/main/java/io/github/fisher2911/hmccosmetics/listener/InventoryListener.java @@ -0,0 +1,40 @@ +package io.github.fisher2911.hmccosmetics.listener; + +import io.github.fisher2911.hmccosmetics.HMCCosmetics; +import io.github.fisher2911.hmccosmetics.user.UserManager; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; + +public class InventoryListener implements Listener { + + private final HMCCosmetics plugin; + private final UserManager userManager; + + public InventoryListener(final HMCCosmetics plugin) { + this.plugin = plugin; + this.userManager = this.plugin.getUserManager(); + } + + @EventHandler + public void onInventoryClick(final InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof final Player player)) return; + this.fixHat(player); + } + + @EventHandler + public void onInventoryDrag(final InventoryDragEvent event) { + if (!(event.getWhoClicked() instanceof final Player player)) return; + this.fixHat(player); + } + + private void fixHat(final Player player) { + Bukkit.getScheduler().runTaskLater( + this.plugin, + () -> this.userManager.get(player.getUniqueId()).ifPresent(this.userManager::setFakeHelmet), + 1); + } +} diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java index fe056f34..8566a1c8 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java @@ -4,7 +4,6 @@ import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.wrappers.WrappedDataWatcher; import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor; import io.github.fisher2911.hmccosmetics.message.MessageHandler; @@ -13,13 +12,11 @@ import io.github.fisher2911.hmccosmetics.util.Keys; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_17_R1.entity.CraftWolf; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.entity.Wolf; import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataType; @@ -57,6 +54,15 @@ public class User { return playerArmor; } + public void setPlayerArmor(final PlayerArmor playerArmor) { + this.playerArmor.setBackpack(playerArmor.getBackpack()); + this.playerArmor.setHat(playerArmor.getHat()); + } + + public void removeAllCosmetics() { + this.setPlayerArmor(PlayerArmor.empty()); + } + public int getArmorStandId() { return armorStandId; } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java index 4c594a00..9d107bde 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java @@ -22,6 +22,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitTask; @@ -51,22 +52,9 @@ public class UserManager { public void add(final Player player) { final UUID uuid = player.getUniqueId(); final int armorStandId = this.currentArmorStandId; - final User user = new User(uuid, new PlayerArmor( - new ArmorItem( - new ItemStack(Material.AIR), - "", - new ArrayList<>(), - "", - ArmorItem.Type.HAT - ), - new ArmorItem( - new ItemStack(Material.AIR), - "", - new ArrayList<>(), - "", - ArmorItem.Type.BACKPACK - ) - ), + final User user = new User( + uuid, + PlayerArmor.empty(), armorStandId); this.userMap.put(uuid, user); this.armorStandIdMap.put(armorStandId, user); @@ -86,6 +74,8 @@ public class UserManager { if (user == null) return; + user.removeAllCosmetics(); + this.setFakeHelmet(user); user.despawnAttached(); this.armorStandIdMap.remove(user.getArmorStandId()); @@ -134,7 +124,6 @@ public class UserManager { final ItemStack hat = user.getPlayerArmor().getHat().getItemStack(); final ItemStack second = entry.getSecond(); - if (hat != null && hat .getType() != Material.AIR && second != null && @@ -147,76 +136,83 @@ public class UserManager { } }); - protocolManager.addPacketListener(new PacketAdapter( - this.plugin, - ListenerPriority.NORMAL, - PacketType.Play.Server.SPAWN_ENTITY_LIVING - ) { - @Override - public void onPacketReceiving(PacketEvent event) { - if (event.getPacketType() != PacketType.Play.Server.SPAWN_ENTITY_LIVING) { - return; - } - - event.getPlayer().sendMessage("What the heck * 2"); - - Bukkit.broadcast(Component.text("Received spawn")); - } - - @Override - public void onPacketSending(PacketEvent event) { - if (event.getPacketType() != PacketType.Play.Server.SPAWN_ENTITY_LIVING) { - return; - } - - event.getPlayer().sendMessage("What the heck"); - - PacketContainer packet = event.getPacket(); - - Entity entity = packet.getEntityModifier(event).read(0); - - for (int i = 0; i < 100; i++) { - if (entity == null) { - Bukkit.broadcast(Component.text("Entity null" + packet)); - } else { - Bukkit.broadcast(Component.text("Not null: " + entity.getEntityId())); - } - } - - final int id = entity.getEntityId(); - - final User user = armorStandIdMap.get(id); - - if (user == null) return; - - user.addArmorStandPassenger(entity); - -// user. +// protocolManager.addPacketListener(new PacketAdapter( +// this.plugin, +// ListenerPriority.NORMAL, +// PacketType.Play.Server.SPAWN_ENTITY_LIVING +// ) { +// @Override +// public void onPacketReceiving(PacketEvent event) { +// if (event.getPacketType() != PacketType.Play.Server.SPAWN_ENTITY_LIVING) { +// return; +// } // -// WrappedDataWatcher dataWatcher = WrappedDataWatcher.getEntityWatcher(entity); +// event.getPlayer().sendMessage("What the heck * 2"); // +// Bukkit.broadcast(Component.text("Received spawn")); +// } // -// WrappedDataWatcher.Serializer chatSerializer = WrappedDataWatcher.Registry.getChatComponentSerializer(true); +// @Override +// public void onPacketSending(PacketEvent event) { +// if (event.getPacketType() != PacketType.Play.Server.SPAWN_ENTITY_LIVING) { +// return; +// } // -// dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, chatSerializer), -// Optional.of(WrappedChatComponent.fromChatMessage(leveledMob.getTag() /* or name, or what you need here */)[0].getHandle())); +// event.getPlayer().sendMessage("What the heck"); // -// packet.getWatchableCollectionModifier().write(0, dataWatcher.getWatchableObjects()); +// PacketContainer packet = event.getPacket(); // - event.setPacket(packet); - } - }); +// Entity entity = packet.getEntityModifier(event).read(0); +// +// for (int i = 0; i < 100; i++) { +// if (entity == null) { +// Bukkit.broadcast(Component.text("Entity null" + packet)); +// } else { +// Bukkit.broadcast(Component.text("Not null: " + entity.getEntityId())); +// } +// } +// +// final int id = entity.getEntityId(); +// +// final User user = armorStandIdMap.get(id); +// +// if (user == null) return; +// +// user.addArmorStandPassenger(entity); +// +//// user. +//// +//// WrappedDataWatcher dataWatcher = WrappedDataWatcher.getEntityWatcher(entity); +//// +//// +//// WrappedDataWatcher.Serializer chatSerializer = WrappedDataWatcher.Registry.getChatComponentSerializer(true); +//// +//// dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, chatSerializer), +//// Optional.of(WrappedChatComponent.fromChatMessage(leveledMob.getTag() /* or name, or what you need here */)[0].getHandle())); +//// +//// packet.getWatchableCollectionModifier().write(0, dataWatcher.getWatchableObjects()); +//// +// event.setPacket(packet); +// } +// }); } public void setFakeHelmet(final User user) { - final ItemStack hat = user.getPlayerArmor().getHat().getItemStack(); + ItemStack hat = user.getPlayerArmor().getHat().getItemStack(); final Player player = user.getPlayer(); if (player == null || hat == null) { return; } + if (hat.getType() == Material.AIR) { + final EntityEquipment equipment = player.getEquipment(); + if (equipment != null) { + hat = equipment.getHelmet(); + } + } + final List> equipmentList = new ArrayList<>(); final Map placeholders = Map.of(Placeholder.ALLOWED, "true", @@ -234,6 +230,8 @@ public class UserManager { fake.getIntegers().write(0, player.getEntityId()); fake.getSlotStackPairLists().write(0, equipmentList); + player.sendMessage("Set Hat"); + for (final Player p : Bukkit.getOnlinePlayers()) { try { this.plugin.getProtocolManager().sendServerPacket(p, fake);