Add backwards support for 1.11.2, bugfixes, update to 1.12
This commit is contained in:
		| @@ -19,6 +19,7 @@ UpdateGameProfiles: true | ||||
| # Entities - Are entities disguises saved (This is everything that's not a player) | ||||
| # If you are using the dev builds, place your premium version of Lib's Disguises.jar inside the LibsDisguises folder | ||||
| # This will enable premium only features for the dev builds. | ||||
| # The saved disguises are saved in a json file format inside the plugin folder, there will be no other formats | ||||
| SaveDisguises: | ||||
|     Players: false | ||||
|     Entities: false | ||||
|   | ||||
							
								
								
									
										4
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -43,12 +43,12 @@ | ||||
|     <dependency> | ||||
|       <groupId>org.spigotmc</groupId> | ||||
|       <artifactId>spigot-api</artifactId> | ||||
|       <version>1.11-R0.1-SNAPSHOT</version> | ||||
|       <version>1.12-R0.1-SNAPSHOT</version> | ||||
|     </dependency> | ||||
|     <dependency> | ||||
|       <groupId>org.spigotmc</groupId> | ||||
|       <artifactId>spigot</artifactId> | ||||
|       <version>1.11-R0.1-SNAPSHOT</version> | ||||
|       <version>1.12-R0.1-SNAPSHOT</version> | ||||
|     </dependency> | ||||
|   </dependencies> | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.lang.reflect.Field; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.*; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.command.CommandExecutor; | ||||
| import org.bukkit.command.PluginCommand; | ||||
| @@ -41,18 +42,6 @@ import me.libraryaddict.disguise.commands.UndisguiseRadiusCommand; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.ArrowWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.GuardianWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.InsentientWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.MinecartWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.SkeletonWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.SlimeWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.SpiderWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.TNTWatcher; | ||||
| 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.DisguiseValues; | ||||
| @@ -77,15 +66,6 @@ public class LibsDisguises extends JavaPlugin { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             ReflectionManager.getNmsClass("EntityEvoker").getName(); | ||||
|         } | ||||
|         catch (Exception ex) { | ||||
|             System.err.println("[LibsDisguises] Lib's Disguises failed to startup, outdated server!"); | ||||
|             System.err.println("[LibsDisguises] This plugin does not offer backwards support!"); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         instance = this; | ||||
|         saveDefaultConfig(); | ||||
|  | ||||
| @@ -131,6 +111,7 @@ public class LibsDisguises extends JavaPlugin { | ||||
|             metrics.start(); | ||||
|         } | ||||
|         catch (IOException e) { | ||||
|             // Don't print error | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -166,10 +147,11 @@ public class LibsDisguises extends JavaPlugin { | ||||
|     private void registerValues() { | ||||
|         for (DisguiseType disguiseType : DisguiseType.values()) { | ||||
|             if (disguiseType.getEntityType() == null) { | ||||
|                 System.out.println("EntityType for " + disguiseType.name() + " not found"); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             Class watcherClass = null; | ||||
|             Class watcherClass; | ||||
|  | ||||
|             try { | ||||
|                 switch (disguiseType) { | ||||
| @@ -206,6 +188,10 @@ public class LibsDisguises extends JavaPlugin { | ||||
|                     case STRAY: | ||||
|                         watcherClass = SkeletonWatcher.class; | ||||
|                         break; | ||||
|                     case ILLUSIONER: | ||||
|                     case EVOKER: | ||||
|                         watcherClass = IllagerWizardWatcher.class; | ||||
|                         break; | ||||
|                     default: | ||||
|                         watcherClass = Class.forName("me.libraryaddict.disguise.disguisetypes.watchers." + toReadable( | ||||
|                                 disguiseType.name()) + "Watcher"); | ||||
| @@ -289,6 +275,10 @@ public class LibsDisguises extends JavaPlugin { | ||||
|                 case ARROW: | ||||
|                 case SPECTRAL_ARROW: | ||||
|                     nmsEntityName = "TippedArrow"; | ||||
|                     break; | ||||
|                 case ILLUSIONER: | ||||
|                     nmsEntityName = "IllagerIllusioner"; | ||||
|                     break; | ||||
|                 default: | ||||
|                     break; | ||||
|             } | ||||
| @@ -354,7 +344,6 @@ public class LibsDisguises extends JavaPlugin { | ||||
|                         System.err.println( | ||||
|                                 "Value is " + watch.getRawValue() + " (" + watch.getRawValue().getClass() + ") (" + nmsEntity.getClass() + ") & " + watcherClass.getSimpleName() + " which doesn't match up with " + flagType.getDefault().getClass()); | ||||
|                         System.err.println("Lib's Disguises will continue to load, but this will not work properly!"); | ||||
|                         continue; | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|   | ||||
| @@ -1,24 +1,5 @@ | ||||
| package me.libraryaddict.disguise.commands; | ||||
|  | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collection; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
|  | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.command.Command; | ||||
| import org.bukkit.command.CommandSender; | ||||
| import org.bukkit.command.TabCompleter; | ||||
| import org.bukkit.craftbukkit.v1_11_R1.command.CraftBlockCommandSender; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| @@ -28,6 +9,20 @@ import me.libraryaddict.disguise.utilities.DisguiseParser.DisguiseParseException | ||||
| import me.libraryaddict.disguise.utilities.DisguiseParser.DisguisePerm; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionFlagWatchers; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionFlagWatchers.ParamInfo; | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.command.BlockCommandSender; | ||||
| import org.bukkit.command.Command; | ||||
| import org.bukkit.command.CommandSender; | ||||
| import org.bukkit.command.TabCompleter; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.*; | ||||
|  | ||||
| public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements TabCompleter { | ||||
|     private int maxRadius = 30; | ||||
| @@ -49,7 +44,7 @@ public class DisguiseModifyRadiusCommand extends DisguiseBaseCommand implements | ||||
|             center = ((Player) sender).getLocation(); | ||||
|         } | ||||
|         else { | ||||
|             center = ((CraftBlockCommandSender) sender).getBlock().getLocation().add(0.5, 0, 0.5); | ||||
|             center = ((BlockCommandSender) sender).getBlock().getLocation().add(0.5, 0, 0.5); | ||||
|         } | ||||
|  | ||||
|         return center.getWorld().getNearbyEntities(center, radius, radius, radius); | ||||
|   | ||||
| @@ -1,24 +1,5 @@ | ||||
| package me.libraryaddict.disguise.commands; | ||||
|  | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
|  | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.command.Command; | ||||
| import org.bukkit.command.CommandSender; | ||||
| import org.bukkit.command.TabCompleter; | ||||
| import org.bukkit.craftbukkit.v1_11_R1.command.CraftBlockCommandSender; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.entity.LivingEntity; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| @@ -30,6 +11,24 @@ import me.libraryaddict.disguise.utilities.DisguiseParser.DisguiseParseException | ||||
| import me.libraryaddict.disguise.utilities.DisguiseParser.DisguisePerm; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionFlagWatchers; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionFlagWatchers.ParamInfo; | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.command.BlockCommandSender; | ||||
| import org.bukkit.command.Command; | ||||
| import org.bukkit.command.CommandSender; | ||||
| import org.bukkit.command.TabCompleter; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.entity.LivingEntity; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
|  | ||||
| public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCompleter { | ||||
|     private int maxRadius = 30; | ||||
| @@ -72,8 +71,9 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|  | ||||
|             Collections.sort(classes); | ||||
|  | ||||
|             sender.sendMessage(ChatColor.DARK_GREEN + "EntityTypes usable are: " + ChatColor.GREEN | ||||
|                     + StringUtils.join(classes, ChatColor.DARK_GREEN + ", " + ChatColor.GREEN) + ChatColor.DARK_GREEN + "."); | ||||
|             sender.sendMessage( | ||||
|                     ChatColor.DARK_GREEN + "EntityTypes usable are: " + ChatColor.GREEN + StringUtils.join(classes, | ||||
|                             ChatColor.DARK_GREEN + ", " + ChatColor.GREEN) + ChatColor.DARK_GREEN + "."); | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
| @@ -105,11 +105,10 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|         } | ||||
|  | ||||
|         if (args.length == starting + 1) { | ||||
|             sender.sendMessage(ChatColor.RED + "You need to supply a disguise as well as the radius" | ||||
|                     + (starting != 0 ? " and EntityType" : "")); | ||||
|             sender.sendMessage(ChatColor.RED + "You need to supply a disguise as well as the radius" + (starting != 0 ? | ||||
|                     " and EntityType" : "")); | ||||
|             return true; | ||||
|         } | ||||
|         else if (args.length < 2) { | ||||
|         } else if (args.length < 2) { | ||||
|             sender.sendMessage(ChatColor.RED + "You need to supply a radius as well as the disguise"); | ||||
|             return true; | ||||
|         } | ||||
| @@ -122,7 +121,8 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|         int radius = Integer.parseInt(args[starting]); | ||||
|  | ||||
|         if (radius > maxRadius) { | ||||
|             sender.sendMessage(ChatColor.RED + "Limited radius to " + maxRadius + "! Don't want to make too much lag right?"); | ||||
|             sender.sendMessage( | ||||
|                     ChatColor.RED + "Limited radius to " + maxRadius + "! Don't want to make too much lag right?"); | ||||
|             radius = maxRadius; | ||||
|         } | ||||
|  | ||||
| @@ -158,9 +158,8 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|  | ||||
|         if (sender instanceof Player) { | ||||
|             center = ((Player) sender).getLocation(); | ||||
|         } | ||||
|         else { | ||||
|             center = ((CraftBlockCommandSender) sender).getBlock().getLocation().add(0.5, 0, 0.5); | ||||
|         } else { | ||||
|             center = ((BlockCommandSender) sender).getBlock().getLocation().add(0.5, 0, 0.5); | ||||
|         } | ||||
|  | ||||
|         for (Entity entity : center.getWorld().getNearbyEntities(center, radius, radius, radius)) { | ||||
| @@ -169,8 +168,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|             } | ||||
|  | ||||
|             if (type != null ? entity.getType() == type : entityClass.isAssignableFrom(entity.getClass())) { | ||||
|                 if (disguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() | ||||
|                         && entity instanceof LivingEntity) { | ||||
|                 if (disguise.isMiscDisguise() && !DisguiseConfig.isMiscDisguisesForLivingEnabled() && entity instanceof LivingEntity) { | ||||
|                     miscDisguises++; | ||||
|                     continue; | ||||
|                 } | ||||
| @@ -196,14 +194,13 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|  | ||||
|         if (disguisedEntitys > 0) { | ||||
|             sender.sendMessage(ChatColor.RED + "Successfully disguised " + disguisedEntitys + " entities!"); | ||||
|         } | ||||
|         else { | ||||
|         } else { | ||||
|             sender.sendMessage(ChatColor.RED + "Couldn't find any entities to disguise!"); | ||||
|         } | ||||
|  | ||||
|         if (miscDisguises > 0) { | ||||
|             sender.sendMessage(ChatColor.RED + "Failed to disguise " + miscDisguises | ||||
|                     + " entities because the option to disguise a living entity as a non-living has been disabled in the config"); | ||||
|             sender.sendMessage( | ||||
|                     ChatColor.RED + "Failed to disguise " + miscDisguises + " entities because the option to disguise a living entity as a non-living has been disabled in the config"); | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
| @@ -244,8 +241,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|             for (String type : getAllowedDisguises(perms)) { | ||||
|                 tabs.add(type); | ||||
|             } | ||||
|         } | ||||
|         else { | ||||
|         } else { | ||||
|  | ||||
|             DisguisePerm disguiseType = DisguiseParser.getDisguisePerm(args[starting]); | ||||
|  | ||||
| @@ -256,13 +252,12 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|                 for (Player player : Bukkit.getOnlinePlayers()) { | ||||
|                     tabs.add(player.getName()); | ||||
|                 } | ||||
|             } | ||||
|             else { | ||||
|             } else { | ||||
|                 ArrayList<String> usedOptions = new ArrayList<String>(); | ||||
|  | ||||
|                 for (Method method : ReflectionFlagWatchers.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { | ||||
|                     for (int i = disguiseType.getType() == DisguiseType.PLAYER ? starting + 2 | ||||
|                             : starting + 1; i < args.length; i++) { | ||||
|                     for (int i = disguiseType.getType() == DisguiseType.PLAYER ? starting + 2 : | ||||
|                             starting + 1; i < args.length; i++) { | ||||
|                         String arg = args[i]; | ||||
|  | ||||
|                         if (!method.getName().equalsIgnoreCase(arg)) | ||||
| @@ -288,8 +283,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|                                 for (String e : info.getEnums(origArgs[origArgs.length - 1])) { | ||||
|                                     tabs.add(e); | ||||
|                                 } | ||||
|                             } | ||||
|                             else { | ||||
|                             } else { | ||||
|                                 if (info.getParamClass() == String.class) { | ||||
|                                     for (Player player : Bukkit.getOnlinePlayers()) { | ||||
|                                         tabs.add(player.getName()); | ||||
| @@ -301,7 +295,8 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|  | ||||
|                     if (addMethods) { | ||||
|                         // If this is a method, add. Else if it can be a param of the previous argument, add. | ||||
|                         for (Method method : ReflectionFlagWatchers.getDisguiseWatcherMethods(disguiseType.getWatcherClass())) { | ||||
|                         for (Method method : ReflectionFlagWatchers.getDisguiseWatcherMethods( | ||||
|                                 disguiseType.getWatcherClass())) { | ||||
|                             tabs.add(method.getName()); | ||||
|                         } | ||||
|                     } | ||||
| @@ -316,31 +311,34 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom | ||||
|      * Send the player the information | ||||
|      */ | ||||
|     @Override | ||||
|     protected void sendCommandUsage(CommandSender sender, HashMap<DisguisePerm, HashMap<ArrayList<String>, Boolean>> map) { | ||||
|     protected void sendCommandUsage(CommandSender sender, | ||||
|             HashMap<DisguisePerm, HashMap<ArrayList<String>, Boolean>> map) { | ||||
|         ArrayList<String> allowedDisguises = getAllowedDisguises(map); | ||||
|  | ||||
|         sender.sendMessage(ChatColor.DARK_GREEN + "Disguise all entities in a radius! Caps at " + maxRadius + " blocks!"); | ||||
|         sender.sendMessage(ChatColor.DARK_GREEN + "You can use the disguises: " + ChatColor.GREEN | ||||
|                 + StringUtils.join(allowedDisguises, ChatColor.RED + ", " + ChatColor.GREEN)); | ||||
|         sender.sendMessage( | ||||
|                 ChatColor.DARK_GREEN + "Disguise all entities in a radius! Caps at " + maxRadius + " blocks!"); | ||||
|         sender.sendMessage(ChatColor.DARK_GREEN + "You can use the disguises: " + ChatColor.GREEN + StringUtils.join( | ||||
|                 allowedDisguises, ChatColor.RED + ", " + ChatColor.GREEN)); | ||||
|  | ||||
|         String optional = ChatColor.DARK_GREEN + "(" + ChatColor.GREEN + "Optional" + ChatColor.DARK_GREEN + ")"; | ||||
|  | ||||
|         if (allowedDisguises.contains("player")) { | ||||
|             sender.sendMessage((ChatColor.DARK_GREEN + "/disguiseradius <EntityType" + optional + "> <Radius> player <Name>") | ||||
|                     .replace("<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); | ||||
|             sender.sendMessage( | ||||
|                     (ChatColor.DARK_GREEN + "/disguiseradius <EntityType" + optional + "> <Radius> player <Name>").replace( | ||||
|                             "<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); | ||||
|         } | ||||
|  | ||||
|         sender.sendMessage((ChatColor.DARK_GREEN + "/disguiseradius <EntityType" + optional + "> <Radius> <DisguiseType> <Baby" | ||||
|                 + optional + ">").replace("<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); | ||||
|         sender.sendMessage( | ||||
|                 (ChatColor.DARK_GREEN + "/disguiseradius <EntityType" + optional + "> <Radius> <DisguiseType> <Baby" + optional + ">").replace( | ||||
|                         "<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); | ||||
|  | ||||
|         if (allowedDisguises.contains("dropped_item") || allowedDisguises.contains("falling_block")) { | ||||
|             sender.sendMessage((ChatColor.DARK_GREEN + "/disguiseradius <EntityType" + optional | ||||
|                     + "> <Radius> <Dropped_Item/Falling_Block> <Id> <Durability" + optional + ">") | ||||
|                             .replace("<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); | ||||
|             sender.sendMessage( | ||||
|                     (ChatColor.DARK_GREEN + "/disguiseradius <EntityType" + optional + "> <Radius> <Dropped_Item/Falling_Block> <Id> <Durability" + optional + ">").replace( | ||||
|                             "<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); | ||||
|         } | ||||
|  | ||||
|         sender.sendMessage( | ||||
|                 ChatColor.DARK_GREEN + "See the EntityType's usable by " + ChatColor.GREEN + "/disguiseradius EntityTypes"); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -4,8 +4,7 @@ import java.util.ArrayList; | ||||
| import java.util.Iterator; | ||||
| import java.util.List; | ||||
|  | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.LibVersion; | ||||
| import me.libraryaddict.disguise.utilities.LibsVersion; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.ChatColor; | ||||
| import org.bukkit.command.Command; | ||||
| @@ -59,7 +58,7 @@ public class LibsDisguisesCommand implements CommandExecutor, TabCompleter { | ||||
|                     + "/libsdisguises reload" + ChatColor.DARK_GREEN | ||||
|                     + " to reload the config. All disguises will be blown by doing this."); | ||||
|  | ||||
|             if (LibVersion.isPremium()) { | ||||
|             if (LibsVersion.isPremium()) { | ||||
|                 sender.sendMessage(ChatColor.DARK_GREEN + "This server supports the plugin developer!"); | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.disguisetypes; | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.omg.CORBA.UNKNOWN; | ||||
|  | ||||
| public enum DisguiseType { | ||||
|     AREA_EFFECT_CLOUD(3, 0), | ||||
| @@ -71,6 +72,8 @@ public enum DisguiseType { | ||||
|  | ||||
|     HUSK, | ||||
|  | ||||
|     ILLUSIONER, | ||||
|  | ||||
|     IRON_GOLEM, | ||||
|  | ||||
|     ITEM_FRAME(71), | ||||
| @@ -105,6 +108,8 @@ public enum DisguiseType { | ||||
|  | ||||
|     PAINTING, | ||||
|  | ||||
|     PARROT, | ||||
|  | ||||
|     PIG, | ||||
|  | ||||
|     PIG_ZOMBIE, | ||||
| @@ -212,7 +217,6 @@ public enum DisguiseType { | ||||
|         DisguiseType disguiseType = getType(entity.getType()); | ||||
|  | ||||
|         return disguiseType; | ||||
|  | ||||
|     } | ||||
|  | ||||
|     public static DisguiseType getType(EntityType entityType) { | ||||
| @@ -235,16 +239,16 @@ public enum DisguiseType { | ||||
|             int value = ints[i]; | ||||
|  | ||||
|             switch (i) { | ||||
|             case 0: | ||||
|                 objectId = value; | ||||
|                 case 0: | ||||
|                     objectId = value; | ||||
|  | ||||
|                 break; | ||||
|             case 1: | ||||
|                 defaultData = value; | ||||
|                     break; | ||||
|                 case 1: | ||||
|                     defaultData = value; | ||||
|  | ||||
|                 break; | ||||
|             default: | ||||
|                 break; | ||||
|                     break; | ||||
|                 default: | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -267,7 +271,7 @@ public enum DisguiseType { | ||||
|  | ||||
|     /** | ||||
|      * The object type send in packets when spawning a misc entity. Otherwise, -1. | ||||
|      *  | ||||
|      * | ||||
|      * @return | ||||
|      */ | ||||
|     public int getObjectId() { | ||||
| @@ -276,7 +280,7 @@ public enum DisguiseType { | ||||
|  | ||||
|     /** | ||||
|      * The TYPE id of this entity. Different from the Object Id send in spawn packets when spawning miscs. | ||||
|      *  | ||||
|      * | ||||
|      * @return | ||||
|      */ | ||||
|     public int getTypeId() { | ||||
|   | ||||
| @@ -5,8 +5,6 @@ import com.comphenix.protocol.ProtocolLibrary; | ||||
| import com.comphenix.protocol.events.PacketContainer; | ||||
| import com.comphenix.protocol.reflect.StructureModifier; | ||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher; | ||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
| import com.comphenix.protocol.wrappers.WrappedSignedProperty; | ||||
| import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| @@ -19,7 +17,6 @@ import org.bukkit.inventory.EntityEquipment; | ||||
| import org.bukkit.inventory.EquipmentSlot; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
|  | ||||
| import java.io.IOException; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.*; | ||||
|  | ||||
| @@ -224,6 +221,9 @@ public class FlagWatcher { | ||||
|     } | ||||
|  | ||||
|     protected <Y> Y getData(MetaIndex<Y> flagType) { | ||||
|         if (flagType == null) | ||||
|             return null; | ||||
|  | ||||
|         if (entityValues.containsKey(flagType.getIndex())) { | ||||
|             return (Y) entityValues.get(flagType.getIndex()); | ||||
|         } | ||||
| @@ -244,6 +244,9 @@ public class FlagWatcher { | ||||
|     } | ||||
|  | ||||
|     protected boolean hasValue(MetaIndex no) { | ||||
|         if (no == null) | ||||
|             return false; | ||||
|  | ||||
|         return entityValues.containsKey(no.getIndex()); | ||||
|     } | ||||
|  | ||||
| @@ -316,6 +319,9 @@ public class FlagWatcher { | ||||
|         List<WrappedWatchableObject> list = new ArrayList<>(); | ||||
|  | ||||
|         for (MetaIndex data : dataValues) { | ||||
|             if (data == null) | ||||
|                 continue; | ||||
|  | ||||
|             if (!entityValues.containsKey(data.getIndex()) || entityValues.get(data.getIndex()) == null) { | ||||
|                 continue; | ||||
|             } | ||||
| @@ -370,6 +376,9 @@ public class FlagWatcher { | ||||
|     } | ||||
|  | ||||
|     protected void setBackupValue(MetaIndex no, Object value) { | ||||
|         if (no == null) | ||||
|             return; | ||||
|  | ||||
|         backupEntityValues.put(no.getIndex(), value); | ||||
|     } | ||||
|  | ||||
| @@ -518,6 +527,9 @@ public class FlagWatcher { | ||||
|     } | ||||
|  | ||||
|     protected <Y> void setData(MetaIndex<Y> id, Y value) { | ||||
|         if (id == null) | ||||
|             return; | ||||
|  | ||||
|         if (value == null && id.getDefault() instanceof ItemStack) | ||||
|             throw new IllegalArgumentException("Cannot use null ItemStacks"); | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,8 @@ import com.comphenix.protocol.wrappers.BlockPosition; | ||||
| import com.comphenix.protocol.wrappers.EnumWrappers.Direction; | ||||
| import com.comphenix.protocol.wrappers.Vector3F; | ||||
| import com.comphenix.protocol.wrappers.WrappedBlockData; | ||||
| import com.comphenix.protocol.wrappers.nbt.NbtCompound; | ||||
| import com.comphenix.protocol.wrappers.nbt.NbtFactory; | ||||
| import com.google.common.base.Optional; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.*; | ||||
| import org.bukkit.Color; | ||||
| @@ -104,7 +106,9 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Boolean> ENTITY_SILENT = new MetaIndex<>(FlagWatcher.class, 4, false); | ||||
|  | ||||
|     public static MetaIndex<Byte> EVOKER_SPELL_TICKS = new MetaIndex<>(EvokerWatcher.class, 0, (byte) 0); | ||||
|     public static MetaIndex<Byte> ILLAGER_SPELL_TICKS = new MetaIndex<>(IllagerWizardWatcher.class, 0, (byte) 0); | ||||
|  | ||||
|     public static MetaIndex<Byte> ILLAGER_META = new MetaIndex<>(IllagerWatcher.class, 0, (byte) 0); | ||||
|  | ||||
|     public static MetaIndex<BlockPosition> FALLING_BLOCK_POSITION = new MetaIndex<>(FallingBlockWatcher.class, 0, | ||||
|             BlockPosition.ORIGIN); | ||||
| @@ -173,6 +177,8 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Integer> OCELOT_TYPE = new MetaIndex<>(OcelotWatcher.class, 0, 0); | ||||
|  | ||||
|     public static MetaIndex<Integer> PARROT_VARIANT = new MetaIndex<>(ParrotWatcher.class, 0, 0); | ||||
|  | ||||
|     public static MetaIndex<Boolean> PIG_SADDLED = new MetaIndex<>(PigWatcher.class, 0, false); | ||||
|  | ||||
|     public static MetaIndex<Integer> PIG_UNKNOWN = new MetaIndex<>(PigWatcher.class, 1, 0); | ||||
| @@ -185,6 +191,12 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Byte> PLAYER_SKIN = new MetaIndex<>(PlayerWatcher.class, 2, (byte) 127); | ||||
|  | ||||
|     public static MetaIndex<NbtCompound> PLAYER_LEFT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 4, | ||||
|             NbtFactory.ofCompound("None")); | ||||
|  | ||||
|     public static MetaIndex<NbtCompound> PLAYER_RIGHT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 5, | ||||
|             NbtFactory.ofCompound("None")); | ||||
|  | ||||
|     public static MetaIndex<Boolean> POLAR_BEAR_STANDING = new MetaIndex<>(PolarBearWatcher.class, 0, false); | ||||
|  | ||||
|     public static MetaIndex<Integer> RABBIT_TYPE = new MetaIndex<>(RabbitWatcher.class, 0, 0); | ||||
| @@ -261,13 +273,55 @@ public class MetaIndex<Y> { | ||||
|     public static MetaIndex<Boolean> ZOMBIE_VILLAGER_SHAKING = new MetaIndex<>(ZombieVillagerWatcher.class, 0, false); | ||||
|  | ||||
|     static { | ||||
|         setValues(); | ||||
|     } | ||||
|  | ||||
|     public static void fillInBlankIndexes() { | ||||
|         ArrayList<Entry<Class, ArrayList<MetaIndex>>> list = new ArrayList<>(); | ||||
|  | ||||
|         for (MetaIndex index : values()) { | ||||
|             Entry<Class, ArrayList<MetaIndex>> entry = null; | ||||
|  | ||||
|             for (Entry e : list) { | ||||
|                 if (e.getKey() != index.getFlagWatcher()) | ||||
|                     continue; | ||||
|  | ||||
|                 entry = e; | ||||
|                 break; | ||||
|             } | ||||
|  | ||||
|             if (entry == null) { | ||||
|                 entry = new AbstractMap.SimpleEntry(index.getFlagWatcher(), new ArrayList<MetaIndex>()); | ||||
|                 list.add(entry); | ||||
|             } | ||||
|  | ||||
|             entry.getValue().add(index); | ||||
|         } | ||||
|  | ||||
|         for (Entry<Class, ArrayList<MetaIndex>> entry : list) { | ||||
|             Collections.sort(entry.getValue(), new Comparator<MetaIndex>() { | ||||
|                 @Override | ||||
|                 public int compare(MetaIndex o1, MetaIndex o2) { | ||||
|                     return o1.getIndex() - o2.getIndex(); | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             for (MetaIndex ind : entry.getValue()) { | ||||
|                 ind._index = entry.getValue().indexOf(ind); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void orderMetaIndexes() { | ||||
|         for (MetaIndex flagType : values()) { | ||||
|             if (flagType.getFlagWatcher() == FlagWatcher.class) | ||||
|                 continue; | ||||
|  | ||||
|             flagType._index += getNoIndexes(flagType.getFlagWatcher().getSuperclass()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void validateMetadata() { | ||||
|         // Simple verification for the dev that he's setting up the FlagType's properly. | ||||
|         // All flag types should be from 0 to <Max Number> with no empty numbers. | ||||
|         // All flag types should never occur twice. | ||||
| @@ -384,6 +438,44 @@ public class MetaIndex<Y> { | ||||
|         return _values; | ||||
|     } | ||||
|  | ||||
|     public static void setValues() { | ||||
|         try { | ||||
|             _values = new MetaIndex[0]; | ||||
|  | ||||
|             for (Field field : MetaIndex.class.getFields()) { | ||||
|                 if (field.getType() != MetaIndex.class) | ||||
|                     continue; | ||||
|  | ||||
|                 MetaIndex index = (MetaIndex) field.get(null); | ||||
|  | ||||
|                 if (index == null) | ||||
|                     continue; | ||||
|  | ||||
|                 _values = Arrays.copyOf(_values, _values.length + 1); | ||||
|                 _values[_values.length - 1] = index; | ||||
|             } | ||||
|         } | ||||
|         catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void setMetaIndex(String name, MetaIndex metaIndex) { | ||||
|         try { | ||||
|             Field field = MetaIndex.class.getField(name); | ||||
|             MetaIndex index = (MetaIndex) field.get(null); | ||||
|  | ||||
|             field.set(null, metaIndex); | ||||
|         } | ||||
|         catch (NoSuchFieldException ex) { | ||||
|             System.out.println("The field '" + name + "' doesn't exist in MetaIndex!"); | ||||
|             Thread.dumpStack(); | ||||
|         } | ||||
|         catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private Y _defaultValue; | ||||
|     private int _index; | ||||
|     private Class<? extends FlagWatcher> _watcher; | ||||
| @@ -392,9 +484,6 @@ public class MetaIndex<Y> { | ||||
|         _index = index; | ||||
|         _watcher = watcher; | ||||
|         _defaultValue = defaultValue; | ||||
|  | ||||
|         _values = Arrays.copyOf(_values, _values.length + 1); | ||||
|         _values[_values.length - 1] = this; | ||||
|     } | ||||
|  | ||||
|     public Y getDefault() { | ||||
|   | ||||
| @@ -0,0 +1,12 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 9/06/2017. | ||||
|  */ | ||||
| public class IllagerWatcher extends InsentientWatcher { | ||||
|     public IllagerWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|     } | ||||
| } | ||||
| @@ -1,20 +1,20 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
| 
 | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| 
 | ||||
| public class EvokerWatcher extends InsentientWatcher { | ||||
| 
 | ||||
|     public EvokerWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|     } | ||||
| 
 | ||||
|     public void setSpellTicks(int spellTicks) { | ||||
|         setData(MetaIndex.EVOKER_SPELL_TICKS, (byte) spellTicks); | ||||
|         sendData(MetaIndex.EVOKER_SPELL_TICKS); | ||||
|     } | ||||
| 
 | ||||
|     public int getSpellTicks() { | ||||
|         return getData(MetaIndex.EVOKER_SPELL_TICKS); | ||||
|     } | ||||
| } | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
| 
 | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| 
 | ||||
| public class IllagerWizardWatcher extends IllagerWatcher { | ||||
| 
 | ||||
|     public IllagerWizardWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|     } | ||||
| 
 | ||||
|     public void setSpellTicks(int spellTicks) { | ||||
|         setData(MetaIndex.ILLAGER_SPELL_TICKS, (byte) spellTicks); | ||||
|         sendData(MetaIndex.ILLAGER_SPELL_TICKS); | ||||
|     } | ||||
| 
 | ||||
|     public int getSpellTicks() { | ||||
|         return getData(MetaIndex.ILLAGER_SPELL_TICKS); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,23 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import org.bukkit.entity.Parrot; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 9/06/2017. | ||||
|  */ | ||||
| public class ParrotWatcher extends TameableWatcher { | ||||
|     public ParrotWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     public Parrot.Variant getVariant() { | ||||
|         return Parrot.Variant.values()[getData(MetaIndex.PARROT_VARIANT)]; | ||||
|     } | ||||
|  | ||||
|     public void setVariant(Parrot.Variant variant) { | ||||
|         setData(MetaIndex.PARROT_VARIANT, variant.ordinal()); | ||||
|         sendData(MetaIndex.PARROT_VARIANT); | ||||
|     } | ||||
| } | ||||
| @@ -10,11 +10,7 @@ import org.bukkit.ChatColor; | ||||
| import org.bukkit.Material; | ||||
| import org.bukkit.block.BlockFace; | ||||
| import org.bukkit.command.CommandSender; | ||||
| import org.bukkit.entity.Ageable; | ||||
| import org.bukkit.entity.Animals; | ||||
| import org.bukkit.entity.EntityType; | ||||
| import org.bukkit.entity.Llama; | ||||
| import org.bukkit.entity.Monster; | ||||
| import org.bukkit.entity.*; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| import org.bukkit.permissions.PermissionAttachmentInfo; | ||||
| import org.bukkit.potion.PotionEffectType; | ||||
| @@ -23,7 +19,6 @@ import com.comphenix.protocol.wrappers.BlockPosition; | ||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
|  | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| import me.libraryaddict.disguise.commands.DisguiseBaseCommand; | ||||
| import me.libraryaddict.disguise.disguisetypes.AnimalColor; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| @@ -444,7 +439,7 @@ public class DisguiseParser { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static boolean isNumeric(String string) { | ||||
|     private static boolean isInteger(String string) { | ||||
|         try { | ||||
|             Integer.parseInt(string); | ||||
|             return true; | ||||
| @@ -463,7 +458,6 @@ public class DisguiseParser { | ||||
|      * @param args | ||||
|      * @param permissionMap | ||||
|      * @return | ||||
|      * @throws DisguiseBaseCommand.DisguiseParseException | ||||
|      * @throws java.lang.IllegalAccessException | ||||
|      * @throws java.lang.reflect.InvocationTargetException | ||||
|      */ | ||||
| @@ -576,13 +570,13 @@ public class DisguiseParser { | ||||
|                         // If the first arg is a number | ||||
|                         if (args[1].contains(":")) { | ||||
|                             String[] split = args[1].split(":"); | ||||
|                             if (isNumeric(split[1])) { | ||||
|                             if (isInteger(split[1])) { | ||||
|                                 secondArg = split[1]; | ||||
|                             } | ||||
|                             args[1] = split[0]; | ||||
|                         } | ||||
|  | ||||
|                         if (isNumeric(args[1])) { | ||||
|                         if (isInteger(args[1])) { | ||||
|                             miscId = Integer.parseInt(args[1]); | ||||
|                         } else { | ||||
|                             if (disguisePerm.getType() == DisguiseType.FALLING_BLOCK || disguisePerm.getType() == DisguiseType.DROPPED_ITEM) { | ||||
| @@ -614,7 +608,7 @@ public class DisguiseParser { | ||||
|                             } | ||||
|                             toSkip++; | ||||
|                             // If they also defined a data value | ||||
|                             if (args.length > 2 && secondArg == null && isNumeric(args[2])) { | ||||
|                             if (args.length > 2 && secondArg == null && isInteger(args[2])) { | ||||
|                                 secondArg = args[2]; | ||||
|                                 toSkip++; | ||||
|                             } | ||||
| @@ -706,7 +700,7 @@ public class DisguiseParser { | ||||
|                     if (valueString != null) { | ||||
|                         if (int.class == param) { | ||||
|                             // Parse to integer | ||||
|                             if (isNumeric(valueString)) { | ||||
|                             if (isInteger(valueString)) { | ||||
|                                 value = Integer.parseInt(valueString); | ||||
|                             } else { | ||||
|                                 throw parseToException("number", valueString, methodName); | ||||
| @@ -806,7 +800,8 @@ public class DisguiseParser { | ||||
|                             // Parse to potion effect | ||||
|                             try { | ||||
|                                 PotionEffectType potionType = PotionEffectType.getByName(valueString.toUpperCase()); | ||||
|                                 if (potionType == null && isNumeric(valueString)) { | ||||
|  | ||||
|                                 if (potionType == null && isInteger(valueString)) { | ||||
|                                     potionType = PotionEffectType.getById(Integer.parseInt(valueString)); | ||||
|                                 } | ||||
|  | ||||
| @@ -878,6 +873,8 @@ public class DisguiseParser { | ||||
|                             catch (Exception ex) { | ||||
|                                 throw parseToException("three numbers Number,Number,Number", valueString, methodName); | ||||
|                             } | ||||
|                         } else if (param.getName().equals("org.bukkit.entity.Parrot$Variant")) { | ||||
|                             value = callValueOf(param, valueString, methodName, "a parrot color"); | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
| @@ -949,7 +946,7 @@ public class DisguiseParser { | ||||
|  | ||||
|         int itemId = -1; | ||||
|  | ||||
|         if (isNumeric(split[0])) { | ||||
|         if (isInteger(split[0])) { | ||||
|             itemId = Integer.parseInt(split[0]); | ||||
|         } else { | ||||
|             try { | ||||
| @@ -963,7 +960,7 @@ public class DisguiseParser { | ||||
|             short itemDura = 0; | ||||
|  | ||||
|             if (split.length > 1) { | ||||
|                 if (isNumeric(split[1])) { | ||||
|                 if (isInteger(split[1])) { | ||||
|                     itemDura = Short.parseShort(split[1]); | ||||
|                 } else { | ||||
|                     throw parseToException("item ID:Durability combo", string, "%s"); | ||||
|   | ||||
| @@ -69,6 +69,10 @@ public enum DisguiseSound { | ||||
|             Sound.ENTITY_HORSE_STEP_WOOD, Sound.ENTITY_HORSE_ARMOR, Sound.ENTITY_HORSE_LAND, Sound.ENTITY_HORSE_JUMP, | ||||
|             Sound.ENTITY_HORSE_ANGRY), | ||||
|  | ||||
|     ILLUSIONER("entity.illusion_illager.hurt", null, "entity.illusion_illager.death", "entity.illusion_illager.ambient", | ||||
|             "entity.illusion_illager.cast_spell", "entity.illusion_illager" + ".prepare_blindness", | ||||
|             "entity.illusion_illager.prepare_mirror", "entity.illusion_illager.mirror_move"), | ||||
|  | ||||
|     IRON_GOLEM(Sound.ENTITY_IRONGOLEM_HURT, Sound.ENTITY_IRONGOLEM_STEP, Sound.ENTITY_IRONGOLEM_DEATH, | ||||
|             Sound.ENTITY_IRONGOLEM_ATTACK), | ||||
|  | ||||
| @@ -84,13 +88,28 @@ public enum DisguiseSound { | ||||
|     OCELOT(Sound.ENTITY_CAT_HURT, Sound.BLOCK_GRASS_STEP, Sound.ENTITY_CAT_HURT, Sound.ENTITY_CAT_AMBIENT, | ||||
|             Sound.ENTITY_CAT_PURR, Sound.ENTITY_CAT_PURREOW), | ||||
|  | ||||
|     PARROT("entity.parrot.hurt", "entity.parrot.step", "entity.parrot.death", "entity.parrot.ambient", | ||||
|             "entity.parrot.eat", "entity.parrot.fly", "entity.parrot.imitate.blaze", "entity.parrot.imitate.creeper", | ||||
|             "entity.parrot.imitate.elder_guardian", "entity.parrot.imitate.enderdragon", | ||||
|             "entity.parrot.imitate.enderman", "entity.parrot.imitate.endermite", | ||||
|             "entity.parrot.imitate.evocation_illager", "entity.parrot.imitate.ghast", "entity.parrot.imitate.husk", | ||||
|             "entity.parrot.imitate.illusion_illager", "entity.parrot.imitate.magmacube", | ||||
|             "entity.parrot.imitate.polar_bear", "entity.parrot.imitate.shulker", "entity.parrot.imitate.silverfish", | ||||
|             "entity.parrot.imitate.skeleton", "entity.parrot.imitate.slime", "entity.parrot.imitate.spider", | ||||
|             "entity.parrot.imitate.stray", "entity.parrot.imitate.vex", "entity.parrot.imitate.vindication_illager", | ||||
|             "entity.parrot.imitate.witch", "entity.parrot.imitate.wither", "entity.parrot.imitate.wither_skeleton", | ||||
|             "entity.parrot.imitate.wolf", "entity.parrot.imitate.zombie", "entity.parrot.imitate.zombie_pigman", | ||||
|             "entity.parrot.imitate.zombie_villager"), | ||||
|  | ||||
|     PIG(Sound.ENTITY_PIG_HURT, Sound.ENTITY_PIG_STEP, Sound.ENTITY_PIG_DEATH, Sound.ENTITY_PIG_AMBIENT), | ||||
|  | ||||
|     PIG_ZOMBIE(Sound.ENTITY_ZOMBIE_PIG_HURT, null, Sound.ENTITY_ZOMBIE_PIG_DEATH, Sound.ENTITY_ZOMBIE_PIG_AMBIENT, | ||||
|             Sound.ENTITY_ZOMBIE_PIG_ANGRY), | ||||
|  | ||||
|     PLAYER(Sound.ENTITY_PLAYER_HURT, | ||||
|             new Sound[]{Sound.BLOCK_STONE_STEP, Sound.BLOCK_GRASS_STEP, Sound.BLOCK_ANVIL_STEP, Sound.BLOCK_CLOTH_STEP, Sound.BLOCK_GLASS_STEP, Sound.BLOCK_GRAVEL_STEP, Sound.BLOCK_LADDER_STEP, Sound.BLOCK_METAL_STEP, Sound.BLOCK_SAND_STEP, Sound.BLOCK_SLIME_STEP, Sound.BLOCK_SNOW_STEP, Sound.BLOCK_WOOD_STEP}, | ||||
|             new Sound[]{Sound.BLOCK_STONE_STEP, Sound.BLOCK_GRASS_STEP, Sound.BLOCK_ANVIL_STEP, Sound.BLOCK_CLOTH_STEP, | ||||
|                     Sound.BLOCK_GLASS_STEP, Sound.BLOCK_GRAVEL_STEP, Sound.BLOCK_LADDER_STEP, Sound.BLOCK_METAL_STEP, | ||||
|                     Sound.BLOCK_SAND_STEP, Sound.BLOCK_SLIME_STEP, Sound.BLOCK_SNOW_STEP, Sound.BLOCK_WOOD_STEP}, | ||||
|             Sound.ENTITY_PLAYER_DEATH, null), | ||||
|  | ||||
|     RABBIT(Sound.ENTITY_RABBIT_HURT, Sound.ENTITY_RABBIT_JUMP, Sound.ENTITY_RABBIT_DEATH, Sound.ENTITY_RABBIT_AMBIENT), | ||||
|   | ||||
| @@ -12,7 +12,6 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher; | ||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
| import com.google.gson.Gson; | ||||
| import com.google.gson.GsonBuilder; | ||||
| import com.mojang.authlib.GameProfile; | ||||
| import com.mojang.authlib.properties.PropertyMap; | ||||
| import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| @@ -24,6 +23,8 @@ import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; | ||||
| import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; | ||||
| import me.libraryaddict.disguise.utilities.backwards.BackwardMethods; | ||||
| import me.libraryaddict.disguise.utilities.backwards.BackwardsSupport; | ||||
| import me.libraryaddict.disguise.utilities.json.*; | ||||
| import org.bukkit.*; | ||||
| import org.bukkit.block.BlockFace; | ||||
| @@ -46,8 +47,6 @@ import java.io.File; | ||||
| import java.io.FileReader; | ||||
| import java.io.PrintWriter; | ||||
| import java.lang.reflect.*; | ||||
| import java.net.URL; | ||||
| import java.net.URLClassLoader; | ||||
| import java.util.*; | ||||
| import java.util.regex.Pattern; | ||||
|  | ||||
| @@ -74,6 +73,7 @@ public class DisguiseUtilities { | ||||
|     private static File profileCache = new File("plugins/LibsDisguises/GameProfiles"), savedDisguises = new File( | ||||
|             "plugins/LibsDisguises/SavedDisguises"); | ||||
|     private static Gson gson; | ||||
|     private static BackwardMethods methods; | ||||
|  | ||||
|     public static void saveDisguises() { | ||||
|         Iterator<HashSet<TargetedDisguise>> itel = disguisesInUse.values().iterator(); | ||||
| @@ -132,7 +132,7 @@ public class DisguiseUtilities { | ||||
|     } | ||||
|  | ||||
|     public static void saveDisguises(UUID owningEntity, Disguise[] disguise) { | ||||
|         if (!LibVersion.isPremium()) | ||||
|         if (!LibsVersion.isPremium()) | ||||
|             return; | ||||
|  | ||||
|         try { | ||||
| @@ -171,7 +171,7 @@ public class DisguiseUtilities { | ||||
|     } | ||||
|  | ||||
|     public static Disguise[] getSavedDisguises(UUID entityUUID, boolean remove) { | ||||
|         if (!isSavedDisguise(entityUUID) || !LibVersion.isPremium()) | ||||
|         if (!isSavedDisguise(entityUUID) || !LibsVersion.isPremium()) | ||||
|             return new Disguise[0]; | ||||
|  | ||||
|         File disguiseFile = new File(savedDisguises, entityUUID.toString()); | ||||
| @@ -773,6 +773,7 @@ public class DisguiseUtilities { | ||||
|  | ||||
|     public static void init(LibsDisguises disguises) { | ||||
|         libsDisguises = disguises; | ||||
|         methods = BackwardsSupport.getMethods(); | ||||
|  | ||||
|         GsonBuilder gsonBuilder = new GsonBuilder(); | ||||
|         gsonBuilder.registerTypeAdapter(MetaIndex.class, new SerializerMetaIndex()); | ||||
| @@ -848,7 +849,7 @@ public class DisguiseUtilities { | ||||
|             savedDisguiseList.add(UUID.fromString(key)); | ||||
|         } | ||||
|  | ||||
|         LibVersion.check(libsDisguises); | ||||
|         LibsVersion.check(libsDisguises); | ||||
|     } | ||||
|  | ||||
|     public static boolean isDisguiseInUse(Disguise disguise) { | ||||
|   | ||||
| @@ -10,7 +10,7 @@ import java.net.URLClassLoader; | ||||
| /** | ||||
|  * Created by libraryaddict on 2/06/2017. | ||||
|  */ | ||||
| public class LibVersion { | ||||
| public class LibsVersion { | ||||
|     /** | ||||
|      * If you're seriously going to modify this to get the premium stuff for free, can you at least not | ||||
|      * distribute it? You didn't pay for it despite how cheap it is. You spend $8 on a trip to McDonalds | ||||
| @@ -39,7 +39,12 @@ public class LibVersion { | ||||
|         thisPluginIsPaidFor = isPremium(); | ||||
| 
 | ||||
|         if (!isPremium() && disguises.getDescription().getVersion().contains("SNAPSHOT")) { | ||||
|             for (File file : new File("plugins/LibsDisguises/").listFiles()) { | ||||
|             File[] files = new File("plugins/LibsDisguises/").listFiles(); | ||||
| 
 | ||||
|             if (files == null) | ||||
|                 return; | ||||
| 
 | ||||
|             for (File file : files) { | ||||
|                 if (!file.isFile()) | ||||
|                     continue; | ||||
| 
 | ||||
| @@ -48,7 +53,7 @@ public class LibVersion { | ||||
| 
 | ||||
|                 try { | ||||
|                     ClassLoader cl = new URLClassLoader(new URL[]{file.toURI().toURL()}); | ||||
|                     Class c = cl.loadClass(LibVersion.class.getName()); | ||||
|                     Class c = cl.loadClass(LibsVersion.class.getName()); | ||||
| 
 | ||||
|                     Method m = c.getMethod("isPremium"); | ||||
|                     thisPluginIsPaidFor = (Boolean) m.invoke(null); | ||||
| @@ -56,10 +61,6 @@ public class LibVersion { | ||||
|                     if (isPremium()) | ||||
|                         break; | ||||
|                 } | ||||
|                 catch (ClassNotFoundException ex) { | ||||
|                     if (disguises.getDescription().getVersion().contains("9.3.0-SNAPSHOT")) | ||||
|                         thisPluginIsPaidFor = true; | ||||
|                 } | ||||
|                 catch (Exception ex) { | ||||
|                     // Don't print off errors | ||||
|                 } | ||||
| @@ -7,16 +7,13 @@ import java.util.Collections; | ||||
| import java.util.Comparator; | ||||
| import java.util.Iterator; | ||||
|  | ||||
| import com.mysql.fabric.xmlrpc.base.Param; | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.Art; | ||||
| import org.bukkit.Material; | ||||
| import org.bukkit.TreeSpecies; | ||||
| import org.bukkit.block.BlockFace; | ||||
| import org.bukkit.entity.Horse; | ||||
| import org.bukkit.entity.Llama; | ||||
| import org.bukkit.entity.Ocelot; | ||||
| import org.bukkit.entity.Rabbit; | ||||
| import org.bukkit.entity.Villager; | ||||
| import org.bukkit.entity.*; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| import org.bukkit.potion.PotionEffectType; | ||||
|  | ||||
| @@ -37,9 +34,7 @@ public class ReflectionFlagWatchers { | ||||
|         private String description; | ||||
|  | ||||
|         public ParamInfo(Class paramClass, String name, String description) { | ||||
|  | ||||
|             this.name = name; | ||||
|             this.description = description; | ||||
|             this(name, description); | ||||
|             this.paramClass = paramClass; | ||||
|  | ||||
|             Enum[] enums = (Enum[]) paramClass.getEnumConstants(); | ||||
| @@ -51,24 +46,37 @@ public class ReflectionFlagWatchers { | ||||
|                     this.enums[i] = enums[i].name(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             paramList.add(this); | ||||
|         } | ||||
|  | ||||
|         private ParamInfo(String name, String description) { | ||||
|             this.name = name; | ||||
|             this.description = description; | ||||
|         } | ||||
|  | ||||
|         public ParamInfo(String className, String name, String description) throws ClassNotFoundException { | ||||
|             this(Class.forName(className), name, description); | ||||
|         } | ||||
|  | ||||
|         public ParamInfo(Class paramClass, Enum[] enums, String name, String description) { | ||||
|             this.name = name; | ||||
|             this(name, description); | ||||
|             this.enums = new String[enums.length]; | ||||
|             this.description = description; | ||||
|             this.paramClass = paramClass; | ||||
|  | ||||
|             for (int i = 0; i < enums.length; i++) { | ||||
|                 this.enums[i] = enums[i].name(); | ||||
|             } | ||||
|  | ||||
|             paramList.add(this); | ||||
|         } | ||||
|  | ||||
|         public ParamInfo(Class paramClass, String name, String description, String[] enums) { | ||||
|             this.name = name; | ||||
|             this(name, description); | ||||
|             this.enums = enums; | ||||
|             this.description = description; | ||||
|             this.paramClass = paramClass; | ||||
|  | ||||
|             paramList.add(this); | ||||
|         } | ||||
|  | ||||
|         public boolean isEnums() { | ||||
| @@ -92,7 +100,7 @@ public class ReflectionFlagWatchers { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static ArrayList<ParamInfo> paramList = new ArrayList<ParamInfo>(); | ||||
|     private static ArrayList<ParamInfo> paramList = new ArrayList<>(); | ||||
|  | ||||
|     public static ArrayList<ParamInfo> getParamInfos() { | ||||
|         return paramList; | ||||
| @@ -131,19 +139,29 @@ public class ReflectionFlagWatchers { | ||||
|     } | ||||
|  | ||||
|     static { | ||||
|         paramList.add(new ParamInfo(AnimalColor.class, "Animal Color", "View all the colors you can use for an animal color")); | ||||
|         paramList.add(new ParamInfo(Art.class, "Art", "View all the paintings you can use for a painting disguise")); | ||||
|         paramList.add(new ParamInfo(Llama.Color.class, "Llama Color", "View all the colors you can use for a llama color")); | ||||
|         paramList.add(new ParamInfo(Horse.Color.class, "Horse Color", "View all the colors you can use for a horses color")); | ||||
|         paramList.add(new ParamInfo(Ocelot.Type.class, "Ocelot Type", "View all the ocelot types you can use for ocelots")); | ||||
|         paramList.add(new ParamInfo(Villager.Profession.class, "Villager Profession", | ||||
|                 "View all the professions you can set on a villager")); | ||||
|         paramList.add(new ParamInfo(BlockFace.class, Arrays.copyOf(BlockFace.values(), 5), "Direction", | ||||
|                 "View the five directions usable on player setSleeping disguise")); | ||||
|         paramList.add(new ParamInfo(Rabbit.Type.class, "Rabbit Type", "View the kinds of rabbits you can turn into")); | ||||
|         paramList.add(new ParamInfo(TreeSpecies.class, "Tree Species", "View the different types of tree species")); | ||||
|         new ParamInfo(AnimalColor.class, "Animal Color", "View all the colors you can use for an animal color"); | ||||
|         new ParamInfo(Art.class, "Art", "View all the paintings you can use for a painting disguise"); | ||||
|  | ||||
|         ArrayList<String> potionEnums = new ArrayList<String>(); | ||||
|         new ParamInfo(Llama.Color.class, "Llama Color", "View all the colors you can use for a llama color"); | ||||
|  | ||||
|         new ParamInfo(Horse.Color.class, "Horse Color", "View all the colors you can use for a horses color"); | ||||
|  | ||||
|         new ParamInfo(Ocelot.Type.class, "Ocelot Type", "View all the ocelot types you can use for ocelots"); | ||||
|         new ParamInfo(Villager.Profession.class, "Villager Profession", | ||||
|                 "View all the professions you can set on a villager"); | ||||
|         new ParamInfo(BlockFace.class, Arrays.copyOf(BlockFace.values(), 5), "Direction", | ||||
|                 "View the five directions usable on player setSleeping disguise"); | ||||
|         new ParamInfo(Rabbit.Type.class, "Rabbit Type", "View the kinds of rabbits you can turn into"); | ||||
|         new ParamInfo(TreeSpecies.class, "Tree Species", "View the different types of tree species"); | ||||
|  | ||||
|         try { | ||||
|             new ParamInfo("org.bukkit.entity.Parrot$Variant", "Parrot Variant", | ||||
|                     "View the different colors a parrot can be"); | ||||
|         } | ||||
|         catch (ClassNotFoundException ex) {// Dont handle | ||||
|         } | ||||
|  | ||||
|         ArrayList<String> potionEnums = new ArrayList<>(); | ||||
|  | ||||
|         for (PotionEffectType effectType : PotionEffectType.values()) { | ||||
|             if (effectType == null) | ||||
| @@ -157,16 +175,17 @@ public class ReflectionFlagWatchers { | ||||
|             materials[i] = Material.values()[i].name(); | ||||
|         } | ||||
|  | ||||
|         paramList.add(new ParamInfo(ItemStack.class, "Item (id:damage)", "An ItemStack compromised of ID:Durability", materials)); | ||||
|         new ParamInfo(ItemStack.class, "Item (id:damage)", "An ItemStack compromised of ID:Durability", materials); | ||||
|  | ||||
|         paramList.add(new ParamInfo(ItemStack[].class, "Four ItemStacks (id:damage,id:damage..)", | ||||
|                 "Four ItemStacks seperated by an ,", materials) { | ||||
|         new ParamInfo(ItemStack[].class, "Four ItemStacks (id:damage,id:damage..)", "Four ItemStacks seperated by an ,", | ||||
|                 materials) { | ||||
|             @Override | ||||
|             public String[] getEnums(String tabComplete) { | ||||
|                 String beginning = tabComplete.substring(0, tabComplete.contains(",") ? tabComplete.lastIndexOf(",") + 1 : 0); | ||||
|                 String beginning = tabComplete.substring(0, | ||||
|                         tabComplete.contains(",") ? tabComplete.lastIndexOf(",") + 1 : 0); | ||||
|                 String end = tabComplete.substring(tabComplete.contains(",") ? tabComplete.lastIndexOf(",") + 1 : 0); | ||||
|  | ||||
|                 ArrayList<String> toReturn = new ArrayList<String>(); | ||||
|                 ArrayList<String> toReturn = new ArrayList<>(); | ||||
|  | ||||
|                 for (String material : super.getEnums("")) { | ||||
|                     if (!material.toLowerCase().startsWith(end.toLowerCase())) | ||||
| @@ -177,23 +196,22 @@ public class ReflectionFlagWatchers { | ||||
|  | ||||
|                 return toReturn.toArray(new String[0]); | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         }); | ||||
|         new ParamInfo(PotionEffectType.class, "Potion Effect", "View all the potion effects you can add", | ||||
|                 potionEnums.toArray(new String[0])); | ||||
|         new ParamInfo(String.class, "Text", "A line of text"); | ||||
|         new ParamInfo(boolean.class, "True/False", "True or False", new String[]{"true", "false"}); | ||||
|         new ParamInfo(int.class, "Number", "A whole number, no decimcals"); | ||||
|         new ParamInfo(double.class, "Number", "A number which can have decimals"); | ||||
|         new ParamInfo(float.class, "Number", "A number which can have decimals"); | ||||
|  | ||||
|         paramList.add(new ParamInfo(PotionEffectType.class, "Potion Effect", "View all the potion effects you can add", | ||||
|                 potionEnums.toArray(new String[0]))); | ||||
|         paramList.add(new ParamInfo(String.class, "Text", "A line of text")); | ||||
|         paramList.add(new ParamInfo(boolean.class, "True/False", "True or False", new String[] { | ||||
|                 "true", "false" | ||||
|         })); | ||||
|         paramList.add(new ParamInfo(int.class, "Number", "A whole number, no decimcals")); | ||||
|         paramList.add(new ParamInfo(double.class, "Number", "A number which can have decimals")); | ||||
|         paramList.add(new ParamInfo(float.class, "Number", "A number which can have decimals")); | ||||
|         paramList.add(new ParamInfo(Horse.Style.class, "Horse Style", "Horse style which is the patterns on the horse")); | ||||
|         paramList.add(new ParamInfo(int[].class, "number,number,number...", "Numbers seperated by an ,")); | ||||
|         paramList.add(new ParamInfo(BlockPosition.class, "Block Position (num,num,num)", "Three numbers seperated by an ,")); | ||||
|         paramList.add(new ParamInfo(GameProfile.class, "GameProfile", | ||||
|                 "Get the gameprofile here https://sessionserver.mojang.com/session/minecraft/profile/PLAYER_UUID_GOES_HERE?unsigned=false")); | ||||
|         new ParamInfo(Horse.Style.class, "Horse Style", "Horse style which is the patterns on the horse"); | ||||
|         new ParamInfo(int[].class, "number,number,number...", "Numbers seperated by an ,"); | ||||
|  | ||||
|         new ParamInfo(BlockPosition.class, "Block Position (num,num,num)", "Three numbers seperated by an ,"); | ||||
|         new ParamInfo(GameProfile.class, "GameProfile", | ||||
|                 "Get the gameprofile here https://sessionserver.mojang.com/session/minecraft/profile/PLAYER_UUID_GOES_HERE?unsigned=false"); | ||||
|  | ||||
|         Collections.sort(paramList, new Comparator<ParamInfo>() { | ||||
|             @Override | ||||
| @@ -213,27 +231,21 @@ public class ReflectionFlagWatchers { | ||||
|  | ||||
|             if (method.getParameterTypes().length != 1) { | ||||
|                 itel.remove(); | ||||
|             } | ||||
|             else if (method.getName().startsWith("get")) { | ||||
|             } else if (method.getName().startsWith("get")) { | ||||
|                 itel.remove(); | ||||
|             } | ||||
|             else if (method.getAnnotation(Deprecated.class) != null) { | ||||
|             } else if (method.getAnnotation(Deprecated.class) != null) { | ||||
|                 itel.remove(); | ||||
|             } | ||||
|             else if (getParamInfo(method.getParameterTypes()[0]) == null) { | ||||
|             } else if (getParamInfo(method.getParameterTypes()[0]) == null) { | ||||
|                 itel.remove(); | ||||
|             } | ||||
|             else if (!method.getReturnType().equals(Void.TYPE)) { | ||||
|             } else if (!method.getReturnType().equals(Void.TYPE)) { | ||||
|                 itel.remove(); | ||||
|             } | ||||
|             else if (method.getName().equals("removePotionEffect")) { | ||||
|             } else if (method.getName().equals("removePotionEffect")) { | ||||
|                 itel.remove(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         for (String methodName : new String[] { | ||||
|                 "setViewSelfDisguise", "setHideHeldItemFromSelf", "setHideArmorFromSelf", "setHearSelfDisguise", "setHidePlayer" | ||||
|         }) { | ||||
|         for (String methodName : new String[]{"setViewSelfDisguise", "setHideHeldItemFromSelf", "setHideArmorFromSelf", | ||||
|                 "setHearSelfDisguise", "setHidePlayer"}) { | ||||
|             try { | ||||
|                 methods.add(Disguise.class.getMethod(methodName, boolean.class)); | ||||
|             } | ||||
|   | ||||
| @@ -1,47 +1,30 @@ | ||||
| package me.libraryaddict.disguise.utilities; | ||||
|  | ||||
| import java.lang.reflect.Constructor; | ||||
| import java.lang.reflect.Field; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.lang.reflect.Method; | ||||
| import java.lang.reflect.Modifier; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Map; | ||||
| import java.util.UUID; | ||||
| import java.util.regex.Pattern; | ||||
|  | ||||
| import com.comphenix.protocol.wrappers.*; | ||||
| import com.comphenix.protocol.wrappers.EnumWrappers.Direction; | ||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; | ||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; | ||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; | ||||
| import com.comphenix.protocol.wrappers.nbt.NbtBase; | ||||
| import com.comphenix.protocol.wrappers.nbt.NbtCompound; | ||||
| import com.comphenix.protocol.wrappers.nbt.NbtFactory; | ||||
| import com.comphenix.protocol.wrappers.nbt.NbtWrapper; | ||||
| import com.google.common.base.Optional; | ||||
| import com.google.gson.Gson; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| import org.apache.commons.lang3.tuple.ImmutablePair; | ||||
| import org.apache.commons.lang3.tuple.Pair; | ||||
| import org.bukkit.Art; | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.Location; | ||||
| import org.bukkit.Material; | ||||
| import org.bukkit.Sound; | ||||
| import org.bukkit.World; | ||||
| import org.bukkit.entity.Ambient; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.LivingEntity; | ||||
| import org.bukkit.entity.Monster; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.*; | ||||
| import org.bukkit.entity.*; | ||||
| import org.bukkit.inventory.EquipmentSlot; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| import org.bukkit.potion.PotionEffect; | ||||
|  | ||||
| import com.comphenix.protocol.wrappers.BlockPosition; | ||||
| import com.comphenix.protocol.wrappers.EnumWrappers.Direction; | ||||
| import com.comphenix.protocol.wrappers.MinecraftKey; | ||||
| import com.comphenix.protocol.wrappers.Vector3F; | ||||
| import com.comphenix.protocol.wrappers.WrappedBlockData; | ||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; | ||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher.Serializer; | ||||
| import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; | ||||
| import com.comphenix.protocol.wrappers.WrappedGameProfile; | ||||
| import com.comphenix.protocol.wrappers.WrappedSignedProperty; | ||||
| import com.comphenix.protocol.wrappers.WrappedWatchableObject; | ||||
| import com.google.common.base.Optional; | ||||
| import com.google.gson.Gson; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| import java.lang.reflect.*; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Map; | ||||
| import java.util.UUID; | ||||
| import java.util.regex.Pattern; | ||||
|  | ||||
| public class ReflectionManager { | ||||
|     private static final String bukkitVersion = Bukkit.getServer().getClass().getName().split("\\.")[3]; | ||||
| @@ -863,6 +846,8 @@ public class ReflectionManager { | ||||
|             return getNmsItem((ItemStack) value); | ||||
|         } else if (value instanceof Double) | ||||
|             return ((Double) value).floatValue(); | ||||
|         else if (value instanceof NbtCompound) | ||||
|             return ((NbtWrapper)value).getHandle(); | ||||
|  | ||||
|         return value; | ||||
|     } | ||||
|   | ||||
| @@ -0,0 +1,11 @@ | ||||
| package me.libraryaddict.disguise.utilities.backwards; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 8/06/2017. | ||||
|  */ | ||||
| public class BackwardMethods { | ||||
|  | ||||
|     public boolean isOrderedIndexes() { | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,56 @@ | ||||
| package me.libraryaddict.disguise.utilities.backwards; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||
| import me.libraryaddict.disguise.utilities.backwards.metadata.Version_1_1; | ||||
|  | ||||
| import java.lang.reflect.Field; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 8/06/2017. | ||||
|  */ | ||||
| public class BackwardsSupport { | ||||
|     public static BackwardMethods getMethods() { | ||||
|         try { | ||||
|             String version = ReflectionManager.getBukkitVersion(); | ||||
|  | ||||
|             if (version.equals("v1_11_R1")) { | ||||
|                 return setupMetadata(Version_1_1.class); | ||||
|             } | ||||
|  | ||||
|             return setupMetadata(BackwardMethods.class); | ||||
|         } | ||||
|         catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     private static BackwardMethods setupMetadata(Class<? extends BackwardMethods> backwardsClass) { | ||||
|         try { | ||||
|             BackwardMethods backwards = backwardsClass.newInstance(); | ||||
|  | ||||
|             for (Field field : backwards.getClass().getFields()) { | ||||
|                 if (field.getType() != MetaIndex.class) | ||||
|                     continue; | ||||
|  | ||||
|                 MetaIndex.setMetaIndex(field.getName(), (MetaIndex) field.get(backwards)); | ||||
|             } | ||||
|  | ||||
|             MetaIndex.setValues(); | ||||
|  | ||||
|             if (backwards.isOrderedIndexes()) { | ||||
|                 MetaIndex.fillInBlankIndexes(); | ||||
|                 MetaIndex.orderMetaIndexes(); | ||||
|             } | ||||
|  | ||||
|             return backwards; | ||||
|         } | ||||
|         catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| package me.libraryaddict.disguise.utilities.backwards.metadata; | ||||
|  | ||||
| import com.comphenix.protocol.wrappers.nbt.NbtCompound; | ||||
| import com.comphenix.protocol.wrappers.nbt.NbtFactory; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | ||||
| import me.libraryaddict.disguise.utilities.backwards.BackwardMethods; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 8/06/2017. | ||||
|  * Supports 1.11.0 1.11.1 and 1.11.2 | ||||
|  */ | ||||
| public class Version_1_1 extends BackwardMethods { | ||||
|     private MetaIndex ILLAGER_META; | ||||
|     private MetaIndex PARROT_VARIANT; | ||||
|     private MetaIndex PLAYER_LEFT_SHOULDER_ENTITY; | ||||
|     private MetaIndex PLAYER_RIGHT_SHOULDER_ENTITY; | ||||
| } | ||||
| @@ -27,29 +27,24 @@ import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||
|  | ||||
| public class PacketListenerSounds extends PacketAdapter | ||||
| { | ||||
| public class PacketListenerSounds extends PacketAdapter { | ||||
|     /** | ||||
|      * This is a fix for the stupidity that is | ||||
|      * "I can't separate the sounds from the sounds the player heard, and the sounds of the entity tracker heard" | ||||
|      */ | ||||
|     private static boolean cancelSound; | ||||
|  | ||||
|     public PacketListenerSounds(LibsDisguises plugin) | ||||
|     { | ||||
|     public PacketListenerSounds(LibsDisguises plugin) { | ||||
|         super(plugin, ListenerPriority.NORMAL, Server.NAMED_SOUND_EFFECT, Server.ENTITY_STATUS); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onPacketSending(PacketEvent event) | ||||
|     { | ||||
|         if (event.isCancelled()) | ||||
|         { | ||||
|     public void onPacketSending(PacketEvent event) { | ||||
|         if (event.isCancelled()) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (event.isAsync()) | ||||
|         { | ||||
|         if (event.isAsync()) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
| @@ -62,20 +57,15 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|  | ||||
|         Player observer = event.getPlayer(); | ||||
|  | ||||
|         if (event.getPacketType() == Server.NAMED_SOUND_EFFECT) | ||||
|         { | ||||
|         if (event.getPacketType() == Server.NAMED_SOUND_EFFECT) { | ||||
|             SoundType soundType = null; | ||||
|  | ||||
|             int[] soundCords = new int[] | ||||
|                 { | ||||
|                         (Integer) mods.read(2), (Integer) mods.read(3), (Integer) mods.read(4) | ||||
|                 }; | ||||
|             int[] soundCords = new int[]{(Integer) mods.read(2), (Integer) mods.read(3), (Integer) mods.read(4)}; | ||||
|  | ||||
|             int chunkX = (int) Math.floor((soundCords[0] / 8D) / 16D); | ||||
|             int chunkZ = (int) Math.floor((soundCords[2] / 8D) / 16D); | ||||
|  | ||||
|             if (!observer.getWorld().isChunkLoaded(chunkX, chunkZ)) | ||||
|             { | ||||
|             if (!observer.getWorld().isChunkLoaded(chunkX, chunkZ)) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
| @@ -87,87 +77,68 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|             String soundEffect = ReflectionManager.convertSoundEffectToString(mods.read(0)); | ||||
|             Entity[] entities = observer.getWorld().getChunkAt(chunkX, chunkZ).getEntities(); | ||||
|  | ||||
|             for (Entity entity : entities) | ||||
|             { | ||||
|             for (Entity entity : entities) { | ||||
|                 Disguise entityDisguise = DisguiseAPI.getDisguise(observer, entity); | ||||
|  | ||||
|                 if (entityDisguise != null) | ||||
|                 { | ||||
|                 if (entityDisguise != null) { | ||||
|                     Location loc = entity.getLocation(); | ||||
|  | ||||
|                     int[] entCords = new int[] | ||||
|                         { | ||||
|                                 (int) (loc.getX() * 8), (int) (loc.getY() * 8), (int) (loc.getZ() * 8) | ||||
|                         }; | ||||
|                     int[] entCords = new int[]{(int) (loc.getX() * 8), (int) (loc.getY() * 8), (int) (loc.getZ() * 8)}; | ||||
|  | ||||
|                     if (soundCords[0] != entCords[0] || soundCords[1] != entCords[1] || soundCords[2] != entCords[2]) | ||||
|                     { | ||||
|                     if (soundCords[0] != entCords[0] || soundCords[1] != entCords[1] || soundCords[2] != entCords[2]) { | ||||
|                         continue; | ||||
|                     } | ||||
|  | ||||
|                     entitySound = DisguiseSound.getType(entity.getType().name()); | ||||
|  | ||||
|                     if (entitySound == null) | ||||
|                     { | ||||
|                     if (entitySound == null) { | ||||
|                         continue; | ||||
|                     } | ||||
|  | ||||
|                     Object obj = null; | ||||
|  | ||||
|                     if (entity instanceof LivingEntity) | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                     if (entity instanceof LivingEntity) { | ||||
|                         try { | ||||
|                             // Use reflection so that this works for either int or double methods | ||||
|                             obj = LivingEntity.class.getMethod("getHealth").invoke(entity); | ||||
|  | ||||
|                             if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) | ||||
|                             { | ||||
|                             if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) { | ||||
|                                 soundType = SoundType.DEATH; | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                             } else { | ||||
|                                 obj = null; | ||||
|                             } | ||||
|                         } | ||||
|                         catch (Exception e) | ||||
|                         { | ||||
|                         catch (Exception e) { | ||||
|                             e.printStackTrace(); | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|                     if (obj == null) | ||||
|                     { | ||||
|                     if (obj == null) { | ||||
|                         boolean hasInvun = false; | ||||
|  | ||||
|                         Object nmsEntity = ReflectionManager.getNmsEntity(entity); | ||||
|  | ||||
|                         try | ||||
|                         { | ||||
|                             if (entity instanceof LivingEntity) | ||||
|                             { | ||||
|                                 hasInvun = ReflectionManager.getNmsField("Entity", "noDamageTicks") | ||||
|                                         .getInt(nmsEntity) == ReflectionManager.getNmsField("EntityLiving", "maxNoDamageTicks") | ||||
|                                                 .getInt(nmsEntity); | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|                         try { | ||||
|                             if (entity instanceof LivingEntity) { | ||||
|                                 hasInvun = ReflectionManager.getNmsField("Entity", "noDamageTicks").getInt( | ||||
|                                         nmsEntity) == ReflectionManager.getNmsField("EntityLiving", | ||||
|                                         "maxNoDamageTicks").getInt(nmsEntity); | ||||
|                             } else { | ||||
|                                 Class clazz = ReflectionManager.getNmsClass("DamageSource"); | ||||
|  | ||||
|                                 hasInvun = (Boolean) ReflectionManager.getNmsMethod("Entity", "isInvulnerable", clazz) | ||||
|                                         .invoke(nmsEntity, ReflectionManager.getNmsField(clazz, "GENERIC").get(null)); | ||||
|                                 hasInvun = (Boolean) ReflectionManager.getNmsMethod("Entity", "isInvulnerable", | ||||
|                                         clazz).invoke(nmsEntity, | ||||
|                                         ReflectionManager.getNmsField(clazz, "GENERIC").get(null)); | ||||
|                             } | ||||
|                         } | ||||
|                         catch (Exception ex) | ||||
|                         { | ||||
|                         catch (Exception ex) { | ||||
|                             ex.printStackTrace(); | ||||
|                         } | ||||
|  | ||||
|                         soundType = entitySound.getType(soundEffect, !hasInvun); | ||||
|                     } | ||||
|  | ||||
|                     if (soundType != null) | ||||
|                     { | ||||
|                     if (soundType != null) { | ||||
|                         disguise = entityDisguise; | ||||
|                         disguisedEntity = entity; | ||||
|                         break; | ||||
| @@ -175,9 +146,7 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (disguise != null && disguise.isSoundsReplaced() | ||||
|                     && (disguise.isSelfDisguiseSoundsReplaced() || disguisedEntity != observer)) | ||||
|             { | ||||
|             if (disguise != null && disguise.isSoundsReplaced() && (disguise.isSelfDisguiseSoundsReplaced() || disguisedEntity != observer)) { | ||||
|                 String sound = null; | ||||
|  | ||||
|                 DisguiseSound dSound = DisguiseSound.getType(disguise.getType().name()); | ||||
| @@ -185,92 +154,71 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|                 if (dSound != null) | ||||
|                     sound = dSound.getSound(soundType); | ||||
|  | ||||
|                 if (sound == null) | ||||
|                 { | ||||
|                 if (sound == null) { | ||||
|                     event.setCancelled(true); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     if (sound.equals("step.grass")) | ||||
|                     { | ||||
|                         try | ||||
|                         { | ||||
|                 } else { | ||||
|                     if (sound.equals("step.grass")) { | ||||
|                         try { | ||||
|                             int typeId = observer.getWorld().getBlockTypeIdAt((int) Math.floor(soundCords[0] / 8D), | ||||
|                                     (int) Math.floor(soundCords[1] / 8D), (int) Math.floor(soundCords[2] / 8D)); | ||||
|  | ||||
|                             Object block = ReflectionManager.getNmsMethod("RegistryMaterials", "getId", int.class) | ||||
|                                     .invoke(ReflectionManager.getNmsField("Block", "REGISTRY").get(null), typeId); | ||||
|                             Object block = ReflectionManager.getNmsMethod("RegistryMaterials", "getId", | ||||
|                                     int.class).invoke(ReflectionManager.getNmsField("Block", "REGISTRY").get(null), | ||||
|                                     typeId); | ||||
|  | ||||
|                             if (block != null) | ||||
|                             { | ||||
|                             if (block != null) { | ||||
|                                 Object step = ReflectionManager.getNmsField("Block", "stepSound").get(block); | ||||
|  | ||||
|                                 mods.write(0, ReflectionManager.getNmsMethod(step.getClass(), "d").invoke(step)); | ||||
|                                 mods.write(1, ReflectionManager.getSoundCategory(disguise.getType())); | ||||
|                             } | ||||
|                         } | ||||
|                         catch (Exception ex) | ||||
|                         { | ||||
|                         catch (Exception ex) { | ||||
|                             ex.printStackTrace(); | ||||
|                         } | ||||
|                         // There is no else statement. Because seriously. This should never be null. Unless | ||||
|                         // someone is | ||||
|                         // sending fake sounds. In which case. Why cancel it. | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                     } else { | ||||
|                         mods.write(0, ReflectionManager.getCraftSoundEffect(sound)); | ||||
|                         mods.write(1, ReflectionManager.getSoundCategory(disguise.getType())); | ||||
|  | ||||
|                         // Time to change the pitch and volume | ||||
|                         if (soundType == SoundType.HURT || soundType == SoundType.DEATH || soundType == SoundType.IDLE) | ||||
|                         { | ||||
|                         if (soundType == SoundType.HURT || soundType == SoundType.DEATH || soundType == SoundType.IDLE) { | ||||
|                             // If the volume is the default | ||||
|                             if (mods.read(5).equals(entitySound.getDamageAndIdleSoundVolume())) | ||||
|                             { | ||||
|                             if (mods.read(5).equals(entitySound.getDamageAndIdleSoundVolume())) { | ||||
|                                 mods.write(5, dSound.getDamageAndIdleSoundVolume()); | ||||
|                             } | ||||
|  | ||||
|                             // Here I assume its the default pitch as I can't calculate if its real. | ||||
|                             if (disguise instanceof MobDisguise && disguisedEntity instanceof LivingEntity | ||||
|                                     && ((MobDisguise) disguise).doesDisguiseAge()) | ||||
|                             { | ||||
|                             if (disguise instanceof MobDisguise && disguisedEntity instanceof LivingEntity && ((MobDisguise) disguise).doesDisguiseAge()) { | ||||
|                                 boolean baby = false; | ||||
|  | ||||
|                                 if (disguisedEntity instanceof Zombie) | ||||
|                                 { | ||||
|                                 if (disguisedEntity instanceof Zombie) { | ||||
|                                     baby = ((Zombie) disguisedEntity).isBaby(); | ||||
|                                 } | ||||
|                                 else if (disguisedEntity instanceof Ageable) | ||||
|                                 { | ||||
|                                 } else if (disguisedEntity instanceof Ageable) { | ||||
|                                     baby = !((Ageable) disguisedEntity).isAdult(); | ||||
|                                 } | ||||
|  | ||||
|                                 if (((MobDisguise) disguise).isAdult() == baby) | ||||
|                                 { | ||||
|                                 if (((MobDisguise) disguise).isAdult() == baby) { | ||||
|                                     float pitch = (Float) mods.read(6); | ||||
|  | ||||
|                                     if (baby) | ||||
|                                     { | ||||
|                                     if (baby) { | ||||
|                                         // If the pitch is not the expected | ||||
|                                         if (pitch > 97 || pitch < 111) | ||||
|                                             return; | ||||
|  | ||||
|                                         pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) | ||||
|                                                 * 0.2F + 1.5F; | ||||
|                                         pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.5F; | ||||
|                                         // Min = 1.5 | ||||
|                                         // Cap = 97.5 | ||||
|                                         // Max = 1.7 | ||||
|                                         // Cap = 110.5 | ||||
|                                     } | ||||
|                                     else | ||||
|                                     { | ||||
|                                     } else { | ||||
|                                         // If the pitch is not the expected | ||||
|                                         if (pitch >= 63 || pitch <= 76) | ||||
|                                             return; | ||||
|  | ||||
|                                         pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) | ||||
|                                                 * 0.2F + 1.0F; | ||||
|                                         pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.0F; | ||||
|                                         // Min = 1 | ||||
|                                         // Cap = 63 | ||||
|                                         // Max = 1.2 | ||||
| @@ -292,11 +240,8 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         else if (event.getPacketType() == Server.ENTITY_STATUS) | ||||
|         { | ||||
|             if ((byte) mods.read(1) != 2) | ||||
|             { | ||||
|         } else if (event.getPacketType() == Server.ENTITY_STATUS) { | ||||
|             if ((byte) mods.read(1) != 2) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
| @@ -305,9 +250,7 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|  | ||||
|             Disguise disguise = DisguiseAPI.getDisguise(observer, entity); | ||||
|  | ||||
|             if (disguise != null && !disguise.getType().isPlayer() | ||||
|                     && (disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) | ||||
|             { | ||||
|             if (disguise != null && !disguise.getType().isPlayer() && (disguise.isSelfDisguiseSoundsReplaced() || entity != event.getPlayer())) { | ||||
|                 DisguiseSound disSound = DisguiseSound.getType(entity.getType().name()); | ||||
|  | ||||
|                 if (disSound == null) | ||||
| @@ -316,37 +259,28 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|                 SoundType soundType = null; | ||||
|                 Object obj = null; | ||||
|  | ||||
|                 if (entity instanceof LivingEntity) | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                 if (entity instanceof LivingEntity) { | ||||
|                     try { | ||||
|                         obj = LivingEntity.class.getMethod("getHealth").invoke(entity); | ||||
|  | ||||
|                         if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) | ||||
|                         { | ||||
|                         if (obj instanceof Double ? (Double) obj == 0 : (Integer) obj == 0) { | ||||
|                             soundType = SoundType.DEATH; | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|                         } else { | ||||
|                             obj = null; | ||||
|                         } | ||||
|                     } | ||||
|                     catch (Exception e) | ||||
|                     { | ||||
|                     catch (Exception e) { | ||||
|                         e.printStackTrace(); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 if (obj == null) | ||||
|                 { | ||||
|                 if (obj == null) { | ||||
|                     soundType = SoundType.HURT; | ||||
|                 } | ||||
|  | ||||
|                 if (disSound.getSound(soundType) == null | ||||
|                         || (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer())) | ||||
|                 { | ||||
|                     if (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer()) | ||||
|                     { | ||||
|                 if (disSound.getSound( | ||||
|                         soundType) == null || (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer())) { | ||||
|                     if (disguise.isSelfDisguiseSoundsReplaced() && entity == event.getPlayer()) { | ||||
|                         cancelSound = !cancelSound; | ||||
|  | ||||
|                         if (cancelSound) | ||||
| @@ -355,12 +289,10 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|  | ||||
|                     disSound = DisguiseSound.getType(disguise.getType().name()); | ||||
|  | ||||
|                     if (disSound != null) | ||||
|                     { | ||||
|                     if (disSound != null) { | ||||
|                         String sound = disSound.getSound(soundType); | ||||
|  | ||||
|                         if (sound != null) | ||||
|                         { | ||||
|                         if (sound != null) { | ||||
|                             Location loc = entity.getLocation(); | ||||
|  | ||||
|                             PacketContainer packet = new PacketContainer(Server.NAMED_SOUND_EFFECT); | ||||
| @@ -378,14 +310,10 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|  | ||||
|                             float pitch; | ||||
|  | ||||
|                             if (disguise instanceof MobDisguise && !((MobDisguise) disguise).isAdult()) | ||||
|                             { | ||||
|                                 pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F | ||||
|                                         + 1.5F; | ||||
|                             } | ||||
|                             else | ||||
|                                 pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F | ||||
|                                         + 1.0F; | ||||
|                             if (disguise instanceof MobDisguise && !((MobDisguise) disguise).isAdult()) { | ||||
|                                 pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.5F; | ||||
|                             } else | ||||
|                                 pitch = (DisguiseUtilities.random.nextFloat() - DisguiseUtilities.random.nextFloat()) * 0.2F + 1.0F; | ||||
|  | ||||
|                             if (disguise.getType() == DisguiseType.BAT) | ||||
|                                 pitch *= 95F; | ||||
| @@ -400,12 +328,10 @@ public class PacketListenerSounds extends PacketAdapter | ||||
|  | ||||
|                             mods.write(6, (int) pitch); | ||||
|  | ||||
|                             try | ||||
|                             { | ||||
|                             try { | ||||
|                                 ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); | ||||
|                             } | ||||
|                             catch (InvocationTargetException e) | ||||
|                             { | ||||
|                             catch (InvocationTargetException e) { | ||||
|                                 e.printStackTrace(); | ||||
|                             } | ||||
|                         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user