Added 1.13.2 support, made backwards premium
This commit is contained in:
		
							
								
								
									
										25
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -8,7 +8,7 @@ | ||||
|     <version>9.9.3-SNAPSHOT</version> | ||||
|  | ||||
|     <build> | ||||
|         <defaultGoal>clean install</defaultGoal> | ||||
|         <defaultGoal>exec:java clean install</defaultGoal> | ||||
|         <finalName>LibsDisguises</finalName> | ||||
|  | ||||
|         <resources> | ||||
| @@ -31,6 +31,25 @@ | ||||
|                 <artifactId>maven-surefire-plugin</artifactId> | ||||
|                 <version>3.0.0-M1</version> | ||||
|             </plugin> | ||||
|             <plugin> | ||||
|                 <groupId>org.codehaus.mojo</groupId> | ||||
|                 <artifactId>exec-maven-plugin</artifactId> | ||||
|                 <version>1.6.0</version> | ||||
|  | ||||
|                 <executions> | ||||
|                     <execution> | ||||
|                         <id>my-execution</id> | ||||
|                         <phase>compile</phase> | ||||
|                         <goals> | ||||
|                             <goal>java</goal> | ||||
|                         </goals> | ||||
|                     </execution> | ||||
|                 </executions> | ||||
|                 <configuration> | ||||
|                     <includePluginDependencies>true</includePluginDependencies> | ||||
|                     <mainClass>me.libraryaddict.disguise.utilities.reflection.CompileMethods</mainClass> | ||||
|                 </configuration> | ||||
|             </plugin> | ||||
|         </plugins> | ||||
|     </build> | ||||
|  | ||||
| @@ -60,12 +79,12 @@ | ||||
|         <dependency> | ||||
|             <groupId>org.spigotmc</groupId> | ||||
|             <artifactId>spigot-api</artifactId> | ||||
|             <version>1.15-R0.1-SNAPSHOT</version> | ||||
|             <version>1.15.2-R0.1-SNAPSHOT</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.spigotmc</groupId> | ||||
|             <artifactId>spigot</artifactId> | ||||
|             <version>1.15-R0.1-SNAPSHOT</version> | ||||
|             <version>1.15.2-R0.1-SNAPSHOT</version> | ||||
|         </dependency> | ||||
|         <!-- testing --> | ||||
|         <dependency> | ||||
|   | ||||
| @@ -16,11 +16,11 @@ import org.bukkit.Bukkit; | ||||
| import org.bukkit.command.CommandSender; | ||||
| import org.bukkit.configuration.ConfigurationSection; | ||||
| import org.bukkit.configuration.file.YamlConfiguration; | ||||
| import org.bukkit.craftbukkit.libs.org.apache.commons.io.FileUtils; | ||||
| import org.bukkit.entity.Entity; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.io.PrintWriter; | ||||
| import java.lang.reflect.InvocationTargetException; | ||||
| import java.util.HashMap; | ||||
| import java.util.Iterator; | ||||
| @@ -308,9 +308,13 @@ public class DisguiseConfig { | ||||
|  | ||||
|             try { | ||||
|                 explain.createNewFile(); | ||||
|                 FileUtils.write(explain, | ||||
|                         "This folder is used to store .png files for uploading with the /savedisguise or /grabskin " + | ||||
|                                 "commands"); | ||||
|  | ||||
|                 try (PrintWriter out = new PrintWriter(explain)) { | ||||
|                     out.println( | ||||
|                             "This folder is used to store .png files for uploading with the /savedisguise or " + | ||||
|                                     "/grabskin " + | ||||
|                                     "commands"); | ||||
|                 } | ||||
|             } | ||||
|             catch (IOException e) { | ||||
|                 e.printStackTrace(); | ||||
|   | ||||
| @@ -20,6 +20,8 @@ import org.bukkit.scoreboard.Scoreboard; | ||||
| import org.bukkit.scoreboard.Team; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.Arrays; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| public class LibsDisguises extends JavaPlugin { | ||||
|     private static LibsDisguises instance; | ||||
| @@ -71,7 +73,15 @@ public class LibsDisguises extends JavaPlugin { | ||||
|  | ||||
|         if (ReflectionManager.getVersion() == null) { | ||||
|             getLogger().severe("You're using the wrong version of Lib's Disguises for your server! This is " + | ||||
|                     "intended for 1.14 & 1.15!"); | ||||
|                     "intended for " + StringUtils | ||||
|                     .join(Arrays.stream(NmsVersion.values()).map(v -> v.name().replace("_", ".")) | ||||
|                             .collect(Collectors.toList()), " & ") + "!"); | ||||
|             getPluginLoader().disablePlugin(this); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (!LibsPremium.isPremium() && ReflectionManager.getVersion().ordinal() < NmsVersion.values().length - 1) { | ||||
|             getLogger().severe("Backwards compatibility is premium only! Use older builds or purchase the plugin!"); | ||||
|             getPluginLoader().disablePlugin(this); | ||||
|             return; | ||||
|         } | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes; | ||||
|  | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.DyeColor; | ||||
| import org.bukkit.Material; | ||||
|  | ||||
| @@ -9,17 +10,20 @@ public enum AnimalColor { | ||||
|     BROWN(DyeColor.BROWN, Material.COCOA_BEANS), | ||||
|     CYAN(DyeColor.CYAN, Material.CYAN_DYE), | ||||
|     GRAY(DyeColor.GRAY, Material.GRAY_DYE), | ||||
|     GREEN(DyeColor.GREEN, Material.GREEN_DYE), | ||||
|     GREEN(DyeColor.GREEN, | ||||
|             NmsVersion.v1_14.isSupported() ? Material.getMaterial("GREEN_DYE") : Material.getMaterial("CATCUS_GREEN")), | ||||
|     LIGHT_BLUE(DyeColor.LIGHT_BLUE, Material.LIGHT_BLUE_DYE), | ||||
|     LIME(DyeColor.LIME, Material.LIME_DYE), | ||||
|     MAGENTA(DyeColor.MAGENTA, Material.MAGENTA_DYE), | ||||
|     ORANGE(DyeColor.ORANGE, Material.ORANGE_DYE), | ||||
|     PINK(DyeColor.PINK, Material.PINK_DYE), | ||||
|     PURPLE(DyeColor.PURPLE, Material.PURPLE_DYE), | ||||
|     RED(DyeColor.RED, Material.RED_DYE), | ||||
|     RED(DyeColor.RED, | ||||
|             NmsVersion.v1_14.isSupported() ? Material.getMaterial("RED_DYE") : Material.getMaterial("ROSE_RED")), | ||||
|     LIGHT_GRAY(DyeColor.LIGHT_GRAY, Material.LIGHT_GRAY_DYE), | ||||
|     WHITE(DyeColor.WHITE, Material.BONE_MEAL), | ||||
|     YELLOW(DyeColor.YELLOW, Material.YELLOW_DYE); | ||||
|     YELLOW(DyeColor.YELLOW, NmsVersion.v1_14.isSupported() ? Material.getMaterial("YELLOW_DYE") : | ||||
|             Material.getMaterial("DANDELION_YELLOW")); | ||||
|  | ||||
|     public static AnimalColor getColorByWool(int woolId) { | ||||
|         for (AnimalColor color : values()) { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes; | ||||
|  | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAdded; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import me.libraryaddict.disguise.utilities.translations.TranslateType; | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| @@ -16,13 +17,13 @@ public enum DisguiseType { | ||||
|  | ||||
|     BAT, | ||||
|  | ||||
|     @NmsAdded(added = NmsVersion.v1_15) BEE, | ||||
|     @NmsAddedIn(val = NmsVersion.v1_15) BEE, | ||||
|  | ||||
|     BLAZE, | ||||
|  | ||||
|     BOAT(1), | ||||
|  | ||||
|     CAT, | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) CAT, | ||||
|  | ||||
|     CAVE_SPIDER, | ||||
|  | ||||
| @@ -74,7 +75,7 @@ public enum DisguiseType { | ||||
|  | ||||
|     FISHING_HOOK(90), | ||||
|  | ||||
|     FOX, | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) FOX, | ||||
|  | ||||
|     GHAST, | ||||
|  | ||||
| @@ -122,7 +123,7 @@ public enum DisguiseType { | ||||
|  | ||||
|     PAINTING, | ||||
|  | ||||
|     PANDA, | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) PANDA, | ||||
|  | ||||
|     PARROT, | ||||
|  | ||||
| @@ -132,7 +133,7 @@ public enum DisguiseType { | ||||
|  | ||||
|     PIG_ZOMBIE, | ||||
|  | ||||
|     PILLAGER, | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) PILLAGER, | ||||
|  | ||||
|     PLAYER, | ||||
|  | ||||
| @@ -144,7 +145,7 @@ public enum DisguiseType { | ||||
|  | ||||
|     RABBIT, | ||||
|  | ||||
|     RAVAGER, | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) RAVAGER, | ||||
|  | ||||
|     SALMON, | ||||
|  | ||||
| @@ -180,9 +181,11 @@ public enum DisguiseType { | ||||
|  | ||||
|     THROWN_EXP_BOTTLE(75), | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) TIPPED_ARROW(60), | ||||
|  | ||||
|     TRIDENT(94, 0), | ||||
|  | ||||
|     TRADER_LLAMA, | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) TRADER_LLAMA, | ||||
|  | ||||
|     TROPICAL_FISH, | ||||
|  | ||||
| @@ -198,7 +201,7 @@ public enum DisguiseType { | ||||
|  | ||||
|     VINDICATOR, | ||||
|  | ||||
|     WANDERING_TRADER, | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) WANDERING_TRADER, | ||||
|  | ||||
|     WITCH, | ||||
|  | ||||
|   | ||||
| @@ -13,6 +13,8 @@ import me.libraryaddict.disguise.DisguiseAPI; | ||||
| import me.libraryaddict.disguise.DisguiseConfig; | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||
| import net.md_5.bungee.api.chat.BaseComponent; | ||||
| import net.md_5.bungee.api.chat.TextComponent; | ||||
| @@ -195,10 +197,12 @@ public class FlagWatcher { | ||||
|         return newList; | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public EntityPose getEntityPose() { | ||||
|         return getData(MetaIndex.ENTITY_POSE); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setEntityPose(EntityPose entityPose) { | ||||
|         setData(MetaIndex.ENTITY_POSE, entityPose); | ||||
|         sendData(MetaIndex.ENTITY_POSE); | ||||
| @@ -208,6 +212,10 @@ public class FlagWatcher { | ||||
|         return getEquipment().getArmorContents(); | ||||
|     } | ||||
|  | ||||
|     public void setArmor(ItemStack[] items) { | ||||
|         getEquipment().setArmorContents(items); | ||||
|     } | ||||
|  | ||||
|     public String getCustomName() { | ||||
|         Optional<WrappedChatComponent> optional = getData(MetaIndex.ENTITY_CUSTOM_NAME); | ||||
|  | ||||
| @@ -220,10 +228,29 @@ public class FlagWatcher { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public void setCustomName(String name) { | ||||
|         if (Strings.isNullOrEmpty(name)) { | ||||
|             setData(MetaIndex.ENTITY_CUSTOM_NAME, Optional.empty()); | ||||
|         } else { | ||||
|             if (name.length() > 64) { | ||||
|                 name = name.substring(0, 64); | ||||
|             } | ||||
|  | ||||
|             setData(MetaIndex.ENTITY_CUSTOM_NAME, Optional.of(WrappedChatComponent.fromText(name))); | ||||
|         } | ||||
|  | ||||
|         sendData(MetaIndex.ENTITY_CUSTOM_NAME); | ||||
|     } | ||||
|  | ||||
|     protected TargetedDisguise getDisguise() { | ||||
|         return disguise; | ||||
|     } | ||||
|  | ||||
|     protected void setDisguise(TargetedDisguise disguise) { | ||||
|         this.disguise = disguise; | ||||
|         equipment.setFlagWatcher(this); | ||||
|     } | ||||
|  | ||||
|     private boolean getEntityFlag(int byteValue) { | ||||
|         return (getData(MetaIndex.ENTITY_META) & 1 << byteValue) != 0; | ||||
|     } | ||||
| @@ -236,10 +263,18 @@ public class FlagWatcher { | ||||
|         return equipment.getItemInMainHand(); | ||||
|     } | ||||
|  | ||||
|     public void setItemInMainHand(ItemStack itemstack) { | ||||
|         setItemStack(EquipmentSlot.HAND, itemstack); | ||||
|     } | ||||
|  | ||||
|     public ItemStack getItemInOffHand() { | ||||
|         return equipment.getItemInOffHand(); | ||||
|     } | ||||
|  | ||||
|     public void setItemInOffHand(ItemStack itemstack) { | ||||
|         setItemStack(EquipmentSlot.OFF_HAND, itemstack); | ||||
|     } | ||||
|  | ||||
|     public ItemStack getItemStack(EquipmentSlot slot) { | ||||
|         return equipment.getItem(slot); | ||||
|     } | ||||
| @@ -278,10 +313,21 @@ public class FlagWatcher { | ||||
|         return getEntityFlag(0); | ||||
|     } | ||||
|  | ||||
|     public void setBurning(boolean setBurning) { | ||||
|         setEntityFlag(0, setBurning); | ||||
|  | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public boolean isCustomNameVisible() { | ||||
|         return getData(MetaIndex.ENTITY_CUSTOM_NAME_VISIBLE); | ||||
|     } | ||||
|  | ||||
|     public void setCustomNameVisible(boolean display) { | ||||
|         setData(MetaIndex.ENTITY_CUSTOM_NAME_VISIBLE, display); | ||||
|         sendData(MetaIndex.ENTITY_CUSTOM_NAME_VISIBLE); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     public boolean isEntityAnimationsAdded() { | ||||
|         return addEntityAnimations; | ||||
| @@ -291,30 +337,67 @@ public class FlagWatcher { | ||||
|         return getEntityFlag(7); | ||||
|     } | ||||
|  | ||||
|     public void setFlyingWithElytra(boolean flying) { | ||||
|         setEntityFlag(7, flying); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public boolean isGlowing() { | ||||
|         return getEntityFlag(6); | ||||
|     } | ||||
|  | ||||
|     public void setGlowing(boolean glowing) { | ||||
|         setEntityFlag(6, glowing); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public boolean isInvisible() { | ||||
|         return getEntityFlag(5); | ||||
|     } | ||||
|  | ||||
|     public void setInvisible(boolean setInvis) { | ||||
|         setEntityFlag(5, setInvis); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public boolean isNoGravity() { | ||||
|         return getData(MetaIndex.ENTITY_NO_GRAVITY); | ||||
|     } | ||||
|  | ||||
|     public void setNoGravity(boolean noGravity) { | ||||
|         setData(MetaIndex.ENTITY_NO_GRAVITY, noGravity); | ||||
|         sendData(MetaIndex.ENTITY_NO_GRAVITY); | ||||
|     } | ||||
|  | ||||
|     public boolean isRightClicking() { | ||||
|         return getEntityFlag(4); | ||||
|     } | ||||
|  | ||||
|     public void setRightClicking(boolean setRightClicking) { | ||||
|         setEntityFlag(4, setRightClicking); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public boolean isSneaking() { | ||||
|         return getEntityFlag(1); | ||||
|     } | ||||
|  | ||||
|     public void setSneaking(boolean setSneaking) { | ||||
|         setEntityFlag(1, setSneaking); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|  | ||||
|         updatePose(); | ||||
|     } | ||||
|  | ||||
|     public boolean isSprinting() { | ||||
|         return getEntityFlag(3); | ||||
|     } | ||||
|  | ||||
|     public void setSprinting(boolean setSprinting) { | ||||
|         setEntityFlag(3, setSprinting); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public void rebuildWatchableObjects() { | ||||
|         watchableObjects = new ArrayList<>(); | ||||
|  | ||||
| @@ -355,8 +438,7 @@ public class FlagWatcher { | ||||
|  | ||||
|             Object value = entityValues.get(data.getIndex()); | ||||
|  | ||||
|             if (isEntityAnimationsAdded() && DisguiseConfig.isMetaPacketsEnabled() && | ||||
|                     data == MetaIndex.ENTITY_META) { | ||||
|             if (isEntityAnimationsAdded() && DisguiseConfig.isMetaPacketsEnabled() && data == MetaIndex.ENTITY_META) { | ||||
|                 value = addEntityAnimations((byte) value, | ||||
|                         WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0)); | ||||
|             } | ||||
| @@ -403,10 +485,6 @@ public class FlagWatcher { | ||||
|         addEntityAnimations = isEntityAnimationsAdded; | ||||
|     } | ||||
|  | ||||
|     public void setArmor(ItemStack[] items) { | ||||
|         getEquipment().setArmorContents(items); | ||||
|     } | ||||
|  | ||||
|     protected void setBackupValue(MetaIndex no, Object value) { | ||||
|         if (no == null) | ||||
|             return; | ||||
| @@ -414,31 +492,6 @@ public class FlagWatcher { | ||||
|         backupEntityValues.put(no.getIndex(), value); | ||||
|     } | ||||
|  | ||||
|     public void setBurning(boolean setBurning) { | ||||
|         setEntityFlag(0, setBurning); | ||||
|  | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public void setCustomName(String name) { | ||||
|         if (Strings.isNullOrEmpty(name)) { | ||||
|             setData(MetaIndex.ENTITY_CUSTOM_NAME, Optional.empty()); | ||||
|         } else { | ||||
|             if (name.length() > 64) { | ||||
|                 name = name.substring(0, 64); | ||||
|             } | ||||
|  | ||||
|             setData(MetaIndex.ENTITY_CUSTOM_NAME, Optional.of(WrappedChatComponent.fromText(name))); | ||||
|         } | ||||
|  | ||||
|         sendData(MetaIndex.ENTITY_CUSTOM_NAME); | ||||
|     } | ||||
|  | ||||
|     public void setCustomNameVisible(boolean display) { | ||||
|         setData(MetaIndex.ENTITY_CUSTOM_NAME_VISIBLE, display); | ||||
|         sendData(MetaIndex.ENTITY_CUSTOM_NAME_VISIBLE); | ||||
|     } | ||||
|  | ||||
|     private void setEntityFlag(int byteValue, boolean flag) { | ||||
|         modifiedEntityAnimations[byteValue] = true; | ||||
|  | ||||
| @@ -451,21 +504,6 @@ public class FlagWatcher { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void setFlyingWithElytra(boolean flying) { | ||||
|         setEntityFlag(7, flying); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public void setGlowing(boolean glowing) { | ||||
|         setEntityFlag(6, glowing); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public void setInvisible(boolean setInvis) { | ||||
|         setEntityFlag(5, setInvis); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Don't use this, use setItemInMainHand instead | ||||
|      * | ||||
| @@ -476,14 +514,6 @@ public class FlagWatcher { | ||||
|         setItemInMainHand(itemstack); | ||||
|     } | ||||
|  | ||||
|     public void setItemInMainHand(ItemStack itemstack) { | ||||
|         setItemStack(EquipmentSlot.HAND, itemstack); | ||||
|     } | ||||
|  | ||||
|     public void setItemInOffHand(ItemStack itemstack) { | ||||
|         setItemStack(EquipmentSlot.OFF_HAND, itemstack); | ||||
|     } | ||||
|  | ||||
|     public void setItemStack(EquipmentSlot slot, ItemStack itemStack) { | ||||
|         equipment.setItem(slot, itemStack); | ||||
|     } | ||||
| @@ -540,23 +570,6 @@ public class FlagWatcher { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void setNoGravity(boolean noGravity) { | ||||
|         setData(MetaIndex.ENTITY_NO_GRAVITY, noGravity); | ||||
|         sendData(MetaIndex.ENTITY_NO_GRAVITY); | ||||
|     } | ||||
|  | ||||
|     public void setRightClicking(boolean setRightClicking) { | ||||
|         setEntityFlag(4, setRightClicking); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     public void setSneaking(boolean setSneaking) { | ||||
|         setEntityFlag(1, setSneaking); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|  | ||||
|         updatePose(); | ||||
|     } | ||||
|  | ||||
|     public boolean isSleeping() { | ||||
|         return sleeping; | ||||
|     } | ||||
| @@ -597,15 +610,15 @@ public class FlagWatcher { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void setSprinting(boolean setSprinting) { | ||||
|         setEntityFlag(3, setSprinting); | ||||
|         sendData(MetaIndex.ENTITY_META); | ||||
|     } | ||||
|  | ||||
|     protected <Y> void setData(MetaIndex<Y> id, Y value) { | ||||
|         if (id == null) | ||||
|             return; | ||||
|  | ||||
|         if (id.getIndex() == -1) { | ||||
|             throw new IllegalArgumentException( | ||||
|                     "You can't do that in this version of Minecraft! I can't use " + MetaIndex.getName(id) + "!"); | ||||
|         } | ||||
|  | ||||
|         if (value == null && id.getDefault() instanceof ItemStack) | ||||
|             throw new IllegalArgumentException("Cannot use null ItemStacks"); | ||||
|  | ||||
| @@ -615,9 +628,4 @@ public class FlagWatcher { | ||||
|             rebuildWatchableObjects(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected void setDisguise(TargetedDisguise disguise) { | ||||
|         this.disguise = disguise; | ||||
|         equipment.setFlagWatcher(this); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -7,15 +7,14 @@ import com.comphenix.protocol.wrappers.nbt.NbtFactory; | ||||
| import com.comphenix.protocol.wrappers.nbt.NbtType; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.*; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAdded; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemoved; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||
| import me.libraryaddict.disguise.utilities.translations.LibsMsg; | ||||
| import org.bukkit.Color; | ||||
| import org.bukkit.Material; | ||||
| import org.bukkit.Particle; | ||||
| import org.bukkit.entity.MushroomCow; | ||||
| import org.bukkit.entity.Villager; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
|  | ||||
| @@ -105,6 +104,7 @@ public class MetaIndex<Y> { | ||||
|      */ | ||||
|     public static MetaIndex<Optional<UUID>> ARROW_UUID = new MetaIndex<>(ArrowWatcher.class, 1, Optional.empty()); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Byte> ARROW_PIERCE_LEVEL = new MetaIndex<>(ArrowWatcher.class, 2, (byte) 0); | ||||
|  | ||||
|     /** | ||||
| @@ -112,10 +112,10 @@ public class MetaIndex<Y> { | ||||
|      */ | ||||
|     public static MetaIndex<Byte> BAT_HANGING = new MetaIndex<>(BatWatcher.class, 0, (byte) 1); | ||||
|  | ||||
|     @NmsAdded(added = NmsVersion.v1_15) | ||||
|     @NmsAddedIn(val = NmsVersion.v1_15) | ||||
|     public static MetaIndex<Byte> BEE_META = new MetaIndex<>(BeeWatcher.class, 0, (byte) 0); | ||||
|  | ||||
|     @NmsAdded(added = NmsVersion.v1_15) | ||||
|     @NmsAddedIn(val = NmsVersion.v1_15) | ||||
|     public static MetaIndex<Integer> BEE_ANGER = new MetaIndex<>(BeeWatcher.class, 1, 0); | ||||
|  | ||||
|     /** | ||||
| @@ -143,12 +143,16 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Integer> BOAT_SHAKE = new MetaIndex<>(BoatWatcher.class, 6, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> CAT_TYPE = new MetaIndex<>(CatWatcher.class, 0, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Boolean> CAT_LYING_DOWN = new MetaIndex<>(CatWatcher.class, 1, false); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Boolean> CAT_LOOKING_UP = new MetaIndex<>(CatWatcher.class, 2, false); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> CAT_COLLAR = new MetaIndex<>(CatWatcher.class, 3, AnimalColor.RED.ordinal()); | ||||
|  | ||||
|     /** | ||||
| @@ -197,6 +201,7 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Integer> ENDER_DRAGON_PHASE = new MetaIndex<>(EnderDragonWatcher.class, 0, 10); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<ItemStack> ENDER_SIGNAL_ITEM = new MetaIndex<>(EnderSignalWatcher.class, 0, | ||||
|             new ItemStack(Material.AIR)); | ||||
|  | ||||
| @@ -205,7 +210,7 @@ public class MetaIndex<Y> { | ||||
|      */ | ||||
|     public static MetaIndex<Boolean> ENDERMAN_AGRESSIVE = new MetaIndex<>(EndermanWatcher.class, 1, false); | ||||
|  | ||||
|     @NmsAdded(added = NmsVersion.v1_15) | ||||
|     @NmsAddedIn(val = NmsVersion.v1_15) | ||||
|     public static MetaIndex<Boolean> ENDERMAN_UNKNOWN = new MetaIndex<>(EndermanWatcher.class, 2, false); | ||||
|  | ||||
|     /** | ||||
| @@ -245,11 +250,14 @@ public class MetaIndex<Y> { | ||||
|     /** | ||||
|      * If entity can make sounds, no noticable effects | ||||
|      */ | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<EntityPose> ENTITY_POSE = new MetaIndex<>(FlagWatcher.class, 6, EntityPose.STANDING); | ||||
|  | ||||
|     public static MetaIndex<BlockPosition> FALLING_BLOCK_POSITION = new MetaIndex<>(FallingBlockWatcher.class, 0, | ||||
|             BlockPosition.ORIGIN); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<ItemStack> FIREBALL_ITEM = new MetaIndex<>(FireballWatcher.class, 0, | ||||
|             new ItemStack(Material.AIR)); | ||||
|  | ||||
| @@ -258,9 +266,14 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Boolean> FISH_FROM_BUCKET = new MetaIndex<>(FishWatcher.class, 0, false); | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> FIREWORK_ATTACHED_ENTITY_OLD = new MetaIndex<>(FireworkWatcher.class, 1, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<OptionalInt> FIREWORK_ATTACHED_ENTITY = new MetaIndex<>(FireworkWatcher.class, 1, | ||||
|             OptionalInt.empty()); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Boolean> FIREWORK_SHOT_AT_ANGLE = new MetaIndex<>(FireworkWatcher.class, 2, false); | ||||
|  | ||||
|     public static MetaIndex<Integer> FISHING_HOOK_HOOKED = new MetaIndex<>(FishingHookWatcher.class, 0, 0); | ||||
| @@ -268,12 +281,16 @@ public class MetaIndex<Y> { | ||||
|     /** | ||||
|      * The type of fox, its coloring | ||||
|      */ | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> FOX_TYPE = new MetaIndex<>(FoxWatcher.class, 0, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Byte> FOX_META = new MetaIndex<>(FoxWatcher.class, 1, (byte) 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Optional<UUID>> FOX_TRUSTED_1 = new MetaIndex<>(FoxWatcher.class, 2, Optional.empty()); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Optional<UUID>> FOX_TRUSTED_2 = new MetaIndex<>(FoxWatcher.class, 3, Optional.empty()); | ||||
|  | ||||
|     /** | ||||
| @@ -297,6 +314,8 @@ public class MetaIndex<Y> { | ||||
|     public static MetaIndex<Boolean> HORSE_CHESTED_CARRYING_CHEST = new MetaIndex<>(ChestedHorseWatcher.class, 0, | ||||
|             false); | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> HORSE_ARMOR = new MetaIndex<>(HorseWatcher.class, 1, 0); | ||||
|     /** | ||||
|      * Color of the horse, uses enum not RGB | ||||
|      */ | ||||
| @@ -313,8 +332,15 @@ public class MetaIndex<Y> { | ||||
|     public static MetaIndex<Optional<UUID>> HORSE_OWNER = new MetaIndex<>(AbstractHorseWatcher.class, 1, | ||||
|             Optional.empty()); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Byte> ILLAGER_SPELL = new MetaIndex<>(IllagerWizardWatcher.class, 0, (byte) 0); | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Byte> ILLAGER_META = new MetaIndex<>(IllagerWatcher.class, 0, (byte) 0); | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Byte> ILLAGER_SPELL_TICKS = new MetaIndex<>(IllagerWizardWatcher.class, 0, (byte) 0); | ||||
|  | ||||
|     public static MetaIndex<Byte> INSENTIENT_META = new MetaIndex<>(InsentientWatcher.class, 0, (byte) 0); | ||||
|  | ||||
|     public static MetaIndex<Byte> IRON_GOLEM_PLAYER_CREATED = new MetaIndex<>(IronGolemWatcher.class, 0, (byte) 0); | ||||
| @@ -358,9 +384,10 @@ public class MetaIndex<Y> { | ||||
|     /** | ||||
|      * How many bee stings does the entity have | ||||
|      */ | ||||
|     @NmsAdded(added = NmsVersion.v1_15) | ||||
|     @NmsAddedIn(val = NmsVersion.v1_15) | ||||
|     public static MetaIndex<Integer> LIVING_STINGS = new MetaIndex<>(LivingWatcher.class, 5, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Optional<BlockPosition>> LIVING_BED_POSITION = new MetaIndex<>(LivingWatcher.class, 6, | ||||
|             Optional.empty()); | ||||
|  | ||||
| @@ -410,21 +437,31 @@ public class MetaIndex<Y> { | ||||
|      */ | ||||
|     public static MetaIndex<Boolean> MINECART_FURANCE_FUELED = new MetaIndex<>(MinecartFurnaceWatcher.class, 0, false); | ||||
|  | ||||
|     public static MetaIndex<String> MUSHROOM_COW_TYPE = new MetaIndex<>(MushroomCowWatcher.class, 0, | ||||
|             MushroomCow.Variant.RED.name().toLowerCase()); | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<String> MUSHROOM_COW_TYPE = new MetaIndex<>(MushroomCowWatcher.class, 0, "RED"); | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> OCELOT_TYPE = new MetaIndex<>(OcelotWatcher.class, 0, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Boolean> OCELOT_TRUST = new MetaIndex<>(OcelotWatcher.class, 0, false); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> PANDA_HEAD_SHAKING = new MetaIndex<>(PandaWatcher.class, 0, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> PANDA_UNKNOWN_1 = new MetaIndex<>(PandaWatcher.class, 1, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> PANDA_UNKNOWN_2 = new MetaIndex<>(PandaWatcher.class, 2, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Byte> PANDA_MAIN_GENE = new MetaIndex<>(PandaWatcher.class, 3, (byte) 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Byte> PANDA_HIDDEN_GENE = new MetaIndex<>(PandaWatcher.class, 4, (byte) 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Byte> PANDA_META = new MetaIndex<>(PandaWatcher.class, 5, (byte) 0); | ||||
|  | ||||
|     public static MetaIndex<Integer> PARROT_VARIANT = new MetaIndex<>(ParrotWatcher.class, 0, 0); | ||||
| @@ -438,6 +475,7 @@ public class MetaIndex<Y> { | ||||
|      */ | ||||
|     public static MetaIndex<Integer> PIG_BOOST = new MetaIndex<>(PigWatcher.class, 1, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Boolean> PILLAGER_AIMING_BOW = new MetaIndex<>(PillagerWatcher.class, 0, false); | ||||
|  | ||||
|     public static MetaIndex<Float> PLAYER_ABSORPTION = new MetaIndex<>(PlayerWatcher.class, 0, 0F); | ||||
| @@ -460,6 +498,7 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Integer> RABBIT_TYPE = new MetaIndex<>(RabbitWatcher.class, 0, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Boolean> RAIDER_CASTING_SPELL = new MetaIndex<>(RaiderWatcher.class, 0, false); | ||||
|  | ||||
|     public static MetaIndex<Byte> SHEEP_WOOL = new MetaIndex<>(SheepWatcher.class, 0, (byte) 0); | ||||
| @@ -473,6 +512,9 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Byte> SHULKER_PEEKING = new MetaIndex<>(ShulkerWatcher.class, 2, (byte) 0); | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Boolean> SKELETON_SWING_ARMS = new MetaIndex<>(SkeletonWatcher.class, 0, false); | ||||
|  | ||||
|     public static MetaIndex<Integer> SLIME_SIZE = new MetaIndex<>(SlimeWatcher.class, 0, 1); | ||||
|  | ||||
|     public static MetaIndex<Byte> SNOWMAN_DERP = new MetaIndex<>(SnowmanWatcher.class, 0, (byte) 16); | ||||
| @@ -487,6 +529,7 @@ public class MetaIndex<Y> { | ||||
|     public static MetaIndex<Optional<UUID>> TAMEABLE_OWNER = new MetaIndex<>(TameableWatcher.class, 1, | ||||
|             Optional.empty()); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<ItemStack> THROWABLE_ITEM = new MetaIndex<>(ThrowableWatcher.class, 0, | ||||
|             new ItemStack(Material.AIR)); | ||||
|  | ||||
| @@ -496,7 +539,7 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Byte> TRIDENT_ENCHANTS = new MetaIndex<>(TridentWatcher.class, 0, (byte) 0); | ||||
|  | ||||
|     @NmsAdded(added = NmsVersion.v1_15) | ||||
|     @NmsAddedIn(val = NmsVersion.v1_15) | ||||
|     public static MetaIndex<Boolean> TRIDENT_ENCHANTED = new MetaIndex<>(TridentWatcher.class, 1, false); | ||||
|  | ||||
|     public static MetaIndex<Integer> TROPICAL_FISH_VARIANT = new MetaIndex<>(TropicalFishWatcher.class, 0, 0); | ||||
| @@ -517,10 +560,16 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Byte> VEX_ANGRY = new MetaIndex<>(VexWatcher.class, 0, (byte) 0); | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> VILLAGER_PROFESSION = new MetaIndex<>(VillagerWatcher.class, 0, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> ABSTRACT_VILLAGER_ANGRY = new MetaIndex<>(AbstractVillagerWatcher.class, 0, 0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<VillagerData> VILLAGER_DATA = new MetaIndex<>(VillagerWatcher.class, 0, | ||||
|             new VillagerData(Villager.Type.PLAINS, Villager.Profession.NONE, 1)); | ||||
|             NmsVersion.v1_14.isSupported() ? new VillagerData(Villager.Type.PLAINS, Villager.Profession.NONE, 1) : | ||||
|                     null); | ||||
|  | ||||
|     public static MetaIndex<Boolean> WITCH_AGGRESSIVE = new MetaIndex<>(WitchWatcher.class, 0, false); | ||||
|  | ||||
| @@ -536,19 +585,28 @@ public class MetaIndex<Y> { | ||||
|  | ||||
|     public static MetaIndex<Boolean> WOLF_BEGGING = new MetaIndex<>(WolfWatcher.class, 1, false); | ||||
|  | ||||
|     @NmsRemoved(removed = NmsVersion.v1_15) | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_15) | ||||
|     public static MetaIndex<Float> WOLF_DAMAGE = new MetaIndex<>(WolfWatcher.class, 0, 1F); | ||||
|  | ||||
|     public static MetaIndex<Integer> WOLF_COLLAR = new MetaIndex<>(WolfWatcher.class, 2, 14); | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Boolean> ZOMBIE_AGGRESSIVE = new MetaIndex<>(ZombieWatcher.class, 2, false); | ||||
|  | ||||
|     public static MetaIndex<Boolean> ZOMBIE_BABY = new MetaIndex<>(ZombieWatcher.class, 0, false); | ||||
|  | ||||
|     public static MetaIndex<Boolean> ZOMBIE_CONVERTING_DROWNED = new MetaIndex<>(ZombieWatcher.class, 2, false); | ||||
|  | ||||
|     public static MetaIndex<Integer> ZOMBIE_PLACEHOLDER = new MetaIndex<>(ZombieWatcher.class, 1, 0); | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<Integer> ZOMBIE_VILLAGER_PROFESSION_OLD = new MetaIndex<>(ZombieVillagerWatcher.class, 1, | ||||
|             0); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public static MetaIndex<VillagerData> ZOMBIE_VILLAGER_PROFESSION = new MetaIndex<>(ZombieVillagerWatcher.class, 1, | ||||
|             new VillagerData(Villager.Type.PLAINS, Villager.Profession.NONE, 1)); | ||||
|             NmsVersion.v1_14.isSupported() ? new VillagerData(Villager.Type.PLAINS, Villager.Profession.NONE, 1) : | ||||
|                     null); | ||||
|  | ||||
|     /** | ||||
|      * Shown for villager conversion | ||||
| @@ -561,35 +619,20 @@ public class MetaIndex<Y> { | ||||
|         orderMetaIndexes(); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     private static void eliminateBlankIndexes() { | ||||
|         ArrayList<Entry<Class, ArrayList<MetaIndex>>> list = new ArrayList<>(); | ||||
|         HashMap<Class, ArrayList<MetaIndex>> metas = new HashMap<>(); | ||||
|  | ||||
|         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); | ||||
|             metas.computeIfAbsent(index.getFlagWatcher(), (a) -> new ArrayList<>()).add(index); | ||||
|         } | ||||
|  | ||||
|         for (Entry<Class, ArrayList<MetaIndex>> entry : list) { | ||||
|             entry.getValue().sort(Comparator.comparingInt(MetaIndex::getIndex)); | ||||
|         for (ArrayList<MetaIndex> list : metas.values()) { | ||||
|             list.sort(Comparator.comparingInt(MetaIndex::getIndex)); | ||||
|  | ||||
|             for (MetaIndex ind : entry.getValue()) { | ||||
|                 ind._index = entry.getValue().indexOf(ind); | ||||
|             int i = 0; | ||||
|  | ||||
|             for (MetaIndex ind : list) { | ||||
|                 ind._index = i++; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -599,7 +642,7 @@ public class MetaIndex<Y> { | ||||
|             if (flagType.getFlagWatcher() == FlagWatcher.class) | ||||
|                 continue; | ||||
|  | ||||
|             flagType._index += getNoIndexes(flagType.getFlagWatcher().getSuperclass()); | ||||
|             flagType._index += getNoIndexes(ReflectionManager.getSuperClass(flagType.getFlagWatcher())); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -628,7 +671,7 @@ public class MetaIndex<Y> { | ||||
|                     if (type.getIndex() != i) | ||||
|                         continue; | ||||
|  | ||||
|                     if (!type.getFlagWatcher().isAssignableFrom(entry.getKey())) | ||||
|                     if (!ReflectionManager.isAssignableFrom(entry.getKey(), type.getFlagWatcher())) | ||||
|                         continue; | ||||
|  | ||||
|                     if (found != null) { | ||||
| @@ -702,7 +745,7 @@ public class MetaIndex<Y> { | ||||
|             if (type.getIndex() != flagNo) | ||||
|                 continue; | ||||
|  | ||||
|             if (!type.getFlagWatcher().isAssignableFrom(watcherClass)) | ||||
|             if (!ReflectionManager.isAssignableFrom(watcherClass, type.getFlagWatcher())) | ||||
|                 continue; | ||||
|  | ||||
|             return type; | ||||
| @@ -719,7 +762,7 @@ public class MetaIndex<Y> { | ||||
|         ArrayList<MetaIndex> list = new ArrayList<>(); | ||||
|  | ||||
|         for (MetaIndex type : values()) { | ||||
|             if (type == null || !type.getFlagWatcher().isAssignableFrom(watcherClass)) | ||||
|             if (type == null || !ReflectionManager.isAssignableFrom(watcherClass, type.getFlagWatcher())) | ||||
|                 continue; | ||||
|  | ||||
|             list.add(type); | ||||
| @@ -741,7 +784,7 @@ public class MetaIndex<Y> { | ||||
|         } | ||||
|  | ||||
|         if (c != FlagWatcher.class) { | ||||
|             found += getNoIndexes(c.getSuperclass()); | ||||
|             found += getNoIndexes(ReflectionManager.getSuperClass(c)); | ||||
|         } | ||||
|  | ||||
|         return found; | ||||
| @@ -839,12 +882,13 @@ public class MetaIndex<Y> { | ||||
|                 if (field.getType() != MetaIndex.class) | ||||
|                     continue; | ||||
|  | ||||
|                 MetaIndex index = (MetaIndex) field.get(null); | ||||
|  | ||||
|                 if (!ReflectionManager.isSupported(field)) { | ||||
|                     index._index = -1; | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 MetaIndex index = (MetaIndex) field.get(null); | ||||
|  | ||||
|                 if (index == null) | ||||
|                     continue; | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 18/05/2019. | ||||
| @@ -11,16 +13,19 @@ public class AbstractVillagerWatcher extends AgeableWatcher { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     public void setAngry(int ticks) { | ||||
|         setData(MetaIndex.ABSTRACT_VILLAGER_ANGRY, ticks); | ||||
|         sendData(MetaIndex.ABSTRACT_VILLAGER_ANGRY); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public int getAngry() { | ||||
|         return getData(MetaIndex.ABSTRACT_VILLAGER_ANGRY); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public boolean isAngry() { | ||||
|         return getAngry() > 0; | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setAngry(int ticks) { | ||||
|         setData(MetaIndex.ABSTRACT_VILLAGER_ANGRY, ticks); | ||||
|         sendData(MetaIndex.ABSTRACT_VILLAGER_ANGRY); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| public class ArrowWatcher extends FlagWatcher { | ||||
|     public ArrowWatcher(Disguise disguise) { | ||||
| @@ -18,12 +20,14 @@ public class ArrowWatcher extends FlagWatcher { | ||||
|         sendData(MetaIndex.ARROW_CRITICAL); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public int getPierceLevel() { | ||||
|         return getData(MetaIndex.ARROW_PIERCE_LEVEL); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setPierceLevel(int pierceLevel) { | ||||
|         setData(MetaIndex.ARROW_PIERCE_LEVEL, (byte) pierceLevel); | ||||
|         sendData(MetaIndex.ARROW_PIERCE_LEVEL); | ||||
|     } | ||||
|  | ||||
|     public int getPierceLevel() { | ||||
|         return getData(MetaIndex.ARROW_PIERCE_LEVEL); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,10 +2,13 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 14/12/2019. | ||||
|  */ | ||||
| @NmsAddedIn(val = NmsVersion.v1_15) | ||||
| public class BeeWatcher extends AgeableWatcher { | ||||
|     public BeeWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|   | ||||
| @@ -4,6 +4,8 @@ import me.libraryaddict.disguise.disguisetypes.AnimalColor; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.DyeColor; | ||||
| import org.bukkit.entity.Cat; | ||||
|  | ||||
| @@ -12,6 +14,7 @@ import java.util.Random; | ||||
| /** | ||||
|  * Created by libraryaddict on 6/05/2019. | ||||
|  */ | ||||
| @NmsAddedIn(val = NmsVersion.v1_14) | ||||
| public class CatWatcher extends TameableWatcher { | ||||
|     public CatWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
| @@ -29,6 +32,10 @@ public class CatWatcher extends TameableWatcher { | ||||
|         sendData(MetaIndex.CAT_TYPE); | ||||
|     } | ||||
|  | ||||
|     public DyeColor getCollarColor() { | ||||
|         return AnimalColor.getColorByWool(getData(MetaIndex.CAT_COLLAR)).getDyeColor(); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     public void setCollarColor(AnimalColor color) { | ||||
|         setCollarColor(color.getDyeColor()); | ||||
| @@ -47,8 +54,8 @@ public class CatWatcher extends TameableWatcher { | ||||
|         sendData(MetaIndex.CAT_COLLAR); | ||||
|     } | ||||
|  | ||||
|     public DyeColor getCollarColor() { | ||||
|         return AnimalColor.getColorByWool(getData(MetaIndex.CAT_COLLAR)).getDyeColor(); | ||||
|     public boolean isLyingDown() { | ||||
|         return getData(MetaIndex.CAT_LYING_DOWN); | ||||
|     } | ||||
|  | ||||
|     public void setLyingDown(boolean value) { | ||||
| @@ -56,16 +63,12 @@ public class CatWatcher extends TameableWatcher { | ||||
|         sendData(MetaIndex.CAT_LYING_DOWN); | ||||
|     } | ||||
|  | ||||
|     public boolean isLyingDown() { | ||||
|         return getData(MetaIndex.CAT_LYING_DOWN); | ||||
|     public boolean isLookingUp() { | ||||
|         return getData(MetaIndex.CAT_LOOKING_UP); | ||||
|     } | ||||
|  | ||||
|     public void setLookingUp(boolean value) { | ||||
|         setData(MetaIndex.CAT_LOOKING_UP, value); | ||||
|         sendData(MetaIndex.CAT_LOOKING_UP); | ||||
|     } | ||||
|  | ||||
|     public boolean isLookingUp() { | ||||
|         return getData(MetaIndex.CAT_LOOKING_UP); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.Material; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
|  | ||||
| @@ -13,15 +15,19 @@ public class EnderSignalWatcher extends FlagWatcher { | ||||
|     public EnderSignalWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|  | ||||
|         setItemStack(new ItemStack(Material.ENDER_EYE)); | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             setItemStack(new ItemStack(Material.ENDER_EYE)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public ItemStack getItemStack() { | ||||
|         return getData(MetaIndex.ENDER_SIGNAL_ITEM); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setItemStack(ItemStack item) { | ||||
|         setData(MetaIndex.ENDER_SIGNAL_ITEM, item); | ||||
|         sendData(MetaIndex.ENDER_SIGNAL_ITEM); | ||||
|     } | ||||
|  | ||||
|     public ItemStack getItemStack() { | ||||
|         return getData(MetaIndex.ENDER_SIGNAL_ITEM); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.Material; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
|  | ||||
| @@ -13,13 +15,17 @@ public class FireballWatcher extends FlagWatcher { | ||||
|     public FireballWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|  | ||||
|         setData(MetaIndex.FIREBALL_ITEM, new ItemStack(Material.FIRE_CHARGE)); | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             setData(MetaIndex.FIREBALL_ITEM, new ItemStack(Material.FIRE_CHARGE)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public ItemStack getItemStack() { | ||||
|         return getData(MetaIndex.FIREBALL_ITEM); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setItemStack(ItemStack item) { | ||||
|         setData(MetaIndex.FIREBALL_ITEM, item); | ||||
|         sendData(MetaIndex.FIREBALL_ITEM); | ||||
|   | ||||
| @@ -1,12 +1,13 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.Material; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
|  | ||||
| import java.util.OptionalInt; | ||||
|  | ||||
| public class FireworkWatcher extends FlagWatcher { | ||||
| @@ -22,15 +23,6 @@ public class FireworkWatcher extends FlagWatcher { | ||||
|         return getData(MetaIndex.FIREWORK_ITEM); | ||||
|     } | ||||
|  | ||||
|     public boolean isShotAtAngle() { | ||||
|         return getData(MetaIndex.FIREWORK_SHOT_AT_ANGLE); | ||||
|     } | ||||
|  | ||||
|     public void setShotAtAngle(boolean shotAtAngle) { | ||||
|         setData(MetaIndex.FIREWORK_SHOT_AT_ANGLE, shotAtAngle); | ||||
|         sendData(MetaIndex.FIREWORK_SHOT_AT_ANGLE); | ||||
|     } | ||||
|  | ||||
|     public void setFirework(ItemStack newItem) { | ||||
|         if (newItem == null) { | ||||
|             newItem = new ItemStack(Material.AIR); | ||||
| @@ -43,12 +35,38 @@ public class FireworkWatcher extends FlagWatcher { | ||||
|         sendData(MetaIndex.FIREWORK_ITEM); | ||||
|     } | ||||
|  | ||||
|     public void setAttachedEntity(OptionalInt entityId) { | ||||
|         setData(MetaIndex.FIREWORK_ATTACHED_ENTITY, entityId); | ||||
|         sendData(MetaIndex.FIREWORK_ATTACHED_ENTITY); | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public boolean isShotAtAngle() { | ||||
|         return getData(MetaIndex.FIREWORK_SHOT_AT_ANGLE); | ||||
|     } | ||||
|  | ||||
|     public OptionalInt getAttachedEntity() { | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setShotAtAngle(boolean shotAtAngle) { | ||||
|         setData(MetaIndex.FIREWORK_SHOT_AT_ANGLE, shotAtAngle); | ||||
|         sendData(MetaIndex.FIREWORK_SHOT_AT_ANGLE); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public OptionalInt getAttachedEntityOpt() { | ||||
|         return getData(MetaIndex.FIREWORK_ATTACHED_ENTITY); | ||||
|     } | ||||
|  | ||||
|     public int getAttachedEntity() { | ||||
|         return getData(MetaIndex.FIREWORK_ATTACHED_ENTITY).orElse(0); | ||||
|     } | ||||
|  | ||||
|     public void setAttachedEntity(int entityId) { | ||||
|         setAttachedEntity(entityId == 0 ? OptionalInt.empty() : OptionalInt.of(entityId)); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setAttachedEntity(OptionalInt entityId) { | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             setData(MetaIndex.FIREWORK_ATTACHED_ENTITY, entityId); | ||||
|             sendData(MetaIndex.FIREWORK_ATTACHED_ENTITY); | ||||
|         } else { | ||||
|             setData(MetaIndex.FIREWORK_ATTACHED_ENTITY_OLD, entityId.orElse(0)); | ||||
|             sendData(MetaIndex.FIREWORK_ATTACHED_ENTITY_OLD); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.entity.Fox; | ||||
|  | ||||
| import java.util.Random; | ||||
| @@ -10,6 +12,7 @@ import java.util.Random; | ||||
| /** | ||||
|  * Created by libraryaddict on 6/05/2019. | ||||
|  */ | ||||
| @NmsAddedIn(val = NmsVersion.v1_14) | ||||
| public class FoxWatcher extends AgeableWatcher { | ||||
|     public FoxWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
| @@ -21,6 +24,10 @@ public class FoxWatcher extends AgeableWatcher { | ||||
|         return getFoxFlag(1); | ||||
|     } | ||||
|  | ||||
|     public void setSitting(boolean value) { | ||||
|         setFoxFlag(1, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isCrouching() { | ||||
|         return getFoxFlag(4); | ||||
|     } | ||||
| @@ -29,10 +36,6 @@ public class FoxWatcher extends AgeableWatcher { | ||||
|         setFoxFlag(4, value); | ||||
|     } | ||||
|  | ||||
|     public void setSitting(boolean value) { | ||||
|         setFoxFlag(1, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isSleeping() { | ||||
|         return getFoxFlag(32); | ||||
|     } | ||||
| @@ -51,38 +54,38 @@ public class FoxWatcher extends AgeableWatcher { | ||||
|         sendData(MetaIndex.FOX_TYPE); | ||||
|     } | ||||
|  | ||||
|     public void setHeadTilted(boolean value) { | ||||
|         setFoxFlag(8, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isHeadTilted() { | ||||
|         return getFoxFlag(8); | ||||
|     } | ||||
|  | ||||
|     public void setSpringing(boolean value) { | ||||
|         setFoxFlag(16, value); | ||||
|     public void setHeadTilted(boolean value) { | ||||
|         setFoxFlag(8, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isSpringing() { | ||||
|         return getFoxFlag(16); | ||||
|     } | ||||
|  | ||||
|     public void setTipToeing(boolean value) { | ||||
|         setFoxFlag(64, value); | ||||
|     public void setSpringing(boolean value) { | ||||
|         setFoxFlag(16, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isTipToeing() { | ||||
|         return getFoxFlag(64); | ||||
|     } | ||||
|  | ||||
|     public void setAngry(boolean value) { | ||||
|         setFoxFlag(128, value); | ||||
|     public void setTipToeing(boolean value) { | ||||
|         setFoxFlag(64, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isAngry() { | ||||
|         return getFoxFlag(128); | ||||
|     } | ||||
|  | ||||
|     public void setAngry(boolean value) { | ||||
|         setFoxFlag(128, value); | ||||
|     } | ||||
|  | ||||
|     private boolean getFoxFlag(int value) { | ||||
|         return (getData(MetaIndex.FOX_META) & value) != 0; | ||||
|     } | ||||
|   | ||||
| @@ -4,6 +4,8 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.Material; | ||||
| import org.bukkit.entity.Horse.Color; | ||||
| import org.bukkit.entity.Horse.Style; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| @@ -20,27 +22,46 @@ public class HorseWatcher extends AbstractHorseWatcher { | ||||
|         return Color.values()[(getData(MetaIndex.HORSE_COLOR) & 0xFF)]; | ||||
|     } | ||||
|  | ||||
|     public Style getStyle() { | ||||
|         return Style.values()[(getData(MetaIndex.HORSE_COLOR) >>> 8)]; | ||||
|     } | ||||
|  | ||||
|     @RandomDefaultValue | ||||
|     public void setColor(Color color) { | ||||
|         setData(MetaIndex.HORSE_COLOR, color.ordinal() & 0xFF | getStyle().ordinal() << 8); | ||||
|         sendData(MetaIndex.HORSE_COLOR); | ||||
|     } | ||||
|  | ||||
|     public Style getStyle() { | ||||
|         return Style.values()[(getData(MetaIndex.HORSE_COLOR) >>> 8)]; | ||||
|     } | ||||
|  | ||||
|     @RandomDefaultValue | ||||
|     public void setStyle(Style style) { | ||||
|         setData(MetaIndex.HORSE_COLOR, getColor().ordinal() & 0xFF | style.ordinal() << 8); | ||||
|         sendData(MetaIndex.HORSE_COLOR); | ||||
|     } | ||||
|  | ||||
|     public void setHorseArmor(ItemStack item) { | ||||
|         getEquipment().setChestplate(item); | ||||
|     } | ||||
|  | ||||
|     public ItemStack getHorseArmor() { | ||||
|         return getEquipment().getChestplate(); | ||||
|     } | ||||
|  | ||||
|     public void setHorseArmor(ItemStack item) { | ||||
|         getEquipment().setChestplate(item); | ||||
|  | ||||
|         if (!NmsVersion.v1_14.isSupported()) { | ||||
|             int value = 0; | ||||
|  | ||||
|             if (item != null) { | ||||
|                 Material mat = item.getType(); | ||||
|  | ||||
|                 if (mat == Material.IRON_HORSE_ARMOR) { | ||||
|                     value = 1; | ||||
|                 } else if (mat == Material.GOLDEN_HORSE_ARMOR) { | ||||
|                     value = 2; | ||||
|                 } else if (mat == Material.DIAMOND_HORSE_ARMOR) { | ||||
|                     value = 3; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             setData(MetaIndex.HORSE_ARMOR, value); | ||||
|             sendData(MetaIndex.HORSE_ARMOR); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,6 +2,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.entity.Spellcaster; | ||||
|  | ||||
| public class IllagerWizardWatcher extends IllagerWatcher { | ||||
| @@ -9,12 +12,27 @@ public class IllagerWizardWatcher extends IllagerWatcher { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public Spellcaster.Spell getSpell() { | ||||
|         return Spellcaster.Spell.values()[getData(MetaIndex.ILLAGER_SPELL)]; | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setSpell(Spellcaster.Spell spell) { | ||||
|         setData(MetaIndex.ILLAGER_SPELL, (byte) spell.ordinal()); | ||||
|         sendData(MetaIndex.ILLAGER_SPELL); | ||||
|     } | ||||
|  | ||||
|     public Spellcaster.Spell getSpell() { | ||||
|         return Spellcaster.Spell.values()[getData(MetaIndex.ILLAGER_SPELL)]; | ||||
|     @Deprecated | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public int getSpellTicks() { | ||||
|         return getData(MetaIndex.ILLAGER_SPELL_TICKS); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public void setSpellTicks(int spellTicks) { | ||||
|         setData(MetaIndex.ILLAGER_SPELL_TICKS, (byte) spellTicks); | ||||
|         sendData(MetaIndex.ILLAGER_SPELL_TICKS); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -11,6 +11,8 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.Color; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Player; | ||||
| @@ -38,6 +40,12 @@ public class LivingWatcher extends FlagWatcher { | ||||
|         return clone; | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public BlockPosition getBedPosition() { | ||||
|         return getData(MetaIndex.LIVING_BED_POSITION).orElse(null); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setBedPosition(BlockPosition blockPosition) { | ||||
|         Optional<BlockPosition> optional; | ||||
|  | ||||
| @@ -51,22 +59,61 @@ public class LivingWatcher extends FlagWatcher { | ||||
|         sendData(MetaIndex.LIVING_BED_POSITION); | ||||
|     } | ||||
|  | ||||
|     public BlockPosition getBedPosition() { | ||||
|         return getData(MetaIndex.LIVING_BED_POSITION).orElse(null); | ||||
|     } | ||||
|  | ||||
|     public float getHealth() { | ||||
|         return getData(MetaIndex.LIVING_HEALTH); | ||||
|     } | ||||
|  | ||||
|     public void setHealth(float health) { | ||||
|         setData(MetaIndex.LIVING_HEALTH, health); | ||||
|         sendData(MetaIndex.LIVING_HEALTH); | ||||
|     } | ||||
|  | ||||
|     public double getMaxHealth() { | ||||
|         return maxHealth; | ||||
|     } | ||||
|  | ||||
|     public void setMaxHealth(double newHealth) { | ||||
|         this.maxHealth = newHealth; | ||||
|         this.maxHealthSet = true; | ||||
|  | ||||
|         if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) { | ||||
|             PacketContainer packet = new PacketContainer(Server.UPDATE_ATTRIBUTES); | ||||
|  | ||||
|             List<WrappedAttribute> attributes = new ArrayList<>(); | ||||
|  | ||||
|             Builder builder; | ||||
|             builder = WrappedAttribute.newBuilder(); | ||||
|             builder.attributeKey("generic.maxHealth"); | ||||
|             builder.baseValue(getMaxHealth()); | ||||
|             builder.packet(packet); | ||||
|  | ||||
|             attributes.add(builder.build()); | ||||
|  | ||||
|             Entity entity = getDisguise().getEntity(); | ||||
|  | ||||
|             packet.getIntegers().write(0, entity.getEntityId()); | ||||
|             packet.getAttributeCollectionModifier().write(0, attributes); | ||||
|  | ||||
|             for (Player player : DisguiseUtilities.getPerverts(getDisguise())) { | ||||
|                 try { | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); | ||||
|                 } | ||||
|                 catch (InvocationTargetException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public boolean isPotionParticlesAmbient() { | ||||
|         return getData(MetaIndex.LIVING_POTION_AMBIENT); | ||||
|     } | ||||
|  | ||||
|     public void setPotionParticlesAmbient(boolean particles) { | ||||
|         setData(MetaIndex.LIVING_POTION_AMBIENT, particles); | ||||
|         sendData(MetaIndex.LIVING_POTION_AMBIENT); | ||||
|     } | ||||
|  | ||||
|     public Color getParticlesColor() { | ||||
|         int color = getData(MetaIndex.LIVING_POTIONS); | ||||
|         return Color.fromRGB(color); | ||||
| @@ -151,21 +198,11 @@ public class LivingWatcher extends FlagWatcher { | ||||
|         sendPotionEffects(); | ||||
|     } | ||||
|  | ||||
|     public void setPotionParticlesAmbient(boolean particles) { | ||||
|         setData(MetaIndex.LIVING_POTION_AMBIENT, particles); | ||||
|         sendData(MetaIndex.LIVING_POTION_AMBIENT); | ||||
|     } | ||||
|  | ||||
|     private void sendPotionEffects() { | ||||
|         setData(MetaIndex.LIVING_POTIONS, getPotions()); | ||||
|         sendData(MetaIndex.LIVING_POTIONS); | ||||
|     } | ||||
|  | ||||
|     public void setHealth(float health) { | ||||
|         setData(MetaIndex.LIVING_HEALTH, health); | ||||
|         sendData(MetaIndex.LIVING_HEALTH); | ||||
|     } | ||||
|  | ||||
|     public int getArrowsSticking() { | ||||
|         return getData(MetaIndex.LIVING_ARROWS); | ||||
|     } | ||||
| @@ -174,37 +211,4 @@ public class LivingWatcher extends FlagWatcher { | ||||
|         setData(MetaIndex.LIVING_ARROWS, Math.max(0, Math.min(127, arrowsNo))); | ||||
|         sendData(MetaIndex.LIVING_ARROWS); | ||||
|     } | ||||
|  | ||||
|     public void setMaxHealth(double newHealth) { | ||||
|         this.maxHealth = newHealth; | ||||
|         this.maxHealthSet = true; | ||||
|  | ||||
|         if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) { | ||||
|             PacketContainer packet = new PacketContainer(Server.UPDATE_ATTRIBUTES); | ||||
|  | ||||
|             List<WrappedAttribute> attributes = new ArrayList<>(); | ||||
|  | ||||
|             Builder builder; | ||||
|             builder = WrappedAttribute.newBuilder(); | ||||
|             builder.attributeKey("generic.maxHealth"); | ||||
|             builder.baseValue(getMaxHealth()); | ||||
|             builder.packet(packet); | ||||
|  | ||||
|             attributes.add(builder.build()); | ||||
|  | ||||
|             Entity entity = getDisguise().getEntity(); | ||||
|  | ||||
|             packet.getIntegers().write(0, entity.getEntityId()); | ||||
|             packet.getAttributeCollectionModifier().write(0, attributes); | ||||
|  | ||||
|             for (Player player : DisguiseUtilities.getPerverts(getDisguise())) { | ||||
|                 try { | ||||
|                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); | ||||
|                 } | ||||
|                 catch (InvocationTargetException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -2,6 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.entity.MushroomCow; | ||||
|  | ||||
| /** | ||||
| @@ -12,10 +14,12 @@ public class MushroomCowWatcher extends AgeableWatcher { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public MushroomCow.Variant getVariant() { | ||||
|         return MushroomCow.Variant.valueOf(getData(MetaIndex.MUSHROOM_COW_TYPE).toUpperCase()); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setVariant(MushroomCow.Variant variant) { | ||||
|         setData(MetaIndex.MUSHROOM_COW_TYPE, variant.name().toLowerCase()); | ||||
|         sendData(MetaIndex.MUSHROOM_COW_TYPE); | ||||
|   | ||||
| @@ -1,10 +1,11 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import org.bukkit.entity.Ocelot; | ||||
| import org.bukkit.entity.Ocelot.Type; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.entity.Ocelot; | ||||
|  | ||||
| public class OcelotWatcher extends AgeableWatcher { | ||||
|  | ||||
| @@ -12,12 +13,27 @@ public class OcelotWatcher extends AgeableWatcher { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public boolean isTrusting() { | ||||
|         return getData(MetaIndex.OCELOT_TRUST); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setTrusting(boolean trusting) { | ||||
|         setData(MetaIndex.OCELOT_TRUST, trusting); | ||||
|         sendData(MetaIndex.OCELOT_TRUST); | ||||
|     } | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     @Deprecated | ||||
|     public Ocelot.Type getType() { | ||||
|         return Ocelot.Type.getType(getData(MetaIndex.OCELOT_TYPE)); | ||||
|     } | ||||
|  | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     @Deprecated | ||||
|     public void setType(Ocelot.Type newType) { | ||||
|         setData(MetaIndex.OCELOT_TYPE, newType.getId()); | ||||
|         sendData(MetaIndex.OCELOT_TYPE); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.entity.Panda; | ||||
|  | ||||
| import java.util.Random; | ||||
| @@ -10,6 +12,7 @@ import java.util.Random; | ||||
| /** | ||||
|  * Created by libraryaddict on 6/05/2019. | ||||
|  */ | ||||
| @NmsAddedIn(val = NmsVersion.v1_14) | ||||
| public class PandaWatcher extends AgeableWatcher { | ||||
|     public PandaWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
| @@ -32,6 +35,12 @@ public class PandaWatcher extends AgeableWatcher { | ||||
|         return Panda.Gene.NORMAL; | ||||
|     } | ||||
|  | ||||
|     @RandomDefaultValue | ||||
|     public void setMainGene(Panda.Gene gene) { | ||||
|         setData(MetaIndex.PANDA_MAIN_GENE, (byte) gene.ordinal()); | ||||
|         sendData(MetaIndex.PANDA_MAIN_GENE); | ||||
|     } | ||||
|  | ||||
|     public Panda.Gene getHiddenGene() { | ||||
|         int id = getData(MetaIndex.PANDA_HIDDEN_GENE); | ||||
|  | ||||
| @@ -46,59 +55,53 @@ public class PandaWatcher extends AgeableWatcher { | ||||
|         return Panda.Gene.NORMAL; | ||||
|     } | ||||
|  | ||||
|     @RandomDefaultValue | ||||
|     public void setMainGene(Panda.Gene gene) { | ||||
|         setData(MetaIndex.PANDA_MAIN_GENE, (byte) gene.ordinal()); | ||||
|         sendData(MetaIndex.PANDA_MAIN_GENE); | ||||
|     } | ||||
|  | ||||
|     @RandomDefaultValue | ||||
|     public void setHiddenGene(Panda.Gene gene) { | ||||
|         setData(MetaIndex.PANDA_HIDDEN_GENE, (byte) gene.ordinal()); | ||||
|         sendData(MetaIndex.PANDA_HIDDEN_GENE); | ||||
|     } | ||||
|  | ||||
|     public void setSneeze(boolean value) { | ||||
|         setPandaFlag(2, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isSneeze() { | ||||
|         return getPandaFlag(2); | ||||
|     } | ||||
|  | ||||
|     public void setTumble(boolean value) { | ||||
|         setPandaFlag(4, value); | ||||
|     public void setSneeze(boolean value) { | ||||
|         setPandaFlag(2, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isTumble() { | ||||
|         return getPandaFlag(4); | ||||
|     } | ||||
|  | ||||
|     public void setSitting(boolean value) { | ||||
|         setPandaFlag(8, value); | ||||
|     public void setTumble(boolean value) { | ||||
|         setPandaFlag(4, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isSitting() { | ||||
|         return getPandaFlag(8); | ||||
|     } | ||||
|  | ||||
|     public void setUpsideDown(boolean value) { | ||||
|         setPandaFlag(16, value); | ||||
|     public void setSitting(boolean value) { | ||||
|         setPandaFlag(8, value); | ||||
|     } | ||||
|  | ||||
|     public boolean isUpsideDown() { | ||||
|         return getPandaFlag(16); | ||||
|     } | ||||
|  | ||||
|     public void setHeadShaking(int timeInTicks) { | ||||
|         setData(MetaIndex.PANDA_HEAD_SHAKING, timeInTicks); | ||||
|         sendData(MetaIndex.PANDA_HEAD_SHAKING); | ||||
|     public void setUpsideDown(boolean value) { | ||||
|         setPandaFlag(16, value); | ||||
|     } | ||||
|  | ||||
|     public int getHeadShaking() { | ||||
|         return getHeadShakingTicks(); | ||||
|     } | ||||
|  | ||||
|     public void setHeadShaking(int timeInTicks) { | ||||
|         setData(MetaIndex.PANDA_HEAD_SHAKING, timeInTicks); | ||||
|         sendData(MetaIndex.PANDA_HEAD_SHAKING); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     public int getHeadShakingTicks() { | ||||
|         return getData(MetaIndex.PANDA_HEAD_SHAKING); | ||||
|   | ||||
| @@ -2,21 +2,24 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 6/05/2019. | ||||
|  */ | ||||
| @NmsAddedIn(val = NmsVersion.v1_14) | ||||
| public class PillagerWatcher extends IllagerWatcher { | ||||
|     public PillagerWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     public boolean isAimingBow() { | ||||
|         return getData(MetaIndex.PILLAGER_AIMING_BOW); | ||||
|     } | ||||
|  | ||||
|     public void setAimingBow(boolean value) { | ||||
|         setData(MetaIndex.PILLAGER_AIMING_BOW, value); | ||||
|         sendData(MetaIndex.PILLAGER_AIMING_BOW); | ||||
|     } | ||||
|  | ||||
|     public boolean isAimingBow() { | ||||
|         return getData(MetaIndex.PILLAGER_AIMING_BOW); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,10 +1,13 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 6/05/2019. | ||||
|  */ | ||||
| @NmsAddedIn(val = NmsVersion.v1_14) | ||||
| public class RavagerWatcher extends RaiderWatcher { | ||||
|     public RavagerWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|   | ||||
| @@ -2,6 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| /** | ||||
|  * @author Navid | ||||
| @@ -10,4 +12,17 @@ public class SkeletonWatcher extends InsentientWatcher { | ||||
|     public SkeletonWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public boolean isSwingArms() { | ||||
|         return getData(MetaIndex.SKELETON_SWING_ARMS); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public void setSwingArms(boolean swingingArms) { | ||||
|         setData(MetaIndex.SKELETON_SWING_ARMS, swingingArms); | ||||
|         sendData(MetaIndex.SKELETON_SWING_ARMS); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -4,6 +4,8 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
|  | ||||
| /** | ||||
| @@ -13,16 +15,20 @@ public abstract class ThrowableWatcher extends FlagWatcher { | ||||
|     public ThrowableWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|  | ||||
|         setItemStack(getDefaultItemStack()); | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             setItemStack(getDefaultItemStack()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected abstract ItemStack getDefaultItemStack(); | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public ItemStack getItemStack() { | ||||
|         return getData(MetaIndex.THROWABLE_ITEM); | ||||
|     } | ||||
|  | ||||
|     @RandomDefaultValue | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setItemStack(ItemStack item) { | ||||
|         setData(MetaIndex.THROWABLE_ITEM, item); | ||||
|         sendData(MetaIndex.THROWABLE_ITEM); | ||||
|   | ||||
| @@ -1,10 +1,13 @@ | ||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 6/05/2019. | ||||
|  */ | ||||
| @NmsAddedIn(val = NmsVersion.v1_14) | ||||
| public class TraderLlamaWatcher extends LlamaWatcher { | ||||
|     public TraderLlamaWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|   | ||||
| @@ -2,7 +2,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAdded; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| /** | ||||
| @@ -13,12 +13,12 @@ public class TridentWatcher extends ArrowWatcher { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     @NmsAdded(added = NmsVersion.v1_15) | ||||
|     @NmsAddedIn(val = NmsVersion.v1_15) | ||||
|     public boolean isEnchanted() { | ||||
|         return getData(MetaIndex.TRIDENT_ENCHANTED); | ||||
|     } | ||||
|  | ||||
|     @NmsAdded(added = NmsVersion.v1_15) | ||||
|     @NmsAddedIn(val = NmsVersion.v1_15) | ||||
|     public void setEnchanted(boolean enchanted) { | ||||
|         setData(MetaIndex.TRIDENT_ENCHANTED, enchanted); | ||||
|         sendData(MetaIndex.TRIDENT_ENCHANTED); | ||||
|   | ||||
| @@ -5,6 +5,8 @@ import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.disguisetypes.VillagerData; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.entity.Villager; | ||||
| import org.bukkit.entity.Villager.Profession; | ||||
|  | ||||
| @@ -16,46 +18,63 @@ public class VillagerWatcher extends AbstractVillagerWatcher { | ||||
|         setProfession(Profession.values()[DisguiseUtilities.random.nextInt(Profession.values().length)]); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public VillagerData getVillagerData() { | ||||
|         return getData(MetaIndex.VILLAGER_DATA); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setVillagerData(VillagerData villagerData) { | ||||
|         setData(MetaIndex.VILLAGER_DATA, villagerData); | ||||
|         sendData(MetaIndex.VILLAGER_DATA); | ||||
|     } | ||||
|  | ||||
|     public Profession getProfession() { | ||||
|         return getVillagerData().getProfession(); | ||||
|     } | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             return getVillagerData().getProfession(); | ||||
|         } | ||||
|  | ||||
|     @Deprecated | ||||
|     public Villager.Type getType() { | ||||
|         return getVillagerData().getType(); | ||||
|     } | ||||
|  | ||||
|     public Villager.Type getBiome() { | ||||
|         return getType(); | ||||
|     } | ||||
|  | ||||
|     public void setBiome(Villager.Type type) { | ||||
|         setType(type); | ||||
|     } | ||||
|  | ||||
|     public int getLevel() { | ||||
|         return getVillagerData().getLevel(); | ||||
|         return Profession.values()[getData(MetaIndex.VILLAGER_PROFESSION) + 1]; | ||||
|     } | ||||
|  | ||||
|     @RandomDefaultValue | ||||
|     public void setProfession(Profession profession) { | ||||
|         setVillagerData(new VillagerData(getType(), profession, getLevel())); | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             setVillagerData(new VillagerData(getType(), profession, getLevel())); | ||||
|         } else { | ||||
|             setData(MetaIndex.VILLAGER_PROFESSION, profession.ordinal() - 1); | ||||
|             sendData(MetaIndex.VILLAGER_PROFESSION); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public Villager.Type getType() { | ||||
|         return getVillagerData().getType(); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setType(Villager.Type type) { | ||||
|         setVillagerData(new VillagerData(type, getProfession(), getLevel())); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public Villager.Type getBiome() { | ||||
|         return getType(); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setBiome(Villager.Type type) { | ||||
|         setType(type); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public int getLevel() { | ||||
|         return getVillagerData().getLevel(); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setLevel(int level) { | ||||
|         setVillagerData(new VillagerData(getType(), getProfession(), getLevel())); | ||||
|     } | ||||
|   | ||||
| @@ -2,10 +2,25 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| public class VindicatorWatcher extends IllagerWatcher { | ||||
|  | ||||
|     public VindicatorWatcher(Disguise disguise) { | ||||
|         super(disguise); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public boolean isJohnny() { | ||||
|         return getData(MetaIndex.ILLAGER_META) == 1; | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public void setJohnny(boolean isJohnny) { | ||||
|         setData(MetaIndex.ILLAGER_META, (byte) (isJohnny ? 1 : 0)); | ||||
|         sendData(MetaIndex.ILLAGER_META); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -3,7 +3,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
| import me.libraryaddict.disguise.disguisetypes.AnimalColor; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemoved; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.DyeColor; | ||||
|  | ||||
| @@ -57,7 +57,8 @@ public class WolfWatcher extends TameableWatcher { | ||||
|      * | ||||
|      * @return | ||||
|      */ | ||||
|     @NmsRemoved(removed = NmsVersion.v1_15) | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_15) | ||||
|     @Deprecated | ||||
|     public float getDamageTaken() { | ||||
|         return getData(MetaIndex.WOLF_DAMAGE); | ||||
|     } | ||||
| @@ -67,7 +68,8 @@ public class WolfWatcher extends TameableWatcher { | ||||
|      * | ||||
|      * @param damage | ||||
|      */ | ||||
|     @NmsRemoved(removed = NmsVersion.v1_15) | ||||
|     @Deprecated | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_15) | ||||
|     public void setDamageTaken(float damage) { | ||||
|         setData(MetaIndex.WOLF_DAMAGE, damage); | ||||
|         sendData(MetaIndex.WOLF_DAMAGE); | ||||
|   | ||||
| @@ -4,6 +4,8 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.disguisetypes.VillagerData; | ||||
| import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsAddedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.bukkit.entity.Villager; | ||||
| import org.bukkit.entity.Villager.Profession; | ||||
|  | ||||
| @@ -21,24 +23,30 @@ public class ZombieVillagerWatcher extends ZombieWatcher { | ||||
|         return getData(MetaIndex.ZOMBIE_VILLAGER_SHAKING); | ||||
|     } | ||||
|  | ||||
|     public void setShaking(boolean shaking) { | ||||
|         setData(MetaIndex.ZOMBIE_VILLAGER_SHAKING, shaking); | ||||
|         sendData(MetaIndex.ZOMBIE_VILLAGER_SHAKING); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Is this zombie a villager? | ||||
|      * | ||||
|      * @return | ||||
|      */ | ||||
|     public boolean isVillager() { | ||||
|         return getData(MetaIndex.ZOMBIE_VILLAGER_PROFESSION).getProfession() != Profession.NONE; | ||||
|     } | ||||
|  | ||||
|     public void setShaking(boolean shaking) { | ||||
|         setData(MetaIndex.ZOMBIE_VILLAGER_SHAKING, shaking); | ||||
|         sendData(MetaIndex.ZOMBIE_VILLAGER_SHAKING); | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             return getData(MetaIndex.ZOMBIE_VILLAGER_PROFESSION).getProfession() != Profession.NONE; | ||||
|         } else { | ||||
|             return getData(MetaIndex.ZOMBIE_VILLAGER_PROFESSION_OLD) != 0; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public VillagerData getVillagerData() { | ||||
|         return getData(MetaIndex.ZOMBIE_VILLAGER_PROFESSION); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setVillagerData(VillagerData villagerData) { | ||||
|         setData(MetaIndex.ZOMBIE_VILLAGER_PROFESSION, villagerData); | ||||
|         sendData(MetaIndex.ZOMBIE_VILLAGER_PROFESSION); | ||||
| @@ -48,33 +56,44 @@ public class ZombieVillagerWatcher extends ZombieWatcher { | ||||
|         return getVillagerData().getProfession(); | ||||
|     } | ||||
|  | ||||
|     @RandomDefaultValue | ||||
|     public void setProfession(Profession profession) { | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             setVillagerData(new VillagerData(getType(), profession, getLevel())); | ||||
|         } else { | ||||
|             setData(MetaIndex.ZOMBIE_VILLAGER_PROFESSION_OLD, profession.ordinal() - 1); | ||||
|             sendData(MetaIndex.ZOMBIE_VILLAGER_PROFESSION_OLD); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public Villager.Type getType() { | ||||
|         return getVillagerData().getType(); | ||||
|     } | ||||
|  | ||||
|     public int getLevel() { | ||||
|         return getVillagerData().getLevel(); | ||||
|     } | ||||
|  | ||||
|     @RandomDefaultValue | ||||
|     public void setProfession(Profession profession) { | ||||
|         setVillagerData(new VillagerData(getType(), profession, getLevel())); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setType(Villager.Type type) { | ||||
|         setVillagerData(new VillagerData(type, getProfession(), getLevel())); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public int getLevel() { | ||||
|         return getVillagerData().getLevel(); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setLevel(int level) { | ||||
|         setVillagerData(new VillagerData(getType(), getProfession(), getLevel())); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public Villager.Type getBiome() { | ||||
|         return getType(); | ||||
|     } | ||||
|  | ||||
|     @NmsAddedIn(val = NmsVersion.v1_14) | ||||
|     public void setBiome(Villager.Type type) { | ||||
|         setType(type); | ||||
|     } | ||||
|   | ||||
| @@ -2,6 +2,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.disguisetypes.MetaIndex; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
|  | ||||
| public class ZombieWatcher extends InsentientWatcher { | ||||
|  | ||||
| @@ -17,6 +19,11 @@ public class ZombieWatcher extends InsentientWatcher { | ||||
|         return getData(MetaIndex.ZOMBIE_BABY); | ||||
|     } | ||||
|  | ||||
|     public void setBaby(boolean baby) { | ||||
|         setData(MetaIndex.ZOMBIE_BABY, baby); | ||||
|         sendData(MetaIndex.ZOMBIE_BABY); | ||||
|     } | ||||
|  | ||||
|     public void setAdult() { | ||||
|         setBaby(false); | ||||
|     } | ||||
| @@ -25,11 +32,6 @@ public class ZombieWatcher extends InsentientWatcher { | ||||
|         setBaby(true); | ||||
|     } | ||||
|  | ||||
|     public void setBaby(boolean baby) { | ||||
|         setData(MetaIndex.ZOMBIE_BABY, baby); | ||||
|         sendData(MetaIndex.ZOMBIE_BABY); | ||||
|     } | ||||
|  | ||||
|     public boolean isConverting() { | ||||
|         return getData(MetaIndex.ZOMBIE_CONVERTING_DROWNED); | ||||
|     } | ||||
| @@ -38,4 +40,17 @@ public class ZombieWatcher extends InsentientWatcher { | ||||
|         setData(MetaIndex.ZOMBIE_CONVERTING_DROWNED, converting); | ||||
|         sendData(MetaIndex.ZOMBIE_CONVERTING_DROWNED); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public boolean isAggressive() { | ||||
|         return (boolean) getData(MetaIndex.ZOMBIE_AGGRESSIVE); | ||||
|     } | ||||
|  | ||||
|     @Deprecated | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     public void setAggressive(boolean handsup) { | ||||
|         setData(MetaIndex.ZOMBIE_AGGRESSIVE, handsup); | ||||
|         sendData(MetaIndex.ZOMBIE_AGGRESSIVE); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -22,14 +22,10 @@ import me.libraryaddict.disguise.utilities.json.*; | ||||
| import me.libraryaddict.disguise.utilities.mineskin.MineSkinAPI; | ||||
| import me.libraryaddict.disguise.utilities.packets.LibsPackets; | ||||
| import me.libraryaddict.disguise.utilities.packets.PacketsManager; | ||||
| import me.libraryaddict.disguise.utilities.reflection.DisguiseValues; | ||||
| import me.libraryaddict.disguise.utilities.reflection.FakeBoundingBox; | ||||
| import me.libraryaddict.disguise.utilities.reflection.LibsProfileLookup; | ||||
| import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||
| import me.libraryaddict.disguise.utilities.reflection.*; | ||||
| import me.libraryaddict.disguise.utilities.translations.LibsMsg; | ||||
| import org.apache.logging.log4j.util.Strings; | ||||
| import org.bukkit.*; | ||||
| import org.bukkit.craftbukkit.libs.org.apache.commons.io.FileUtils; | ||||
| import org.bukkit.entity.*; | ||||
| import org.bukkit.inventory.EquipmentSlot; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| @@ -41,17 +37,16 @@ import org.bukkit.scoreboard.Team.Option; | ||||
| import org.bukkit.scoreboard.Team.OptionStatus; | ||||
| import org.bukkit.util.Vector; | ||||
|  | ||||
| import java.io.BufferedReader; | ||||
| import java.io.File; | ||||
| import java.io.FileReader; | ||||
| import java.io.PrintWriter; | ||||
| import java.io.*; | ||||
| import java.lang.reflect.*; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.*; | ||||
| import java.util.concurrent.ConcurrentHashMap; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.logging.Logger; | ||||
| import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| public class DisguiseUtilities { | ||||
|     public static class ExtendedName { | ||||
| @@ -111,7 +106,6 @@ public class DisguiseUtilities { | ||||
|     private static final HashMap<String, ArrayList<Object>> runnables = new HashMap<>(); | ||||
|     @Getter | ||||
|     private static HashSet<UUID> selfDisguised = new HashSet<>(); | ||||
|     private static Thread mainThread; | ||||
|     private static HashMap<UUID, String> preDisguiseTeam = new HashMap<>(); | ||||
|     private static HashMap<UUID, String> disguiseTeam = new HashMap<>(); | ||||
|     private static File profileCache = new File("plugins/LibsDisguises/GameProfiles"), savedDisguises = new File( | ||||
| @@ -321,7 +315,13 @@ public class DisguiseUtilities { | ||||
|         } | ||||
|  | ||||
|         try { | ||||
|             String cached = FileUtils.readFileToString(disguiseFile, "UTF-8"); | ||||
|             String cached = null; | ||||
|  | ||||
|             try (FileInputStream input = new FileInputStream( | ||||
|                     disguiseFile); InputStreamReader inputReader = new InputStreamReader(input, | ||||
|                     StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(inputReader)) { | ||||
|                 cached = reader.lines().collect(Collectors.joining("\n")); | ||||
|             } | ||||
|  | ||||
|             if (remove) { | ||||
|                 removeSavedDisguise(entityUUID); | ||||
| @@ -515,7 +515,7 @@ public class DisguiseUtilities { | ||||
|      * Sends entity removal packets, as this disguise was removed | ||||
|      */ | ||||
|     public static void destroyEntity(TargetedDisguise disguise) { | ||||
|         if (mainThread != Thread.currentThread()) | ||||
|         if (!Bukkit.isPrimaryThread()) | ||||
|             throw new IllegalStateException("Cannot modify disguises on an async thread"); | ||||
|  | ||||
|         try { | ||||
| @@ -696,7 +696,7 @@ public class DisguiseUtilities { | ||||
|      * @return | ||||
|      */ | ||||
|     public static List<Player> getPerverts(Disguise disguise) { | ||||
|         if (mainThread != Thread.currentThread()) | ||||
|         if (!Bukkit.isPrimaryThread()) | ||||
|             throw new IllegalStateException("Cannot modify disguises on an async thread"); | ||||
|  | ||||
|         if (disguise.getEntity() == null) | ||||
| @@ -895,16 +895,6 @@ public class DisguiseUtilities { | ||||
|  | ||||
|         gson = gsonBuilder.create(); | ||||
|  | ||||
|         try { | ||||
|             Field threadField = ReflectionManager.getNmsField("MinecraftServer", "serverThread"); | ||||
|             threadField.setAccessible(true); | ||||
|  | ||||
|             mainThread = (Thread) threadField.get(ReflectionManager.getMinecraftServer()); | ||||
|         } | ||||
|         catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|  | ||||
|         if (!profileCache.exists()) | ||||
|             profileCache.mkdirs(); | ||||
|  | ||||
| @@ -953,7 +943,7 @@ public class DisguiseUtilities { | ||||
|      * Resends the entity to this specific player | ||||
|      */ | ||||
|     public static void refreshTracker(final TargetedDisguise disguise, String player) { | ||||
|         if (mainThread != Thread.currentThread()) | ||||
|         if (!Bukkit.isPrimaryThread()) | ||||
|             throw new IllegalStateException("Cannot modify disguises on an async thread"); | ||||
|  | ||||
|         if (disguise.getEntity() == null || !disguise.getEntity().isValid()) | ||||
| @@ -990,10 +980,12 @@ public class DisguiseUtilities { | ||||
|                         .get(entityTrackerEntry); | ||||
|  | ||||
|                 Method clear = ReflectionManager | ||||
|                         .getNmsMethod("EntityTrackerEntry", "a", ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                         .getNmsMethod("EntityTrackerEntry", NmsVersion.v1_14.isSupported() ? "a" : "clear", | ||||
|                                 ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|  | ||||
|                 final Method updatePlayer = ReflectionManager | ||||
|                         .getNmsMethod("EntityTrackerEntry", "b", ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                         .getNmsMethod("EntityTrackerEntry", NmsVersion.v1_14.isSupported() ? "b" : "updatePlayer", | ||||
|                                 ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|  | ||||
|                 trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent | ||||
|                 // ConcurrentModificationException | ||||
| @@ -1030,7 +1022,7 @@ public class DisguiseUtilities { | ||||
|      * A convenience method for me to refresh trackers in other plugins | ||||
|      */ | ||||
|     public static void refreshTrackers(Entity entity) { | ||||
|         if (mainThread != Thread.currentThread()) | ||||
|         if (!Bukkit.isPrimaryThread()) | ||||
|             throw new IllegalStateException("Cannot modify disguises on an async thread"); | ||||
|  | ||||
|         if (entity.isValid()) { | ||||
| @@ -1044,10 +1036,12 @@ public class DisguiseUtilities { | ||||
|                             .get(entityTrackerEntry); | ||||
|  | ||||
|                     Method clear = ReflectionManager | ||||
|                             .getNmsMethod("EntityTrackerEntry", "a", ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                             .getNmsMethod("EntityTrackerEntry", NmsVersion.v1_14.isSupported() ? "a" : "clear", | ||||
|                                     ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|  | ||||
|                     final Method updatePlayer = ReflectionManager | ||||
|                             .getNmsMethod("EntityTrackerEntry", "b", ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                             .getNmsMethod("EntityTrackerEntry", NmsVersion.v1_14.isSupported() ? "b" : "updatePlayer", | ||||
|                                     ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|  | ||||
|                     trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent | ||||
|                     // ConcurrentModificationException | ||||
| @@ -1081,7 +1075,7 @@ public class DisguiseUtilities { | ||||
|      * Resends the entity to all the watching players, which is where the magic begins | ||||
|      */ | ||||
|     public static void refreshTrackers(final TargetedDisguise disguise) { | ||||
|         if (mainThread != Thread.currentThread()) | ||||
|         if (!Bukkit.isPrimaryThread()) | ||||
|             throw new IllegalStateException("Cannot modify disguises on an async thread"); | ||||
|  | ||||
|         if (!disguise.getEntity().isValid()) { | ||||
| @@ -1115,10 +1109,12 @@ public class DisguiseUtilities { | ||||
|                         .get(entityTrackerEntry); | ||||
|  | ||||
|                 final Method clear = ReflectionManager | ||||
|                         .getNmsMethod("EntityTrackerEntry", "a", ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                         .getNmsMethod("EntityTrackerEntry", NmsVersion.v1_14.isSupported() ? "a" : "clear", | ||||
|                                 ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|  | ||||
|                 final Method updatePlayer = ReflectionManager | ||||
|                         .getNmsMethod("EntityTrackerEntry", "b", ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|                         .getNmsMethod("EntityTrackerEntry", NmsVersion.v1_14.isSupported() ? "b" : "updatePlayer", | ||||
|                                 ReflectionManager.getNmsClass("EntityPlayer")); | ||||
|  | ||||
|                 trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); | ||||
|                 PacketContainer destroyPacket = getDestroyPacket(disguise.getEntity().getEntityId()); | ||||
| @@ -1179,7 +1175,7 @@ public class DisguiseUtilities { | ||||
|     } | ||||
|  | ||||
|     public static void removeSelfDisguise(Player player) { | ||||
|         if (mainThread != Thread.currentThread()) | ||||
|         if (!Bukkit.isPrimaryThread()) | ||||
|             throw new IllegalStateException("Cannot modify disguises on an async thread"); | ||||
|  | ||||
|         if (!selfDisguised.contains(player.getUniqueId())) { | ||||
| @@ -1700,7 +1696,7 @@ public class DisguiseUtilities { | ||||
|      * Sends the self disguise to the player | ||||
|      */ | ||||
|     public static void sendSelfDisguise(final Player player, final TargetedDisguise disguise) { | ||||
|         if (mainThread != Thread.currentThread()) | ||||
|         if (!Bukkit.isPrimaryThread()) | ||||
|             throw new IllegalStateException("Cannot modify disguises on an async thread"); | ||||
|  | ||||
|         try { | ||||
| @@ -1755,7 +1751,8 @@ public class DisguiseUtilities { | ||||
|             boolean isMoving = false; | ||||
|  | ||||
|             try { | ||||
|                 Field field = ReflectionManager.getNmsClass("EntityTrackerEntry").getDeclaredField("q"); | ||||
|                 Field field = ReflectionManager.getNmsClass("EntityTrackerEntry") | ||||
|                         .getDeclaredField(NmsVersion.v1_14.isSupported() ? "q" : "isMoving"); | ||||
|                 field.setAccessible(true); | ||||
|                 isMoving = field.getBoolean(entityTrackerEntry); | ||||
|             } | ||||
| @@ -1816,14 +1813,6 @@ public class DisguiseUtilities { | ||||
|  | ||||
|             Location loc = player.getLocation(); | ||||
|  | ||||
|             // If the disguised is sleeping for w/e reason | ||||
|             if (player.isSleeping()) { | ||||
|             /*    sendSelfPacket(player, | ||||
|                         manager.createPacketConstructor(Server.BED, player, ReflectionManager.getBlockPosition(0, 0, 0)) | ||||
|                                 .createPacket(player, ReflectionManager | ||||
|                                         .getBlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())));*/ | ||||
|             } | ||||
|  | ||||
|             // Resend any active potion effects | ||||
|             for (PotionEffect potionEffect : player.getActivePotionEffects()) { | ||||
|                 Object mobEffect = ReflectionManager.createMobEffect(potionEffect); | ||||
|   | ||||
| @@ -5,14 +5,12 @@ import me.libraryaddict.disguise.utilities.plugin.PluginInformation; | ||||
| import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||
| import org.bukkit.configuration.InvalidConfigurationException; | ||||
| import org.bukkit.configuration.file.YamlConfiguration; | ||||
| import org.bukkit.craftbukkit.libs.org.apache.commons.io.IOUtils; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.io.*; | ||||
| import java.net.URL; | ||||
| import java.net.URLClassLoader; | ||||
| import java.util.Date; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 2/06/2017. | ||||
| @@ -265,7 +263,11 @@ public class LibsPremium { | ||||
|             YamlConfiguration config = new YamlConfiguration(); | ||||
|  | ||||
|             try { | ||||
|                 config.loadFromString(IOUtils.toString(LibsDisguises.getInstance().getResource("plugin.yml"), "UTF-8")); | ||||
|                 try (InputStream stream = LibsDisguises.getInstance().getResource("plugin.yml")) { | ||||
|                     config.loadFromString( | ||||
|                             new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)).lines() | ||||
|                                     .collect(Collectors.joining("\n"))); | ||||
|                 } | ||||
|  | ||||
|                 // If plugin.yml contains a build-date | ||||
|                 if (config.contains("build-date")) { | ||||
|   | ||||
| @@ -2,15 +2,16 @@ package me.libraryaddict.disguise.utilities; | ||||
|  | ||||
| import com.google.gson.Gson; | ||||
| import lombok.Getter; | ||||
| import org.bukkit.craftbukkit.libs.org.apache.commons.io.IOUtils; | ||||
|  | ||||
| import java.io.BufferedReader; | ||||
| import java.io.InputStream; | ||||
| import java.io.OutputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.net.HttpURLConnection; | ||||
| import java.net.URL; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.Date; | ||||
| import java.util.Map; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| public class UpdateChecker { | ||||
|     private final String resourceID; | ||||
| @@ -75,7 +76,8 @@ public class UpdateChecker { | ||||
|             // Get the input stream, what we receive | ||||
|             try (InputStream input = con.getInputStream()) { | ||||
|                 // Read it to string | ||||
|                 String version = IOUtils.toString(input); | ||||
|                 String version = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) | ||||
|                         .lines().collect(Collectors.joining("\n")); | ||||
|  | ||||
|                 // If the version is not empty, return it | ||||
|                 if (!version.isEmpty()) { | ||||
| @@ -149,7 +151,8 @@ public class UpdateChecker { | ||||
|             // Get the input stream, what we receive | ||||
|             try (InputStream input = con.getInputStream()) { | ||||
|                 // Read it to string | ||||
|                 String json = IOUtils.toString(input); | ||||
|                 String json = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) | ||||
|                         .lines().collect(Collectors.joining("\n")); | ||||
|  | ||||
|                 jsonObject = new Gson().fromJson(json, Map.class); | ||||
|             } | ||||
|   | ||||
| @@ -3,18 +3,18 @@ package me.libraryaddict.disguise.utilities.mineskin; | ||||
| import com.google.gson.Gson; | ||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||
| import me.libraryaddict.disguise.utilities.SkinUtils; | ||||
| import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; | ||||
| import me.libraryaddict.disguise.utilities.translations.LibsMsg; | ||||
| import org.bukkit.craftbukkit.libs.org.apache.commons.io.IOUtils; | ||||
|  | ||||
| import java.io.*; | ||||
| import java.net.HttpURLConnection; | ||||
| import java.net.SocketTimeoutException; | ||||
| import java.net.URL; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.nio.file.Files; | ||||
| import java.util.UUID; | ||||
| import java.util.concurrent.TimeUnit; | ||||
| import java.util.concurrent.locks.ReentrantLock; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 28/12/2019. | ||||
| @@ -107,7 +107,8 @@ public class MineSkinAPI { | ||||
|             } | ||||
|  | ||||
|             if (connection.getResponseCode() == 500) { | ||||
|                 APIError error = new Gson().fromJson(IOUtils.toString(connection.getErrorStream()), APIError.class); | ||||
|                 APIError error = new Gson().fromJson(new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8)) | ||||
|                         .lines().collect(Collectors.joining("\n")), APIError.class); | ||||
|  | ||||
|                 if (error.code == 403) { | ||||
|                     callback.onError(LibsMsg.SKIN_API_FAIL_CODE, "" + error.code, LibsMsg.SKIN_API_403.get()); | ||||
| @@ -136,7 +137,8 @@ public class MineSkinAPI { | ||||
|             // Get the input stream, what we receive | ||||
|             try (InputStream input = connection.getInputStream()) { | ||||
|                 // Read it to string | ||||
|                 String response = IOUtils.toString(input); | ||||
|                 String response = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) | ||||
|                         .lines().collect(Collectors.joining("\n")); | ||||
|  | ||||
|                 MineSkinResponse skinResponse = new Gson().fromJson(response, MineSkinResponse.class); | ||||
|  | ||||
| @@ -188,7 +190,8 @@ public class MineSkinAPI { | ||||
|             // Get the input stream, what we receive | ||||
|             try (InputStream input = con.getInputStream()) { | ||||
|                 // Read it to string | ||||
|                 String response = IOUtils.toString(input); | ||||
|                 String response = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8)) | ||||
|                         .lines().collect(Collectors.joining("\n")); | ||||
|  | ||||
|                 MineSkinResponse skinResponse = new Gson().fromJson(response, MineSkinResponse.class); | ||||
|  | ||||
|   | ||||
| @@ -29,7 +29,6 @@ public class PacketsHandler { | ||||
|  | ||||
|         packetHandlers.add(new PacketHandlerAnimation()); | ||||
|         packetHandlers.add(new PacketHandlerAttributes()); | ||||
|         packetHandlers.add(new PacketHandlerBed()); | ||||
|         packetHandlers.add(new PacketHandlerCollect()); | ||||
|         packetHandlers.add(new PacketHandlerEntityStatus()); | ||||
|         packetHandlers.add(new PacketHandlerEquipment(this)); | ||||
|   | ||||
| @@ -1,28 +0,0 @@ | ||||
| package me.libraryaddict.disguise.utilities.packets.packethandlers; | ||||
|  | ||||
| import com.comphenix.protocol.PacketType; | ||||
| import com.comphenix.protocol.events.PacketContainer; | ||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||
| import me.libraryaddict.disguise.utilities.packets.IPacketHandler; | ||||
| import me.libraryaddict.disguise.utilities.packets.LibsPackets; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Player; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 3/01/2019. | ||||
|  */ | ||||
| public class PacketHandlerBed implements IPacketHandler { | ||||
|     @Override | ||||
|     public PacketType[] getHandledPackets() { | ||||
|         return new PacketType[]{}; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, | ||||
|             Entity entity) { | ||||
|         // If the entity is going into a bed, stop everything but players from doing this | ||||
|         if (!disguise.getType().isPlayer()) { | ||||
|             packets.clear(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -225,7 +225,7 @@ public class PacketHandlerSpawn implements IPacketHandler { | ||||
|  | ||||
|             packets.addPacket(spawnPlayer); | ||||
|  | ||||
|             if (ReflectionManager.isSupported(NmsVersion.v1_15)) { | ||||
|             if (NmsVersion.v1_15.isSupported()) { | ||||
|                 PacketContainer metaPacket = ProtocolLibrary.getProtocolManager() | ||||
|                         .createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, entityId, newWatcher, true) | ||||
|                         .createPacket(entityId, newWatcher, true); | ||||
| @@ -314,7 +314,7 @@ public class PacketHandlerSpawn implements IPacketHandler { | ||||
|                     .createSanitizedDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), | ||||
|                             disguise.getWatcher()); | ||||
|  | ||||
|             if (ReflectionManager.isSupported(NmsVersion.v1_15)) { | ||||
|             if (NmsVersion.v1_15.isSupported()) { | ||||
|                 PacketContainer metaPacket = ProtocolLibrary.getProtocolManager() | ||||
|                         .createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, disguisedEntity.getEntityId(), | ||||
|                                 newWatcher, true).createPacket(disguisedEntity.getEntityId(), newWatcher, true); | ||||
| @@ -348,14 +348,26 @@ public class PacketHandlerSpawn implements IPacketHandler { | ||||
|                 data = ((((int) loc.getYaw() % 360) + 720 + 45) / 90) % 4; | ||||
|             } | ||||
|  | ||||
|             Object entityType = ReflectionManager.getEntityType(disguise.getType().getEntityType()); | ||||
|             PacketContainer spawnEntity; | ||||
|  | ||||
|             Object[] params = new Object[]{disguisedEntity.getEntityId(), disguisedEntity.getUniqueId(), x, y, z, | ||||
|                     loc.getPitch(), loc.getYaw(), entityType, data, | ||||
|                     ReflectionManager.getVec3D(disguisedEntity.getVelocity())}; | ||||
|             if (NmsVersion.v1_14.isSupported()) { | ||||
|                 Object entityType = ReflectionManager.getEntityType(disguise.getType().getEntityType()); | ||||
|  | ||||
|                 Object[] params = new Object[]{disguisedEntity.getEntityId(), disguisedEntity.getUniqueId(), x, y, z, | ||||
|                         loc.getPitch(), loc.getYaw(), entityType, data, | ||||
|                         ReflectionManager.getVec3D(disguisedEntity.getVelocity())}; | ||||
|  | ||||
|                 spawnEntity = ProtocolLibrary.getProtocolManager() | ||||
|                         .createPacketConstructor(PacketType.Play.Server.SPAWN_ENTITY, params).createPacket(params); | ||||
|             } else { | ||||
|                 int objectId = disguise.getType().getObjectId(); | ||||
|                 Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity); | ||||
|  | ||||
|                 spawnEntity = ProtocolLibrary.getProtocolManager() | ||||
|                         .createPacketConstructor(PacketType.Play.Server.SPAWN_ENTITY, nmsEntity, objectId, data) | ||||
|                         .createPacket(nmsEntity, objectId, data); | ||||
|             } | ||||
|  | ||||
|             PacketContainer spawnEntity = ProtocolLibrary.getProtocolManager() | ||||
|                     .createPacketConstructor(PacketType.Play.Server.SPAWN_ENTITY, params).createPacket(params); | ||||
|             packets.addPacket(spawnEntity); | ||||
|  | ||||
|             // If it's not the same type, then highly likely they have different velocity settings which we'd want to | ||||
|   | ||||
| @@ -78,26 +78,18 @@ public class DisguiseParser { | ||||
|                         getName = "get" + getName; | ||||
|                     } | ||||
|  | ||||
|                     Method getMethod = null; | ||||
|  | ||||
|                     for (Method m : setMethod.getDeclaringClass().getDeclaredMethods()) { | ||||
|                         if (!m.getName().equals(getName)) { | ||||
|                             continue; | ||||
|                         } | ||||
|  | ||||
|                         if (m.getParameterTypes().length > 0 || m.getReturnType() != setMethod.getParameterTypes()[0]) { | ||||
|                             continue; | ||||
|                         } | ||||
|  | ||||
|                         getMethod = m; | ||||
|                         break; | ||||
|                     } | ||||
|                     Method getMethod = setMethod.getDeclaringClass().getMethod(getName); | ||||
|  | ||||
|                     if (getMethod == null) { | ||||
|                         DisguiseUtilities.getLogger().severe(String | ||||
|                                 .format("No such method '%s' when looking for the companion of '%s' in '%s'", getName, | ||||
|                                         setMethod.getName(), setMethod.getDeclaringClass().getSimpleName())); | ||||
|                         continue; | ||||
|                     }else if (getMethod.getReturnType() != setMethod.getParameterTypes()[0]){ | ||||
|                         DisguiseUtilities.getLogger().severe(String | ||||
|                                 .format("Invalid return type of '%s' when looking for the companion of '%s' in '%s'", getName, | ||||
|                                         setMethod.getName(), setMethod.getDeclaringClass().getSimpleName())); | ||||
|                         continue; | ||||
|                     } | ||||
|  | ||||
|                     Object defaultValue = null; | ||||
|   | ||||
| @@ -9,6 +9,8 @@ import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; | ||||
| import me.libraryaddict.disguise.utilities.parser.DisguisePerm; | ||||
| import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; | ||||
| import me.libraryaddict.disguise.utilities.parser.params.ParamInfoTypes; | ||||
| import me.libraryaddict.disguise.utilities.reflection.DisguiseMethods; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsRemovedIn; | ||||
| import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||
| import org.bukkit.ChatColor; | ||||
|  | ||||
| @@ -21,6 +23,7 @@ import java.util.List; | ||||
|  | ||||
| public class ParamInfoManager { | ||||
|     private static List<ParamInfo> paramList; | ||||
|     private static DisguiseMethods disguiseMethods; | ||||
|  | ||||
|     public static List<ParamInfo> getParamInfos() { | ||||
|         return paramList; | ||||
| @@ -61,12 +64,6 @@ public class ParamInfoManager { | ||||
|             if (!method.getName().toLowerCase().equals(methodName.toLowerCase())) | ||||
|                 continue; | ||||
|  | ||||
|             if (method.getParameterTypes().length != 1) | ||||
|                 continue; | ||||
|  | ||||
|             if (method.getAnnotation(Deprecated.class) != null) | ||||
|                 continue; | ||||
|  | ||||
|             return getParamInfo(method.getParameterTypes()[0]); | ||||
|         } | ||||
|  | ||||
| @@ -75,6 +72,7 @@ public class ParamInfoManager { | ||||
|  | ||||
|     static { | ||||
|         paramList = new ParamInfoTypes().getParamInfos(); | ||||
|         disguiseMethods = new DisguiseMethods(); | ||||
|  | ||||
|         //paramList.sort((o1, o2) -> String.CASE_INSENSITIVE_ORDER.compare(o1.getName(), o2.getName())); | ||||
|     } | ||||
| @@ -84,7 +82,7 @@ public class ParamInfoManager { | ||||
|             return new Method[0]; | ||||
|         } | ||||
|  | ||||
|         ArrayList<Method> methods = new ArrayList<>(Arrays.asList(watcherClass.getMethods())); | ||||
|         ArrayList<Method> methods = new ArrayList<>(disguiseMethods.getMethods(watcherClass)); | ||||
|  | ||||
|         Iterator<Method> itel = methods.iterator(); | ||||
|  | ||||
| @@ -93,20 +91,8 @@ public class ParamInfoManager { | ||||
|  | ||||
|             if (!ReflectionManager.isSupported(method)) { | ||||
|                 itel.remove(); | ||||
|             } else if (method.getParameterTypes().length != 1) { | ||||
|                 itel.remove(); | ||||
|             } else if (method.getName().startsWith("get")) { | ||||
|                 itel.remove(); | ||||
|             } else if (method.isAnnotationPresent(Deprecated.class)) { | ||||
|                 itel.remove(); | ||||
|             } else if (getParamInfo(method.getParameterTypes()[0]) == null) { | ||||
|                 itel.remove(); | ||||
|             } else if (!method.getReturnType().equals(Void.TYPE)) { | ||||
|                 itel.remove(); | ||||
|             } else if (method.getName().equals("removePotionEffect")) { | ||||
|                 itel.remove(); | ||||
|             } else if (!FlagWatcher.class.isAssignableFrom(method.getDeclaringClass())) { | ||||
|                 itel.remove(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -9,6 +9,7 @@ import me.libraryaddict.disguise.disguisetypes.RabbitType; | ||||
| import me.libraryaddict.disguise.utilities.parser.params.types.ParamInfoEnum; | ||||
| import me.libraryaddict.disguise.utilities.parser.params.types.base.*; | ||||
| import me.libraryaddict.disguise.utilities.parser.params.types.custom.*; | ||||
| import me.libraryaddict.disguise.utilities.reflection.NmsVersion; | ||||
| import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.*; | ||||
| import org.bukkit.block.BlockFace; | ||||
| @@ -41,8 +42,12 @@ public class ParamInfoTypes { | ||||
|  | ||||
|         paramInfos.add(new ParamInfoEnum(Villager.Profession.class, "Villager Profession", | ||||
|                 "View all the professions you can set on a Villager and Zombie Villager")); | ||||
|         paramInfos.add(new ParamInfoEnum(Villager.Type.class, "Villager Biome", | ||||
|                 "View all the biomes you can set on a Villager and Zombie Villager")); | ||||
|  | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             paramInfos.add(new ParamInfoEnum(Villager.Type.class, "Villager Biome", | ||||
|                     "View all the biomes you can set on a Villager and Zombie Villager")); | ||||
|         } | ||||
|  | ||||
|         paramInfos.add(new ParamInfoEnum(BlockFace.class, "Direction", "Direction (North, East, South, West, Up, Down)", | ||||
|                 "View the directions usable on player setSleeping and shulker direction", | ||||
|                 Arrays.copyOf(BlockFace.values(), 6))); | ||||
| @@ -62,12 +67,15 @@ public class ParamInfoTypes { | ||||
|         paramInfos.add(new ParamInfoEnum(DyeColor.class, "DyeColor", "Dye colors of many different colors")); | ||||
|         paramInfos.add(new ParamInfoEnum(Horse.Style.class, "Horse Style", | ||||
|                 "Horse style which is the patterns on the horse")); | ||||
|         paramInfos.add(new ParamInfoEnum(EntityPose.class, "EntityPose", "The pose the entity should strike")); | ||||
|         paramInfos.add(new ParamInfoEnum(Cat.Type.class, "Cat Type", "The type of cat")); | ||||
|         paramInfos.add(new ParamInfoEnum(Fox.Type.class, "Fox Type", "The type of fox")); | ||||
|         paramInfos.add(new ParamInfoEnum(Panda.Gene.class, "Panda Gene", "The panda gene type")); | ||||
|         paramInfos.add(new ParamInfoEnum(MushroomCow.Variant.class, "Mushroom Cow Variant", | ||||
|                 "The different variants for mushroom cows")); | ||||
|  | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             paramInfos.add(new ParamInfoEnum(EntityPose.class, "EntityPose", "The pose the entity should strike")); | ||||
|             paramInfos.add(new ParamInfoEnum(Cat.Type.class, "Cat Type", "The type of cat")); | ||||
|             paramInfos.add(new ParamInfoEnum(Fox.Type.class, "Fox Type", "The type of fox")); | ||||
|             paramInfos.add(new ParamInfoEnum(Panda.Gene.class, "Panda Gene", "The panda gene type")); | ||||
|             paramInfos.add(new ParamInfoEnum(MushroomCow.Variant.class, "Mushroom Cow Variant", | ||||
|                     "The different variants for mushroom cows")); | ||||
|         } | ||||
|  | ||||
|         // Register custom types | ||||
|         paramInfos.add(new ParamInfoEulerAngle(EulerAngle.class, "Euler Angle", "Euler Angle (X,Y,Z)", | ||||
|   | ||||
| @@ -2,11 +2,14 @@ package me.libraryaddict.disguise.utilities.reflection; | ||||
|  | ||||
| import org.bukkit.entity.Entity; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.lang.annotation.ElementType; | ||||
| import java.lang.annotation.Retention; | ||||
| import java.lang.annotation.RetentionPolicy; | ||||
| import java.lang.annotation.Target; | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URL; | ||||
| import java.net.URLClassLoader; | ||||
| import java.net.URLDecoder; | ||||
| import java.security.CodeSource; | ||||
| import java.util.ArrayList; | ||||
| @@ -20,27 +23,36 @@ import java.util.jar.JarFile; | ||||
| // Code for this taken and slightly modified from | ||||
| // https://github.com/ddopson/java-class-enumerator | ||||
| public class ClassGetter { | ||||
|     private class TestPrem { | ||||
|         String user = "%%__USER__%%"; | ||||
|     } | ||||
|  | ||||
|     @Retention(RetentionPolicy.RUNTIME) | ||||
|     @Target(ElementType.METHOD) | ||||
|     private @interface PremInfo { | ||||
|         String user(); | ||||
|     } | ||||
|  | ||||
|     public static ArrayList<Class<?>> getClassesForPackage(String pkgname) { | ||||
|         return getClassesForPackage(Entity.class, pkgname); | ||||
|     } | ||||
|  | ||||
|     public static ArrayList<Class<?>> getClassesForPackage(Class runFrom, String pkgname) { | ||||
|         ArrayList<Class<?>> classes = new ArrayList<>(); | ||||
|         // String relPath = pkgname.replace('.', '/'); | ||||
|  | ||||
|         // Get a File object for the package | ||||
|         CodeSource src = Entity.class.getProtectionDomain().getCodeSource(); | ||||
|         CodeSource src = runFrom.getProtectionDomain().getCodeSource(); | ||||
|  | ||||
|         if (src != null) { | ||||
|             URL resource = src.getLocation(); | ||||
|             resource.getPath(); | ||||
|             processJarfile(resource, pkgname, classes); | ||||
|  | ||||
|             if (resource.getPath().endsWith(".jar")) { | ||||
|                 processJarfile(resource, pkgname, classes); | ||||
|             } else { | ||||
|                 for (File f : new File(resource.getPath() + "/" + pkgname.replace(".", "/")).listFiles()) { | ||||
|                     if (!f.getName().endsWith(".class")) { | ||||
|                         continue; | ||||
|                     } | ||||
|  | ||||
|                     try { | ||||
|                         classes.add(Class.forName(pkgname + "." + f.getName().replace(".class", ""))); | ||||
|                     } | ||||
|                     catch (ClassNotFoundException e) { | ||||
|                         e.printStackTrace(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return classes; | ||||
| @@ -58,7 +70,6 @@ public class ClassGetter { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @PremInfo(user = "%%__USER__%%") | ||||
|     private static void processJarfile(URL resource, String pkgname, ArrayList<Class<?>> classes) { | ||||
|         try { | ||||
|             String relPath = pkgname.replace('.', '/'); | ||||
|   | ||||
| @@ -0,0 +1,79 @@ | ||||
| package me.libraryaddict.disguise.utilities.reflection; | ||||
|  | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import me.libraryaddict.disguise.disguisetypes.watchers.MushroomCowWatcher; | ||||
| import org.apache.commons.lang.StringUtils; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.io.PrintWriter; | ||||
| import java.lang.reflect.Method; | ||||
| import java.util.ArrayList; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 13/02/2020. | ||||
|  */ | ||||
| public class CompileMethods { | ||||
|     public static void main(String[] args) { | ||||
|         ArrayList<Class<?>> classes = ClassGetter | ||||
|                 .getClassesForPackage(FlagWatcher.class, "me.libraryaddict.disguise.disguisetypes.watchers"); | ||||
|         classes.add(FlagWatcher.class); | ||||
|         classes.add(MushroomCowWatcher.class); | ||||
|  | ||||
|         ArrayList<String> methods = new ArrayList<>(); | ||||
|  | ||||
|         for (Class c : classes) { | ||||
|             for (Method method : c.getMethods()) { | ||||
|                 if (method.getParameterTypes().length != 1) { | ||||
|                     continue; | ||||
|                 } else if (method.getName().startsWith("get")) { | ||||
|                     continue; | ||||
|                 } else if (method.isAnnotationPresent(Deprecated.class) && | ||||
|                         !method.isAnnotationPresent(NmsRemovedIn.class)) { | ||||
|                     continue; | ||||
|                 } else if (!method.getReturnType().equals(Void.TYPE)) { | ||||
|                     continue; | ||||
|                 } else if (method.getName().equals("removePotionEffect")) { | ||||
|                     continue; | ||||
|                 } else if (!FlagWatcher.class.isAssignableFrom(method.getDeclaringClass())) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 int added = -1; | ||||
|                 int removed = -1; | ||||
|  | ||||
|                 if (method.isAnnotationPresent(NmsAddedIn.class)) { | ||||
|                     added = method.getAnnotation(NmsAddedIn.class).val().ordinal(); | ||||
|                 } else if (method.getDeclaringClass().isAnnotationPresent(NmsAddedIn.class)) { | ||||
|                     added = method.getDeclaringClass().getAnnotation(NmsAddedIn.class).val().ordinal(); | ||||
|                 } | ||||
|  | ||||
|                 if (method.isAnnotationPresent(NmsRemovedIn.class)) { | ||||
|                     removed = method.getAnnotation(NmsRemovedIn.class).val().ordinal(); | ||||
|                 } else if (method.getDeclaringClass().isAnnotationPresent(NmsRemovedIn.class)) { | ||||
|                     removed = method.getDeclaringClass().getAnnotation(NmsRemovedIn.class).val().ordinal(); | ||||
|                 } | ||||
|  | ||||
|                 Class<?> param = method.getParameterTypes()[0]; | ||||
|  | ||||
|                 String s = ((added >= 0 || removed >= 0) ? added + ":" + removed + ":" : "") + | ||||
|                         method.getDeclaringClass().getSimpleName() + ":" + method.getName() + ":" + | ||||
|                         param.getName(); | ||||
|  | ||||
|                 if (methods.contains(s)) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 methods.add(s); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         File methodsFile = new File("target/classes/methods.txt"); | ||||
|  | ||||
|         try (PrintWriter writer = new PrintWriter(methodsFile, "UTF-8")) { | ||||
|             writer.write(StringUtils.join(methods, "\n")); | ||||
|         } | ||||
|         catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,133 @@ | ||||
| package me.libraryaddict.disguise.utilities.reflection; | ||||
|  | ||||
| import me.libraryaddict.disguise.LibsDisguises; | ||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||
| import org.apache.commons.lang.ClassUtils; | ||||
|  | ||||
| import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.lang.reflect.Array; | ||||
| import java.lang.reflect.Method; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.*; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| /** | ||||
|  * Created by libraryaddict on 13/02/2020. | ||||
|  */ | ||||
| public class DisguiseMethods { | ||||
|     private HashMap<Class<? extends FlagWatcher>, List<Method>> watcherMethods = new HashMap<>(); | ||||
|  | ||||
|     public ArrayList<Method> getMethods(Class c) { | ||||
|         ArrayList<Method> methods = new ArrayList<>(); | ||||
|  | ||||
|         if (watcherMethods.containsKey(c)) { | ||||
|             methods.addAll(watcherMethods.get(c)); | ||||
|         } | ||||
|  | ||||
|         if (c != FlagWatcher.class) { | ||||
|             methods.addAll(getMethods(c.getSuperclass())); | ||||
|         } | ||||
|  | ||||
|         return methods; | ||||
|     } | ||||
|  | ||||
|     public DisguiseMethods() { | ||||
|         try (InputStream stream = LibsDisguises.getInstance().getResource("methods.txt")) { | ||||
|             List<String> lines = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)).lines() | ||||
|                     .collect(Collectors.toList()); | ||||
|             HashMap<String, Class<? extends FlagWatcher>> classes = new HashMap<>(); | ||||
|             classes.put(FlagWatcher.class.getSimpleName(), FlagWatcher.class); | ||||
|  | ||||
|             for (DisguiseType t : DisguiseType.values()) { | ||||
|                 if (t.getWatcherClass() == null) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 Class c = t.getWatcherClass(); | ||||
|  | ||||
|                 while (!classes.containsKey(c.getSimpleName())) { | ||||
|                     classes.put(c.getSimpleName(), c); | ||||
|                     c = ReflectionManager.getSuperClass(c); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             for (String line : lines) { | ||||
|                 String[] split = line.split(":"); | ||||
|  | ||||
|                 if (split.length > 3) { | ||||
|                     int added = Integer.parseInt(split[0]); | ||||
|                     int removed = Integer.parseInt(split[1]); | ||||
|  | ||||
|                     if (added >= 0 && added > ReflectionManager.getVersion().ordinal()) { | ||||
|                         continue; | ||||
|                     } else if (removed >= 0 && removed <= ReflectionManager.getVersion().ordinal()) { | ||||
|                         continue; | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 Class<? extends FlagWatcher> watcher = classes.get(split[split.length - 3]); | ||||
|  | ||||
|                 if (watcher == null) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 String paramName = split[split.length - 1]; | ||||
|                 Class param; | ||||
|  | ||||
|                 if (!paramName.contains(".")) { | ||||
|                     param = parseType(paramName); | ||||
|                 } else { | ||||
|                     param = Class.forName(paramName); | ||||
|                 } | ||||
|  | ||||
|                 Method method = watcher.getMethod(split[split.length - 2], param); | ||||
|  | ||||
|                 watcherMethods.computeIfAbsent(watcher, (a) -> new ArrayList<>()).add(method); | ||||
|             } | ||||
|         } | ||||
|         catch (IOException | ClassNotFoundException | NoSuchMethodException e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Return the java {@link java.lang.Class} object with the specified class name. | ||||
|      * <p> | ||||
|      * This is an "extended" {@link java.lang.Class#forName(java.lang.String) } operation. | ||||
|      * <p> | ||||
|      * + It is able to return Class objects for primitive types | ||||
|      * + Classes in name space `java.lang` do not need the fully qualified name | ||||
|      * + It does not throw a checked Exception | ||||
|      * | ||||
|      * @param className The class name, never `null` | ||||
|      * @throws IllegalArgumentException if no class can be loaded | ||||
|      */ | ||||
|     private Class<?> parseType(final String className) { | ||||
|         switch (className) { | ||||
|             case "boolean": | ||||
|                 return boolean.class; | ||||
|             case "byte": | ||||
|                 return byte.class; | ||||
|             case "short": | ||||
|                 return short.class; | ||||
|             case "int": | ||||
|                 return int.class; | ||||
|             case "long": | ||||
|                 return long.class; | ||||
|             case "float": | ||||
|                 return float.class; | ||||
|             case "double": | ||||
|                 return double.class; | ||||
|             case "char": | ||||
|                 return char.class; | ||||
|             case "[I": | ||||
|                 return int[].class; | ||||
|             default: | ||||
|                 throw new IllegalArgumentException("Class not found: " + className); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -7,6 +7,6 @@ import java.lang.annotation.RetentionPolicy; | ||||
|  * Created by libraryaddict on 6/02/2020. | ||||
|  */ | ||||
| @Retention(RetentionPolicy.RUNTIME) | ||||
| public @interface NmsAdded { | ||||
|     NmsVersion added(); | ||||
| public @interface NmsAddedIn { | ||||
|     NmsVersion val(); | ||||
| } | ||||
| @@ -7,6 +7,6 @@ import java.lang.annotation.RetentionPolicy; | ||||
|  * Created by libraryaddict on 6/02/2020. | ||||
|  */ | ||||
| @Retention(RetentionPolicy.RUNTIME) | ||||
| public @interface NmsRemoved { | ||||
|     NmsVersion removed(); | ||||
| public @interface NmsRemovedIn { | ||||
|     NmsVersion val(); | ||||
| } | ||||
| @@ -4,6 +4,14 @@ package me.libraryaddict.disguise.utilities.reflection; | ||||
|  * Created by libraryaddict on 6/02/2020. | ||||
|  */ | ||||
| public enum NmsVersion { | ||||
|     v1_13, | ||||
|     v1_14, | ||||
|     v1_15 | ||||
|     v1_15; | ||||
|  | ||||
|     /** | ||||
|      * If this nms version isn't newer than the running version | ||||
|      */ | ||||
|     public boolean isSupported() { | ||||
|         return ReflectionManager.getVersion().ordinal() >= ordinal(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -18,7 +18,7 @@ import org.apache.commons.lang.StringUtils; | ||||
| import org.bukkit.*; | ||||
| import org.bukkit.configuration.InvalidConfigurationException; | ||||
| import org.bukkit.configuration.file.YamlConfiguration; | ||||
| import org.bukkit.craftbukkit.libs.org.apache.commons.io.IOUtils; | ||||
| import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.ints.Int2ObjectMap; | ||||
| import org.bukkit.entity.*; | ||||
| import org.bukkit.inventory.EquipmentSlot; | ||||
| import org.bukkit.inventory.ItemStack; | ||||
| @@ -26,15 +26,19 @@ import org.bukkit.inventory.meta.ItemMeta; | ||||
| import org.bukkit.potion.PotionEffect; | ||||
| import org.bukkit.util.Vector; | ||||
|  | ||||
| import java.io.BufferedReader; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | ||||
| import java.lang.reflect.*; | ||||
| import java.nio.ByteBuffer; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Map; | ||||
| import java.util.Optional; | ||||
| import java.util.UUID; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| public class ReflectionManager { | ||||
|     private static String bukkitVersion; | ||||
| @@ -43,18 +47,20 @@ public class ReflectionManager { | ||||
|     private static Constructor<?> boundingBoxConstructor; | ||||
|     private static Method setBoundingBoxMethod; | ||||
|     private static Field pingField; | ||||
|     public static Field entityCountField; | ||||
|     private static Field entityCountField; | ||||
|     private static Field chunkMapField; | ||||
|     private static Field chunkProviderField; | ||||
|     private static Field entityTrackerField; | ||||
|     private static Field trackedEntitiesField; | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     private static Method ihmGet; | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     private static Field trackerField; | ||||
|     @NmsRemovedIn(val = NmsVersion.v1_14) | ||||
|     private static Field entitiesField; | ||||
|     @Getter | ||||
|     private static NmsVersion version; | ||||
|  | ||||
|     public static boolean isSupported(NmsVersion version) { | ||||
|         return getVersion().ordinal() >= version.ordinal(); | ||||
|     } | ||||
|  | ||||
|     public static void init() { | ||||
|         try { | ||||
|             Object entity = createEntityInstance(DisguiseType.COW, "Cow"); | ||||
| @@ -88,10 +94,16 @@ public class ReflectionManager { | ||||
|  | ||||
|         pingField = getNmsField("EntityPlayer", "ping"); | ||||
|  | ||||
|         chunkProviderField = getNmsField("World", "chunkProvider"); | ||||
|         chunkMapField = getNmsField("ChunkProviderServer", "playerChunkMap"); | ||||
|         trackedEntitiesField = getNmsField("PlayerChunkMap", "trackedEntities"); | ||||
|         entityTrackerField = getNmsField("PlayerChunkMap$EntityTracker", "trackerEntry"); | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             chunkProviderField = getNmsField("World", "chunkProvider"); | ||||
|             chunkMapField = getNmsField("ChunkProviderServer", "playerChunkMap"); | ||||
|             trackedEntitiesField = getNmsField("PlayerChunkMap", "trackedEntities"); | ||||
|             entityTrackerField = getNmsField("PlayerChunkMap$EntityTracker", "trackerEntry"); | ||||
|         } else { | ||||
|             trackerField = getNmsField("WorldServer", "tracker"); | ||||
|             entitiesField = getNmsField("EntityTracker", "trackedEntities"); | ||||
|             ihmGet = getNmsMethod("IntHashMap", "get", int.class); | ||||
|         } | ||||
|  | ||||
|         boundingBoxConstructor = getNmsConstructor("AxisAlignedBB", double.class, double.class, double.class, | ||||
|                 double.class, double.class, double.class); | ||||
| @@ -104,19 +116,19 @@ public class ReflectionManager { | ||||
|     } | ||||
|  | ||||
|     public static boolean isSupported(AccessibleObject obj) { | ||||
|         if (obj.isAnnotationPresent(NmsAdded.class)) { | ||||
|             NmsAdded added = obj.getAnnotation(NmsAdded.class); | ||||
|         if (obj.isAnnotationPresent(NmsAddedIn.class)) { | ||||
|             NmsAddedIn added = obj.getAnnotation(NmsAddedIn.class); | ||||
|  | ||||
|             // If it was added after/on this version | ||||
|             if (!isSupported(added.added())) { | ||||
|             // If it was added after this version | ||||
|             if (!added.val().isSupported()) { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (obj.isAnnotationPresent(NmsRemoved.class)) { | ||||
|             NmsRemoved removed = obj.getAnnotation(NmsRemoved.class); | ||||
|         if (obj.isAnnotationPresent(NmsRemovedIn.class)) { | ||||
|             NmsRemovedIn removed = obj.getAnnotation(NmsRemovedIn.class); | ||||
|  | ||||
|             if (isSupported(removed.removed())) { | ||||
|             if (removed.val().isSupported()) { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
| @@ -152,7 +164,8 @@ public class ReflectionManager { | ||||
|     public static YamlConfiguration getPluginYaml(ClassLoader loader) { | ||||
|         try (InputStream stream = loader.getResourceAsStream("plugin.yml")) { | ||||
|             YamlConfiguration config = new YamlConfiguration(); | ||||
|             config.loadFromString(IOUtils.toString(stream, "UTF-8")); | ||||
|             config.loadFromString(new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)).lines() | ||||
|                     .collect(Collectors.joining("\n"))); | ||||
|  | ||||
|             return config; | ||||
|         } | ||||
| @@ -169,17 +182,21 @@ public class ReflectionManager { | ||||
|  | ||||
|     public static int getNewEntityId(boolean increment) { | ||||
|         try { | ||||
|             AtomicInteger entityCount = (AtomicInteger) entityCountField.get(null); | ||||
|  | ||||
|             int id; | ||||
|             Number entityCount = (Number) entityCountField.get(null); | ||||
|  | ||||
|             if (increment) { | ||||
|                 id = entityCount.getAndIncrement(); | ||||
|             } else { | ||||
|                 id = entityCount.get(); | ||||
|                 if (NmsVersion.v1_14.isSupported()) { | ||||
|                     return ((AtomicInteger) entityCount).getAndIncrement(); | ||||
|                 } else { | ||||
|                     int id = entityCount.intValue(); | ||||
|  | ||||
|                     entityCountField.set(null, id + 1); | ||||
|  | ||||
|                     return id; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return id; | ||||
|             return entityCount.intValue(); | ||||
|         } | ||||
|         catch (IllegalAccessException e) { | ||||
|             e.printStackTrace(); | ||||
| @@ -194,34 +211,44 @@ public class ReflectionManager { | ||||
|             Object entityObject; | ||||
|             Object world = getWorldServer(Bukkit.getWorlds().get(0)); | ||||
|  | ||||
|             switch (entityName) { | ||||
|                 case "Player": | ||||
|                     Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); | ||||
|             if (entityName.equals("Player")) { | ||||
|                 Object minecraftServer = getNmsMethod("MinecraftServer", "getServer").invoke(null); | ||||
|  | ||||
|                     Object playerinteractmanager = getNmsClass("PlayerInteractManager") | ||||
|                             .getDeclaredConstructor(getNmsClass("WorldServer")).newInstance(world); | ||||
|                 Object playerinteractmanager = getNmsClass("PlayerInteractManager") | ||||
|                         .getDeclaredConstructor(getNmsClass(NmsVersion.v1_14.isSupported() ? "WorldServer" : "World")) | ||||
|                         .newInstance(world); | ||||
|  | ||||
|                     WrappedGameProfile gameProfile = getGameProfile(new UUID(0, 0), "Steve"); | ||||
|                 WrappedGameProfile gameProfile = getGameProfile(new UUID(0, 0), "Steve"); | ||||
|  | ||||
|                     entityObject = entityClass | ||||
|                             .getDeclaredConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), | ||||
|                                     gameProfile.getHandleType(), playerinteractmanager.getClass()) | ||||
|                             .newInstance(minecraftServer, world, gameProfile.getHandle(), playerinteractmanager); | ||||
|                     break; | ||||
|                 case "EnderPearl": | ||||
|                     entityObject = entityClass.getDeclaredConstructor(getNmsClass("World"), getNmsClass("EntityLiving")) | ||||
|                             .newInstance(world, createEntityInstance(DisguiseType.COW, "Cow")); | ||||
|                     break; | ||||
|                 case "FishingHook": | ||||
|                 entityObject = entityClass | ||||
|                         .getDeclaredConstructor(getNmsClass("MinecraftServer"), getNmsClass("WorldServer"), | ||||
|                                 gameProfile.getHandleType(), playerinteractmanager.getClass()) | ||||
|                         .newInstance(minecraftServer, world, gameProfile.getHandle(), playerinteractmanager); | ||||
|             } else if (entityName.equals("EnderPearl")) { | ||||
|                 entityObject = entityClass.getDeclaredConstructor(getNmsClass("World"), getNmsClass("EntityLiving")) | ||||
|                         .newInstance(world, createEntityInstance(DisguiseType.COW, "Cow")); | ||||
|             } else if (entityName.equals("FishingHook")) { | ||||
|                 if (NmsVersion.v1_14.isSupported()) { | ||||
|                     entityObject = entityClass | ||||
|                             .getDeclaredConstructor(getNmsClass("EntityHuman"), getNmsClass("World"), int.class, | ||||
|                                     int.class) | ||||
|                             .newInstance(createEntityInstance(DisguiseType.PLAYER, "Player"), world, 0, 0); | ||||
|                     break; | ||||
|                 default: | ||||
|                 } else { | ||||
|                     entityObject = entityClass.getDeclaredConstructor(getNmsClass("World"), getNmsClass("EntityHuman")) | ||||
|                             .newInstance(world, createEntityInstance(DisguiseType.PLAYER, "Player")); | ||||
|                 } | ||||
|             } else if (!NmsVersion.v1_14.isSupported() && entityName.equals("Potion")) { | ||||
|                 entityObject = entityClass | ||||
|                         .getDeclaredConstructor(getNmsClass("World"), Double.TYPE, Double.TYPE, Double.TYPE, | ||||
|                                 getNmsClass("ItemStack")) | ||||
|                         .newInstance(world, 0d, 0d, 0d, getNmsItem(new ItemStack(Material.SPLASH_POTION))); | ||||
|             } else { | ||||
|                 if (NmsVersion.v1_14.isSupported()) { | ||||
|                     entityObject = entityClass.getDeclaredConstructor(getNmsClass("EntityTypes"), getNmsClass("World")) | ||||
|                             .newInstance(getEntityType(disguiseType.getEntityType()), world); | ||||
|                     break; | ||||
|                 } else { | ||||
|                     entityObject = entityClass.getDeclaredConstructor(getNmsClass("World")).newInstance(world); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return entityObject; | ||||
| @@ -395,17 +422,25 @@ public class ReflectionManager { | ||||
|  | ||||
|     public static Object getEntityTrackerEntry(Entity target) throws Exception { | ||||
|         Object world = getWorldServer(target.getWorld()); | ||||
|         Object chunkProvider = chunkProviderField.get(world); | ||||
|         Object chunkMap = chunkMapField.get(chunkProvider); | ||||
|         Map trackedEntities = (Map) trackedEntitiesField.get(chunkMap); | ||||
|  | ||||
|         Object entityTracker = trackedEntities.get(target.getEntityId()); | ||||
|         if (NmsVersion.v1_14.isSupported()) { | ||||
|             Object chunkProvider = chunkProviderField.get(world); | ||||
|             Object chunkMap = chunkMapField.get(chunkProvider); | ||||
|             Map trackedEntities = (Map) trackedEntitiesField.get(chunkMap); | ||||
|  | ||||
|         if (entityTracker == null) { | ||||
|             return null; | ||||
|             Object entityTracker = trackedEntities.get(target.getEntityId()); | ||||
|  | ||||
|             if (entityTracker == null) { | ||||
|                 return null; | ||||
|             } | ||||
|  | ||||
|             return entityTrackerField.get(entityTracker); | ||||
|         } | ||||
|  | ||||
|         return entityTrackerField.get(entityTracker); | ||||
|         Object tracker = trackerField.get(world); | ||||
|         Object trackedEntities = entitiesField.get(tracker); | ||||
|  | ||||
|         return ihmGet.invoke(trackedEntities, target.getEntityId()); | ||||
|     } | ||||
|  | ||||
|     public static Object getMinecraftServer() { | ||||
| @@ -675,13 +710,21 @@ public class ReflectionManager { | ||||
|  | ||||
|     public static float[] getSize(Entity entity) { | ||||
|         try { | ||||
|             Object size = getNmsField("Entity", "size").get(getNmsEntity(entity)); | ||||
|             if (NmsVersion.v1_14.isSupported()) { | ||||
|                 Object size = getNmsField("Entity", "size").get(getNmsEntity(entity)); | ||||
|  | ||||
|             //float length = getNmsField("EntitySize", "length").getFloat(size); | ||||
|             float width = getNmsField("EntitySize", "width").getFloat(size); | ||||
|             float height = getNmsField("Entity", "headHeight").getFloat(getNmsEntity(entity)); | ||||
|                 //float length = getNmsField("EntitySize", "length").getFloat(size); | ||||
|                 float width = getNmsField("EntitySize", "width").getFloat(size); | ||||
|                 float height = getNmsField("Entity", "headHeight").getFloat(getNmsEntity(entity)); | ||||
|  | ||||
|             return new float[]{width, height}; | ||||
|                 return new float[]{width, height}; | ||||
|             } else { | ||||
|  | ||||
|                 //    float length = getNmsField("Entity", "length").getFloat(getNmsEntity(entity)); | ||||
|                 float width = getNmsField("Entity", "width").getFloat(getNmsEntity(entity)); | ||||
|                 float height = (Float) getNmsMethod("Entity", "getHeadHeight").invoke(getNmsEntity(entity)); | ||||
|                 return new float[]{width, height}; | ||||
|             } | ||||
|         } | ||||
|         catch (Exception ex) { | ||||
|             ex.printStackTrace(); | ||||
| @@ -1045,6 +1088,30 @@ public class ReflectionManager { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     public static boolean isAssignableFrom(Class toCheck, Class checkAgainst) { | ||||
|         if (!NmsVersion.v1_14.isSupported() && toCheck != checkAgainst) { | ||||
|             if (toCheck == OcelotWatcher.class) { | ||||
|                 toCheck = TameableWatcher.class; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return checkAgainst.isAssignableFrom(toCheck); | ||||
|     } | ||||
|  | ||||
|     public static Class getSuperClass(Class cl) { | ||||
|         if (cl == FlagWatcher.class) { | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         if (!NmsVersion.v1_14.isSupported()) { | ||||
|             if (cl == OcelotWatcher.class) { | ||||
|                 return TameableWatcher.class; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return cl.getSuperclass(); | ||||
|     } | ||||
|  | ||||
|     public static Object getVillagerProfession(Villager.Profession profession) { | ||||
|         try { | ||||
|             Object villagerProfession = getNmsField("IRegistry", "VILLAGER_PROFESSION").get(null); | ||||
| @@ -1124,10 +1191,14 @@ public class ReflectionManager { | ||||
|     public static Object getEntityType(EntityType entityType) { | ||||
|         try { | ||||
|             Method entityTypes = getNmsMethod("EntityTypes", "a", String.class); | ||||
|             Object val = entityTypes.invoke(null, | ||||
|                     entityType.getName() == null ? entityType.name().toLowerCase() : entityType.getName()); | ||||
|  | ||||
|             Optional<Object> entityObj = (Optional<Object>) entityTypes.invoke(null, entityType.getName()); | ||||
|             if (NmsVersion.v1_14.isSupported()) { | ||||
|                 return ((Optional<Object>) val).orElse(null); | ||||
|             } | ||||
|  | ||||
|             return entityObj.orElse(null); | ||||
|             return val; | ||||
|         } | ||||
|         catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
| @@ -1513,6 +1584,7 @@ public class ReflectionManager { | ||||
|                     DisguiseUtilities.getLogger() | ||||
|                             .severe("Value: " + watch.getRawValue() + " (" + watch.getRawValue().getClass() + ") (" + | ||||
|                                     nmsEntity.getClass() + ") & " + disguiseType.getWatcherClass().getSimpleName()); | ||||
|  | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user