Fixed falling block disguise, fixed velocity when flying
This commit is contained in:
		| @@ -112,15 +112,7 @@ public abstract class Disguise { | ||||
|         final boolean alwaysSendVelocity; | ||||
|  | ||||
|         switch (getType()) { | ||||
|             case EGG: | ||||
|             case ENDER_PEARL: | ||||
|             case BAT: | ||||
|             case EXPERIENCE_ORB: | ||||
|             case FIREBALL: | ||||
|             case SMALL_FIREBALL: | ||||
|             case SNOWBALL: | ||||
|             case SPLASH_POTION: | ||||
|             case THROWN_EXP_BOTTLE: | ||||
|             case WITHER_SKULL: | ||||
|             case FIREWORK: | ||||
|                 alwaysSendVelocity = true; | ||||
| @@ -130,55 +122,21 @@ public abstract class Disguise { | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         double velocitySpeed = 0.0005; | ||||
|         final Double vectorY; | ||||
|  | ||||
|         switch (getType()) { | ||||
|             case FIREWORK: | ||||
|                 velocitySpeed = -0.040; | ||||
|                 break; | ||||
|             case WITHER_SKULL: | ||||
|                 velocitySpeed = 0.000001D; | ||||
|                 break; | ||||
|             case ARROW: | ||||
|             case TIPPED_ARROW: | ||||
|             case SPECTRAL_ARROW: | ||||
|             case BOAT: | ||||
|             case ENDER_CRYSTAL: | ||||
|             case ENDER_DRAGON: | ||||
|             case GHAST: | ||||
|             case ITEM_FRAME: | ||||
|             case MINECART: | ||||
|             case MINECART_CHEST: | ||||
|             case MINECART_COMMAND: | ||||
|             case MINECART_FURNACE: | ||||
|             case MINECART_HOPPER: | ||||
|             case MINECART_MOB_SPAWNER: | ||||
|             case MINECART_TNT: | ||||
|             case PAINTING: | ||||
|             case PLAYER: | ||||
|             case SQUID: | ||||
|                 velocitySpeed = 0; | ||||
|                 break; | ||||
|             case DROPPED_ITEM: | ||||
|             case PRIMED_TNT: | ||||
|             case WITHER: | ||||
|             case FALLING_BLOCK: | ||||
|                 velocitySpeed = 0.04; | ||||
|                 vectorY = 0.000001D; | ||||
|                 break; | ||||
|             case EXPERIENCE_ORB: | ||||
|                 velocitySpeed = 0.0221; | ||||
|                 break; | ||||
|             case SPIDER: | ||||
|             case BAT: | ||||
|             case CAVE_SPIDER: | ||||
|                 velocitySpeed = 0.004; | ||||
|                 vectorY = 0.0221; | ||||
|                 break; | ||||
|             default: | ||||
|                 vectorY = null; | ||||
|                 break; | ||||
|         } | ||||
|  | ||||
|         final double vectorY = velocitySpeed; | ||||
|  | ||||
|         final TargetedDisguise disguise = (TargetedDisguise) this; | ||||
|  | ||||
|         // A scheduler to clean up any unused disguises. | ||||
| @@ -190,9 +148,9 @@ public abstract class Disguise { | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 // If entity is no longer valid. Remove it. | ||||
|                 if (getEntity() instanceof Player && !((Player) getEntity()).isOnline()) | ||||
|                 if (getEntity() instanceof Player && !((Player) getEntity()).isOnline()) { | ||||
|                     removeDisguise(); | ||||
|                 else if (!getEntity().isValid()) { | ||||
|                 } else if (!getEntity().isValid()) { | ||||
|                     // If it has been dead for 30+ ticks | ||||
|                     // This is to ensure that this disguise isn't removed while clients think its the real entity | ||||
|                     // The delay is because if it sends the destroy entity packets straight away, then it means no | ||||
| @@ -251,7 +209,7 @@ public abstract class Disguise { | ||||
|  | ||||
|                     // If the vectorY isn't 0. Cos if it is. Then it doesn't want to send any vectors. | ||||
|                     // If this disguise has velocity sending enabled and the entity is flying. | ||||
|                     if (isVelocitySent() && vectorY != 0 && (alwaysSendVelocity || !getEntity().isOnGround())) { | ||||
|                     if (isVelocitySent() && vectorY != null && (alwaysSendVelocity || !getEntity().isOnGround())) { | ||||
|                         Vector vector = getEntity().getVelocity(); | ||||
|  | ||||
|                         // If the entity doesn't have velocity changes already - You know. I really can't wrap my | ||||
|   | ||||
| @@ -60,7 +60,7 @@ public enum DisguiseType { | ||||
|  | ||||
|     EXPERIENCE_ORB, | ||||
|  | ||||
|     FALLING_BLOCK(70, 1), | ||||
|     FALLING_BLOCK(70), | ||||
|  | ||||
|     FIREBALL(63), | ||||
|  | ||||
|   | ||||
| @@ -19,22 +19,26 @@ public class MiscDisguise extends TargetedDisguise { | ||||
|         this(disguiseType, -1, disguiseType.getDefaultData()); | ||||
|     } | ||||
|  | ||||
|     public MiscDisguise(Material material, int data) { | ||||
|         super(DisguiseType.DROPPED_ITEM); | ||||
|  | ||||
|         apply(0, 0, new ItemStack(material, 1, (short) data)); | ||||
|     public MiscDisguise(DisguiseType disguiseType, Material material, int data) { | ||||
|         this(disguiseType, new ItemStack(material, 1, (short) data)); | ||||
|     } | ||||
|  | ||||
|     public MiscDisguise(ItemStack itemStack) { | ||||
|         super(DisguiseType.DROPPED_ITEM); | ||||
|     public MiscDisguise(DisguiseType disguiseType, ItemStack itemStack) { | ||||
|         super(disguiseType); | ||||
|  | ||||
|         apply(0, 0, itemStack); | ||||
| } | ||||
|         if (disguiseType != DisguiseType.FALLING_BLOCK && disguiseType != DisguiseType.DROPPED_ITEM) { | ||||
|             throw new IllegalArgumentException( | ||||
|                     "This constructor requires a DROPPED_ITEM or FALLING_BLOCK disguise type!"); | ||||
|         } | ||||
|  | ||||
|         apply(0, itemStack); | ||||
|     } | ||||
|  | ||||
|     public MiscDisguise(DisguiseType disguiseType, int id) { | ||||
|         this(disguiseType, id, disguiseType.getDefaultData()); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     public MiscDisguise(DisguiseType disguiseType, int id, int data) { | ||||
|         super(disguiseType); | ||||
|  | ||||
| @@ -45,10 +49,10 @@ public class MiscDisguise extends TargetedDisguise { | ||||
|                             " instead"); | ||||
|         } | ||||
|  | ||||
|         apply(id, data, new ItemStack(Material.STONE)); | ||||
|         apply(id, new ItemStack(Material.STONE)); | ||||
|     } | ||||
|  | ||||
|     private void apply(int id, int data, ItemStack itemStack) { | ||||
|     private void apply(int id, ItemStack itemStack) { | ||||
|         createDisguise(); | ||||
|  | ||||
|         this.id = getType().getTypeId(); | ||||
|   | ||||
| @@ -18,6 +18,7 @@ import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.disguisetypes.*; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.FallingBlockWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | ||||
| import me.libraryaddict.disguise.utilities.packetlisteners.*; | ||||
| @@ -432,7 +433,9 @@ public class PacketsManager { | ||||
|             int data = ((MiscDisguise) disguise).getData(); | ||||
|  | ||||
|             if (disguise.getType() == DisguiseType.FALLING_BLOCK) { | ||||
|                 data = ReflectionManager.getCombinedId(((MiscDisguise) disguise).getId(), data); | ||||
|                 ItemStack block = ((FallingBlockWatcher) disguise.getWatcher()).getBlock(); | ||||
|  | ||||
|                 data = ReflectionManager.getCombinedIdByItemStack(block); | ||||
|             } else if (disguise.getType() == DisguiseType.FISHING_HOOK && data == -1) { | ||||
|                 // If the MiscDisguise data isn't set. Then no entity id was provided, so default to the owners | ||||
|                 // entity id | ||||
| @@ -448,6 +451,16 @@ public class PacketsManager { | ||||
|                     .createPacket(nmsEntity, objectId, data); | ||||
|             packets.addPacket(spawnEntity); | ||||
|  | ||||
|             // If it's not the same type, then highly likely they have different velocity settings which we'd want to | ||||
|             // cancel | ||||
|             if (DisguiseType.getType(disguisedEntity) != disguise.getType()) { | ||||
|                 StructureModifier<Integer> ints = spawnEntity.getIntegers(); | ||||
|  | ||||
|                 ints.write(1, 0); | ||||
|                 ints.write(2, 0); | ||||
|                 ints.write(3, 0); | ||||
|             } | ||||
|  | ||||
|             spawnEntity.getModifier().write(8, pitch); | ||||
|             spawnEntity.getModifier().write(9, yaw); | ||||
|  | ||||
| @@ -1089,7 +1102,8 @@ public class PacketsManager { | ||||
|  | ||||
|             // If the entity is sending velocity and its a falling block | ||||
|             else if (sentPacket.getType() == Server.ENTITY_VELOCITY) { | ||||
|                 if (disguise.getType() == DisguiseType.FALLING_BLOCK) { | ||||
|                 // If the disguise is a misc and the disguised is not the same type | ||||
|                 if (disguise.getType().isMisc() && DisguiseType.getType(entity) != disguise.getType()) { | ||||
|                     packets.clear(); | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -833,33 +833,13 @@ public class ReflectionManager { | ||||
|             return ((Double) value).floatValue(); | ||||
|         } else if (value instanceof NbtWrapper) { | ||||
|             return ((NbtWrapper) value).getHandle(); | ||||
|         } else if (value instanceof Particle) { | ||||
|             return getParticleType((Particle) value); | ||||
|         } else if (value instanceof WrappedParticle) { | ||||
|             return ((WrappedParticle) value).getHandle(); | ||||
|         } | ||||
|  | ||||
|         return value; | ||||
|     } | ||||
|  | ||||
|     private static Object getParticleType(Particle particle) { | ||||
|         try { | ||||
|             Class craftParticle = getCraftClass("CraftParticle"); | ||||
|             Field mcKeyField = craftParticle.getDeclaredField("minecraftKey"); | ||||
|             mcKeyField.setAccessible(true); | ||||
|             Object mcKey = mcKeyField.get(Enum.valueOf(craftParticle, particle.name())); | ||||
|  | ||||
|             Class typesClass = getNmsClass("IRegistry"); | ||||
|  | ||||
|             Object registry = typesClass.getField("PARTICLE_TYPE").get(null); | ||||
|  | ||||
|             return registry.getClass().getMethod("get", mcKey.getClass()).invoke(registry, mcKey); | ||||
|         } | ||||
|         catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static String getMinecraftVersion() { | ||||
|         String version = Bukkit.getVersion(); | ||||
|         version = version.substring(version.lastIndexOf(" ") + 1, version.length() - 1); | ||||
| @@ -979,10 +959,6 @@ public class ReflectionManager { | ||||
|         return new WrappedWatchableObject(watcherItem); | ||||
|     } | ||||
|  | ||||
|     public static int getCombinedId(int id, int data) { | ||||
|         return id + (data << 12); | ||||
|     } | ||||
|  | ||||
|     public static int getCombinedIdByItemStack(ItemStack itemStack) { | ||||
|         try { | ||||
|             Object nmsItem = getNmsItem(itemStack); | ||||
| @@ -991,7 +967,9 @@ public class ReflectionManager { | ||||
|  | ||||
|             Object nmsBlock = getNmsMethod(blockClass, "asBlock", getNmsClass("Item")).invoke(null, item); | ||||
|  | ||||
|             return (int) getNmsMethod(blockClass, "getBlockData").invoke(nmsBlock); | ||||
|             Object iBlockData = getNmsMethod(blockClass, "getBlockData").invoke(nmsBlock); | ||||
|  | ||||
|             return (int) getNmsMethod("Block", "getCombinedId", getNmsClass("IBlockData")).invoke(null, iBlockData); | ||||
|         } | ||||
|         catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user