Self disguises now behave when riding something
This commit is contained in:
		| @@ -264,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() || !PacketsManager.isViewDisguisesListenerEnabled()) | ||||
|         if (!disguise.viewSelfDisguise() || !PacketsManager.isViewDisguisesListenerEnabled() || player.getVehicle() != null) | ||||
|             return; | ||||
|         try { | ||||
|             // Grab the entity ID the fake disguise will use | ||||
|   | ||||
| @@ -2,19 +2,20 @@ package me.libraryaddict.disguise; | ||||
|  | ||||
| import java.util.HashMap; | ||||
|  | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
|  | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.event.EventHandler; | ||||
| import org.bukkit.event.EventPriority; | ||||
| import org.bukkit.event.Listener; | ||||
| import org.bukkit.event.player.PlayerInteractEntityEvent; | ||||
| import org.bukkit.event.player.PlayerJoinEvent; | ||||
| import org.bukkit.event.vehicle.VehicleEnterEvent; | ||||
| import org.bukkit.event.vehicle.VehicleExitEvent; | ||||
| import org.bukkit.scheduler.BukkitRunnable; | ||||
|  | ||||
|  | ||||
| public class DisguiseListener implements Listener { | ||||
|  | ||||
|     private String currentVersion; | ||||
| @@ -26,6 +27,7 @@ public class DisguiseListener implements Listener { | ||||
|     private String updateMessage = ChatColor.RED + "[LibsDisguises] " + ChatColor.DARK_RED | ||||
|             + "There is a update ready to be downloaded! You are using " + ChatColor.RED + "v%s" + ChatColor.DARK_RED | ||||
|             + ", the new version is " + ChatColor.RED + "%s" + ChatColor.DARK_RED + "!"; | ||||
|     private DisguiseAPI disguiseAPI = new DisguiseAPI(); | ||||
|  | ||||
|     public DisguiseListener(LibsDisguises libsDisguises) { | ||||
|         plugin = libsDisguises; | ||||
| @@ -56,6 +58,26 @@ public class DisguiseListener implements Listener { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @EventHandler(priority = EventPriority.MONITOR) | ||||
|     public void onVechileLeave(VehicleExitEvent event) { | ||||
|         final Disguise disguise = DisguiseAPI.getDisguise(event.getExited()); | ||||
|         if (disguise != null) { | ||||
|             Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { | ||||
|                 public void run() { | ||||
|                     disguiseAPI.setupFakeDisguise(disguise); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @EventHandler(priority = EventPriority.MONITOR) | ||||
|     public void onVechileEnter(VehicleEnterEvent event) { | ||||
|         Disguise disguise = DisguiseAPI.getDisguise(event.getEntered()); | ||||
|         if (disguise != null && event.getEntered() instanceof Player) { | ||||
|             disguiseAPI.removeVisibleDisguise((Player) event.getEntered()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @EventHandler | ||||
|     public void onJoin(PlayerJoinEvent event) { | ||||
|         Player p = event.getPlayer(); | ||||
|   | ||||
| @@ -697,7 +697,7 @@ public class PacketsManager { | ||||
|             @Override | ||||
|             public void onPacketSending(PacketEvent event) { | ||||
|                 // If the inventory is the players inventory | ||||
|                 if (event.getPacket().getIntegers().read(0) == 0) { | ||||
|                 if (event.getPlayer().getVehicle() == null && event.getPacket().getIntegers().read(0) == 0) { | ||||
|                     Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer()); | ||||
|                     // If the player is disguised, views self disguises and is hiding a item. | ||||
|                     if (disguise != null && disguise.viewSelfDisguise() | ||||
| @@ -786,36 +786,19 @@ public class PacketsManager { | ||||
|                 Packets.Client.BLOCK_ITEM_SWITCH, Packets.Client.SET_CREATIVE_SLOT, Packets.Client.WINDOW_CLICK) { | ||||
|             @Override | ||||
|             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() | ||||
|                         && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { | ||||
|                     switch (event.getPacketID()) { | ||||
|                     // If they are in creative and clicked on a slot | ||||
|                     case Packets.Client.SET_CREATIVE_SLOT: { | ||||
|                         int slot = event.getPacket().getIntegers().read(0); | ||||
|                         if (slot >= 5 && slot <= 8) { | ||||
|                             if (disguise.isHidingArmorFromSelf()) { | ||||
|                                 int armorSlot = Math.abs(slot - 9); | ||||
|                                 org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; | ||||
|                                 if (item != null && item.getType() != Material.AIR) { | ||||
|                                     PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); | ||||
|                                     StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                     mods.write(0, 0); | ||||
|                                     mods.write(1, slot); | ||||
|                                     mods.write(2, CraftItemStack.asNMSCopy(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 (event.getPlayer().getVehicle() == null) { | ||||
|                     Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer()); | ||||
|                     // If player is disguised, views self disguises and has a inventory modifier | ||||
|                     if (disguise != null && disguise.viewSelfDisguise() | ||||
|                             && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { | ||||
|                         switch (event.getPacketID()) { | ||||
|                         // If they are in creative and clicked on a slot | ||||
|                         case Packets.Client.SET_CREATIVE_SLOT: { | ||||
|                             int slot = event.getPacket().getIntegers().read(0); | ||||
|                             if (slot >= 5 && slot <= 8) { | ||||
|                                 if (disguise.isHidingArmorFromSelf()) { | ||||
|                                     int armorSlot = Math.abs(slot - 9); | ||||
|                                     org.bukkit.inventory.ItemStack item = event.getPlayer().getInventory().getArmorContents()[armorSlot]; | ||||
|                                     if (item != null && item.getType() != Material.AIR) { | ||||
|                                         PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); | ||||
|                                         StructureModifier<Object> mods = packet.getModifier(); | ||||
| @@ -830,82 +813,58 @@ public class PacketsManager { | ||||
|                                         } | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
|                     // If the player switched item, aka he moved from slot 1 to slot 2 | ||||
|                     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. | ||||
|                             // 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(Packets.Server.SET_SLOT); | ||||
|                                 StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                 mods.write(0, 0); | ||||
|                                 mods.write(1, event.getPlayer().getInventory().getHeldItemSlot() + 36); | ||||
|                                 mods.write(2, CraftItemStack.asNMSCopy(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(Packets.Server.SET_SLOT); | ||||
|                                 StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                 mods.write(0, 0); | ||||
|                                 mods.write(1, event.getPacket().getIntegers().read(0) + 36); | ||||
|                                 mods.write(2, CraftItemStack.asNMSCopy(new org.bukkit.inventory.ItemStack(0))); | ||||
|                                 try { | ||||
|                                     ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
|                                 } catch (InvocationTargetException e) { | ||||
|                                     e.printStackTrace(); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
|  | ||||
|                     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 | ||||
|                             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().scheduleSyncDelayedTask(libsDisguises, new Runnable() { | ||||
|                                     public void run() { | ||||
|                                         event.getPlayer().updateInventory(); | ||||
|                             } 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(Packets.Server.SET_SLOT); | ||||
|                                             StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                             mods.write(0, 0); | ||||
|                                             mods.write(1, slot); | ||||
|                                             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 { | ||||
|                             // 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(); | ||||
|                             break; | ||||
|                         } | ||||
|                         if (clickedItem != null && clickedItem.getType() != Material.AIR) { | ||||
|                             // If the slot is a armor slot | ||||
|                             if (slot >= 5 && slot <= 8) { | ||||
|                                 if (disguise.isHidingArmorFromSelf()) { | ||||
|                         // If the player switched item, aka he moved from slot 1 to slot 2 | ||||
|                         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. | ||||
|                                 // 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(Packets.Server.SET_SLOT); | ||||
|                                     StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                     mods.write(0, 0); | ||||
|                                     mods.write(1, slot); | ||||
|                                     mods.write(1, event.getPlayer().getInventory().getHeldItemSlot() + 36); | ||||
|                                     mods.write(2, CraftItemStack.asNMSCopy(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(Packets.Server.SET_SLOT); | ||||
|                                     StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                     mods.write(0, 0); | ||||
|                                     mods.write(1, event.getPacket().getIntegers().read(0) + 36); | ||||
|                                     mods.write(2, CraftItemStack.asNMSCopy(new org.bukkit.inventory.ItemStack(0))); | ||||
|                                     try { | ||||
|                                         ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, false); | ||||
| @@ -913,12 +872,38 @@ public class PacketsManager { | ||||
|                                         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) { | ||||
|                             } | ||||
|                             break; | ||||
|                         } | ||||
|  | ||||
|                         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 | ||||
|                                 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().scheduleSyncDelayedTask(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()) { | ||||
|                                         PacketContainer packet = new PacketContainer(Packets.Server.SET_SLOT); | ||||
|                                         StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                         mods.write(0, 0); | ||||
| @@ -931,14 +916,33 @@ public class PacketsManager { | ||||
|                                             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(Packets.Server.SET_SLOT); | ||||
|                                             StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                             mods.write(0, 0); | ||||
|                                             mods.write(1, slot); | ||||
|                                             mods.write(2, CraftItemStack.asNMSCopy(new org.bukkit.inventory.ItemStack(0))); | ||||
|                                             try { | ||||
|                                                 ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet, | ||||
|                                                         false); | ||||
|                                             } catch (InvocationTargetException e) { | ||||
|                                                 e.printStackTrace(); | ||||
|                                             } | ||||
|                                         } | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                             break; | ||||
|                         } | ||||
|                         break; | ||||
|                     } | ||||
|  | ||||
|                     default: | ||||
|                         break; | ||||
|                         default: | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user