Add a new method for converting the datawatchers to 1.8 new indexes
This commit is contained in:
		| @@ -17,12 +17,12 @@ public class VillagerWatcher extends AgeableWatcher { | |||||||
|         return Profession.values()[(Integer) getValue(16, 0)]; |         return Profession.values()[(Integer) getValue(16, 0)]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setProfession(Profession newProfession) { |  | ||||||
|         setProfession(newProfession.getId()); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     public void setProfession(int professionId){ |     public void setProfession(int professionId){ | ||||||
|         setValue(16, professionId % 6); |         setValue(16, professionId % 6); | ||||||
|         sendData(16); |         sendData(16); | ||||||
|     } |     } | ||||||
|  |      | ||||||
|  |     public void setProfession(Profession newProfession) { | ||||||
|  |         setProfession(newProfession.getId()); | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ import java.util.HashMap; | |||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.Iterator; | import java.util.Iterator; | ||||||
| import java.util.LinkedHashMap; | import java.util.LinkedHashMap; | ||||||
|  | import java.util.List; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
| import java.util.regex.Pattern; | import java.util.regex.Pattern; | ||||||
|  |  | ||||||
| @@ -16,9 +17,12 @@ import me.libraryaddict.disguise.DisguiseConfig; | |||||||
| import me.libraryaddict.disguise.LibsDisguises; | import me.libraryaddict.disguise.LibsDisguises; | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
| import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||||
| import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; | import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; | ||||||
| import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.watchers.EndermanWatcher; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.watchers.ItemFrameWatcher; | ||||||
| import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; | import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; | ||||||
| import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; | import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; | ||||||
| import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; | import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; | ||||||
| @@ -41,6 +45,7 @@ import com.comphenix.protocol.ProtocolManager; | |||||||
| import com.comphenix.protocol.events.PacketContainer; | import com.comphenix.protocol.events.PacketContainer; | ||||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher; | import com.comphenix.protocol.wrappers.WrappedDataWatcher; | ||||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||||
|  | import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||||
|  |  | ||||||
| public class DisguiseUtilities { | public class DisguiseUtilities { | ||||||
|     /** |     /** | ||||||
| @@ -460,6 +465,65 @@ public class DisguiseUtilities { | |||||||
|         return ReflectionManager.getSkullBlob(gameprofile); |         return ReflectionManager.getSkullBlob(gameprofile); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static List<WrappedWatchableObject> rebuildForVersion(Player player, FlagWatcher watcher, | ||||||
|  |             List<WrappedWatchableObject> list) { | ||||||
|  |         if (!ReflectionManager.is1_8(player)) | ||||||
|  |             return list; | ||||||
|  |         ArrayList<WrappedWatchableObject> rebuiltList = new ArrayList<WrappedWatchableObject>(); | ||||||
|  |         ArrayList<WrappedWatchableObject> backups = new ArrayList<WrappedWatchableObject>(); | ||||||
|  |         // TODO Player and Minecart | ||||||
|  |         for (WrappedWatchableObject obj : list) { | ||||||
|  |             if (obj.getValue().getClass().getName().startsWith("org.")) { | ||||||
|  |                 backups.add(obj); | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |             switch (obj.getIndex()) { | ||||||
|  |             case 2: | ||||||
|  |             case 3: | ||||||
|  |                 if (watcher instanceof ItemFrameWatcher) { | ||||||
|  |                     rebuiltList.add(new WrappedWatchableObject(obj.getIndex() + 6, obj.getValue())); | ||||||
|  |                 } else { | ||||||
|  |                     backups.add(obj); | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             case 10: | ||||||
|  |             case 11: | ||||||
|  |                 rebuiltList.add(new WrappedWatchableObject(obj.getIndex() - 8, obj.getValue())); | ||||||
|  |                 break; | ||||||
|  |             case 12: | ||||||
|  |                 if (watcher instanceof AgeableWatcher) { | ||||||
|  |                     int i = (Integer) obj.getValue(); | ||||||
|  |                     rebuiltList.add(new WrappedWatchableObject(obj.getIndex(), (byte) (i < 0 ? -1 : (i >= 6000 ? 1 : 0)))); | ||||||
|  |                 } else { | ||||||
|  |                     backups.add(obj); | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             case 16: | ||||||
|  |                 if (watcher instanceof EndermanWatcher) { | ||||||
|  |                     rebuiltList.add(new WrappedWatchableObject(obj.getIndex(), ((Short) obj.getValue()).byteValue())); | ||||||
|  |                 } else { | ||||||
|  |                     backups.add(obj); | ||||||
|  |                 } | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 backups.add(obj); | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         Iterator<WrappedWatchableObject> itel = backups.iterator(); | ||||||
|  |         while (itel.hasNext()) { | ||||||
|  |             int index = itel.next().getIndex(); | ||||||
|  |             for (WrappedWatchableObject obj2 : rebuiltList) { | ||||||
|  |                 if (index == obj2.getIndex()) { | ||||||
|  |                     itel.remove(); | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         rebuiltList.addAll(backups); | ||||||
|  |         return rebuiltList; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Resends the entity to this specific player |      * Resends the entity to this specific player | ||||||
|      */ |      */ | ||||||
| @@ -477,7 +541,7 @@ public class DisguiseUtilities { | |||||||
|                                 ex.printStackTrace(); |                                 ex.printStackTrace(); | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|                     }); |                     }, 2); | ||||||
|                     DisguiseUtilities.sendSelfDisguise((Player) disguise.getEntity(), disguise); |                     DisguiseUtilities.sendSelfDisguise((Player) disguise.getEntity(), disguise); | ||||||
|                 } else { |                 } else { | ||||||
|                     final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); |                     final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); | ||||||
| @@ -500,7 +564,7 @@ public class DisguiseUtilities { | |||||||
|                                             ex.printStackTrace(); |                                             ex.printStackTrace(); | ||||||
|                                         } |                                         } | ||||||
|                                     } |                                     } | ||||||
|                                 }); |                                 }, 2); | ||||||
|                                 break; |                                 break; | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
| @@ -539,7 +603,7 @@ public class DisguiseUtilities { | |||||||
|                                         ex.printStackTrace(); |                                         ex.printStackTrace(); | ||||||
|                                     } |                                     } | ||||||
|                                 } |                                 } | ||||||
|                             }); |                             }, 2); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
| @@ -565,7 +629,7 @@ public class DisguiseUtilities { | |||||||
|                                 ex.printStackTrace(); |                                 ex.printStackTrace(); | ||||||
|                             } |                             } | ||||||
|                         } |                         } | ||||||
|                     }); |                     }, 2); | ||||||
|                 } |                 } | ||||||
|                 final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); |                 final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); | ||||||
|                 if (entityTrackerEntry != null) { |                 if (entityTrackerEntry != null) { | ||||||
| @@ -588,7 +652,7 @@ public class DisguiseUtilities { | |||||||
|                                         ex.printStackTrace(); |                                         ex.printStackTrace(); | ||||||
|                                     } |                                     } | ||||||
|                                 } |                                 } | ||||||
|                             }); |                             }, 2); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|   | |||||||
| @@ -113,7 +113,7 @@ public class PacketsManager { | |||||||
|     /** |     /** | ||||||
|      * Construct the packets I need to spawn in the disguise |      * Construct the packets I need to spawn in the disguise | ||||||
|      */ |      */ | ||||||
|     public static PacketContainer[] constructSpawnPackets(Disguise disguise, Entity disguisedEntity) { |     public static PacketContainer[] constructSpawnPackets(Player player, Disguise disguise, Entity disguisedEntity) { | ||||||
|         if (disguise.getEntity() == null) |         if (disguise.getEntity() == null) | ||||||
|             disguise.setEntity(disguisedEntity); |             disguise.setEntity(disguisedEntity); | ||||||
|         Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity); |         Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity); | ||||||
| @@ -246,7 +246,7 @@ public class PacketsManager { | |||||||
|             byteMods.write(0, yaw); |             byteMods.write(0, yaw); | ||||||
|             byteMods.write(1, pitch); |             byteMods.write(1, pitch); | ||||||
|             spawnPackets[0].getDataWatcherModifier().write(0, |             spawnPackets[0].getDataWatcherModifier().write(0, | ||||||
|                     createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); |                     createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); | ||||||
|  |  | ||||||
|             if (((PlayerWatcher) disguise.getWatcher()).isSleeping() && DisguiseConfig.isBedPacketsEnabled()) { |             if (((PlayerWatcher) disguise.getWatcher()).isSleeping() && DisguiseConfig.isBedPacketsEnabled()) { | ||||||
|                 spawnPackets[1] = new PacketContainer(PacketType.Play.Server.BED); |                 spawnPackets[1] = new PacketContainer(PacketType.Play.Server.BED); | ||||||
| @@ -290,7 +290,7 @@ public class PacketsManager { | |||||||
|             mods.write(8, yaw); |             mods.write(8, yaw); | ||||||
|             mods.write(9, pitch); |             mods.write(9, pitch); | ||||||
|             spawnPackets[0].getDataWatcherModifier().write(0, |             spawnPackets[0].getDataWatcherModifier().write(0, | ||||||
|                     createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); |                     createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); | ||||||
|  |  | ||||||
|         } else if (disguise.getType().isMisc()) { |         } else if (disguise.getType().isMisc()) { | ||||||
|  |  | ||||||
| @@ -331,11 +331,12 @@ public class PacketsManager { | |||||||
|     /** |     /** | ||||||
|      * Create a new datawatcher but with the 'correct' values |      * Create a new datawatcher but with the 'correct' values | ||||||
|      */ |      */ | ||||||
|     private static WrappedDataWatcher createDataWatcher(WrappedDataWatcher watcher, FlagWatcher flagWatcher) { |     private static WrappedDataWatcher createDataWatcher(Player player, WrappedDataWatcher watcher, FlagWatcher flagWatcher) { | ||||||
|         WrappedDataWatcher newWatcher = new WrappedDataWatcher(); |         WrappedDataWatcher newWatcher = new WrappedDataWatcher(); | ||||||
|         try { |         try { | ||||||
|             List<WrappedWatchableObject> list = DisguiseConfig.isMetadataPacketsEnabled() ? flagWatcher.convert(watcher |             List<WrappedWatchableObject> list = DisguiseConfig.isMetadataPacketsEnabled() ? flagWatcher.convert(watcher | ||||||
|                     .getWatchableObjects()) : flagWatcher.getWatchableObjects(); |                     .getWatchableObjects()) : flagWatcher.getWatchableObjects(); | ||||||
|  |             list = DisguiseUtilities.rebuildForVersion(player, flagWatcher, list); | ||||||
|             for (WrappedWatchableObject watchableObject : list) { |             for (WrappedWatchableObject watchableObject : list) { | ||||||
|                 newWatcher.setObject(watchableObject.getIndex(), watchableObject.getValue()); |                 newWatcher.setObject(watchableObject.getIndex(), watchableObject.getValue()); | ||||||
|             } |             } | ||||||
| @@ -1247,6 +1248,7 @@ public class PacketsManager { | |||||||
|                     if (DisguiseConfig.isMetadataPacketsEnabled()) { |                     if (DisguiseConfig.isMetadataPacketsEnabled()) { | ||||||
|                         List<WrappedWatchableObject> watchableObjects = disguise.getWatcher().convert( |                         List<WrappedWatchableObject> watchableObjects = disguise.getWatcher().convert( | ||||||
|                                 packets[0].getWatchableCollectionModifier().read(0)); |                                 packets[0].getWatchableCollectionModifier().read(0)); | ||||||
|  |                         watchableObjects = DisguiseUtilities.rebuildForVersion(observer, disguise.getWatcher(), watchableObjects); | ||||||
|                         packets[0] = new PacketContainer(sentPacket.getType()); |                         packets[0] = new PacketContainer(sentPacket.getType()); | ||||||
|                         StructureModifier<Object> newMods = packets[0].getModifier(); |                         StructureModifier<Object> newMods = packets[0].getModifier(); | ||||||
|                         newMods.write(0, entity.getEntityId()); |                         newMods.write(0, entity.getEntityId()); | ||||||
| @@ -1262,7 +1264,7 @@ public class PacketsManager { | |||||||
|                         || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB |                         || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB | ||||||
|                         || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY |                         || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY | ||||||
|                         || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_PAINTING) { |                         || sentPacket.getType() == PacketType.Play.Server.SPAWN_ENTITY_PAINTING) { | ||||||
|                     packets = constructSpawnPackets(disguise, entity); |                     packets = constructSpawnPackets(observer, disguise, entity); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 // Else if the disguise is attempting to send players a forbidden packet |                 // Else if the disguise is attempting to send players a forbidden packet | ||||||
| @@ -1349,6 +1351,7 @@ public class PacketsManager { | |||||||
|                                     } |                                     } | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
|  |                             list = DisguiseUtilities.rebuildForVersion(observer, disguise.getWatcher(), list); | ||||||
|                             // Construct the packets to return |                             // Construct the packets to return | ||||||
|                             PacketContainer packetBlock = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); |                             PacketContainer packetBlock = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); | ||||||
|                             packetBlock.getModifier().write(0, entity.getEntityId()); |                             packetBlock.getModifier().write(0, entity.getEntityId()); | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ import com.comphenix.protocol.wrappers.WrappedGameProfile; | |||||||
| public class ReflectionManager { | public class ReflectionManager { | ||||||
|  |  | ||||||
|     public enum LibVersion { |     public enum LibVersion { | ||||||
|         V1_6, V1_7, V1_7_6; |         V1_6, V1_7, V1_7_6, V1_8; | ||||||
|         private static LibVersion currentVersion = LibVersion.V1_7; |         private static LibVersion currentVersion = LibVersion.V1_7; | ||||||
|         static { |         static { | ||||||
|             String mcVersion = Bukkit.getVersion().split("MC: ")[1].replace(")", ""); |             String mcVersion = Bukkit.getVersion().split("MC: ")[1].replace(")", ""); | ||||||
| @@ -37,7 +37,8 @@ public class ReflectionManager { | |||||||
|                 if (mcVersion.compareTo("1.7") < 0) { |                 if (mcVersion.compareTo("1.7") < 0) { | ||||||
|                     currentVersion = LibVersion.V1_6; |                     currentVersion = LibVersion.V1_6; | ||||||
|                 } else { |                 } else { | ||||||
|                     currentVersion = mcVersion.compareTo("1.7.6") < 0 && !mcVersion.equals("1.7.10") ? LibVersion.V1_7 : LibVersion.V1_7_6; |                     currentVersion = mcVersion.compareTo("1.7.6") < 0 && !mcVersion.equals("1.7.10") ? LibVersion.V1_7 | ||||||
|  |                             : LibVersion.V1_7_6; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -541,6 +542,19 @@ public class ReflectionManager { | |||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static boolean is1_8(Player player) { | ||||||
|  |         try { | ||||||
|  |             Object cPlayer = getNmsEntity(player); | ||||||
|  |             Field playerConnection = cPlayer.getClass().getField("playerConnection"); | ||||||
|  |             Field networkManager = getNmsClass("PlayerConnection").getField("networkManager"); | ||||||
|  |             Method getVersion = getNmsClass("NetworkManager").getMethod("getVersion"); | ||||||
|  |             return (Integer) getVersion.invoke(networkManager.get(playerConnection.get(cPlayer))) >= 28; | ||||||
|  |         } catch (Exception ex) { | ||||||
|  |             ex.printStackTrace(); | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public static boolean isForge() { |     public static boolean isForge() { | ||||||
|         return isForge; |         return isForge; | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user