Less bugs. Still writing
This commit is contained in:
		| @@ -1,6 +1,5 @@ | ||||
| package me.libraryaddict.disguise; | ||||
|  | ||||
| import java.util.Iterator; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseTypes.Disguise; | ||||
| @@ -16,7 +15,9 @@ import org.bukkit.Location; | ||||
| import org.bukkit.Sound; | ||||
| import org.bukkit.craftbukkit.v1_5_R3.CraftSound; | ||||
| import org.bukkit.craftbukkit.v1_5_R3.entity.CraftEntity; | ||||
| import org.bukkit.craftbukkit.v1_5_R3.entity.CraftLivingEntity; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.LivingEntity; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.plugin.java.JavaPlugin; | ||||
|  | ||||
| @@ -44,6 +45,7 @@ public class DisguiseAPI { | ||||
|      */ | ||||
|     public static void disguiseToAll(Entity entity, Disguise disguise) { | ||||
|         disguises.put(entity instanceof Player ? ((Player) entity).getName() : entity.getUniqueId(), disguise); | ||||
|         disguise.constructWatcher(entity.getType(), entity.getEntityId()); | ||||
|         refresh(entity); | ||||
|     } | ||||
|  | ||||
| @@ -94,7 +96,22 @@ public class DisguiseAPI { | ||||
|                             if (loc.equals(soundLoc)) { | ||||
|                                 DisguiseSound disSound = DisguiseSound.getType(entity.getType().name()); | ||||
|                                 if (disSound != null) { | ||||
|                                     soundType = disSound.ownsSound(soundName); | ||||
|                                     if (((CraftEntity) entity).getHandle().dead) { | ||||
|                                         soundType = SoundType.DEATH; | ||||
|                                         System.out.print(soundType); | ||||
|                                     } else { | ||||
|                                         boolean hasInvun = false; | ||||
|                                         if (entity instanceof LivingEntity) { | ||||
|                                             net.minecraft.server.v1_5_R3.EntityLiving e = ((CraftLivingEntity) entity) | ||||
|                                                     .getHandle(); | ||||
|                                             hasInvun = e.noDamageTicks == e.maxNoDamageTicks; | ||||
|                                         } else { | ||||
|                                             net.minecraft.server.v1_5_R3.Entity e = ((CraftEntity) entity).getHandle(); | ||||
|                                             hasInvun = e.isInvulnerable(); | ||||
|                                         } | ||||
|                                         soundType = disSound.getType(soundName, !hasInvun); | ||||
|                                         System.out.print(soundType + " " + hasInvun); | ||||
|                                     } | ||||
|                                     if (soundType != null) { | ||||
|                                         disguisedEntity = entity; | ||||
|                                         break; | ||||
| @@ -107,22 +124,24 @@ public class DisguiseAPI { | ||||
|                         } | ||||
|                     } | ||||
|                     if (disguisedEntity != null) { | ||||
|                         // TODO Check if they been damage with invincibility ticks | ||||
|                         Sound sound = null; | ||||
|                         DisguiseSound dSound = DisguiseSound.getType(DisguiseAPI.getDisguise(disguisedEntity).getType().name()); | ||||
|                         if (dSound != null) | ||||
|                             sound = dSound.getSound(soundType); | ||||
|                         if (sound == null) { | ||||
|                             event.setCancelled(true); | ||||
|                         } else { | ||||
|                             if (sound == Sound.STEP_GRASS) { | ||||
|                                 World world = ((CraftEntity) disguisedEntity).getHandle().world; | ||||
|                                 Block b = Block.byId[world.getTypeId(soundLoc.getBlockX(), soundLoc.getBlockY() - 1, | ||||
|                                         soundLoc.getBlockZ())]; | ||||
|                                 if (b != null) | ||||
|                                     mods.write(0, b.stepSound.getStepSound()); | ||||
|                         Disguise disguise = DisguiseAPI.getDisguise(disguisedEntity); | ||||
|                         if (disguise.replaceSounds()) { | ||||
|                             Sound sound = null; | ||||
|                             DisguiseSound dSound = DisguiseSound.getType(disguise.getType().name()); | ||||
|                             if (dSound != null) | ||||
|                                 sound = dSound.getSound(soundType); | ||||
|                             if (sound == null) { | ||||
|                                 event.setCancelled(true); | ||||
|                             } else { | ||||
|                                 mods.write(0, CraftSound.getSound(sound)); | ||||
|                                 if (sound == Sound.STEP_GRASS) { | ||||
|                                     World world = ((CraftEntity) disguisedEntity).getHandle().world; | ||||
|                                     Block b = Block.byId[world.getTypeId(soundLoc.getBlockX(), soundLoc.getBlockY() - 1, | ||||
|                                             soundLoc.getBlockZ())]; | ||||
|                                     if (b != null) | ||||
|                                         mods.write(0, b.stepSound.getStepSound()); | ||||
|                                 } else { | ||||
|                                     mods.write(0, CraftSound.getSound(sound)); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
| @@ -151,7 +170,7 @@ public class DisguiseAPI { | ||||
|         EntityTrackerEntry entry = (EntityTrackerEntry) ((WorldServer) ((CraftEntity) entity).getHandle().world).tracker.trackedEntities | ||||
|                 .get(entity.getEntityId()); | ||||
|         if (entry != null) { | ||||
|             EntityPlayer[] players = (EntityPlayer[]) entry.trackedPlayers.toArray(); | ||||
|             EntityPlayer[] players = (EntityPlayer[]) entry.trackedPlayers.toArray(new EntityPlayer[entry.trackedPlayers.size()]); | ||||
|             for (EntityPlayer player : players) { | ||||
|                 if (entity instanceof Player && !player.getBukkitEntity().canSee((Player) entity)) | ||||
|                     continue; | ||||
|   | ||||
| @@ -1,24 +1,21 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes; | ||||
|  | ||||
| import java.lang.reflect.Constructor; | ||||
| import java.lang.reflect.Field; | ||||
| import java.util.Map; | ||||
| import java.util.Random; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseTypes.Watchers.AgeableWatcher; | ||||
| import net.minecraft.server.v1_5_R3.Entity; | ||||
| import net.minecraft.server.v1_5_R3.EntityAgeable; | ||||
| import net.minecraft.server.v1_5_R3.EntityLiving; | ||||
| import net.minecraft.server.v1_5_R3.EntityPlayer; | ||||
| import net.minecraft.server.v1_5_R3.EntitySkeleton; | ||||
| import net.minecraft.server.v1_5_R3.EntityTypes; | ||||
| import net.minecraft.server.v1_5_R3.ItemStack; | ||||
| import net.minecraft.server.v1_5_R3.MathHelper; | ||||
| import net.minecraft.server.v1_5_R3.MinecraftServer; | ||||
| import net.minecraft.server.v1_5_R3.PlayerInteractManager; | ||||
| import net.minecraft.server.v1_5_R3.EnumArt; | ||||
| import net.minecraft.server.v1_5_R3.World; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.craftbukkit.v1_5_R3.entity.CraftEntity; | ||||
| import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftItemStack; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.util.Vector; | ||||
|  | ||||
| @@ -30,18 +27,12 @@ import com.comphenix.protocol.reflect.StructureModifier; | ||||
|  | ||||
| public class Disguise { | ||||
|     protected DisguiseType disguiseType; | ||||
|     private Entity entity = null; | ||||
|     private boolean replaceSounds; | ||||
|     private FlagWatcher watcher; | ||||
|  | ||||
|     protected Disguise(DisguiseType newType) { | ||||
|     protected Disguise(DisguiseType newType, boolean doSounds) { | ||||
|         disguiseType = newType; | ||||
|     } | ||||
|  | ||||
|     public PacketContainer constructDestroyPacket(int entityId) { | ||||
|         PacketContainer destroyPacket = ProtocolLibrary.getProtocolManager().createPacket(Packets.Server.DESTROY_ENTITY); | ||||
|         StructureModifier<Object> mods = destroyPacket.getModifier(); | ||||
|         mods.write(0, new int[] { entityId }); | ||||
|         return destroyPacket; | ||||
|         replaceSounds = doSounds; | ||||
|     } | ||||
|  | ||||
|     public PacketContainer constructPacket(org.bukkit.entity.Entity e) { | ||||
| @@ -76,7 +67,8 @@ public class Disguise { | ||||
|  | ||||
|         } else if (getType().isMob()) { | ||||
|  | ||||
|             entity = ((MobDisguise) this).getEntityLiving(((CraftEntity) e).getHandle().world, e.getLocation(), e.getEntityId()); | ||||
|             // entity = ((MobDisguise) this).getEntityLiving(((CraftEntity) e).getHandle().world, e.getLocation(), | ||||
|             // e.getEntityId()); | ||||
|             double d1 = 3.9D; | ||||
|             Vector vec = e.getVelocity(); | ||||
|             double d2 = vec.getX(); | ||||
| @@ -98,6 +90,31 @@ public class Disguise { | ||||
|             StructureModifier<Object> mods = spawnPacket.getModifier(); | ||||
|             mods.write(0, e.getEntityId()); | ||||
|             mods.write(1, (byte) EntityTypes.a(entity)); | ||||
|             String name = toReadable(disguiseType.name()); | ||||
|             if (disguiseType == DisguiseType.WITHER_SKELETON) { | ||||
|                 name = "Skeleton"; | ||||
|             } else if (disguiseType == DisguiseType.PRIMED_TNT) { | ||||
|                 name = "TNTPrimed"; | ||||
|             } else if (disguiseType == DisguiseType.MINECART_TNT) { | ||||
|                 name = "MinecartTNT"; | ||||
|             } else if (disguiseType == DisguiseType.SPLASH_POTION) | ||||
|                 name = "Potion"; | ||||
|             else if (disguiseType == DisguiseType.GIANT) | ||||
|                 name = "Giant Zombie"; | ||||
|             else if (disguiseType == DisguiseType.DROPPED_ITEM) | ||||
|                 name = "Item"; | ||||
|             else if (disguiseType == DisguiseType.FIREBALL) | ||||
|                 name = "Large Fireball"; | ||||
|             try { | ||||
|                 Class entityClass = Class.forName("net.minecraft.server.v1_5_R3.Entity" + name); | ||||
|                 Field field = EntityTypes.class.getDeclaredField("e"); | ||||
|                 field.setAccessible(true); | ||||
|                 Map map = (Map) field.get(null); | ||||
|                 mods.write(1, map.containsKey(entityClass) ? ((Integer) map.get(entityClass)).intValue() : 0); | ||||
|             } catch (Exception e1) { | ||||
|                 e1.printStackTrace(); | ||||
|             } | ||||
|  | ||||
|             mods.write(2, entity.at.a(loc.getX())); | ||||
|             mods.write(3, (int) Math.floor(loc.getY() * 32D)); | ||||
|             mods.write(4, entity.at.a(loc.getZ())); | ||||
| @@ -115,7 +132,7 @@ public class Disguise { | ||||
|  | ||||
|         } else if (getType().isMisc()) { | ||||
|  | ||||
|             getEntity(((CraftEntity) e).getHandle().world, e.getLocation(), e.getEntityId()); | ||||
|             // getEntity(((CraftEntity) e).getHandle().world, e.getLocation(), e.getEntityId()); | ||||
|             int id = getType().getEntityId(); | ||||
|             int data = 0; | ||||
|             if (((MiscDisguise) this).getId() >= 0) | ||||
| @@ -159,9 +176,9 @@ public class Disguise { | ||||
|  | ||||
|         } else if (getType().isPlayer()) { | ||||
|  | ||||
|             EntityPlayer entityPlayer = (EntityPlayer) getEntity(((CraftEntity) e).getHandle().world, e.getLocation(), | ||||
|                     e.getEntityId()); | ||||
|             entityPlayer.name = ((PlayerDisguise) this).getName(); | ||||
|             // EntityPlayer entityPlayer = (EntityPlayer) getEntity(((CraftEntity) e).getHandle().world, e.getLocation(), | ||||
|             // e.getEntityId()); | ||||
|             // entityPlayer.name = ((PlayerDisguise) this).getName(); | ||||
|             spawnPacket = manager.createPacket(Packets.Server.NAMED_ENTITY_SPAWN); | ||||
|             StructureModifier<Object> mods = spawnPacket.getModifier(); | ||||
|             mods.write(0, e.getEntityId()); | ||||
| @@ -182,37 +199,7 @@ public class Disguise { | ||||
|         return spawnPacket; | ||||
|     } | ||||
|  | ||||
|     public Entity getEntity(World world, Location loc, int entityId) { | ||||
|         if (entity != null) { | ||||
|             entity.setLocation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); | ||||
|             entity.id = entityId; | ||||
|             return entity; | ||||
|         } | ||||
|         try { | ||||
|             if (disguiseType == DisguiseType.PLAYER) { | ||||
|                 entity = new EntityPlayer(MinecraftServer.getServer(), world, ((PlayerDisguise) this).getName(), | ||||
|                         new PlayerInteractManager(world)); | ||||
|             } else { | ||||
|                 String name = toReadable(disguiseType.name()); | ||||
|                 if (disguiseType == DisguiseType.WITHER_SKELETON) { | ||||
|                     name = "Skeleton"; | ||||
|                 } else if (disguiseType == DisguiseType.PRIMED_TNT) { | ||||
|                     name = "TNTPrimed"; | ||||
|                 } else if (disguiseType == DisguiseType.MINECART_TNT) { | ||||
|                     name = "MinecartTNT"; | ||||
|                 } | ||||
|                 Class entityClass = Class.forName("net.minecraft.server.v1_5_R3.Entity" + name); | ||||
|                 Constructor<?> contructor = entityClass.getDeclaredConstructor(World.class); | ||||
|                 entity = (Entity) contructor.newInstance(world); | ||||
|                 if (disguiseType == DisguiseType.WITHER_SKELETON) { | ||||
|                     ((EntitySkeleton) entity).setSkeletonType(1); | ||||
|                 } | ||||
|             } | ||||
|         } catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|         entity.setLocation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); | ||||
|         entity.id = entityId; | ||||
|     public void constructWatcher(EntityType type, int entityId) { | ||||
|         try { | ||||
|             String name; | ||||
|             if (getType().isPlayer()) { | ||||
| @@ -223,16 +210,18 @@ public class Disguise { | ||||
|             Class watcherClass = Class.forName("me.libraryaddict.disguise.DisguiseTypes.Watchers." + name + "Watcher"); | ||||
|             Constructor<?> contructor = watcherClass.getDeclaredConstructor(int.class); | ||||
|             watcher = (FlagWatcher) contructor.newInstance(entityId); | ||||
|             if (watcher instanceof AgeableWatcher && this instanceof MobDisguise) { | ||||
|                 ((AgeableWatcher) watcher).setValue(12, ((MobDisguise) this).isAdult() ? 0 : -23999); | ||||
|             } | ||||
|             WatcherValues entity = WatcherValues.valueOf(type.name()); | ||||
|             WatcherValues disguise = WatcherValues.valueOf(getType().name()); | ||||
|             for (int i : entity.getValues()) { | ||||
|                 if (disguise.getValue(i) != null && disguise.getValue(i).getClass() != entity.getValue(i).getClass()) | ||||
|                     watcher.setValue(i, disguise.getValue(i)); | ||||
|             } | ||||
|         } catch (Exception ex) { | ||||
|             // There is no watcher for this entity | ||||
|         } | ||||
|         if (watcher == null && entity instanceof EntityAgeable && this instanceof MobDisguise) { | ||||
|             watcher = new AgeableWatcher(entityId); | ||||
|         } | ||||
|         if (watcher instanceof AgeableWatcher && this instanceof MobDisguise) { | ||||
|             ((AgeableWatcher) watcher).setValue(12, ((MobDisguise) this).isAdult() ? 0 : -23999); | ||||
|         } | ||||
|         return entity; | ||||
|     } | ||||
|  | ||||
|     public DisguiseType getType() { | ||||
| @@ -247,6 +236,14 @@ public class Disguise { | ||||
|         return watcher != null; | ||||
|     } | ||||
|  | ||||
|     public boolean replaceSounds() { | ||||
|         return replaceSounds; | ||||
|     } | ||||
|  | ||||
|     public void setReplaceSounds(boolean areSoundsReplaced) { | ||||
|         replaceSounds = areSoundsReplaced; | ||||
|     } | ||||
|  | ||||
|     private String toReadable(String string) { | ||||
|         String[] strings = string.split("_"); | ||||
|         string = ""; | ||||
|   | ||||
| @@ -12,7 +12,7 @@ public enum DisguiseSound { | ||||
|  | ||||
|     BLAZE(Sound.BLAZE_HIT, null, Sound.BLAZE_DEATH, Sound.BLAZE_BREATH), | ||||
|  | ||||
|     CAVE_SPIDER(Sound.SPIDER_IDLE, Sound.SPIDER_WALK, Sound.SPIDER_DEATH, Sound.PIG_IDLE), | ||||
|     CAVE_SPIDER(Sound.SPIDER_IDLE, Sound.SPIDER_WALK, Sound.SPIDER_DEATH, Sound.SPIDER_IDLE), | ||||
|  | ||||
|     CHICKEN(Sound.CHICKEN_HURT, Sound.CHICKEN_WALK, Sound.CHICKEN_HURT, Sound.CHICKEN_IDLE, Sound.CHICKEN_EGG_POP), | ||||
|  | ||||
| @@ -28,7 +28,7 @@ public enum DisguiseSound { | ||||
|     GHAST(Sound.GHAST_SCREAM, null, Sound.GHAST_DEATH, Sound.GHAST_MOAN, Sound.GHAST_CHARGE, Sound.GHAST_FIREBALL, | ||||
|             Sound.GHAST_SCREAM2), | ||||
|  | ||||
|     GIANT_ZOMBIE(Sound.HURT_FLESH, Sound.STEP_GRASS, null, null), | ||||
|     GIANT(Sound.HURT_FLESH, Sound.STEP_GRASS, null, null), | ||||
|  | ||||
|     IRON_GOLEM(Sound.IRONGOLEM_HIT, Sound.IRONGOLEM_WALK, Sound.IRONGOLEM_DEATH, Sound.IRONGOLEM_THROW), | ||||
|  | ||||
| @@ -52,7 +52,7 @@ public enum DisguiseSound { | ||||
|  | ||||
|     SLIME(Sound.SLIME_ATTACK, Sound.SLIME_WALK2, null, null, Sound.SLIME_WALK), | ||||
|  | ||||
|     SPIDER(Sound.SPIDER_IDLE, Sound.SPIDER_WALK, Sound.SPIDER_DEATH, Sound.PIG_IDLE), | ||||
|     SPIDER(Sound.SPIDER_IDLE, Sound.SPIDER_WALK, Sound.SPIDER_DEATH, Sound.SPIDER_IDLE), | ||||
|  | ||||
|     WITHER(Sound.WITHER_HURT, null, Sound.WITHER_DEATH, Sound.WITHER_IDLE, Sound.WITHER_SHOOT, Sound.WITHER_SPAWN), | ||||
|  | ||||
| @@ -74,8 +74,6 @@ public enum DisguiseSound { | ||||
|  | ||||
|     public static DisguiseSound getType(String name) { | ||||
|         try { | ||||
|             if (name.equals("GIANT")) | ||||
|                 return DisguiseSound.GIANT_ZOMBIE; | ||||
|             return valueOf(name); | ||||
|         } catch (Exception ex) { | ||||
|             return null; | ||||
| @@ -124,16 +122,15 @@ public enum DisguiseSound { | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Used to check if the original sound is owned by this disguise sound Ofc it won't be correct for commonly shared names. But | ||||
|      * its the best I can possibly do | ||||
|      * Used to check if this sound name is owned by this disguise sound. | ||||
|      */ | ||||
|     public SoundType ownsSound(String name) { | ||||
|     public SoundType getType(String name, boolean ignoreDamage) { | ||||
|         if (isCancelSound(name)) | ||||
|             return SoundType.CANCEL; | ||||
|         if (disguiseSounds.get(SoundType.STEP) == Sound.STEP_GRASS && name.startsWith("step.")) | ||||
|             return SoundType.STEP; | ||||
|         for (SoundType type : SoundType.values()) { | ||||
|             if (!disguiseSounds.containsKey(type)) | ||||
|             if (!disguiseSounds.containsKey(type) || type == SoundType.DEATH || (ignoreDamage && type == SoundType.HURT)) | ||||
|                 continue; | ||||
|             Sound s = disguiseSounds.get(type); | ||||
|             if (s != null) | ||||
|   | ||||
| @@ -5,33 +5,23 @@ public enum DisguiseType { | ||||
|             EntityType.MOB), COW(EntityType.MOB), CREEPER(EntityType.MOB), EGG(EntityType.MISC, 62), ENDER_CRYSTAL( | ||||
|             EntityType.MISC, 51), ENDER_DRAGON(EntityType.MOB), ENDER_PEARL(EntityType.MISC, 65), ENDER_SIGNAL(EntityType.MISC, | ||||
|             72), ENDERMAN(EntityType.MOB), EXPERIENCE_ORB(EntityType.MISC), FALLING_BLOCK(EntityType.MISC, 70, 1), FIREWORKS( | ||||
|             EntityType.MISC, 76), FISHING_HOOK(EntityType.MISC, 90), GHAST(EntityType.MOB), GIANT_ZOMBIE(EntityType.MOB), IRON_GOLEM( | ||||
|             EntityType.MOB), ITEM(EntityType.MISC, 2, 1), ITEM_FRAME(EntityType.MISC, 71), LARGE_FIREBALL(EntityType.MISC, 63, 0), MAGMA_CUBE( | ||||
|             EntityType.MOB), MINECART_CHEST(EntityType.MISC, 10, 1), MINECART_FURNACE(EntityType.MISC, 10, 2), MINECART_HOPPER( | ||||
|             EntityType.MISC, 76), FISHING_HOOK(EntityType.MISC, 90), GHAST(EntityType.MOB), GIANT(EntityType.MOB), IRON_GOLEM( | ||||
|             EntityType.MOB), DROPPED_ITEM(EntityType.MISC, 2, 1), ITEM_FRAME(EntityType.MISC, 71), FIREBALL(EntityType.MISC, 63, | ||||
|             0), MAGMA_CUBE(EntityType.MOB), MINECART_CHEST(EntityType.MISC, 10, 1), MINECART_FURNACE(EntityType.MISC, 10, 2), MINECART_HOPPER( | ||||
|             EntityType.MISC, 10), MINECART_MOB_SPAWNER(EntityType.MISC, 10, 4), MINECART_RIDEABLE(EntityType.MISC, 10, 0), MINECART_TNT( | ||||
|             EntityType.MISC, 10, 3), MUSHROOM_COW(EntityType.MOB), OCELOT(EntityType.MOB), PAINTING(EntityType.MISC), PIG(EntityType.MOB), PIG_ZOMBIE( | ||||
|             EntityType.MOB), PLAYER(EntityType.PLAYER), POTION(EntityType.MISC, 73), PRIMED_TNT(EntityType.MISC, 50), SHEEP( | ||||
|             EntityType.MOB), SILVERFISH(EntityType.MOB), SKELETON(EntityType.MOB), SLIME(EntityType.MOB), SMALL_FIREBALL( | ||||
|             EntityType.MISC, 64, 0), SNOWBALL(EntityType.MISC, 61), SNOWMAN(EntityType.MOB), SPIDER(EntityType.MOB), SQUID( | ||||
|             EntityType.MOB), THROWN_EXP_BOTTLE(EntityType.MISC, 75), VILLAGER(EntityType.MOB), WITCH(EntityType.MOB), WITHER( | ||||
|             EntityType.MOB), WITHER_SKELETON(EntityType.MOB), WITHER_SKULL(EntityType.MISC, 66), WOLF(EntityType.MOB), ZOMBIE( | ||||
|             EntityType.MOB); | ||||
|             EntityType.MISC, 10, 3), MUSHROOM_COW(EntityType.MOB), OCELOT(EntityType.MOB), PAINTING(EntityType.MISC), PIG( | ||||
|             EntityType.MOB), PIG_ZOMBIE(EntityType.MOB), PLAYER(EntityType.PLAYER), SPLASH_POTION(EntityType.MISC, 73), PRIMED_TNT( | ||||
|             EntityType.MISC, 50), SHEEP(EntityType.MOB), SILVERFISH(EntityType.MOB), SKELETON(EntityType.MOB), SLIME( | ||||
|             EntityType.MOB), SMALL_FIREBALL(EntityType.MISC, 64, 0), SNOWBALL(EntityType.MISC, 61), SNOWMAN(EntityType.MOB), SPIDER( | ||||
|             EntityType.MOB), SQUID(EntityType.MOB), THROWN_EXP_BOTTLE(EntityType.MISC, 75), VILLAGER(EntityType.MOB), WITCH( | ||||
|             EntityType.MOB), WITHER(EntityType.MOB), WITHER_SKELETON(EntityType.MOB), WITHER_SKULL(EntityType.MISC, 66), WOLF( | ||||
|             EntityType.MOB), ZOMBIE(EntityType.MOB); | ||||
|  | ||||
|     public static enum EntityType { | ||||
|         MISC, MOB, PLAYER; | ||||
|     } | ||||
|  | ||||
|     public static DisguiseType getType(org.bukkit.entity.EntityType entityType) { | ||||
|         if (entityType == org.bukkit.entity.EntityType.SPLASH_POTION) | ||||
|             return DisguiseType.POTION; | ||||
|         else if (entityType == org.bukkit.entity.EntityType.GIANT) | ||||
|             return DisguiseType.GIANT_ZOMBIE; | ||||
|         else if (entityType == org.bukkit.entity.EntityType.DROPPED_ITEM) | ||||
|             return DisguiseType.ITEM; | ||||
|         else if (entityType == org.bukkit.entity.EntityType.FIREBALL) | ||||
|             return DisguiseType.LARGE_FIREBALL; | ||||
|         else if (entityType == org.bukkit.entity.EntityType.SMALL_FIREBALL) | ||||
|             return DisguiseType.LARGE_FIREBALL; | ||||
|         return DisguiseType.valueOf(entityType.name()); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -26,6 +26,7 @@ public abstract class FlagWatcher { | ||||
|     } | ||||
|     private int entityId; | ||||
|     private HashMap<Integer, Object> entityValues = new HashMap<Integer, Object>(); | ||||
|     private HashMap<Integer, Object> softReplace = new HashMap<Integer, Object>(); | ||||
|  | ||||
|     protected FlagWatcher(int entityId) { | ||||
|         this.entityId = entityId; | ||||
| @@ -65,6 +66,10 @@ public abstract class FlagWatcher { | ||||
|                         watch.a(value); | ||||
|                     } | ||||
|                 } | ||||
|             } else if (softReplace.containsKey(watch.a())) { | ||||
|                 if (watch.b().getClass() == softReplace.get(watch.a()).getClass()) { | ||||
|  | ||||
|                 } | ||||
|             } | ||||
|             newList.add(watch); | ||||
|         } | ||||
| @@ -83,6 +88,31 @@ public abstract class FlagWatcher { | ||||
|         return newList; | ||||
|     } | ||||
|  | ||||
|     private WatchableObject processWatcher(WatchableObject watch, HashMap<Integer, Object> map) { | ||||
|         boolean doD = watch.d(); | ||||
|         watch = new WatchableObject(watch.c(), watch.a(), watch.b()); | ||||
|         if (!doD) | ||||
|             watch.a(false); | ||||
|         if (map.get(watch.a()) == null) { | ||||
|             return watch; | ||||
|         } else { | ||||
|             Object value = map.get(watch.a()); | ||||
|             if (watch.b().getClass() != value.getClass()) { | ||||
|                 watch.a(value); | ||||
|                 try { | ||||
|                     Field field = WatchableObject.class.getDeclaredField("a"); | ||||
|                     field.setAccessible(true); | ||||
|                     field.set(watch, classTypes.get(value.getClass())); | ||||
|                 } catch (Exception ex) { | ||||
|                     ex.printStackTrace(); | ||||
|                 } | ||||
|             } else { | ||||
|                 watch.a(value); | ||||
|             } | ||||
|         } | ||||
|         return watch; | ||||
|     } | ||||
|  | ||||
|     public void displayName(boolean display) { | ||||
|         if ((Byte) getValue(6) != (display ? 1 : 0)) { | ||||
|             setValue(6, (byte) (display ? 1 : 0)); | ||||
|   | ||||
| @@ -5,13 +5,11 @@ public class MiscDisguise extends Disguise { | ||||
|     private int id = -1; | ||||
|  | ||||
|     public MiscDisguise(DisguiseType disguiseType) { | ||||
|         super(disguiseType); | ||||
|         id = disguiseType.getDefaultId(); | ||||
|         data = disguiseType.getDefaultData(); | ||||
|         this(disguiseType, true, -1, -1); | ||||
|     } | ||||
|  | ||||
|     public MiscDisguise(DisguiseType disguiseType, int id, int data) { | ||||
|         super(disguiseType); | ||||
|     public MiscDisguise(DisguiseType disguiseType, boolean replaceSounds, int id, int data) { | ||||
|         super(disguiseType, replaceSounds); | ||||
|         if (id == -1) | ||||
|             id = disguiseType.getDefaultId(); | ||||
|         if (data == -1) | ||||
| @@ -20,6 +18,10 @@ public class MiscDisguise extends Disguise { | ||||
|         this.data = data; | ||||
|     } | ||||
|  | ||||
|     public MiscDisguise(DisguiseType disguiseType, int id, int data) { | ||||
|         this(disguiseType, true, id, data); | ||||
|     } | ||||
|  | ||||
|     public int getData() { | ||||
|         return data; | ||||
|     } | ||||
|   | ||||
| @@ -1,40 +1,26 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes; | ||||
|  | ||||
| import net.minecraft.server.v1_5_R3.Entity; | ||||
| import net.minecraft.server.v1_5_R3.EntityAgeable; | ||||
| import net.minecraft.server.v1_5_R3.EntityLiving; | ||||
| import net.minecraft.server.v1_5_R3.EntityZombie; | ||||
| import net.minecraft.server.v1_5_R3.World; | ||||
|  | ||||
| import org.bukkit.Location; | ||||
| import me.libraryaddict.disguise.DisguiseTypes.Watchers.AgeableWatcher; | ||||
|  | ||||
| public class MobDisguise extends Disguise { | ||||
|  | ||||
|     private boolean adult; | ||||
|     private boolean isAdult; | ||||
|  | ||||
|     public MobDisguise(DisguiseType disguiseType, boolean isAdult) { | ||||
|         super(disguiseType); | ||||
|         adult = isAdult; | ||||
|         super(disguiseType, true); | ||||
|     } | ||||
|  | ||||
|     protected EntityLiving getEntityLiving(World w, Location loc, int id) { | ||||
|         Entity entity = getEntity(w, loc, id); | ||||
|         if (!adult) { | ||||
|             if (entity instanceof EntityAgeable) | ||||
|                 ((EntityAgeable) entity).setAge(-24000); | ||||
|             else if (entity instanceof EntityZombie) | ||||
|                 ((EntityZombie) entity).setBaby(true); | ||||
|         } | ||||
|         if (entity instanceof EntityLiving) | ||||
|             return (EntityLiving) entity; | ||||
|         return null; | ||||
|     public MobDisguise(DisguiseType disguiseType, boolean isAdult, boolean replaceSounds) { | ||||
|         super(disguiseType, replaceSounds); | ||||
|         this.isAdult = isAdult; | ||||
|     } | ||||
|  | ||||
|     public boolean isAdult() { | ||||
|         return adult; | ||||
|     } | ||||
|  | ||||
|     public void setAdult(boolean setAdult) { | ||||
|         adult = setAdult; | ||||
|         if (getWatcher() != null) { | ||||
|             if (getWatcher() instanceof AgeableWatcher) | ||||
|                 return ((AgeableWatcher) getWatcher()).isAdult(); | ||||
|             return false; | ||||
|         } | ||||
|         return isAdult; | ||||
|     } | ||||
| } | ||||
| @@ -4,7 +4,11 @@ public class PlayerDisguise extends Disguise { | ||||
|     private String playerName; | ||||
|  | ||||
|     public PlayerDisguise(String name) { | ||||
|         super(DisguiseType.PLAYER); | ||||
|         this(name, true); | ||||
|     } | ||||
|  | ||||
|     public PlayerDisguise(String name, boolean replaceSounds) { | ||||
|         super(DisguiseType.PLAYER, replaceSounds); | ||||
|         if (name.length() > 16) | ||||
|             name = name.substring(0, 16); | ||||
|         playerName = name; | ||||
|   | ||||
| @@ -0,0 +1,43 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes; | ||||
|  | ||||
| import java.util.HashMap; | ||||
| import java.util.Set; | ||||
|  | ||||
| public enum WatcherValues { | ||||
|     ARROW(16, (byte) 0), BAT(16, (byte) 0), BLAZE(16, (byte) 0), BOAT(19, 40, 17, 10, 18, 0), CAVE_SPIDER(), CHICKEN(12, 0), COW( | ||||
|             12, 0), CREEPER(16, (byte) 0, 17, (byte) 0), EGG(), ENDER_CRYSTAL(), ENDER_DRAGON(16, 300), ENDER_PEARL(), ENDER_SIGNAL(), ENDERMAN( | ||||
|             16, (byte) 0, 17, (byte) 1, 18, (byte) 0), EXPERIENCE_ORB(), FALLING_BLOCK(), FIREWORKS(), FISHING_HOOK(), GHAST(16, | ||||
|             (byte) 0), GIANT(), IRON_GOLEM(), DROPPED_ITEM(), ITEM_FRAME(2, 5, 3, (byte) 0), FIREBALL(), MAGMA_CUBE(16, (byte) 0, | ||||
|             18, (byte) 0), MINECART_CHEST(16, (byte) 0, 17, 0, 18, 1, 19, 0, 20, 0, 21, 6, 22, (byte) 0), MINECART_FURNACE(16, | ||||
|             (byte) 0, 17, 0, 18, 1, 19, 0, 20, 0, 21, 6, 22, (byte) 0), MINECART_HOPPER(16, (byte) 0, 17, 0, 18, 1, 19, 0, 20, 0, | ||||
|             21, 6, 22, (byte) 0), MINECART_MOB_SPAWNER(16, (byte) 0, 17, 0, 18, 1, 19, 0, 20, 0, 21, 6, 22, (byte) 0), MINECART_RIDEABLE( | ||||
|             16, (byte) 0, 17, 0, 18, 1, 19, 0, 20, 0, 21, 6, 22, (byte) 0), MINECART_TNT(16, (byte) 0, 17, 0, 18, 1, 19, 0, 20, | ||||
|             0, 21, 6, 22, (byte) 0), MUSHROOM_COW(12, 0), OCELOT(12, 0, 16, (byte) 0, 17, "", 18, (byte) 0), PAINTING(), PIG(12, | ||||
|             0, 16, (byte) 0), PIG_ZOMBIE(12, 0), PLAYER(8, 0, 9, (byte) 0, 10, (byte) 0), SPLASH_POTION(), PRIMED_TNT(), SHEEP( | ||||
|             12, (byte) 0, 16, (byte) 0), SILVERFISH(), SKELETON(13, (byte) 0), SLIME(16, (byte) 0, 18, (byte) 0), SMALL_FIREBALL(), SNOWBALL(), SNOWMAN(), SPIDER(), SQUID(), THROWN_EXP_BOTTLE(), VILLAGER( | ||||
|             16, 0), WITCH(), WITHER(16, 300), WITHER_SKELETON(13, (byte) 1), WITHER_SKULL(), WOLF(16, (byte) 0, 17, "", 18, 8, | ||||
|             19, (byte) 0, 20, (byte) 14), ZOMBIE(13, (byte) 0); | ||||
|     private HashMap<Integer, Object> values = new HashMap<Integer, Object>(); | ||||
|  | ||||
|     private WatcherValues(Object... obj) { | ||||
|         for (int i = 0; i < obj.length; i += 2) { | ||||
|             if (!values.containsKey(obj)) | ||||
|                 values.put((Integer) obj[i], obj[i + 1]); | ||||
|             else | ||||
|                 try { | ||||
|                     throw new Exception("Values in WatcherValues already contains " + obj + " for " + this.name()); | ||||
|                 } catch (Exception e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public Set<Integer> getValues() { | ||||
|         return values.keySet(); | ||||
|     } | ||||
|  | ||||
|     public Object getValue(int no) { | ||||
|         return values.get(no); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -2,7 +2,7 @@ package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher; | ||||
|  | ||||
| public class AgeableWatcher extends FlagWatcher { | ||||
| public abstract class AgeableWatcher extends FlagWatcher { | ||||
|  | ||||
|     public AgeableWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|   | ||||
| @@ -0,0 +1,21 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher; | ||||
|  | ||||
| public class ArrowWatcher extends FlagWatcher { | ||||
|  | ||||
|     protected ArrowWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|         setValue(16, (byte) 0); | ||||
|     } | ||||
|      | ||||
|     public void setMoving(boolean moving) { | ||||
|         setValue(16, (byte) (moving ? 1 : 0)); | ||||
|     } | ||||
|      | ||||
|     public boolean isMoving() { | ||||
|         return (Byte) getValue(16) == 1; | ||||
|     } | ||||
|      | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,9 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| public class ChickenWatcher extends AgeableWatcher { | ||||
|  | ||||
|     public ChickenWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,9 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| public class CowWatcher extends AgeableWatcher { | ||||
|  | ||||
|     public CowWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -6,7 +6,7 @@ public class CreeperWatcher extends FlagWatcher { | ||||
|  | ||||
|     public CreeperWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|         setValue(16, (byte) -1); | ||||
|         setValue(16, (byte) 0); | ||||
|         setValue(17, 0); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -0,0 +1,11 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher; | ||||
|  | ||||
| public class LivingEntityWatcher extends FlagWatcher { | ||||
|  | ||||
|     protected LivingEntityWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,9 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| public class MushroomCowWatcher extends AgeableWatcher { | ||||
|  | ||||
|     public MushroomCowWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,9 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| public class PigZombieWatcher extends AgeableWatcher { | ||||
|  | ||||
|     public PigZombieWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,12 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher; | ||||
|  | ||||
| public class SkeletonWatcher extends FlagWatcher { | ||||
|  | ||||
|     protected SkeletonWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|         setValue(13, (byte) 0); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -0,0 +1,12 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher; | ||||
|  | ||||
| public class WitherSkeletonWatcher extends FlagWatcher { | ||||
|  | ||||
|     protected WitherSkeletonWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|         setValue(13, (byte) 1); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,8 +1,6 @@ | ||||
| package me.libraryaddict.disguise.DisguiseTypes.Watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseTypes.FlagWatcher; | ||||
|  | ||||
| public class ZombieWatcher extends FlagWatcher { | ||||
| public class ZombieWatcher extends AgeableWatcher { | ||||
|  | ||||
|     public ZombieWatcher(int entityId) { | ||||
|         super(entityId); | ||||
|   | ||||
| @@ -33,8 +33,10 @@ public class LibsDisguises extends JavaPlugin { | ||||
|     @Override | ||||
|     public void onEnable() { | ||||
|         if (Bukkit.getPluginManager().getPlugin("ProtocolLib") == null) { | ||||
|             System.out.print("[LibsDisguises] WARNING! WARNING! LibsDisguises couldn't find ProtocolLib! This plugin depends on it to run!"); | ||||
|             System.out.print("[LibsDisguises] WARNING! WARNING! LibsDisguises couldn't find ProtocolLib! LibsDisguises is now shutting down!"); | ||||
|             System.out | ||||
|                     .print("[LibsDisguises] WARNING! WARNING! LibsDisguises couldn't find ProtocolLib! This plugin depends on it to run!"); | ||||
|             System.out | ||||
|                     .print("[LibsDisguises] WARNING! WARNING! LibsDisguises couldn't find ProtocolLib! LibsDisguises is now shutting down!"); | ||||
|             getPluginLoader().disablePlugin(this); | ||||
|             return; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user