Added rudimentary support for disguising Custom Entities and Modded Entities
Added the DisguiseType 'Unknown', obviously can't be used by players Cleaned up code
This commit is contained in:
		| @@ -13,7 +13,7 @@ println 'Compiling LibsDisguises via Gradle ver. ' + gradle.gradleVersion | |||||||
| sourceCompatibility = '1.7' | sourceCompatibility = '1.7' | ||||||
| ext.spigotVersion = '1.8.7-R0.1-SNAPSHOT' | ext.spigotVersion = '1.8.7-R0.1-SNAPSHOT' | ||||||
|  |  | ||||||
| ext.disguisesVersion = '8.5.1' | ext.disguisesVersion = '8.5.2' | ||||||
|  |  | ||||||
| [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' | [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' | ||||||
|  |  | ||||||
|   | |||||||
| @@ -189,6 +189,8 @@ public class DisguiseAPI { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Disguise the next entity to spawn with this disguise. This may not work however if the entity doesn't actually spawn. |      * Disguise the next entity to spawn with this disguise. This may not work however if the entity doesn't actually spawn. | ||||||
|  |      * @param disguise | ||||||
|  |      * @return  | ||||||
|      */ |      */ | ||||||
|     public static int disguiseNextEntity(Disguise disguise) { |     public static int disguiseNextEntity(Disguise disguise) { | ||||||
|         if (disguise == null) |         if (disguise == null) | ||||||
| @@ -202,7 +204,7 @@ public class DisguiseAPI { | |||||||
|             int id = field.getInt(null); |             int id = field.getInt(null); | ||||||
|             DisguiseUtilities.addFutureDisguise(id, (TargetedDisguise) disguise); |             DisguiseUtilities.addFutureDisguise(id, (TargetedDisguise) disguise); | ||||||
|             return id; |             return id; | ||||||
|         } catch (Exception ex) { |         } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) { | ||||||
|             ex.printStackTrace(System.out); |             ex.printStackTrace(System.out); | ||||||
|         } |         } | ||||||
|         return -1; |         return -1; | ||||||
| @@ -210,6 +212,8 @@ public class DisguiseAPI { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Disguise this entity with this disguise |      * Disguise this entity with this disguise | ||||||
|  |      * @param entity | ||||||
|  |      * @param disguise | ||||||
|      */ |      */ | ||||||
|     public static void disguiseToAll(Entity entity, Disguise disguise) { |     public static void disguiseToAll(Entity entity, Disguise disguise) { | ||||||
|         if (disguise.getEntity() != null) { |         if (disguise.getEntity() != null) { | ||||||
| @@ -333,4 +337,4 @@ public class DisguiseAPI { | |||||||
|  |  | ||||||
|     private DisguiseAPI() { |     private DisguiseAPI() { | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -197,7 +197,7 @@ public class DisguiseListener implements Listener { | |||||||
|             event.setCancelled(true); |             event.setCancelled(true); | ||||||
|             disguiseRunnable.remove(p.getName()).cancel(); |             disguiseRunnable.remove(p.getName()).cancel(); | ||||||
|             Entity entity = event.getRightClicked(); |             Entity entity = event.getRightClicked(); | ||||||
|             String entityName = ""; |             String entityName; | ||||||
|             if (entity instanceof Player && !disguiseClone.containsKey(p.getName())) { |             if (entity instanceof Player && !disguiseClone.containsKey(p.getName())) { | ||||||
|                 entityName = ((Player) entity).getName(); |                 entityName = ((Player) entity).getName(); | ||||||
|             } else { |             } else { | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| package me.libraryaddict.disguise; | package me.libraryaddict.disguise; | ||||||
|  |  | ||||||
|  | import com.comphenix.protocol.reflect.FieldAccessException; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.lang.reflect.Field; | import java.lang.reflect.Field; | ||||||
|  |  | ||||||
| @@ -31,6 +32,7 @@ import org.bukkit.plugin.java.JavaPlugin; | |||||||
|  |  | ||||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher; | import com.comphenix.protocol.wrappers.WrappedDataWatcher; | ||||||
| import com.comphenix.protocol.wrappers.WrappedWatchableObject; | import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||||
|  | import me.libraryaddict.disguise.utilities.FakeBoundingBox; | ||||||
| import me.libraryaddict.disguise.utilities.Metrics; | import me.libraryaddict.disguise.utilities.Metrics; | ||||||
| import org.bukkit.event.HandlerList; | import org.bukkit.event.HandlerList; | ||||||
|  |  | ||||||
| @@ -87,7 +89,7 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|             if (disguiseType.getEntityType() == null) { |             if (disguiseType.getEntityType() == null) { | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|             Class watcherClass = null; |             Class watcherClass; | ||||||
|             try { |             try { | ||||||
|                 switch (disguiseType) { |                 switch (disguiseType) { | ||||||
|                 case MINECART_CHEST: |                 case MINECART_CHEST: | ||||||
| @@ -125,14 +127,18 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|             } catch (ClassNotFoundException ex) { |             } catch (ClassNotFoundException ex) { | ||||||
|                 // There is no explicit watcher for this entity. |                 // There is no explicit watcher for this entity. | ||||||
|                 Class entityClass = disguiseType.getEntityType().getEntityClass(); |                 Class entityClass = disguiseType.getEntityType().getEntityClass(); | ||||||
|                 if (Tameable.class.isAssignableFrom(entityClass)) { |                 if (entityClass != null) { | ||||||
|                     watcherClass = TameableWatcher.class; |                     if (Tameable.class.isAssignableFrom(entityClass)) { | ||||||
|                 } else if (Ageable.class.isAssignableFrom(entityClass)) { |                         watcherClass = TameableWatcher.class; | ||||||
|                     watcherClass = AgeableWatcher.class; |                     } else if (Ageable.class.isAssignableFrom(entityClass)) { | ||||||
|                 } else if (LivingEntity.class.isAssignableFrom(entityClass)) { |                         watcherClass = AgeableWatcher.class; | ||||||
|                     watcherClass = LivingWatcher.class; |                     } else if (LivingEntity.class.isAssignableFrom(entityClass)) { | ||||||
|  |                         watcherClass = LivingWatcher.class; | ||||||
|  |                     } else { | ||||||
|  |                         watcherClass = FlagWatcher.class; | ||||||
|  |                     } | ||||||
|                 } else { |                 } else { | ||||||
|                     watcherClass = FlagWatcher.class; |                     watcherClass = FlagWatcher.class; //Disguise is unknown type | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             disguiseType.setWatcherClass(watcherClass); |             disguiseType.setWatcherClass(watcherClass); | ||||||
| @@ -182,6 +188,15 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|             try { |             try { | ||||||
|  |                 if (nmsEntityName.equalsIgnoreCase("Unknown")) { | ||||||
|  |                     DisguiseValues disguiseValues = new DisguiseValues(disguiseType, null, 0, 0); | ||||||
|  |                     disguiseValues.setAdultBox(new FakeBoundingBox(0, 0, 0)); | ||||||
|  |                     DisguiseSound sound = DisguiseSound.getType(disguiseType.name()); | ||||||
|  |                     if (sound != null) { | ||||||
|  |                         sound.setDamageAndIdleSoundVolume(1f); | ||||||
|  |                     } | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|                 Object nmsEntity = ReflectionManager.createEntityInstance(nmsEntityName); |                 Object nmsEntity = ReflectionManager.createEntityInstance(nmsEntityName); | ||||||
|                 if (nmsEntity == null) { |                 if (nmsEntity == null) { | ||||||
|                     continue; |                     continue; | ||||||
| @@ -201,14 +216,14 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|                     disguiseValues.setMetaValue(watch.getIndex(), watch.getValue()); |                     disguiseValues.setMetaValue(watch.getIndex(), watch.getValue()); | ||||||
|                     // Uncomment when I need to find the new datawatcher values for a class.. |                     // Uncomment when I need to find the new datawatcher values for a class.. | ||||||
|  |  | ||||||
|                     // System.out.print("Disguise: " + disguiseType + ", ID: " + watch.getIndex() + ", Class: " | //                    System.out.print("Disguise: " + disguiseType + ", ID: " + watch.getIndex() + ", Class: " | ||||||
|                     // + (watch.getValue() == null ? "null" : watch.getValue().getClass()) + ", Value: " + watch.getValue()); | //                     + (watch.getValue() == null ? "null" : watch.getValue().getClass()) + ", Value: " + watch.getValue()); | ||||||
|                 } |                 } | ||||||
|                 DisguiseSound sound = DisguiseSound.getType(disguiseType.name()); |                 DisguiseSound sound = DisguiseSound.getType(disguiseType.name()); | ||||||
|                 if (sound != null) { |                 if (sound != null) { | ||||||
|                     Float soundStrength = ReflectionManager.getSoundModifier(nmsEntity); |                     Float soundStrength = ReflectionManager.getSoundModifier(nmsEntity); | ||||||
|                     if (soundStrength != null) { |                     if (soundStrength != null) { | ||||||
|                         sound.setDamageAndIdleSoundVolume((Float) soundStrength); |                         sound.setDamageAndIdleSoundVolume(soundStrength); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| @@ -222,7 +237,7 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|                     disguiseValues.setBabyBox(ReflectionManager.getBoundingBox(bukkitEntity)); |                     disguiseValues.setBabyBox(ReflectionManager.getBoundingBox(bukkitEntity)); | ||||||
|                 } |                 } | ||||||
|                 disguiseValues.setEntitySize(ReflectionManager.getSize(bukkitEntity)); |                 disguiseValues.setEntitySize(ReflectionManager.getSize(bukkitEntity)); | ||||||
|             } catch (Exception ex) { |             } catch (SecurityException | IllegalArgumentException | IllegalAccessException | FieldAccessException ex) { | ||||||
|                 System.out.print("[LibsDisguises] Uh oh! Trouble while making values for the disguise " + disguiseType.name() |                 System.out.print("[LibsDisguises] Uh oh! Trouble while making values for the disguise " + disguiseType.name() | ||||||
|                         + "!"); |                         + "!"); | ||||||
|                 System.out.print("[LibsDisguises] Before reporting this error, " |                 System.out.print("[LibsDisguises] Before reporting this error, " | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| package me.libraryaddict.disguise.commands; | package me.libraryaddict.disguise.commands; | ||||||
|  |  | ||||||
|  | import java.lang.reflect.InvocationTargetException; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
|  |  | ||||||
| @@ -29,7 +30,7 @@ public class DisguiseEntityCommand extends BaseDisguiseCommand { | |||||||
|                 sender.sendMessage(ex.getMessage()); |                 sender.sendMessage(ex.getMessage()); | ||||||
|             } |             } | ||||||
|             return true; |             return true; | ||||||
|         } catch (Exception ex) { |         } catch (IllegalAccessException | InvocationTargetException ex) { | ||||||
|             ex.printStackTrace(System.out); |             ex.printStackTrace(System.out); | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -147,8 +147,10 @@ public enum DisguiseType { | |||||||
|  |  | ||||||
|     ZOMBIE, |     ZOMBIE, | ||||||
|  |  | ||||||
|     ZOMBIE_VILLAGER; |     ZOMBIE_VILLAGER, | ||||||
|  |      | ||||||
|  |     UNKNOWN; | ||||||
|  |      | ||||||
|     private static Method isVillager, getVariant, getSkeletonType, isElder; |     private static Method isVillager, getVariant, getSkeletonType, isElder; | ||||||
|  |  | ||||||
|     static { |     static { | ||||||
| @@ -253,7 +255,7 @@ public enum DisguiseType { | |||||||
|         try { |         try { | ||||||
|             return valueOf(entityType.name().toUpperCase()); |             return valueOf(entityType.name().toUpperCase()); | ||||||
|         } catch (Throwable ex) { |         } catch (Throwable ex) { | ||||||
|             return null; |             return DisguiseType.UNKNOWN; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -315,6 +317,10 @@ public enum DisguiseType { | |||||||
|     public boolean isPlayer() { |     public boolean isPlayer() { | ||||||
|         return this == DisguiseType.PLAYER; |         return this == DisguiseType.PLAYER; | ||||||
|     } |     } | ||||||
|  |      | ||||||
|  |     public boolean isUnknown() { | ||||||
|  |         return this == DisguiseType.UNKNOWN; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     private void setEntityType(EntityType entityType) { |     private void setEntityType(EntityType entityType) { | ||||||
|         this.entityType = entityType; |         this.entityType = entityType; | ||||||
| @@ -330,4 +336,4 @@ public enum DisguiseType { | |||||||
|             split[i] = split[i].substring(0, 1) + split[i].substring(1).toLowerCase(); |             split[i] = split[i].substring(0, 1) + split[i].substring(1).toLowerCase(); | ||||||
|         return StringUtils.join(split, " "); |         return StringUtils.join(split, " "); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -345,6 +345,9 @@ public abstract class BaseDisguiseCommand implements CommandExecutor { | |||||||
|                 throw new DisguiseParseException(ChatColor.RED + "Error! The disguise " + ChatColor.GREEN + args[0] |                 throw new DisguiseParseException(ChatColor.RED + "Error! The disguise " + ChatColor.GREEN + args[0] | ||||||
|                         + ChatColor.RED + " doesn't exist!"); |                         + ChatColor.RED + " doesn't exist!"); | ||||||
|             } |             } | ||||||
|  |             if (disguiseType.isUnknown()) { | ||||||
|  |                 throw new DisguiseParseException(ChatColor.RED + "Error! You cannot disguise as " + ChatColor.GREEN + "Unknown!"); | ||||||
|  |             } | ||||||
|             if (disguiseType.getEntityType() == null) { |             if (disguiseType.getEntityType() == null) { | ||||||
|                 throw new DisguiseParseException(ChatColor.RED + "Error! This version of minecraft does not have that disguise!"); |                 throw new DisguiseParseException(ChatColor.RED + "Error! This version of minecraft does not have that disguise!"); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -970,6 +970,7 @@ public class DisguiseUtilities { | |||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Setup it so he can see himself when disguised |      * Setup it so he can see himself when disguised | ||||||
|  |      * @param disguise | ||||||
|      */ |      */ | ||||||
|     public static void setupFakeDisguise(final Disguise disguise) { |     public static void setupFakeDisguise(final Disguise disguise) { | ||||||
|         Entity e = disguise.getEntity(); |         Entity e = disguise.getEntity(); | ||||||
|   | |||||||
| @@ -52,6 +52,7 @@ public class DisguiseValues { | |||||||
|     private HashMap<Integer, Object> metaValues = new HashMap<>(); |     private HashMap<Integer, Object> metaValues = new HashMap<>(); | ||||||
|     private Class nmsEntityClass; |     private Class nmsEntityClass; | ||||||
|  |  | ||||||
|  |     @SuppressWarnings("LeakingThisInConstructor") | ||||||
|     public DisguiseValues(DisguiseType type, Class classType, int entitySize, double maxHealth) { |     public DisguiseValues(DisguiseType type, Class classType, int entitySize, double maxHealth) { | ||||||
|         values.put(type, this); |         values.put(type, this); | ||||||
|         enumEntitySize = entitySize; |         enumEntitySize = entitySize; | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| name: LibsDisguises | name: LibsDisguises | ||||||
| main: me.libraryaddict.disguise.LibsDisguises | main: me.libraryaddict.disguise.LibsDisguises | ||||||
| version: 8.5.1 | version: 8.5.2 | ||||||
| author: libraryaddict | author: libraryaddict | ||||||
| authors: [Byteflux, Navid K.] | authors: [Byteflux, Navid K.] | ||||||
| depend: [ProtocolLib] | depend: [ProtocolLib] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user