From f7fe00a4c4ef1a416be8c0f19b05134e8d5a9b26 Mon Sep 17 00:00:00 2001 From: MorphanOne Date: Sun, 15 Sep 2013 00:04:05 -0400 Subject: [PATCH] Make dItem "id:" lore invisible. WARNING: Requires ProtocolLib and has bugs if you're in Creative mode. --- pom.xml | 2 +- .../utilities/packets/PacketHelper.java | 11 +- .../packets/handler/InvisibleLoreHandler.java | 196 ++++++++++++++++++ 3 files changed, 206 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/aufdemrand/denizen/utilities/packets/handler/InvisibleLoreHandler.java diff --git a/pom.xml b/pom.xml index cf975e658b..326302fedd 100644 --- a/pom.xml +++ b/pom.xml @@ -112,7 +112,7 @@ com.comphenix.protocol ProtocolLib - 2.2.0 + 2.7.0 diff --git a/src/main/java/net/aufdemrand/denizen/utilities/packets/PacketHelper.java b/src/main/java/net/aufdemrand/denizen/utilities/packets/PacketHelper.java index 1e3d5b9b7c..182a9856bb 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/packets/PacketHelper.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/packets/PacketHelper.java @@ -2,20 +2,27 @@ import net.aufdemrand.denizen.Denizen; import net.aufdemrand.denizen.utilities.depends.Depends; +import net.aufdemrand.denizen.utilities.packets.handler.InvisibleLoreHandler; import net.aufdemrand.denizen.utilities.packets.handler.NameplateHandler; public class PacketHelper { - private final NameplateHandler npHandler; + private static NameplateHandler npHandler; + private static InvisibleLoreHandler ilHandler; public PacketHelper(Denizen denizen) { npHandler = new NameplateHandler(denizen); + ilHandler = new InvisibleLoreHandler(denizen); Depends.protocolManager.addPacketListener(getNameplateHandler()); } - public final NameplateHandler getNameplateHandler() { + public static NameplateHandler getNameplateHandler() { return npHandler; } + + public static InvisibleLoreHandler getInvisibleLoreHandler() { + return ilHandler; + } } diff --git a/src/main/java/net/aufdemrand/denizen/utilities/packets/handler/InvisibleLoreHandler.java b/src/main/java/net/aufdemrand/denizen/utilities/packets/handler/InvisibleLoreHandler.java new file mode 100644 index 0000000000..6c915c9220 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/utilities/packets/handler/InvisibleLoreHandler.java @@ -0,0 +1,196 @@ +package net.aufdemrand.denizen.utilities.packets.handler; + +import java.io.DataInputStream; +import java.io.IOException; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import net.aufdemrand.denizen.Denizen; +import net.aufdemrand.denizen.objects.dItem; + +import com.comphenix.protocol.Packets; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; +import com.comphenix.protocol.events.ConnectionSide; +import com.comphenix.protocol.events.ListenerOptions; +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.reflect.FieldAccessException; +import com.comphenix.protocol.reflect.StructureModifier; +import com.comphenix.protocol.utility.MinecraftReflection; +import com.comphenix.protocol.utility.StreamSerializer; +import com.comphenix.protocol.wrappers.nbt.NbtCompound; +import com.comphenix.protocol.wrappers.nbt.NbtFactory; +import com.comphenix.protocol.wrappers.nbt.NbtList; +import com.comphenix.protocol.wrappers.nbt.NbtType; + +public class InvisibleLoreHandler { + + public Denizen denizen; + public ProtocolManager protocolManager; + + public InvisibleLoreHandler(Denizen denizen) { + this.denizen = denizen; + protocolManager = ProtocolLibrary.getProtocolManager(); + registerListeners(); + } + + public void registerListeners() { + + protocolManager.addPacketListener(new PacketAdapter(denizen, ConnectionSide.SERVER_SIDE, ListenerPriority.HIGH, 0x67, 0x68) { + @Override + public void onPacketSending(PacketEvent event) { + PacketContainer packet = event.getPacket(); + try { + + switch (packet.getID()) { + + case 0x67: + StructureModifier sm = packet.getItemModifier(); + for (int i = 0; i < sm.size(); i++) { + encodeLore(sm.read(i)); + } + break; + + case 0x68: + StructureModifier smArray = packet.getItemArrayModifier(); + for (int i = 0; i < smArray.size(); i++) { + encodeLore(smArray.read(i)); + } + break; + + } + + } catch (FieldAccessException ex) {} + } + + }); + + + PacketAdapter.AdapterParameteters params = PacketAdapter.params() + .plugin(denizen) + .connectionSide(ConnectionSide.BOTH) + .listenerPriority(ListenerPriority.HIGH) + .options(ListenerOptions.INTERCEPT_INPUT_BUFFER) + .packets(Packets.Client.SET_CREATIVE_SLOT); + + protocolManager.addPacketListener(new PacketAdapter(params) { + + @Override + public void onPacketSending(PacketEvent event) { + if (event.getPacketID() == Packets.Server.SET_CREATIVE_SLOT) { + encodeLore(event.getPacket().getItemModifier().read(0)); + } + } + + @Override + public void onPacketReceiving(PacketEvent event) { + if (event.getPacketID() == Packets.Client.SET_CREATIVE_SLOT) { + DataInputStream input = event.getNetworkMarker().getInputStream(); + if (input == null) { + return; + } + try { + input.readShort(); + ItemStack stack = readItemStack(input, new StreamSerializer()); + stack = decodeLore(stack); + event.getPacket().getItemModifier().write(0, stack); + + } catch (IOException e) {} + } + } + }); + + } + + public ItemStack decodeLore(ItemStack stack) { + if (stack != null) { + if (!MinecraftReflection.isCraftItemStack(stack)) { + stack = MinecraftReflection.getBukkitItemStack(stack); + } + NbtCompound tag = NbtFactory.asCompound(NbtFactory.fromItemTag(stack)); + if (tag.containsKey("dItem")) { + ItemMeta meta = stack.getItemMeta(); + LinkedList lore = new LinkedList(); + for (String line: meta.getLore()) { + if (!line.startsWith("§0id:")) { + lore.add(line); + } + } + NbtList dataList = tag.getList("dItem"); + dataList.setElementType(NbtType.TAG_STRING); + Iterator it = dataList.iterator(); + while (it.hasNext()) { + lore.add(it.next()); + } + meta.setLore(lore); + stack.setItemMeta(meta); + } + } + return stack; + } + + + public ItemStack[] encodeLore(ItemStack[] stacks) { + for (int i=0;i lore = meta.getLore(); + List data = new LinkedList(); + LinkedList newLore = new LinkedList(); + for (String line: lore) { + if (line.startsWith("§0id:")) { + data.add(line); + } else { + newLore.add(line); + } + } + meta.setLore(newLore); + stack.setItemMeta(meta); + NbtCompound tag = NbtFactory.asCompound(NbtFactory.fromItemTag(stack)); + tag.put("dItem", NbtFactory.ofList("dItem", data)); + } + } + return stack; + } + return null; + } + + private ItemStack readItemStack(DataInputStream input, StreamSerializer serializer) throws IOException { + ItemStack result = null; + short type = input.readShort(); + + if (type >= 0) { + byte amount = input.readByte(); + short damage = input.readShort(); + result = new ItemStack(type, amount, damage); + NbtCompound tag = serializer.deserializeCompound(input); + if (tag != null) { + result = MinecraftReflection.getBukkitItemStack(result); + NbtFactory.setItemTag(result, tag); + } + } + return result; + } + +}