From 3f2be04de714662c1454ffcdfa86ae4fab4b38ce Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 18 Oct 2013 12:53:56 +1300 Subject: [PATCH] Inventory listener should work fully now. Some sanity checks added for updating disguises when configs change --- .../libraryaddict/disguise/DisguiseAPI.java | 28 +--- .../libraryaddict/disguise/LibsDisguises.java | 4 +- .../disguise/PacketsManager.java | 131 ++++++------------ .../disguise/disguisetypes/Disguise.java | 12 +- 4 files changed, 57 insertions(+), 118 deletions(-) diff --git a/src/me/libraryaddict/disguise/DisguiseAPI.java b/src/me/libraryaddict/disguise/DisguiseAPI.java index 31a86671..7a79b402 100644 --- a/src/me/libraryaddict/disguise/DisguiseAPI.java +++ b/src/me/libraryaddict/disguise/DisguiseAPI.java @@ -1,30 +1,12 @@ package me.libraryaddict.disguise; import java.lang.reflect.Field; -import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; - import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.events.DisguiseEvent; import me.libraryaddict.disguise.events.UndisguiseEvent; -import net.minecraft.server.v1_6_R3.AttributeMapServer; -import net.minecraft.server.v1_6_R3.EntityHuman; -import net.minecraft.server.v1_6_R3.EntityInsentient; -import net.minecraft.server.v1_6_R3.EntityLiving; import net.minecraft.server.v1_6_R3.EntityPlayer; import net.minecraft.server.v1_6_R3.EntityTrackerEntry; -import net.minecraft.server.v1_6_R3.ItemStack; -import net.minecraft.server.v1_6_R3.MobEffect; -import net.minecraft.server.v1_6_R3.Packet17EntityLocationAction; -import net.minecraft.server.v1_6_R3.Packet20NamedEntitySpawn; -import net.minecraft.server.v1_6_R3.Packet28EntityVelocity; -import net.minecraft.server.v1_6_R3.Packet35EntityHeadRotation; -import net.minecraft.server.v1_6_R3.Packet39AttachEntity; -import net.minecraft.server.v1_6_R3.Packet40EntityMetadata; -import net.minecraft.server.v1_6_R3.Packet41MobEffect; -import net.minecraft.server.v1_6_R3.Packet44UpdateAttributes; -import net.minecraft.server.v1_6_R3.Packet5EntityEquipment; import net.minecraft.server.v1_6_R3.WorldServer; import org.bukkit.Bukkit; @@ -233,8 +215,7 @@ public class DisguiseAPI { } catch (Exception ex) { ex.printStackTrace(); } - // TODO Restore their currently held item - // TODO Restore their armor + player.updateInventory(); } } @@ -283,7 +264,7 @@ public class DisguiseAPI { // Remove the old disguise, else we have weird disguises around the place removeSelfDisguise(player); // If the disguised player can't see himself. Return - if (!disguise.viewSelfDisguise()) + if (!disguise.viewSelfDisguise() || !PacketsManager.isViewDisguisesListenerEnabled()) return; try { // Grab the entity ID the fake disguise will use @@ -297,6 +278,11 @@ public class DisguiseAPI { ex.printStackTrace(); } PacketsManager.sendSelfDisguise(player); + if (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf()) { + if (PacketsManager.isInventoryListenerEnabled()) { + player.updateInventory(); + } + } } /** diff --git a/src/me/libraryaddict/disguise/LibsDisguises.java b/src/me/libraryaddict/disguise/LibsDisguises.java index 09965b22..f5b42b6d 100644 --- a/src/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/me/libraryaddict/disguise/LibsDisguises.java @@ -74,8 +74,8 @@ public class LibsDisguises extends JavaPlugin { DisguiseAPI.setVelocitySent(getConfig().getBoolean("SendVelocity")); DisguiseAPI.setViewDisguises(getConfig().getBoolean("ViewDisguises")); DisguiseAPI.setHearSelfDisguise(getConfig().getBoolean("HearSelfDisguise")); - // DisguiseAPI.setHideArmorFromSelf(getConfig().getBoolean("RemoveArmor")); - // DisguiseAPI.setHideHeldItemFromSelf(getConfig().getBoolean("RemoveHeldItem")); + DisguiseAPI.setHideArmorFromSelf(getConfig().getBoolean("RemoveArmor")); + DisguiseAPI.setHideHeldItemFromSelf(getConfig().getBoolean("RemoveHeldItem")); if (DisguiseAPI.isHidingArmorFromSelf() || DisguiseAPI.isHidingHeldItemFromSelf()) { DisguiseAPI.setInventoryListenerEnabled(true); } diff --git a/src/me/libraryaddict/disguise/PacketsManager.java b/src/me/libraryaddict/disguise/PacketsManager.java index c416ac5e..8c468d91 100644 --- a/src/me/libraryaddict/disguise/PacketsManager.java +++ b/src/me/libraryaddict/disguise/PacketsManager.java @@ -81,6 +81,7 @@ public class PacketsManager { private static PacketListener viewDisguisesListener; private static boolean viewDisguisesListenerEnabled; private static LibsDisguises libsDisguises; + private static DisguiseAPI disguiseAPI = new DisguiseAPI(); protected static void addPacketListeners(final JavaPlugin libsDisguises) { ProtocolManager manager = ProtocolLibrary.getProtocolManager(); @@ -696,11 +697,13 @@ public class PacketsManager { // If the server is setting the slot // Need to set it to air if its in a place it shouldn't be. // Things such as picking up a item, spawned in item. Plugin sets the item. etc. Will fire this + /** + * Done + */ case Packets.Server.SET_SLOT: { // The raw slot // nms code has the start of the hotbar being 36. int slot = event.getPacket().getIntegers().read(1); - Bukkit.broadcastMessage("Set slot: " + slot); // If the slot is a armor slot if (slot >= 5 && slot <= 8) { if (disguise.isHidingArmorFromSelf()) { @@ -730,11 +733,10 @@ public class PacketsManager { } break; } - // Don't think that we will ever need this. - // We will see. + /** + * Done + */ case Packets.Server.WINDOW_ITEMS: { - // TODO Find out how this works - // It seems to 'update' the inventory.. Screw you.. event.setPacket(event.getPacket().deepClone()); StructureModifier mods = event.getPacket().getModifier(); ItemStack[] items = (ItemStack[]) mods.read(1); @@ -771,13 +773,10 @@ public class PacketsManager { } } }; - // TODO Add a listener for player click event. - // Items placed do not have the server confirm it - // So I need to set the item slot inventoryListenerClient = new PacketAdapter(libsDisguises, ConnectionSide.CLIENT_SIDE, ListenerPriority.HIGHEST, Packets.Client.BLOCK_ITEM_SWITCH, Packets.Client.SET_CREATIVE_SLOT, Packets.Client.WINDOW_CLICK) { @Override - public void onPacketReceiving(PacketEvent event) { + public void onPacketReceiving(final PacketEvent event) { Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer()); // If player is disguised, views self disguises and has a inventory modifier if (disguise != null && disguise.viewSelfDisguise() @@ -827,9 +826,6 @@ public class PacketsManager { break; } // If the player switched item, aka he moved from slot 1 to slot 2 - // TODO Listen for this server sided, sometimes it may force him back to a old slot - // ^ But I think the client sends the packet again.. - // This currently works fine case Packets.Client.BLOCK_ITEM_SWITCH: { if (disguise.isHidingHeldItemFromSelf()) { // From logging, it seems that both bukkit and nms uses the same thing for the slot switching. @@ -869,91 +865,20 @@ public class PacketsManager { break; } - case Packets.Client.WINDOW_CLICK: - // Seems like the cases are never met.. - // Probably slot mismatches again - { + case Packets.Client.WINDOW_CLICK: { int slot = event.getPacket().getIntegers().read(1); org.bukkit.inventory.ItemStack clickedItem; if (event.getPacket().getIntegers().read(3) == 1) { // Its a shift click - // TODO Make the item appear in the right place - // Also set the armor/item in hand to air cos the client is stupid. clickedItem = event.getPacket().getItemModifier().read(0); if (clickedItem != null && clickedItem.getType() != Material.AIR) { - org.bukkit.inventory.ItemStack armorItem = null; - int armorSlot = 0; - switch (clickedItem.getType()) { - case LEATHER_BOOTS: - case GOLD_BOOTS: - case CHAINMAIL_BOOTS: - case IRON_BOOTS: - case DIAMOND_BOOTS: - armorSlot = 8; - armorItem = event.getPlayer().getInventory().getBoots(); - break; - case LEATHER_LEGGINGS: - case GOLD_LEGGINGS: - case CHAINMAIL_LEGGINGS: - case IRON_LEGGINGS: - case DIAMOND_LEGGINGS: - armorSlot = 7; - armorItem = event.getPlayer().getInventory().getLeggings(); - break; - case LEATHER_CHESTPLATE: - case GOLD_CHESTPLATE: - case CHAINMAIL_CHESTPLATE: - case IRON_CHESTPLATE: - case DIAMOND_CHESTPLATE: - armorSlot = 6; - armorItem = event.getPlayer().getInventory().getChestplate(); - break; - case LEATHER_HELMET: - case GOLD_HELMET: - case CHAINMAIL_HELMET: - case IRON_HELMET: - case DIAMOND_HELMET: - armorSlot = 5; - armorItem = event.getPlayer().getInventory().getHelmet(); - break; - default: - break; - } - // Its a piece of armor they clicked on.. - if (armorSlot > 0) { - if (armorItem == null || armorItem.getType() == Material.AIR) { - PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); - StructureModifier mods = packet.getModifier(); - mods.write(0, 0); - mods.write(1, armorSlot); - mods.write(2, CraftItemStack.asNMSCopy(new org.bukkit.inventory.ItemStack(0))); - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, - false); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } + // Rather than predict the clients actions + // Lets just update the entire inventory.. + Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { + public void run() { + event.getPlayer().updateInventory(); } - } else { - org.bukkit.inventory.ItemStack heldItem = event.getPlayer().getItemInHand(); - // If its not a piece of armor they clicked on - // Then it can't go into a armor slot - // So it has to go into the held item.. - // But the held item is full. - if (heldItem == null || heldItem.getType() == Material.AIR) { - PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); - StructureModifier mods = packet.getModifier(); - mods.write(0, 0); - mods.write(1, 36 + event.getPlayer().getInventory().getHeldItemSlot()); - mods.write(2, CraftItemStack.asNMSCopy(new org.bukkit.inventory.ItemStack(0))); - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, - false); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } - } + }); } return; } else { @@ -1134,7 +1059,6 @@ public class PacketsManager { public static void setInventoryListenerEnabled(boolean enabled) { if (inventoryModifierEnabled != enabled) { inventoryModifierEnabled = enabled; - // TODO Update all disguises to update their inventories. if (inventoryModifierEnabled) { ProtocolLibrary.getProtocolManager().addPacketListener(inventoryListenerClient); ProtocolLibrary.getProtocolManager().addPacketListener(inventoryListenerServer); @@ -1142,18 +1066,41 @@ public class PacketsManager { ProtocolLibrary.getProtocolManager().removePacketListener(inventoryListenerClient); ProtocolLibrary.getProtocolManager().removePacketListener(inventoryListenerServer); } + for (Player player : Bukkit.getOnlinePlayers()) { + Disguise disguise = DisguiseAPI.getDisguise(player); + if (disguise != null) { + if (viewDisguisesListenerEnabled && disguise.viewSelfDisguise() + && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { + player.updateInventory(); + } + } + } } } public static void setViewDisguisesListener(boolean enabled) { if (viewDisguisesListenerEnabled != enabled) { viewDisguisesListenerEnabled = enabled; - // TODO Remove all self disguises, or add them. if (viewDisguisesListenerEnabled) { ProtocolLibrary.getProtocolManager().addPacketListener(viewDisguisesListener); } else { ProtocolLibrary.getProtocolManager().removePacketListener(viewDisguisesListener); } + for (Player player : Bukkit.getOnlinePlayers()) { + Disguise disguise = DisguiseAPI.getDisguise(player); + if (disguise != null) { + if (disguise.viewSelfDisguise()) { + if (enabled) { + disguiseAPI.setupFakeDisguise(disguise); + } else { + disguiseAPI.removeVisibleDisguise(player); + } + if (inventoryModifierEnabled && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { + player.updateInventory(); + } + } + } + } } } diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index a25c68bc..d56b3773 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -403,7 +403,7 @@ public class Disguise { /** * Set the entity of the disguise. Only used for internal things. */ - public void setEntity(final org.bukkit.entity.Entity entity) { + public void setEntity(org.bukkit.entity.Entity entity) { if (this.entity != null) throw new RuntimeException("This disguise is already in use! Try .clone()"); this.entity = entity; @@ -417,12 +417,18 @@ public class Disguise { public void setHideArmorFromSelf(boolean hideArmor) { this.hideArmorFromSelf = hideArmor; - // TODO Update their armor if player + if (entity instanceof Player) { + ((Player) entity).updateInventory(); + } + // TODO Stop using this as a shortcut >.> } public void setHideHeldItemFromSelf(boolean hideHeldItem) { this.hideHeldItemFromSelf = hideHeldItem; - // TODO Update their held item if player + if (entity instanceof Player) { + ((Player) entity).updateInventory(); + } + // TODO Stop using this as a shortcut >.> } public void setReplaceSounds(boolean areSoundsReplaced) {