From 5ffa792e77f652ed53237d145cfc52c6ececc96b Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Fri, 9 Jun 2017 03:06:58 +1200 Subject: [PATCH] Add backwards support for 1.11.2, bugfixes, update to 1.12 --- config.yml | 1 + pom.xml | 4 +- .../libraryaddict/disguise/LibsDisguises.java | 35 +-- .../commands/DisguiseModifyRadiusCommand.java | 35 ++- .../commands/DisguiseRadiusCommand.java | 110 +++++---- .../commands/LibsDisguisesCommand.java | 5 +- .../disguise/disguisetypes/DisguiseType.java | 26 ++- .../disguise/disguisetypes/FlagWatcher.java | 18 +- .../disguise/disguisetypes/MetaIndex.java | 97 +++++++- .../watchers/IllagerWatcher.java | 12 + ...Watcher.java => IllagerWizardWatcher.java} | 40 ++-- .../disguisetypes/watchers/ParrotWatcher.java | 23 ++ .../disguise/utilities/DisguiseParser.java | 27 +-- .../disguise/utilities/DisguiseSound.java | 21 +- .../disguise/utilities/DisguiseUtilities.java | 13 +- .../{LibVersion.java => LibsVersion.java} | 15 +- .../utilities/ReflectionFlagWatchers.java | 128 ++++++----- .../disguise/utilities/ReflectionManager.java | 57 ++--- .../utilities/backwards/BackwardMethods.java | 11 + .../utilities/backwards/BackwardsSupport.java | 56 +++++ .../backwards/metadata/Version_1_1.java | 18 ++ .../packetlisteners/PacketListenerSounds.java | 216 ++++++------------ 22 files changed, 558 insertions(+), 410 deletions(-) create mode 100644 src/me/libraryaddict/disguise/disguisetypes/watchers/IllagerWatcher.java rename src/me/libraryaddict/disguise/disguisetypes/watchers/{EvokerWatcher.java => IllagerWizardWatcher.java} (51%) create mode 100644 src/me/libraryaddict/disguise/disguisetypes/watchers/ParrotWatcher.java rename src/me/libraryaddict/disguise/utilities/{LibVersion.java => LibsVersion.java} (86%) create mode 100644 src/me/libraryaddict/disguise/utilities/backwards/BackwardMethods.java create mode 100644 src/me/libraryaddict/disguise/utilities/backwards/BackwardsSupport.java create mode 100644 src/me/libraryaddict/disguise/utilities/backwards/metadata/Version_1_1.java diff --git a/config.yml b/config.yml index 8078b74b..3adfda0a 100644 --- a/config.yml +++ b/config.yml @@ -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 diff --git a/pom.xml b/pom.xml index 7ae3e549..6b056352 100644 --- a/pom.xml +++ b/pom.xml @@ -43,12 +43,12 @@ org.spigotmc spigot-api - 1.11-R0.1-SNAPSHOT + 1.12-R0.1-SNAPSHOT org.spigotmc spigot - 1.11-R0.1-SNAPSHOT + 1.12-R0.1-SNAPSHOT diff --git a/src/me/libraryaddict/disguise/LibsDisguises.java b/src/me/libraryaddict/disguise/LibsDisguises.java index b3b9f7a7..a684fe8a 100644 --- a/src/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/me/libraryaddict/disguise/LibsDisguises.java @@ -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; } } diff --git a/src/me/libraryaddict/disguise/commands/DisguiseModifyRadiusCommand.java b/src/me/libraryaddict/disguise/commands/DisguiseModifyRadiusCommand.java index 1f268959..ed7db55d 100644 --- a/src/me/libraryaddict/disguise/commands/DisguiseModifyRadiusCommand.java +++ b/src/me/libraryaddict/disguise/commands/DisguiseModifyRadiusCommand.java @@ -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); diff --git a/src/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java b/src/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java index 195646c0..62c9d4ca 100644 --- a/src/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java +++ b/src/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java @@ -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 usedOptions = new ArrayList(); 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, Boolean>> map) { + protected void sendCommandUsage(CommandSender sender, + HashMap, Boolean>> map) { ArrayList 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 player ") - .replace("<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); + sender.sendMessage( + (ChatColor.DARK_GREEN + "/disguiseradius player ").replace( + "<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); } - sender.sendMessage((ChatColor.DARK_GREEN + "/disguiseradius ").replace("<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); + sender.sendMessage( + (ChatColor.DARK_GREEN + "/disguiseradius ").replace( + "<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); if (allowedDisguises.contains("dropped_item") || allowedDisguises.contains("falling_block")) { - sender.sendMessage((ChatColor.DARK_GREEN + "/disguiseradius ") - .replace("<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); + sender.sendMessage( + (ChatColor.DARK_GREEN + "/disguiseradius ").replace( + "<", "<" + ChatColor.GREEN).replace(">", ChatColor.DARK_GREEN + ">")); } sender.sendMessage( ChatColor.DARK_GREEN + "See the EntityType's usable by " + ChatColor.GREEN + "/disguiseradius EntityTypes"); } - } diff --git a/src/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java b/src/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java index 9351fb6f..6595db29 100644 --- a/src/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java +++ b/src/me/libraryaddict/disguise/commands/LibsDisguisesCommand.java @@ -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!"); } } diff --git a/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java b/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java index aa21bbc4..a721c64c 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java +++ b/src/me/libraryaddict/disguise/disguisetypes/DisguiseType.java @@ -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() { diff --git a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index 6c99666b..0a859225 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -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 getData(MetaIndex 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 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 void setData(MetaIndex id, Y value) { + if (id == null) + return; + if (value == null && id.getDefault() instanceof ItemStack) throw new IllegalArgumentException("Cannot use null ItemStacks"); diff --git a/src/me/libraryaddict/disguise/disguisetypes/MetaIndex.java b/src/me/libraryaddict/disguise/disguisetypes/MetaIndex.java index 5c2b4584..cb63abe8 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MetaIndex.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MetaIndex.java @@ -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 { public static MetaIndex ENTITY_SILENT = new MetaIndex<>(FlagWatcher.class, 4, false); - public static MetaIndex EVOKER_SPELL_TICKS = new MetaIndex<>(EvokerWatcher.class, 0, (byte) 0); + public static MetaIndex ILLAGER_SPELL_TICKS = new MetaIndex<>(IllagerWizardWatcher.class, 0, (byte) 0); + + public static MetaIndex ILLAGER_META = new MetaIndex<>(IllagerWatcher.class, 0, (byte) 0); public static MetaIndex FALLING_BLOCK_POSITION = new MetaIndex<>(FallingBlockWatcher.class, 0, BlockPosition.ORIGIN); @@ -173,6 +177,8 @@ public class MetaIndex { public static MetaIndex OCELOT_TYPE = new MetaIndex<>(OcelotWatcher.class, 0, 0); + public static MetaIndex PARROT_VARIANT = new MetaIndex<>(ParrotWatcher.class, 0, 0); + public static MetaIndex PIG_SADDLED = new MetaIndex<>(PigWatcher.class, 0, false); public static MetaIndex PIG_UNKNOWN = new MetaIndex<>(PigWatcher.class, 1, 0); @@ -185,6 +191,12 @@ public class MetaIndex { public static MetaIndex PLAYER_SKIN = new MetaIndex<>(PlayerWatcher.class, 2, (byte) 127); + public static MetaIndex PLAYER_LEFT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 4, + NbtFactory.ofCompound("None")); + + public static MetaIndex PLAYER_RIGHT_SHOULDER_ENTITY = new MetaIndex<>(PlayerWatcher.class, 5, + NbtFactory.ofCompound("None")); + public static MetaIndex POLAR_BEAR_STANDING = new MetaIndex<>(PolarBearWatcher.class, 0, false); public static MetaIndex RABBIT_TYPE = new MetaIndex<>(RabbitWatcher.class, 0, 0); @@ -261,13 +273,55 @@ public class MetaIndex { public static MetaIndex ZOMBIE_VILLAGER_SHAKING = new MetaIndex<>(ZombieVillagerWatcher.class, 0, false); static { + setValues(); + } + + public static void fillInBlankIndexes() { + ArrayList>> list = new ArrayList<>(); + + for (MetaIndex index : values()) { + Entry> 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()); + list.add(entry); + } + + entry.getValue().add(index); + } + + for (Entry> entry : list) { + Collections.sort(entry.getValue(), new Comparator() { + @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 with no empty numbers. // All flag types should never occur twice. @@ -384,6 +438,44 @@ public class MetaIndex { 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 _watcher; @@ -392,9 +484,6 @@ public class MetaIndex { _index = index; _watcher = watcher; _defaultValue = defaultValue; - - _values = Arrays.copyOf(_values, _values.length + 1); - _values[_values.length - 1] = this; } public Y getDefault() { diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/IllagerWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/IllagerWatcher.java new file mode 100644 index 00000000..b1e530eb --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/IllagerWatcher.java @@ -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); + } +} diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/EvokerWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/IllagerWizardWatcher.java similarity index 51% rename from src/me/libraryaddict/disguise/disguisetypes/watchers/EvokerWatcher.java rename to src/me/libraryaddict/disguise/disguisetypes/watchers/IllagerWizardWatcher.java index 866e60f4..af486886 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/EvokerWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/IllagerWizardWatcher.java @@ -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); + } +} diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/ParrotWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/ParrotWatcher.java new file mode 100644 index 00000000..8aaa40fe --- /dev/null +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/ParrotWatcher.java @@ -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); + } +} diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseParser.java b/src/me/libraryaddict/disguise/utilities/DisguiseParser.java index 4645496d..2df4ca8f 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseParser.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseParser.java @@ -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"); diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseSound.java b/src/me/libraryaddict/disguise/utilities/DisguiseSound.java index 865b6460..ad120d3f 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseSound.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseSound.java @@ -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), diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 3265a963..cd1d0e19 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -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> 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) { diff --git a/src/me/libraryaddict/disguise/utilities/LibVersion.java b/src/me/libraryaddict/disguise/utilities/LibsVersion.java similarity index 86% rename from src/me/libraryaddict/disguise/utilities/LibVersion.java rename to src/me/libraryaddict/disguise/utilities/LibsVersion.java index 0b0cbd8f..9475de82 100644 --- a/src/me/libraryaddict/disguise/utilities/LibVersion.java +++ b/src/me/libraryaddict/disguise/utilities/LibsVersion.java @@ -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 } diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionFlagWatchers.java b/src/me/libraryaddict/disguise/utilities/ReflectionFlagWatchers.java index ba23b7ba..0406ca7b 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionFlagWatchers.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionFlagWatchers.java @@ -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 paramList = new ArrayList(); + private static ArrayList paramList = new ArrayList<>(); public static ArrayList 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 potionEnums = new ArrayList(); + 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 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 toReturn = new ArrayList(); + ArrayList 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() { @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)); } diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java index f6cfc3b8..4dc53e56 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -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; } diff --git a/src/me/libraryaddict/disguise/utilities/backwards/BackwardMethods.java b/src/me/libraryaddict/disguise/utilities/backwards/BackwardMethods.java new file mode 100644 index 00000000..b6da500c --- /dev/null +++ b/src/me/libraryaddict/disguise/utilities/backwards/BackwardMethods.java @@ -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; + } +} diff --git a/src/me/libraryaddict/disguise/utilities/backwards/BackwardsSupport.java b/src/me/libraryaddict/disguise/utilities/backwards/BackwardsSupport.java new file mode 100644 index 00000000..fcb2332e --- /dev/null +++ b/src/me/libraryaddict/disguise/utilities/backwards/BackwardsSupport.java @@ -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 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; + } +} diff --git a/src/me/libraryaddict/disguise/utilities/backwards/metadata/Version_1_1.java b/src/me/libraryaddict/disguise/utilities/backwards/metadata/Version_1_1.java new file mode 100644 index 00000000..ac4edfc3 --- /dev/null +++ b/src/me/libraryaddict/disguise/utilities/backwards/metadata/Version_1_1.java @@ -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; +} diff --git a/src/me/libraryaddict/disguise/utilities/packetlisteners/PacketListenerSounds.java b/src/me/libraryaddict/disguise/utilities/packetlisteners/PacketListenerSounds.java index 8b20d295..244e1fda 100644 --- a/src/me/libraryaddict/disguise/utilities/packetlisteners/PacketListenerSounds.java +++ b/src/me/libraryaddict/disguise/utilities/packetlisteners/PacketListenerSounds.java @@ -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(); } }