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: