Refactored packet adaptors

This commit is contained in:
BuildTools
2020-09-21 14:08:10 +01:00
parent dadafebee8
commit fe1dc2a468
8 changed files with 176 additions and 82 deletions

View File

@@ -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);
}
}
}

View File

@@ -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<PacketType> 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<MerchantRecipe> merchantRecipes = event.getPacket().getMerchantRecipeLists().readSafely(0);
if (merchantRecipes != null) {
List<MerchantRecipe> newList =
merchantRecipes.stream().map(oldRecipe -> {
MerchantRecipe recipe =
new MerchantRecipe(EnchantDisplay.displayEnchantments(oldRecipe.getResult()),
oldRecipe.getUses(),
oldRecipe.getMaxUses(),
oldRecipe.hasExperienceReward(),
oldRecipe.getVillagerExperience(),
oldRecipe.getPriceMultiplier());
List<ItemStack> 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;
});
}
}

View File

@@ -80,9 +80,17 @@ public class EnchantDisplay {
Arrays.asList(Enchantment.values()).parallelStream().forEach(enchantment -> {
List<String> 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);

View File

@@ -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<MerchantRecipe> merchantRecipes = packet.getMerchantRecipeLists().readSafely(0);
if(merchantRecipes == null)
return;
List<MerchantRecipe> newList =
merchantRecipes.stream().map(oldRecipe -> {
MerchantRecipe recipe =
new MerchantRecipe(EnchantDisplay.displayEnchantments(oldRecipe.getResult()),
oldRecipe.getUses(),
oldRecipe.getMaxUses(),
oldRecipe.hasExperienceReward(),
oldRecipe.getVillagerExperience(),
oldRecipe.getPriceMultiplier());
List<ItemStack> ingredients = oldRecipe.getIngredients();
ingredients.forEach(EnchantDisplay::displayEnchantments);
recipe.setIngredients(ingredients);
return recipe;
}).collect(Collectors.toList());
packet.getMerchantRecipeLists().writeSafely(0, newList);
}
}

View File

@@ -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;
});
}
}

View File

@@ -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;
});
}
}

View File

@@ -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;
});
}
}

View File

@@ -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