From fe1dc2a468d1be6445077b91113808fb74cc2ad8 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 21 Sep 2020 14:08:10 +0100 Subject: [PATCH] Refactored packet adaptors --- .../display/AbstractPacketAdapter.java | 50 +++++++++++++ .../display/DisplayPacketAdapter.java | 75 ------------------- .../ecoenchants/display/EnchantDisplay.java | 22 ++++-- .../packets/PacketOpenWindowMerchant.java | 41 ++++++++++ .../packets/PacketSetCreativeSlot.java | 20 +++++ .../display/packets/PacketSetSlot.java | 20 +++++ .../display/packets/PacketWindowItems.java | 20 +++++ .../com/willfp/ecoenchants/loader/Loader.java | 10 ++- 8 files changed, 176 insertions(+), 82 deletions(-) create mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/display/AbstractPacketAdapter.java delete mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/display/DisplayPacketAdapter.java create mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketOpenWindowMerchant.java create mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketSetCreativeSlot.java create mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketSetSlot.java create mode 100644 Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketWindowItems.java diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/display/AbstractPacketAdapter.java b/Plugin/src/main/java/com/willfp/ecoenchants/display/AbstractPacketAdapter.java new file mode 100644 index 00000000..ae2e7e97 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/display/AbstractPacketAdapter.java @@ -0,0 +1,50 @@ +package com.willfp.ecoenchants.display; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.willfp.ecoenchants.EcoEnchantsPlugin; + +import java.util.Collections; + +public abstract class AbstractPacketAdapter extends PacketAdapter { + private final PacketType type; + + protected AbstractPacketAdapter(PacketType type) { + super(EcoEnchantsPlugin.getInstance(), Collections.singletonList(type)); + this.type = type; + } + + public void onReceive(PacketContainer packet) {} + + public void onSend(PacketContainer packet) {} + + @Override + public final void onPacketReceiving(PacketEvent event) { + if(event.getPacket() == null) + return; + + if(!event.getPacket().getType().equals(type)) + return; + + onReceive(event.getPacket()); + } + + @Override + public final void onPacketSending(PacketEvent event) { + if(event.getPacket() == null) + return; + + if(!event.getPacket().getType().equals(type)) + return; + + onSend(event.getPacket()); + } + + public final void register() { + if(!EcoEnchantsPlugin.getInstance().protocolManager.getPacketListeners().contains(this)) { + EcoEnchantsPlugin.getInstance().protocolManager.addPacketListener(this); + } + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/display/DisplayPacketAdapter.java b/Plugin/src/main/java/com/willfp/ecoenchants/display/DisplayPacketAdapter.java deleted file mode 100644 index ea971558..00000000 --- a/Plugin/src/main/java/com/willfp/ecoenchants/display/DisplayPacketAdapter.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.willfp.ecoenchants.display; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.PacketAdapter; -import com.comphenix.protocol.events.PacketEvent; -import com.willfp.ecoenchants.EcoEnchantsPlugin; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.MerchantRecipe; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class DisplayPacketAdapter extends PacketAdapter { - private static final List packets = Arrays.asList( - PacketType.Play.Server.WINDOW_ITEMS, - PacketType.Play.Server.SET_SLOT, - PacketType.Play.Client.SET_CREATIVE_SLOT, - PacketType.Play.Server.OPEN_WINDOW_MERCHANT - ); - - public DisplayPacketAdapter() { - super(EcoEnchantsPlugin.getInstance(), packets); - } - - @Override - public void onPacketSending(PacketEvent event) { - if(event.getPacket() == null) return; - - PacketType packetType = event.getPacketType(); - if (packetType.equals(PacketType.Play.Server.WINDOW_ITEMS)) { - event.getPacket().getItemListModifier().modify(0, (itemStacks) -> { - itemStacks.forEach(EnchantDisplay::displayEnchantments); - return itemStacks; - }); - } else if (packetType.equals(PacketType.Play.Server.SET_SLOT)) { - event.getPacket().getItemModifier().modify(0, (item) -> { - item = EnchantDisplay.displayEnchantments(item); - return item; - }); - } else if (packetType.equals(PacketType.Play.Server.OPEN_WINDOW_MERCHANT)) { - List merchantRecipes = event.getPacket().getMerchantRecipeLists().readSafely(0); - if (merchantRecipes != null) { - List newList = - merchantRecipes.stream().map(oldRecipe -> { - MerchantRecipe recipe = - new MerchantRecipe(EnchantDisplay.displayEnchantments(oldRecipe.getResult()), - oldRecipe.getUses(), - oldRecipe.getMaxUses(), - oldRecipe.hasExperienceReward(), - oldRecipe.getVillagerExperience(), - oldRecipe.getPriceMultiplier()); - List ingredients = oldRecipe.getIngredients(); - ingredients.forEach(EnchantDisplay::displayEnchantments); - recipe.setIngredients(ingredients); - return recipe; - }).collect(Collectors.toList()); - - event.getPacket().getMerchantRecipeLists().writeSafely(0, newList); - } - } - } - - @Override - public void onPacketReceiving(PacketEvent event) { - if(event.getPacket() == null) return; - - if(!event.getPacketType().equals(PacketType.Play.Client.SET_CREATIVE_SLOT)) return; - - event.getPacket().getItemModifier().modify(0, (item) -> { - item = EnchantDisplay.revertDisplay(item); - return item; - }); - } -} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/display/EnchantDisplay.java b/Plugin/src/main/java/com/willfp/ecoenchants/display/EnchantDisplay.java index 84bda62a..d5e21f61 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/display/EnchantDisplay.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/display/EnchantDisplay.java @@ -80,9 +80,17 @@ public class EnchantDisplay { Arrays.asList(Enchantment.values()).parallelStream().forEach(enchantment -> { List description; NamespacedKey key = enchantment.getKey(); - if(EcoEnchants.getByKey(key) != null) description = ((EcoEnchant) enchantment).getDescription(); - else - description = Arrays.asList(WordUtils.wrap(ConfigManager.getLang().getString("vanilla." + enchantment.getKey().getKey().toLowerCase() + ".description"), ConfigManager.getConfig().getInt("lore.describe.wrap"), "\n", false).split("\\r?\\n")); + if(EcoEnchants.getByKey(key) != null) { + description = ((EcoEnchant) enchantment).getDescription(); + } else { + description = + Arrays.asList( + WordUtils.wrap( + ConfigManager.getLang().getString("vanilla." + enchantment.getKey().getKey().toLowerCase() + ".description"), + ConfigManager.getConfig().getInt("lore.describe.wrap"), + "\n", false + ).split("\\r?\\n")); + } description.replaceAll(line -> prefix + descriptionColor + line); DESCRIPTION_CACHE.put(key, description); }); @@ -232,8 +240,12 @@ public class EnchantDisplay { }); } - if(meta instanceof EnchantmentStorageMeta) meta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); // Thanks ShaneBee! - forRemoval.forEach((meta::removeEnchant)); + if (meta instanceof EnchantmentStorageMeta) { + meta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); + forRemoval.forEach(((EnchantmentStorageMeta) meta)::removeStoredEnchant); + } else { + forRemoval.forEach(meta::removeEnchant); + } meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); lore.addAll(itemLore); meta.setLore(lore); diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketOpenWindowMerchant.java b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketOpenWindowMerchant.java new file mode 100644 index 00000000..d950d5fd --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketOpenWindowMerchant.java @@ -0,0 +1,41 @@ +package com.willfp.ecoenchants.display.packets; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.willfp.ecoenchants.display.AbstractPacketAdapter; +import com.willfp.ecoenchants.display.EnchantDisplay; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.MerchantRecipe; + +import java.util.List; +import java.util.stream.Collectors; + +public class PacketOpenWindowMerchant extends AbstractPacketAdapter { + public PacketOpenWindowMerchant() { + super(PacketType.Play.Server.OPEN_WINDOW_MERCHANT); + } + + @Override + public void onSend(PacketContainer packet) { + List merchantRecipes = packet.getMerchantRecipeLists().readSafely(0); + if(merchantRecipes == null) + return; + + List newList = + merchantRecipes.stream().map(oldRecipe -> { + MerchantRecipe recipe = + new MerchantRecipe(EnchantDisplay.displayEnchantments(oldRecipe.getResult()), + oldRecipe.getUses(), + oldRecipe.getMaxUses(), + oldRecipe.hasExperienceReward(), + oldRecipe.getVillagerExperience(), + oldRecipe.getPriceMultiplier()); + List ingredients = oldRecipe.getIngredients(); + ingredients.forEach(EnchantDisplay::displayEnchantments); + recipe.setIngredients(ingredients); + return recipe; + }).collect(Collectors.toList()); + + packet.getMerchantRecipeLists().writeSafely(0, newList); + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketSetCreativeSlot.java b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketSetCreativeSlot.java new file mode 100644 index 00000000..ed8866fa --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketSetCreativeSlot.java @@ -0,0 +1,20 @@ +package com.willfp.ecoenchants.display.packets; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.willfp.ecoenchants.display.AbstractPacketAdapter; +import com.willfp.ecoenchants.display.EnchantDisplay; + +public class PacketSetCreativeSlot extends AbstractPacketAdapter { + public PacketSetCreativeSlot() { + super(PacketType.Play.Client.SET_CREATIVE_SLOT); + } + + @Override + public void onReceive(PacketContainer packet) { + packet.getItemModifier().modify(0, (item) -> { + item = EnchantDisplay.revertDisplay(item); + return item; + }); + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketSetSlot.java b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketSetSlot.java new file mode 100644 index 00000000..966dc17a --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketSetSlot.java @@ -0,0 +1,20 @@ +package com.willfp.ecoenchants.display.packets; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.willfp.ecoenchants.display.AbstractPacketAdapter; +import com.willfp.ecoenchants.display.EnchantDisplay; + +public class PacketSetSlot extends AbstractPacketAdapter { + public PacketSetSlot() { + super(PacketType.Play.Server.SET_SLOT); + } + + @Override + public void onSend(PacketContainer packet) { + packet.getItemModifier().modify(0, (item) -> { + item = EnchantDisplay.displayEnchantments(item); + return item; + }); + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketWindowItems.java b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketWindowItems.java new file mode 100644 index 00000000..450dab67 --- /dev/null +++ b/Plugin/src/main/java/com/willfp/ecoenchants/display/packets/PacketWindowItems.java @@ -0,0 +1,20 @@ +package com.willfp.ecoenchants.display.packets; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.willfp.ecoenchants.display.AbstractPacketAdapter; +import com.willfp.ecoenchants.display.EnchantDisplay; + +public class PacketWindowItems extends AbstractPacketAdapter { + public PacketWindowItems() { + super(PacketType.Play.Server.WINDOW_ITEMS); + } + + @Override + public void onSend(PacketContainer packet) { + packet.getItemListModifier().modify(0, (itemStacks) -> { + itemStacks.forEach(EnchantDisplay::displayEnchantments); + return itemStacks; + }); + } +} diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java index 53b6544d..04f9ddbb 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java @@ -9,8 +9,11 @@ import com.willfp.ecoenchants.commands.CommandEcoreload; import com.willfp.ecoenchants.commands.CommandEcoskip; import com.willfp.ecoenchants.commands.CommandEnchantinfo; import com.willfp.ecoenchants.config.ConfigManager; -import com.willfp.ecoenchants.display.DisplayPacketAdapter; import com.willfp.ecoenchants.display.EnchantDisplay; +import com.willfp.ecoenchants.display.packets.PacketOpenWindowMerchant; +import com.willfp.ecoenchants.display.packets.PacketSetCreativeSlot; +import com.willfp.ecoenchants.display.packets.PacketSetSlot; +import com.willfp.ecoenchants.display.packets.PacketWindowItems; import com.willfp.ecoenchants.enchantments.*; import com.willfp.ecoenchants.events.armorequip.ArmorListener; import com.willfp.ecoenchants.events.armorequip.DispenserArmorListener; @@ -96,7 +99,10 @@ public class Loader { Bukkit.getLogger().info("Loading ProtocolLib..."); EcoEnchantsPlugin.getInstance().protocolManager = ProtocolLibrary.getProtocolManager(); - EcoEnchantsPlugin.getInstance().protocolManager.addPacketListener(new DisplayPacketAdapter()); + new PacketOpenWindowMerchant().register(); + new PacketSetCreativeSlot().register(); + new PacketSetSlot().register(); + new PacketWindowItems().register(); /* Load land management support