Fixed Player disguises
Fixed all disguises Fixed issue where players would crash upon joining Fixed issue where disguises would crash when player left and reentered a location where a disguise previously was This is basically a beta build, FIND BUGS FOR ME! :D
This commit is contained in:
		| @@ -236,15 +236,15 @@ public class LibsDisguises extends JavaPlugin { | ||||
|                 for (WrappedWatchableObject watch : watcher.getWatchableObjects()) { | ||||
|                     disguiseValues.setMetaValue(watch.getIndex(), watch.getValue()); | ||||
|                     // Uncomment when I need to find the new datawatcher values for a class.. | ||||
|                     int id = watch.getIndex(); | ||||
|                     Object val = watch.getValue(); | ||||
|                     Class<?> valClazz = val != null ? watch.getValue().getClass() : null; | ||||
|                     try { | ||||
|                         val = val.toString(); | ||||
|                     } catch (Exception e) { | ||||
|                         val = val != null ? val.getClass() : "null"; | ||||
|                     } | ||||
|                     System.out.println("Disguise: " + disguiseType + ", ID: " + id + ", Class: " + (val == null ? "null" : valClazz) + ", Value: " + val); | ||||
| //                    int id = watch.getIndex(); | ||||
| //                    Object val = watch.getValue(); | ||||
| //                    Class<?> valClazz = val != null ? watch.getValue().getClass() : null; | ||||
| //                    try { | ||||
| //                        val = val.toString(); | ||||
| //                    } catch (Exception e) { | ||||
| //                        val = val != null ? val.getClass() : "null"; | ||||
| //                    } | ||||
| //                    System.out.println("Disguise: " + disguiseType + ", ID: " + id + ", Class: " + (val == null ? "null" : valClazz) + ", Value: " + val); | ||||
|                 } | ||||
|                 DisguiseSound sound = DisguiseSound.getType(disguiseType.name()); | ||||
|                 if (sound != null) { | ||||
|   | ||||
| @@ -508,7 +508,7 @@ public abstract class Disguise { | ||||
|         } | ||||
|         if (isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && entity instanceof LivingEntity) { | ||||
|             throw new RuntimeException( | ||||
|                     "Cannot disguise a living entity with a misc disguise. Renable MiscDisguisesForLiving in the config to do this"); | ||||
|                     "Cannot disguise a living entity with a misc disguise. Reenable MiscDisguisesForLiving in the config to do this"); | ||||
|         } | ||||
|         this.entity = entity; | ||||
|         setupWatcher(); | ||||
|   | ||||
| @@ -11,7 +11,6 @@ import java.util.List; | ||||
| public abstract class TargetedDisguise extends Disguise { | ||||
|  | ||||
|     public enum TargetType { | ||||
|  | ||||
|         HIDE_DISGUISE_TO_EVERYONE_BUT_THESE_PLAYERS, SHOW_TO_EVERYONE_BUT_THESE_PLAYERS | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import java.util.HashSet; | ||||
|  */ | ||||
| public enum DisguiseSound { | ||||
|  | ||||
|     //TODO: Sounds need to be updated to reflect new 1.9 sounds... oh god... | ||||
|     ARROW(null, null, null, null, "random.bowhit"), | ||||
|     BAT("entity.bat.hurt", null, "entity.bat.death", "entity.bat.idle", "damage.fallsmall", "entity.bat.loop", "damage.fallbig", | ||||
|             "entity.bat.takeoff"), | ||||
| @@ -25,9 +26,8 @@ public enum DisguiseSound { | ||||
|     ELDER_GUARDIAN("entity.guardian.elder.hit", null, "entity.guardian.elder.death", "entity.guardian.elder.death"), | ||||
|     ENDER_DRAGON("entity.enderdragon.hit", null, "entity.enderdragon.end", "entity.enderdragon.growl", "damage.fallsmall", | ||||
|             "entity.enderdragon.wings", "damage.fallbig"), | ||||
|     //TODO: Fix enderman sounds | ||||
| //    ENDERMAN("entity.endermen.hit", "step.grass", "entity.endermen.death", "entity.endermen.idle", "entity.endermen.scream", | ||||
| //            "entity.endermen.portal", "entity.endermen.stare"), | ||||
|     ENDERMAN("entity.endermen.hit", "step.grass", "entity.endermen.death", "entity.endermen.idle", "entity.endermen.scream", | ||||
|             "entity.endermen.portal", "entity.endermen.stare"), | ||||
|     ENDERMITE("entity.silverfish.hit", "entity.silverfish.step", "entity.silverfish.kill", "entity.silverfish.ambient"), | ||||
|     GHAST("entity.ghast.scream", null, "entity.ghast.death", "entity.ghast.moan", "damage.fallsmall", "entity.ghast.fireball", | ||||
|             "damage.fallbig", "entity.ghast.affectionate_scream", "entity.ghast.charge"), | ||||
| @@ -43,7 +43,7 @@ public enum DisguiseSound { | ||||
|     OCELOT("entity.cat.hitt", "step.grass", "entity.cat.hitt", "entity.cat.meow", "entity.cat.purreow", "entity.cat.purr"), | ||||
|     PIG("entity.pig.ambient", "entity.pig.step", "entity.pig.death", "entity.pig.ambient"), | ||||
|     PIG_ZOMBIE("entity.zombiepig.zpighurt", null, "entity.zombiepig.zpigdeath", "entity.zombiepig.zpig", "entity.zombiepig.zpigangry"), | ||||
|     PLAYER("game.player.hurt", "step.grass", "game.player.hurt", null), | ||||
|     PLAYER("entity.player.hurt", "step.grass", "entity.player.hurt", null), | ||||
|     RABBIT("entity.rabbit.hurt", "entity.rabbit.hop", "entity.rabbit.death", "entity.rabbit.idle"), | ||||
|     SHEEP("entity.sheep.ambient", "entity.sheep.step", null, "entity.sheep.ambient", "entity.sheep.shear"), | ||||
|     SHULKER("entity.shulker.hurt", null, "entity.shulker.death", "entity.shulker.ambient", "entity.shulker.open", | ||||
|   | ||||
| @@ -256,7 +256,7 @@ public class DisguiseUtilities { | ||||
|             if (entityTrackerEntry != null) { | ||||
|                 Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry); | ||||
|                 // If the tracker exists. Remove himself from his tracker | ||||
|                 trackedPlayers = new HashSet(trackedPlayers);  //Copy before iterating to prevent ConcurrentModificationException | ||||
|                 trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); //Copy before iterating to prevent ConcurrentModificationException | ||||
|                 PacketContainer destroyPacket = new PacketContainer(Server.ENTITY_DESTROY); | ||||
|                 destroyPacket.getIntegerArrays().write(0, new int[]{disguise.getEntity().getEntityId()}); | ||||
|                 for (Object p : trackedPlayers) { | ||||
| @@ -435,18 +435,18 @@ public class DisguiseUtilities { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get all EntityPlayers who have this entity in their Entity Tracker And they are in the targetted disguise. | ||||
|      * Get all EntityPlayers who have this entity in their Entity Tracker And they are in the targeted disguise. | ||||
|      * | ||||
|      * @param disguise | ||||
|      * @return | ||||
|      */ | ||||
|     public static ArrayList<Player> getPerverts(Disguise disguise) { | ||||
|         ArrayList<Player> players = new ArrayList<>(); | ||||
|     public static List<Player> getPerverts(Disguise disguise) { | ||||
|         List<Player> players = new ArrayList<>(); | ||||
|         try { | ||||
|             Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); | ||||
|             if (entityTrackerEntry != null) { | ||||
|                 Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry); | ||||
|                 trackedPlayers = new HashSet(trackedPlayers);  //Copy before iterating to prevent ConcurrentModificationException | ||||
|                 trackedPlayers = (Set) new HashSet(trackedPlayers).clone();  //Copy before iterating to prevent ConcurrentModificationException | ||||
|                 for (Object p : trackedPlayers) { | ||||
|                     Player player = (Player) ReflectionManager.getBukkitEntity(p); | ||||
|                     if (((TargetedDisguise) disguise).canSee(player)) { | ||||
| @@ -630,7 +630,7 @@ public class DisguiseUtilities { | ||||
|                                 ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                         final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", | ||||
|                                 ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                         trackedPlayers = new HashSet(trackedPlayers);  //Copy before iterating to prevent ConcurrentModificationException | ||||
|                         trackedPlayers = (Set) new HashSet(trackedPlayers).clone();  //Copy before iterating to prevent ConcurrentModificationException | ||||
|                         for (final Object p : trackedPlayers) { | ||||
|                             Player pl = (Player) ReflectionManager.getBukkitEntity(p); | ||||
|                             if (player.equalsIgnoreCase((pl).getName())) { | ||||
| @@ -672,7 +672,7 @@ public class DisguiseUtilities { | ||||
|                             ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                     final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", | ||||
|                             ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                     trackedPlayers = new HashSet(trackedPlayers); //Copy before iterating to prevent ConcurrentModificationException | ||||
|                     trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); //Copy before iterating to prevent ConcurrentModificationException | ||||
|                     for (final Object p : trackedPlayers) { | ||||
|                         Player player = (Player) ReflectionManager.getBukkitEntity(p); | ||||
|                         if (player != entity) { | ||||
| @@ -725,7 +725,7 @@ public class DisguiseUtilities { | ||||
|                     Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry); | ||||
|                     final Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                     final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                     trackedPlayers = new HashSet(trackedPlayers);  //Copy before iterating to prevent ConcurrentModificationException | ||||
|                     trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); | ||||
|                     for (final Object p : trackedPlayers) { | ||||
|                         Player player = (Player) ReflectionManager.getBukkitEntity(p); | ||||
|                         if (disguise.getEntity() != player && disguise.canSee(player)) { | ||||
| @@ -785,6 +785,7 @@ public class DisguiseUtilities { | ||||
|                 t.removeEntry(player.getName()); | ||||
|                 t.unregister(); | ||||
|             } | ||||
| //            player.spigot().setCollidesWithEntities(true); | ||||
|             //Finish up | ||||
|             // Remove the fake entity ID from the disguise bin | ||||
|             selfDisguised.remove(player.getUniqueId()); | ||||
| @@ -1030,6 +1031,7 @@ public class DisguiseUtilities { | ||||
|             t.setOption(Option.COLLISION_RULE, OptionStatus.NEVER); | ||||
|             t.addEntry(player.getName()); | ||||
|         } | ||||
| //        player.spigot().setCollidesWithEntities(false); | ||||
|         //Finish up | ||||
|         selfDisguised.add(player.getUniqueId()); | ||||
|         sendSelfDisguise(player, (TargetedDisguise) disguise); | ||||
|   | ||||
| @@ -29,7 +29,6 @@ import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.SheepWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.SlimeWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.WolfWatcher; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType; | ||||
| import org.bukkit.Art; | ||||
| @@ -45,13 +44,11 @@ import org.bukkit.entity.ExperienceOrb; | ||||
| import org.bukkit.entity.Item; | ||||
| import org.bukkit.entity.LivingEntity; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.entity.Slime; | ||||
| import org.bukkit.entity.Zombie; | ||||
| import org.bukkit.inventory.EquipmentSlot; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| import org.bukkit.metadata.FixedMetadataValue; | ||||
| import org.bukkit.potion.PotionEffect; | ||||
| import org.bukkit.potion.PotionEffectType; | ||||
| import org.bukkit.util.Vector; | ||||
|  | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| @@ -207,7 +204,6 @@ public class PacketsManager { | ||||
|             mods.write(5, pitch); | ||||
|         } else if (disguise.getType().isPlayer()) { | ||||
|             //TODO: Make player disguises visible again | ||||
|             spawnPackets[0] = new PacketContainer(Server.NAMED_ENTITY_SPAWN); | ||||
|             PlayerDisguise playerDisguise = (PlayerDisguise) disguise; | ||||
|             String name = playerDisguise.getSkin() != null ? playerDisguise.getSkin() : playerDisguise.getName(); | ||||
|             int entityId = disguisedEntity.getEntityId(); | ||||
| @@ -215,23 +211,25 @@ public class PacketsManager { | ||||
|             if (!DisguiseUtilities.hasGameProfile(name)) { | ||||
|                 removeName = !DisguiseUtilities.getAddedByPlugins().contains(name); | ||||
|             } | ||||
|  | ||||
|             WrappedGameProfile gameProfile = playerDisguise.getGameProfile(); | ||||
|             if (removeName) { | ||||
|                 DisguiseUtilities.getAddedByPlugins().remove(name); | ||||
|             } | ||||
|             Object entityPlayer = ReflectionManager.createEntityPlayer(player.getWorld(), gameProfile); | ||||
|             spawnPackets[0] = ProtocolLibrary.getProtocolManager() | ||||
|                     .createPacketConstructor(Server.NAMED_ENTITY_SPAWN, entityPlayer) | ||||
|                     .createPacket(entityPlayer); | ||||
|  | ||||
|             //Write spawn packet in order | ||||
|             spawnPackets[0].getIntegers().write(0, entityId);  //Id | ||||
|             spawnPackets[0].getSpecificModifier(UUID.class).write(0, gameProfile.getUUID());  //UUID | ||||
|             StructureModifier<Double> doubleMods = spawnPackets[0].getDoubles(); | ||||
|             doubleMods.write(0, Math.floor(loc.getX() * 32)); //x | ||||
|             doubleMods.write(1, Math.floor(loc.getY() * 32)); //y | ||||
|             doubleMods.write(2, Math.floor(loc.getZ() * 32)); //z | ||||
|             StructureModifier<Byte> byteMods = spawnPackets[0].getBytes(); | ||||
|             byteMods.write(0, yaw); //yaw | ||||
|             byteMods.write(1, pitch); //pitch | ||||
|             spawnPackets[0].getDoubles().write(0, loc.getX()); | ||||
|             spawnPackets[0].getDoubles().write(1, loc.getY()); | ||||
|             spawnPackets[0].getDoubles().write(2, loc.getZ()); | ||||
|  | ||||
|             spawnPackets[0].getDataWatcherModifier().write(0, createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); //watcher, duh | ||||
|  | ||||
|  | ||||
|  | ||||
|             if (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise.getWatcher()).isSleeping()) { | ||||
|                 PacketContainer[] newPackets = new PacketContainer[spawnPackets.length + 1]; | ||||
|                 System.arraycopy(spawnPackets, 1, newPackets, 2, spawnPackets.length - 1); | ||||
| @@ -266,21 +264,41 @@ public class PacketsManager { | ||||
|             delayedPacket.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(4)); | ||||
|             delayedPackets = new PacketContainer[]{delayedPacket}; | ||||
|         } else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) { | ||||
|             int entityId = disguisedEntity.getEntityId(); | ||||
|             LivingEntity entity = (LivingEntity) disguisedEntity.getWorld().spawnEntity(loc, disguise.getType().getEntityType()); | ||||
|             entity.setVelocity(disguisedEntity.getVelocity()); | ||||
|             if (disguise.getType() == DisguiseType.SLIME || disguise.getType() == DisguiseType.MAGMA_CUBE) { | ||||
|                 ((Slime) entity).setSize(((SlimeWatcher) disguise.getWatcher()).getSize()); | ||||
|             } | ||||
|             Object nms = ReflectionManager.getNmsEntity(entity); | ||||
|             PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.SPAWN_ENTITY_LIVING, nms).createPacket(nms).deepClone(); | ||||
|             spawnPackets[0] = packet; | ||||
|             spawnPackets[0].getIntegers().write(0, entityId); | ||||
|             spawnPackets[0].getDataWatcherModifier().write(0, createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); | ||||
|             entity.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1, Integer.MAX_VALUE, true, false)); | ||||
|             entity.remove(); | ||||
|             Vector vec = disguisedEntity.getVelocity(); | ||||
|             spawnPackets[0] = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING); | ||||
|             StructureModifier<Object> mods = spawnPackets[0].getModifier(); | ||||
|             mods.write(0, disguisedEntity.getEntityId()); | ||||
|             mods.write(1, UUID.randomUUID()); | ||||
|             mods.write(2, disguise.getType().getTypeId()); | ||||
|             //region Vector calculations | ||||
|             double d1 = 3.9D; | ||||
|             double d2 = vec.getX(); | ||||
|             double d3 = vec.getY(); | ||||
|             double d4 = vec.getZ(); | ||||
|             if (d2 < -d1) | ||||
|                 d2 = -d1; | ||||
|             if (d3 < -d1) | ||||
|                 d3 = -d1; | ||||
|             if (d4 < -d1) | ||||
|                 d4 = -d1; | ||||
|             if (d2 > d1) | ||||
|                 d2 = d1; | ||||
|             if (d3 > d1) | ||||
|                 d3 = d1; | ||||
|             if (d4 > d1) | ||||
|                 d4 = d1; | ||||
|             //endregion | ||||
|             mods.write(3, loc.getX()); | ||||
|             mods.write(4, loc.getY()); | ||||
|             mods.write(5, loc.getZ()); | ||||
|             mods.write(6, (int) (d2 * 8000.0D)); | ||||
|             mods.write(7, (int) (d3 * 8000.0D)); | ||||
|             mods.write(8, (int) (d4 * 8000.0D)); | ||||
|             mods.write(9, yaw); | ||||
|             mods.write(10, pitch); | ||||
|             spawnPackets[0].getDataWatcherModifier().write(0, | ||||
|                     createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); | ||||
|         } else if (disguise.getType().isMisc()) { | ||||
|             //TODO: Fix falling blocks, BlockPosition Serializer in ProtocolLib | ||||
|             int objectId = disguise.getType().getObjectId(); | ||||
|             int data = ((MiscDisguise) disguise).getData(); | ||||
|             if (disguise.getType() == DisguiseType.FALLING_BLOCK) { | ||||
| @@ -922,7 +940,6 @@ public class PacketsManager { | ||||
|                         } else if (event.getPacketType() == PacketType.Play.Client.WINDOW_CLICK) { | ||||
|                             int slot = event.getPacket().getIntegers().read(1); | ||||
|                             org.bukkit.inventory.ItemStack clickedItem; | ||||
|                             //TODO: Check this to make sure it is accurate | ||||
|                             if (event.getPacket().getShorts().read(0) == 1) { | ||||
|                                 // Its a shift click | ||||
|                                 clickedItem = event.getPacket().getItemModifier().read(0); | ||||
| @@ -1390,7 +1407,6 @@ public class PacketsManager { | ||||
|                         packets[0] = packets[0].shallowClone(); | ||||
|                         packets[0].getModifier().write(2, (itemStack.getTypeId() == 0 ? null : ReflectionManager.getNmsItem(itemStack))); | ||||
|                     } | ||||
|                     //TODO: Add left hand here | ||||
|                     if (disguise.getWatcher().isRightClicking() && slot == EquipmentSlot.HAND) { | ||||
|                         ItemStack heldItem = packets[0].getItemModifier().read(0); | ||||
|                         if (heldItem != null && heldItem.getType() != Material.AIR) { | ||||
| @@ -1456,8 +1472,8 @@ public class PacketsManager { | ||||
|                         mods.write(1, yaw); | ||||
|                         PacketContainer look = new PacketContainer(Server.ENTITY_LOOK); | ||||
|                         look.getIntegers().write(0, entity.getEntityId()); | ||||
|                         look.getBytes().write(3, yaw); | ||||
|                         look.getBytes().write(4, pitch); | ||||
|                         look.getBytes().write(0, yaw); | ||||
|                         look.getBytes().write(1, pitch); | ||||
|                         packets = new PacketContainer[]{look, rotation}; | ||||
|                     } | ||||
|                 } | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; | ||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; | ||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
| import com.google.common.collect.ImmutableMap; | ||||
| import com.mojang.authlib.GameProfile; | ||||
| import org.apache.commons.lang3.tuple.ImmutablePair; | ||||
| import org.apache.commons.lang3.tuple.Pair; | ||||
| import org.bukkit.Art; | ||||
| @@ -90,7 +91,7 @@ public class ReflectionManager { | ||||
|         try { | ||||
|             Class<?> entityClass = getNmsClass("Entity" + entityName); | ||||
|             Object entityObject; | ||||
|             Object world = getWorld(Bukkit.getWorlds().get(0)); | ||||
|             Object world = getWorldServer(Bukkit.getWorlds().get(0)); | ||||
|             switch (entityName) { | ||||
|                 case "Player": | ||||
|                     Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); | ||||
| @@ -223,12 +224,21 @@ public class ReflectionManager { | ||||
|     } | ||||
|  | ||||
|     public static Object getEntityTrackerEntry(Entity target) throws Exception { | ||||
|         Object world = getWorld(target.getWorld()); | ||||
|         Object world = getWorldServer(target.getWorld()); | ||||
|         Object tracker = trackerField.get(world); | ||||
|         Object trackedEntities = entitiesField.get(tracker); | ||||
|         return ihmGet.invoke(trackedEntities, target.getEntityId()); | ||||
|     } | ||||
|  | ||||
|     public static Object getMinecraftServer() { | ||||
|         try { | ||||
|             return getCraftMethod("CraftServer", "getServer").invoke(Bukkit.getServer()); | ||||
|         } catch (IllegalAccessException | InvocationTargetException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static String getEnumArt(Art art) { | ||||
|         try { | ||||
|             Object enumArt = getCraftClass("CraftArt").getMethod("BukkitToNotch", Art.class).invoke(null, art); | ||||
| @@ -442,15 +452,6 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static Object getWorld(World world) { | ||||
|         try { | ||||
|             return getCraftClass("CraftWorld").getDeclaredMethod("getHandle").invoke(world); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(System.out); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static WrappedGameProfile grabProfileAddUUID(String playername) { | ||||
|         try { | ||||
|             Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); | ||||
| @@ -679,4 +680,40 @@ public class ReflectionManager { | ||||
|         int k = combinedId >> 12 & 15; | ||||
|         return new ImmutablePair<>(j, k); | ||||
|     } | ||||
|  | ||||
|     public static Object getWorldServer(World w) { | ||||
|         try { | ||||
|             return getCraftMethod("CraftWorld", "getHandle").invoke(w); | ||||
|         } catch (IllegalAccessException | InvocationTargetException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static Object getPlayerInteractManager(World w) { | ||||
|         Object worldServer = getWorldServer(w); | ||||
|         try { | ||||
|             return getNmsConstructor("PlayerInteractManager", getNmsClass("World")).newInstance(worldServer); | ||||
|         } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static Object createEntityPlayer(World w, WrappedGameProfile profile) { | ||||
|         Object entityPlayer = null; | ||||
|         try { | ||||
|             entityPlayer = getNmsConstructor("EntityPlayer", | ||||
|                     getNmsClass("MinecraftServer"), | ||||
|                             getNmsClass("WorldServer"), | ||||
|                             GameProfile.class, | ||||
|                             getNmsClass("PlayerInteractManager")) | ||||
|                     .newInstance(getMinecraftServer(), getWorldServer(w), profile.getHandle(), getPlayerInteractManager(w)); | ||||
|         } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return entityPlayer; | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user