Read desc
Removed a few classes to a new package Renamed methods and deprecated them as retarded names. Fixed DisguiseAPI instance opening new calls and just moved that into a new class
This commit is contained in:
		| @@ -1,38 +1,24 @@ | ||||
| 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 me.libraryaddict.disguise.utils.PacketsManager; | ||||
| import me.libraryaddict.disguise.utils.ReflectionManager; | ||||
| import me.libraryaddict.disguise.utils.DisguiseUtilities; | ||||
|  | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| 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 { | ||||
|  | ||||
|     // Store the entity IDs instead of entitys because then I can disguise entitys even before they exist | ||||
|     private static HashMap<Integer, Disguise> disguises = new HashMap<Integer, Disguise>(); | ||||
|     private static boolean hearSelfDisguise; | ||||
|  | ||||
|     private static boolean hidingArmor; | ||||
|     private static boolean hidingHeldItem; | ||||
|  | ||||
|     // A internal storage of fake entity ID's I can use. | ||||
|     // Realistically I could probably use a ID like "4" for everyone seeing as no one shares the ID | ||||
|     private static HashMap<Integer, Integer> selfDisguisesIds = new HashMap<Integer, Integer>(); | ||||
|  | ||||
|     private static boolean sendVelocity; | ||||
|  | ||||
|      | ||||
|     @Deprecated | ||||
|     public static boolean canHearSelfDisguise() { | ||||
|         return hearSelfDisguise; | ||||
|     } | ||||
| @@ -43,14 +29,14 @@ public class DisguiseAPI { | ||||
|     public static void disguiseNextEntity(Disguise disguise) { | ||||
|         if (disguise == null) | ||||
|             return; | ||||
|         if (disguise.getEntity() != null || disguises.containsValue(disguise)) { | ||||
|         if (disguise.getEntity() != null || DisguiseUtilities.getDisguises().containsValue(disguise)) { | ||||
|             disguise = disguise.clone(); | ||||
|         } | ||||
|         try { | ||||
|             Field field = ReflectionManager.getNmsClass("Entity").getDeclaredField("entityCount"); | ||||
|             field.setAccessible(true); | ||||
|             int id = field.getInt(null); | ||||
|             disguises.put(id, disguise); | ||||
|             DisguiseUtilities.getDisguises().put(id, disguise); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
| @@ -84,11 +70,11 @@ public class DisguiseAPI { | ||||
|         } // If there was a old disguise | ||||
|         Disguise oldDisguise = getDisguise(entity); | ||||
|         // Stick the disguise in the disguises bin | ||||
|         disguises.put(entity.getEntityId(), disguise); | ||||
|         DisguiseUtilities.getDisguises().put(entity.getEntityId(), disguise); | ||||
|         // Resend the disguised entity's packet | ||||
|         refreshTrackers(entity); | ||||
|         DisguiseUtilities.refreshTrackers(entity); | ||||
|         // If he is a player, then self disguise himself | ||||
|         setupPlayerFakeDisguise(disguise); | ||||
|         DisguiseUtilities.setupFakeDisguise(disguise); | ||||
|         // Discard the disguise | ||||
|         if (oldDisguise != null) | ||||
|             oldDisguise.removeDisguise(); | ||||
| @@ -97,28 +83,28 @@ public class DisguiseAPI { | ||||
|     /** | ||||
|      * Get the disguise of a entity | ||||
|      */ | ||||
|     public static Disguise getDisguise(Entity disguiser) { | ||||
|         if (disguiser == null) | ||||
|     public static Disguise getDisguise(Entity disguised) { | ||||
|         if (disguised == null) | ||||
|             return null; | ||||
|         if (disguises.containsKey(disguiser.getEntityId())) | ||||
|             return disguises.get(disguiser.getEntityId()); | ||||
|         if (DisguiseUtilities.getDisguises().containsKey(disguised.getEntityId())) | ||||
|             return DisguiseUtilities.getDisguises().get(disguised.getEntityId()); | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the ID of a fake disguise for a entityplayer | ||||
|      */ | ||||
|     public static int getFakeDisguise(int id) { | ||||
|         if (selfDisguisesIds.containsKey(id)) | ||||
|             return selfDisguisesIds.get(id); | ||||
|     public static int getFakeDisguise(int entityId) { | ||||
|         if (DisguiseUtilities.getSelfDisguisesIds().containsKey(entityId)) | ||||
|             return DisguiseUtilities.getSelfDisguisesIds().get(entityId); | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Is this entity disguised | ||||
|      */ | ||||
|     public static boolean isDisguised(Entity disguiser) { | ||||
|         return getDisguise(disguiser) != null; | ||||
|     public static boolean isDisguised(Entity disguised) { | ||||
|         return getDisguise(disguised) != null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -139,6 +125,10 @@ public class DisguiseAPI { | ||||
|         return PacketsManager.isInventoryListenerEnabled(); | ||||
|     } | ||||
|  | ||||
|     public static boolean isSelfDisguisesSoundsReplaced() { | ||||
|         return hearSelfDisguise; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Is the sound packets caught and modified | ||||
|      */ | ||||
| @@ -160,79 +150,6 @@ public class DisguiseAPI { | ||||
|         return PacketsManager.isViewDisguisesListenerEnabled(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Resends | ||||
|      *            the entity to all the watching players, which is where the magic begins | ||||
|      */ | ||||
|     private static void refreshTrackers(Entity entity) { | ||||
|         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")); | ||||
|                 HashSet cloned = (HashSet) trackedPlayers.clone(); | ||||
|                 for (Object player : cloned) { | ||||
|                     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(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static void removeSelfDisguise(Player player) { | ||||
|         if (selfDisguisesIds.containsKey(player.getEntityId())) { | ||||
|             // Send a packet to destroy the fake entity | ||||
|             PacketContainer packet = new PacketContainer(Packets.Server.DESTROY_ENTITY); | ||||
|             packet.getModifier().write(0, new int[] { selfDisguisesIds.get(player.getEntityId()) }); | ||||
|             try { | ||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|             // Remove the fake entity ID from the disguise bin | ||||
|             selfDisguisesIds.remove(player.getEntityId()); | ||||
|             // Get the entity tracker | ||||
|             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()); | ||||
|             packetMetadata.getWatchableCollectionModifier().write(0, | ||||
|                     WrappedDataWatcher.getEntityWatcher(player).getWatchableObjects()); | ||||
|             try { | ||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packetMetadata); | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|             player.updateInventory(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Can players hear their own disguises | ||||
|      */ | ||||
| @@ -273,38 +190,6 @@ public class DisguiseAPI { | ||||
|         PacketsManager.setHearDisguisesListener(isSoundsEnabled); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Setup it so he can see himself when disguised | ||||
|      */ | ||||
|     private static void setupPlayerFakeDisguise(final Disguise disguise) { | ||||
|         // If the disguises entity is null, or the disguised entity isn't a player return | ||||
|         if (disguise.getEntity() == null || !(disguise.getEntity() instanceof Player) || !disguises.containsValue(disguise)) | ||||
|             return; | ||||
|         Player player = (Player) disguise.getEntity(); | ||||
|         // Remove the old disguise, else we have weird disguises around the place | ||||
|         removeSelfDisguise(player); | ||||
|         // If the disguised player can't see himself. Return | ||||
|         if (!disguise.viewSelfDisguise() || !PacketsManager.isViewDisguisesListenerEnabled() || player.getVehicle() != null) | ||||
|             return; | ||||
|         try { | ||||
|             // Grab the entity ID the fake disguise will use | ||||
|             Field field = ReflectionManager.getNmsClass("Entity").getDeclaredField("entityCount"); | ||||
|             field.setAccessible(true); | ||||
|             int id = field.getInt(null); | ||||
|             // Set the entitycount plus one so we don't have the id being reused | ||||
|             field.set(null, id + 1); | ||||
|             selfDisguisesIds.put(player.getEntityId(), id); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         PacketsManager.sendSelfDisguise(player); | ||||
|         if (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf()) { | ||||
|             if (PacketsManager.isInventoryListenerEnabled()) { | ||||
|                 player.updateInventory(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Disable velocity packets being sent for w/e reason. Maybe you want every ounce of performance you can get? | ||||
|      */ | ||||
| @@ -331,19 +216,6 @@ public class DisguiseAPI { | ||||
|         disguise.removeDisguise(); | ||||
|     } | ||||
|  | ||||
|     public HashMap<Integer, Disguise> getDisguises() { | ||||
|         return disguises; | ||||
|     } | ||||
|  | ||||
|     public void refreshWatchingPlayers(Entity entity) { | ||||
|         refreshTrackers(entity); | ||||
|     } | ||||
|  | ||||
|     public void removeVisibleDisguise(Player player) { | ||||
|         removeSelfDisguise(player); | ||||
|     } | ||||
|  | ||||
|     public void setupFakeDisguise(Disguise disguise) { | ||||
|         setupPlayerFakeDisguise(disguise); | ||||
|     private DisguiseAPI() { | ||||
|     } | ||||
| } | ||||
| @@ -3,6 +3,8 @@ package me.libraryaddict.disguise; | ||||
| import java.util.HashMap; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utils.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utils.UpdateChecker; | ||||
|  | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.ChatColor; | ||||
| @@ -19,7 +21,6 @@ import org.bukkit.scheduler.BukkitRunnable; | ||||
| public class DisguiseListener implements Listener { | ||||
|  | ||||
|     private String currentVersion; | ||||
|     private DisguiseAPI disguiseAPI = new DisguiseAPI(); | ||||
|     private HashMap<String, BukkitRunnable> disguiseRunnable = new HashMap<String, BukkitRunnable>(); | ||||
|     private HashMap<String, Disguise> disguiseSlap = new HashMap<String, Disguise>(); | ||||
|     private String latestVersion; | ||||
| @@ -93,7 +94,7 @@ public class DisguiseListener implements Listener { | ||||
|             return; | ||||
|         Disguise disguise = DisguiseAPI.getDisguise(event.getEntered()); | ||||
|         if (disguise != null && event.getEntered() instanceof Player) { | ||||
|             disguiseAPI.removeVisibleDisguise((Player) event.getEntered()); | ||||
|             DisguiseUtilities.removeSelfDisguise((Player) event.getEntered()); | ||||
|             ((Player) event.getEntered()).updateInventory(); | ||||
|         } | ||||
|     } | ||||
| @@ -106,7 +107,7 @@ public class DisguiseListener implements Listener { | ||||
|         if (disguise != null && event.getExited() instanceof Player) { | ||||
|             Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { | ||||
|                 public void run() { | ||||
|                     disguiseAPI.setupFakeDisguise(disguise); | ||||
|                     DisguiseUtilities.setupFakeDisguise(disguise); | ||||
|                     ((Player) disguise.getEntity()).updateInventory(); | ||||
|                 } | ||||
|             }); | ||||
|   | ||||
| @@ -17,6 +17,8 @@ import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.MinecartWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.SlimeWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; | ||||
| import me.libraryaddict.disguise.utils.PacketsManager; | ||||
| import me.libraryaddict.disguise.utils.ReflectionManager; | ||||
|  | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.configuration.file.FileConfiguration; | ||||
| @@ -122,11 +124,11 @@ public class LibsDisguises extends JavaPlugin { | ||||
|                     break; | ||||
|                 } | ||||
|             } catch (ClassNotFoundException ex) { | ||||
|                 // There is no explict watcher for this entity. | ||||
|                 Class c = disguiseType.getEntityType().getEntityClass(); | ||||
|                 if (Ageable.class.isAssignableFrom(c)) { | ||||
|                 // There is no explicit watcher for this entity. | ||||
|                 Class entityClass = disguiseType.getEntityType().getEntityClass(); | ||||
|                 if (Ageable.class.isAssignableFrom(entityClass)) { | ||||
|                     watcherClass = AgeableWatcher.class; | ||||
|                 } else if (LivingEntity.class.isAssignableFrom(c)) { | ||||
|                 } else if (LivingEntity.class.isAssignableFrom(entityClass)) { | ||||
|                     watcherClass = LivingWatcher.class; | ||||
|                 } else { | ||||
|                     watcherClass = FlagWatcher.class; | ||||
| @@ -176,19 +178,19 @@ public class LibsDisguises extends JavaPlugin { | ||||
|                 Object entity = ReflectionManager.createEntityInstance(name); | ||||
|                 Entity bukkitEntity = (Entity) ReflectionManager.getNmsClass("Entity").getMethod("getBukkitEntity") | ||||
|                         .invoke(entity); | ||||
|                 int size = 0; | ||||
|                 int enumEntitySize = 0; | ||||
|                 for (Field field : ReflectionManager.getNmsClass("Entity").getFields()) { | ||||
|                     if (field.getType().getName().equals("EnumEntitySize")) { | ||||
|                         Enum a = (Enum) field.get(entity); | ||||
|                         size = a.ordinal(); | ||||
|                         enumEntitySize = a.ordinal(); | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|                 Values value = new Values(disguiseType, entity.getClass(), size); | ||||
|                 Values disguiseValues = new Values(disguiseType, entity.getClass(), enumEntitySize); | ||||
|                 WrappedDataWatcher dataWatcher = WrappedDataWatcher.getEntityWatcher(bukkitEntity); | ||||
|                 List<WrappedWatchableObject> watchers = dataWatcher.getWatchableObjects(); | ||||
|                 for (WrappedWatchableObject watch : watchers) | ||||
|                     value.setMetaValue(watch.getIndex(), watch.getValue()); | ||||
|                     disguiseValues.setMetaValue(watch.getIndex(), watch.getValue()); | ||||
|                 DisguiseSound sound = DisguiseSound.getType(disguiseType.name()); | ||||
|                 if (sound != null) { | ||||
|                     Float soundStrength = ReflectionManager.getSoundModifier(entity); | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| package me.libraryaddict.disguise.commands; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import me.libraryaddict.disguise.BaseDisguiseCommand; | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utils.BaseDisguiseCommand; | ||||
|  | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.command.Command; | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| package me.libraryaddict.disguise.commands; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import me.libraryaddict.disguise.BaseDisguiseCommand; | ||||
| import me.libraryaddict.disguise.DisguiseListener; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utils.BaseDisguiseCommand; | ||||
|  | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.command.Command; | ||||
|   | ||||
| @@ -3,9 +3,10 @@ package me.libraryaddict.disguise.commands; | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import me.libraryaddict.disguise.BaseDisguiseCommand; | ||||
| import me.libraryaddict.disguise.disguisetypes.AnimalColor; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| import me.libraryaddict.disguise.utils.BaseDisguiseCommand; | ||||
|  | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.command.Command; | ||||
| @@ -15,8 +16,8 @@ import org.bukkit.potion.PotionEffectType; | ||||
|  | ||||
| public class DisguiseHelpCommand extends BaseDisguiseCommand { | ||||
|     private class EnumHelp { | ||||
|         private String enumName; | ||||
|         private String enumDescription; | ||||
|         private String enumName; | ||||
|         private String[] enums; | ||||
|         private String readableEnum; | ||||
|  | ||||
| @@ -38,21 +39,21 @@ public class DisguiseHelpCommand extends BaseDisguiseCommand { | ||||
|             this.readableEnum = enumReadable; | ||||
|         } | ||||
|  | ||||
|         public String getEnumName() { | ||||
|             return enumName; | ||||
|         } | ||||
|  | ||||
|         public String getReadableEnum() { | ||||
|             return readableEnum; | ||||
|         } | ||||
|  | ||||
|         public String getEnumDescription() { | ||||
|             return enumDescription; | ||||
|         } | ||||
|  | ||||
|         public String getEnumName() { | ||||
|             return enumName; | ||||
|         } | ||||
|  | ||||
|         public String[] getEnums() { | ||||
|             return enums; | ||||
|         } | ||||
|  | ||||
|         public String getReadableEnum() { | ||||
|             return readableEnum; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private ArrayList<EnumHelp> enumHelp = new ArrayList<EnumHelp>(); | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| package me.libraryaddict.disguise.commands; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import me.libraryaddict.disguise.BaseDisguiseCommand; | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utils.BaseDisguiseCommand; | ||||
|  | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.ChatColor; | ||||
|   | ||||
| @@ -1,9 +1,10 @@ | ||||
| package me.libraryaddict.disguise.commands; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import me.libraryaddict.disguise.BaseDisguiseCommand; | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utils.BaseDisguiseCommand; | ||||
|  | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.command.Command; | ||||
|   | ||||
| @@ -8,11 +8,13 @@ import java.util.HashMap; | ||||
| import java.util.HashSet; | ||||
| import java.util.Iterator; | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.PacketsManager; | ||||
| 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 me.libraryaddict.disguise.utils.PacketsManager; | ||||
| import me.libraryaddict.disguise.utils.ReflectionManager; | ||||
| import me.libraryaddict.disguise.utils.DisguiseUtilities; | ||||
|  | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.entity.Horse.Variant; | ||||
| import org.bukkit.entity.Player; | ||||
| @@ -26,18 +28,14 @@ import com.comphenix.protocol.events.PacketContainer; | ||||
| import com.comphenix.protocol.reflect.StructureModifier; | ||||
|  | ||||
| public abstract class Disguise { | ||||
|     /** | ||||
|      * Incase I forget, this is used to access normally hidden api calls. | ||||
|      */ | ||||
|     private static DisguiseAPI disguiseAPI = new DisguiseAPI(); | ||||
|     private static JavaPlugin plugin; | ||||
|     private DisguiseType disguiseType; | ||||
|     private org.bukkit.entity.Entity entity; | ||||
|     private boolean hearSelfDisguise = DisguiseAPI.canHearSelfDisguise(); | ||||
|     private boolean hearSelfDisguise = DisguiseAPI.isSelfDisguisesSoundsReplaced(); | ||||
|     private boolean hideArmorFromSelf = DisguiseAPI.isHidingArmorFromSelf(); | ||||
|     private boolean hideHeldItemFromSelf = DisguiseAPI.isHidingHeldItemFromSelf(); | ||||
|     private boolean replaceSounds = DisguiseAPI.isSoundEnabled(); | ||||
|     private BukkitRunnable runnable; | ||||
|     private BukkitRunnable velocityRunnable; | ||||
|     private boolean velocitySent = DisguiseAPI.isVelocitySent(); | ||||
|     private boolean viewSelfDisguise = DisguiseAPI.isViewDisguises(); | ||||
|     private FlagWatcher watcher; | ||||
| @@ -175,7 +173,7 @@ public abstract class Disguise { | ||||
|         final double vectorY = fallSpeed; | ||||
|         final boolean alwaysSendVelocity = alwaysSend; | ||||
|         // A scheduler to clean up any unused disguises. | ||||
|         runnable = new BukkitRunnable() { | ||||
|         velocityRunnable = new BukkitRunnable() { | ||||
|             private int i = 0; | ||||
|  | ||||
|             public void run() { | ||||
| @@ -220,7 +218,7 @@ public abstract class Disguise { | ||||
|                                     PacketContainer packet = new PacketContainer(Packets.Server.ENTITY_VELOCITY); | ||||
|                                     StructureModifier<Object> mods = packet.getModifier(); | ||||
|                                     if (entity == player) { | ||||
|                                         if (!viewSelfDisguise()) | ||||
|                                         if (!isSelfDisguiseVisible()) | ||||
|                                             continue; | ||||
|                                         if (selfLookPacket != null) { | ||||
|                                             try { | ||||
| @@ -334,6 +332,17 @@ public abstract class Disguise { | ||||
|         return this instanceof PlayerDisguise; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Can the disguised view himself as the disguise | ||||
|      */ | ||||
|     public boolean isSelfDisguiseVisible() { | ||||
|         return viewSelfDisguise; | ||||
|     } | ||||
|  | ||||
|     public boolean isSoundsReplaced() { | ||||
|         return replaceSounds; | ||||
|     } | ||||
|  | ||||
|     public boolean isVelocitySent() { | ||||
|         return velocitySent; | ||||
|     } | ||||
| @@ -344,10 +353,10 @@ public abstract class Disguise { | ||||
|     public void removeDisguise() { | ||||
|         // Why the hell can't I safely check if its running?!?! | ||||
|         try { | ||||
|             runnable.cancel(); | ||||
|             velocityRunnable.cancel(); | ||||
|         } catch (Exception ex) { | ||||
|         } | ||||
|         HashMap<Integer, Disguise> disguises = disguiseAPI.getDisguises(); | ||||
|         HashMap<Integer, Disguise> disguises = DisguiseUtilities.getDisguises(); | ||||
|         // If this disguise has a entity set | ||||
|         if (getEntity() != null) { | ||||
|             // If the entity is valid | ||||
| @@ -359,10 +368,10 @@ public abstract class Disguise { | ||||
|                     // Gotta do reflection, copy code or open up calls. | ||||
|                     // Reflection is the cleanest? | ||||
|                     if (getEntity() instanceof Player) { | ||||
|                         disguiseAPI.removeVisibleDisguise((Player) entity); | ||||
|                         DisguiseUtilities.removeSelfDisguise((Player) entity); | ||||
|                     } | ||||
|                     // Better refresh the entity to undisguise it | ||||
|                     disguiseAPI.refreshWatchingPlayers(getEntity()); | ||||
|                     DisguiseUtilities.refreshTrackers(getEntity()); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
| @@ -377,6 +386,7 @@ public abstract class Disguise { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     public boolean replaceSounds() { | ||||
|         return replaceSounds; | ||||
|     } | ||||
| @@ -389,7 +399,7 @@ public abstract class Disguise { | ||||
|             throw new RuntimeException("This disguise is already in use! Try .clone()"); | ||||
|         this.entity = entity; | ||||
|         setupWatcher(); | ||||
|         runnable.runTaskTimer(plugin, 1, 1); | ||||
|         velocityRunnable.runTaskTimer(plugin, 1, 1); | ||||
|     } | ||||
|  | ||||
|     public void setHearSelfDisguise(boolean hearSelfDisguise) { | ||||
| @@ -529,9 +539,9 @@ public abstract class Disguise { | ||||
|             if (getEntity() != null && getEntity() instanceof Player) { | ||||
|                 if (DisguiseAPI.getDisguise(getEntity()) == this) { | ||||
|                     if (viewSelfDisguise) { | ||||
|                         disguiseAPI.setupFakeDisguise(this); | ||||
|                         DisguiseUtilities.setupFakeDisguise(this); | ||||
|                     } else | ||||
|                         disguiseAPI.removeVisibleDisguise((Player) getEntity()); | ||||
|                         DisguiseUtilities.removeSelfDisguise((Player) getEntity()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| @@ -541,9 +551,7 @@ public abstract class Disguise { | ||||
|         watcher = newWatcher; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Can the disguised view himself as the disguise | ||||
|      */ | ||||
|     @Deprecated | ||||
|     public boolean viewSelfDisguise() { | ||||
|         return viewSelfDisguise; | ||||
|     } | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package me.libraryaddict.disguise.disguisetypes; | ||||
| import java.util.HashMap; | ||||
| import java.util.HashSet; | ||||
|  | ||||
| import me.libraryaddict.disguise.ReflectionManager; | ||||
| import me.libraryaddict.disguise.utils.ReflectionManager; | ||||
|  | ||||
| import org.bukkit.Sound; | ||||
|  | ||||
|   | ||||
| @@ -174,10 +174,6 @@ public enum DisguiseType { | ||||
|     private EntityType entityType; | ||||
|     private Class watcherClass; | ||||
|  | ||||
|     private void setEntityType(EntityType entityType) { | ||||
|         this.entityType = entityType; | ||||
|     } | ||||
|  | ||||
|     private DisguiseType(int... obj) { | ||||
|         for (int i = 0; i < obj.length; i++) { | ||||
|             int value = obj[i]; | ||||
| @@ -229,6 +225,10 @@ public enum DisguiseType { | ||||
|         return entityType == EntityType.PLAYER; | ||||
|     } | ||||
|  | ||||
|     private void setEntityType(EntityType entityType) { | ||||
|         this.entityType = entityType; | ||||
|     } | ||||
|  | ||||
|     public void setWatcherClass(Class c) { | ||||
|         watcherClass = c; | ||||
|     } | ||||
|   | ||||
| @@ -19,8 +19,8 @@ import com.comphenix.protocol.reflect.StructureModifier; | ||||
| import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.PacketsManager; | ||||
| import me.libraryaddict.disguise.ReflectionManager; | ||||
| import me.libraryaddict.disguise.utils.PacketsManager; | ||||
| import me.libraryaddict.disguise.utils.ReflectionManager; | ||||
|  | ||||
| public class FlagWatcher { | ||||
|     public enum SlotType { | ||||
| @@ -110,7 +110,7 @@ public class FlagWatcher { | ||||
|             } | ||||
|         } | ||||
|         // Here we check for if there is a health packet that says they died. | ||||
|         if (disguise.viewSelfDisguise() && disguise.getEntity() != null && disguise.getEntity() instanceof Player) { | ||||
|         if (disguise.isSelfDisguiseVisible() && disguise.getEntity() != null && disguise.getEntity() instanceof Player) { | ||||
|             for (WrappedWatchableObject watch : newList) { | ||||
|                 // Its a health packet | ||||
|                 if (watch.getIndex() == 6) { | ||||
|   | ||||
| @@ -83,8 +83,8 @@ public class MiscDisguise extends Disguise { | ||||
|  | ||||
|     @Override | ||||
|     public MiscDisguise clone() { | ||||
|         MiscDisguise disguise = new MiscDisguise(getType(), replaceSounds(), getData()); | ||||
|         disguise.setViewSelfDisguise(viewSelfDisguise()); | ||||
|         MiscDisguise disguise = new MiscDisguise(getType(), isSoundsReplaced(), getData()); | ||||
|         disguise.setViewSelfDisguise(isSelfDisguiseVisible()); | ||||
|         disguise.setHearSelfDisguise(canHearSelfDisguise()); | ||||
|         disguise.setHideArmorFromSelf(isHidingArmorFromSelf()); | ||||
|         disguise.setHideHeldItemFromSelf(isHidingHeldItemFromSelf()); | ||||
|   | ||||
| @@ -40,8 +40,8 @@ public class MobDisguise extends Disguise { | ||||
|  | ||||
|     @Override | ||||
|     public MobDisguise clone() { | ||||
|         MobDisguise disguise = new MobDisguise(getType(), isAdult(), replaceSounds()); | ||||
|         disguise.setViewSelfDisguise(viewSelfDisguise()); | ||||
|         MobDisguise disguise = new MobDisguise(getType(), isAdult(), isSoundsReplaced()); | ||||
|         disguise.setViewSelfDisguise(isSelfDisguiseVisible()); | ||||
|         disguise.setHearSelfDisguise(canHearSelfDisguise()); | ||||
|         disguise.setHideArmorFromSelf(isHidingArmorFromSelf()); | ||||
|         disguise.setHideHeldItemFromSelf(isHidingHeldItemFromSelf()); | ||||
|   | ||||
| @@ -16,8 +16,8 @@ public class PlayerDisguise extends Disguise { | ||||
|  | ||||
|     @Override | ||||
|     public PlayerDisguise clone() { | ||||
|         PlayerDisguise disguise = new PlayerDisguise(getName(), replaceSounds()); | ||||
|         disguise.setViewSelfDisguise(viewSelfDisguise()); | ||||
|         PlayerDisguise disguise = new PlayerDisguise(getName(), isSoundsReplaced()); | ||||
|         disguise.setViewSelfDisguise(isSelfDisguiseVisible()); | ||||
|         disguise.setHearSelfDisguise(canHearSelfDisguise()); | ||||
|         disguise.setHideArmorFromSelf(isHidingArmorFromSelf()); | ||||
|         disguise.setHideHeldItemFromSelf(isHidingHeldItemFromSelf()); | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.ReflectionManager; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.utils.ReflectionManager; | ||||
|  | ||||
| import org.bukkit.inventory.ItemStack; | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.ReflectionManager; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.utils.ReflectionManager; | ||||
|  | ||||
| import org.bukkit.inventory.ItemStack; | ||||
|  | ||||
|   | ||||
| @@ -2,15 +2,14 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.HashSet; | ||||
| import me.libraryaddict.disguise.ReflectionManager; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.utils.ReflectionManager; | ||||
|  | ||||
| import org.bukkit.potion.PotionEffect; | ||||
| import org.bukkit.potion.PotionEffectType; | ||||
|  | ||||
| public class LivingWatcher extends FlagWatcher { | ||||
|     private HashSet<Integer> potionEffects = new HashSet<Integer>(); | ||||
|     static Object[] list; | ||||
|     static Method potionNo; | ||||
|     static { | ||||
| @@ -33,6 +32,7 @@ public class LivingWatcher extends FlagWatcher { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|     private HashSet<Integer> potionEffects = new HashSet<Integer>(); | ||||
|  | ||||
|     public LivingWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
| @@ -72,35 +72,6 @@ public class LivingWatcher extends FlagWatcher { | ||||
|         return (Byte) getValue(8, (byte) 0) == 1; | ||||
|     } | ||||
|  | ||||
|     public boolean hasCustomName() { | ||||
|         return getCustomName().length() > 0; | ||||
|     } | ||||
|  | ||||
|     public boolean hasPotionEffect(PotionEffectType type) { | ||||
|         return potionEffects.contains(type.getId()); | ||||
|     } | ||||
|  | ||||
|     public boolean isCustomNameVisible() { | ||||
|         return (Byte) getValue(11, (byte) 0) == 1; | ||||
|     } | ||||
|  | ||||
|     public void removePotionEffect(PotionEffectType type) { | ||||
|         if (potionEffects.contains(type.getId())) { | ||||
|             potionEffects.remove(type.getId()); | ||||
|             sendPotionEffects(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void removePotionParticles(boolean particles) { | ||||
|         setValue(8, (byte) (particles ? 1 : 0)); | ||||
|         sendData(8); | ||||
|     } | ||||
|  | ||||
|     private void sendPotionEffects() { | ||||
|         setValue(7, getPotions()); | ||||
|         sendData(7); | ||||
|     } | ||||
|  | ||||
|     private int getPotions() { | ||||
|         int m = 3694022; | ||||
|  | ||||
| @@ -131,6 +102,35 @@ public class LivingWatcher extends FlagWatcher { | ||||
|         return (int) f1 << 16 | (int) f2 << 8 | (int) f3; | ||||
|     } | ||||
|  | ||||
|     public boolean hasCustomName() { | ||||
|         return getCustomName().length() > 0; | ||||
|     } | ||||
|  | ||||
|     public boolean hasPotionEffect(PotionEffectType type) { | ||||
|         return potionEffects.contains(type.getId()); | ||||
|     } | ||||
|  | ||||
|     public boolean isCustomNameVisible() { | ||||
|         return (Byte) getValue(11, (byte) 0) == 1; | ||||
|     } | ||||
|  | ||||
|     public void removePotionEffect(PotionEffectType type) { | ||||
|         if (potionEffects.contains(type.getId())) { | ||||
|             potionEffects.remove(type.getId()); | ||||
|             sendPotionEffects(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void removePotionParticles(boolean particles) { | ||||
|         setValue(8, (byte) (particles ? 1 : 0)); | ||||
|         sendData(8); | ||||
|     } | ||||
|  | ||||
|     private void sendPotionEffects() { | ||||
|         setValue(7, getPotions()); | ||||
|         sendData(7); | ||||
|     } | ||||
|  | ||||
|     public void setCustomName(String name) { | ||||
|         if (name.length() > 64) | ||||
|             name = name.substring(0, 64); | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| package me.libraryaddict.disguise; | ||||
| package me.libraryaddict.disguise.utils; | ||||
| 
 | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.ArrayList; | ||||
							
								
								
									
										138
									
								
								src/me/libraryaddict/disguise/utils/DisguiseUtilities.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								src/me/libraryaddict/disguise/utils/DisguiseUtilities.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | ||||
| package me.libraryaddict.disguise.utils; | ||||
|  | ||||
| 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 org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| 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 DisguiseUtilities { | ||||
|     // Store the entity IDs instead of entitys because then I can disguise entitys even before they exist | ||||
|     private static HashMap<Integer, Disguise> disguises = new HashMap<Integer, Disguise>(); | ||||
|     // A internal storage of fake entity ID's I can use. | ||||
|     // Realistically I could probably use a ID like "4" for everyone, seeing as no one shares the ID | ||||
|     private static HashMap<Integer, Integer> selfDisguisesIds = new HashMap<Integer, Integer>(); | ||||
|  | ||||
|     public static HashMap<Integer, Disguise> getDisguises() { | ||||
|         return disguises; | ||||
|     } | ||||
|  | ||||
|     public static HashMap<Integer, Integer> getSelfDisguisesIds() { | ||||
|         return selfDisguisesIds; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param Resends | ||||
|      *            the entity to all the watching players, which is where the magic begins | ||||
|      */ | ||||
|     public static void refreshTrackers(Entity entity) { | ||||
|         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")); | ||||
|                 HashSet cloned = (HashSet) trackedPlayers.clone(); | ||||
|                 for (Object player : cloned) { | ||||
|                     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(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void removeSelfDisguise(Player player) { | ||||
|         if (selfDisguisesIds.containsKey(player.getEntityId())) { | ||||
|             // Send a packet to destroy the fake entity | ||||
|             PacketContainer packet = new PacketContainer(Packets.Server.DESTROY_ENTITY); | ||||
|             packet.getModifier().write(0, new int[] { selfDisguisesIds.get(player.getEntityId()) }); | ||||
|             try { | ||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|             // Remove the fake entity ID from the disguise bin | ||||
|             selfDisguisesIds.remove(player.getEntityId()); | ||||
|             // Get the entity tracker | ||||
|             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()); | ||||
|             packetMetadata.getWatchableCollectionModifier().write(0, | ||||
|                     WrappedDataWatcher.getEntityWatcher(player).getWatchableObjects()); | ||||
|             try { | ||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packetMetadata); | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|             player.updateInventory(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Setup it so he can see himself when disguised | ||||
|      */ | ||||
|     public static void setupFakeDisguise(final Disguise disguise) { | ||||
|         // If the disguises entity is null, or the disguised entity isn't a player return | ||||
|         if (disguise.getEntity() == null || !(disguise.getEntity() instanceof Player) || !disguises.containsValue(disguise)) | ||||
|             return; | ||||
|         Player player = (Player) disguise.getEntity(); | ||||
|         // Remove the old disguise, else we have weird disguises around the place | ||||
|         DisguiseUtilities.removeSelfDisguise(player); | ||||
|         // If the disguised player can't see himself. Return | ||||
|         if (!disguise.isSelfDisguiseVisible() || !PacketsManager.isViewDisguisesListenerEnabled() || player.getVehicle() != null) | ||||
|             return; | ||||
|         try { | ||||
|             // Grab the entity ID the fake disguise will use | ||||
|             Field field = ReflectionManager.getNmsClass("Entity").getDeclaredField("entityCount"); | ||||
|             field.setAccessible(true); | ||||
|             int id = field.getInt(null); | ||||
|             // Set the entitycount plus one so we don't have the id being reused | ||||
|             field.set(null, id + 1); | ||||
|             selfDisguisesIds.put(player.getEntityId(), id); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         PacketsManager.sendSelfDisguise(player); | ||||
|         if (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf()) { | ||||
|             if (PacketsManager.isInventoryListenerEnabled()) { | ||||
|                 player.updateInventory(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| package me.libraryaddict.disguise; | ||||
| package me.libraryaddict.disguise.utils; | ||||
| 
 | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| @@ -8,6 +8,8 @@ import java.util.Iterator; | ||||
| import java.util.List; | ||||
| import java.util.Random; | ||||
| 
 | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseSound; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| @@ -50,7 +52,6 @@ import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||
| 
 | ||||
| public class PacketsManager { | ||||
|     private static boolean cancelSound; | ||||
|     private static DisguiseAPI disguiseAPI = new DisguiseAPI(); | ||||
|     private static PacketListener inventoryListenerClient; | ||||
|     private static PacketListener inventoryListenerServer; | ||||
|     private static boolean inventoryModifierEnabled; | ||||
| @@ -60,7 +61,7 @@ public class PacketsManager { | ||||
|     private static PacketListener viewDisguisesListener; | ||||
|     private static boolean viewDisguisesListenerEnabled; | ||||
| 
 | ||||
|     protected static void addPacketListeners(final JavaPlugin libsDisguises) { | ||||
|     public static void addPacketListeners(JavaPlugin libsDisguises) { | ||||
|         ProtocolManager manager = ProtocolLibrary.getProtocolManager(); | ||||
|         manager.addPacketListener(new PacketAdapter(libsDisguises, ConnectionSide.SERVER_SIDE, ListenerPriority.HIGH, | ||||
|                 Packets.Server.NAMED_ENTITY_SPAWN, Packets.Server.ENTITY_METADATA, Packets.Server.ARM_ANIMATION, | ||||
| @@ -385,7 +386,7 @@ public class PacketsManager { | ||||
|     /** | ||||
|      * Creates the packet listeners | ||||
|      */ | ||||
|     protected static void init(LibsDisguises plugin) { | ||||
|     public static void init(LibsDisguises plugin) { | ||||
|         libsDisguises = plugin; | ||||
|         soundsListener = new PacketAdapter(libsDisguises, ConnectionSide.SERVER_SIDE, ListenerPriority.NORMAL, | ||||
|                 Packets.Server.NAMED_SOUND_EFFECT, Packets.Server.ENTITY_STATUS) { | ||||
| @@ -451,7 +452,7 @@ public class PacketsManager { | ||||
|                     Disguise disguise = DisguiseAPI.getDisguise(disguisedEntity); | ||||
|                     if (disguise != null) { | ||||
|                         if (disguise.canHearSelfDisguise() || disguisedEntity != event.getPlayer()) { | ||||
|                             if (disguise.replaceSounds()) { | ||||
|                             if (disguise.isSoundsReplaced()) { | ||||
|                                 String sound = null; | ||||
|                                 DisguiseSound dSound = DisguiseSound.getType(disguise.getType().name()); | ||||
|                                 if (dSound != null && soundType != null) | ||||
| @@ -694,7 +695,7 @@ public class PacketsManager { | ||||
|                 if (event.getPlayer().getVehicle() == null && event.getPacket().getIntegers().read(0) == 0) { | ||||
|                     Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer()); | ||||
|                     // If the player is disguised, views self disguises and is hiding a item. | ||||
|                     if (disguise != null && disguise.viewSelfDisguise() | ||||
|                     if (disguise != null && disguise.isSelfDisguiseVisible() | ||||
|                             && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { | ||||
|                         switch (event.getPacketID()) { | ||||
|                         // If the server is setting the slot | ||||
| @@ -785,7 +786,7 @@ public class PacketsManager { | ||||
|                 if (event.getPlayer().getVehicle() == null) { | ||||
|                     Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer()); | ||||
|                     // If player is disguised, views self disguises and has a inventory modifier | ||||
|                     if (disguise != null && disguise.viewSelfDisguise() | ||||
|                     if (disguise != null && disguise.isSelfDisguiseVisible() | ||||
|                             && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { | ||||
|                         switch (event.getPacketID()) { | ||||
|                         // If they are in creative and clicked on a slot | ||||
| @@ -1089,7 +1090,7 @@ public class PacketsManager { | ||||
|             for (Player player : Bukkit.getOnlinePlayers()) { | ||||
|                 Disguise disguise = DisguiseAPI.getDisguise(player); | ||||
|                 if (disguise != null) { | ||||
|                     if (viewDisguisesListenerEnabled && disguise.viewSelfDisguise() | ||||
|                     if (viewDisguisesListenerEnabled && disguise.isSelfDisguiseVisible() | ||||
|                             && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { | ||||
|                         player.updateInventory(); | ||||
|                     } | ||||
| @@ -1109,11 +1110,11 @@ public class PacketsManager { | ||||
|             for (Player player : Bukkit.getOnlinePlayers()) { | ||||
|                 Disguise disguise = DisguiseAPI.getDisguise(player); | ||||
|                 if (disguise != null) { | ||||
|                     if (disguise.viewSelfDisguise()) { | ||||
|                     if (disguise.isSelfDisguiseVisible()) { | ||||
|                         if (enabled) { | ||||
|                             disguiseAPI.setupFakeDisguise(disguise); | ||||
|                             DisguiseUtilities.setupFakeDisguise(disguise); | ||||
|                         } else { | ||||
|                             disguiseAPI.removeVisibleDisguise(player); | ||||
|                             DisguiseUtilities.removeSelfDisguise(player); | ||||
|                         } | ||||
|                         if (inventoryModifierEnabled && (disguise.isHidingArmorFromSelf() || disguise.isHidingHeldItemFromSelf())) { | ||||
|                             player.updateInventory(); | ||||
| @@ -1,4 +1,4 @@ | ||||
| package me.libraryaddict.disguise; | ||||
| package me.libraryaddict.disguise.utils; | ||||
| 
 | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.Method; | ||||
| @@ -45,40 +45,6 @@ public class ReflectionManager { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static String getEnumArt(Art art) { | ||||
|         try { | ||||
|             Class craftArt = Class.forName("org.bukkit.craftbukkit." + bukkitVersion + ".CraftArt"); | ||||
|             Object enumArt = craftArt.getMethod("BukkitToNotch", Art.class).invoke(null, art); | ||||
|             for (Field field : enumArt.getClass().getFields()) { | ||||
|                 if (field.getType() == String.class) { | ||||
|                     return (String) field.get(enumArt); | ||||
|                 } | ||||
|             } | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         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 = getCraftClass("CraftSound"); | ||||
|             return (String) c.getMethod("getSound", Sound.class).invoke(null, sound); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Object createEntityInstance(String entityName) { | ||||
|         try { | ||||
|             Class entityClass = getNmsClass("Entity" + entityName); | ||||
| @@ -101,6 +67,49 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static ItemStack getBukkitItem(Object nmsItem) { | ||||
|         try { | ||||
|             return (ItemStack) itemClass.getMethod("asBukkitCopy", getNmsClass("ItemStack")).invoke(null, nmsItem); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         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 String getCraftSound(Sound sound) { | ||||
|         try { | ||||
|             Class c = getCraftClass("CraftSound"); | ||||
|             return (String) c.getMethod("getSound", Sound.class).invoke(null, sound); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static String getEnumArt(Art art) { | ||||
|         try { | ||||
|             Class craftArt = Class.forName("org.bukkit.craftbukkit." + bukkitVersion + ".CraftArt"); | ||||
|             Object enumArt = craftArt.getMethod("BukkitToNotch", Art.class).invoke(null, art); | ||||
|             for (Field field : enumArt.getClass().getFields()) { | ||||
|                 if (field.getType() == String.class) { | ||||
|                     return (String) field.get(enumArt); | ||||
|                 } | ||||
|             } | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Class getNmsClass(String className) { | ||||
|         try { | ||||
|             return Class.forName("net.minecraft.server." + bukkitVersion + "." + className); | ||||
| @@ -110,9 +119,18 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Class getCraftClass(String className) { | ||||
|     public static Object getNmsEntity(Entity entity) { | ||||
|         try { | ||||
|             return Class.forName("org.bukkit.craftbukkit." + bukkitVersion + "." + className); | ||||
|             return getCraftClass("entity.CraftEntity").getMethod("getHandle").invoke(entity); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Object getNmsItem(ItemStack itemstack) { | ||||
|         try { | ||||
|             return itemClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, itemstack); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
| @@ -137,22 +155,4 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Object getNmsItem(ItemStack itemstack) { | ||||
|         try { | ||||
|             return itemClass.getMethod("asNMSCopy", ItemStack.class).invoke(null, itemstack); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static ItemStack getBukkitItem(Object nmsItem) { | ||||
|         try { | ||||
|             return (ItemStack) itemClass.getMethod("asBukkitCopy", getNmsClass("ItemStack")).invoke(null, nmsItem); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| package me.libraryaddict.disguise; | ||||
| package me.libraryaddict.disguise.utils; | ||||
| 
 | ||||
| import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
		Reference in New Issue
	
	Block a user