Cleanup, fix a bug
This commit is contained in:
		| @@ -446,51 +446,48 @@ public class DisguiseUtilities | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             try | ||||
|             { | ||||
|                 int chunkX = (int) Math.floor(loc.getX() / 16D) - 17, chunkZ = (int) Math.floor(loc.getZ() / 16D) - 17; | ||||
|  | ||||
|                 chunkX -= chunkX % 8; | ||||
|                 chunkZ -= chunkZ % 8; | ||||
|             int chunkX = (int) Math.floor(loc.getX() / 16D) - 17, chunkZ = (int) Math.floor(loc.getZ() / 16D) - 17; | ||||
|  | ||||
|                 xChunk.set(bedChunk, chunkX); | ||||
|                 zChunk.set(bedChunk, chunkZ); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 ex.printStackTrace(System.out); | ||||
|             } | ||||
|             chunkX -= chunkX % 8; | ||||
|             chunkZ -= chunkZ % 8; | ||||
|  | ||||
|             // Make unload packets | ||||
|             try | ||||
|             { | ||||
|                 packets[i] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.MAP_CHUNK, bedChunk, 0) | ||||
|                         .createPacket(bedChunk, 0); | ||||
|             } | ||||
|             catch (IllegalArgumentException ex) | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     packets[i] = ProtocolLibrary.getProtocolManager() | ||||
|                             .createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0, 40).createPacket(bedChunk, true, 0, 48); | ||||
|                 } | ||||
|                 catch (IllegalArgumentException ex1) | ||||
|                 { | ||||
|                     packets[i] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0) | ||||
|                             .createPacket(bedChunk, true, 0); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             packets[i] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.UNLOAD_CHUNK, chunkX, chunkZ) | ||||
|                     .createPacket(bedChunk, 0); | ||||
|  | ||||
|             i++; | ||||
|  | ||||
|             // Make load packets | ||||
|             if (oldLoc == null || i > 1) | ||||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     xChunk.set(bedChunk, chunkX); | ||||
|                     zChunk.set(bedChunk, chunkZ); | ||||
|                 } | ||||
|                 catch (Exception ex) | ||||
|                 { | ||||
|                     ex.printStackTrace(System.out); | ||||
|                 } | ||||
|  | ||||
|                 // MAP_CHUNK_BULK was replaced in 1.9 with several seperated chunk packets | ||||
|                 // packets[i] = ProtocolLibrary.getProtocolManager() | ||||
|                 // .createPacketConstructor(Server.MAP_CHUNK_BULK, Arrays.asList(bedChunk)) | ||||
|                 // .createPacket(Arrays.asList(bedChunk)); | ||||
|                 packets[i] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0) | ||||
|                         .createPacket(bedChunk, true, 0); | ||||
|                 // Make unload packets | ||||
|                 try | ||||
|                 { | ||||
|                     packets[i] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.MAP_CHUNK, bedChunk, 0) | ||||
|                             .createPacket(bedChunk, 0); | ||||
|                 } | ||||
|                 catch (IllegalArgumentException ex) | ||||
|                 { | ||||
|                     packets[i] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.MAP_CHUNK, bedChunk, true, 0) | ||||
|                             .createPacket(bedChunk, true, 0); | ||||
|                 } | ||||
|  | ||||
|                 i++; | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -53,28 +53,32 @@ public class PacketListenerClientInteract extends PacketAdapter | ||||
|                 event.setCancelled(true); | ||||
|             } | ||||
|  | ||||
|             ItemStack item = observer.getItemInHand(); | ||||
|  | ||||
|             if (item != null && item.getType() == Material.INK_SACK) | ||||
|             for (ItemStack item : new ItemStack[] | ||||
|                 { | ||||
|                         observer.getInventory().getItemInMainHand(), observer.getInventory().getItemInOffHand() | ||||
|                 }) | ||||
|             { | ||||
|                 if (item == null || item.getType() != Material.INK_SACK) | ||||
|                     continue; | ||||
|  | ||||
|                 Disguise disguise = DisguiseAPI.getDisguise(observer, entity); | ||||
|  | ||||
|                 if (disguise != null && (disguise.getType() == DisguiseType.SHEEP || disguise.getType() == DisguiseType.WOLF)) | ||||
|                 if (disguise == null || (disguise.getType() != DisguiseType.SHEEP && disguise.getType() != DisguiseType.WOLF)) | ||||
|                     continue; | ||||
|  | ||||
|                 AnimalColor color = AnimalColor.getColor(item.getDurability()); | ||||
|  | ||||
|                 if (disguise.getType() == DisguiseType.SHEEP) | ||||
|                 { | ||||
|                     AnimalColor color = AnimalColor.getColor(item.getDurability()); | ||||
|                     SheepWatcher watcher = (SheepWatcher) disguise.getWatcher(); | ||||
|  | ||||
|                     if (disguise.getType() == DisguiseType.SHEEP) | ||||
|                     { | ||||
|                         SheepWatcher watcher = (SheepWatcher) disguise.getWatcher(); | ||||
|                     watcher.setColor(DisguiseConfig.isSheepDyeable() ? color : watcher.getColor()); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     WolfWatcher watcher = (WolfWatcher) disguise.getWatcher(); | ||||
|  | ||||
|                         watcher.setColor(DisguiseConfig.isSheepDyeable() ? color : watcher.getColor()); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         WolfWatcher watcher = (WolfWatcher) disguise.getWatcher(); | ||||
|  | ||||
|                         watcher.setCollarColor(DisguiseConfig.isWolfDyeable() ? color : watcher.getCollarColor()); | ||||
|                     } | ||||
|                     watcher.setCollarColor(DisguiseConfig.isWolfDyeable() ? color : watcher.getCollarColor()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -41,123 +41,38 @@ public class PacketListenerInventory extends PacketAdapter | ||||
|         if (event.getPlayer().getName().contains("UNKNOWN[")) // If the player is temporary | ||||
|             return; | ||||
|  | ||||
|         if (!(event.getPlayer() instanceof com.comphenix.net.sf.cglib.proxy.Factory) && event.getPlayer().getVehicle() == null) | ||||
|         if (event.getPlayer() instanceof com.comphenix.net.sf.cglib.proxy.Factory || event.getPlayer().getVehicle() != null) | ||||
|         { | ||||
|             Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|             // If player is disguised, views self disguises and has a inventory modifier | ||||
|             if (disguise != null && disguise.isSelfDisguiseVisible() | ||||
|                     && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) | ||||
|         Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); | ||||
|  | ||||
|         // If player is disguised, views self disguises and has a inventory modifier | ||||
|         if (disguise != null && disguise.isSelfDisguiseVisible() | ||||
|                 && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) | ||||
|         { | ||||
|             // If they are in creative and clicked on a slot | ||||
|             if (event.getPacketType() == PacketType.Play.Client.SET_CREATIVE_SLOT) | ||||
|             { | ||||
|                 // If they are in creative and clicked on a slot | ||||
|                 if (event.getPacketType() == PacketType.Play.Client.SET_CREATIVE_SLOT) | ||||
|                 int slot = event.getPacket().getIntegers().read(0); | ||||
|  | ||||
|                 if (slot >= 5 && slot <= 8) | ||||
|                 { | ||||
|                     int slot = event.getPacket().getIntegers().read(0); | ||||
|  | ||||
|                     if (slot >= 5 && slot <= 8) | ||||
|                     if (disguise.isHidingArmorFromSelf()) | ||||
|                     { | ||||
|                         if (disguise.isHidingArmorFromSelf()) | ||||
|                         { | ||||
|                             int armorSlot = Math.abs((slot - 5) - 3); | ||||
|                         int armorSlot = Math.abs((slot - 5) - 3); | ||||
|  | ||||
|                             org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; | ||||
|                         org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; | ||||
|  | ||||
|                             if (item != null && item.getType() != Material.AIR) | ||||
|                             { | ||||
|                                 PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                                 StructureModifier<Object> mods = packet.getModifier(); | ||||
|  | ||||
|                                 mods.write(0, 0); | ||||
|                                 mods.write(1, slot); | ||||
|                                 mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|  | ||||
|                                 try | ||||
|                                 { | ||||
|                                     ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
|                                 } | ||||
|                                 catch (InvocationTargetException e) | ||||
|                                 { | ||||
|                                     e.printStackTrace(); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     else if (slot >= 36 && slot <= 44) | ||||
|                     { | ||||
|                         if (disguise.isHidingHeldItemFromSelf()) | ||||
|                         { | ||||
|                             int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); | ||||
|  | ||||
|                             if (slot + 36 == currentSlot) | ||||
|                             { | ||||
|                                 org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); | ||||
|  | ||||
|                                 if (item != null && item.getType() != Material.AIR) | ||||
|                                 { | ||||
|                                     PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                                     StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                     mods.write(0, 0); | ||||
|                                     mods.write(1, slot); | ||||
|                                     mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|  | ||||
|                                     try | ||||
|                                     { | ||||
|                                         ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
|                                     } | ||||
|                                     catch (InvocationTargetException e) | ||||
|                                     { | ||||
|                                         e.printStackTrace(); | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 // If the player switched item, aka he moved from slot 1 to slot 2 | ||||
|                 else if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_SLOT) | ||||
|                 { | ||||
|                     if (disguise.isHidingHeldItemFromSelf()) | ||||
|                     { | ||||
|                         // From logging, it seems that both bukkit and nms uses the same thing for the slot switching. | ||||
|                         // 0 1 2 3 - 8 | ||||
|                         // If the packet is coming, then I need to replace the item they are switching to | ||||
|                         // As for the old item, I need to restore it. | ||||
|                         org.bukkit.inventory.ItemStack currentlyHeld = event.getPlayer().getItemInHand(); | ||||
|                         // If his old weapon isn't air | ||||
|                         if (currentlyHeld != null && currentlyHeld.getType() != Material.AIR) | ||||
|                         if (item != null && item.getType() != Material.AIR) | ||||
|                         { | ||||
|                             PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                             StructureModifier<Object> mods = packet.getModifier(); | ||||
|  | ||||
|                             mods.write(0, 0); | ||||
|                             mods.write(1, event.getPlayer().getInventory().getHeldItemSlot() + 36); | ||||
|                             mods.write(2, ReflectionManager.getNmsItem(currentlyHeld)); | ||||
|  | ||||
|                             try | ||||
|                             { | ||||
|                                 ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
|                             } | ||||
|                             catch (InvocationTargetException e) | ||||
|                             { | ||||
|                                 e.printStackTrace(); | ||||
|                             } | ||||
|                         } | ||||
|  | ||||
|                         org.bukkit.inventory.ItemStack newHeld = event.getPlayer().getInventory() | ||||
|                                 .getItem(event.getPacket().getIntegers().read(0)); | ||||
|  | ||||
|                         // If his new weapon isn't air either! | ||||
|                         if (newHeld != null && newHeld.getType() != Material.AIR) | ||||
|                         { | ||||
|                             PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                             StructureModifier<Object> mods = packet.getModifier(); | ||||
|  | ||||
|                             mods.write(0, 0); | ||||
|                             mods.write(1, event.getPacket().getIntegers().read(0) + 36); | ||||
|                             mods.write(1, slot); | ||||
|                             mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|  | ||||
|                             try | ||||
| @@ -171,55 +86,21 @@ public class PacketListenerInventory extends PacketAdapter | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 else if (event.getPacketType() == PacketType.Play.Client.WINDOW_CLICK) | ||||
|                 else if (slot >= 36 && slot <= 44) | ||||
|                 { | ||||
|                     int slot = event.getPacket().getIntegers().read(1); | ||||
|  | ||||
|                     org.bukkit.inventory.ItemStack clickedItem; | ||||
|  | ||||
|                     if (event.getPacket().getShorts().read(0) == 1) | ||||
|                     if (disguise.isHidingHeldItemFromSelf()) | ||||
|                     { | ||||
|                         // Its a shift click | ||||
|                         clickedItem = event.getPacket().getItemModifier().read(0); | ||||
|                         int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); | ||||
|  | ||||
|                         if (clickedItem != null && clickedItem.getType() != Material.AIR) | ||||
|                         if (slot + 36 == currentSlot) | ||||
|                         { | ||||
|                             // Rather than predict the clients actions | ||||
|                             // Lets just update the entire inventory.. | ||||
|                             Bukkit.getScheduler().runTask(libsDisguises, new Runnable() | ||||
|                             { | ||||
|                                 public void run() | ||||
|                                 { | ||||
|                                     event.getPlayer().updateInventory(); | ||||
|                                 } | ||||
|                             }); | ||||
|                         } | ||||
|                             org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); | ||||
|  | ||||
|                         return; | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         // If its not a player inventory click | ||||
|                         // Shift clicking is exempted for the item in hand.. | ||||
|                         if (event.getPacket().getIntegers().read(0) != 0) | ||||
|                         { | ||||
|                             return; | ||||
|                         } | ||||
|  | ||||
|                         clickedItem = event.getPlayer().getItemOnCursor(); | ||||
|                     } | ||||
|  | ||||
|                     if (clickedItem != null && clickedItem.getType() != Material.AIR) | ||||
|                     { | ||||
|                         // If the slot is a armor slot | ||||
|                         if (slot >= 5 && slot <= 8) | ||||
|                         { | ||||
|                             if (disguise.isHidingArmorFromSelf()) | ||||
|                             if (item != null && item.getType() != Material.AIR) | ||||
|                             { | ||||
|                                 PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                                 StructureModifier<Object> mods = packet.getModifier(); | ||||
|  | ||||
|                                 mods.write(0, 0); | ||||
|                                 mods.write(1, slot); | ||||
|                                 mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
| @@ -233,83 +114,126 @@ public class PacketListenerInventory extends PacketAdapter | ||||
|                                     e.printStackTrace(); | ||||
|                                 } | ||||
|                             } | ||||
|                             // Else if its a hotbar slot | ||||
|                         } | ||||
|                         else if (slot >= 36 && slot <= 44) | ||||
|                         { | ||||
|                             if (disguise.isHidingHeldItemFromSelf()) | ||||
|                             { | ||||
|                                 int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); | ||||
|  | ||||
|                                 // Check if the player is on the same slot as the slot that its setting | ||||
|                                 if (slot == currentSlot + 36) | ||||
|                                 { | ||||
|                                     PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                                     StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                     mods.write(0, 0); | ||||
|                                     mods.write(1, slot); | ||||
|                                     mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|  | ||||
|                                     try | ||||
|                                     { | ||||
|                                         ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
|                                     } | ||||
|                                     catch (InvocationTargetException e) | ||||
|                                     { | ||||
|                                         e.printStackTrace(); | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onPacketSending(PacketEvent event) | ||||
|     { | ||||
|         // If the inventory is the players inventory | ||||
|         if (!(event.getPlayer() instanceof com.comphenix.net.sf.cglib.proxy.Factory) && event.getPlayer().getVehicle() == null | ||||
|                 && event.getPacket().getIntegers().read(0) == 0) | ||||
|         { | ||||
|  | ||||
|             Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); | ||||
|  | ||||
|             // If the player is disguised, views self disguises and is hiding a item. | ||||
|             if (disguise != null && disguise.isSelfDisguiseVisible() | ||||
|                     && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) | ||||
|             // If the player switched item, aka he moved from slot 1 to slot 2 | ||||
|             else if (event.getPacketType() == PacketType.Play.Client.HELD_ITEM_SLOT) | ||||
|             { | ||||
|                 // 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 | ||||
|                  */ | ||||
|                 if (event.getPacketType() == Server.SET_SLOT) | ||||
|                 if (disguise.isHidingHeldItemFromSelf()) | ||||
|                 { | ||||
|                     // The raw slot | ||||
|                     // nms code has the start of the hotbar being 36. | ||||
|                     int slot = event.getPacket().getIntegers().read(1); | ||||
|                     // From logging, it seems that both bukkit and nms uses the same thing for the slot switching. | ||||
|                     // 0 1 2 3 - 8 | ||||
|                     // If the packet is coming, then I need to replace the item they are switching to | ||||
|                     // As for the old item, I need to restore it. | ||||
|                     org.bukkit.inventory.ItemStack currentlyHeld = event.getPlayer().getItemInHand(); | ||||
|                     // If his old weapon isn't air | ||||
|                     if (currentlyHeld != null && currentlyHeld.getType() != Material.AIR) | ||||
|                     { | ||||
|                         PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                         StructureModifier<Object> mods = packet.getModifier(); | ||||
|  | ||||
|                         mods.write(0, 0); | ||||
|                         mods.write(1, event.getPlayer().getInventory().getHeldItemSlot() + 36); | ||||
|                         mods.write(2, ReflectionManager.getNmsItem(currentlyHeld)); | ||||
|  | ||||
|                         try | ||||
|                         { | ||||
|                             ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
|                         } | ||||
|                         catch (InvocationTargetException e) | ||||
|                         { | ||||
|                             e.printStackTrace(); | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     org.bukkit.inventory.ItemStack newHeld = event.getPlayer().getInventory() | ||||
|                             .getItem(event.getPacket().getIntegers().read(0)); | ||||
|  | ||||
|                     // If his new weapon isn't air either! | ||||
|                     if (newHeld != null && newHeld.getType() != Material.AIR) | ||||
|                     { | ||||
|                         PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                         StructureModifier<Object> mods = packet.getModifier(); | ||||
|  | ||||
|                         mods.write(0, 0); | ||||
|                         mods.write(1, event.getPacket().getIntegers().read(0) + 36); | ||||
|                         mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|  | ||||
|                         try | ||||
|                         { | ||||
|                             ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
|                         } | ||||
|                         catch (InvocationTargetException e) | ||||
|                         { | ||||
|                             e.printStackTrace(); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             else if (event.getPacketType() == PacketType.Play.Client.WINDOW_CLICK) | ||||
|             { | ||||
|                 int slot = event.getPacket().getIntegers().read(1); | ||||
|  | ||||
|                 org.bukkit.inventory.ItemStack clickedItem; | ||||
|  | ||||
|                 if (event.getPacket().getShorts().read(0) == 1) | ||||
|                 { | ||||
|                     // Its a shift click | ||||
|                     clickedItem = event.getPacket().getItemModifier().read(0); | ||||
|  | ||||
|                     if (clickedItem != null && clickedItem.getType() != Material.AIR) | ||||
|                     { | ||||
|                         // Rather than predict the clients actions | ||||
|                         // Lets just update the entire inventory.. | ||||
|                         Bukkit.getScheduler().runTask(libsDisguises, new Runnable() | ||||
|                         { | ||||
|                             public void run() | ||||
|                             { | ||||
|                                 event.getPlayer().updateInventory(); | ||||
|                             } | ||||
|                         }); | ||||
|                     } | ||||
|  | ||||
|                     return; | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     // If its not a player inventory click | ||||
|                     // Shift clicking is exempted for the item in hand.. | ||||
|                     if (event.getPacket().getIntegers().read(0) != 0) | ||||
|                     { | ||||
|                         return; | ||||
|                     } | ||||
|  | ||||
|                     clickedItem = event.getPlayer().getItemOnCursor(); | ||||
|                 } | ||||
|  | ||||
|                 if (clickedItem != null && clickedItem.getType() != Material.AIR) | ||||
|                 { | ||||
|                     // If the slot is a armor slot | ||||
|                     if (slot >= 5 && slot <= 8) | ||||
|                     { | ||||
|                         if (disguise.isHidingArmorFromSelf()) | ||||
|                         { | ||||
|                             // Get the bukkit armor slot! | ||||
|                             int armorSlot = Math.abs((slot - 5) - 3); | ||||
|                             PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                             org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; | ||||
|                             StructureModifier<Object> mods = packet.getModifier(); | ||||
|  | ||||
|                             if (item != null && item.getType() != Material.AIR) | ||||
|                             mods.write(0, 0); | ||||
|                             mods.write(1, slot); | ||||
|                             mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|  | ||||
|                             try | ||||
|                             { | ||||
|                                 event.setPacket(event.getPacket().shallowClone()); | ||||
|  | ||||
|                                 event.getPacket().getModifier().write(2, | ||||
|                                         ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|                                 ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
|                             } | ||||
|                             catch (InvocationTargetException e) | ||||
|                             { | ||||
|                                 e.printStackTrace(); | ||||
|                             } | ||||
|                         } | ||||
|                         // Else if its a hotbar slot | ||||
| @@ -323,68 +247,150 @@ public class PacketListenerInventory extends PacketAdapter | ||||
|                             // Check if the player is on the same slot as the slot that its setting | ||||
|                             if (slot == currentSlot + 36) | ||||
|                             { | ||||
|                                 org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); | ||||
|                                 PacketContainer packet = new PacketContainer(Server.SET_SLOT); | ||||
|  | ||||
|                                 if (item != null && item.getType() != Material.AIR) | ||||
|                                 StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                 mods.write(0, 0); | ||||
|                                 mods.write(1, slot); | ||||
|                                 mods.write(2, ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|  | ||||
|                                 try | ||||
|                                 { | ||||
|                                     event.setPacket(event.getPacket().shallowClone()); | ||||
|                                     event.getPacket().getModifier().write(2, | ||||
|                                             ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|                                     ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
|                                 } | ||||
|                                 catch (InvocationTargetException e) | ||||
|                                 { | ||||
|                                     e.printStackTrace(); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 else if (event.getPacketType() == Server.WINDOW_ITEMS) | ||||
|                 { | ||||
|                     event.setPacket(event.getPacket().deepClone()); | ||||
|  | ||||
|                     StructureModifier<ItemStack[]> mods = event.getPacket().getItemArrayModifier(); | ||||
|                     ItemStack[] items = mods.read(0); | ||||
|  | ||||
|                     for (int slot = 0; slot < items.length; slot++) | ||||
|                     { | ||||
|                         if (slot >= 5 && slot <= 8) | ||||
|                         { | ||||
|                             if (disguise.isHidingArmorFromSelf()) | ||||
|                             { | ||||
|                                 // Get the bukkit armor slot! | ||||
|                                 int armorSlot = Math.abs((slot - 5) - 3); | ||||
|  | ||||
|                                 org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory() | ||||
|                                         .getArmorContents()[armorSlot]; | ||||
|  | ||||
|                                 if (item != null && item.getType() != Material.AIR) | ||||
|                                 { | ||||
|                                     items[slot] = new org.bukkit.inventory.ItemStack(0); | ||||
|                                 } | ||||
|                             } | ||||
|                             // Else if its a hotbar slot | ||||
|                         } | ||||
|                         else if (slot >= 36 && slot <= 44) | ||||
|                         { | ||||
|                             if (disguise.isHidingHeldItemFromSelf()) | ||||
|                             { | ||||
|                                 int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); | ||||
|  | ||||
|                                 // Check if the player is on the same slot as the slot that its setting | ||||
|                                 if (slot == currentSlot + 36) | ||||
|                                 { | ||||
|                                     org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); | ||||
|  | ||||
|                                     if (item != null && item.getType() != Material.AIR) | ||||
|                                     { | ||||
|                                         items[slot] = new org.bukkit.inventory.ItemStack(0); | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     mods.write(0, items); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onPacketSending(PacketEvent event) | ||||
|     { | ||||
|         // If the inventory is the players inventory | ||||
|         if (event.getPlayer() instanceof com.comphenix.net.sf.cglib.proxy.Factory || event.getPlayer().getVehicle() != null | ||||
|                 || event.getPacket().getIntegers().read(0) != 0) | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); | ||||
|  | ||||
|         if (disguise == null || !disguise.isSelfDisguiseVisible() | ||||
|                 || (!disguise.isHidingArmorFromSelf() && !disguise.isHidingHeldItemFromSelf())) | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // If the player is disguised, views self disguises and is hiding a item. | ||||
|  | ||||
|         // 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 | ||||
|          */ | ||||
|         if (event.getPacketType() == Server.SET_SLOT) | ||||
|         { | ||||
|             // The raw slot | ||||
|             // nms code has the start of the hotbar being 36. | ||||
|             int slot = event.getPacket().getIntegers().read(1); | ||||
|  | ||||
|             // If the slot is a armor slot | ||||
|             if (slot >= 5 && slot <= 8) | ||||
|             { | ||||
|                 if (disguise.isHidingArmorFromSelf()) | ||||
|                 { | ||||
|                     // Get the bukkit armor slot! | ||||
|                     int armorSlot = Math.abs((slot - 5) - 3); | ||||
|  | ||||
|                     org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; | ||||
|  | ||||
|                     if (item != null && item.getType() != Material.AIR) | ||||
|                     { | ||||
|                         event.setPacket(event.getPacket().shallowClone()); | ||||
|  | ||||
|                         event.getPacket().getModifier().write(2, | ||||
|                                 ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|                     } | ||||
|                 } | ||||
|                 // Else if its a hotbar slot | ||||
|             } | ||||
|             else if (slot >= 36 && slot <= 44) | ||||
|             { | ||||
|                 if (disguise.isHidingHeldItemFromSelf()) | ||||
|                 { | ||||
|                     int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); | ||||
|  | ||||
|                     // Check if the player is on the same slot as the slot that its setting | ||||
|                     if (slot == currentSlot + 36) | ||||
|                     { | ||||
|                         org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); | ||||
|  | ||||
|                         if (item != null && item.getType() != Material.AIR) | ||||
|                         { | ||||
|                             event.setPacket(event.getPacket().shallowClone()); | ||||
|                             event.getPacket().getModifier().write(2, | ||||
|                                     ReflectionManager.getNmsItem(new org.bukkit.inventory.ItemStack(0))); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         else if (event.getPacketType() == Server.WINDOW_ITEMS) | ||||
|         { | ||||
|             event.setPacket(event.getPacket().deepClone()); | ||||
|  | ||||
|             StructureModifier<ItemStack[]> mods = event.getPacket().getItemArrayModifier(); | ||||
|             ItemStack[] items = mods.read(0); | ||||
|  | ||||
|             for (int slot = 0; slot < items.length; slot++) | ||||
|             { | ||||
|                 if (slot >= 5 && slot <= 8) | ||||
|                 { | ||||
|                     if (disguise.isHidingArmorFromSelf()) | ||||
|                     { | ||||
|                         // Get the bukkit armor slot! | ||||
|                         int armorSlot = Math.abs((slot - 5) - 3); | ||||
|  | ||||
|                         org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; | ||||
|  | ||||
|                         if (item != null && item.getType() != Material.AIR) | ||||
|                         { | ||||
|                             items[slot] = new org.bukkit.inventory.ItemStack(0); | ||||
|                         } | ||||
|                     } | ||||
|                     // Else if its a hotbar slot | ||||
|                 } | ||||
|                 else if (slot >= 36 && slot <= 44) | ||||
|                 { | ||||
|                     if (disguise.isHidingHeldItemFromSelf()) | ||||
|                     { | ||||
|                         int currentSlot = event.getPlayer().getInventory().getHeldItemSlot(); | ||||
|  | ||||
|                         // Check if the player is on the same slot as the slot that its setting | ||||
|                         if (slot == currentSlot + 36) | ||||
|                         { | ||||
|                             org.bukkit.inventory.ItemStack item = event.getPlayer().getItemInHand(); | ||||
|  | ||||
|                             if (item != null && item.getType() != Material.AIR) | ||||
|                             { | ||||
|                                 items[slot] = new org.bukkit.inventory.ItemStack(0); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             mods.write(0, items); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -53,45 +53,50 @@ public class PacketListenerMain extends PacketAdapter | ||||
|  | ||||
|         PacketContainer[][] packets = PacketsManager.transformPacket(event.getPacket(), event.getPlayer(), entity); | ||||
|  | ||||
|         if (packets != null) | ||||
|         if (packets == null) | ||||
|         { | ||||
|             event.setCancelled(true); | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 for (PacketContainer packet : packets[0]) | ||||
|                 { | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                 } | ||||
|  | ||||
|                 final PacketContainer[] delayed = packets[1]; | ||||
|  | ||||
|                 if (delayed.length > 0) | ||||
|                 { | ||||
|                     Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() | ||||
|                     { | ||||
|                         public void run() | ||||
|                         { | ||||
|                             try | ||||
|                             { | ||||
|                                 for (PacketContainer packet : delayed) | ||||
|                                 { | ||||
|                                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                                 } | ||||
|                             } | ||||
|                             catch (InvocationTargetException e) | ||||
|                             { | ||||
|                                 e.printStackTrace(); | ||||
|                             } | ||||
|                         } | ||||
|                     }, 2); | ||||
|                 } | ||||
|             } | ||||
|             catch (InvocationTargetException ex) | ||||
|             { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         event.setCancelled(true); | ||||
|  | ||||
|         try | ||||
|         { | ||||
|             for (PacketContainer packet : packets[0]) | ||||
|             { | ||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|             } | ||||
|  | ||||
|             final PacketContainer[] delayed = packets[1]; | ||||
|  | ||||
|             if (delayed.length == 0) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() | ||||
|             { | ||||
|                 public void run() | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         for (PacketContainer packet : delayed) | ||||
|                         { | ||||
|                             ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                         } | ||||
|                     } | ||||
|                     catch (InvocationTargetException e) | ||||
|                     { | ||||
|                         e.printStackTrace(); | ||||
|                     } | ||||
|                 } | ||||
|             }, 2); | ||||
|         } | ||||
|         catch (InvocationTargetException ex) | ||||
|         { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -286,116 +286,118 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|         } | ||||
|         else if (event.getPacketType() == Server.ENTITY_STATUS) | ||||
|         { | ||||
|             if ((byte) mods.read(1) == 2) | ||||
|             if ((byte) mods.read(1) != 2) | ||||
|             { | ||||
|                 // It made a damage animation | ||||
|                 Entity entity = event.getPacket().getEntityModifier(observer.getWorld()).read(0); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|                 Disguise disguise = DisguiseAPI.getDisguise(observer, entity); | ||||
|             // It made a damage animation | ||||
|             Entity entity = event.getPacket().getEntityModifier(observer.getWorld()).read(0); | ||||
|  | ||||
|                 if (disguise != null && !disguise.getType().isPlayer() | ||||
|                         && (disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) | ||||
|             Disguise disguise = DisguiseAPI.getDisguise(observer, entity); | ||||
|  | ||||
|             if (disguise != null && !disguise.getType().isPlayer() | ||||
|                     && (disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) | ||||
|             { | ||||
|                 DisguiseSound disSound = DisguiseSound.getType(entity.getType().name()); | ||||
|  | ||||
|                 if (disSound == null) | ||||
|                     return; | ||||
|  | ||||
|                 SoundType soundType = null; | ||||
|                 Object obj = null; | ||||
|  | ||||
|                 if (entity instanceof LivingEntity) | ||||
|                 { | ||||
|                     DisguiseSound disSound = DisguiseSound.getType(entity.getType().name()); | ||||
|  | ||||
|                     if (disSound == null) | ||||
|                         return; | ||||
|  | ||||
|                     SoundType soundType = null; | ||||
|                     Object obj = null; | ||||
|  | ||||
|                     if (entity instanceof LivingEntity) | ||||
|                     try | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                             obj = LivingEntity.class.getMethod("getHealth").invoke(entity); | ||||
|                         obj = LivingEntity.class.getMethod("getHealth").invoke(entity); | ||||
|  | ||||
|                             if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) | ||||
|                         if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) | ||||
|                         { | ||||
|                             soundType = SoundType.DEATH; | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                             obj = null; | ||||
|                         } | ||||
|                     } | ||||
|                     catch (Exception e) | ||||
|                     { | ||||
|                         e.printStackTrace(); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (obj == null) | ||||
|                 { | ||||
|                     soundType = SoundType.HURT; | ||||
|                 } | ||||
|  | ||||
|                 if (disSound.getSound(soundType) == null | ||||
|                         || (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer())) | ||||
|                 { | ||||
|                     if (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer()) | ||||
|                     { | ||||
|                         cancelSound = !cancelSound; | ||||
|  | ||||
|                         if (cancelSound) | ||||
|                             return; | ||||
|                     } | ||||
|  | ||||
|                     disSound = DisguiseSound.getType(disguise.getType().name()); | ||||
|  | ||||
|                     if (disSound != null) | ||||
|                     { | ||||
|                         String sound = disSound.getSound(soundType); | ||||
|  | ||||
|                         if (sound != null) | ||||
|                         { | ||||
|                             Location loc = entity.getLocation(); | ||||
|  | ||||
|                             PacketContainer packet = new PacketContainer(Server.NAMED_SOUND_EFFECT); | ||||
|  | ||||
|                             mods = packet.getModifier(); | ||||
|  | ||||
|                             Object craftSoundEffect = ReflectionManager.getCraftSoundEffect(sound); | ||||
|  | ||||
|                             mods.write(0, craftSoundEffect); | ||||
|                             mods.write(1, ReflectionManager.getSoundCategory(disguise.getType())); // Meh | ||||
|                             mods.write(2, (int) (loc.getX() * 8D)); | ||||
|                             mods.write(3, (int) (loc.getY() * 8D)); | ||||
|                             mods.write(4, (int) (loc.getZ() * 8D)); | ||||
|                             mods.write(5, disSound.getDamageAndIdleSoundVolume()); | ||||
|  | ||||
|                             float pitch; | ||||
|  | ||||
|                             if (disguise instanceof MobDisguise && !((MobDisguise) disguise).isAdult()) | ||||
|                             { | ||||
|                                 soundType = SoundType.DEATH; | ||||
|                                 pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F | ||||
|                                         + 1.5F; | ||||
|                             } | ||||
|                             else | ||||
|                                 pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F | ||||
|                                         + 1.0F; | ||||
|  | ||||
|                             if (disguise.getType() == DisguiseType.BAT) | ||||
|                                 pitch *= 95F; | ||||
|  | ||||
|                             pitch *= 63; | ||||
|  | ||||
|                             if (pitch < 0) | ||||
|                                 pitch = 0; | ||||
|  | ||||
|                             if (pitch > 255) | ||||
|                                 pitch = 255; | ||||
|  | ||||
|                             mods.write(6, (int) pitch); | ||||
|  | ||||
|                             try | ||||
|                             { | ||||
|                                 obj = null; | ||||
|                                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                             } | ||||
|                         } | ||||
|                         catch (Exception e) | ||||
|                         { | ||||
|                             e.printStackTrace(); | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     if (obj == null) | ||||
|                     { | ||||
|                         soundType = SoundType.HURT; | ||||
|                     } | ||||
|  | ||||
|                     if (disSound.getSound(soundType) == null | ||||
|                             || (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer())) | ||||
|                     { | ||||
|                         if (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer()) | ||||
|                         { | ||||
|                             cancelSound = !cancelSound; | ||||
|  | ||||
|                             if (cancelSound) | ||||
|                                 return; | ||||
|                         } | ||||
|  | ||||
|                         disSound = DisguiseSound.getType(disguise.getType().name()); | ||||
|  | ||||
|                         if (disSound != null) | ||||
|                         { | ||||
|                             String sound = disSound.getSound(soundType); | ||||
|  | ||||
|                             if (sound != null) | ||||
|                             catch (InvocationTargetException e) | ||||
|                             { | ||||
|                                 Location loc = entity.getLocation(); | ||||
|  | ||||
|                                 PacketContainer packet = new PacketContainer(Server.NAMED_SOUND_EFFECT); | ||||
|  | ||||
|                                 mods = packet.getModifier(); | ||||
|  | ||||
|                                 Object craftSoundEffect = ReflectionManager.getCraftSoundEffect(sound); | ||||
|  | ||||
|                                 mods.write(0, craftSoundEffect); | ||||
|                                 mods.write(1, ReflectionManager.getSoundCategory(disguise.getType())); // Meh | ||||
|                                 mods.write(2, (int) (loc.getX() * 8D)); | ||||
|                                 mods.write(3, (int) (loc.getY() * 8D)); | ||||
|                                 mods.write(4, (int) (loc.getZ() * 8D)); | ||||
|                                 mods.write(5, disSound.getDamageAndIdleSoundVolume()); | ||||
|  | ||||
|                                 float pitch; | ||||
|  | ||||
|                                 if (disguise instanceof MobDisguise && !((MobDisguise) disguise).isAdult()) | ||||
|                                 { | ||||
|                                     pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F | ||||
|                                             + 1.5F; | ||||
|                                 } | ||||
|                                 else | ||||
|                                     pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F | ||||
|                                             + 1.0F; | ||||
|  | ||||
|                                 if (disguise.getType() == DisguiseType.BAT) | ||||
|                                     pitch *= 95F; | ||||
|  | ||||
|                                 pitch *= 63; | ||||
|  | ||||
|                                 if (pitch < 0) | ||||
|                                     pitch = 0; | ||||
|  | ||||
|                                 if (pitch > 255) | ||||
|                                     pitch = 255; | ||||
|  | ||||
|                                 mods.write(6, (int) pitch); | ||||
|  | ||||
|                                 try | ||||
|                                 { | ||||
|                                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                                 } | ||||
|                                 catch (InvocationTargetException e) | ||||
|                                 { | ||||
|                                     e.printStackTrace(); | ||||
|                                 } | ||||
|                                 e.printStackTrace(); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|   | ||||
| @@ -47,141 +47,145 @@ public class PacketListenerViewDisguises extends PacketAdapter | ||||
|         if (observer.getName().contains("UNKNOWN[")) // If the player is temporary | ||||
|             return; | ||||
|  | ||||
|         if (event.getPacket().getIntegers().read(0) == observer.getEntityId()) | ||||
|         if (event.getPacket().getIntegers().read(0) != observer.getEntityId()) | ||||
|         { | ||||
|             if (DisguiseAPI.isSelfDisguised(observer)) | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (!DisguiseAPI.isSelfDisguised(observer)) | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         // Here I grab the packets to convert them to, So I can display them as if the disguise sent them. | ||||
|         PacketContainer[][] transformed = PacketsManager.transformPacket(event.getPacket(), observer, observer); | ||||
|  | ||||
|         PacketContainer[] packets = transformed == null ? null : transformed[0]; | ||||
|  | ||||
|         final PacketContainer[] delayedPackets = transformed == null ? null : transformed[1]; | ||||
|  | ||||
|         if (packets == null) | ||||
|         { | ||||
|             packets = new PacketContainer[] | ||||
|                 { | ||||
|                         event.getPacket() | ||||
|                 }; | ||||
|         } | ||||
|  | ||||
|         for (PacketContainer packet : packets) | ||||
|         { | ||||
|             if (packet.getType() != Server.PLAYER_INFO) | ||||
|             { | ||||
|                 // Here I grab the packets to convert them to, So I can display them as if the disguise sent them. | ||||
|                 PacketContainer[][] transformed = PacketsManager.transformPacket(event.getPacket(), observer, observer); | ||||
|  | ||||
|                 PacketContainer[] packets = transformed == null ? null : transformed[0]; | ||||
|  | ||||
|                 final PacketContainer[] delayedPackets = transformed == null ? null : transformed[1]; | ||||
|  | ||||
|                 if (packets == null) | ||||
|                 if (packet.equals(event.getPacket())) | ||||
|                 { | ||||
|                     packets = new PacketContainer[] | ||||
|                         { | ||||
|                                 event.getPacket() | ||||
|                         }; | ||||
|                     packet = packet.shallowClone(); | ||||
|                 } | ||||
|  | ||||
|                 for (PacketContainer packet : packets) | ||||
|                 packet.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||
|             } | ||||
|  | ||||
|             try | ||||
|             { | ||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|             } | ||||
|             catch (InvocationTargetException e) | ||||
|             { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (delayedPackets != null && delayedPackets.length > 0) | ||||
|         { | ||||
|             Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() | ||||
|             { | ||||
|                 public void run() | ||||
|                 { | ||||
|                     if (packet.getType() != Server.PLAYER_INFO) | ||||
|                     { | ||||
|                         if (packet.equals(event.getPacket())) | ||||
|                         { | ||||
|                             packet = packet.shallowClone(); | ||||
|                         } | ||||
|  | ||||
|                         packet.getIntegers().write(0, DisguiseAPI.getSelfDisguiseId()); | ||||
|                     } | ||||
|  | ||||
|                     try | ||||
|                     { | ||||
|                         ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                         for (PacketContainer packet : delayedPackets) | ||||
|                         { | ||||
|                             ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                         } | ||||
|                     } | ||||
|                     catch (InvocationTargetException e) | ||||
|                     { | ||||
|                         e.printStackTrace(); | ||||
|                     } | ||||
|                 } | ||||
|             }, 2); | ||||
|         } | ||||
|  | ||||
|                 if (delayedPackets != null && delayedPackets.length > 0) | ||||
|         if (event.getPacketType() == Server.ENTITY_METADATA) | ||||
|         { | ||||
|             event.setPacket(event.getPacket().deepClone()); | ||||
|  | ||||
|             for (WrappedWatchableObject watch : event.getPacket().getWatchableCollectionModifier().read(0)) | ||||
|             { | ||||
|                 if (watch.getIndex() == 0) | ||||
|                 { | ||||
|                     Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() | ||||
|                     { | ||||
|                         public void run() | ||||
|                         { | ||||
|                             try | ||||
|                             { | ||||
|                                 for (PacketContainer packet : delayedPackets) | ||||
|                                 { | ||||
|                                     ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                                 } | ||||
|                             } | ||||
|                             catch (InvocationTargetException e) | ||||
|                             { | ||||
|                                 e.printStackTrace(); | ||||
|                             } | ||||
|                         } | ||||
|                     }, 2); | ||||
|                     byte b = (byte) watch.getValue(); | ||||
|  | ||||
|                     byte a = (byte) (b | 1 << 5); | ||||
|  | ||||
|                     if ((b & 1 << 3) != 0) | ||||
|                         a = (byte) (a | 1 << 3); | ||||
|  | ||||
|                     watch.setValue(a); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN) | ||||
|         { | ||||
|             event.setCancelled(true); | ||||
|  | ||||
|                 if (event.getPacketType() == Server.ENTITY_METADATA) | ||||
|                 { | ||||
|                     event.setPacket(event.getPacket().deepClone()); | ||||
|             PacketContainer packet = new PacketContainer(Server.ENTITY_METADATA); | ||||
|  | ||||
|                     for (WrappedWatchableObject watch : event.getPacket().getWatchableCollectionModifier().read(0)) | ||||
|                     { | ||||
|                         if (watch.getIndex() == 0) | ||||
|                         { | ||||
|                             byte b = (byte) watch.getValue(); | ||||
|             StructureModifier<Object> mods = packet.getModifier(); | ||||
|  | ||||
|                             byte a = (byte) (b | 1 << 5); | ||||
|             mods.write(0, observer.getEntityId()); | ||||
|  | ||||
|                             if ((b & 1 << 3) != 0) | ||||
|                                 a = (byte) (a | 1 << 3); | ||||
|             List<WrappedWatchableObject> watchableList = new ArrayList<>(); | ||||
|             Byte b = 1 << 5; | ||||
|  | ||||
|                             watch.setValue(a); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 else if (event.getPacketType() == Server.NAMED_ENTITY_SPAWN) | ||||
|                 { | ||||
|                     event.setCancelled(true); | ||||
|             if (observer.isSprinting()) | ||||
|                 b = (byte) (b | 1 << 3); | ||||
|  | ||||
|                     PacketContainer packet = new PacketContainer(Server.ENTITY_METADATA); | ||||
|             WrappedWatchableObject watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(0, b)); | ||||
|  | ||||
|                     StructureModifier<Object> mods = packet.getModifier(); | ||||
|             watchableList.add(watch); | ||||
|             packet.getWatchableCollectionModifier().write(0, watchableList); | ||||
|  | ||||
|                     mods.write(0, observer.getEntityId()); | ||||
|             try | ||||
|             { | ||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet); | ||||
|             } | ||||
|             catch (InvocationTargetException e) | ||||
|             { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|         } | ||||
|         else if (event.getPacketType() == Server.ANIMATION) | ||||
|         { | ||||
|             if (event.getPacket().getIntegers().read(1) != 2) | ||||
|             { | ||||
|                 event.setCancelled(true); | ||||
|             } | ||||
|         } | ||||
|         else if (event.getPacketType() == Server.ATTACH_ENTITY || event.getPacketType() == Server.REL_ENTITY_MOVE | ||||
|                 || event.getPacketType() == Server.REL_ENTITY_MOVE_LOOK || event.getPacketType() == Server.ENTITY_LOOK | ||||
|                 || event.getPacketType() == Server.ENTITY_TELEPORT || event.getPacketType() == Server.ENTITY_HEAD_ROTATION | ||||
|                 || event.getPacketType() == Server.ENTITY_EFFECT || event.getPacketType() == Server.ENTITY_EQUIPMENT) | ||||
|         { | ||||
|             event.setCancelled(true); | ||||
|         } | ||||
|         else if (event.getPacketType() == Server.ENTITY_STATUS) | ||||
|         { | ||||
|             Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); | ||||
|  | ||||
|                     List<WrappedWatchableObject> watchableList = new ArrayList<>(); | ||||
|                     Byte b = 1 << 5; | ||||
|  | ||||
|                     if (observer.isSprinting()) | ||||
|                         b = (byte) (b | 1 << 3); | ||||
|  | ||||
|                     WrappedWatchableObject watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(0, b)); | ||||
|  | ||||
|                     watchableList.add(watch); | ||||
|                     packet.getWatchableCollectionModifier().write(0, watchableList); | ||||
|  | ||||
|                     try | ||||
|                     { | ||||
|                         ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet); | ||||
|                     } | ||||
|                     catch (InvocationTargetException e) | ||||
|                     { | ||||
|                         e.printStackTrace(); | ||||
|                     } | ||||
|                 } | ||||
|                 else if (event.getPacketType() == Server.ANIMATION) | ||||
|                 { | ||||
|                     if (event.getPacket().getIntegers().read(1) != 2) | ||||
|                     { | ||||
|                         event.setCancelled(true); | ||||
|                     } | ||||
|                 } | ||||
|                 else if (event.getPacketType() == Server.ATTACH_ENTITY || event.getPacketType() == Server.REL_ENTITY_MOVE | ||||
|                         || event.getPacketType() == Server.REL_ENTITY_MOVE_LOOK || event.getPacketType() == Server.ENTITY_LOOK | ||||
|                         || event.getPacketType() == Server.ENTITY_TELEPORT || event.getPacketType() == Server.ENTITY_HEAD_ROTATION | ||||
|                         || event.getPacketType() == Server.ENTITY_EFFECT || event.getPacketType() == Server.ENTITY_EQUIPMENT) | ||||
|                 { | ||||
|                     event.setCancelled(true); | ||||
|                 } | ||||
|                 else if (event.getPacketType() == Server.ENTITY_STATUS) | ||||
|                 { | ||||
|                     Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); | ||||
|  | ||||
|                     if (disguise.isSelfDisguiseSoundsReplaced() && !disguise.getType().isPlayer() | ||||
|                             && event.getPacket().getBytes().read(0) == 2) | ||||
|                     { | ||||
|                         event.setCancelled(true); | ||||
|                     } | ||||
|                 } | ||||
|             if (disguise.isSelfDisguiseSoundsReplaced() && !disguise.getType().isPlayer() | ||||
|                     && event.getPacket().getBytes().read(0) == 2) | ||||
|             { | ||||
|                 event.setCancelled(true); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user