From 63681ab9cfb40b053c352e50c6e0f66e8458f9ae Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Thu, 13 Jan 2022 21:12:50 -0500 Subject: [PATCH 1/9] Trying out armor stand packets --- .../fisher2911/hmccosmetics/user/User.java | 112 +++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) 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 0553910f..fe056f34 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java @@ -1,19 +1,31 @@ package io.github.fisher2911.hmccosmetics.user; +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; import io.github.fisher2911.hmccosmetics.message.Messages; 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; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.UUID; @@ -24,9 +36,13 @@ public class User { private ArmorStand attached; private ArmorItem lastSetItem; - public User(final UUID uuid, final PlayerArmor playerArmor) { + private final int armorStandId; + private boolean hasArmorStand; + + public User(final UUID uuid, final PlayerArmor playerArmor, final int armorStandId) { this.uuid = uuid; this.playerArmor = playerArmor; + this.armorStandId = armorStandId; } public @Nullable Player getPlayer() { @@ -41,6 +57,10 @@ public class User { return playerArmor; } + public int getArmorStandId() { + return armorStandId; + } + public void setBackpack(final ArmorItem backpack) { this.playerArmor.setBackpack(backpack); this.lastSetItem = backpack; @@ -137,6 +157,11 @@ public class User { // teleports armor stand to the correct position public void updateArmorStand() { + if (true) { + this.updatePacketArmorStand(); + return; + } + final ArmorItem backpackArmorItem = this.playerArmor.getBackpack(); if (backpackArmorItem == null) { this.despawnAttached(); @@ -193,6 +218,91 @@ public class User { player.getLocation().getPitch()); } + public void spawnPacketArmorstand() { + + final Player player = this.getPlayer(); + + if (player == null) { + this.updatePacketArmorStand(); + return; + } + + this.hasArmorStand = true; + + final Location location = player.getLocation(); + + final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + + final PacketContainer packet = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY); + + // Entity ID + packet.getIntegers().write(0, this.armorStandId); + // Entity Type + packet.getIntegers().write(6, 78); + // Set optional velocity (/8000) + packet.getIntegers().write(1, 0); + packet.getIntegers().write(2, 0); + packet.getIntegers().write(3, 0); + // Set yaw pitch + packet.getIntegers().write(4, (int) location.getPitch()); + packet.getIntegers().write(5, (int) location.getYaw()); + // Set location + packet.getDoubles().write(0, location.getX()); + packet.getDoubles().write(1, location.getY()); + packet.getDoubles().write(2, location.getZ()); + // Set UUID + packet.getUUIDs().write(0, UUID.randomUUID()); + + packet.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); + + for (final Player p : Bukkit.getOnlinePlayers()) { + try { + protocolManager.sendServerPacket(p, packet); + + player.sendMessage(this.armorStandId + ""); + + packet.getEntityModifier(player.getWorld()).read(0); + + packet.getEntityModifier(player.getWorld()).getValues().forEach( + e -> { + if (e == null) { + player.sendMessage("entity null"); + return; + } + try { + player.sendMessage(String.valueOf(e.getEntityId())); + } catch (final IllegalArgumentException exception) { + player.sendMessage("Exception"); + } + if (e instanceof final LivingEntity entity) { + entity.getEquipment().setHelmet(this.playerArmor.getBackpack().getItemStack()); + } + } + ); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + } + + public void updatePacketArmorStand() { + if (!this.hasArmorStand) { + this.spawnPacketArmorstand(); + this.getPlayer().sendMessage("Spawning armor stand"); + } + + } + + public void addArmorStandPassenger(final Entity entity) { + final Player player = this.getPlayer(); + + if (player == null) return; + + if (!player.getPassengers().contains(entity)) { + player.addPassenger(entity); + } + } + public void despawnAttached() { if (this.attached == null) { return; From 44c99ae6d2700cfa2b872dd23407d4d3b49056e6 Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Thu, 13 Jan 2022 21:14:08 -0500 Subject: [PATCH 2/9] Forgot to commit UserManager class in the previous commit --- .../hmccosmetics/user/UserManager.java | 99 +++++++++++++++---- 1 file changed, 82 insertions(+), 17 deletions(-) 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 59466d9f..4c594a00 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java @@ -1,31 +1,25 @@ package io.github.fisher2911.hmccosmetics.user; import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; -import com.comphenix.protocol.events.PacketListener; -import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.Pair; -import dev.triumphteam.gui.guis.GuiItem; +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor; import io.github.fisher2911.hmccosmetics.message.Placeholder; import io.github.fisher2911.hmccosmetics.util.Keys; -import io.github.fisher2911.hmccosmetics.util.builder.ColorBuilder; import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; -import net.minecraft.network.protocol.game.PacketPlayOutEntityEquipment; -import net.minecraft.world.entity.EnumItemSlot; -import net.minecraft.world.level.levelgen.HeightMap; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; -import org.bukkit.Color; import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -34,8 +28,6 @@ import org.bukkit.scheduler.BukkitTask; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; @@ -43,9 +35,11 @@ import java.util.UUID; public class UserManager { + private int currentArmorStandId = Integer.MAX_VALUE; private final HMCCosmetics plugin; private final Map userMap = new HashMap<>(); + private final Map armorStandIdMap = new HashMap<>(); private BukkitTask teleportTask; @@ -56,7 +50,8 @@ public class UserManager { public void add(final Player player) { final UUID uuid = player.getUniqueId(); - this.userMap.put(uuid, new User(uuid, new PlayerArmor( + final int armorStandId = this.currentArmorStandId; + final User user = new User(uuid, new PlayerArmor( new ArmorItem( new ItemStack(Material.AIR), "", @@ -71,7 +66,11 @@ public class UserManager { "", ArmorItem.Type.BACKPACK ) - ))); + ), + armorStandId); + this.userMap.put(uuid, user); + this.armorStandIdMap.put(armorStandId, user); + this.currentArmorStandId--; } public Optional get(final UUID uuid) { @@ -83,8 +82,13 @@ public class UserManager { } public void remove(final UUID uuid) { - this.get(uuid).ifPresent(User::detach); - this.userMap.remove(uuid); + final User user = this.userMap.remove(uuid); + + if (user == null) return; + + user.despawnAttached(); + + this.armorStandIdMap.remove(user.getArmorStandId()); } public void startTeleportTask() { @@ -98,7 +102,8 @@ public class UserManager { private void registerPacketListener() { final ProtocolManager protocolManager = this.plugin.getProtocolManager(); - protocolManager.addPacketListener(new PacketAdapter(this.plugin, + protocolManager.addPacketListener(new PacketAdapter( + this.plugin, ListenerPriority.NORMAL, PacketType.Play.Server.ENTITY_EQUIPMENT) { @Override @@ -141,6 +146,66 @@ 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. +// +// 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) { 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 3/9] 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); From 520b9854f57230cd05142f7135eabaaa68046c9d Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Fri, 14 Jan 2022 20:16:34 -0500 Subject: [PATCH 4/9] Potential sitting fix --- .../fisher2911/hmccosmetics/HMCCosmetics.java | 5 +- .../hmccosmetics/listener/ClickListener.java | 1 + ...istener.java => HatRemoveFixListener.java} | 11 +- .../fisher2911/hmccosmetics/user/User.java | 121 ++++++++++++++---- .../hmccosmetics/user/UserManager.java | 2 +- 5 files changed, 108 insertions(+), 32 deletions(-) rename src/main/java/io/github/fisher2911/hmccosmetics/listener/{InventoryListener.java => HatRemoveFixListener.java} (78%) diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java index c808a338..d9077b63 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java @@ -7,7 +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.HatRemoveFixListener; import io.github.fisher2911.hmccosmetics.listener.JoinListener; import io.github.fisher2911.hmccosmetics.listener.RespawnListener; import io.github.fisher2911.hmccosmetics.listener.TeleportListener; @@ -16,7 +16,6 @@ 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; @@ -60,7 +59,7 @@ public class HMCCosmetics extends JavaPlugin { new ClickListener(this), new TeleportListener(this), new RespawnListener(this), - new InventoryListener(this)). + new HatRemoveFixListener(this)). forEach(listener -> this.getServer().getPluginManager().registerEvents(listener, this) ); diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java b/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java index 84f64028..4969598e 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/listener/ClickListener.java @@ -10,6 +10,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.PlayerInventory; +import org.spigotmc.event.entity.EntityMountEvent; 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/HatRemoveFixListener.java similarity index 78% rename from src/main/java/io/github/fisher2911/hmccosmetics/listener/InventoryListener.java rename to src/main/java/io/github/fisher2911/hmccosmetics/listener/HatRemoveFixListener.java index 892d28ed..328cbf49 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/listener/InventoryListener.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/listener/HatRemoveFixListener.java @@ -8,13 +8,14 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryDragEvent; +import org.spigotmc.event.entity.EntityMountEvent; -public class InventoryListener implements Listener { +public class HatRemoveFixListener implements Listener { private final HMCCosmetics plugin; private final UserManager userManager; - public InventoryListener(final HMCCosmetics plugin) { + public HatRemoveFixListener(final HMCCosmetics plugin) { this.plugin = plugin; this.userManager = this.plugin.getUserManager(); } @@ -31,6 +32,12 @@ public class InventoryListener implements Listener { this.fixHat(player); } + @EventHandler + public void test(final EntityMountEvent event) { + if (!(event.getEntity() instanceof final Player player)) return; + this.fixHat(player); + } + private void fixHat(final Player player) { Bukkit.getScheduler().runTaskLater( this.plugin, 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 8566a1c8..59b0ef9c 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java @@ -4,12 +4,24 @@ 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.EnumWrappers; +import com.comphenix.protocol.wrappers.Pair; +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.sun.jdi.InvocationException; +import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor; import io.github.fisher2911.hmccosmetics.message.MessageHandler; import io.github.fisher2911.hmccosmetics.message.Messages; +import io.github.fisher2911.hmccosmetics.message.Placeholder; import io.github.fisher2911.hmccosmetics.util.Keys; +import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; +import net.minecraft.network.protocol.game.PacketPlayOutEntityHeadRotation; +import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; +import net.minecraft.network.syncher.DataWatcher; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.ArmorStand; @@ -24,6 +36,9 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.UUID; public class User { @@ -233,6 +248,7 @@ public class User { return; } + this.hasArmorStand = true; final Location location = player.getLocation(); @@ -244,11 +260,7 @@ public class User { // Entity ID packet.getIntegers().write(0, this.armorStandId); // Entity Type - packet.getIntegers().write(6, 78); - // Set optional velocity (/8000) - packet.getIntegers().write(1, 0); - packet.getIntegers().write(2, 0); - packet.getIntegers().write(3, 0); +// packet.getIntegers().write(6, 78); // Set yaw pitch packet.getIntegers().write(4, (int) location.getPitch()); packet.getIntegers().write(5, (int) location.getYaw()); @@ -261,30 +273,17 @@ public class User { packet.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); + final PacketContainer ridingPacket = new PacketContainer(PacketType.Play.Server.MOUNT); + ridingPacket. + getIntegers(). + write(0, player.getEntityId()); + ridingPacket.getIntegerArrays().write(0, new int[]{this.armorStandId}); + for (final Player p : Bukkit.getOnlinePlayers()) { try { protocolManager.sendServerPacket(p, packet); + protocolManager.sendServerPacket(p, ridingPacket); - player.sendMessage(this.armorStandId + ""); - - packet.getEntityModifier(player.getWorld()).read(0); - - packet.getEntityModifier(player.getWorld()).getValues().forEach( - e -> { - if (e == null) { - player.sendMessage("entity null"); - return; - } - try { - player.sendMessage(String.valueOf(e.getEntityId())); - } catch (final IllegalArgumentException exception) { - player.sendMessage("Exception"); - } - if (e instanceof final LivingEntity entity) { - entity.getEquipment().setHelmet(this.playerArmor.getBackpack().getItemStack()); - } - } - ); } catch (InvocationTargetException e) { e.printStackTrace(); } @@ -294,9 +293,79 @@ public class User { public void updatePacketArmorStand() { if (!this.hasArmorStand) { this.spawnPacketArmorstand(); - this.getPlayer().sendMessage("Spawning armor stand"); + return; } + final Player player = this.getPlayer(); + + if (player == null) return; + + final List> equipmentList = new ArrayList<>(); + + final Map placeholders = Map.of(Placeholder.ALLOWED, "true", + Placeholder.ENABLED, "true"); + + equipmentList.add(new Pair<>(EnumWrappers.ItemSlot.HEAD, + ItemBuilder.from(this.playerArmor.getBackpack().getItemStack()). + namePlaceholders(placeholders). + lorePlaceholders(placeholders). + build() + )); + + final PacketContainer armorPacket = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); + armorPacket.getIntegers().write(0, this.armorStandId); + armorPacket.getSlotStackPairLists().write(0, equipmentList); + +// final PacketContainer rotationContainer = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); +// final Location location = player.getLocation(); +// rotationContainer. +// getIntegers(). +// write(0, this.armorStandId); +// rotationContainer. +// getBytes(). +// write(0, (byte) (location.getYaw() * 256.0F / 360.0F)); +// +// final PacketContainer rotationContainer2 = new PacketContainer(PacketType.Play.Server.ENTITY_HEAD_ROTATION); +// rotationContainer2. +// getIntegers(). +// write(0, this.armorStandId); +// rotationContainer2. +// getBytes(). +// write(0, (byte) (location.getPitch() * 256.0F / 360.0F)); + + final PacketContainer metaContainer = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); +// metaContainer. +// getBytes(). +// write(15, (byte) 0x01); + + + WrappedChatComponent wrappedChatComponent = WrappedChatComponent.fromText(ChatColor.RED + "TEST"); + Optional opt = Optional.of(wrappedChatComponent); + + WrappedDataWatcher metadata = new WrappedDataWatcher(); + metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01)); //isSmall, noBasePlate, set Marker +// metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01)); //isSmall, noBasePlate, set Marker + + metaContainer.getIntegers().write(0, this.armorStandId); + metaContainer.getWatchableCollectionModifier().write(0, metadata.getWatchableObjects()); + +// final WrappedDataWatcher dataWatcher = new WrappedDataWatcher(); +// dataWatcher.setObject(15, (byte) 0x01); +// +// metaContainer.getDataWatcherModifier().write( +// 0, dataWatcher +// ); + + final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + + for (final Player p : Bukkit.getOnlinePlayers()) { + try { + protocolManager.sendServerPacket(p, armorPacket); + protocolManager.sendServerPacket(p, metaContainer); + } catch (final InvocationTargetException exception) { + exception.printStackTrace(); + } + } } public void addArmorStandPassenger(final Entity entity) { 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 9d107bde..cdd2ec71 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java @@ -209,7 +209,7 @@ public class UserManager { if (hat.getType() == Material.AIR) { final EntityEquipment equipment = player.getEquipment(); if (equipment != null) { - hat = equipment.getHelmet(); + hat = equipment.getHelmet() == null ? hat : equipment.getHelmet(); } } From cc0b2d75b7cc71abfb1f3ee865ca051d89027547 Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Fri, 14 Jan 2022 20:36:46 -0500 Subject: [PATCH 5/9] Possible rotation working --- .../fisher2911/hmccosmetics/user/User.java | 43 +++++-------------- .../hmccosmetics/user/UserManager.java | 2 - 2 files changed, 11 insertions(+), 34 deletions(-) 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 59b0ef9c..362a69a5 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java @@ -6,6 +6,7 @@ import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.Pair; +import com.comphenix.protocol.wrappers.Vector3F; import com.comphenix.protocol.wrappers.WrappedChatComponent; import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.sun.jdi.InvocationException; @@ -17,6 +18,7 @@ import io.github.fisher2911.hmccosmetics.message.Messages; import io.github.fisher2911.hmccosmetics.message.Placeholder; import io.github.fisher2911.hmccosmetics.util.Keys; import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; +import net.minecraft.core.Vector3f; import net.minecraft.network.protocol.game.PacketPlayOutEntityHeadRotation; import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; import net.minecraft.network.syncher.DataWatcher; @@ -32,6 +34,8 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataType; +import org.bukkit.util.EulerAngle; +import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import java.lang.reflect.InvocationTargetException; @@ -316,46 +320,21 @@ public class User { armorPacket.getIntegers().write(0, this.armorStandId); armorPacket.getSlotStackPairLists().write(0, equipmentList); -// final PacketContainer rotationContainer = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); -// final Location location = player.getLocation(); -// rotationContainer. -// getIntegers(). -// write(0, this.armorStandId); -// rotationContainer. -// getBytes(). -// write(0, (byte) (location.getYaw() * 256.0F / 360.0F)); -// -// final PacketContainer rotationContainer2 = new PacketContainer(PacketType.Play.Server.ENTITY_HEAD_ROTATION); -// rotationContainer2. -// getIntegers(). -// write(0, this.armorStandId); -// rotationContainer2. -// getBytes(). -// write(0, (byte) (location.getPitch() * 256.0F / 360.0F)); + final Location location = player.getLocation(); final PacketContainer metaContainer = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); -// metaContainer. -// getBytes(). -// write(15, (byte) 0x01); - - - WrappedChatComponent wrappedChatComponent = WrappedChatComponent.fromText(ChatColor.RED + "TEST"); - Optional opt = Optional.of(wrappedChatComponent); WrappedDataWatcher metadata = new WrappedDataWatcher(); - metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01)); //isSmall, noBasePlate, set Marker -// metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01)); //isSmall, noBasePlate, set Marker + metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(16, + WrappedDataWatcher.Registry.get(Vector3F.getMinecraftClass())), new Vector3f( + 0, + location.getYaw(), + 0 + )); //isSmall, noBasePlate, set Marker metaContainer.getIntegers().write(0, this.armorStandId); metaContainer.getWatchableCollectionModifier().write(0, metadata.getWatchableObjects()); -// final WrappedDataWatcher dataWatcher = new WrappedDataWatcher(); -// dataWatcher.setObject(15, (byte) 0x01); -// -// metaContainer.getDataWatcherModifier().write( -// 0, dataWatcher -// ); - final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); for (final Player p : Bukkit.getOnlinePlayers()) { 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 cdd2ec71..a27b0655 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java @@ -230,8 +230,6 @@ 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); From 22f095f236800186bad9e34c3ceab400b09416d9 Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Sat, 15 Jan 2022 21:29:56 -0500 Subject: [PATCH 6/9] Current state of trying to use packets (A giant mess) --- .../command/CosmeticsCommand.java | 5 - .../fisher2911/hmccosmetics/user/User.java | 115 ++++++++++++++---- 2 files changed, 93 insertions(+), 27 deletions(-) diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java b/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java index 8bdd0fe3..4fcd6b9b 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/command/CosmeticsCommand.java @@ -3,8 +3,6 @@ package io.github.fisher2911.hmccosmetics.command; import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.gui.CosmeticsMenu; -import io.github.fisher2911.hmccosmetics.gui.DyeSelectorGui; -import io.github.fisher2911.hmccosmetics.message.Message; import io.github.fisher2911.hmccosmetics.message.MessageHandler; import io.github.fisher2911.hmccosmetics.message.Messages; import io.github.fisher2911.hmccosmetics.user.User; @@ -16,12 +14,9 @@ import me.mattstudios.mf.annotations.Permission; import me.mattstudios.mf.annotations.SubCommand; import me.mattstudios.mf.base.CommandBase; import org.bukkit.Bukkit; -import org.bukkit.Color; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.Map; -import java.util.Objects; import java.util.Optional; @Command("cosmetics") 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 362a69a5..faf099cf 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java @@ -18,6 +18,7 @@ import io.github.fisher2911.hmccosmetics.message.Messages; import io.github.fisher2911.hmccosmetics.message.Placeholder; import io.github.fisher2911.hmccosmetics.util.Keys; import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; +import it.unimi.dsi.fastutil.ints.IntArrayList; import net.minecraft.core.Vector3f; import net.minecraft.network.protocol.game.PacketPlayOutEntityHeadRotation; import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; @@ -26,6 +27,7 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftArmorStand; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -243,7 +245,7 @@ public class User { player.getLocation().getPitch()); } - public void spawnPacketArmorstand() { + public void spawnPacketArmorStand() { final Player player = this.getPlayer(); @@ -252,7 +254,6 @@ public class User { return; } - this.hasArmorStand = true; final Location location = player.getLocation(); @@ -269,25 +270,17 @@ public class User { packet.getIntegers().write(4, (int) location.getPitch()); packet.getIntegers().write(5, (int) location.getYaw()); // Set location - packet.getDoubles().write(0, location.getX()); - packet.getDoubles().write(1, location.getY()); - packet.getDoubles().write(2, location.getZ()); + packet.getDoubles().write(0, 0d); + packet.getDoubles().write(1, -5d); + packet.getDoubles().write(2, 0d); // Set UUID packet.getUUIDs().write(0, UUID.randomUUID()); - packet.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); - - final PacketContainer ridingPacket = new PacketContainer(PacketType.Play.Server.MOUNT); - ridingPacket. - getIntegers(). - write(0, player.getEntityId()); - ridingPacket.getIntegerArrays().write(0, new int[]{this.armorStandId}); + packet.getEntityTypeModifier().write(0, EntityType.ZOMBIE); for (final Player p : Bukkit.getOnlinePlayers()) { try { protocolManager.sendServerPacket(p, packet); - protocolManager.sendServerPacket(p, ridingPacket); - } catch (InvocationTargetException e) { e.printStackTrace(); } @@ -296,7 +289,7 @@ public class User { public void updatePacketArmorStand() { if (!this.hasArmorStand) { - this.spawnPacketArmorstand(); + this.spawnPacketArmorStand(); return; } @@ -320,33 +313,111 @@ public class User { armorPacket.getIntegers().write(0, this.armorStandId); armorPacket.getSlotStackPairLists().write(0, equipmentList); +// final PacketContainer rotationContainer = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); final Location location = player.getLocation(); +// rotationContainer. +// getIntegers(). +// write(0, this.armorStandId); +// rotationContainer. +// getBytes(). +// write(0, (byte) (location.getYaw() * 256.0F / 360.0F)); +// +// final PacketContainer rotationContainer2 = new PacketContainer(PacketType.Play.Server.ENTITY_HEAD_ROTATION); +// rotationContainer2. +// getIntegers(). +// write(0, this.armorStandId); +// rotationContainer2. +// getBytes(). +// write(0, (byte) (location.getPitch() * 256.0F / 360.0F)); final PacketContainer metaContainer = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); +// metaContainer. +// getBytes(). +// write(15, (byte) 0x01); - WrappedDataWatcher metadata = new WrappedDataWatcher(); - metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(16, - WrappedDataWatcher.Registry.get(Vector3F.getMinecraftClass())), new Vector3f( - 0, + + + WrappedDataWatcher metaData = new WrappedDataWatcher(); + metaData.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x20)); //isSmall, noBasePlate, set Marker + metaData.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01)); //isSmall, noBasePlate, set Marker + + /* metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(8, WrappedDataWatcher.Registry.get(Vector3F.getMinecraftClass())), new Vector3f( + location.getPitch(), location.getYaw(), 0 - )); //isSmall, noBasePlate, set Marker + ));*/ //isSmall, noBasePlate, set Marker +// metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(16, WrappedDataWatcher.Registry.(), new Vector())); + + final PacketContainer rotationPacket = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE_LOOK); + + rotationPacket.getIntegers().write(0, this.armorStandId); + rotationPacket. + getShorts(). + write(0, (short) 0). + write(1, (short) -5). + write(2, (short) 0); + rotationPacket. + getBytes(). + write(0, (byte) (location.getYaw() * 256.0F / 360.0F)). + write(1, (byte) (location.getPitch() * 256.0F / 360.0F)); metaContainer.getIntegers().write(0, this.armorStandId); - metaContainer.getWatchableCollectionModifier().write(0, metadata.getWatchableObjects()); +// metaContainer.getWatchableCollectionModifier().write(0, metaData.getWatchableObjects()); + +// final WrappedDataWatcher dataWatcher = new WrappedDataWatcher(); +// dataWatcher.setObject(15, (byte) 0x01); +// +// metaContainer.getDataWatcherModifier().write( +// 0, dataWatcher +// ); final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + final PacketContainer teleportPacket = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); + + teleportPacket.getIntegers().write(0, this.armorStandId); + teleportPacket.getDoubles(). + write(0, location.getX()). + write(1, location.getY()). + write(2, location.getZ()); + + teleportPacket.getBytes(). + write(0, (byte) (location.getYaw() * 256.0F / 360.0F)). + write(1, (byte) (location.getPitch() * 256.0F / 360.0F)); + + final PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); +// destroyPacket.getIntegerArrays().write(0, new int[]{this.armorStandId}); + destroyPacket.getModifier().write(0, new IntArrayList(new int[]{this.armorStandId})); + + final PacketContainer ridingPacket = new PacketContainer(PacketType.Play.Server.MOUNT); + ridingPacket. + getIntegers(). + write(0, player.getEntityId()); + ridingPacket.getIntegerArrays().write(0, new int[]{this.armorStandId}); + for (final Player p : Bukkit.getOnlinePlayers()) { try { +// protocolManager.sendServerPacket(p, destroyPacket); + if (i == 0) { + i++; +// protocolManager.sendServerPacket(p, ridingPacket); + } protocolManager.sendServerPacket(p, armorPacket); - protocolManager.sendServerPacket(p, metaContainer); +// protocolManager.sendServerPacket(p, metaContainer); + protocolManager.sendServerPacket(p, rotationPacket); +// protocolManager.sendServerPacket(p, teleportPacket); +// protocolManager.sendServerPacket(p, rotationPacket2); +// protocolManager.sendServerPacket(p, removeRiderPacket); +// protocolManager.sendServerPacket(p, rotationPacket2); +// i++; } catch (final InvocationTargetException exception) { exception.printStackTrace(); } } } + int i = 0; + public void addArmorStandPassenger(final Entity entity) { final Player player = this.getPlayer(); From 67cf6d326711f337b0bbfa45493e8901ca0034a0 Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Sun, 16 Jan 2022 14:29:38 -0500 Subject: [PATCH 7/9] Armor stands work now??? --- .../fisher2911/hmccosmetics/user/User.java | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) 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 faf099cf..997d8888 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java @@ -276,7 +276,7 @@ public class User { // Set UUID packet.getUUIDs().write(0, UUID.randomUUID()); - packet.getEntityTypeModifier().write(0, EntityType.ZOMBIE); + packet.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); for (final Player p : Bukkit.getOnlinePlayers()) { try { @@ -348,18 +348,23 @@ public class User { ));*/ //isSmall, noBasePlate, set Marker // metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(16, WrappedDataWatcher.Registry.(), new Vector())); - final PacketContainer rotationPacket = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE_LOOK); +// final PacketContainer rotationPacket = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE_LOOK); +// +// rotationPacket.getIntegers().write(0, this.armorStandId); +// rotationPacket. +// getShorts(). +// write(0, (short) 0). +// write(1, (short) -5). +// write(2, (short) 0); +// rotationPacket. +// getBytes(). +// write(0, (byte) (location.getYaw() * 256.0F / 360.0F)). +// write(1, (byte) (location.getPitch() * 256.0F / 360.0F)); + + final PacketContainer rotationPacket = new PacketContainer(PacketType.Play.Server.ENTITY_HEAD_ROTATION); rotationPacket.getIntegers().write(0, this.armorStandId); - rotationPacket. - getShorts(). - write(0, (short) 0). - write(1, (short) -5). - write(2, (short) 0); - rotationPacket. - getBytes(). - write(0, (byte) (location.getYaw() * 256.0F / 360.0F)). - write(1, (byte) (location.getPitch() * 256.0F / 360.0F)); + rotationPacket.getBytes().write(0, (byte) (location.getYaw() * 256 / 360)); metaContainer.getIntegers().write(0, this.armorStandId); // metaContainer.getWatchableCollectionModifier().write(0, metaData.getWatchableObjects()); @@ -400,7 +405,7 @@ public class User { // protocolManager.sendServerPacket(p, destroyPacket); if (i == 0) { i++; -// protocolManager.sendServerPacket(p, ridingPacket); + protocolManager.sendServerPacket(p, ridingPacket); } protocolManager.sendServerPacket(p, armorPacket); // protocolManager.sendServerPacket(p, metaContainer); From 66ff99e6574560e4f107f166dfdca7f356b4fccc Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Sun, 16 Jan 2022 15:32:44 -0500 Subject: [PATCH 8/9] Added placeholder api --- .idea/modules/HMCCosmetics.main.iml | 1 - build.gradle | 2 + .../fisher2911/hmccosmetics/HMCCosmetics.java | 8 + .../hmccosmetics/config/DyeGuiSerializer.java | 7 +- .../hmccosmetics/config/GuiSerializer.java | 10 +- .../hmccosmetics/gui/CosmeticGui.java | 13 + .../hmccosmetics/gui/DyeSelectorGui.java | 21 +- .../hmccosmetics/message/MessageHandler.java | 53 ++-- .../hmccosmetics/message/Placeholder.java | 1 + .../hmccosmetics/papi/PAPIHook.java | 12 + .../fisher2911/hmccosmetics/user/User.java | 244 ++++-------------- .../hmccosmetics/user/UserManager.java | 74 +----- .../hmccosmetics/util/StringUtils.java | 22 +- .../util/builder/ItemBuilder.java | 34 +++ src/main/resources/plugin.yml | 1 + 15 files changed, 206 insertions(+), 297 deletions(-) create mode 100644 src/main/java/io/github/fisher2911/hmccosmetics/papi/PAPIHook.java diff --git a/.idea/modules/HMCCosmetics.main.iml b/.idea/modules/HMCCosmetics.main.iml index 97829813..85578b10 100644 --- a/.idea/modules/HMCCosmetics.main.iml +++ b/.idea/modules/HMCCosmetics.main.iml @@ -4,7 +4,6 @@ - PAPER MCP ADVENTURE diff --git a/build.gradle b/build.gradle index e4a23b5e..aa3bcd0c 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,7 @@ repositories { maven { url = 'https://jitpack.io' } maven { url = 'https://repo.leonardobishop.com/releases/' } maven { url = 'https://repo.dmulloy2.net/repository/public/' } + maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } } dependencies { @@ -23,6 +24,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:22.0.0' compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.0' compileOnly 'net.kyori:adventure-api:4.9.3' + compileOnly 'me.clip:placeholderapi:2.10.9' implementation 'net.kyori:adventure-text-minimessage:4.2.0-SNAPSHOT' implementation 'net.kyori:adventure-platform-bukkit:4.0.0' implementation 'dev.triumphteam:triumph-gui:3.0.3' diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java index d9077b63..a8d8695c 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java @@ -16,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.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import java.util.Arrays; @@ -29,6 +30,7 @@ public class HMCCosmetics extends JavaPlugin { private MessageHandler messageHandler; private CosmeticsMenu cosmeticsMenu; private CommandManager commandManager; + private boolean papiEnabled; @Override public void onEnable() { @@ -45,6 +47,8 @@ public class HMCCosmetics extends JavaPlugin { this.registerListeners(); this.userManager.startTeleportTask(); + + this.papiEnabled = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; } @Override @@ -100,5 +104,9 @@ public class HMCCosmetics extends JavaPlugin { public ProtocolManager getProtocolManager() { return protocolManager; } + + public boolean isPapiEnabled() { + return papiEnabled; + } } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/config/DyeGuiSerializer.java b/src/main/java/io/github/fisher2911/hmccosmetics/config/DyeGuiSerializer.java index 48855314..e7beab3a 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/config/DyeGuiSerializer.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/config/DyeGuiSerializer.java @@ -5,6 +5,7 @@ import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.gui.ColorItem; import io.github.fisher2911.hmccosmetics.gui.DyeSelectorGui; import io.github.fisher2911.hmccosmetics.message.Adventure; +import io.github.fisher2911.hmccosmetics.util.StringUtils; import org.bukkit.Color; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.configurate.ConfigurationNode; @@ -81,10 +82,14 @@ public class DyeGuiSerializer implements TypeSerializer { guiItemMap.put(slot, new ColorItem(guiItem.getItemStack(), Color.fromRGB(red, green, blue))); } + String title = titleNode.getString(); + + if (title == null) title = ""; + return new DyeSelectorGui( plugin, Adventure.SERIALIZER.serialize( - Adventure.MINI_MESSAGE.parse(titleNode.getString())), + Adventure.MINI_MESSAGE.parse(StringUtils.applyPapiPlaceholders(null, title))), rowsNode.getInt(), guiItemMap); } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java b/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java index 0b170955..59c7e95c 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java @@ -4,6 +4,8 @@ import dev.triumphteam.gui.guis.GuiItem; import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.gui.CosmeticGui; import io.github.fisher2911.hmccosmetics.message.Adventure; +import io.github.fisher2911.hmccosmetics.papi.PAPIHook; +import io.github.fisher2911.hmccosmetics.util.StringUtils; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.configurate.ConfigurationNode; import org.spongepowered.configurate.serialize.SerializationException; @@ -43,7 +45,7 @@ public class GuiSerializer implements TypeSerializer { final ConfigurationNode rowsNode = this.nonVirtualNode(source, ROWS); final ConfigurationNode itemsNode = source.node(ITEMS); - final var childrenMap = source.node(ITEMS).childrenMap(); + final var childrenMap = itemsNode.childrenMap(); final Map guiItemMap = new HashMap<>(); @@ -60,9 +62,13 @@ public class GuiSerializer implements TypeSerializer { guiItemMap.put(slot, guiItem); } + String title = titleNode.getString(); + + if (title == null) title = ""; + return new CosmeticGui(plugin, Adventure.SERIALIZER.serialize( - Adventure.MINI_MESSAGE.parse(titleNode.getString())), + Adventure.MINI_MESSAGE.parse(StringUtils.applyPapiPlaceholders(null, title))), rowsNode.getInt(), guiItemMap); } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java index ef6e2ce7..e60bb5f5 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java @@ -15,6 +15,7 @@ import org.bukkit.Bukkit; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; import java.util.HashMap; import java.util.Locale; @@ -27,6 +28,7 @@ public class CosmeticGui { protected final MessageHandler messageHandler; protected final String title; protected final int rows; + protected final Map itemStackMap; protected final Map guiItemMap; protected Gui gui; @@ -40,6 +42,8 @@ public class CosmeticGui { this.title = title; this.rows = rows; this.guiItemMap = guiItemMap; + this.itemStackMap = new HashMap<>(); + this.guiItemMap.forEach((key, value) -> itemStackMap.put(key, value.getItemStack())); } private void setItems(final User user) { @@ -55,6 +59,14 @@ public class CosmeticGui { final GuiItem guiItem = entry.getValue(); + final ItemStack itemStack = this.itemStackMap.get(slot); + + if (itemStack == null) continue; + + guiItem.setItemStack( + ItemBuilder.from(itemStack.clone()).papiPlaceholders(player).build() + ); + if (guiItem instanceof final ArmorItem armorItem) { final Map placeholders = new HashMap<>(); @@ -91,6 +103,7 @@ public class CosmeticGui { armorItem.getItemStack(hasPermission) ).namePlaceholders(placeholders). lorePlaceholders(placeholders). + papiPlaceholders(player). build(), event -> { if (!hasPermission) { 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 7d335502..d8b36eaf 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java @@ -6,15 +6,19 @@ import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor; import io.github.fisher2911.hmccosmetics.user.User; import io.github.fisher2911.hmccosmetics.util.builder.ColorBuilder; +import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import java.util.HashMap; import java.util.Map; import java.util.Optional; -public class DyeSelectorGui extends CosmeticGui{ +public class DyeSelectorGui extends CosmeticGui { public DyeSelectorGui( final HMCCosmetics plugin, @@ -30,8 +34,21 @@ public class DyeSelectorGui extends CosmeticGui{ rows(rows). create(); + final Player player = user.getPlayer(); + for (final var entry : this.guiItemMap.entrySet()) { - gui.setItem(entry.getKey(), entry.getValue()); + + final GuiItem guiItem = entry.getValue(); + + final ItemStack itemStack = this.itemStackMap.get(entry.getKey()); + + if (itemStack == null) continue; + + guiItem.setItemStack( + ItemBuilder.from(itemStack.clone()).papiPlaceholders(player).build() + ); + + gui.setItem(entry.getKey(), guiItem); } gui.setDefaultClickAction(event -> { diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/message/MessageHandler.java b/src/main/java/io/github/fisher2911/hmccosmetics/message/MessageHandler.java index 7ae9447d..1a4c8d41 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/message/MessageHandler.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/message/MessageHandler.java @@ -1,6 +1,7 @@ package io.github.fisher2911.hmccosmetics.message; import io.github.fisher2911.hmccosmetics.HMCCosmetics; +import io.github.fisher2911.hmccosmetics.papi.PAPIHook; import io.github.fisher2911.hmccosmetics.util.StringUtils; import io.github.fisher2911.hmccosmetics.util.Utils; import net.kyori.adventure.platform.bukkit.BukkitAudiences; @@ -40,22 +41,23 @@ public class MessageHandler { } /** - * - * @param sender receiver of message - * @param key message key + * @param sender receiver of message + * @param key message key * @param placeholders placeholders */ public void sendMessage(final CommandSender sender, final Message key, final Map placeholders) { - final String message = StringUtils.applyPlaceholders(this.getMessage(key), placeholders); - final Component component = Adventure.MINI_MESSAGE.parse(message); - this.adventure.sender(sender).sendMessage(component); + final String message = this.getPapiPlaceholders( + sender, + StringUtils.applyPlaceholders(this.getMessage(key), placeholders) + ); + final Component component = Adventure.MINI_MESSAGE.parse(message); + this.adventure.sender(sender).sendMessage(component); } /** - * * @param sender receiver of message - * @param key message key + * @param key message key */ public void sendMessage(final CommandSender sender, final Message key) { @@ -63,22 +65,23 @@ public class MessageHandler { } /** - * - * @param player receiver of message - * @param key message key + * @param player receiver of message + * @param key message key * @param placeholders placeholders */ public void sendActionBar(final Player player, final Message key, final Map placeholders) { - final String message = StringUtils.applyPlaceholders(this.getMessage(key), placeholders); + final String message = this.getPapiPlaceholders( + player, + StringUtils.applyPlaceholders(this.getMessage(key), placeholders) + ); Component component = Adventure.MINI_MESSAGE.parse(message); this.adventure.player(player).sendActionBar(component); } /** - * * @param player receiver of message - * @param key message key + * @param key message key */ public void sendActionBar(final Player player, final Message key) { @@ -86,22 +89,23 @@ public class MessageHandler { } /** - * - * @param player receiver of message - * @param key message key + * @param player receiver of message + * @param key message key * @param placeholders placeholders */ public void sendTitle(final Player player, final Message key, final Map placeholders) { - final String message = StringUtils.applyPlaceholders(this.getMessage(key), placeholders); + final String message = this.getPapiPlaceholders( + player, + StringUtils.applyPlaceholders(this.getMessage(key), placeholders) + ); Component component = Adventure.MINI_MESSAGE.parse(message); this.adventure.player(player).showTitle(Title.title(component, Component.empty())); } /** - * * @param player receiver of message - * @param key message key + * @param key message key */ public void sendTitle(final Player player, final Message key) { @@ -109,7 +113,6 @@ public class MessageHandler { } /** - * * @param key message key * @return message, or empty string if message not found */ @@ -153,4 +156,12 @@ public class MessageHandler { this.messageMap.put(key, new Message(key, message, messageType)); } } + + private String getPapiPlaceholders(final CommandSender sender, final String message) { + if (sender instanceof final Player player) { + return StringUtils.applyPapiPlaceholders(player, message); + } + return StringUtils.applyPapiPlaceholders(null, message); + } + } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/message/Placeholder.java b/src/main/java/io/github/fisher2911/hmccosmetics/message/Placeholder.java index b314a18b..8938694f 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/message/Placeholder.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/message/Placeholder.java @@ -9,4 +9,5 @@ public class Placeholder { public static final String ENABLED = "%enabled%"; public static final String ALLOWED = "%allowed%"; + } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/papi/PAPIHook.java b/src/main/java/io/github/fisher2911/hmccosmetics/papi/PAPIHook.java new file mode 100644 index 00000000..c1e855fa --- /dev/null +++ b/src/main/java/io/github/fisher2911/hmccosmetics/papi/PAPIHook.java @@ -0,0 +1,12 @@ +package io.github.fisher2911.hmccosmetics.papi; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; + +public class PAPIHook { + + public static String parse(final Player player, final String string) { + return PlaceholderAPI.setPlaceholders(player, string); + } + +} 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 997d8888..0ec8ff89 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java @@ -6,56 +6,36 @@ import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.Pair; -import com.comphenix.protocol.wrappers.Vector3F; -import com.comphenix.protocol.wrappers.WrappedChatComponent; import com.comphenix.protocol.wrappers.WrappedDataWatcher; -import com.sun.jdi.InvocationException; -import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor; import io.github.fisher2911.hmccosmetics.message.MessageHandler; import io.github.fisher2911.hmccosmetics.message.Messages; import io.github.fisher2911.hmccosmetics.message.Placeholder; -import io.github.fisher2911.hmccosmetics.util.Keys; import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; import it.unimi.dsi.fastutil.ints.IntArrayList; -import net.minecraft.core.Vector3f; -import net.minecraft.network.protocol.game.PacketPlayOutEntityHeadRotation; -import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; -import net.minecraft.network.syncher.DataWatcher; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.craftbukkit.v1_17_R1.entity.CraftArmorStand; -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.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; -import org.bukkit.persistence.PersistentDataType; -import org.bukkit.util.EulerAngle; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.UUID; public class User { private final UUID uuid; private final PlayerArmor playerArmor; - private ArmorStand attached; private ArmorItem lastSetItem; - private final int armorStandId; private boolean hasArmorStand; + private final int armorStandId; public User(final UUID uuid, final PlayerArmor playerArmor, final int armorStandId) { this.uuid = uuid; @@ -176,85 +156,10 @@ public class User { return true; } - public void detach() { - if (this.attached != null) { - this.attached.remove(); - } - } - - // teleports armor stand to the correct position - public void updateArmorStand() { - if (true) { - this.updatePacketArmorStand(); - return; - } - - final ArmorItem backpackArmorItem = this.playerArmor.getBackpack(); - if (backpackArmorItem == null) { - this.despawnAttached(); - return; - } - - final ItemStack backpackItem = backpackArmorItem.getItemStack(); - - if (backpackItem == null || backpackItem.getType() == Material.AIR) { - this.despawnAttached(); - return; - } - + public void spawnArmorStand(final Player other) { final Player player = this.getPlayer(); - if (player == null) { - this.despawnAttached(); - return; - } - - if (this.attached == null) { - this.attached = player.getWorld().spawn(player.getLocation(), - ArmorStand.class, - armorStand -> { - armorStand.setVisible(false); - armorStand.setMarker(true); - armorStand.getPersistentDataContainer().set( - Keys.ARMOR_STAND_KEY, - PersistentDataType.BYTE, - (byte) 1 - ); - player.addPassenger(armorStand); - }); - } - - if (!player.getPassengers().contains(this.attached)) { - player.addPassenger(this.attached); - } - - final EntityEquipment equipment = this.attached.getEquipment(); - - if (equipment == null) { - this.despawnAttached(); - return; - } - - if (!backpackItem.equals(equipment.getHelmet())) { - equipment.setHelmet(backpackItem); - } - - this.attached. - setRotation( - player.getLocation().getYaw(), - player.getLocation().getPitch()); - } - - public void spawnPacketArmorStand() { - - final Player player = this.getPlayer(); - - if (player == null) { - this.updatePacketArmorStand(); - return; - } - - this.hasArmorStand = true; + if (player == null) return; final Location location = player.getLocation(); @@ -278,18 +183,36 @@ public class User { packet.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND); - for (final Player p : Bukkit.getOnlinePlayers()) { - try { - protocolManager.sendServerPacket(p, packet); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } + final PacketContainer ridingPacket = new PacketContainer(PacketType.Play.Server.MOUNT); + ridingPacket. + getIntegers(). + write(0, player.getEntityId()); + ridingPacket.getIntegerArrays().write(0, new int[]{this.armorStandId}); + + try { + protocolManager.sendServerPacket(other, packet); + protocolManager.sendServerPacket(other, ridingPacket); + } catch (InvocationTargetException e) { + e.printStackTrace(); } } - public void updatePacketArmorStand() { + public void spawnArmorStand() { + if (this.hasArmorStand) { + this.updateArmorStand(); + return; + } + + for (final Player p : Bukkit.getOnlinePlayers()) { + this.spawnArmorStand(p); + } + + this.hasArmorStand = true; + } + + public void updateArmorStand() { if (!this.hasArmorStand) { - this.spawnPacketArmorStand(); + this.spawnArmorStand(); return; } @@ -313,53 +236,13 @@ public class User { armorPacket.getIntegers().write(0, this.armorStandId); armorPacket.getSlotStackPairLists().write(0, equipmentList); -// final PacketContainer rotationContainer = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); final Location location = player.getLocation(); -// rotationContainer. -// getIntegers(). -// write(0, this.armorStandId); -// rotationContainer. -// getBytes(). -// write(0, (byte) (location.getYaw() * 256.0F / 360.0F)); -// -// final PacketContainer rotationContainer2 = new PacketContainer(PacketType.Play.Server.ENTITY_HEAD_ROTATION); -// rotationContainer2. -// getIntegers(). -// write(0, this.armorStandId); -// rotationContainer2. -// getBytes(). -// write(0, (byte) (location.getPitch() * 256.0F / 360.0F)); final PacketContainer metaContainer = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); -// metaContainer. -// getBytes(). -// write(15, (byte) 0x01); - - WrappedDataWatcher metaData = new WrappedDataWatcher(); - metaData.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x20)); //isSmall, noBasePlate, set Marker - metaData.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x01)); //isSmall, noBasePlate, set Marker - - /* metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(8, WrappedDataWatcher.Registry.get(Vector3F.getMinecraftClass())), new Vector3f( - location.getPitch(), - location.getYaw(), - 0 - ));*/ //isSmall, noBasePlate, set Marker -// metadata.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(16, WrappedDataWatcher.Registry.(), new Vector())); - -// final PacketContainer rotationPacket = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE_LOOK); -// -// rotationPacket.getIntegers().write(0, this.armorStandId); -// rotationPacket. -// getShorts(). -// write(0, (short) 0). -// write(1, (short) -5). -// write(2, (short) 0); -// rotationPacket. -// getBytes(). -// write(0, (byte) (location.getYaw() * 256.0F / 360.0F)). -// write(1, (byte) (location.getPitch() * 256.0F / 360.0F)); + metaData.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x20)); + metaData.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) (0x10)); final PacketContainer rotationPacket = new PacketContainer(PacketType.Play.Server.ENTITY_HEAD_ROTATION); @@ -367,14 +250,7 @@ public class User { rotationPacket.getBytes().write(0, (byte) (location.getYaw() * 256 / 360)); metaContainer.getIntegers().write(0, this.armorStandId); -// metaContainer.getWatchableCollectionModifier().write(0, metaData.getWatchableObjects()); - -// final WrappedDataWatcher dataWatcher = new WrappedDataWatcher(); -// dataWatcher.setObject(15, (byte) 0x01); -// -// metaContainer.getDataWatcherModifier().write( -// 0, dataWatcher -// ); + metaContainer.getWatchableCollectionModifier().write(0, metaData.getWatchableObjects()); final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); @@ -390,62 +266,30 @@ public class User { write(0, (byte) (location.getYaw() * 256.0F / 360.0F)). write(1, (byte) (location.getPitch() * 256.0F / 360.0F)); - final PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); -// destroyPacket.getIntegerArrays().write(0, new int[]{this.armorStandId}); - destroyPacket.getModifier().write(0, new IntArrayList(new int[]{this.armorStandId})); - - final PacketContainer ridingPacket = new PacketContainer(PacketType.Play.Server.MOUNT); - ridingPacket. - getIntegers(). - write(0, player.getEntityId()); - ridingPacket.getIntegerArrays().write(0, new int[]{this.armorStandId}); - for (final Player p : Bukkit.getOnlinePlayers()) { try { -// protocolManager.sendServerPacket(p, destroyPacket); - if (i == 0) { - i++; - protocolManager.sendServerPacket(p, ridingPacket); - } protocolManager.sendServerPacket(p, armorPacket); -// protocolManager.sendServerPacket(p, metaContainer); + protocolManager.sendServerPacket(p, metaContainer); protocolManager.sendServerPacket(p, rotationPacket); -// protocolManager.sendServerPacket(p, teleportPacket); -// protocolManager.sendServerPacket(p, rotationPacket2); -// protocolManager.sendServerPacket(p, removeRiderPacket); -// protocolManager.sendServerPacket(p, rotationPacket2); -// i++; } catch (final InvocationTargetException exception) { exception.printStackTrace(); } } } - int i = 0; - - public void addArmorStandPassenger(final Entity entity) { - final Player player = this.getPlayer(); - - if (player == null) return; - - if (!player.getPassengers().contains(entity)) { - player.addPassenger(entity); - } - } - public void despawnAttached() { - if (this.attached == null) { - return; + final ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); + + final PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); + destroyPacket.getModifier().write(0, new IntArrayList(new int[]{this.armorStandId})); + + for (final Player p : Bukkit.getOnlinePlayers()) { + try { + protocolManager.sendServerPacket(p, destroyPacket); + } catch (final InvocationTargetException exception) { + exception.printStackTrace(); + } } - - final Player player = this.getPlayer(); - - if (player != null) { - player.removePassenger(this.attached); - } - - this.attached.remove(); - this.attached = null; } public ArmorItem getLastSetItem() { 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 a27b0655..2b85542b 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java @@ -1,7 +1,6 @@ package io.github.fisher2911.hmccosmetics.user; import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketAdapter; @@ -9,18 +8,13 @@ import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.Pair; -import com.comphenix.protocol.wrappers.WrappedChatComponent; -import com.comphenix.protocol.wrappers.WrappedDataWatcher; import io.github.fisher2911.hmccosmetics.HMCCosmetics; -import io.github.fisher2911.hmccosmetics.gui.ArmorItem; import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor; import io.github.fisher2911.hmccosmetics.message.Placeholder; import io.github.fisher2911.hmccosmetics.util.Keys; import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; -import net.kyori.adventure.text.Component; 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; @@ -90,6 +84,12 @@ public class UserManager { ); } + public void resendCosmetics(final Player player) { + for (final User user : this.userMap.values()) { + user.spawnArmorStand(player); + } + } + private void registerPacketListener() { final ProtocolManager protocolManager = this.plugin.getProtocolManager(); protocolManager.addPacketListener(new PacketAdapter( @@ -135,66 +135,6 @@ 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. -//// -//// 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) { @@ -241,7 +181,7 @@ public class UserManager { public void removeAll() { for (final var user : this.userMap.values()) { - user.detach(); + user.despawnAttached(); } this.userMap.clear(); diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/util/StringUtils.java b/src/main/java/io/github/fisher2911/hmccosmetics/util/StringUtils.java index 8d343297..7158a31d 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/util/StringUtils.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/util/StringUtils.java @@ -1,15 +1,25 @@ package io.github.fisher2911.hmccosmetics.util; +import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.message.Adventure; +import io.github.fisher2911.hmccosmetics.papi.PAPIHook; import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; import java.util.Map; public class StringUtils { + private static final HMCCosmetics plugin; + + static { + plugin = HMCCosmetics.getPlugin(HMCCosmetics.class); + } + /** - * - * @param message message being translated + * @param message message being translated * @param placeholders placeholders applied * @return message with placeholders applied */ @@ -21,9 +31,15 @@ public class StringUtils { return message; } + public static String applyPapiPlaceholders(@Nullable final Player player, final String message) { + if (plugin.isPapiEnabled()) { + return PAPIHook.parse(player, message); + } + + return message; + } /** - * * @param parsed message to be parsed * @return MiniMessage parsed string */ diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/util/builder/ItemBuilder.java b/src/main/java/io/github/fisher2911/hmccosmetics/util/builder/ItemBuilder.java index df640b84..6d6dde7f 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/util/builder/ItemBuilder.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/util/builder/ItemBuilder.java @@ -3,9 +3,11 @@ package io.github.fisher2911.hmccosmetics.util.builder; import io.github.fisher2911.hmccosmetics.message.Adventure; import io.github.fisher2911.hmccosmetics.util.StringUtils; import net.kyori.adventure.text.Component; +import net.minecraft.network.PacketListener; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -147,6 +149,38 @@ public class ItemBuilder { return this; } + public ItemBuilder papiPlaceholders(final Player player) { + this.lorePapiPlaceholders(player); + this.namePapiPlaceholders(player); + return this; + } + + private void lorePapiPlaceholders(final Player player) { + if (this.itemMeta == null) return; + final List newLore = new ArrayList<>(); + + final List lore = this.itemMeta.getLore(); + + if (lore == null) return; + + for (final String line : this.itemMeta.getLore()) { + newLore.add(StringUtils.applyPapiPlaceholders(player, line)); + } + + this.itemMeta.setLore(newLore); + } + + private void namePapiPlaceholders(final Player player) { + if (this.itemMeta == null) return; + + this.itemMeta.setDisplayName( + StringUtils.applyPapiPlaceholders( + player, + this.itemMeta.getDisplayName() + ) + ); + } + /** * @param unbreakable whether the ItemStack is unbreakable * @return this diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 5b475fec..ef67241b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -4,6 +4,7 @@ version: 1.0.3 api-version: 1.17 softdepend: - Multiverse + - PlaceholderAPI depend: - ProtocolLib permissions: From 32afd0d144f253ff94c337443ee1fbbe2a68dcb3 Mon Sep 17 00:00:00 2001 From: HeroBrineGoat <76707404+MasterOfTheFish@users.noreply.github.com> Date: Sun, 16 Jan 2022 15:52:05 -0500 Subject: [PATCH 9/9] Fixed title PAPI placeholder --- build.gradle | 3 +-- .../fisher2911/hmccosmetics/config/DyeGuiSerializer.java | 2 +- .../github/fisher2911/hmccosmetics/config/GuiSerializer.java | 2 +- .../io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java | 3 ++- .../io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java | 3 ++- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index aa3bcd0c..5aa6906b 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,6 @@ repositories { maven { url = 'https://papermc.io/repo/repository/maven-public/' } maven { url = 'https://repo.mattstudios.me/artifactory/public/' } maven { url = 'https://jitpack.io' } - maven { url = 'https://repo.leonardobishop.com/releases/' } maven { url = 'https://repo.dmulloy2.net/repository/public/' } maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } } @@ -24,7 +23,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:22.0.0' compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.0' compileOnly 'net.kyori:adventure-api:4.9.3' - compileOnly 'me.clip:placeholderapi:2.10.9' + compileOnly 'me.clip:placeholderapi:2.11.1' implementation 'net.kyori:adventure-text-minimessage:4.2.0-SNAPSHOT' implementation 'net.kyori:adventure-platform-bukkit:4.0.0' implementation 'dev.triumphteam:triumph-gui:3.0.3' diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/config/DyeGuiSerializer.java b/src/main/java/io/github/fisher2911/hmccosmetics/config/DyeGuiSerializer.java index e7beab3a..f45ee1f7 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/config/DyeGuiSerializer.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/config/DyeGuiSerializer.java @@ -89,7 +89,7 @@ public class DyeGuiSerializer implements TypeSerializer { return new DyeSelectorGui( plugin, Adventure.SERIALIZER.serialize( - Adventure.MINI_MESSAGE.parse(StringUtils.applyPapiPlaceholders(null, title))), + Adventure.MINI_MESSAGE.parse(title)), rowsNode.getInt(), guiItemMap); } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java b/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java index 59c7e95c..408f93fb 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java @@ -68,7 +68,7 @@ public class GuiSerializer implements TypeSerializer { return new CosmeticGui(plugin, Adventure.SERIALIZER.serialize( - Adventure.MINI_MESSAGE.parse(StringUtils.applyPapiPlaceholders(null, title))), + Adventure.MINI_MESSAGE.parse(title)), rowsNode.getInt(), guiItemMap); } diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java index e60bb5f5..2c69b743 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/CosmeticGui.java @@ -10,6 +10,7 @@ import io.github.fisher2911.hmccosmetics.message.MessageHandler; import io.github.fisher2911.hmccosmetics.message.Messages; import io.github.fisher2911.hmccosmetics.message.Placeholder; import io.github.fisher2911.hmccosmetics.user.User; +import io.github.fisher2911.hmccosmetics.util.StringUtils; import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; import org.bukkit.Bukkit; import org.bukkit.entity.HumanEntity; @@ -165,7 +166,7 @@ public class CosmeticGui { final User user = optionalUser.get(); this.gui = Gui.gui(). - title(Adventure.MINI_MESSAGE.parse(this.title)). + title(Adventure.MINI_MESSAGE.parse(StringUtils.applyPapiPlaceholders(user.getPlayer(), this.title))). rows(this.rows). create(); 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 d8b36eaf..c116d8b6 100644 --- a/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java +++ b/src/main/java/io/github/fisher2911/hmccosmetics/gui/DyeSelectorGui.java @@ -5,6 +5,7 @@ import dev.triumphteam.gui.guis.GuiItem; import io.github.fisher2911.hmccosmetics.HMCCosmetics; import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor; import io.github.fisher2911.hmccosmetics.user.User; +import io.github.fisher2911.hmccosmetics.util.StringUtils; import io.github.fisher2911.hmccosmetics.util.builder.ColorBuilder; import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; import net.kyori.adventure.text.Component; @@ -30,7 +31,7 @@ public class DyeSelectorGui extends CosmeticGui { public Gui getGui(final User user, final ArmorItem armorItem) { final Gui gui = Gui.gui(). - title(Component.text(this.title)). + title(Component.text(StringUtils.applyPapiPlaceholders(user.getPlayer(), this.title))). rows(rows). create();