- Changed entire project to gradle
- Updated for 1.8.3 - No more errors, woo
This commit is contained in:
		| @@ -15,7 +15,6 @@ import me.libraryaddict.disguise.commands.*; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.FutureDisguiseType; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.GuardianWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher; | ||||
| @@ -26,11 +25,9 @@ import me.libraryaddict.disguise.disguisetypes.watchers.TameableWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseSound; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.FakeBoundingBox; | ||||
| import me.libraryaddict.disguise.utilities.PacketsManager; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseValues; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; | ||||
| 
 | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.entity.Ageable; | ||||
| @@ -154,7 +151,7 @@ public class LibsDisguises extends JavaPlugin { | ||||
|      */ | ||||
|     private void registerValues() { | ||||
|         for (DisguiseType disguiseType : DisguiseType.values()) { | ||||
|             if (disguiseType.getEntityType() == null && !(disguiseType.is1_8() && LibVersion.is1_8())) { | ||||
|             if (disguiseType.getEntityType() == null) { | ||||
|                 continue; | ||||
|             } | ||||
|             Class watcherClass = null; | ||||
| @@ -209,25 +206,6 @@ public class LibsDisguises extends JavaPlugin { | ||||
|             if (DisguiseValues.getDisguiseValues(disguiseType) != null) { | ||||
|                 continue; | ||||
|             } | ||||
|             if (disguiseType.is1_8()) { | ||||
|                 int entitySize = 0; | ||||
|                 FutureDisguiseType futureType = disguiseType.getFutureType(); | ||||
|                 DisguiseValues disguiseValues = new DisguiseValues(disguiseType, null, entitySize, futureType.getMaxHealth()); | ||||
|                 Object[] objs = disguiseType.getFutureType().getDataWatcher(); | ||||
|                 for (int i = 0; i < objs.length; i += 2) { | ||||
|                     disguiseValues.setMetaValue((Integer) objs[i], objs[i + 1]); | ||||
|                 } | ||||
| 
 | ||||
|                 // Get the bounding box | ||||
|                 float[] box = futureType.getBoundingBox(); | ||||
|                 disguiseValues.setAdultBox(new FakeBoundingBox(box[0], box[1], box[2])); | ||||
|                 /*     if (disguiseType == DisguiseType.RABBIT) { | ||||
|                          ((Ageable) bukkitEntity).setBaby(); | ||||
|                          disguiseValues.setBabyBox(ReflectionManager.getBoundingBox(bukkitEntity)); | ||||
|                      } | ||||
|                      disguiseValues.setEntitySize(ReflectionManager.getSize(bukkitEntity));*/ | ||||
|                 continue; | ||||
|             } | ||||
|             String nmsEntityName = toReadable(disguiseType.name()); | ||||
|             switch (disguiseType) { | ||||
|             case WITHER_SKELETON: | ||||
| @@ -264,6 +242,9 @@ public class LibsDisguises extends JavaPlugin { | ||||
|             case LEASH_HITCH: | ||||
|                 nmsEntityName = "Leash"; | ||||
|                 break; | ||||
|             case ELDER_GUARDIAN: | ||||
|                 nmsEntityName = "Guardian"; | ||||
|                 break; | ||||
|             default: | ||||
|                 break; | ||||
|             } | ||||
| @@ -64,7 +64,7 @@ public abstract class Disguise { | ||||
|     protected void createDisguise(DisguiseType newType) { | ||||
|         if (getWatcher() != null) | ||||
|             return; | ||||
|         if (!(LibVersion.is1_8() && newType.is1_8()) && newType.getEntityType() == null) { | ||||
|         if (newType.getEntityType() == null) { | ||||
|             throw new RuntimeException( | ||||
|                     "DisguiseType " | ||||
|                             + newType | ||||
| @@ -101,7 +101,7 @@ public abstract class Disguise { | ||||
|         } | ||||
| 
 | ||||
|         else if (getType() == DisguiseType.ELDER_GUARDIAN) { | ||||
|             getWatcher().setValue(14, 0 | 4); | ||||
|             getWatcher().setValue(16, 0 | 4); | ||||
|         } | ||||
|         // Else if its a horse. Set the horse watcher type | ||||
|         else if (getWatcher() instanceof HorseWatcher) { | ||||
| @@ -2,17 +2,16 @@ package me.libraryaddict.disguise.disguisetypes; | ||||
| 
 | ||||
| import java.lang.reflect.Method; | ||||
| 
 | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; | ||||
| 
 | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.entity.Guardian; | ||||
| import org.bukkit.entity.Horse; | ||||
| import org.bukkit.entity.Skeleton; | ||||
| import org.bukkit.entity.Zombie; | ||||
| 
 | ||||
| public enum DisguiseType { | ||||
|     ARMOR_STAND(FutureDisguiseType.ARMOR_STAND), | ||||
|     ARMOR_STAND(78), | ||||
| 
 | ||||
|     ARROW(60), | ||||
| 
 | ||||
| @@ -36,7 +35,7 @@ public enum DisguiseType { | ||||
| 
 | ||||
|     EGG(62), | ||||
| 
 | ||||
|     ELDER_GUARDIAN(FutureDisguiseType.ELDER_GUARDIAN), | ||||
|     ELDER_GUARDIAN, | ||||
| 
 | ||||
|     ENDER_CRYSTAL(51), | ||||
| 
 | ||||
| @@ -48,7 +47,7 @@ public enum DisguiseType { | ||||
| 
 | ||||
|     ENDERMAN, | ||||
| 
 | ||||
|     ENDERMITE(FutureDisguiseType.ENDERMITE), | ||||
|     ENDERMITE, | ||||
| 
 | ||||
|     EXPERIENCE_ORB, | ||||
| 
 | ||||
| @@ -64,7 +63,7 @@ public enum DisguiseType { | ||||
| 
 | ||||
|     GIANT, | ||||
| 
 | ||||
|     GUARDIAN(FutureDisguiseType.GUARDIAN), | ||||
|     GUARDIAN, | ||||
| 
 | ||||
|     HORSE, | ||||
| 
 | ||||
| @@ -106,7 +105,7 @@ public enum DisguiseType { | ||||
| 
 | ||||
|     PRIMED_TNT(50), | ||||
| 
 | ||||
|     RABBIT(FutureDisguiseType.RABBIT), | ||||
|     RABBIT, | ||||
| 
 | ||||
|     SHEEP, | ||||
| 
 | ||||
| @@ -150,7 +149,7 @@ public enum DisguiseType { | ||||
| 
 | ||||
|     ZOMBIE_VILLAGER; | ||||
| 
 | ||||
|     private static Method isVillager, getVariant, getSkeletonType; | ||||
|     private static Method isVillager, getVariant, getSkeletonType, isElder; | ||||
| 
 | ||||
|     static { | ||||
|         // We set the entity type in this so that we can safely ignore disguisetypes which don't exist in older versions of MC. | ||||
| @@ -175,6 +174,9 @@ public enum DisguiseType { | ||||
|                 case WITHER_SKELETON: | ||||
|                     toUse = DisguiseType.SKELETON; | ||||
|                     break; | ||||
|                 case ELDER_GUARDIAN: | ||||
|                     toUse = DisguiseType.GUARDIAN; | ||||
|                     break; | ||||
|                 default: | ||||
|                     break; | ||||
|                 } | ||||
| @@ -196,6 +198,10 @@ public enum DisguiseType { | ||||
|             getSkeletonType = Skeleton.class.getMethod("getSkeletonType"); | ||||
|         } catch (Throwable ignored) { | ||||
|         } | ||||
|         try { | ||||
|             isElder = Guardian.class.getMethod("isElder"); | ||||
|         } catch (Throwable ignored) { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static DisguiseType getType(Entity entity) { | ||||
| @@ -228,6 +234,15 @@ public enum DisguiseType { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|             break; | ||||
|         case GUARDIAN: | ||||
|             try { | ||||
|                 if ((Boolean) isElder.invoke(entity)) { | ||||
|                     disguiseType = DisguiseType.ELDER_GUARDIAN; | ||||
|                 } | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|             break; | ||||
|         default: | ||||
|             break; | ||||
|         } | ||||
| @@ -244,10 +259,9 @@ public enum DisguiseType { | ||||
| 
 | ||||
|     private int defaultId, entityId; | ||||
|     private EntityType entityType; | ||||
|     private FutureDisguiseType futureType; | ||||
|     private Class<? extends FlagWatcher> watcherClass; | ||||
| 
 | ||||
|     private DisguiseType(FutureDisguiseType disguiseType, int... ints) { | ||||
|     private DisguiseType(int... ints) { | ||||
|         for (int i = 0; i < ints.length; i++) { | ||||
|             int value = ints[i]; | ||||
|             switch (i) { | ||||
| @@ -261,13 +275,6 @@ public enum DisguiseType { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         if (LibVersion.is1_8()) { | ||||
|             futureType = disguiseType; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private DisguiseType(int... ints) { | ||||
|         this(null, ints); | ||||
|     } | ||||
| 
 | ||||
|     public int getDefaultId() { | ||||
| @@ -275,9 +282,6 @@ public enum DisguiseType { | ||||
|     } | ||||
| 
 | ||||
|     public Class<? extends Entity> getEntityClass() { | ||||
|         if (futureType != null) { | ||||
|             return futureType.getEntityClass(); | ||||
|         } | ||||
|         if (entityType != null) { | ||||
|             return getEntityType().getEntityClass(); | ||||
|         } | ||||
| @@ -292,28 +296,20 @@ public enum DisguiseType { | ||||
|         return entityType; | ||||
|     } | ||||
| 
 | ||||
|     public FutureDisguiseType getFutureType() { | ||||
|         return futureType; | ||||
|     } | ||||
| 
 | ||||
|     public int getTypeId() { | ||||
|         return is1_8() ? futureType.getEntityId() : (int) getEntityType().getTypeId(); | ||||
|         return (int) getEntityType().getTypeId(); | ||||
|     } | ||||
| 
 | ||||
|     public Class getWatcherClass() { | ||||
|         return watcherClass; | ||||
|     } | ||||
| 
 | ||||
|     public boolean is1_8() { | ||||
|         return futureType != null; | ||||
|     } | ||||
| 
 | ||||
|     public boolean isMisc() { | ||||
|         return is1_8() ? !futureType.isAlive() : getEntityType() != null && !getEntityType().isAlive(); | ||||
|         return getEntityType() != null && !getEntityType().isAlive(); | ||||
|     } | ||||
| 
 | ||||
|     public boolean isMob() { | ||||
|         return is1_8() ? futureType.isAlive() : getEntityType() != null && getEntityType().isAlive() && !isPlayer(); | ||||
|         return getEntityType() != null && getEntityType().isAlive() && !isPlayer(); | ||||
|     } | ||||
| 
 | ||||
|     public boolean isPlayer() { | ||||
| @@ -158,7 +158,7 @@ public class FlagWatcher { | ||||
|     } | ||||
| 
 | ||||
|     public String getCustomName() { | ||||
|         return (String) getValue(10, null); | ||||
|         return (String) getValue(2, null); | ||||
|     } | ||||
| 
 | ||||
|     protected TargetedDisguise getDisguise() { | ||||
| @@ -207,7 +207,7 @@ public class FlagWatcher { | ||||
|     } | ||||
| 
 | ||||
|     public boolean isCustomNameVisible() { | ||||
|         return (Byte) getValue(11, (byte) 0) == 1; | ||||
|         return (Byte) getValue(3, (byte) 0) == 1; | ||||
|     } | ||||
| 
 | ||||
|     public boolean isEntityAnimationsAdded() { | ||||
| @@ -296,13 +296,13 @@ public class FlagWatcher { | ||||
|         if (name != null && name.length() > 64) { | ||||
|             name = name.substring(0, 64); | ||||
|         } | ||||
|         setValue(10, name); | ||||
|         sendData(10); | ||||
|         setValue(2, name); | ||||
|         sendData(2); | ||||
|     } | ||||
| 
 | ||||
|     public void setCustomNameVisible(boolean display) { | ||||
|         setValue(11, (byte) (display ? 1 : 0)); | ||||
|         sendData(11); | ||||
|         setValue(3, (byte) (display ? 1 : 0)); | ||||
|         sendData(3); | ||||
|     } | ||||
| 
 | ||||
|     private void setFlag(int byteValue, boolean flag) { | ||||
| @@ -153,32 +153,30 @@ public class PlayerDisguise extends TargetedDisguise { | ||||
|     } | ||||
| 
 | ||||
|     public PlayerDisguise setSkin(String skinToUse) { | ||||
|         if (LibVersion.is1_7_6()) { | ||||
|             this.skinToUse = skinToUse; | ||||
|             if (skinToUse == null) { | ||||
|                 this.currentLookup = null; | ||||
|                 this.gameProfile = null; | ||||
|             } else { | ||||
|                 if (skinToUse.length() > 16) { | ||||
|                     this.skinToUse = skinToUse.substring(0, 16); | ||||
|                 } | ||||
|                 currentLookup = new LibsProfileLookup() { | ||||
|         this.skinToUse = skinToUse; | ||||
|         if (skinToUse == null) { | ||||
|             this.currentLookup = null; | ||||
|             this.gameProfile = null; | ||||
|         } else { | ||||
|             if (skinToUse.length() > 16) { | ||||
|                 this.skinToUse = skinToUse.substring(0, 16); | ||||
|             } | ||||
|             currentLookup = new LibsProfileLookup() { | ||||
| 
 | ||||
|                     @Override | ||||
|                     public void onLookup(WrappedGameProfile gameProfile) { | ||||
|                         if (currentLookup == this && gameProfile != null) { | ||||
|                             setSkin(gameProfile); | ||||
|                             if (!gameProfile.getProperties().isEmpty() && DisguiseUtilities.isDisguiseInUse(PlayerDisguise.this)) { | ||||
|                                 DisguiseUtilities.refreshTrackers(PlayerDisguise.this); | ||||
|                             } | ||||
|                             currentLookup = null; | ||||
|                 @Override | ||||
|                 public void onLookup(WrappedGameProfile gameProfile) { | ||||
|                     if (currentLookup == this && gameProfile != null) { | ||||
|                         setSkin(gameProfile); | ||||
|                         if (!gameProfile.getProperties().isEmpty() && DisguiseUtilities.isDisguiseInUse(PlayerDisguise.this)) { | ||||
|                             DisguiseUtilities.refreshTrackers(PlayerDisguise.this); | ||||
|                         } | ||||
|                         currentLookup = null; | ||||
|                     } | ||||
|                 }; | ||||
|                 WrappedGameProfile gameProfile = DisguiseUtilities.getProfileFromMojang(this.skinToUse, currentLookup); | ||||
|                 if (gameProfile != null) { | ||||
|                     setSkin(gameProfile); | ||||
|                 } | ||||
|             }; | ||||
|             WrappedGameProfile gameProfile = DisguiseUtilities.getProfileFromMojang(this.skinToUse, currentLookup); | ||||
|             if (gameProfile != null) { | ||||
|                 setSkin(gameProfile); | ||||
|             } | ||||
|         } | ||||
|         return this; | ||||
| @@ -17,7 +17,7 @@ public class AgeableWatcher extends LivingWatcher { | ||||
|     } | ||||
| 
 | ||||
|     public boolean isBaby() { | ||||
|         return (Integer) getValue(12, 0) < 0; | ||||
|         return ((Byte) getValue(12, (byte) 0)).intValue() < 0; | ||||
|     } | ||||
| 
 | ||||
|     public void setAdult() { | ||||
| @@ -25,7 +25,7 @@ public class AgeableWatcher extends LivingWatcher { | ||||
|     } | ||||
| 
 | ||||
|     public void setAge(int newAge) { | ||||
|         setValue(12, newAge); | ||||
|         setValue(12, (byte) newAge); | ||||
|         sendData(12); | ||||
|     } | ||||
| 
 | ||||
| @@ -34,7 +34,7 @@ public class AgeableWatcher extends LivingWatcher { | ||||
|     } | ||||
| 
 | ||||
|     public void setBaby(boolean isBaby) { | ||||
|         setValue(12, isBaby ? -24000 : 0); | ||||
|         setValue(12, (byte) (isBaby ? -1 : 0)); | ||||
|         sendData(12); | ||||
|     } | ||||
| 
 | ||||
| @@ -36,7 +36,7 @@ public class EndermanWatcher extends LivingWatcher { | ||||
| 
 | ||||
|     @Override | ||||
|     public void setItemInHand(ItemStack itemstack) { | ||||
|         setValue(16, (byte) (itemstack.getTypeId() & 255)); | ||||
|         setValue(16, (short) (itemstack.getTypeId() & 255)); | ||||
|         setValue(17, (byte) (itemstack.getDurability() & 255)); | ||||
|     } | ||||
| 
 | ||||
| @@ -13,11 +13,11 @@ public class ItemFrameWatcher extends FlagWatcher { | ||||
|     public ItemStack getItem() { | ||||
|         if (getValue(2, null) == null) | ||||
|             return new ItemStack(0); | ||||
|         return (ItemStack) getValue(2, null); | ||||
|         return (ItemStack) getValue(8, null); | ||||
|     } | ||||
| 
 | ||||
|     public int getRotation() { | ||||
|         return (Integer) getValue(3, 0); | ||||
|         return (Integer) getValue(9, 0); | ||||
|     } | ||||
| 
 | ||||
|     public void setItem(ItemStack newItem) { | ||||
| @@ -25,13 +25,13 @@ public class ItemFrameWatcher extends FlagWatcher { | ||||
|             newItem = new ItemStack(0); | ||||
|         newItem = newItem.clone(); | ||||
|         newItem.setAmount(1); | ||||
|         setValue(2, newItem); | ||||
|         sendData(2); | ||||
|         setValue(8, newItem); | ||||
|         sendData(8); | ||||
|     } | ||||
| 
 | ||||
|     public void setRotation(int rotation) { | ||||
|         setValue(3, (byte) (rotation % 4)); | ||||
|         sendData(3); | ||||
|         setValue(9, (byte) (rotation % 4)); | ||||
|         sendData(9); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @@ -110,7 +110,7 @@ public class PlayerWatcher extends LivingWatcher { | ||||
|                         PacketContainer packet = new PacketContainer(PacketType.Play.Server.ANIMATION); | ||||
|                         StructureModifier<Integer> mods = packet.getIntegers(); | ||||
|                         mods.write(0, getDisguise().getEntity().getEntityId()); | ||||
|                         mods.write(1, LibVersion.is1_7() ? 3 : 2); | ||||
|                         mods.write(1, 3); | ||||
|                         for (Player player : DisguiseUtilities.getPerverts(getDisguise())) { | ||||
|                             ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); | ||||
| 
 | ||||
| @@ -339,7 +339,7 @@ public abstract class BaseDisguiseCommand implements CommandExecutor { | ||||
|                 throw new DisguiseParseException(ChatColor.RED + "Error! The disguise " + ChatColor.GREEN + args[0] | ||||
|                         + ChatColor.RED + " doesn't exist!"); | ||||
|             } | ||||
|             if (!(LibVersion.is1_8() && disguiseType.is1_8()) && disguiseType.getEntityType() == null) { | ||||
|             if (disguiseType.getEntityType() == null) { | ||||
|                 throw new DisguiseParseException(ChatColor.RED + "Error! This version of minecraft does not have that disguise!"); | ||||
|             } | ||||
|             if (!map.containsKey(disguiseType)) { | ||||
| @@ -66,8 +66,7 @@ public enum DisguiseSound { | ||||
| 
 | ||||
|     PIG_ZOMBIE("mob.zombiepig.zpighurt", null, "mob.zombiepig.zpigdeath", "mob.zombiepig.zpig", "mob.zombiepig.zpigangry"), | ||||
| 
 | ||||
|     PLAYER(LibVersion.is1_7() ? "game.player.hurt" : "damage.hit", "step.grass", LibVersion.is1_7() ? "game.player.hurt" | ||||
|             : "damage.hit", null), | ||||
|     PLAYER("game.player.hurt", "step.grass", "game.player.hurt", null), | ||||
| 
 | ||||
|     RABBIT("mob.rabbit.hurt", "mob.rabbit.hop", "mob.rabbit.death", "mob.rabbit.idle"), | ||||
| 
 | ||||
| @@ -23,13 +23,9 @@ import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.TargetedDisguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.EndermanWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.ItemFrameWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.MinecartWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; | ||||
| 
 | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.Location; | ||||
| @@ -41,6 +37,7 @@ import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.entity.Zombie; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| import org.bukkit.potion.PotionEffect; | ||||
| import org.bukkit.scheduler.BukkitRunnable; | ||||
| import org.bukkit.util.Vector; | ||||
| 
 | ||||
| @@ -97,30 +94,15 @@ public class DisguiseUtilities { | ||||
|                 block = ((Object[]) ReflectionManager.getNmsField(ReflectionManager.getNmsClass("Block"), "byId").get(null))[Material.BED_BLOCK | ||||
|                         .getId()]; | ||||
|             } | ||||
| 
 | ||||
|             if (LibVersion.is1_8()) { | ||||
|                 Method fromLegacyData = block.getClass().getMethod("fromLegacyData", int.class); | ||||
|                 Method setType = chunkSection.getClass().getMethod("setType", int.class, int.class, int.class, | ||||
|                         ReflectionManager.getNmsClass("IBlockData")); | ||||
|                 Method setSky = chunkSection.getClass().getMethod("a", int.class, int.class, int.class, int.class); | ||||
|                 Method setEmitted = chunkSection.getClass().getMethod("b", int.class, int.class, int.class, int.class); | ||||
|                 for (BlockFace face : new BlockFace[] { BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH }) { | ||||
|                     setType.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), fromLegacyData.invoke(block, face.ordinal())); | ||||
|                     setSky.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), 0); | ||||
|                     setEmitted.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), 0); | ||||
|                 } | ||||
|             } else { | ||||
|                 Method setId = chunkSection.getClass().getMethod("setTypeId", int.class, int.class, int.class, | ||||
|                         ReflectionManager.getNmsClass("Block")); | ||||
|                 Method setData = chunkSection.getClass().getMethod("setData", int.class, int.class, int.class, int.class); | ||||
|                 Method setSky = chunkSection.getClass().getMethod("setSkyLight", int.class, int.class, int.class, int.class); | ||||
|                 Method setEmitted = chunkSection.getClass().getMethod("setEmittedLight", int.class, int.class, int.class, int.class); | ||||
|                 for (BlockFace face : new BlockFace[] { BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH }) { | ||||
|                     setId.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), block); | ||||
|                     setData.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), face.ordinal()); | ||||
|                     setSky.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), 0); | ||||
|                     setEmitted.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), 0); | ||||
|                 } | ||||
|             Method fromLegacyData = block.getClass().getMethod("fromLegacyData", int.class); | ||||
|             Method setType = chunkSection.getClass().getMethod("setType", int.class, int.class, int.class, | ||||
|                     ReflectionManager.getNmsClass("IBlockData")); | ||||
|             Method setSky = chunkSection.getClass().getMethod("a", int.class, int.class, int.class, int.class); | ||||
|             Method setEmitted = chunkSection.getClass().getMethod("b", int.class, int.class, int.class, int.class); | ||||
|             for (BlockFace face : new BlockFace[] { BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH }) { | ||||
|                 setType.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), fromLegacyData.invoke(block, face.ordinal())); | ||||
|                 setSky.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), 0); | ||||
|                 setEmitted.invoke(chunkSection, 1 + face.getModX(), 0, 1 + face.getModZ(), 0); | ||||
|             } | ||||
| 
 | ||||
|             Object[] array = (Object[]) Array.newInstance(chunkSection.getClass(), 16); | ||||
| @@ -341,7 +323,7 @@ public class DisguiseUtilities { | ||||
|             try { | ||||
|                 packets[i] = ProtocolLibrary.getProtocolManager() | ||||
|                         .createPacketConstructor(PacketType.Play.Server.MAP_CHUNK, bedChunk, true, 0, 40) | ||||
|                         .createPacket(bedChunk, true, 0, LibVersion.is1_8() ? 48 : 0); | ||||
|                         .createPacket(bedChunk, true, 0, 48); | ||||
|             } catch (IllegalArgumentException ex) { | ||||
|                 packets[i] = ProtocolLibrary.getProtocolManager() | ||||
|                         .createPacketConstructor(PacketType.Play.Server.MAP_CHUNK, bedChunk, true, 0) | ||||
| @@ -350,15 +332,9 @@ public class DisguiseUtilities { | ||||
|             i++; | ||||
|             // Make load packets | ||||
|             if (oldLoc == null || i > 1) { | ||||
|                 try { | ||||
|                     packets[i] = ProtocolLibrary.getProtocolManager() | ||||
|                             .createPacketConstructor(PacketType.Play.Server.MAP_CHUNK_BULK, Arrays.asList(bedChunk), 40) | ||||
|                             .createPacket(Arrays.asList(bedChunk), LibVersion.is1_8() ? 48 : 0); | ||||
|                 } catch (IllegalArgumentException ex) { | ||||
|                     packets[i] = ProtocolLibrary.getProtocolManager() | ||||
|                             .createPacketConstructor(PacketType.Play.Server.MAP_CHUNK_BULK, List.class) | ||||
|                             .createPacket(Arrays.asList(bedChunk)); | ||||
|                 } | ||||
|                 packets[i] = ProtocolLibrary.getProtocolManager() | ||||
|                         .createPacketConstructor(PacketType.Play.Server.MAP_CHUNK_BULK, Arrays.asList(bedChunk)) | ||||
|                         .createPacket(Arrays.asList(bedChunk)); | ||||
|                 i++; | ||||
|             } | ||||
|         } | ||||
| @@ -370,19 +346,13 @@ public class DisguiseUtilities { | ||||
|         PacketContainer setBed = new PacketContainer(PacketType.Play.Server.BED); | ||||
|         StructureModifier<Integer> bedInts = setBed.getIntegers(); | ||||
|         bedInts.write(0, entity.getEntityId()); | ||||
|         if (LibVersion.is1_8()) { | ||||
|             PlayerWatcher watcher = disguise.getWatcher(); | ||||
|             int chunkX = (int) Math.floor(playerLocation.getX() / 16D) - 17, chunkZ = (int) Math | ||||
|                     .floor(playerLocation.getZ() / 16D) - 17; | ||||
|             chunkX -= chunkX % 8; | ||||
|             chunkZ -= chunkZ % 8; | ||||
|             bedInts.write(1, (chunkX * 16) + 1 + watcher.getSleepingDirection().getModX()); | ||||
|             bedInts.write(3, (chunkZ * 16) + 1 + watcher.getSleepingDirection().getModZ()); | ||||
|         } else { | ||||
|             bedInts.write(1, loc.getBlockX()); | ||||
|             bedInts.write(2, loc.getBlockY()); | ||||
|             bedInts.write(3, loc.getBlockZ()); | ||||
|         } | ||||
|         PlayerWatcher watcher = disguise.getWatcher(); | ||||
|         int chunkX = (int) Math.floor(playerLocation.getX() / 16D) - 17, chunkZ = (int) Math | ||||
|                 .floor(playerLocation.getZ() / 16D) - 17; | ||||
|         chunkX -= chunkX % 8; | ||||
|         chunkZ -= chunkZ % 8; | ||||
|         bedInts.write(1, (chunkX * 16) + 1 + watcher.getSleepingDirection().getModX()); | ||||
|         bedInts.write(3, (chunkZ * 16) + 1 + watcher.getSleepingDirection().getModZ()); | ||||
|         PacketContainer teleport = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); | ||||
|         StructureModifier<Integer> ints = teleport.getIntegers(); | ||||
|         ints.write(0, entity.getEntityId()); | ||||
| @@ -495,8 +465,8 @@ public class DisguiseUtilities { | ||||
|                 } | ||||
|                 if (DisguiseAPI.isDisguiseInUse(disguise) | ||||
|                         && (!gameProfile.getName().equals( | ||||
|                                 disguise.getSkin() != null && LibVersion.is1_7_6() ? disguise.getSkin() : disguise.getName()) || (LibVersion | ||||
|                                 .is1_7_6() && !gameProfile.getProperties().isEmpty()))) { | ||||
|                                 disguise.getSkin() != null ? disguise.getSkin() : disguise.getName()) | ||||
|                                     || !gameProfile.getProperties().isEmpty())) { | ||||
|                     disguise.setGameProfile(gameProfile); | ||||
|                     DisguiseUtilities.refreshTrackers(disguise); | ||||
|                 } | ||||
| @@ -523,7 +493,7 @@ public class DisguiseUtilities { | ||||
|             Player player = Bukkit.getPlayerExact(playerName); | ||||
|             if (player != null) { | ||||
|                 WrappedGameProfile gameProfile = ReflectionManager.getGameProfile(player); | ||||
|                 if (!LibVersion.is1_7_6() || !gameProfile.getProperties().isEmpty()) { | ||||
|                 if (!gameProfile.getProperties().isEmpty()) { | ||||
|                     gameProfiles.put(playerName, gameProfile); | ||||
|                     return gameProfile; | ||||
|                 } | ||||
| @@ -536,7 +506,7 @@ public class DisguiseUtilities { | ||||
|                         final WrappedGameProfile gameProfile = lookupGameProfile(origName); | ||||
|                         Bukkit.getScheduler().runTask(libsDisguises, new Runnable() { | ||||
|                             public void run() { | ||||
|                                 if (!LibVersion.is1_7_6() || !gameProfile.getProperties().isEmpty()) { | ||||
|                                 if (!gameProfile.getProperties().isEmpty()) { | ||||
|                                     if (gameProfiles.containsKey(playerName) && gameProfiles.get(playerName) == null) { | ||||
|                                         gameProfiles.put(playerName, gameProfile); | ||||
|                                     } | ||||
| @@ -613,54 +583,17 @@ public class DisguiseUtilities { | ||||
|      */ | ||||
|     public static List<WrappedWatchableObject> rebuildForVersion(Player player, FlagWatcher watcher, | ||||
|             List<WrappedWatchableObject> list) { | ||||
|         if (!LibVersion.is1_8()) | ||||
|         if (true) // Use for future protocol compatibility | ||||
|             return list; | ||||
|         ArrayList<WrappedWatchableObject> rebuiltList = new ArrayList<WrappedWatchableObject>(); | ||||
|         ArrayList<WrappedWatchableObject> backups = new ArrayList<WrappedWatchableObject>(); | ||||
|         // TODO Player and Minecart | ||||
|         for (WrappedWatchableObject obj : list) { | ||||
|             if (obj.getValue().getClass().getName().startsWith("org.")) { | ||||
|                 backups.add(obj); | ||||
|                 continue; | ||||
|             } | ||||
|             switch (obj.getIndex()) { | ||||
|             case 2: | ||||
|             case 3: | ||||
|                 if (watcher instanceof ItemFrameWatcher) { | ||||
|                     rebuiltList.add(new WrappedWatchableObject(obj.getIndex() + 6, obj.getValue())); | ||||
|                 } else { | ||||
|                     backups.add(obj); | ||||
|                 } | ||||
|                 break; | ||||
|             case 10: | ||||
|             case 11: | ||||
|                 rebuiltList.add(new WrappedWatchableObject(obj.getIndex() - 8, obj.getValue())); | ||||
|                 break; | ||||
|             case 12: | ||||
|                 if (watcher instanceof AgeableWatcher) { | ||||
|                     int i = (Integer) obj.getValue(); | ||||
|                     rebuiltList.add(new WrappedWatchableObject(obj.getIndex(), (byte) (i < 0 ? -1 : (i >= 6000 ? 1 : 0)))); | ||||
|                 } else { | ||||
|                     backups.add(obj); | ||||
|                 } | ||||
|                 break; | ||||
|             case 16: | ||||
|                 if (watcher instanceof EndermanWatcher) { | ||||
|                     rebuiltList.add(new WrappedWatchableObject(obj.getIndex(), ((Byte) obj.getValue()).shortValue())); | ||||
|                 } else { | ||||
|                     backups.add(obj); | ||||
|                 } | ||||
|                 break; | ||||
|             case 20: | ||||
|                 if (watcher instanceof MinecartWatcher) { | ||||
|                     // TODO | ||||
|                     backups.add(obj); | ||||
|                 } else { | ||||
|                     backups.add(obj); | ||||
|                 } | ||||
|             default: | ||||
|                 backups.add(obj); | ||||
|                 break; | ||||
|             // TODO: Future version support | ||||
|             } | ||||
|         } | ||||
|         Iterator<WrappedWatchableObject> itel = backups.iterator(); | ||||
| @@ -687,6 +620,8 @@ public class DisguiseUtilities { | ||||
|                 if (disguise.isDisguiseInUse() && disguise.getEntity() instanceof Player | ||||
|                         && ((Player) disguise.getEntity()).getName().equalsIgnoreCase(player)) { | ||||
|                     removeSelfDisguise((Player) disguise.getEntity()); | ||||
|                     if (disguise.isSelfDisguiseVisible()) | ||||
|                         selfDisguised.add(disguise.getEntity().getUniqueId()); | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket((Player) disguise.getEntity(), destroyPacket); | ||||
|                     Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { | ||||
|                         public void run() { | ||||
| @@ -697,7 +632,6 @@ public class DisguiseUtilities { | ||||
|                             } | ||||
|                         } | ||||
|                     }, 2); | ||||
|                     DisguiseUtilities.sendSelfDisguise((Player) disguise.getEntity(), disguise); | ||||
|                 } else { | ||||
|                     final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); | ||||
|                     if (entityTrackerEntry != null) { | ||||
| @@ -781,6 +715,7 @@ public class DisguiseUtilities { | ||||
|             try { | ||||
|                 if (selfDisguised.contains(disguise.getEntity().getUniqueId()) && disguise.isDisguiseInUse()) { | ||||
|                     removeSelfDisguise((Player) disguise.getEntity()); | ||||
|                     selfDisguised.add(disguise.getEntity().getUniqueId()); | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket((Player) disguise.getEntity(), destroyPacket); | ||||
|                     Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { | ||||
|                         public void run() { | ||||
| @@ -850,8 +785,7 @@ public class DisguiseUtilities { | ||||
|     public static void removeSelfDisguise(Player player) { | ||||
|         if (selfDisguised.contains(player.getUniqueId())) { | ||||
|             // Send a packet to destroy the fake entity | ||||
|             PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY); | ||||
|             packet.getModifier().write(0, new int[] { DisguiseAPI.getSelfDisguiseId() }); | ||||
|             PacketContainer packet = getDestroyPacket(DisguiseAPI.getSelfDisguiseId()); | ||||
|             try { | ||||
|                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); | ||||
|             } catch (Exception ex) { | ||||
| @@ -979,10 +913,11 @@ public class DisguiseUtilities { | ||||
|             } | ||||
| 
 | ||||
|             // Resend any active potion effects | ||||
|             for (Object potionEffect : player.getActivePotionEffects()) { | ||||
|             for (PotionEffect potionEffect : player.getActivePotionEffects()) { | ||||
|                 Object mobEffect = ReflectionManager.createMobEffect(potionEffect); | ||||
|                 sendSelfPacket(player, | ||||
|                         manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EFFECT, player.getEntityId(), potionEffect) | ||||
|                                 .createPacket(player.getEntityId(), potionEffect)); | ||||
|                         manager.createPacketConstructor(PacketType.Play.Server.ENTITY_EFFECT, player.getEntityId(), mobEffect) | ||||
|                                 .createPacket(player.getEntityId(), mobEffect)); | ||||
|             } | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
| @@ -2,8 +2,8 @@ package me.libraryaddict.disguise.utilities; | ||||
| 
 | ||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
| 
 | ||||
| import net.minecraft.util.com.mojang.authlib.GameProfile; | ||||
| import net.minecraft.util.com.mojang.authlib.ProfileLookupCallback; | ||||
| import com.mojang.authlib.GameProfile; | ||||
| import com.mojang.authlib.ProfileLookupCallback; | ||||
| 
 | ||||
| public class LibsProfileLookupCaller implements ProfileLookupCallback { | ||||
|     private WrappedGameProfile gameProfile; | ||||
| @@ -5,6 +5,7 @@ import java.util.ArrayList; | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| import java.util.Random; | ||||
| import java.util.UUID; | ||||
| 
 | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| @@ -21,7 +22,6 @@ import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.SheepWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.WolfWatcher; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; | ||||
| 
 | ||||
| import org.bukkit.Art; | ||||
| import org.bukkit.Bukkit; | ||||
| @@ -84,7 +84,7 @@ public class PacketsManager { | ||||
|                 try { | ||||
|                     Player observer = event.getPlayer(); | ||||
|                     StructureModifier<Entity> entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); | ||||
|                     Entity entity = entityModifer.read(LibVersion.is1_7() ? 0 : 1); | ||||
|                     Entity entity = entityModifer.read(0); | ||||
|                     if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow | ||||
|                             || entity == observer) { | ||||
|                         event.setCancelled(true); | ||||
| @@ -196,12 +196,10 @@ public class PacketsManager { | ||||
|             spawnPackets[0] = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_PAINTING); | ||||
|             StructureModifier<Object> mods = spawnPackets[0].getModifier(); | ||||
|             mods.write(0, disguisedEntity.getEntityId()); | ||||
|             mods.write(1, loc.getBlockX()); | ||||
|             mods.write(2, loc.getBlockY()); | ||||
|             mods.write(3, loc.getBlockZ()); | ||||
|             mods.write(4, ((int) loc.getYaw()) % 4); | ||||
|             mods.write(1, ReflectionManager.getBlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); | ||||
|             mods.write(2, ReflectionManager.getEnumDirection(((int) loc.getYaw()) % 4)); | ||||
|             int id = ((MiscDisguise) disguise).getData(); | ||||
|             mods.write(5, ReflectionManager.getEnumArt(Art.values()[id])); | ||||
|             mods.write(3, ReflectionManager.getEnumArt(Art.values()[id])); | ||||
| 
 | ||||
|             // Make the teleport packet to make it visible.. | ||||
|             spawnPackets[1] = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); | ||||
| @@ -217,7 +215,7 @@ public class PacketsManager { | ||||
| 
 | ||||
|             spawnPackets[0] = new PacketContainer(PacketType.Play.Server.NAMED_ENTITY_SPAWN); | ||||
|             StructureModifier<String> stringMods = spawnPackets[0].getStrings(); | ||||
|             WrappedGameProfile gameProfile = null; // TODO Will this throw a error for older MC's? Namely pre-1.7 | ||||
|             WrappedGameProfile gameProfile; | ||||
|             if (stringMods.size() > 0) { | ||||
|                 for (int i = 0; i < stringMods.size(); i++) { | ||||
|                     stringMods.write(i, ((PlayerDisguise) disguise).getName()); | ||||
| @@ -233,7 +231,7 @@ public class PacketsManager { | ||||
|                 if (removeName) { | ||||
|                     DisguiseUtilities.getAddedByPlugins().remove(name); | ||||
|                 } | ||||
|                 spawnPackets[0].getGameProfiles().write(0, gameProfile); | ||||
|                 spawnPackets[0].getSpecificModifier(UUID.class).write(0, gameProfile.getUUID()); | ||||
|             } | ||||
|             StructureModifier<Integer> intMods = spawnPackets[0].getIntegers(); | ||||
|             intMods.write(0, disguisedEntity.getEntityId()); | ||||
| @@ -266,22 +264,23 @@ public class PacketsManager { | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (LibVersion.is1_8()) { | ||||
|                 ArrayList<PacketContainer> newPackets = new ArrayList<PacketContainer>(); | ||||
|                 newPackets.add(null); | ||||
|                 for (int i = 0; i < spawnPackets.length; i++) { | ||||
|                     if (spawnPackets[i] != null) { // Get rid of empty packet '1' if it exists. | ||||
|                         newPackets.add(spawnPackets[i]); | ||||
|                     } | ||||
|             ArrayList<PacketContainer> newPackets = new ArrayList<PacketContainer>(); | ||||
|             newPackets.add(null); | ||||
|             for (int i = 0; i < spawnPackets.length; i++) { | ||||
|                 if (spawnPackets[i] != null) { // Get rid of empty packet '1' if it exists. | ||||
|                     newPackets.add(spawnPackets[i]); | ||||
|                 } | ||||
|                 spawnPackets = newPackets.toArray(new PacketContainer[newPackets.size()]); | ||||
|                 spawnPackets[0] = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); | ||||
|                 spawnPackets[0].getGameProfiles().write(0, gameProfile); | ||||
|                 spawnPackets[0].getModifier().write(4, gameProfile.getName()); | ||||
|                 PacketContainer delayedPacket = spawnPackets[0].shallowClone(); | ||||
|                 delayedPacket.getModifier().write(0, 4); | ||||
|                 delayedPackets = new PacketContainer[] { delayedPacket }; | ||||
|             } | ||||
|             spawnPackets = newPackets.toArray(new PacketContainer[newPackets.size()]); | ||||
|             spawnPackets[0] = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); | ||||
|             spawnPackets[0].getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(0)); | ||||
|             List playerList = new ArrayList(); | ||||
|             PlayerDisguise playerDisguise = (PlayerDisguise) disguise; | ||||
|             playerList.add(ReflectionManager.getPlayerInfoData(spawnPackets[0].getHandle(), playerDisguise.getGameProfile())); | ||||
|             spawnPackets[0].getModifier().write(1, playerList); | ||||
|             PacketContainer delayedPacket = spawnPackets[0].shallowClone(); | ||||
|             delayedPacket.getModifier().write(0, ReflectionManager.getEnumPlayerInfoAction(4)); | ||||
|             delayedPackets = new PacketContainer[] { delayedPacket }; | ||||
| 
 | ||||
|         } else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) { | ||||
| 
 | ||||
| @@ -615,14 +614,9 @@ public class PacketsManager { | ||||
|                                         try { | ||||
|                                             int typeId = soundLoc.getWorld().getBlockTypeIdAt(soundLoc.getBlockX(), | ||||
|                                                     soundLoc.getBlockY() - 1, soundLoc.getBlockZ()); | ||||
|                                             Object block; | ||||
|                                             if (LibVersion.is1_7()) { | ||||
|                                                 block = ReflectionManager.getNmsMethod("RegistryMaterials", "a", int.class) | ||||
|                                                         .invoke(ReflectionManager.getNmsField("Block", "REGISTRY").get(null), | ||||
|                                                                 typeId); | ||||
|                                             } else { | ||||
|                                                 block = ((Object[]) ReflectionManager.getNmsField("Block", "byId").get(null))[typeId]; | ||||
|                                             } | ||||
|                                             Object block = ReflectionManager.getNmsMethod("RegistryMaterials", "a", int.class) | ||||
|                                                     .invoke(ReflectionManager.getNmsField("Block", "REGISTRY").get(null), | ||||
|                                                             typeId); | ||||
|                                             if (block != null) { | ||||
|                                                 Object step = ReflectionManager.getNmsField("Block", "stepSound").get(block); | ||||
|                                                 mods.write(0, ReflectionManager.getNmsMethod(step.getClass(), "getStepSound") | ||||
| @@ -689,7 +683,7 @@ public class PacketsManager { | ||||
|                         } | ||||
|                     } | ||||
|                 } else if (event.getPacketType() == PacketType.Play.Server.ENTITY_STATUS) { | ||||
|                     if ((Byte) mods.read(1) == (LibVersion.is1_7() ? 2 : 1)) { | ||||
|                     if ((Byte) mods.read(1) == 2) { | ||||
|                         // It made a damage animation | ||||
|                         Entity entity = event.getPacket().getEntityModifier(observer.getWorld()).read(0); | ||||
|                         Disguise disguise = DisguiseAPI.getDisguise(observer, entity); | ||||
| @@ -836,7 +830,7 @@ public class PacketsManager { | ||||
|                                 e.printStackTrace(); | ||||
|                             } | ||||
|                         } else if (event.getPacketType() == PacketType.Play.Server.ANIMATION) { | ||||
|                             if (event.getPacket().getIntegers().read(1) != (LibVersion.is1_7() ? 2 : 3)) { | ||||
|                             if (event.getPacket().getIntegers().read(1) != 2) { | ||||
|                                 event.setCancelled(true); | ||||
|                             } | ||||
|                         } else if (event.getPacketType() == PacketType.Play.Server.ATTACH_ENTITY | ||||
| @@ -853,7 +847,7 @@ public class PacketsManager { | ||||
|                         } else if (event.getPacketType() == PacketType.Play.Server.ENTITY_STATUS) { | ||||
|                             Disguise disguise = DisguiseAPI.getDisguise(event.getPlayer(), event.getPlayer()); | ||||
|                             if (disguise.isSelfDisguiseSoundsReplaced() && !disguise.getType().isPlayer() | ||||
|                                     && event.getPacket().getBytes().read(0) == (LibVersion.is1_7() ? 2 : 1)) { | ||||
|                                     && event.getPacket().getBytes().read(0) == 2) { | ||||
|                                 event.setCancelled(true); | ||||
|                             } | ||||
|                         } | ||||
| @@ -1342,7 +1336,7 @@ public class PacketsManager { | ||||
|                 // Else if the disguise is attempting to send players a forbidden packet | ||||
|                 else if (sentPacket.getType() == PacketType.Play.Server.ANIMATION) { | ||||
|                     if (disguise.getType().isMisc() | ||||
|                             || (packets[0].getIntegers().read(1) == (LibVersion.is1_7() ? 2 : 3) && (!disguise.getType() | ||||
|                             || (packets[0].getIntegers().read(1) == 2 && (!disguise.getType() | ||||
|                                     .isPlayer() || (DisguiseConfig.isBedPacketsEnabled() && ((PlayerWatcher) disguise | ||||
|                                     .getWatcher()).isSleeping())))) { | ||||
|                         packets = new PacketContainer[0]; | ||||
| @@ -1357,7 +1351,7 @@ public class PacketsManager { | ||||
|                         PacketContainer newPacket = new PacketContainer(PacketType.Play.Server.ANIMATION); | ||||
|                         StructureModifier<Integer> mods = newPacket.getIntegers(); | ||||
|                         mods.write(0, disguise.getEntity().getEntityId()); | ||||
|                         mods.write(1, LibVersion.is1_7() ? 3 : 2); | ||||
|                         mods.write(1, 3); | ||||
|                         packets = new PacketContainer[] { newPacket, sentPacket }; | ||||
|                     } | ||||
|                 } | ||||
| @@ -4,6 +4,7 @@ import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.lang.reflect.Constructor; | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.Method; | ||||
| import java.lang.reflect.Modifier; | ||||
| @@ -25,58 +26,29 @@ import org.bukkit.entity.Player; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| 
 | ||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
| import org.bukkit.potion.PotionEffect; | ||||
| 
 | ||||
| public class ReflectionManager { | ||||
| 
 | ||||
|     public enum LibVersion { | ||||
|         V1_6, V1_7, V1_7_10, V1_7_6, V1_8; | ||||
|         V1_8; | ||||
|         private static LibVersion currentVersion; | ||||
|         static { | ||||
|             String mcVersion = Bukkit.getVersion().split("MC: ")[1].replace(")", ""); | ||||
|             if (mcVersion.startsWith("1.")) { | ||||
|                 if (mcVersion.compareTo("1.7") < 0) { | ||||
|                     currentVersion = LibVersion.V1_6; | ||||
|                 } else if (mcVersion.startsWith("1.7")) { | ||||
|                     if (mcVersion.equals("1.7.10")) { | ||||
|                         currentVersion = LibVersion.V1_7_10; | ||||
|                     } else { | ||||
|                         currentVersion = mcVersion.compareTo("1.7.6") < 0 ? LibVersion.V1_7 : LibVersion.V1_7_6; | ||||
|                     } | ||||
|                 } else { | ||||
|                     currentVersion = V1_8; | ||||
|                 } | ||||
|             } | ||||
|             //String mcVersion = Bukkit.getVersion().split("MC: ")[1].replace(")", ""); | ||||
|             currentVersion = V1_8; | ||||
|         } | ||||
| 
 | ||||
|         public static LibVersion getGameVersion() { | ||||
|             return currentVersion; | ||||
|         } | ||||
| 
 | ||||
|         public static boolean is1_6() { | ||||
|             return getGameVersion() == V1_6; | ||||
|         } | ||||
| 
 | ||||
|         public static boolean is1_7() { | ||||
|             return getGameVersion() == V1_7 || is1_7_6(); | ||||
|         } | ||||
| 
 | ||||
|         public static boolean is1_7_10() { | ||||
|             return getGameVersion() == V1_7_10 || is1_8(); | ||||
|         } | ||||
| 
 | ||||
|         public static boolean is1_7_6() { | ||||
|             return getGameVersion() == V1_7_6 || is1_7_10(); | ||||
|         } | ||||
| 
 | ||||
|         public static boolean is1_8() { | ||||
|             return getGameVersion() == V1_8; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private static final String bukkitVersion = Bukkit.getServer().getClass().getName().split("\\.")[3]; | ||||
|     private static final Class<?> craftItemClass; | ||||
|     private static Method damageAndIdleSoundMethod; | ||||
|     private static final Field entitiesField; | ||||
|     private static final Constructor<?> boundingBoxConstructor; | ||||
|     private static final Method setBoundingBoxMethod; | ||||
|     /** | ||||
|      * Map of mc-dev simple class name to fully qualified Forge class name. | ||||
|      */ | ||||
| @@ -92,7 +64,6 @@ public class ReflectionManager { | ||||
|      */ | ||||
|     private static Map<String, Map<String, Map<String, String>>> ForgeMethodMappings; | ||||
|     private static final Method ihmGet; | ||||
|     private static HashMap<String, Boolean> is1_8 = new HashMap<String, Boolean>(); | ||||
|     private static final boolean isForge = Bukkit.getServer().getName().contains("Cauldron") | ||||
|             || Bukkit.getServer().getName().contains("MCPC-Plus"); | ||||
|     private static final Field pingField; | ||||
| @@ -224,6 +195,9 @@ public class ReflectionManager { | ||||
|         trackerField = getNmsField("WorldServer", "tracker"); | ||||
|         entitiesField = getNmsField("EntityTracker", "trackedEntities"); | ||||
|         ihmGet = getNmsMethod("IntHashMap", "get", int.class); | ||||
|         boundingBoxConstructor = getNmsConstructor("AxisAlignedBB",double.class, double.class,  double.class, | ||||
|                 double.class, double.class, double.class); | ||||
|         setBoundingBoxMethod = getNmsMethod("Entity", "a", getNmsClass("AxisAlignedBB")); | ||||
|     } | ||||
| 
 | ||||
|     public static Object createEntityInstance(String entityName) { | ||||
| @@ -235,19 +209,13 @@ public class ReflectionManager { | ||||
|                 Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); | ||||
|                 Object playerinteractmanager = getNmsClass("PlayerInteractManager").getConstructor(getNmsClass("World")) | ||||
|                         .newInstance(world); | ||||
|                 if (LibVersion.is1_7()) { | ||||
|                     WrappedGameProfile gameProfile = getGameProfile(null, "LibsDisguises"); | ||||
|                     entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), | ||||
|                             gameProfile.getHandleType(), playerinteractmanager.getClass()).newInstance(minecraftServer, world, | ||||
|                             gameProfile.getHandle(), playerinteractmanager); | ||||
|                 } else { | ||||
|                     entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("World"), String.class, | ||||
|                             playerinteractmanager.getClass()).newInstance(minecraftServer, world, "LibsDisguises", | ||||
|                             playerinteractmanager); | ||||
|                 } | ||||
|             } else if (LibVersion.is1_8() && entityName.equals("EnderPearl")) { | ||||
|                 WrappedGameProfile gameProfile = getGameProfile(null, "LibsDisguises"); | ||||
|                 entityObject = entityClass.getConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), | ||||
|                         gameProfile.getHandleType(), playerinteractmanager.getClass()).newInstance(minecraftServer, world, | ||||
|                         gameProfile.getHandle(), playerinteractmanager); | ||||
|             } else if (entityName.equals("EnderPearl")) { | ||||
|                 entityObject = entityClass.getConstructor(getNmsClass("World"), getNmsClass("EntityLiving")) | ||||
|                         .newInstance(world, createEntityInstance("Sheep")); | ||||
|                         .newInstance(world, createEntityInstance("Cow")); | ||||
|             } else { | ||||
|                 entityObject = entityClass.getConstructor(getNmsClass("World")).newInstance(world); | ||||
|             } | ||||
| @@ -258,18 +226,27 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Object createMobEffect(int id, int duration, int amplification, boolean ambient, boolean particles) { | ||||
|         try { | ||||
|             return getNmsClass("MobEffect").getConstructor(int.class, int.class, int.class, boolean.class, boolean.class) | ||||
|                     .newInstance(id, duration, amplification, ambient, particles); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Object createMobEffect(PotionEffect effect) { | ||||
|         return createMobEffect(effect.getType().getId(), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), effect.hasParticles()); | ||||
|     } | ||||
| 
 | ||||
|     private static String dir2fqn(String s) { | ||||
|         return s.replaceAll("/", "."); | ||||
|     } | ||||
| 
 | ||||
|     public static FakeBoundingBox getBoundingBox(Entity entity) { | ||||
|         try { | ||||
|             Object boundingBox; | ||||
|             if (LibVersion.is1_8()) { | ||||
|                 boundingBox = getNmsMethod("Entity", "getBoundingBox").invoke(getNmsEntity(entity)); | ||||
|             } else { | ||||
|                 boundingBox = getNmsField("Entity", "boundingBox").get(getNmsEntity(entity)); | ||||
|             } | ||||
|             Object boundingBox = getNmsMethod("Entity", "getBoundingBox").invoke(getNmsEntity(entity)); | ||||
|             double x = 0, y = 0, z = 0; | ||||
|             int stage = 0; | ||||
|             for (Field field : boundingBox.getClass().getFields()) { | ||||
| @@ -368,13 +345,51 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static WrappedGameProfile getGameProfile(Player player) { | ||||
|         if (LibVersion.is1_7() || LibVersion.is1_8()) { | ||||
|             return WrappedGameProfile.fromPlayer(player); | ||||
|     public static Object getBlockPosition(int x, int y, int z) { | ||||
|         try { | ||||
|             return getNmsClass("BlockPosition").getConstructor(int.class, int.class, int.class).newInstance(x, y, z); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Enum getEnumDirection(int direction) { | ||||
|         try { | ||||
|             return (Enum) getNmsMethod("EnumDirection", "fromType2", int.class).invoke(null, direction); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Enum getEnumPlayerInfoAction(int action) { | ||||
|         try { | ||||
|             return (Enum) getNmsClass("PacketPlayOutPlayerInfo$EnumPlayerInfoAction").getEnumConstants()[action]; | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Object getPlayerInfoData(Object playerInfoPacket, WrappedGameProfile gameProfile) { | ||||
|         try { | ||||
|             Object playerListName = getNmsClass("ChatComponentText").getConstructor(String.class) | ||||
|                     .newInstance(gameProfile.getName()); | ||||
|             return getNmsClass("PacketPlayOutPlayerInfo$PlayerInfoData").getConstructor(getNmsClass("PacketPlayOutPlayerInfo"), | ||||
|                     gameProfile.getHandleType(), int.class, getNmsClass("WorldSettings$EnumGamemode"), getNmsClass("IChatBaseComponent")) | ||||
|                     .newInstance(playerInfoPacket, gameProfile.getHandle(), 0, | ||||
|                             getNmsClass("WorldSettings$EnumGamemode").getEnumConstants()[1], playerListName); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static WrappedGameProfile getGameProfile(Player player)   { | ||||
|         return WrappedGameProfile.fromPlayer(player); | ||||
|     } | ||||
| 
 | ||||
|     public static WrappedGameProfile getGameProfile(UUID uuid, String playerName) { | ||||
|         try { | ||||
|             return new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), playerName); | ||||
| @@ -387,9 +402,7 @@ public class ReflectionManager { | ||||
|     public static WrappedGameProfile getGameProfileWithThisSkin(UUID uuid, String playerName, WrappedGameProfile profileWithSkin) { | ||||
|         try { | ||||
|             WrappedGameProfile gameProfile = new WrappedGameProfile(uuid != null ? uuid : UUID.randomUUID(), playerName); | ||||
|             if (LibVersion.is1_7_6()) { | ||||
|                 gameProfile.getProperties().putAll(profileWithSkin.getProperties()); | ||||
|             } | ||||
|             gameProfile.getProperties().putAll(profileWithSkin.getProperties()); | ||||
|             return gameProfile; | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
| @@ -418,6 +431,19 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Constructor getNmsConstructor(Class clazz, Class<?>... parameters) { | ||||
|         try { | ||||
|             return clazz.getConstructor(parameters); | ||||
|         } catch (NoSuchMethodException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static Constructor getNmsConstructor(String className, Class<?>... parameters) { | ||||
|         return getNmsConstructor(getNmsClass(className), parameters); | ||||
|     } | ||||
| 
 | ||||
|     public static Object getNmsEntity(Entity entity) { | ||||
|         try { | ||||
|             return getCraftClass("entity.CraftEntity").getMethod("getHandle").invoke(entity); | ||||
| @@ -496,12 +522,7 @@ public class ReflectionManager { | ||||
|         try { | ||||
|             float length = getNmsField("Entity", "length").getFloat(getNmsEntity(entity)); | ||||
|             float width = getNmsField("Entity", "width").getFloat(getNmsEntity(entity)); | ||||
|             float height; | ||||
|             if (LibVersion.is1_8()) { | ||||
|                 height = (Float) getNmsMethod("Entity", "getHeadHeight").invoke(getNmsEntity(entity)); | ||||
|             } else { | ||||
|                 height = getNmsField("Entity", "height").getFloat(getNmsEntity(entity)); | ||||
|             } | ||||
|             float height = (Float) getNmsMethod("Entity", "getHeadHeight").invoke(getNmsEntity(entity)); | ||||
|             return new float[] { length, width, height }; | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
| @@ -550,12 +571,12 @@ public class ReflectionManager { | ||||
|             for (Method method : getNmsClass("MinecraftServer").getMethods()) { | ||||
|                 if (method.getReturnType().getSimpleName().equals("GameProfileRepository")) { | ||||
|                     Object profileRepo = method.invoke(minecraftServer); | ||||
|                     Object agent = Class.forName("net.minecraft.util.com.mojang.authlib.Agent").getField("MINECRAFT").get(null); | ||||
|                     Object agent = Class.forName("com.mojang.authlib.Agent").getField("MINECRAFT").get(null); | ||||
|                     LibsProfileLookupCaller callback = new LibsProfileLookupCaller(); | ||||
|                     profileRepo | ||||
|                             .getClass() | ||||
|                             .getMethod("findProfilesByNames", String[].class, agent.getClass(), | ||||
|                                     Class.forName("net.minecraft.util.com.mojang.authlib.ProfileLookupCallback")) | ||||
|                                     Class.forName("com.mojang.authlib.ProfileLookupCallback")) | ||||
|                             .invoke(profileRepo, new String[] { playername }, agent, callback); | ||||
|                     if (callback.getGameProfile() != null) { | ||||
|                         return callback.getGameProfile(); | ||||
| @@ -569,26 +590,6 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static boolean is1_8(Player player) { | ||||
|         if (LibVersion.is1_8()) { | ||||
|             if (is1_8.containsKey(player.getName())) { | ||||
|                 return is1_8.get(player.getName()); | ||||
|             } | ||||
|             try { | ||||
|                 Object nmsEntity = getNmsEntity(player); | ||||
|                 Object connection = getNmsField(nmsEntity.getClass(), "playerConnection").get(nmsEntity); | ||||
|                 Field networkManager = getNmsField(connection.getClass(), "networkManager"); | ||||
|                 Method getVersion = getNmsMethod(networkManager.getType(), "getVersion"); | ||||
|                 boolean is18 = (Integer) getVersion.invoke(networkManager.get(connection)) >= 28; | ||||
|                 is1_8.put(player.getName(), is18); | ||||
|                 return is18; | ||||
|             } catch (Exception ex) { | ||||
|                 ex.printStackTrace(); | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     public static boolean isForge() { | ||||
|         return isForge; | ||||
|     } | ||||
| @@ -604,7 +605,7 @@ public class ReflectionManager { | ||||
|     } | ||||
| 
 | ||||
|     public static void removePlayer(Player player) { | ||||
|         is1_8.remove(player.getName()); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public static void setAllowSleep(Player player) { | ||||
| @@ -620,43 +621,13 @@ public class ReflectionManager { | ||||
| 
 | ||||
|     public static void setBoundingBox(Entity entity, FakeBoundingBox newBox) { | ||||
|         try { | ||||
|             Object boundingBox; | ||||
|             if (LibVersion.is1_8()) { | ||||
|                 boundingBox = getNmsMethod("Entity", "getBoundingBox").invoke(getNmsEntity(entity)); | ||||
|             } else { | ||||
|                 boundingBox = getNmsField("Entity", "boundingBox").get(getNmsEntity(entity)); | ||||
|             } | ||||
|             int stage = 0; | ||||
|             Location loc = entity.getLocation(); | ||||
|             for (Field field : boundingBox.getClass().getFields()) { | ||||
|                 if (field.getType().getSimpleName().equals("double")) { | ||||
|                     stage++; | ||||
|                     switch (stage) { | ||||
|                     case 1: | ||||
|                         field.setDouble(boundingBox, loc.getX() - newBox.getX()); | ||||
|                         break; | ||||
|                     case 2: | ||||
|                         // field.setDouble(boundingBox, loc.getY() - newBox.getY()); | ||||
|                         break; | ||||
|                     case 3: | ||||
|                         field.setDouble(boundingBox, loc.getZ() - newBox.getZ()); | ||||
|                         break; | ||||
|                     case 4: | ||||
|                         field.setDouble(boundingBox, loc.getX() + newBox.getX()); | ||||
|                         break; | ||||
|                     case 5: | ||||
|                         field.setDouble(boundingBox, loc.getY() + newBox.getY()); | ||||
|                         break; | ||||
|                     case 6: | ||||
|                         field.setDouble(boundingBox, loc.getZ() + newBox.getZ()); | ||||
|                         break; | ||||
|                     default: | ||||
|                         throw new Exception("Error while setting the bounding box, more doubles than I thought??"); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             Object boundingBox = boundingBoxConstructor.newInstance(loc.getX() - newBox.getX(), loc.getY() - newBox.getY(), | ||||
|                     loc.getZ() - newBox.getZ(), loc.getX() + newBox.getX(), loc.getY() + newBox.getY(), loc.getZ() + newBox.getZ()); | ||||
|             setBoundingBoxMethod.invoke(getNmsEntity(entity), boundingBox); | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										124
									
								
								src/main/resources/config.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								src/main/resources/config.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| # Shall I notify people of a LibsDisguises update? | ||||
| NotifyUpdate: true | ||||
| # Whats the permission to get the notification? | ||||
| Permission: 'libsdisguises.update' | ||||
| # Whats the max size allowed for command disguiseradius | ||||
| DisguiseRadiusMax: 50 | ||||
| # Whats the max size allowed for command undisguiseradius | ||||
| UndisguiseRadiusMax: 50 | ||||
| # Shall the players view their disguises? | ||||
| # Best used when viewing yourself in 3rd person | ||||
| ViewSelfDisguises: false | ||||
| # Shall I disguise the sounds? | ||||
| # This turns your damage sound into a MOOOO | ||||
| DisguiseSounds: true | ||||
| # Shall the disguised hear their disguise sounds or their damage sounds. | ||||
| # I disable this as it can be a little confusing when not used with self disguises | ||||
| HearSelfDisguise: false | ||||
| # Shall I send the velocity packets? I REALLY recommend you don't disable. | ||||
| # This is the only thing allowing the mobs to fly without glitching out. | ||||
| SendVelocity: true | ||||
| # For self disguises, they need to have the armor and the held item removed | ||||
| # Else they see floating armor, floating held items. | ||||
| # This turns the items invisible in the disguised players inventory. It does not actually remove them! | ||||
| RemoveArmor: true | ||||
| RemoveHeldItem: false | ||||
| # If you set a disguise to burning, it will no longer be able to be shown as sneaking or invisible. | ||||
| # Set this to true if you want the disguise to get the animations of the disguised entity. Such as invisible, on fire, sprinting, sneaking, blocking | ||||
| # This is only valid if you set a animation on the disguise itself. Because the entitys animations are applied otherwise. | ||||
| AddEntityAnimations: true | ||||
| # When a sheep or wolf is right clicked with dye. The client automatically assumes it was successful and displays the sheeps wool or the wolfs collar as dyed. | ||||
| # This is a option that either prevents that happening, or it changes their color officially in the plugin so that everyone sees it changed. | ||||
| # Its currently set to false which means that the color is not changed and will refresh itself to the player. | ||||
| # Please note that this will not remove the dye from their hands. This also does not check if the disguised entity is actually a sheep/wolf and wants a say in its color. | ||||
| DyeableSheep: false | ||||
| DyeableWolf: false | ||||
| # This is only called into action when the disguise is constructed using the commands. | ||||
| # And when the disguise supports that. This will not be used at all for plugins constructing the disguises for instance. | ||||
| # Such as prophunt. Its also false because its kind of a retarded feature. | ||||
| # This is pretty simple. It shows the players displayname (Name as it appears in chat) above their head. | ||||
| # This also overrides any custom name they have set in their disguise options. | ||||
| ShowNamesAboveDisguises:  false | ||||
| # This supports the above option. | ||||
| # If this is true, then the name shown above the head appears regardless of if you are looking at the disguise directly or not. | ||||
| NameAboveHeadAlwaysVisible: true | ||||
| # This modifys the bounding box, This is stuff like can a arrow hit them. | ||||
| # If you turn this to true, arrows will act like they hit the disguise in the right place! | ||||
| # So someone disguised as a enderdragon will easily get shot down by arrows! | ||||
| # This WILL conflict with NoCheatPlus. Other plugins may also get problems. | ||||
| # This shouldn't really be enabled for players as it also interferes with their movement because the server thinks the player is larger than he really is. | ||||
| # That makes the player unable to approach this building because the server thinks he is trying to glitch inside blocks. | ||||
| ModifyBoundingBox: false | ||||
| # This prevents disguised players from being targeted by monsters. | ||||
| # This doesn't prevent their targeting you if already targeting when disguised | ||||
| # They will just ignore you unless provoked. | ||||
| MonstersIgnoreDisguises: false | ||||
| # Sigh. People are going to want this. | ||||
| # So lets make your disguise blown if you are attacked.. | ||||
| # Works only for disguised players when attacked by a entity (arrow, monster. etc) | ||||
| # This will blow all disguises he has on him | ||||
| BlowDisguises: false | ||||
| BlownDisguiseMessage: '&cYour disguise was blown!' | ||||
|  | ||||
| # A option to choose how many seconds a DisguiseEntity command is valid for people to right click a entity to disguise it before expiring | ||||
| DisguiseEntityExpire: 10 | ||||
|  | ||||
| # Another option to choose the same thing for DisguiseClone command | ||||
| DisguiseCloneExpire: 10 | ||||
| # Max disguises to store at a time with the DisguiseClone command | ||||
| DisguiseCloneSize: 3 | ||||
|  | ||||
| # This I don't really recommend turning on as it can make a memory leak.. | ||||
| # These disguises, as normal will not persist after a server restart. | ||||
| # There is also no EntityDeath option as entities do not revive after death. | ||||
| KeepDisguises: | ||||
|   EntityDespawn: false | ||||
|   PlayerDeath: false | ||||
|   PlayerLogout: false | ||||
|    | ||||
| # This controls if a entitys max health is determined by the entity, or by the disguise. | ||||
| # Wither is 200, a player is 20. With this enabled, a player disguised as a wither will have the boss bar health accurate to the players health. | ||||
| # Else it will be 1/20 of the boss bar when he is full health. | ||||
| # Setting this in LivingWatcher overrides both values. | ||||
| MaxHealthDeterminedByEntity: true | ||||
|  | ||||
| # This here is a option to turn off misc disguises. | ||||
| # This means you can not have a living entity disguise as a non-living entity. | ||||
| # This disables the Attributes packet, Non-living entities can still disguise as other non-living | ||||
| # This means that the above option will not work as it uses the attribute packet. | ||||
| MiscDisguisesForLiving: true | ||||
|  | ||||
| # Turn this to true to have players undisguised when switching worlds | ||||
| UndisguiseOnWorldChange: false | ||||
|  | ||||
| # This will help performance, especially with CPU | ||||
| # Due to safety reasons, self disguises can never have their packets disabled. | ||||
| PacketsEnabled: | ||||
|   # This disables the animation packet. If a disguised entity sends a animation packet and they are using a non-living disguise. People will crash. | ||||
|   # Disabling this also means that if a player disguised as a non-player leaves a bug. People will crash | ||||
|   Animation: true | ||||
|   # Disabling this means that you can't use the setSleeping option on a player disguise. Also you will crash anyone watching when you try to sleep in a bed if disguised as a non-player | ||||
|   # This also sends a chunk packet at key positions else it doesn't work for 1.8. Lazyness means it does it for older versions too currently. | ||||
|   Bed: true | ||||
|   # This disguises the collect packet. If a living entity disguised as a non-living entity picks up a item. People will crash. This fixes it | ||||
|   # This also fixes people crashing if a item disguised as a sleeping player is picked up - Only true if Bed is enabled as well | ||||
|   Collect: true | ||||
|   # This disables a fix for when a disguised entity wearing armor dies, if the disguise can wear armor. It drops unpickupable items to anyone watching. | ||||
|   EntityStatus: true | ||||
|   # Entity equipment is the packets that are sent to ensure that a disguise has or doesn't have armor, and their held item. | ||||
|   # Disabling this means that any disguises which can wear armor or hold items will show the armor/held item that the disguised is wearing. | ||||
|   Equipment: true | ||||
|   # This doesn't actually disable the packet. It would introduce problems. Instead it does the next best thing and caches the data. | ||||
|   # This means that entity metadata will not change, and will only be sent in the spawn packet. | ||||
|   # This is good if performance is extremely in need. | ||||
|   # This is bad to disable unless you are ONLY going to use the disguises for decorations. | ||||
|   # To be honest. This is basically "Disable entity animations". That option is called 'AddEntityAnimations' in the config but unlike that, this is always in effect. | ||||
|   # Animations set by use of the api or through the disguise command are still in effect. | ||||
|   Metadata: true | ||||
|   # Movement packets are the biggest cpu hit. These are majorly used to ensure that the disguises facing direction isn't bugged up. | ||||
|   # If you are using the Item_Frame disguise, when a packet is sent (Roughly every 2min) the disguise will bug up until they move. | ||||
|   Movement: true | ||||
|   # Disable this if you don't mind crashing everytime you see someone riding something disguised as a non-living entity | ||||
|   Riding: true | ||||
|   # When disguised as a wither skull, it sends a look packet every tick so that the wither skull is facing the right way. | ||||
|   WitherSkull: true | ||||
							
								
								
									
										79
									
								
								src/main/resources/plugin.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								src/main/resources/plugin.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| name: LibsDisguises | ||||
| main: me.libraryaddict.disguise.LibsDisguises | ||||
| version: 8.3 Unofficial | ||||
| author: libraryaddict | ||||
| authors: [Byteflux, Navid K.] | ||||
| depend: [ProtocolLib] | ||||
| commands: | ||||
|    libsdisguises: | ||||
|       permission: libsdisguises.seecmd.libsdisguises | ||||
|    disguise: | ||||
|       aliases: [d, dis] | ||||
|       permission: libsdisguises.seecmd.disguise | ||||
|    disguiseentity: | ||||
|       aliases: [dentity, disentity] | ||||
|       permission: libsdisguises.seecmd.disguiseentity | ||||
|    disguisehelp: | ||||
|       aliases: [dhelp, dishelp] | ||||
|       permission: libsdisguises.seecmd.disguisehelp | ||||
|    disguiseplayer: | ||||
|       aliases: [dplayer, displayer] | ||||
|       permission: libsdisguises.seecmd.disguiseplayer | ||||
|    disguiseradius: | ||||
|       aliases: [disradius, dradius] | ||||
|       permission: libsdisguises.seecmd.disguiseradius | ||||
|    undisguise: | ||||
|       aliases: [u, und, undis] | ||||
|       permission: libsdisguises.seecmd.undisguise | ||||
|    undisguiseentity: | ||||
|       aliases: [undisentity, undentity] | ||||
|       permission: libsdisguises.seecmd.undisguiseentity | ||||
|    undisguiseplayer: | ||||
|       aliases: [undisplayer, undplayer] | ||||
|       permission: libsdisguises.seecmd.undisguiseplayer | ||||
|    undisguiseradius: | ||||
|       aliases: [undisradius, undradius] | ||||
|       permission: libsdisguises.seecmd.undisguiseradius | ||||
|    disguiseclone: | ||||
|       aliases: [disguisec, disc, disclone, dclone, clonedisguise, clonedis, cdisguise, cdis] | ||||
|       permission: libsdisguises.seecmd.disguiseclone | ||||
|  | ||||
| permissions: | ||||
|    libsdisguises.seecmd: | ||||
|       description: See all commands in tab-completion | ||||
|       default: true | ||||
|       children: | ||||
|          libsdisguises.seecmd.libsdisguises: true | ||||
|          libsdisguises.seecmd.disguise: true | ||||
|          libsdisguises.seecmd.disguiseentity: true | ||||
|          libsdisguises.seecmd.disguisehelp: true | ||||
|          libsdisguises.seecmd.disguiseplayer: true | ||||
|          libsdisguises.seecmd.disguiseradius: true | ||||
|          libsdisguises.seecmd.undisguise: true | ||||
|          libsdisguises.seecmd.undisguiseentity: true | ||||
|          libsdisguises.seecmd.undisguiseplayer: true | ||||
|          libsdisguises.seecmd.undisguiseradius: true | ||||
|          libsdisguises.seecmd.disguiseclone: true | ||||
|  | ||||
|    libsdisguises.seecmd.libsdisguises: | ||||
|       description: See the /libsdisguises command in tab-completion | ||||
|    libsdisguises.seecmd.disguise: | ||||
|       description: See the /disguise command in tab-completion | ||||
|    libsdisguises.seecmd.disguiseentity: | ||||
|       description: See the /disguiseentity command in tab-completion | ||||
|    libsdisguises.seecmd.disguisehelp: | ||||
|       description: See the /disguisehelp command in tab-completion | ||||
|    libsdisguises.seecmd.disguiseplayer: | ||||
|       description: See the /disguiseplayer command in tab-completion | ||||
|    libsdisguises.seecmd.disguiseradius: | ||||
|       description: See the /disguiseradius command in tab-completion | ||||
|    libsdisguises.seecmd.undisguise: | ||||
|       description: See the /undisguise command in tab-completion | ||||
|    libsdisguises.seecmd.undisguiseentity: | ||||
|       description: See the /undisguiseentity command in tab-completion | ||||
|    libsdisguises.seecmd.undisguiseplayer: | ||||
|       description: See the /undisguiseplayer command in tab-completion | ||||
|    libsdisguises.seecmd.undisguiseradius: | ||||
|       description: See the /undisguiseradius command in tab-completion | ||||
|    libsdisguises.seecmd.disguiseclone: | ||||
|       description: See the /disguiseclone command in tab-completion | ||||
| @@ -1,178 +0,0 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes; | ||||
|  | ||||
| import org.bukkit.entity.Animals; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Monster; | ||||
|  | ||||
| public enum FutureDisguiseType { | ||||
|  | ||||
|     ARMOR_STAND(Entity.class, 30, 2, new float[] { 0F, 0F, 0F }, new Object[] { | ||||
|  | ||||
|     1, (short) 300, | ||||
|  | ||||
|     2, "", | ||||
|  | ||||
|     3, (byte) 0, | ||||
|  | ||||
|     4, (byte) 0, | ||||
|  | ||||
|     6, 1F, | ||||
|  | ||||
|     7, 0, | ||||
|  | ||||
|     8, (byte) 0, | ||||
|  | ||||
|     9, (byte) 0, | ||||
|  | ||||
|     10, (byte) 0, | ||||
|  | ||||
|     // 11, | ||||
|     // 12, | ||||
|     // 13, | ||||
|     // 14, | ||||
|     // 15, | ||||
|     // 16 | ||||
|             }), | ||||
|  | ||||
|     ELDER_GUARDIAN(Monster.class, 68, 80, new float[] { 0F, 0F, 0F }, new Object[] { | ||||
|  | ||||
|     1, (short) 300, | ||||
|  | ||||
|     2, "", | ||||
|  | ||||
|     3, (byte) 0, | ||||
|  | ||||
|     4, (byte) 0, | ||||
|  | ||||
|     6, 1F, | ||||
|  | ||||
|     7, 0, | ||||
|  | ||||
|     8, (byte) 0, | ||||
|  | ||||
|     9, (byte) 0, | ||||
|  | ||||
|     15, (byte) 0, | ||||
|  | ||||
|     16, 0 | 4, | ||||
|  | ||||
|     17, 0 | ||||
|  | ||||
|     }), | ||||
|  | ||||
|     ENDERMITE(Monster.class, 67, 8, new float[] { 0F, 0F, 0F }, new Object[] { | ||||
|  | ||||
|     0, (byte) 0, | ||||
|  | ||||
|     1, (short) 300, | ||||
|  | ||||
|     2, "", | ||||
|  | ||||
|     3, (byte) 0, | ||||
|  | ||||
|     4, (byte) 0, | ||||
|  | ||||
|     6, 1F, | ||||
|  | ||||
|     7, 0, | ||||
|  | ||||
|     8, (byte) 0, | ||||
|  | ||||
|     9, (byte) 0, | ||||
|  | ||||
|     15, (byte) 0 | ||||
|  | ||||
|     }), | ||||
|  | ||||
|     GUARDIAN(Monster.class, 68, 30, new float[] { 0F, 0F, 0F }, new Object[] { | ||||
|  | ||||
|     1, (short) 300, | ||||
|  | ||||
|     2, "", | ||||
|  | ||||
|     3, (byte) 0, | ||||
|  | ||||
|     4, (byte) 0, | ||||
|  | ||||
|     6, 1F, | ||||
|  | ||||
|     7, 0, | ||||
|  | ||||
|     8, (byte) 0, | ||||
|  | ||||
|     9, (byte) 0, | ||||
|  | ||||
|     15, (byte) 0, | ||||
|  | ||||
|     16, 0, | ||||
|  | ||||
|     17, 0 | ||||
|  | ||||
|     }), | ||||
|  | ||||
|     RABBIT(Animals.class, 101, 10, new float[] { 0F, 0F, 0F }, new Object[] { 1, (short) 300, | ||||
|  | ||||
|     2, "", | ||||
|  | ||||
|     3, (byte) 0, | ||||
|  | ||||
|     4, (byte) 0, | ||||
|  | ||||
|     6, 1F, | ||||
|  | ||||
|     7, 0, | ||||
|  | ||||
|     8, (byte) 0, | ||||
|  | ||||
|     9, (byte) 0, | ||||
|  | ||||
|     12, 0, | ||||
|  | ||||
|     15, (byte) 0, | ||||
|  | ||||
|     18, (byte) 0 | ||||
|  | ||||
|     }); | ||||
|  | ||||
|     private float[] boundingBox; | ||||
|     private Object[] dataWatcher; | ||||
|     private Class<? extends Entity> entityClass; | ||||
|     private int entityId; | ||||
|     private float maxHealth; | ||||
|  | ||||
|     private FutureDisguiseType(Class<? extends Entity> entityClass, int entityId, float maxHealth, float[] boundingBox, | ||||
|             Object[] watcherValues) { | ||||
|         this.entityClass = entityClass; | ||||
|         this.dataWatcher = watcherValues; | ||||
|         this.boundingBox = boundingBox; | ||||
|         if (watcherValues.length % 2 != 0) { | ||||
|             System.out.print("Error! " + name() + " has odd number of params!"); | ||||
|         } | ||||
|         this.entityId = entityId; | ||||
|     } | ||||
|  | ||||
|     public float[] getBoundingBox() { | ||||
|         return boundingBox; | ||||
|     } | ||||
|  | ||||
|     public Object[] getDataWatcher() { | ||||
|         return dataWatcher; | ||||
|     } | ||||
|  | ||||
|     public Class<? extends Entity> getEntityClass() { | ||||
|         return entityClass; | ||||
|     } | ||||
|  | ||||
|     public int getEntityId() { | ||||
|         return entityId; | ||||
|     } | ||||
|  | ||||
|     public float getMaxHealth() { | ||||
|         return maxHealth; | ||||
|     } | ||||
|  | ||||
|     public boolean isAlive() { | ||||
|         return this != ARMOR_STAND; | ||||
|     } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user