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' | ||||
| ext.spigotVersion = '1.8.7-R0.1-SNAPSHOT' | ||||
|  | ||||
| ext.disguisesVersion = '8.5.1' | ||||
| ext.disguisesVersion = '8.5.2' | ||||
|  | ||||
| [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. | ||||
|      * @param disguise | ||||
|      * @return  | ||||
|      */ | ||||
|     public static int disguiseNextEntity(Disguise disguise) { | ||||
|         if (disguise == null) | ||||
| @@ -202,7 +204,7 @@ public class DisguiseAPI { | ||||
|             int id = field.getInt(null); | ||||
|             DisguiseUtilities.addFutureDisguise(id, (TargetedDisguise) disguise); | ||||
|             return id; | ||||
|         } catch (Exception ex) { | ||||
|         } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) { | ||||
|             ex.printStackTrace(System.out); | ||||
|         } | ||||
|         return -1; | ||||
| @@ -210,6 +212,8 @@ public class DisguiseAPI { | ||||
|  | ||||
|     /** | ||||
|      * Disguise this entity with this disguise | ||||
|      * @param entity | ||||
|      * @param disguise | ||||
|      */ | ||||
|     public static void disguiseToAll(Entity entity, Disguise disguise) { | ||||
|         if (disguise.getEntity() != null) { | ||||
|   | ||||
| @@ -197,7 +197,7 @@ public class DisguiseListener implements Listener { | ||||
|             event.setCancelled(true); | ||||
|             disguiseRunnable.remove(p.getName()).cancel(); | ||||
|             Entity entity = event.getRightClicked(); | ||||
|             String entityName = ""; | ||||
|             String entityName; | ||||
|             if (entity instanceof Player && !disguiseClone.containsKey(p.getName())) { | ||||
|                 entityName = ((Player) entity).getName(); | ||||
|             } else { | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package me.libraryaddict.disguise; | ||||
|  | ||||
| import com.comphenix.protocol.reflect.FieldAccessException; | ||||
| import java.io.IOException; | ||||
| 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.WrappedWatchableObject; | ||||
| import me.libraryaddict.disguise.utilities.FakeBoundingBox; | ||||
| import me.libraryaddict.disguise.utilities.Metrics; | ||||
| import org.bukkit.event.HandlerList; | ||||
|  | ||||
| @@ -87,7 +89,7 @@ public class LibsDisguises extends JavaPlugin { | ||||
|             if (disguiseType.getEntityType() == null) { | ||||
|                 continue; | ||||
|             } | ||||
|             Class watcherClass = null; | ||||
|             Class watcherClass; | ||||
|             try { | ||||
|                 switch (disguiseType) { | ||||
|                 case MINECART_CHEST: | ||||
| @@ -125,14 +127,18 @@ public class LibsDisguises extends JavaPlugin { | ||||
|             } catch (ClassNotFoundException ex) { | ||||
|                 // There is no explicit watcher for this entity. | ||||
|                 Class entityClass = disguiseType.getEntityType().getEntityClass(); | ||||
|                 if (Tameable.class.isAssignableFrom(entityClass)) { | ||||
|                     watcherClass = TameableWatcher.class; | ||||
|                 } else if (Ageable.class.isAssignableFrom(entityClass)) { | ||||
|                     watcherClass = AgeableWatcher.class; | ||||
|                 } else if (LivingEntity.class.isAssignableFrom(entityClass)) { | ||||
|                     watcherClass = LivingWatcher.class; | ||||
|                 if (entityClass != null) { | ||||
|                     if (Tameable.class.isAssignableFrom(entityClass)) { | ||||
|                         watcherClass = TameableWatcher.class; | ||||
|                     } else if (Ageable.class.isAssignableFrom(entityClass)) { | ||||
|                         watcherClass = AgeableWatcher.class; | ||||
|                     } else if (LivingEntity.class.isAssignableFrom(entityClass)) { | ||||
|                         watcherClass = LivingWatcher.class; | ||||
|                     } else { | ||||
|                         watcherClass = FlagWatcher.class; | ||||
|                     } | ||||
|                 } else { | ||||
|                     watcherClass = FlagWatcher.class; | ||||
|                     watcherClass = FlagWatcher.class; //Disguise is unknown type | ||||
|                 } | ||||
|             } | ||||
|             disguiseType.setWatcherClass(watcherClass); | ||||
| @@ -182,6 +188,15 @@ public class LibsDisguises extends JavaPlugin { | ||||
|                 break; | ||||
|             } | ||||
|             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); | ||||
|                 if (nmsEntity == null) { | ||||
|                     continue; | ||||
| @@ -201,14 +216,14 @@ public class LibsDisguises extends JavaPlugin { | ||||
|                     disguiseValues.setMetaValue(watch.getIndex(), watch.getValue()); | ||||
|                     // Uncomment when I need to find the new datawatcher values for a class.. | ||||
|  | ||||
|                     // System.out.print("Disguise: " + disguiseType + ", ID: " + watch.getIndex() + ", Class: " | ||||
|                     // + (watch.getValue() == null ? "null" : watch.getValue().getClass()) + ", Value: " + watch.getValue()); | ||||
| //                    System.out.print("Disguise: " + disguiseType + ", ID: " + watch.getIndex() + ", Class: " | ||||
| //                     + (watch.getValue() == null ? "null" : watch.getValue().getClass()) + ", Value: " + watch.getValue()); | ||||
|                 } | ||||
|                 DisguiseSound sound = DisguiseSound.getType(disguiseType.name()); | ||||
|                 if (sound != null) { | ||||
|                     Float soundStrength = ReflectionManager.getSoundModifier(nmsEntity); | ||||
|                     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.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] Before reporting this error, " | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package me.libraryaddict.disguise.commands; | ||||
|  | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
|  | ||||
| @@ -29,7 +30,7 @@ public class DisguiseEntityCommand extends BaseDisguiseCommand { | ||||
|                 sender.sendMessage(ex.getMessage()); | ||||
|             } | ||||
|             return true; | ||||
|         } catch (Exception ex) { | ||||
|         } catch (IllegalAccessException | InvocationTargetException ex) { | ||||
|             ex.printStackTrace(System.out); | ||||
|             return true; | ||||
|         } | ||||
|   | ||||
| @@ -147,7 +147,9 @@ public enum DisguiseType { | ||||
|  | ||||
|     ZOMBIE, | ||||
|  | ||||
|     ZOMBIE_VILLAGER; | ||||
|     ZOMBIE_VILLAGER, | ||||
|      | ||||
|     UNKNOWN; | ||||
|      | ||||
|     private static Method isVillager, getVariant, getSkeletonType, isElder; | ||||
|  | ||||
| @@ -253,7 +255,7 @@ public enum DisguiseType { | ||||
|         try { | ||||
|             return valueOf(entityType.name().toUpperCase()); | ||||
|         } catch (Throwable ex) { | ||||
|             return null; | ||||
|             return DisguiseType.UNKNOWN; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -316,6 +318,10 @@ public enum DisguiseType { | ||||
|         return this == DisguiseType.PLAYER; | ||||
|     } | ||||
|      | ||||
|     public boolean isUnknown() { | ||||
|         return this == DisguiseType.UNKNOWN; | ||||
|     } | ||||
|  | ||||
|     private void setEntityType(EntityType entityType) { | ||||
|         this.entityType = entityType; | ||||
|     } | ||||
|   | ||||
| @@ -345,6 +345,9 @@ 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.isUnknown()) { | ||||
|                 throw new DisguiseParseException(ChatColor.RED + "Error! You cannot disguise as " + ChatColor.GREEN + "Unknown!"); | ||||
|             } | ||||
|             if (disguiseType.getEntityType() == null) { | ||||
|                 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 | ||||
|      * @param disguise | ||||
|      */ | ||||
|     public static void setupFakeDisguise(final Disguise disguise) { | ||||
|         Entity e = disguise.getEntity(); | ||||
|   | ||||
| @@ -52,6 +52,7 @@ public class DisguiseValues { | ||||
|     private HashMap<Integer, Object> metaValues = new HashMap<>(); | ||||
|     private Class nmsEntityClass; | ||||
|  | ||||
|     @SuppressWarnings("LeakingThisInConstructor") | ||||
|     public DisguiseValues(DisguiseType type, Class classType, int entitySize, double maxHealth) { | ||||
|         values.put(type, this); | ||||
|         enumEntitySize = entitySize; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| name: LibsDisguises | ||||
| main: me.libraryaddict.disguise.LibsDisguises | ||||
| version: 8.5.1 | ||||
| version: 8.5.2 | ||||
| author: libraryaddict | ||||
| authors: [Byteflux, Navid K.] | ||||
| depend: [ProtocolLib] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user