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)]; | ||||
|     } | ||||
|  | ||||
|     public void setProfession(Profession newProfession) { | ||||
|         setProfession(newProfession.getId()); | ||||
|     } | ||||
|      | ||||
|     public void setProfession(int professionId){ | ||||
|         setValue(16, professionId % 6); | ||||
|         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.Iterator; | ||||
| import java.util.LinkedHashMap; | ||||
| import java.util.List; | ||||
| import java.util.UUID; | ||||
| import java.util.regex.Pattern; | ||||
|  | ||||
| @@ -16,9 +17,12 @@ import me.libraryaddict.disguise.DisguiseConfig; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; | ||||
| 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.TargetedDisguise.TargetType; | ||||
| 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.wrappers.WrappedDataWatcher; | ||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
| import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||
|  | ||||
| public class DisguiseUtilities { | ||||
|     /** | ||||
| @@ -460,6 +465,65 @@ public class DisguiseUtilities { | ||||
|         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 | ||||
|      */ | ||||
| @@ -477,7 +541,7 @@ public class DisguiseUtilities { | ||||
|                                 ex.printStackTrace(); | ||||
|                             } | ||||
|                         } | ||||
|                     }); | ||||
|                     }, 2); | ||||
|                     DisguiseUtilities.sendSelfDisguise((Player) disguise.getEntity(), disguise); | ||||
|                 } else { | ||||
|                     final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); | ||||
| @@ -500,7 +564,7 @@ public class DisguiseUtilities { | ||||
|                                             ex.printStackTrace(); | ||||
|                                         } | ||||
|                                     } | ||||
|                                 }); | ||||
|                                 }, 2); | ||||
|                                 break; | ||||
|                             } | ||||
|                         } | ||||
| @@ -539,7 +603,7 @@ public class DisguiseUtilities { | ||||
|                                         ex.printStackTrace(); | ||||
|                                     } | ||||
|                                 } | ||||
|                             }); | ||||
|                             }, 2); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| @@ -565,7 +629,7 @@ public class DisguiseUtilities { | ||||
|                                 ex.printStackTrace(); | ||||
|                             } | ||||
|                         } | ||||
|                     }); | ||||
|                     }, 2); | ||||
|                 } | ||||
|                 final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); | ||||
|                 if (entityTrackerEntry != null) { | ||||
| @@ -588,7 +652,7 @@ public class DisguiseUtilities { | ||||
|                                         ex.printStackTrace(); | ||||
|                                     } | ||||
|                                 } | ||||
|                             }); | ||||
|                             }, 2); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|   | ||||
| @@ -113,7 +113,7 @@ public class PacketsManager { | ||||
|     /** | ||||
|      * 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) | ||||
|             disguise.setEntity(disguisedEntity); | ||||
|         Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity); | ||||
| @@ -246,7 +246,7 @@ public class PacketsManager { | ||||
|             byteMods.write(0, yaw); | ||||
|             byteMods.write(1, pitch); | ||||
|             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()) { | ||||
|                 spawnPackets[1] = new PacketContainer(PacketType.Play.Server.BED); | ||||
| @@ -290,7 +290,7 @@ public class PacketsManager { | ||||
|             mods.write(8, yaw); | ||||
|             mods.write(9, pitch); | ||||
|             spawnPackets[0].getDataWatcherModifier().write(0, | ||||
|                     createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); | ||||
|                     createDataWatcher(player, WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); | ||||
|  | ||||
|         } else if (disguise.getType().isMisc()) { | ||||
|  | ||||
| @@ -331,11 +331,12 @@ public class PacketsManager { | ||||
|     /** | ||||
|      * 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(); | ||||
|         try { | ||||
|             List<WrappedWatchableObject> list = DisguiseConfig.isMetadataPacketsEnabled() ? flagWatcher.convert(watcher | ||||
|                     .getWatchableObjects()) : flagWatcher.getWatchableObjects(); | ||||
|             list = DisguiseUtilities.rebuildForVersion(player, flagWatcher, list); | ||||
|             for (WrappedWatchableObject watchableObject : list) { | ||||
|                 newWatcher.setObject(watchableObject.getIndex(), watchableObject.getValue()); | ||||
|             } | ||||
| @@ -1247,6 +1248,7 @@ public class PacketsManager { | ||||
|                     if (DisguiseConfig.isMetadataPacketsEnabled()) { | ||||
|                         List<WrappedWatchableObject> watchableObjects = disguise.getWatcher().convert( | ||||
|                                 packets[0].getWatchableCollectionModifier().read(0)); | ||||
|                         watchableObjects = DisguiseUtilities.rebuildForVersion(observer, disguise.getWatcher(), watchableObjects); | ||||
|                         packets[0] = new PacketContainer(sentPacket.getType()); | ||||
|                         StructureModifier<Object> newMods = packets[0].getModifier(); | ||||
|                         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 | ||||
|                         || 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 | ||||
| @@ -1349,6 +1351,7 @@ public class PacketsManager { | ||||
|                                     } | ||||
|                                 } | ||||
|                             } | ||||
|                             list = DisguiseUtilities.rebuildForVersion(observer, disguise.getWatcher(), list); | ||||
|                             // Construct the packets to return | ||||
|                             PacketContainer packetBlock = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); | ||||
|                             packetBlock.getModifier().write(0, entity.getEntityId()); | ||||
|   | ||||
| @@ -29,7 +29,7 @@ import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
| public class ReflectionManager { | ||||
|  | ||||
|     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; | ||||
|         static { | ||||
|             String mcVersion = Bukkit.getVersion().split("MC: ")[1].replace(")", ""); | ||||
| @@ -37,7 +37,8 @@ public class ReflectionManager { | ||||
|                 if (mcVersion.compareTo("1.7") < 0) { | ||||
|                     currentVersion = LibVersion.V1_6; | ||||
|                 } 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; | ||||
|     } | ||||
|  | ||||
|     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() { | ||||
|         return isForge; | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user