diff --git a/src/me/libraryaddict/disguise/LibsDisguises.java b/src/me/libraryaddict/disguise/LibsDisguises.java index e71c7021..8ff2a5d7 100644 --- a/src/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/me/libraryaddict/disguise/LibsDisguises.java @@ -10,11 +10,14 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.lang.reflect.Field; + 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; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.MinecartWatcher; @@ -23,9 +26,11 @@ 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; @@ -149,7 +154,7 @@ public class LibsDisguises extends JavaPlugin { */ private void registerValues() { for (DisguiseType disguiseType : DisguiseType.values()) { - if (disguiseType.getEntityType() == null) { + if (disguiseType.getEntityType() == null && !(disguiseType.is1_8() && LibVersion.is1_8())) { continue; } Class watcherClass = null; @@ -176,6 +181,9 @@ public class LibsDisguises extends JavaPlugin { case MAGMA_CUBE: watcherClass = SlimeWatcher.class; break; + case ELDER_GUARDIAN: + watcherClass = GuardianWatcher.class; + break; default: watcherClass = Class.forName("me.libraryaddict.disguise.disguisetypes.watchers." + toReadable(disguiseType.name()) + "Watcher"); @@ -195,6 +203,28 @@ public class LibsDisguises extends JavaPlugin { } } disguiseType.setWatcherClass(watcherClass); + 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: @@ -234,9 +264,6 @@ public class LibsDisguises extends JavaPlugin { default: break; } - if (DisguiseValues.getDisguiseValues(disguiseType) != null) { - continue; - } try { Object nmsEntity = ReflectionManager.createEntityInstance(nmsEntityName); if (nmsEntity == null) { @@ -292,7 +319,6 @@ public class LibsDisguises extends JavaPlugin { .print("[LibsDisguises] Development builds are available at (ProtocolLib) " + "http://assets.comphenix.net/job/ProtocolLib/ and (LibsDisguises) http://ci.md-5.net/job/LibsDisguises/"); } - System.out.print("[LibsDisguises] Note that these builds have not been reviewed by Bukkit for safety."); ex.printStackTrace(); } diff --git a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java index cf906e59..74303b90 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -19,6 +19,7 @@ import me.libraryaddict.disguise.utilities.DisguiseUtilities; 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.Location; @@ -63,7 +64,7 @@ public abstract class Disguise { protected void createDisguise(DisguiseType newType) { if (getWatcher() != null) return; - if (newType.getEntityType() == null) { + if (!(LibVersion.is1_8() && newType.is1_8()) && newType.getEntityType() == null) { throw new RuntimeException( "DisguiseType " + newType @@ -634,16 +635,19 @@ public abstract class Disguise { } Class nmsEntityClass = ReflectionManager.getNmsEntity(getEntity()).getClass(); Class nmsDisguiseClass = DisguiseValues.getNmsEntityClass(getType()); - // If they both extend the same base class. They OBVIOUSLY share the same datavalue. Right..? - if (baseClass != null && baseClass.isAssignableFrom(nmsDisguiseClass) && baseClass.isAssignableFrom(nmsEntityClass)) - continue; + if (nmsDisguiseClass != null) { + // If they both extend the same base class. They OBVIOUSLY share the same datavalue. Right..? + if (baseClass != null && baseClass.isAssignableFrom(nmsDisguiseClass) + && baseClass.isAssignableFrom(nmsEntityClass)) + continue; - // So they don't extend a basic class. - // Maybe if I check that they extend each other.. - // Seeing as I only store the finished forms of entitys. This should raise no problems and allow for more shared - // datawatchers. - if (nmsEntityClass.isAssignableFrom(nmsDisguiseClass) || nmsDisguiseClass.isAssignableFrom(nmsEntityClass)) - continue; + // So they don't extend a basic class. + // Maybe if I check that they extend each other.. + // Seeing as I only store the finished forms of entitys. This should raise no problems and allow for more shared + // datawatchers. + if (nmsEntityClass.isAssignableFrom(nmsDisguiseClass) || nmsDisguiseClass.isAssignableFrom(nmsEntityClass)) + continue; + } // Well I can't find a reason I should leave it alone. They will probably conflict. // Time to set the value to the disguises value so no conflicts! getWatcher().setBackupValue(dataNo, disguiseValues.get(dataNo)); diff --git a/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java b/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java index cf00e210..664792bd 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java +++ b/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java @@ -2,6 +2,8 @@ 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; @@ -10,6 +12,8 @@ import org.bukkit.entity.Skeleton; import org.bukkit.entity.Zombie; public enum DisguiseType { + ARMOR_STAND(FutureDisguiseType.ARMOR_STAND), + ARROW(60), BAT, @@ -32,6 +36,8 @@ public enum DisguiseType { EGG(62), + ELDER_GUARDIAN(FutureDisguiseType.ELDER_GUARDIAN), + ENDER_CRYSTAL(51), ENDER_DRAGON, @@ -42,6 +48,8 @@ public enum DisguiseType { ENDERMAN, + ENDERMITE(FutureDisguiseType.ENDERMITE), + EXPERIENCE_ORB, FALLING_BLOCK(70, 1), @@ -56,6 +64,8 @@ public enum DisguiseType { GIANT, + GUARDIAN(FutureDisguiseType.GUARDIAN), + HORSE, IRON_GOLEM, @@ -96,6 +106,8 @@ public enum DisguiseType { PRIMED_TNT(50), + RABBIT(FutureDisguiseType.RABBIT), + SHEEP, SILVERFISH, @@ -232,9 +244,10 @@ public enum DisguiseType { private int defaultId, entityId; private EntityType entityType; + private FutureDisguiseType futureType; private Class watcherClass; - private DisguiseType(int... ints) { + private DisguiseType(FutureDisguiseType disguiseType, int... ints) { for (int i = 0; i < ints.length; i++) { int value = ints[i]; switch (i) { @@ -248,12 +261,29 @@ public enum DisguiseType { break; } } + if (LibVersion.is1_8()) { + futureType = disguiseType; + } + } + + private DisguiseType(int... ints) { + this(null, ints); } public int getDefaultId() { return defaultId; } + public Class getEntityClass() { + if (futureType != null) { + return futureType.getEntityClass(); + } + if (entityType != null) { + return getEntityType().getEntityClass(); + } + return Entity.class; + } + public int getEntityId() { return entityId; } @@ -262,16 +292,28 @@ public enum DisguiseType { return entityType; } + public FutureDisguiseType getFutureType() { + return futureType; + } + + public int getTypeId() { + return is1_8() ? futureType.getEntityId() : (int) getEntityType().getTypeId(); + } + public Class getWatcherClass() { return watcherClass; } + public boolean is1_8() { + return futureType != null; + } + public boolean isMisc() { - return !getEntityType().isAlive(); + return is1_8() ? !futureType.isAlive() : getEntityType() != null && !getEntityType().isAlive(); } public boolean isMob() { - return getEntityType().isAlive() && this != DisguiseType.PLAYER; + return is1_8() ? futureType.isAlive() : getEntityType() != null && getEntityType().isAlive() && !isPlayer(); } public boolean isPlayer() { diff --git a/src/me/libraryaddict/disguise/disguisetypes/FutureDisguiseType.java b/src/me/libraryaddict/disguise/disguisetypes/FutureDisguiseType.java new file mode 100644 index 00000000..d3453e8f --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/FutureDisguiseType.java @@ -0,0 +1,178 @@ +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, (byte) 0, + + 15, (byte) 0, + + 18, (byte) 0 + + }); + + private float[] boundingBox; + private Object[] dataWatcher; + private Class entityClass; + private int entityId; + private float maxHealth; + + private FutureDisguiseType(Class 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 getEntityClass() { + return entityClass; + } + + public int getEntityId() { + return entityId; + } + + public float getMaxHealth() { + return maxHealth; + } + + public boolean isAlive() { + return this != ARMOR_STAND; + } + +} diff --git a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java index 7fef78ae..8e0dd11d 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java +++ b/src/me/libraryaddict/disguise/disguisetypes/TargetedDisguise.java @@ -6,7 +6,7 @@ import java.util.List; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.utilities.DisguiseUtilities; - +import me.libraryaddict.disguise.utilities.ReflectionManager; import org.bukkit.entity.Player; public abstract class TargetedDisguise extends Disguise { @@ -34,6 +34,8 @@ public abstract class TargetedDisguise extends Disguise { } public boolean canSee(Player player) { + if (getType() != null && (getType().is1_8() && !ReflectionManager.is1_8(player))) + return false; return canSee(player.getName()); } diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java new file mode 100644 index 00000000..abed6470 --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java @@ -0,0 +1,11 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; + +public class ArmorStandWatcher extends LivingWatcher { + + public ArmorStandWatcher(Disguise disguise) { + super(disguise); + } + +} diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/EndermiteWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/EndermiteWatcher.java new file mode 100644 index 00000000..b01bc5b5 --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/EndermiteWatcher.java @@ -0,0 +1,11 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; + +public class EndermiteWatcher extends LivingWatcher { + + public EndermiteWatcher(Disguise disguise) { + super(disguise); + } + +} diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java new file mode 100644 index 00000000..dc0b1f78 --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java @@ -0,0 +1,11 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; + +public class GuardianWatcher extends LivingWatcher { + + public GuardianWatcher(Disguise disguise) { + super(disguise); + } + +} diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java new file mode 100644 index 00000000..c1a1878d --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java @@ -0,0 +1,11 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; + +public class RabbitWatcher extends AgeableWatcher { + + public RabbitWatcher(Disguise disguise) { + super(disguise); + } + +} diff --git a/src/me/libraryaddict/disguise/utilities/BaseDisguiseCommand.java b/src/me/libraryaddict/disguise/utilities/BaseDisguiseCommand.java index c5786405..a7ac62af 100644 --- a/src/me/libraryaddict/disguise/utilities/BaseDisguiseCommand.java +++ b/src/me/libraryaddict/disguise/utilities/BaseDisguiseCommand.java @@ -14,6 +14,7 @@ import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.disguisetypes.MiscDisguise; import me.libraryaddict.disguise.disguisetypes.MobDisguise; import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; +import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -22,7 +23,6 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Ageable; import org.bukkit.entity.Animals; -import org.bukkit.entity.Entity; import org.bukkit.entity.Monster; import org.bukkit.inventory.ItemStack; import org.bukkit.permissions.PermissionAttachmentInfo; @@ -31,15 +31,15 @@ import org.bukkit.potion.PotionEffectType; public abstract class BaseDisguiseCommand implements CommandExecutor { public class DisguiseParseException extends Exception { - public DisguiseParseException(String string) { - super(string); - } + private static final long serialVersionUID = 1276971370793124510L; public DisguiseParseException() { super(); } - private static final long serialVersionUID = 1276971370793124510L; + public DisguiseParseException(String string) { + super(string); + } } @@ -147,7 +147,7 @@ public abstract class BaseDisguiseCommand implements CommandExecutor { } else { for (DisguiseType type : DisguiseType.values()) { HashMap, Boolean> options = null; - Class entityClass = type.getEntityType() == null ? Entity.class : type.getEntityType().getEntityClass(); + Class entityClass = type.getEntityClass(); if (disguiseType.equals("mob")) { if (type.isMob()) { options = getOptions(perm); @@ -203,7 +203,7 @@ public abstract class BaseDisguiseCommand implements CommandExecutor { } else { for (DisguiseType type : DisguiseType.values()) { boolean foundHim = false; - Class entityClass = type.getEntityType() == null ? Entity.class : type.getEntityType().getEntityClass(); + Class entityClass = type.getEntityClass(); if (disguiseType.equals("mob")) { if (type.isMob()) { foundHim = true; @@ -337,7 +337,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 (disguiseType.getEntityType() == null) { + if (!(LibVersion.is1_8() && disguiseType.is1_8()) && disguiseType.getEntityType() == null) { throw new DisguiseParseException(ChatColor.RED + "Error! This version of minecraft does not have that disguise!"); } if (!map.containsKey(disguiseType)) { diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 01e53d83..20489f09 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -264,7 +264,7 @@ public class DisguiseUtilities { destroyPacket.getIntegerArrays().write(0, new int[] { disguise.getEntity().getEntityId() }); for (Object p : cloned) { Player player = (Player) ReflectionManager.getBukkitEntity(p); - if (player == disguise.getEntity() || disguise.canSee(player.getName())) { + if (player == disguise.getEntity() || disguise.canSee(player)) { ProtocolLibrary.getProtocolManager().sendServerPacket(player, destroyPacket); } } @@ -787,7 +787,7 @@ public class DisguiseUtilities { HashSet cloned = (HashSet) trackedPlayers.clone(); for (final Object p : cloned) { Player player = (Player) ReflectionManager.getBukkitEntity(p); - if (disguise.getEntity() != player && disguise.canSee(player.getName())) { + if (disguise.getEntity() != player && disguise.canSee(player)) { clear.invoke(entityTrackerEntry, p); ProtocolLibrary.getProtocolManager().sendServerPacket(player, destroyPacket); Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() { diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 49f7354b..d9905562 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -277,14 +277,14 @@ public class PacketsManager { delayedPackets = new PacketContainer[] { delayedPacket }; } - } else if (disguise.getType().isMob()) { + } else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) { DisguiseValues values = DisguiseValues.getDisguiseValues(disguise.getType()); Vector vec = disguisedEntity.getVelocity(); spawnPackets[0] = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY_LIVING); StructureModifier mods = spawnPackets[0].getModifier(); mods.write(0, disguisedEntity.getEntityId()); - mods.write(1, (int) disguise.getType().getEntityType().getTypeId()); + mods.write(1, disguise.getType().getTypeId()); // TODO double d1 = 3.9D; double d2 = vec.getX(); double d3 = vec.getY(); @@ -421,7 +421,7 @@ public class PacketsManager { value = (byte) -(value + 128); break; default: - if (disguiseType.isMisc()) { + if (disguiseType.isMisc() && disguiseType != DisguiseType.ARMOR_STAND) { value -= 64; } break;