Finish converting it all to reflection. Removed cb dependency ;D
This commit is contained in:
		
							
								
								
									
										5
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -58,11 +58,6 @@ | ||||
| 			<artifactId>ProtocolLib</artifactId> | ||||
| 			<version>2.7.0</version> | ||||
| 		</dependency> | ||||
| 		<dependency> | ||||
| 			<groupId>org.bukkit</groupId> | ||||
| 			<artifactId>craftbukkit</artifactId> | ||||
| 			<version>1.6.4-R2.1-SNAPSHOT</version> | ||||
| 		</dependency> | ||||
| 	</dependencies> | ||||
| 	<version>7.7.0-SNAPSHOT</version> | ||||
|  | ||||
|   | ||||
| @@ -1,17 +1,15 @@ | ||||
| package me.libraryaddict.disguise; | ||||
|  | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.HashMap; | ||||
| import java.util.HashSet; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.events.DisguiseEvent; | ||||
| import me.libraryaddict.disguise.events.UndisguiseEvent; | ||||
| import net.minecraft.server.v1_6_R3.EntityPlayer; | ||||
| import net.minecraft.server.v1_6_R3.EntityTrackerEntry; | ||||
| import net.minecraft.server.v1_6_R3.WorldServer; | ||||
|  | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.craftbukkit.v1_6_R3.entity.CraftEntity; | ||||
| import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| @@ -19,6 +17,7 @@ import com.comphenix.protocol.Packets; | ||||
| import com.comphenix.protocol.ProtocolLibrary; | ||||
| import com.comphenix.protocol.events.PacketContainer; | ||||
| import com.comphenix.protocol.reflect.StructureModifier; | ||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher; | ||||
|  | ||||
| public class DisguiseAPI { | ||||
|  | ||||
| @@ -166,16 +165,28 @@ public class DisguiseAPI { | ||||
|      *            the entity to all the watching players, which is where the magic begins | ||||
|      */ | ||||
|     private static void refreshTrackers(Entity entity) { | ||||
|         EntityTrackerEntry entry = (EntityTrackerEntry) ((WorldServer) ((CraftEntity) entity).getHandle().world).tracker.trackedEntities | ||||
|                 .get(entity.getEntityId()); | ||||
|         if (entry != null) { | ||||
|             EntityPlayer[] players = (EntityPlayer[]) entry.trackedPlayers.toArray(new EntityPlayer[entry.trackedPlayers.size()]); | ||||
|             for (EntityPlayer player : players) { | ||||
|                 if (entity instanceof Player && !player.getBukkitEntity().canSee((Player) entity)) | ||||
|                     continue; | ||||
|                 entry.clear(player); | ||||
|                 entry.updatePlayer(player); | ||||
|         try { | ||||
|             Object world = ReflectionManager.getWorld(entity.getWorld()); | ||||
|             Object tracker = world.getClass().getField("tracker").get(world); | ||||
|             Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); | ||||
|             Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) | ||||
|                     .invoke(trackedEntities, entity.getEntityId()); | ||||
|             if (entityTrackerEntry != null) { | ||||
|                 HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") | ||||
|                         .get(entityTrackerEntry); | ||||
|                 Method getBukkitEntity = ReflectionManager.getNmsClass("Entity").getMethod("getBukkitEntity"); | ||||
|                 Method clear = entityTrackerEntry.getClass().getMethod("clear", ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                 Method updatePlayer = entityTrackerEntry.getClass().getMethod("updatePlayer", | ||||
|                         ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                 for (Object player : trackedPlayers) { | ||||
|                     if (entity instanceof Player && !((Player) getBukkitEntity.invoke(player)).canSee((Player) entity)) | ||||
|                         continue; | ||||
|                     clear.invoke(entityTrackerEntry, player); | ||||
|                     updatePlayer.invoke(entityTrackerEntry, player); | ||||
|                 } | ||||
|             } | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -192,18 +203,26 @@ public class DisguiseAPI { | ||||
|             // Remove the fake entity ID from the disguise bin | ||||
|             selfDisguisesIds.remove(player.getEntityId()); | ||||
|             // Get the entity tracker | ||||
|             EntityPlayer entityplayer = ((CraftPlayer) player).getHandle(); | ||||
|             EntityTrackerEntry tracker = (EntityTrackerEntry) ((WorldServer) entityplayer.world).tracker.trackedEntities | ||||
|                     .get(player.getEntityId()); | ||||
|             // If the tracker exists. Remove himself from his tracker | ||||
|             if (tracker != null) { | ||||
|                 tracker.trackedPlayers.remove(entityplayer); | ||||
|             } | ||||
|             // Resend entity metadata else he will be invisible to himself until its resent | ||||
|             try { | ||||
|                 Object world = ReflectionManager.getWorld(player.getWorld()); | ||||
|                 Object tracker = world.getClass().getField("tracker").get(world); | ||||
|                 Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); | ||||
|                 Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) | ||||
|                         .invoke(trackedEntities, player.getEntityId()); | ||||
|                 if (entityTrackerEntry != null) { | ||||
|                     HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") | ||||
|                             .get(entityTrackerEntry); | ||||
|                     // If the tracker exists. Remove himself from his tracker | ||||
|                     trackedPlayers.remove(ReflectionManager.getNmsEntity(player)); | ||||
|                 } | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); | ||||
|             }// Resend entity metadata else he will be invisible to himself until its resent | ||||
|             PacketContainer packetMetadata = new PacketContainer(Packets.Server.ENTITY_METADATA); | ||||
|             StructureModifier<Object> mods = packetMetadata.getModifier(); | ||||
|             mods.write(0, player.getEntityId()); | ||||
|             mods.write(1, entityplayer.getDataWatcher().c()); | ||||
|             packetMetadata.getWatchableCollectionModifier().write(0, | ||||
|                     WrappedDataWatcher.getEntityWatcher(player).getWatchableObjects()); | ||||
|             try { | ||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packetMetadata); | ||||
|             } catch (Exception ex) { | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package me.libraryaddict.disguise; | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.HashSet; | ||||
| import java.util.Iterator; | ||||
| import java.util.List; | ||||
| import java.util.Random; | ||||
| @@ -17,41 +17,22 @@ import me.libraryaddict.disguise.disguisetypes.MobDisguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.Values; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseSound.SoundType; | ||||
| import net.minecraft.server.v1_6_R3.AttributeMapServer; | ||||
| import net.minecraft.server.v1_6_R3.Block; | ||||
| import net.minecraft.server.v1_6_R3.EntityHuman; | ||||
| import net.minecraft.server.v1_6_R3.EntityInsentient; | ||||
| import net.minecraft.server.v1_6_R3.EntityLiving; | ||||
| import net.minecraft.server.v1_6_R3.EntityPlayer; | ||||
| import net.minecraft.server.v1_6_R3.EntityTrackerEntry; | ||||
| import net.minecraft.server.v1_6_R3.MobEffect; | ||||
| import net.minecraft.server.v1_6_R3.Packet17EntityLocationAction; | ||||
| import net.minecraft.server.v1_6_R3.Packet20NamedEntitySpawn; | ||||
| import net.minecraft.server.v1_6_R3.Packet28EntityVelocity; | ||||
| import net.minecraft.server.v1_6_R3.Packet35EntityHeadRotation; | ||||
| import net.minecraft.server.v1_6_R3.Packet39AttachEntity; | ||||
| import net.minecraft.server.v1_6_R3.Packet40EntityMetadata; | ||||
| import net.minecraft.server.v1_6_R3.Packet41MobEffect; | ||||
| import net.minecraft.server.v1_6_R3.Packet44UpdateAttributes; | ||||
| import net.minecraft.server.v1_6_R3.Packet5EntityEquipment; | ||||
| import net.minecraft.server.v1_6_R3.World; | ||||
| import net.minecraft.server.v1_6_R3.WorldServer; | ||||
|  | ||||
| import org.bukkit.Art; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.Material; | ||||
| import org.bukkit.craftbukkit.v1_6_R3.entity.CraftEntity; | ||||
| import org.bukkit.craftbukkit.v1_6_R3.entity.CraftLivingEntity; | ||||
| import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; | ||||
| import org.bukkit.entity.Ageable; | ||||
| import org.bukkit.entity.Arrow; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.ExperienceOrb; | ||||
| import org.bukkit.entity.Item; | ||||
| import org.bukkit.entity.LivingEntity; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.entity.Zombie; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| import org.bukkit.plugin.java.JavaPlugin; | ||||
| import org.bukkit.potion.PotionEffect; | ||||
| import org.bukkit.util.Vector; | ||||
|  | ||||
| import com.comphenix.protocol.Packets; | ||||
| @@ -146,7 +127,7 @@ public class PacketsManager { | ||||
|     public static PacketContainer[] constructSpawnPackets(Disguise disguise, Entity disguisedEntity) { | ||||
|         if (disguise.getEntity() == null) | ||||
|             disguise.setEntity(disguisedEntity); | ||||
|         net.minecraft.server.v1_6_R3.Entity nmsEntity = ((CraftEntity) disguisedEntity).getHandle(); | ||||
|         // net.minecraft.server.v1_6_R3.Entity nmsEntity = ((CraftEntity) disguisedEntity).getHandle(); | ||||
|         ArrayList<PacketContainer> packets = new ArrayList<PacketContainer>(); | ||||
|         for (int i = 0; i < 5; i++) { | ||||
|             int slot = i - 1; | ||||
| @@ -265,8 +246,8 @@ public class PacketsManager { | ||||
|             mods.write(7, (int) (d4 * 8000.0D)); | ||||
|             mods.write(8, yaw); | ||||
|             mods.write(9, (byte) (int) (loc.getPitch() * 256.0F / 360.0F)); | ||||
|             if (nmsEntity instanceof EntityLiving) | ||||
|                 mods.write(10, (byte) (int) (((EntityLiving) nmsEntity).aA * 256.0F / 360.0F)); | ||||
|             // if (nmsEntity instanceof EntityLiving) | ||||
|             // mods.write(10, (byte) (int) (((EntityLiving) nmsEntity).aA * 256.0F / 360.0F)); | ||||
|             spawnPackets[0].getDataWatcherModifier().write(0, | ||||
|                     createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); | ||||
|             // Theres a list sometimes written with this. But no problems have appeared! | ||||
| @@ -461,13 +442,18 @@ public class PacketsManager { | ||||
|                                         soundType = SoundType.DEATH; | ||||
|                                     } else { | ||||
|                                         boolean hasInvun = false; | ||||
|                                         if (entity instanceof LivingEntity) { | ||||
|                                             net.minecraft.server.v1_6_R3.EntityLiving e = ((CraftLivingEntity) entity) | ||||
|                                                     .getHandle(); | ||||
|                                             hasInvun = (e.noDamageTicks == e.maxNoDamageTicks); | ||||
|                                         } else { | ||||
|                                             net.minecraft.server.v1_6_R3.Entity e = ((CraftEntity) entity).getHandle(); | ||||
|                                             hasInvun = e.isInvulnerable(); | ||||
|                                         Object nmsEntity = ReflectionManager.getNmsEntity(entity); | ||||
|                                         try { | ||||
|                                             if (entity instanceof LivingEntity) { | ||||
|                                                 Class entityClass = ReflectionManager.getNmsClass("Entity"); | ||||
|                                                 hasInvun = entityClass.getField("noDamageTicks").getInt(nmsEntity) == entityClass | ||||
|                                                         .getField("maxNoDamageTicks").getInt(nmsEntity); | ||||
|                                             } else { | ||||
|                                                 hasInvun = (Boolean) ReflectionManager.getNmsClass("Entity") | ||||
|                                                         .getMethod("isInvulnerable").invoke(nmsEntity); | ||||
|                                             } | ||||
|                                         } catch (Exception ex) { | ||||
|                                             ex.printStackTrace(); | ||||
|                                         } | ||||
|                                         soundType = entitySound.getType(soundName, !hasInvun); | ||||
|                                     } | ||||
| @@ -491,11 +477,18 @@ public class PacketsManager { | ||||
|                                     event.setCancelled(true); | ||||
|                                 } else { | ||||
|                                     if (sound.equals("step.grass")) { | ||||
|                                         World world = ((CraftEntity) disguisedEntity).getHandle().world; | ||||
|                                         Block b = Block.byId[world.getTypeId(soundLoc.getBlockX(), soundLoc.getBlockY() - 1, | ||||
|                                                 soundLoc.getBlockZ())]; | ||||
|                                         if (b != null) | ||||
|                                             mods.write(0, b.stepSound.getStepSound()); | ||||
|                                         try { | ||||
|                                             int typeId = soundLoc.getWorld().getBlockTypeIdAt(soundLoc.getBlockX(), | ||||
|                                                     soundLoc.getBlockY() - 1, soundLoc.getBlockZ()); | ||||
|                                             Class blockClass = ReflectionManager.getNmsClass("Block"); | ||||
|                                             Object block = ((Object[]) blockClass.getField("byId").get(null))[typeId]; | ||||
|                                             if (block != null) { | ||||
|                                                 Object step = blockClass.getField("stepSound").get(block); | ||||
|                                                 mods.write(0, step.getClass().getMethod("getStepSound").invoke(step)); | ||||
|                                             } | ||||
|                                         } catch (Exception ex) { | ||||
|                                             ex.printStackTrace(); | ||||
|                                         } | ||||
|                                         // There is no else statement. Because seriously. This should never be null. Unless | ||||
|                                         // someone is | ||||
|                                         // sending fake sounds. In which case. Why cancel it. | ||||
| @@ -512,7 +505,12 @@ public class PacketsManager { | ||||
|                                             // Here I assume its the default pitch as I can't calculate if its real. | ||||
|                                             if (disguise instanceof MobDisguise && disguisedEntity instanceof LivingEntity | ||||
|                                                     && ((MobDisguise) disguise).doesDisguiseAge()) { | ||||
|                                                 boolean baby = ((CraftLivingEntity) disguisedEntity).getHandle().isBaby(); | ||||
|                                                 boolean baby = false; | ||||
|                                                 if (disguisedEntity instanceof Zombie) { | ||||
|                                                     baby = ((Zombie) disguisedEntity).isBaby(); | ||||
|                                                 } else if (disguisedEntity instanceof Ageable) { | ||||
|                                                     baby = !((Ageable) disguisedEntity).isAdult(); | ||||
|                                                 } | ||||
|                                                 if (((MobDisguise) disguise).isAdult() == baby) { | ||||
|  | ||||
|                                                     float pitch = (Integer) mods.read(5); | ||||
| @@ -969,97 +967,107 @@ public class PacketsManager { | ||||
|      * Sends the self disguise to the player | ||||
|      */ | ||||
|     public static void sendSelfDisguise(final Player player) { | ||||
|         EntityPlayer entityplayer = ((CraftPlayer) player).getHandle(); | ||||
|         EntityTrackerEntry tracker = (EntityTrackerEntry) ((WorldServer) entityplayer.world).tracker.trackedEntities.get(player | ||||
|                 .getEntityId()); | ||||
|         if (tracker == null) { | ||||
|             // A check incase the tracker is null. | ||||
|             // If it is, then this method will be run again in one tick. Which is when it should be constructed. | ||||
|             // Else its going to run in a infinite loop hue hue hue.. | ||||
|             Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { | ||||
|                 public void run() { | ||||
|                     sendSelfDisguise(player); | ||||
|                 } | ||||
|             }); | ||||
|             return; | ||||
|         } | ||||
|         // Add himself to his own entity tracker | ||||
|         tracker.trackedPlayers.add(entityplayer); | ||||
|         // Send the player a packet with himself being spawned | ||||
|         Packet20NamedEntitySpawn packet = new Packet20NamedEntitySpawn((EntityHuman) entityplayer); | ||||
|         entityplayer.playerConnection.sendPacket(packet); | ||||
|         if (!tracker.tracker.getDataWatcher().d()) { | ||||
|             entityplayer.playerConnection.sendPacket(new Packet40EntityMetadata(player.getEntityId(), tracker.tracker | ||||
|                     .getDataWatcher(), true)); | ||||
|         } | ||||
|         // Send himself some entity attributes | ||||
|         if (tracker.tracker instanceof EntityLiving) { | ||||
|             AttributeMapServer attributemapserver = (AttributeMapServer) ((EntityLiving) tracker.tracker).aX(); | ||||
|             Collection collection = attributemapserver.c(); | ||||
|  | ||||
|             if (!collection.isEmpty()) { | ||||
|                 entityplayer.playerConnection.sendPacket(new Packet44UpdateAttributes(player.getEntityId(), collection)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // Why do we even have this? | ||||
|         tracker.j = tracker.tracker.motX; | ||||
|         tracker.k = tracker.tracker.motY; | ||||
|         tracker.l = tracker.tracker.motZ; | ||||
|         boolean isMoving = false; | ||||
|         try { | ||||
|             Field field = EntityTrackerEntry.class.getDeclaredField("isMoving"); | ||||
|             field.setAccessible(true); | ||||
|             isMoving = field.getBoolean(tracker); | ||||
|             Object world = ReflectionManager.getWorld(player.getWorld()); | ||||
|             Object tracker = world.getClass().getField("tracker").get(world); | ||||
|             Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); | ||||
|             Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) | ||||
|                     .invoke(trackedEntities, player.getEntityId()); | ||||
|             if (entityTrackerEntry == null) { | ||||
|                 // A check incase the tracker is null. | ||||
|                 // If it is, then this method will be run again in one tick. Which is when it should be constructed. | ||||
|                 // Else its going to run in a infinite loop hue hue hue.. | ||||
|                 Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { | ||||
|                     public void run() { | ||||
|                         sendSelfDisguise(player); | ||||
|                     } | ||||
|                 }); | ||||
|                 return; | ||||
|             } | ||||
|             // Add himself to his own entity tracker | ||||
|             ((HashSet) entityTrackerEntry.getClass().getField("trackedPlayers").get(entityTrackerEntry)).add(ReflectionManager | ||||
|                     .getNmsEntity(player)); | ||||
|             ProtocolManager manager = ProtocolLibrary.getProtocolManager(); | ||||
|             // Send the player a packet with himself being spawned | ||||
|             manager.sendServerPacket(player, manager.createPacketConstructor(Packets.Server.NAMED_ENTITY_SPAWN, player) | ||||
|                     .createPacket(player)); | ||||
|             manager.sendServerPacket( | ||||
|                     player, | ||||
|                     manager.createPacketConstructor(Packets.Server.ENTITY_METADATA, player.getEntityId(), | ||||
|                             WrappedDataWatcher.getEntityWatcher(player), true).createPacket(player.getEntityId(), | ||||
|                             WrappedDataWatcher.getEntityWatcher(player), true)); | ||||
|  | ||||
|             boolean isMoving = false; | ||||
|             try { | ||||
|                 Field field = ReflectionManager.getNmsClass("EntityTrackerEntry").getDeclaredField("isMoving"); | ||||
|                 field.setAccessible(true); | ||||
|                 isMoving = field.getBoolean(entityTrackerEntry); | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|             // Send the velocity packets | ||||
|             if (isMoving) { | ||||
|                 Vector velocity = player.getVelocity(); | ||||
|                 manager.sendServerPacket( | ||||
|                         player, | ||||
|                         manager.createPacketConstructor(Packets.Server.ENTITY_VELOCITY, player.getEntityId(), velocity.getX(), | ||||
|                                 velocity.getY(), velocity.getZ()).createPacket(player.getEntityId(), velocity.getX(), | ||||
|                                 velocity.getY(), velocity.getZ())); | ||||
|             } | ||||
|  | ||||
|             // Why the hell would he even need this. Meh. | ||||
|             if (player.getVehicle() != null && player.getEntityId() > player.getVehicle().getEntityId()) { | ||||
|                 manager.sendServerPacket(player, | ||||
|                         manager.createPacketConstructor(Packets.Server.ATTACH_ENTITY, 0, player, player.getVehicle()) | ||||
|                                 .createPacket(0, player, player.getVehicle())); | ||||
|             } else if (player.getPassenger() != null && player.getEntityId() > player.getPassenger().getEntityId()) { | ||||
|                 manager.sendServerPacket(player, | ||||
|                         manager.createPacketConstructor(Packets.Server.ATTACH_ENTITY, 0, player.getPassenger(), player) | ||||
|                                 .createPacket(0, player.getPassenger(), player)); | ||||
|             } | ||||
|  | ||||
|             // Resend the armor | ||||
|             for (int i = 0; i < 5; i++) { | ||||
|                 ItemStack item; | ||||
|                 if (i == 0) { | ||||
|                     item = player.getItemInHand(); | ||||
|                 } else { | ||||
|                     item = player.getInventory().getArmorContents()[i - 1]; | ||||
|                 } | ||||
|  | ||||
|                 if (item != null && item.getType() != Material.AIR) { | ||||
|                     manager.sendServerPacket(player, | ||||
|                             manager.createPacketConstructor(Packets.Server.ENTITY_EQUIPMENT, player.getEntityId(), i, item) | ||||
|                                     .createPacket(player.getEntityId(), i, item)); | ||||
|                 } | ||||
|             } | ||||
|             Location loc = player.getLocation(); | ||||
|             // If the disguised is sleeping for w/e reason | ||||
|             if (player.isSleeping()) { | ||||
|                 manager.sendServerPacket( | ||||
|                         player, | ||||
|                         manager.createPacketConstructor(Packets.Server.ENTITY_LOCATION_ACTION, player, 0, loc.getBlockX(), | ||||
|                                 loc.getBlockY(), loc.getBlockZ()).createPacket(player, 0, loc.getBlockX(), loc.getBlockY(), | ||||
|                                 loc.getBlockZ())); | ||||
|             } | ||||
|  | ||||
|             manager.sendServerPacket( | ||||
|                     player, | ||||
|                     manager.createPacketConstructor(Packets.Server.ENTITY_HEAD_ROTATION, player.getEntityId(), | ||||
|                             (byte) Math.floor(loc.getYaw() * 256.0F / 360.0F)).createPacket(player.getEntityId(), | ||||
|                             (byte) Math.floor(loc.getYaw() * 256.0F / 360.0F))); | ||||
|  | ||||
|             // Resend any active potion effects | ||||
|             Iterator iterator = player.getActivePotionEffects().iterator(); | ||||
|             while (iterator.hasNext()) { | ||||
|                 PotionEffect potionEffect = (PotionEffect) iterator.next(); | ||||
|                 manager.sendServerPacket(player, | ||||
|                         manager.createPacketConstructor(Packets.Server.MOB_EFFECT, player.getEntityId(), potionEffect) | ||||
|                                 .createPacket(player.getEntityId(), potionEffect)); | ||||
|             } | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         // Send the velocity packets | ||||
|         if (isMoving) { | ||||
|             entityplayer.playerConnection.sendPacket(new Packet28EntityVelocity(player.getEntityId(), tracker.tracker.motX, | ||||
|                     tracker.tracker.motY, tracker.tracker.motZ)); | ||||
|         } | ||||
|  | ||||
|         // Why the hell would he even need this. Meh. | ||||
|         if (tracker.tracker.vehicle != null && player.getEntityId() > tracker.tracker.vehicle.id) { | ||||
|             entityplayer.playerConnection.sendPacket(new Packet39AttachEntity(0, tracker.tracker, tracker.tracker.vehicle)); | ||||
|         } else if (tracker.tracker.passenger != null && player.getEntityId() > tracker.tracker.passenger.id) { | ||||
|             entityplayer.playerConnection.sendPacket(new Packet39AttachEntity(0, tracker.tracker.passenger, tracker.tracker)); | ||||
|         } | ||||
|  | ||||
|         if (tracker.tracker instanceof EntityInsentient && ((EntityInsentient) tracker.tracker).getLeashHolder() != null) { | ||||
|             entityplayer.playerConnection.sendPacket(new Packet39AttachEntity(1, tracker.tracker, | ||||
|                     ((EntityInsentient) tracker.tracker).getLeashHolder())); | ||||
|         } | ||||
|  | ||||
|         // Resend the armor | ||||
|         for (int i = 0; i < 5; ++i) { | ||||
|             net.minecraft.server.v1_6_R3.ItemStack itemstack = ((EntityLiving) tracker.tracker).getEquipment(i); | ||||
|  | ||||
|             if (itemstack != null) { | ||||
|                 entityplayer.playerConnection.sendPacket(new Packet5EntityEquipment(player.getEntityId(), i, itemstack)); | ||||
|             } | ||||
|         } | ||||
|         // If the disguised is sleeping for w/e reason | ||||
|         if (entityplayer.isSleeping()) { | ||||
|             entityplayer.playerConnection | ||||
|                     .sendPacket(new Packet17EntityLocationAction(entityplayer, 0, (int) Math.floor(tracker.tracker.locX), | ||||
|                             (int) Math.floor(tracker.tracker.locY), (int) Math.floor(tracker.tracker.locZ))); | ||||
|         } | ||||
|  | ||||
|         // CraftBukkit start - Fix for nonsensical head yaw | ||||
|         tracker.i = (int) Math.floor(tracker.tracker.getHeadRotation() * 256.0F / 360.0F); // tracker.ao() should be | ||||
|         // getHeadRotation | ||||
|         tracker.broadcast(new Packet35EntityHeadRotation(player.getEntityId(), (byte) tracker.i)); | ||||
|         // CraftBukkit end | ||||
|  | ||||
|         // Resend any active potion effects | ||||
|         Iterator iterator = entityplayer.getEffects().iterator(); | ||||
|         while (iterator.hasNext()) { | ||||
|             MobEffect mobeffect = (MobEffect) iterator.next(); | ||||
|  | ||||
|             entityplayer.playerConnection.sendPacket(new Packet41MobEffect(player.getEntityId(), mobeffect)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setHearDisguisesListener(boolean enabled) { | ||||
|   | ||||
| @@ -2,18 +2,44 @@ package me.libraryaddict.disguise; | ||||
|  | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.Method; | ||||
| import java.lang.reflect.Modifier; | ||||
|  | ||||
| import org.bukkit.Art; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.Sound; | ||||
| import org.bukkit.World; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
|  | ||||
| public class ReflectionManager { | ||||
|     private static String bukkitVersion = Bukkit.getServer().getClass().getName().split("\\.")[3]; | ||||
|     private static Class itemClass; | ||||
|     private static Method soundMethod; | ||||
|     static { | ||||
|         for (Method method : getNmsClass("EntityLiving").getDeclaredMethods()) { | ||||
|             try { | ||||
|                 if (method.getReturnType() == float.class && Modifier.isProtected(method.getModifiers()) | ||||
|                         && method.getParameterTypes().length == 0) { | ||||
|                     Object entity = getEntityInstance("Pig"); | ||||
|                     method.setAccessible(true); | ||||
|                     method.invoke(entity); | ||||
|                     Field random = getNmsClass("Entity").getDeclaredField("random"); | ||||
|                     random.setAccessible(true); | ||||
|                     random.set(entity, null); | ||||
|                     method.setAccessible(true); | ||||
|                     try { | ||||
|                         method.invoke(entity); | ||||
|                     } catch (Exception ex) { | ||||
|                         soundMethod = method; | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|         } | ||||
|         try { | ||||
|             itemClass = Class.forName("org.bukkit.craftbukkit." + bukkitVersion + ".inventory.CraftItemStack"); | ||||
|             itemClass = getCraftClass("inventory.CraftItemStack"); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
| @@ -34,9 +60,18 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static Object getNmsEntity(Entity entity) { | ||||
|         try { | ||||
|             return getCraftClass("entity.CraftEntity").getMethod("getHandle").invoke(entity); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static String getCraftSound(Sound sound) { | ||||
|         try { | ||||
|             Class c = Class.forName("org.bukkit.craftbukkit." + bukkitVersion + ".CraftSound"); | ||||
|             Class c = getCraftClass("CraftSound"); | ||||
|             return (String) c.getMethod("getSound", Sound.class).invoke(null, sound); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
| @@ -75,22 +110,32 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static Class getCraftClass(String className) { | ||||
|         try { | ||||
|             return Class.forName("org.bukkit.craftbukkit." + bukkitVersion + "." + className); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static Float getSoundModifier(Object entity) { | ||||
|         try { | ||||
|             Method soundStrength = getNmsClass("EntityLiving").getDeclaredMethod("ba"); | ||||
|             // TODO Update this each update! | ||||
|             soundStrength.setAccessible(true); | ||||
|             return (Float) soundStrength.invoke(entity); | ||||
|             soundMethod.setAccessible(true); | ||||
|             return (Float) soundMethod.invoke(entity); | ||||
|         } catch (Exception ex) { | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     private static Object getWorld() { | ||||
|         try { | ||||
|             return Class.forName("org.bukkit.craftbukkit." + bukkitVersion + ".CraftWorld").getMethod("getHandle") | ||||
|                     .invoke(Bukkit.getWorlds().get(0)); | ||||
|         return getWorld(Bukkit.getWorlds().get(0)); | ||||
|     } | ||||
|  | ||||
|     public static Object getWorld(World world) { | ||||
|         try { | ||||
|             return getCraftClass("CraftWorld").getMethod("getHandle").invoke(world); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import java.lang.reflect.Field; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.HashSet; | ||||
| import java.util.Iterator; | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.PacketsManager; | ||||
| @@ -11,14 +12,7 @@ import me.libraryaddict.disguise.ReflectionManager; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; | ||||
| import net.minecraft.server.v1_6_R3.EntityAgeable; | ||||
| import net.minecraft.server.v1_6_R3.EntityInsentient; | ||||
| import net.minecraft.server.v1_6_R3.EntityLiving; | ||||
| import net.minecraft.server.v1_6_R3.EntityTrackerEntry; | ||||
| import net.minecraft.server.v1_6_R3.WorldServer; | ||||
|  | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.craftbukkit.v1_6_R3.entity.CraftEntity; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Horse.Variant; | ||||
| import org.bukkit.entity.Player; | ||||
| @@ -182,7 +176,7 @@ public abstract class Disguise { | ||||
|  | ||||
|             public void run() { | ||||
|                 // If entity is no longer valid. Remove it. | ||||
|                 if (!((CraftEntity) entity).getHandle().valid) { | ||||
|                 if (!getEntity().isValid()) { | ||||
|                     DisguiseAPI.undisguiseToAll(entity); | ||||
|                 } else { | ||||
|                     // If the disguise type is tnt, we need to resend the entity packet else it will turn invisible | ||||
| @@ -282,11 +276,16 @@ public abstract class Disguise { | ||||
|     protected ArrayList<Player> getPerverts() { | ||||
|         ArrayList<Player> players = new ArrayList<Player>(); | ||||
|         try { | ||||
|             EntityTrackerEntry entry = (EntityTrackerEntry) ((WorldServer) ((CraftEntity) entity).getHandle().world).tracker.trackedEntities | ||||
|                     .get(entity.getEntityId()); | ||||
|             if (entry != null) { | ||||
|             Object world = ReflectionManager.getWorld(getEntity().getWorld()); | ||||
|             Object tracker = world.getClass().getField("tracker").get(world); | ||||
|             Object trackedEntities = tracker.getClass().getField("trackedEntities").get(tracker); | ||||
|             Object entityTrackerEntry = trackedEntities.getClass().getMethod("get", int.class) | ||||
|                     .invoke(trackedEntities, getEntity().getEntityId()); | ||||
|             if (entityTrackerEntry != null) { | ||||
|                 Field field = ReflectionManager.getNmsClass("Entity").getField("getBukkitEntity"); | ||||
|                 for (Object p : entry.trackedPlayers) { | ||||
|                 HashSet trackedPlayers = (HashSet) entityTrackerEntry.getClass().getField("trackedPlayers") | ||||
|                         .get(entityTrackerEntry); | ||||
|                 for (Object p : trackedPlayers) { | ||||
|                     players.add((Player) field.get(p)); | ||||
|                 } | ||||
|             } | ||||
| @@ -347,7 +346,7 @@ public abstract class Disguise { | ||||
|         // If this disguise has a entity set | ||||
|         if (getEntity() != null) { | ||||
|             // If the entity is valid | ||||
|             if (((CraftEntity) getEntity()).getHandle().valid) { | ||||
|             if (getEntity().isValid()) { | ||||
|                 // If this disguise is active | ||||
|                 if (disguises.containsKey(getEntity().getEntityId()) && disguises.get(getEntity().getEntityId()) == this) { | ||||
|                     // Now remove the disguise from the current disguises. | ||||
| @@ -483,19 +482,19 @@ public abstract class Disguise { | ||||
|             case 7: | ||||
|             case 8: | ||||
|             case 9: | ||||
|                 baseClass = EntityLiving.class; | ||||
|                 baseClass = ReflectionManager.getNmsClass("EntityLiving"); | ||||
|                 break; | ||||
|             case 10: | ||||
|             case 11: | ||||
|                 baseClass = EntityInsentient.class; | ||||
|                 baseClass = ReflectionManager.getNmsClass("EntityInsentient"); | ||||
|                 break; | ||||
|             case 16: | ||||
|                 baseClass = EntityAgeable.class; | ||||
|                 baseClass = ReflectionManager.getNmsClass("EntityAgeable"); | ||||
|                 break; | ||||
|             default: | ||||
|                 break; | ||||
|             } | ||||
|             Class entityClass = ((CraftEntity) entity).getHandle().getClass(); | ||||
|             Class entityClass = ReflectionManager.getNmsEntity(getEntity()).getClass(); | ||||
|             // If they both extend the same base class. They OBVIOUSLY share the same datavalue. Right..? | ||||
|             if (baseClass != null && baseClass.isAssignableFrom(disguiseClass) && baseClass.isAssignableFrom(entityClass)) | ||||
|                 continue; | ||||
|   | ||||
| @@ -251,7 +251,7 @@ public class FlagWatcher { | ||||
|             // Find the item to replace it with | ||||
|             if (disguise.getEntity() instanceof LivingEntity) { | ||||
|                 EntityEquipment enquipment = ((LivingEntity) disguise.getEntity()).getEquipment(); | ||||
|                 if (slot == 4) { | ||||
|                 if (slot == 0) { | ||||
|                     itemStack = enquipment.getItemInHand(); | ||||
|                 } else { | ||||
|                     itemStack = enquipment.getArmorContents()[slot]; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user