Current work
This commit is contained in:
		
							
								
								
									
										4
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -42,12 +42,12 @@ | |||||||
| 		<dependency> | 		<dependency> | ||||||
| 			<groupId>org.spigotmc</groupId> | 			<groupId>org.spigotmc</groupId> | ||||||
| 			<artifactId>spigot-api</artifactId> | 			<artifactId>spigot-api</artifactId> | ||||||
| 			<version>1.9.4-R0.1-SNAPSHOT</version> | 			<version>1.10-R0.1-SNAPSHOT</version> | ||||||
| 		</dependency> | 		</dependency> | ||||||
| 		<dependency> | 		<dependency> | ||||||
| 			<groupId>org.spigotmc</groupId> | 			<groupId>org.spigotmc</groupId> | ||||||
| 			<artifactId>spigot</artifactId> | 			<artifactId>spigot</artifactId> | ||||||
| 			<version>1.9.4-R0.1-SNAPSHOT</version> | 			<version>1.10-R0.1-SNAPSHOT</version> | ||||||
| 		</dependency> | 		</dependency> | ||||||
| 	</dependencies> | 	</dependencies> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ import me.libraryaddict.disguise.commands.UndisguiseEntityCommand; | |||||||
| import me.libraryaddict.disguise.commands.UndisguisePlayerCommand; | import me.libraryaddict.disguise.commands.UndisguisePlayerCommand; | ||||||
| import me.libraryaddict.disguise.commands.UndisguiseRadiusCommand; | import me.libraryaddict.disguise.commands.UndisguiseRadiusCommand; | ||||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
| import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; | ||||||
| import me.libraryaddict.disguise.disguisetypes.watchers.GuardianWatcher; | import me.libraryaddict.disguise.disguisetypes.watchers.GuardianWatcher; | ||||||
| @@ -299,7 +300,18 @@ public class LibsDisguises extends JavaPlugin | |||||||
|  |  | ||||||
|                 for (WrappedWatchableObject watch : watcher.getWatchableObjects()) |                 for (WrappedWatchableObject watch : watcher.getWatchableObjects()) | ||||||
|                 { |                 { | ||||||
|                     disguiseValues.setMetaValue(watch.getIndex(), watch.getValue()); |                     FlagType flagType = FlagType.getFlag(watcherClass, watch.getIndex()); | ||||||
|  |  | ||||||
|  |                     if (flagType == null) | ||||||
|  |                     { | ||||||
|  |                         System.err.println("Error finding the FlagType for " + disguiseType.name() + "! " + watch.getIndex() | ||||||
|  |                                 + " cannot be found!"); | ||||||
|  |                         System.err.println("Lib's Disguises will continue to load, but this will not work properly!"); | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     disguiseValues.setMetaValue(flagType, watch.getValue()); | ||||||
|  |  | ||||||
|                     // Uncomment when I need to find the new datawatcher values for a class.. |                     // Uncomment when I need to find the new datawatcher values for a class.. | ||||||
|                     // int id = watch.getIndex(); |                     // int id = watch.getIndex(); | ||||||
|                     // Object val = watch.getValue(); |                     // Object val = watch.getValue(); | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import java.util.HashMap; | |||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.Iterator; | import java.util.Iterator; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | import java.util.Map.Entry; | ||||||
| import java.util.UUID; | import java.util.UUID; | ||||||
|  |  | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
| @@ -782,134 +783,15 @@ public abstract class Disguise | |||||||
|      */ |      */ | ||||||
|     private void setupWatcher() |     private void setupWatcher() | ||||||
|     { |     { | ||||||
|         HashMap<Integer, Object> disguiseValues = DisguiseValues.getMetaValues(getType()); |         HashMap<FlagType, Object> disguiseValues = DisguiseValues.getMetaValues(getType()); | ||||||
|         HashMap<Integer, Object> entityValues = DisguiseValues.getMetaValues(DisguiseType.getType(getEntity().getType())); |         HashMap<FlagType, Object> entityValues = DisguiseValues.getMetaValues(DisguiseType.getType(getEntity().getType())); | ||||||
|  |  | ||||||
|         // Start from 2 as they ALL share 0 and 1 |         for (Entry<FlagType, Object> entry : entityValues.entrySet()) | ||||||
|         for (int dataNo = 0; dataNo <= 31; dataNo++) |  | ||||||
|         { |         { | ||||||
|             // STEP 1. Find out if the watcher has set data on it. |             if (disguiseValues.containsKey(entry.getKey())) | ||||||
|             // If the watcher already set a metadata on this |  | ||||||
|             if (getWatcher().hasValue(dataNo)) |  | ||||||
|             { |  | ||||||
|                 // Better check that the value is stable. |  | ||||||
|                 // To check this, I'm going to check if there exists a default value |  | ||||||
|                 // Then I'm going to check if the watcher value is the same as the default value. |  | ||||||
|                 if (disguiseValues.containsKey(dataNo)) |  | ||||||
|                 { |  | ||||||
|                     // Now check if they are the same class, or both null. |  | ||||||
|                     if (disguiseValues.get(dataNo) == null || getWatcher().getValue(dataNo, null) == null) |  | ||||||
|                     { |  | ||||||
|                         if (disguiseValues.get(dataNo) == null && getWatcher().getValue(dataNo, null) == null) |  | ||||||
|                         { |  | ||||||
|                             // They are both null. Idk what this means really. |  | ||||||
|                             continue; |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                     else if (getWatcher().getValue(dataNo, null).getClass() == disguiseValues.get(dataNo).getClass()) |  | ||||||
|                     { |  | ||||||
|                         // The classes are the same. The client "shouldn't" crash. |  | ||||||
|                         continue; |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // STEP 2. As the watcher has not set data on it, check if I need to set the default data. |  | ||||||
|             // If neither of them touch it |  | ||||||
|             if (!entityValues.containsKey(dataNo) && !disguiseValues.containsKey(dataNo)) |  | ||||||
|             { |  | ||||||
|                 continue; |                 continue; | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // If the disguise has this, but not the entity. Then better set it! |             getWatcher().setBackupValue(entry.getKey(), entry.getValue()); | ||||||
|             if (!entityValues.containsKey(dataNo) && disguiseValues.containsKey(dataNo)) |  | ||||||
|             { |  | ||||||
|                 getWatcher().setBackupValue(dataNo, disguiseValues.get(dataNo)); |  | ||||||
|                 continue; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // Else if the disguise doesn't have it. But the entity does. Better remove it! |  | ||||||
|             if (entityValues.containsKey(dataNo) && !disguiseValues.containsKey(dataNo)) |  | ||||||
|             { |  | ||||||
|                 getWatcher().setBackupValue(dataNo, null); |  | ||||||
|                 continue; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             Object eObj = entityValues.get(dataNo); |  | ||||||
|             Object dObj = disguiseValues.get(dataNo); |  | ||||||
|  |  | ||||||
|             if (eObj == null || dObj == null) |  | ||||||
|             { |  | ||||||
|                 if (eObj == null && dObj == null) |  | ||||||
|                 { |  | ||||||
|                     continue; |  | ||||||
|                 } |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     getWatcher().setBackupValue(dataNo, dObj); |  | ||||||
|                     continue; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             if (eObj.getClass() != dObj.getClass()) |  | ||||||
|             { |  | ||||||
|                 getWatcher().setBackupValue(dataNo, dObj); |  | ||||||
|                 continue; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // Since they both share it. With the same classes. Time to check if its from something they extend. |  | ||||||
|             // Better make this clear before I compare the values because some default values are different! |  | ||||||
|             // Entity is 0 & 1 - But we aint gonna be checking that |  | ||||||
|             // EntityAgeable is 11 |  | ||||||
|             // EntityInsentient is 10 |  | ||||||
|             // EntityLiving is 5 & 6 & 7 & 8 & 9 |  | ||||||
|             // Lets use switch |  | ||||||
|             Class baseClass = null; |  | ||||||
|  |  | ||||||
|             switch (dataNo) |  | ||||||
|             { |  | ||||||
|             case 5: |  | ||||||
|             case 6: |  | ||||||
|             case 7: |  | ||||||
|             case 8: |  | ||||||
|             case 9: |  | ||||||
|                 baseClass = ReflectionManager.getNmsClass("EntityLiving"); |  | ||||||
|                 break; |  | ||||||
|             case 10: |  | ||||||
|                 baseClass = ReflectionManager.getNmsClass("EntityInsentient"); |  | ||||||
|                 break; |  | ||||||
|             case 11: |  | ||||||
|                 baseClass = ReflectionManager.getNmsClass("EntityAgeable"); |  | ||||||
|                 break; |  | ||||||
|             default: |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             Class nmsEntityClass = ReflectionManager.getNmsEntity(getEntity()).getClass(); |  | ||||||
|             Class nmsDisguiseClass = DisguiseValues.getNmsEntityClass(getType()); |  | ||||||
|  |  | ||||||
|             if (nmsDisguiseClass != null) |  | ||||||
|             { |  | ||||||
|                 // If they both extend the same base class. They OBVIOUSLY share the same datavalue. Right..? |  | ||||||
|                 if (baseClass != null && baseClass.isAssignableFrom(nmsDisguiseClass) |  | ||||||
|                         && baseClass.isAssignableFrom(nmsEntityClass)) |  | ||||||
|                 { |  | ||||||
|                     continue; |  | ||||||
|                 } |  | ||||||
|  |  | ||||||
|                 // So they don't extend a basic class. |  | ||||||
|                 // Maybe if I check that they extend each other.. |  | ||||||
|                 // Seeing as I only store the finished forms of entitys. This should raise no problems and allow for more shared |  | ||||||
|                 // datawatchers. |  | ||||||
|                 if (nmsEntityClass.isAssignableFrom(nmsDisguiseClass) || nmsDisguiseClass.isAssignableFrom(nmsEntityClass)) |  | ||||||
|                 { |  | ||||||
|                     continue; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // Well I can't find a reason I should leave it alone. They will probably conflict. |  | ||||||
|             // Time to set the value to the disguises value so no conflicts! |  | ||||||
|             getWatcher().setBackupValue(dataNo, disguiseValues.get(dataNo)); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -337,7 +337,7 @@ public enum DisguiseType | |||||||
|         return objectId; |         return objectId; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Class getWatcherClass() |     public Class<? extends FlagWatcher> getWatcherClass() | ||||||
|     { |     { | ||||||
|         return watcherClass; |         return watcherClass; | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										260
									
								
								src/me/libraryaddict/disguise/disguisetypes/FlagType.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										260
									
								
								src/me/libraryaddict/disguise/disguisetypes/FlagType.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,260 @@ | |||||||
|  | package me.libraryaddict.disguise.disguisetypes; | ||||||
|  |  | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.UUID; | ||||||
|  | import java.util.Map.Entry; | ||||||
|  |  | ||||||
|  | import org.bukkit.Color; | ||||||
|  | import org.bukkit.Material; | ||||||
|  | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
|  | import com.google.common.base.Optional; | ||||||
|  |  | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.watchers.*; | ||||||
|  |  | ||||||
|  | public class FlagType<Y> | ||||||
|  | { | ||||||
|  |     private static FlagType[] _values = new FlagType[0]; | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> AGEABLE_BABY = new FlagType<Boolean>(AgeableWatcher.class, 11, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> AREA_EFFECT_COLOR = new FlagType<Integer>(AreaEffectCloudWatcher.class, 6, | ||||||
|  |             Color.BLACK.asRGB()); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> AREA_EFFECT_IGNORE_RADIUS = new FlagType<Boolean>(AreaEffectCloudWatcher.class, 7, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> AREA_EFFECT_PARTICLE = new FlagType<Integer>(AreaEffectCloudWatcher.class, 8, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Float> AREA_EFFECT_RADIUS = new FlagType<Float>(AreaEffectCloudWatcher.class, 6, 0F); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> ARMORSTAND_META = new FlagType<Byte>(ArmorStandWatcher.class, 10, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> ARROW_CRITICAL = new FlagType<Byte>(ArrowWatcher.class, 6, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> BAT_HANGING = new FlagType<Byte>(BatWatcher.class, 11, (byte) 1); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> BLAZE_BLAZING = new FlagType<Boolean>(BlazeWatcher.class, 11, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Float> BOAT_DAMAGE = new FlagType<Float>(BoatWatcher.class, 7, 40F); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> CREEPER_IGNITED = new FlagType<Boolean>(CreeperWatcher.class, 13, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> CREEPER_POWERED = new FlagType<Boolean>(CreeperWatcher.class, 12, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<ItemStack> DROPPED_ITEM = new FlagType<ItemStack>(DroppedItemWatcher.class, 6, | ||||||
|  |             new ItemStack(Material.AIR)); | ||||||
|  |  | ||||||
|  |     public static FlagType<Optional> ENDER_CRYSTAL_BEAM = new FlagType<Optional>(EnderCrystalWatcher.class, 6, Optional.absent()); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> ENDER_CRYSTAL_PLATE = new FlagType<Boolean>(EnderCrystalWatcher.class, 6, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> ENDERDRAGON_PHASE = new FlagType<Integer>(EnderDragonWatcher.class, 6, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> ENDERMAN_AGRESSIVE = new FlagType<Boolean>(EndermanWatcher.class, 12, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Optional<Integer>> ENDERMAN_ITEM = new FlagType<Optional<Integer>>(EndermanWatcher.class, 11, | ||||||
|  |             Optional.of(1)); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> ENTITY_AIR_TICKS = new FlagType<Integer>(FlagWatcher.class, 1, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<String> ENTITY_CUSTOM_NAME = new FlagType<String>(FlagWatcher.class, 2, null); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> ENTITY_CUSTOM_NAME_VISIBLE = new FlagType<Boolean>(FlagWatcher.class, 3, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> ENTITY_META = new FlagType<Byte>(FlagWatcher.class, 0, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> ENTITY_NO_GRAVITY = new FlagType<Boolean>(FlagWatcher.class, 5, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> ENTITY_SILENT = new FlagType<Integer>(FlagWatcher.class, 4, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> GHAST_AGRESSIVE = new FlagType<Boolean>(GhastWatcher.class, 11, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> GUARDIAN_FLAG = new FlagType<Byte>(GuardianWatcher.class, 11, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> GUARDIAN_TARGET = new FlagType<Integer>(GuardianWatcher.class, 12, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> HORSE_ARMOR = new FlagType<Integer>(HorseWatcher.class, 16, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> HORSE_COLOR = new FlagType<Integer>(HorseWatcher.class, 14, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> HORSE_META = new FlagType<Byte>(HorseWatcher.class, 12, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Optional<UUID>> HORSE_OWNER = new FlagType<Optional<UUID>>(HorseWatcher.class, 15, | ||||||
|  |             Optional.<UUID> absent()); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> HORSE_STYLE = new FlagType<Integer>(HorseWatcher.class, 14, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> HORSE_VARIANT = new FlagType<Integer>(HorseWatcher.class, 13, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> INSENTIENT_META = new FlagType<Byte>(LivingWatcher.class, 10, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<ItemStack> ITEMFRAME_ITEM = new FlagType<ItemStack>(ItemFrameWatcher.class, 6, null); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> ITEMFRAME_ROTATION = new FlagType<Byte>(ItemFrameWatcher.class, 6, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> LIVING_ARROWS = new FlagType<Integer>(LivingWatcher.class, 9, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Float> LIVING_HEALTH = new FlagType<Float>(LivingWatcher.class, 6, 0F); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> LIVING_POTION_AMBIENT = new FlagType<Boolean>(LivingWatcher.class, 8, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> LIVING_POTIONS = new FlagType<Integer>(LivingWatcher.class, 7, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> MINECART_BLOCK = new FlagType<Integer>(MinecartWatcher.class, 8, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> MINECART_BLOCK_VISIBLE = new FlagType<Boolean>(MinecartWatcher.class, 10, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> MINECART_BLOCK_Y = new FlagType<Integer>(MinecartWatcher.class, 9, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> OCELOT_TYPE = new FlagType<Integer>(OcelotWatcher.class, 14, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> PIG_SADDLED = new FlagType<Boolean>(PigWatcher.class, 12, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> PLAYER_SKIN = new FlagType<Byte>(PlayerWatcher.class, 12, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> RABBIT_TYPE = new FlagType<Integer>(RabbitWatcher.class, 12, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> SHEEP_WOOL = new FlagType<Byte>(SheepWatcher.class, 12, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> SKELETON_TYPE = new FlagType<Integer>(SkeletonWatcher.class, 11, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> SLIME_SIZE = new FlagType<Integer>(SlimeWatcher.class, 11, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Byte> TAMEABLE_META = new FlagType<Byte>(TameableWatcher.class, 12, (byte) 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Optional<UUID>> TAMEABLE_OWNER = new FlagType<Optional<UUID>>(TameableWatcher.class, 13, | ||||||
|  |             Optional.<UUID> absent()); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> TIPPED_ARROW_COLOR = new FlagType<Integer>(TippedArrowWatcher.class, 6, Color.WHITE.asRGB()); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> VILLAGER_PROFESSION = new FlagType<Integer>(VillagerWatcher.class, 12, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> WITCH_AGGRESSIVE = new FlagType<Boolean>(WitchWatcher.class, 11, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> WITHER_INVUL = new FlagType<Integer>(WitchWatcher.class, 14, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> WITHER_TARGET_1 = new FlagType<Integer>(WitherWatcher.class, 11, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> WITHER_TARGET_2 = new FlagType<Integer>(WitherWatcher.class, 12, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> WITHER_TARGET_3 = new FlagType<Integer>(WitherWatcher.class, 13, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> WITHERSKULL_BLUE = new FlagType<Boolean>(WitherSkullWatcher.class, 6, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> WOLF_BEGGING = new FlagType<Boolean>(WolfWatcher.class, 15, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> WOLF_COLLAR = new FlagType<Integer>(WolfWatcher.class, 16, 14); | ||||||
|  |  | ||||||
|  |     public static FlagType<Float> WOLF_DAMAGE = new FlagType<Float>(WolfWatcher.class, 14, 0F); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> ZOMBIE_AGGRESSIVE = new FlagType<Boolean>(ZombieWatcher.class, 14, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> ZOMBIE_BABY = new FlagType<Boolean>(ZombieWatcher.class, 11, false); | ||||||
|  |  | ||||||
|  |     public static FlagType<Integer> ZOMBIE_PROFESSION = new FlagType<Integer>(ZombieWatcher.class, 12, 0); | ||||||
|  |  | ||||||
|  |     public static FlagType<Boolean> ZOMBIE_SHAKING = new FlagType<Boolean>(ZombieWatcher.class, 13, false); | ||||||
|  |  | ||||||
|  |     static | ||||||
|  |     { | ||||||
|  |         // Simple verification for the dev that he's setting up the FlagType's properly. | ||||||
|  |         // All flag types should be from 0 to <Max Number> with no empty numbers. | ||||||
|  |         // All flag types should never occur twice. | ||||||
|  |  | ||||||
|  |         HashMap<Class, Integer> maxValues = new HashMap<Class, Integer>(); | ||||||
|  |  | ||||||
|  |         for (FlagType type : values()) | ||||||
|  |         { | ||||||
|  |             if (maxValues.containsKey(type.getFlagWatcher()) && maxValues.get(type.getFlagWatcher()) > type.getIndex()) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             maxValues.put(type.getFlagWatcher(), type.getIndex()); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         for (Entry<Class, Integer> entry : maxValues.entrySet()) | ||||||
|  |         { | ||||||
|  |             loop: | ||||||
|  |  | ||||||
|  |             for (int i = 0; i < entry.getValue(); i++) | ||||||
|  |             { | ||||||
|  |                 FlagType found = null; | ||||||
|  |  | ||||||
|  |                 for (FlagType type : values()) | ||||||
|  |                 { | ||||||
|  |                     if (type.getIndex() != i) | ||||||
|  |                         continue; | ||||||
|  |  | ||||||
|  |                     if (!type.getFlagWatcher().isAssignableFrom(entry.getKey())) | ||||||
|  |                         continue; | ||||||
|  |  | ||||||
|  |                     if (found != null) | ||||||
|  |                     { | ||||||
|  |                         System.err.println(entry.getKey().getSimpleName() + " has multiple FlagType's registered for the index " | ||||||
|  |                                 + i + " (" + type.getFlagWatcher().getSimpleName() + ", " + found.getFlagWatcher().getSimpleName() | ||||||
|  |                                 + ")"); | ||||||
|  |                         continue loop; | ||||||
|  |                     } | ||||||
|  |  | ||||||
|  |                     found = type; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 if (found != null) | ||||||
|  |                     continue; | ||||||
|  |  | ||||||
|  |                 System.err.println(entry.getKey().getSimpleName() + " has no FlagType registered for the index " + i); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static FlagType getFlag(Class<? extends FlagWatcher> watcherClass, int flagNo) | ||||||
|  |     { | ||||||
|  |         for (FlagType type : values()) | ||||||
|  |         { | ||||||
|  |             if (type.getIndex() != flagNo) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             if (!type.getFlagWatcher().isAssignableFrom(watcherClass)) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             return type; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static FlagType[] values() | ||||||
|  |     { | ||||||
|  |         return _values; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private Y _defaultValue; | ||||||
|  |  | ||||||
|  |     private int _index; | ||||||
|  |  | ||||||
|  |     private Class<? extends FlagWatcher> _watcher; | ||||||
|  |  | ||||||
|  |     private FlagType(Class<? extends FlagWatcher> watcher, int index, Y defaultValue) | ||||||
|  |     { | ||||||
|  |         _index = index; | ||||||
|  |         _watcher = watcher; | ||||||
|  |  | ||||||
|  |         _values = Arrays.copyOf(_values, _values.length + 1); | ||||||
|  |         _values[_values.length - 1] = this; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public Y getDefault() | ||||||
|  |     { | ||||||
|  |         return _defaultValue; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public Class<? extends FlagWatcher> getFlagWatcher() | ||||||
|  |     { | ||||||
|  |         return _watcher; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public int getIndex() | ||||||
|  |     { | ||||||
|  |         return _index; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -28,16 +28,15 @@ import me.libraryaddict.disguise.utilities.ReflectionManager; | |||||||
|  |  | ||||||
| public class FlagWatcher | public class FlagWatcher | ||||||
| { | { | ||||||
|  |  | ||||||
|     private boolean addEntityAnimations = DisguiseConfig.isEntityAnimationsAdded(); |     private boolean addEntityAnimations = DisguiseConfig.isEntityAnimationsAdded(); | ||||||
|     /** |     /** | ||||||
|      * These are the entity values I need to add else it could crash them.. |      * These are the entity values I need to add else it could crash them.. | ||||||
|      */ |      */ | ||||||
|     private HashMap<Integer, Object> backupEntityValues = new HashMap<>(); |     private HashMap<FlagType, Object> backupEntityValues = new HashMap<>(); | ||||||
|     private TargetedDisguise disguise; |     private TargetedDisguise disguise; | ||||||
|     private HashMap<Integer, Object> entityValues = new HashMap<>(); |     private HashMap<FlagType, Object> entityValues = new HashMap<>(); | ||||||
|     private boolean hasDied; |  | ||||||
|     private EntityEquipment equipment; |     private EntityEquipment equipment; | ||||||
|  |     private boolean hasDied; | ||||||
|     private HashSet<Integer> modifiedEntityAnimations = new HashSet<>(); |     private HashSet<Integer> modifiedEntityAnimations = new HashSet<>(); | ||||||
|     private List<WrappedWatchableObject> watchableObjects; |     private List<WrappedWatchableObject> watchableObjects; | ||||||
|  |  | ||||||
| @@ -78,7 +77,7 @@ public class FlagWatcher | |||||||
|             cloned = new FlagWatcher(getDisguise()); |             cloned = new FlagWatcher(getDisguise()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         cloned.entityValues = (HashMap<Integer, Object>) entityValues.clone(); |         cloned.entityValues = (HashMap<FlagType, Object>) entityValues.clone(); | ||||||
|         cloned.equipment = ReflectionManager.createEntityEquipment(cloned.getDisguise().getEntity()); |         cloned.equipment = ReflectionManager.createEntityEquipment(cloned.getDisguise().getEntity()); | ||||||
|         cloned.modifiedEntityAnimations = (HashSet<Integer>) modifiedEntityAnimations.clone(); |         cloned.modifiedEntityAnimations = (HashSet<Integer>) modifiedEntityAnimations.clone(); | ||||||
|         cloned.addEntityAnimations = addEntityAnimations; |         cloned.addEntityAnimations = addEntityAnimations; | ||||||
| @@ -159,7 +158,7 @@ public class FlagWatcher | |||||||
|         if (sendAllCustom) |         if (sendAllCustom) | ||||||
|         { |         { | ||||||
|             // Its sending the entire meta data. Better add the custom meta |             // Its sending the entire meta data. Better add the custom meta | ||||||
|             for (int id : entityValues.keySet()) |             for (FlagType id : entityValues.keySet()) | ||||||
|             { |             { | ||||||
|                 if (sentValues.contains(id)) |                 if (sentValues.contains(id)) | ||||||
|                 { |                 { | ||||||
| @@ -173,7 +172,8 @@ public class FlagWatcher | |||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 WrappedWatchableObject watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(id, value)); |                 WrappedWatchableObject watch = new WrappedWatchableObject( | ||||||
|  |                         ReflectionManager.createDataWatcherItem(id.getIndex(), value)); | ||||||
|  |  | ||||||
|                 newList.add(watch); |                 newList.add(watch); | ||||||
|             } |             } | ||||||
| @@ -235,7 +235,7 @@ public class FlagWatcher | |||||||
|  |  | ||||||
|     public String getCustomName() |     public String getCustomName() | ||||||
|     { |     { | ||||||
|         return (String) getValue(2, null); |         return (String) getValue(FlagType.ENTITY_CUSTOM_NAME); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected TargetedDisguise getDisguise() |     protected TargetedDisguise getDisguise() | ||||||
| @@ -245,7 +245,12 @@ public class FlagWatcher | |||||||
|  |  | ||||||
|     private boolean getEntityFlag(int byteValue) |     private boolean getEntityFlag(int byteValue) | ||||||
|     { |     { | ||||||
|         return ((byte) getValue(0, (byte) 0) & 1 << byteValue) != 0; |         return ((byte) getValue(FlagType.ENTITY_META) & 1 << byteValue) != 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public EntityEquipment getEquipment() | ||||||
|  |     { | ||||||
|  |         return equipment; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public ItemStack getItemInMainHand() |     public ItemStack getItemInMainHand() | ||||||
| @@ -264,19 +269,38 @@ public class FlagWatcher | |||||||
|         return equipment.getItemInOffHand(); |         return equipment.getItemInOffHand(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public EntityEquipment getEquipment() |     public ItemStack getItemStack(EquipmentSlot slot) | ||||||
|     { |     { | ||||||
|         return equipment; |         if (equipment == null) | ||||||
|  |             return null; | ||||||
|  |  | ||||||
|  |         switch (slot) | ||||||
|  |         { | ||||||
|  |         case CHEST: | ||||||
|  |             return equipment.getChestplate(); | ||||||
|  |         case FEET: | ||||||
|  |             return equipment.getBoots(); | ||||||
|  |         case HAND: | ||||||
|  |             return equipment.getItemInMainHand(); | ||||||
|  |         case HEAD: | ||||||
|  |             return equipment.getHelmet(); | ||||||
|  |         case LEGS: | ||||||
|  |             return equipment.getLeggings(); | ||||||
|  |         case OFF_HAND: | ||||||
|  |             return equipment.getItemInOffHand(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected <Y> Y getValue(int no, Y backup) |     protected <Y> Y getValue(FlagType<Y> no) | ||||||
|     { |     { | ||||||
|         if (entityValues.containsKey(no)) |         if (entityValues.containsKey(no)) | ||||||
|         { |         { | ||||||
|             return (Y) entityValues.get(no); |             return (Y) entityValues.get(no); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return backup; |         return no.getDefault(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public List<WrappedWatchableObject> getWatchableObjects() |     public List<WrappedWatchableObject> getWatchableObjects() | ||||||
| @@ -299,9 +323,14 @@ public class FlagWatcher | |||||||
|         return entityValues.containsKey(no); |         return entityValues.containsKey(no); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public boolean isBurning() | ||||||
|  |     { | ||||||
|  |         return getEntityFlag(0); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public boolean isCustomNameVisible() |     public boolean isCustomNameVisible() | ||||||
|     { |     { | ||||||
|         return (boolean) getValue(3, false); |         return getValue(FlagType.ENTITY_CUSTOM_NAME_VISIBLE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isEntityAnimationsAdded() |     public boolean isEntityAnimationsAdded() | ||||||
| @@ -309,9 +338,29 @@ public class FlagWatcher | |||||||
|         return addEntityAnimations; |         return addEntityAnimations; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isBurning() |     public boolean isFlyingWithElytra() | ||||||
|     { |     { | ||||||
|         return getEntityFlag(0); |         return getEntityFlag(7); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isGlowing() | ||||||
|  |     { | ||||||
|  |         return getEntityFlag(6); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isInvisible() | ||||||
|  |     { | ||||||
|  |         return getEntityFlag(5); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isNoGravity() | ||||||
|  |     { | ||||||
|  |         return getValue(FlagType.ENTITY_NO_GRAVITY); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isRightClicking() | ||||||
|  |     { | ||||||
|  |         return getEntityFlag(4); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isSneaking() |     public boolean isSneaking() | ||||||
| @@ -324,26 +373,6 @@ public class FlagWatcher | |||||||
|         return getEntityFlag(3); |         return getEntityFlag(3); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isRightClicking() |  | ||||||
|     { |  | ||||||
|         return getEntityFlag(4); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public boolean isInvisible() |  | ||||||
|     { |  | ||||||
|         return getEntityFlag(5); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public boolean isGlowing() |  | ||||||
|     { |  | ||||||
|         return getEntityFlag(6); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public boolean isFlyingWithElytra() |  | ||||||
|     { |  | ||||||
|         return getEntityFlag(7); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public void rebuildWatchableObjects() |     public void rebuildWatchableObjects() | ||||||
|     { |     { | ||||||
|         watchableObjects = new ArrayList<>(); |         watchableObjects = new ArrayList<>(); | ||||||
| @@ -368,7 +397,7 @@ public class FlagWatcher | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected void sendData(int... dataValues) |     protected void sendData(FlagType... dataValues) | ||||||
|     { |     { | ||||||
|         if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this) |         if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this) | ||||||
|         { |         { | ||||||
| @@ -377,7 +406,7 @@ public class FlagWatcher | |||||||
|  |  | ||||||
|         List<WrappedWatchableObject> list = new ArrayList<>(); |         List<WrappedWatchableObject> list = new ArrayList<>(); | ||||||
|  |  | ||||||
|         for (int data : dataValues) |         for (FlagType data : dataValues) | ||||||
|         { |         { | ||||||
|             if (!entityValues.containsKey(data) || entityValues.get(data) == null) |             if (!entityValues.containsKey(data) || entityValues.get(data) == null) | ||||||
|             { |             { | ||||||
| @@ -386,7 +415,7 @@ public class FlagWatcher | |||||||
|  |  | ||||||
|             Object value = entityValues.get(data); |             Object value = entityValues.get(data); | ||||||
|  |  | ||||||
|             if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == 0) |             if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == FlagType.ENTITY_META) | ||||||
|             { |             { | ||||||
|                 if (!PacketsManager.isStaticMetadataDisguiseType(disguise)) |                 if (!PacketsManager.isStaticMetadataDisguiseType(disguise)) | ||||||
|                 { |                 { | ||||||
| @@ -395,7 +424,8 @@ public class FlagWatcher | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             WrappedWatchableObject watch = new WrappedWatchableObject(ReflectionManager.createDataWatcherItem(data, value)); |             WrappedWatchableObject watch = new WrappedWatchableObject( | ||||||
|  |                     ReflectionManager.createDataWatcherItem(data.getIndex(), value)); | ||||||
|  |  | ||||||
|             list.add(watch); |             list.add(watch); | ||||||
|         } |         } | ||||||
| @@ -436,7 +466,7 @@ public class FlagWatcher | |||||||
|         setItemStack(EquipmentSlot.FEET, itemstack[3]); |         setItemStack(EquipmentSlot.FEET, itemstack[3]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected void setBackupValue(int no, Object value) |     protected void setBackupValue(FlagType no, Object value) | ||||||
|     { |     { | ||||||
|         backupEntityValues.put(no, value); |         backupEntityValues.put(no, value); | ||||||
|     } |     } | ||||||
| @@ -445,7 +475,7 @@ public class FlagWatcher | |||||||
|     { |     { | ||||||
|         setEntityFlag(0, setBurning); |         setEntityFlag(0, setBurning); | ||||||
|  |  | ||||||
|         sendData(0); |         sendData(FlagType.ENTITY_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setCustomName(String name) |     public void setCustomName(String name) | ||||||
| @@ -455,48 +485,48 @@ public class FlagWatcher | |||||||
|             name = name.substring(0, 64); |             name = name.substring(0, 64); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         setValue(2, name); |         setValue(FlagType.ENTITY_CUSTOM_NAME, name); | ||||||
|         sendData(2); |         sendData(FlagType.ENTITY_CUSTOM_NAME); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setCustomNameVisible(boolean display) |     public void setCustomNameVisible(boolean display) | ||||||
|     { |     { | ||||||
|         setValue(3, display); |         setValue(FlagType.ENTITY_CUSTOM_NAME_VISIBLE, display); | ||||||
|         sendData(3); |         sendData(FlagType.ENTITY_CUSTOM_NAME_VISIBLE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void setEntityFlag(int byteValue, boolean flag) |     private void setEntityFlag(int byteValue, boolean flag) | ||||||
|     { |     { | ||||||
|         modifiedEntityAnimations.add(byteValue); |         modifiedEntityAnimations.add(byteValue); | ||||||
|  |  | ||||||
|         byte b0 = (byte) getValue(0, (byte) 0); |         byte b0 = (byte) getValue(FlagType.ENTITY_META); | ||||||
|  |  | ||||||
|         if (flag) |         if (flag) | ||||||
|         { |         { | ||||||
|             setValue(0, (byte) (b0 | 1 << byteValue)); |             setValue(FlagType.ENTITY_META, (byte) (b0 | 1 << byteValue)); | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             setValue(0, (byte) (b0 & ~(1 << byteValue))); |             setValue(FlagType.ENTITY_META, (byte) (b0 & ~(1 << byteValue))); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setInvisible(boolean setInvis) |  | ||||||
|     { |  | ||||||
|         setEntityFlag(5, setInvis); |  | ||||||
|         sendData(0); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public void setGlowing(boolean glowing) |  | ||||||
|     { |  | ||||||
|         setEntityFlag(6, glowing); |  | ||||||
|         sendData(0); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public void setFlyingWithElytra(boolean flying) |     public void setFlyingWithElytra(boolean flying) | ||||||
|     { |     { | ||||||
|         setEntityFlag(7, flying); |         setEntityFlag(7, flying); | ||||||
|         sendData(0); |         sendData(FlagType.ENTITY_META); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setGlowing(boolean glowing) | ||||||
|  |     { | ||||||
|  |         setEntityFlag(6, glowing); | ||||||
|  |         sendData(FlagType.ENTITY_META); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setInvisible(boolean setInvis) | ||||||
|  |     { | ||||||
|  |         setEntityFlag(5, setInvis); | ||||||
|  |         sendData(FlagType.ENTITY_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -520,6 +550,34 @@ public class FlagWatcher | |||||||
|         setItemStack(EquipmentSlot.OFF_HAND, itemstack); |         setItemStack(EquipmentSlot.OFF_HAND, itemstack); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private void setItemStack(EntityEquipment equipment, EquipmentSlot slot, ItemStack itemStack) | ||||||
|  |     { | ||||||
|  |         if (equipment == null) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         switch (slot) | ||||||
|  |         { | ||||||
|  |         case CHEST: | ||||||
|  |             equipment.setChestplate(itemStack); | ||||||
|  |             break; | ||||||
|  |         case FEET: | ||||||
|  |             equipment.setBoots(itemStack); | ||||||
|  |             break; | ||||||
|  |         case HAND: | ||||||
|  |             equipment.setItemInMainHand(itemStack); | ||||||
|  |             break; | ||||||
|  |         case HEAD: | ||||||
|  |             equipment.setHelmet(itemStack); | ||||||
|  |             break; | ||||||
|  |         case LEGS: | ||||||
|  |             equipment.setLeggings(itemStack); | ||||||
|  |             break; | ||||||
|  |         case OFF_HAND: | ||||||
|  |             equipment.setItemInOffHand(itemStack); | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public void setItemStack(EquipmentSlot slot, ItemStack itemStack) |     public void setItemStack(EquipmentSlot slot, ItemStack itemStack) | ||||||
|     { |     { | ||||||
|         if (equipment == null) |         if (equipment == null) | ||||||
| @@ -569,77 +627,31 @@ public class FlagWatcher | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void setItemStack(EntityEquipment equipment, EquipmentSlot slot, ItemStack itemStack) |     public void setNoGravity(boolean noGravity) | ||||||
|     { |     { | ||||||
|         if (equipment == null) |         setValue(FlagType.ENTITY_NO_GRAVITY, noGravity); | ||||||
|             return; |         sendData(FlagType.ENTITY_NO_GRAVITY); | ||||||
|  |  | ||||||
|         switch (slot) |  | ||||||
|         { |  | ||||||
|         case CHEST: |  | ||||||
|             equipment.setChestplate(itemStack); |  | ||||||
|             break; |  | ||||||
|         case FEET: |  | ||||||
|             equipment.setBoots(itemStack); |  | ||||||
|             break; |  | ||||||
|         case HAND: |  | ||||||
|             equipment.setItemInMainHand(itemStack); |  | ||||||
|             break; |  | ||||||
|         case HEAD: |  | ||||||
|             equipment.setHelmet(itemStack); |  | ||||||
|             break; |  | ||||||
|         case LEGS: |  | ||||||
|             equipment.setLeggings(itemStack); |  | ||||||
|             break; |  | ||||||
|         case OFF_HAND: |  | ||||||
|             equipment.setItemInOffHand(itemStack); |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public ItemStack getItemStack(EquipmentSlot slot) |  | ||||||
|     { |  | ||||||
|         if (equipment == null) |  | ||||||
|             return null; |  | ||||||
|  |  | ||||||
|         switch (slot) |  | ||||||
|         { |  | ||||||
|         case CHEST: |  | ||||||
|             return equipment.getChestplate(); |  | ||||||
|         case FEET: |  | ||||||
|             return equipment.getBoots(); |  | ||||||
|         case HAND: |  | ||||||
|             return equipment.getItemInMainHand(); |  | ||||||
|         case HEAD: |  | ||||||
|             return equipment.getHelmet(); |  | ||||||
|         case LEGS: |  | ||||||
|             return equipment.getLeggings(); |  | ||||||
|         case OFF_HAND: |  | ||||||
|             return equipment.getItemInOffHand(); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         return null; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setRightClicking(boolean setRightClicking) |     public void setRightClicking(boolean setRightClicking) | ||||||
|     { |     { | ||||||
|         setEntityFlag(4, setRightClicking); |         setEntityFlag(4, setRightClicking); | ||||||
|         sendData(0); |         sendData(FlagType.ENTITY_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setSneaking(boolean setSneaking) |     public void setSneaking(boolean setSneaking) | ||||||
|     { |     { | ||||||
|         setEntityFlag(1, setSneaking); |         setEntityFlag(1, setSneaking); | ||||||
|         sendData(0); |         sendData(FlagType.ENTITY_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setSprinting(boolean setSprinting) |     public void setSprinting(boolean setSprinting) | ||||||
|     { |     { | ||||||
|         setEntityFlag(3, setSprinting); |         setEntityFlag(3, setSprinting); | ||||||
|         sendData(0); |         sendData(FlagType.ENTITY_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected void setValue(int id, Object value) |     protected <Y> void setValue(FlagType<Y> id, Y value) | ||||||
|     { |     { | ||||||
|         entityValues.put(id, value); |         entityValues.put(id, value); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,6 @@ package me.libraryaddict.disguise.disguisetypes; | |||||||
|  |  | ||||||
| public enum RabbitType | public enum RabbitType | ||||||
| { | { | ||||||
|  |  | ||||||
|     BLACK(2), BROWN(0), GOLD(4), KILLER_BUNNY(99), PATCHES(3), PEPPER(5), WHITE(1); |     BLACK(2), BROWN(0), GOLD(4), KILLER_BUNNY(99), PATCHES(3), PEPPER(5), WHITE(1); | ||||||
|  |  | ||||||
|     public static RabbitType getType(int id) |     public static RabbitType getType(int id) | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class AgeableWatcher extends LivingWatcher | public class AgeableWatcher extends LivingWatcher | ||||||
| { | { | ||||||
| @@ -17,7 +18,7 @@ public class AgeableWatcher extends LivingWatcher | |||||||
|  |  | ||||||
|     public boolean isBaby() |     public boolean isBaby() | ||||||
|     { |     { | ||||||
|         return (boolean) getValue(11, false); |         return getValue(FlagType.AGEABLE_BABY); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setAdult() |     public void setAdult() | ||||||
| @@ -32,8 +33,8 @@ public class AgeableWatcher extends LivingWatcher | |||||||
|  |  | ||||||
|     public void setBaby(boolean isBaby) |     public void setBaby(boolean isBaby) | ||||||
|     { |     { | ||||||
|         setValue(11, isBaby); |         setValue(FlagType.AGEABLE_BABY, isBaby); | ||||||
|         sendData(11); |         sendData(FlagType.AGEABLE_BABY); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,48 +3,58 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | |||||||
| import java.awt.Color; | import java.awt.Color; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @author Navid |  * @author Navid | ||||||
|  */ |  */ | ||||||
| public class AreaEffectCloudWatcher extends FlagWatcher { | public class AreaEffectCloudWatcher extends FlagWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public AreaEffectCloudWatcher(Disguise disguise) { |     public AreaEffectCloudWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public float getRadius() { |     public float getRadius() | ||||||
|         return (float) getValue(5, 0f); |     { | ||||||
|  |         return getValue(FlagType.AREA_EFFECT_RADIUS); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int getColor() { |     public int getColor() | ||||||
|         return (int) getValue(6, Color.BLACK.getRGB()); |     { | ||||||
|  |         return getValue(FlagType.AREA_EFFECT_COLOR); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isIgnoreRadius() { |     public boolean isIgnoreRadius() | ||||||
|         return (boolean) getValue(7, false); |     { | ||||||
|  |         return getValue(FlagType.AREA_EFFECT_IGNORE_RADIUS); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int getParticleId() { |     public int getParticleId() | ||||||
|         return (int) getValue(8, 0); |     { | ||||||
|  |         return getValue(FlagType.AREA_EFFECT_PARTICLE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setRadius(float radius) { |     public void setRadius(float radius) | ||||||
|         setValue(5, radius); |     { | ||||||
|  |         setValue(FlagType.AREA_EFFECT_RADIUS, radius); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setColor(int color) { |     public void setColor(int color) | ||||||
|         setValue(6, color); |     { | ||||||
|  |         setValue(FlagType.AREA_EFFECT_COLOR, color); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setIgnoreRadius(boolean ignore) { |     public void setIgnoreRadius(boolean ignore) | ||||||
|         setValue(7, ignore); |     { | ||||||
|  |         setValue(FlagType.AREA_EFFECT_IGNORE_RADIUS, ignore); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setParticleId(int particleId) { |     public void setParticleId(int particleId) | ||||||
|         setValue(8, particleId); |     { | ||||||
|  |         setValue(FlagType.AREA_EFFECT_PARTICLE, particleId); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class ArmorStandWatcher extends LivingWatcher | public class ArmorStandWatcher extends LivingWatcher | ||||||
| { | { | ||||||
| @@ -12,7 +13,7 @@ public class ArmorStandWatcher extends LivingWatcher | |||||||
|  |  | ||||||
|     private boolean getArmorStandFlag(int value) |     private boolean getArmorStandFlag(int value) | ||||||
|     { |     { | ||||||
|         return (getValue(10, 0) & value) != 0; |         return (getValue(FlagType.ARMORSTAND_META) & value) != 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isNoBasePlate() |     public boolean isNoBasePlate() | ||||||
| @@ -42,7 +43,8 @@ public class ArmorStandWatcher extends LivingWatcher | |||||||
|  |  | ||||||
|     private void setArmorStandFlag(int value, boolean isTrue) |     private void setArmorStandFlag(int value, boolean isTrue) | ||||||
|     { |     { | ||||||
|         byte b1 = (byte) getValue(10, (byte) 0); |         byte b1 = (byte) getValue(FlagType.ARMORSTAND_META); | ||||||
|  |  | ||||||
|         if (isTrue) |         if (isTrue) | ||||||
|         { |         { | ||||||
|             b1 = (byte) (b1 | value); |             b1 = (byte) (b1 | value); | ||||||
| @@ -51,38 +53,39 @@ public class ArmorStandWatcher extends LivingWatcher | |||||||
|         { |         { | ||||||
|             b1 = (byte) (b1 & value); |             b1 = (byte) (b1 & value); | ||||||
|         } |         } | ||||||
|         setValue(10, b1); |  | ||||||
|         sendData(10); |         setValue(FlagType.ARMORSTAND_META, b1); | ||||||
|  |         sendData(FlagType.ARMORSTAND_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setNoBasePlate(boolean noBasePlate) |     public void setNoBasePlate(boolean noBasePlate) | ||||||
|     { |     { | ||||||
|         setArmorStandFlag(8, noBasePlate); |         setArmorStandFlag(8, noBasePlate); | ||||||
|         sendData(10); |         sendData(FlagType.ARMORSTAND_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setNoGravity(boolean noGravity) |     public void setNoGravity(boolean noGravity) | ||||||
|     { |     { | ||||||
|         setArmorStandFlag(2, noGravity); |         setArmorStandFlag(2, noGravity); | ||||||
|         sendData(10); |         sendData(FlagType.ARMORSTAND_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setShowArms(boolean showArms) |     public void setShowArms(boolean showArms) | ||||||
|     { |     { | ||||||
|         setArmorStandFlag(4, showArms); |         setArmorStandFlag(4, showArms); | ||||||
|         sendData(10); |         sendData(FlagType.ARMORSTAND_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setSmall(boolean isSmall) |     public void setSmall(boolean isSmall) | ||||||
|     { |     { | ||||||
|         setArmorStandFlag(1, isSmall); |         setArmorStandFlag(1, isSmall); | ||||||
|         sendData(10); |         sendData(FlagType.ARMORSTAND_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setMarker(boolean isMarker) |     public void setMarker(boolean isMarker) | ||||||
|     { |     { | ||||||
|         setArmorStandFlag(10, isMarker); |         setArmorStandFlag(10, isMarker); | ||||||
|         sendData(10); |         sendData(FlagType.ARMORSTAND_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,21 +1,26 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
|  |  | ||||||
| public class ArrowWatcher extends FlagWatcher { | public class ArrowWatcher extends FlagWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public ArrowWatcher(Disguise disguise) { |     public ArrowWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isCritical() { |     public boolean isCritical() | ||||||
|         return (byte) getValue(5, (byte) 0) == 1; |     { | ||||||
|  |         return (byte) getValue(FlagType.ARROW_CRITICAL) == 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setCritical(boolean critical) { |     public void setCritical(boolean critical) | ||||||
|         setValue(5, (byte) (critical ? 1 : 0)); |     { | ||||||
|         sendData(5); |         setValue(FlagType.ARROW_CRITICAL, (byte) (critical ? 1 : 0)); | ||||||
|  |         sendData(FlagType.ARROW_CRITICAL); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,20 +1,26 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class BatWatcher extends LivingWatcher { | public class BatWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public BatWatcher(Disguise disguise) { |     public BatWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|  |  | ||||||
|         setHanging(false); |         setHanging(false); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isHanging() { |     public boolean isHanging() | ||||||
|         return ((byte)getValue(11, (byte) 1)) == 1; |     { | ||||||
|  |         return ((byte) getValue(FlagType.BAT_HANGING)) == 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setHanging(boolean hanging) { |     public void setHanging(boolean hanging) | ||||||
|         setValue(11, hanging ? (byte) 1 : (byte) 0); |     { | ||||||
|         sendData(11); |         setValue(FlagType.BAT_HANGING, hanging ? (byte) 1 : (byte) 0); | ||||||
|  |         sendData(FlagType.BAT_HANGING); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class BlazeWatcher extends LivingWatcher | public class BlazeWatcher extends LivingWatcher | ||||||
| { | { | ||||||
| @@ -11,13 +12,13 @@ public class BlazeWatcher extends LivingWatcher | |||||||
|  |  | ||||||
|     public boolean isBlazing() |     public boolean isBlazing() | ||||||
|     { |     { | ||||||
|         return (boolean) getValue(11, false); |         return getValue(FlagType.BLAZE_BLAZING); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setBlazing(boolean isBlazing) |     public void setBlazing(boolean isBlazing) | ||||||
|     { |     { | ||||||
|         setValue(11, isBlazing); |         setValue(FlagType.BLAZE_BLAZING, isBlazing); | ||||||
|         sendData(11); |         sendData(FlagType.BLAZE_BLAZING); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
|  |  | ||||||
| public class BoatWatcher extends FlagWatcher | public class BoatWatcher extends FlagWatcher | ||||||
| @@ -15,13 +16,13 @@ public class BoatWatcher extends FlagWatcher | |||||||
|  |  | ||||||
|     public float getDamage() |     public float getDamage() | ||||||
|     { |     { | ||||||
|         return getValue(7, 40F); |         return getValue(FlagType.BOAT_DAMAGE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setDamage(float dmg) |     public void setDamage(float dmg) | ||||||
|     { |     { | ||||||
|         setValue(7, dmg); |         setValue(FlagType.BOAT_DAMAGE, dmg); | ||||||
|         sendData(7); |         sendData(FlagType.BOAT_DAMAGE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,29 +1,36 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class CreeperWatcher extends LivingWatcher { | public class CreeperWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public CreeperWatcher(Disguise disguise) { |     public CreeperWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isIgnited() { |     public boolean isIgnited() | ||||||
|         return (boolean) getValue(13, false); |     { | ||||||
|  |         return (boolean) getValue(FlagType.CREEPER_IGNITED); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isPowered() { |     public boolean isPowered() | ||||||
|         return (boolean) getValue(12, false); |     { | ||||||
|  |         return (boolean) getValue(FlagType.CREEPER_POWERED); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setIgnited(boolean ignited) { |     public void setIgnited(boolean ignited) | ||||||
|         setValue(13, ignited); |     { | ||||||
|         sendData(13); |         setValue(FlagType.CREEPER_IGNITED, ignited); | ||||||
|  |         sendData(FlagType.CREEPER_IGNITED); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setPowered(boolean powered) { |     public void setPowered(boolean powered) | ||||||
|         setValue(12, powered); |     { | ||||||
|         sendData(12); |         setValue(FlagType.CREEPER_POWERED, powered); | ||||||
|  |         sendData(FlagType.CREEPER_POWERED); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,23 +1,29 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
|  | import org.bukkit.Material; | ||||||
| import org.bukkit.inventory.ItemStack; | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
|  |  | ||||||
| //TODO: Add support for custom items instead of just stone | //TODO: Add support for custom items instead of just stone | ||||||
| public class DroppedItemWatcher extends FlagWatcher { | public class DroppedItemWatcher extends FlagWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public DroppedItemWatcher(Disguise disguise) { |     public DroppedItemWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public ItemStack getItemStack() { |     public ItemStack getItemStack() | ||||||
|         return (ItemStack) getValue(5, new ItemStack(1)); |     { | ||||||
|  |         return getValue(FlagType.DROPPED_ITEM); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setItemStack(ItemStack item) { |     public void setItemStack(ItemStack item) | ||||||
|         setValue(5, item); |     { | ||||||
|         sendData(5); |         setValue(FlagType.DROPPED_ITEM, item); | ||||||
|  |         sendData(FlagType.DROPPED_ITEM); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ import com.comphenix.protocol.wrappers.BlockPosition; | |||||||
| import com.google.common.base.Optional; | import com.google.common.base.Optional; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -18,24 +19,24 @@ public class EnderCrystalWatcher extends FlagWatcher | |||||||
|  |  | ||||||
|     public void setBeamTarget(BlockPosition position) |     public void setBeamTarget(BlockPosition position) | ||||||
|     { |     { | ||||||
|         setValue(5, Optional.of(position)); |         setValue(FlagType.ENDER_CRYSTAL_BEAM, Optional.of(position)); | ||||||
|         sendData(5); |         sendData(FlagType.ENDER_CRYSTAL_BEAM); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Optional<BlockPosition> getBeamTarget() |     public Optional<BlockPosition> getBeamTarget() | ||||||
|     { |     { | ||||||
|         return (Optional) getValue(5, Optional.absent()); |         return getValue(FlagType.ENDER_CRYSTAL_BEAM); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setShowBottom(boolean bool) |     public void setShowBottom(boolean bool) | ||||||
|     { |     { | ||||||
|         setValue(6, bool); |         setValue(FlagType.ENDER_CRYSTAL_PLATE, bool); | ||||||
|         sendData(6); |         sendData(FlagType.ENDER_CRYSTAL_PLATE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isShowBottom() |     public boolean isShowBottom() | ||||||
|     { |     { | ||||||
|         return (boolean) getValue(6, false); |         return getValue(FlagType.ENDER_CRYSTAL_PLATE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,22 +1,27 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @author Navid |  * @author Navid | ||||||
|  */ |  */ | ||||||
| public class EnderDragonWatcher extends LivingWatcher { | public class EnderDragonWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public EnderDragonWatcher(Disguise disguise) { |     public EnderDragonWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int getPhase() { |     public int getPhase() | ||||||
|         return (int) getValue(11, 0); |     { | ||||||
|  |         return getValue(FlagType.ENDERDRAGON_PHASE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setPhase(int phase) { |     public void setPhase(int phase) | ||||||
|         setValue(11, phase); |     { | ||||||
|         sendData(11); |         setValue(FlagType.ENDERDRAGON_PHASE, phase); | ||||||
|  |         sendData(FlagType.ENDERDRAGON_PHASE); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,48 +6,63 @@ import org.bukkit.inventory.ItemStack; | |||||||
| import com.google.common.base.Optional; | import com.google.common.base.Optional; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||||
|  |  | ||||||
| public class EndermanWatcher extends LivingWatcher { | public class EndermanWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public EndermanWatcher(Disguise disguise) { |     public EndermanWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public ItemStack getItemInMainHand() { |     public ItemStack getItemInMainHand() | ||||||
|         Optional<Integer> value = (Optional<Integer>) getValue(11, Optional.of(1)); |     { | ||||||
|         if (value.isPresent()) { |         Optional<Integer> value = getValue(FlagType.ENDERMAN_ITEM); | ||||||
|  |  | ||||||
|  |         if (value.isPresent()) | ||||||
|  |         { | ||||||
|             Pair<Integer, Integer> pair = ReflectionManager.getFromCombinedId(value.get()); |             Pair<Integer, Integer> pair = ReflectionManager.getFromCombinedId(value.get()); | ||||||
|             int id = pair.getLeft(); |             int id = pair.getLeft(); | ||||||
|             int data = pair.getRight(); |             int data = pair.getRight(); | ||||||
|  |  | ||||||
|             return new ItemStack(id, 1, (short) data); |             return new ItemStack(id, 1, (short) data); | ||||||
|         } else { |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void setItemInMainHand(ItemStack itemstack) { |     public void setItemInMainHand(ItemStack itemstack) | ||||||
|  |     { | ||||||
|         setItemInMainHand(itemstack.getTypeId(), itemstack.getDurability()); |         setItemInMainHand(itemstack.getTypeId(), itemstack.getDurability()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setItemInMainHand(int typeId) { |     public void setItemInMainHand(int typeId) | ||||||
|  |     { | ||||||
|         setItemInMainHand(typeId, 0); |         setItemInMainHand(typeId, 0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setItemInMainHand(int typeId, int data) { |     public void setItemInMainHand(int typeId, int data) | ||||||
|  |     { | ||||||
|         int combined = ReflectionManager.getCombinedId(typeId, data); |         int combined = ReflectionManager.getCombinedId(typeId, data); | ||||||
|         setValue(11, Optional.of(combined)); |  | ||||||
|  |         setValue(FlagType.ENDERMAN_ITEM, Optional.of(combined)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isAggressive() { |     public boolean isAggressive() | ||||||
|         return (boolean) getValue(12, false); |     { | ||||||
|  |         return getValue(FlagType.ENDERMAN_AGRESSIVE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setAggressive(boolean isAggressive) { |     public void setAggressive(boolean isAggressive) | ||||||
|         setValue(12, isAggressive); |     { | ||||||
|         sendData(12); |         setValue(FlagType.ENDERMAN_AGRESSIVE, isAggressive); | ||||||
|  |         sendData(FlagType.ENDERMAN_AGRESSIVE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,31 +8,40 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | |||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  |  | ||||||
| public class FallingBlockWatcher extends FlagWatcher { | public class FallingBlockWatcher extends FlagWatcher | ||||||
|  | { | ||||||
|     private ItemStack block; |     private ItemStack block; | ||||||
|  |  | ||||||
|     public FallingBlockWatcher(Disguise disguise) { |     public FallingBlockWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public FallingBlockWatcher clone(Disguise disguise) { |     public FallingBlockWatcher clone(Disguise disguise) | ||||||
|  |     { | ||||||
|         FallingBlockWatcher watcher = (FallingBlockWatcher) super.clone(disguise); |         FallingBlockWatcher watcher = (FallingBlockWatcher) super.clone(disguise); | ||||||
|         watcher.setBlock(getBlock()); |         watcher.setBlock(getBlock()); | ||||||
|  |  | ||||||
|         return watcher; |         return watcher; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public ItemStack getBlock() { |     public ItemStack getBlock() | ||||||
|  |     { | ||||||
|         return block; |         return block; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setBlock(ItemStack block) { |     public void setBlock(ItemStack block) | ||||||
|  |     { | ||||||
|         this.block = block; |         this.block = block; | ||||||
|         if (block.getType() == null || block.getType() == Material.AIR) { |  | ||||||
|  |         if (block.getType() == null || block.getType() == Material.AIR) | ||||||
|  |         { | ||||||
|             block.setType(Material.STONE); |             block.setType(Material.STONE); | ||||||
|         } |         } | ||||||
|         if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) { |  | ||||||
|  |         if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) | ||||||
|  |         { | ||||||
|             DisguiseUtilities.refreshTrackers(getDisguise()); |             DisguiseUtilities.refreshTrackers(getDisguise()); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,20 +1,25 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class GhastWatcher extends LivingWatcher { | public class GhastWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public GhastWatcher(Disguise disguise) { |     public GhastWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isAggressive() { |     public boolean isAggressive() | ||||||
|         return (boolean) getValue(11, false); |     { | ||||||
|  |         return getValue(FlagType.GHAST_AGRESSIVE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setAggressive(boolean isAggressive) { |     public void setAggressive(boolean isAggressive) | ||||||
|         setValue(11, isAggressive); |     { | ||||||
|         sendData(11); |         setValue(FlagType.GHAST_AGRESSIVE, isAggressive); | ||||||
|  |         sendData(FlagType.GHAST_AGRESSIVE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,72 +1,101 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import org.bukkit.Bukkit; | import org.bukkit.Bukkit; | ||||||
|  | import org.bukkit.entity.Entity; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class GuardianWatcher extends LivingWatcher { | public class GuardianWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public GuardianWatcher(Disguise disguise) { |     public GuardianWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Is this guardian targetting someone? |      * Is this guardian targetting someone? | ||||||
|  |      *  | ||||||
|      * @return |      * @return | ||||||
|      */ |      */ | ||||||
|     public boolean isTarget() { |     public boolean isTarget() | ||||||
|         return ((int)getValue(12, 0)) != 0; |     { | ||||||
|  |         return ((int) getValue(FlagType.GUARDIAN_TARGET)) != 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Shoot a beam at the given entityId. |      * Shoot a beam at the given entityId. | ||||||
|  |      *  | ||||||
|      * @param entityId |      * @param entityId | ||||||
|      */ |      */ | ||||||
|     public void setTarget(int entityId) { |     public void setTarget(int entityId) | ||||||
|         setValue(12, entityId); |     { | ||||||
|         sendData(12); |         setValue(FlagType.GUARDIAN_TARGET, entityId); | ||||||
|  |         sendData(FlagType.GUARDIAN_TARGET); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setTarget(Entity entity) | ||||||
|  |     { | ||||||
|  |         setTarget(entity == null ? 0 : entity.getEntityId()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Shoot a beam at the given player name. |      * Shoot a beam at the given player name. | ||||||
|  |      *  | ||||||
|      * @param playername |      * @param playername | ||||||
|      */ |      */ | ||||||
|     public void setTarget(String playername) { |     public void setTarget(String playername) | ||||||
|  |     { | ||||||
|         Player player = Bukkit.getPlayer(playername); |         Player player = Bukkit.getPlayer(playername); | ||||||
|         if (player == null) return; |  | ||||||
|         setValue(12, player.getEntityId()); |         if (player == null) | ||||||
|         sendData(12); |             return; | ||||||
|  |  | ||||||
|  |         setValue(FlagType.GUARDIAN_TARGET, player.getEntityId()); | ||||||
|  |         sendData(FlagType.GUARDIAN_TARGET); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isRetractingSpikes() { |     public boolean isRetractingSpikes() | ||||||
|  |     { | ||||||
|         return isGuardianFlag(2); |         return isGuardianFlag(2); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setRetractingSpikes(boolean isRetracting) { |     public void setRetractingSpikes(boolean isRetracting) | ||||||
|  |     { | ||||||
|         setGuardianFlag(2, isRetracting); |         setGuardianFlag(2, isRetracting); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isElder() { |     public boolean isElder() | ||||||
|  |     { | ||||||
|         return isGuardianFlag(4); |         return isGuardianFlag(4); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setElder(boolean isGuardian) { |     public void setElder(boolean isGuardian) | ||||||
|  |     { | ||||||
|         setGuardianFlag(4, isGuardian); |         setGuardianFlag(4, isGuardian); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected boolean isGuardianFlag(int no) { |     protected boolean isGuardianFlag(int no) | ||||||
|         return ((byte) getValue(11, (byte) 0) & no) != 0; |     { | ||||||
|  |         return (getValue(FlagType.GUARDIAN_FLAG) & no) != 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected void setGuardianFlag(int no, boolean flag) { |     protected void setGuardianFlag(int no, boolean flag) | ||||||
|         byte b0 = (byte) getValue(11, (byte) 0); |     { | ||||||
|         if (flag) { |         byte b0 = getValue(FlagType.GUARDIAN_FLAG); | ||||||
|             setValue(11, (byte) (b0 | no)); |  | ||||||
|         } else { |         if (flag) | ||||||
|             setValue(11, (byte) (b0 & -(no + 1))); |         { | ||||||
|  |             setValue(FlagType.GUARDIAN_FLAG, (byte) (b0 | no)); | ||||||
|         } |         } | ||||||
|         sendData(11); |         else | ||||||
|  |         { | ||||||
|  |             setValue(FlagType.GUARDIAN_FLAG, (byte) (b0 & -(no + 1))); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         sendData(FlagType.GUARDIAN_FLAG); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ import org.bukkit.inventory.ItemStack; | |||||||
| import com.google.common.base.Optional; | import com.google.common.base.Optional; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  |  | ||||||
| public class HorseWatcher extends AgeableWatcher | public class HorseWatcher extends AgeableWatcher | ||||||
| @@ -19,13 +20,14 @@ public class HorseWatcher extends AgeableWatcher | |||||||
|     public HorseWatcher(Disguise disguise) |     public HorseWatcher(Disguise disguise) | ||||||
|     { |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|  |  | ||||||
|         setStyle(Style.values()[DisguiseUtilities.random.nextInt(Style.values().length)]); |         setStyle(Style.values()[DisguiseUtilities.random.nextInt(Style.values().length)]); | ||||||
|         setColor(Color.values()[DisguiseUtilities.random.nextInt(Color.values().length)]); |         setColor(Color.values()[DisguiseUtilities.random.nextInt(Color.values().length)]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Variant getVariant() |     public Variant getVariant() | ||||||
|     { |     { | ||||||
|         return Variant.values()[(int) getValue(13, 0)]; |         return Variant.values()[getValue(FlagType.HORSE_VARIANT)]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setVariant(Variant variant) |     public void setVariant(Variant variant) | ||||||
| @@ -39,45 +41,48 @@ public class HorseWatcher extends AgeableWatcher | |||||||
|         { |         { | ||||||
|             variant = 0; // Crashing people is mean |             variant = 0; // Crashing people is mean | ||||||
|         } |         } | ||||||
|         setValue(13, variant); |  | ||||||
|         sendData(13); |         setValue(FlagType.HORSE_VARIANT, variant); | ||||||
|  |         sendData(FlagType.HORSE_VARIANT); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Color getColor() |     public Color getColor() | ||||||
|     { |     { | ||||||
|         return Color.values()[((Integer) getValue(14, 0) & 0xFF)]; |         return Color.values()[((Integer) getValue(FlagType.HORSE_COLOR) & 0xFF)]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public ItemStack getHorseArmor() |     public ItemStack getHorseArmor() | ||||||
|     { |     { | ||||||
|         int horseValue = getHorseArmorAsInt(); |         int horseValue = getHorseArmorAsInt(); | ||||||
|  |  | ||||||
|         switch (horseValue) |         switch (horseValue) | ||||||
|         { |         { | ||||||
|         case 1: |         case 1: | ||||||
|             return new ItemStack(Material.getMaterial("IRON_BARDING")); |             return new ItemStack(Material.IRON_BARDING); | ||||||
|         case 2: |         case 2: | ||||||
|             return new ItemStack(Material.getMaterial("GOLD_BARDING")); |             return new ItemStack(Material.GOLD_BARDING); | ||||||
|         case 3: |         case 3: | ||||||
|             return new ItemStack(Material.getMaterial("DIAMOND_BARDING")); |             return new ItemStack(Material.DIAMOND_BARDING); | ||||||
|         default: |         default: | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected int getHorseArmorAsInt() |     protected int getHorseArmorAsInt() | ||||||
|     { |     { | ||||||
|         return (int) getValue(16, 0); |         return getValue(FlagType.HORSE_ARMOR); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Optional<UUID> getOwner() |     public Optional<UUID> getOwner() | ||||||
|     { |     { | ||||||
|         return getValue(15, Optional.<UUID> absent()); |         return getValue(FlagType.HORSE_OWNER); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Style getStyle() |     public Style getStyle() | ||||||
|     { |     { | ||||||
|         return Style.values()[((int) getValue(14, 0) >>> 8)]; |         return Style.values()[(getValue(FlagType.HORSE_STYLE) >>> 8)]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean hasChest() |     public boolean hasChest() | ||||||
| @@ -122,7 +127,7 @@ public class HorseWatcher extends AgeableWatcher | |||||||
|  |  | ||||||
|     private byte getHorseFlag() |     private byte getHorseFlag() | ||||||
|     { |     { | ||||||
|         return (byte) getValue(12, (byte) 0); |         return getValue(FlagType.HORSE_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setCanBreed(boolean breed) |     public void setCanBreed(boolean breed) | ||||||
| @@ -137,22 +142,24 @@ public class HorseWatcher extends AgeableWatcher | |||||||
|  |  | ||||||
|     public void setColor(Color color) |     public void setColor(Color color) | ||||||
|     { |     { | ||||||
|         setValue(14, color.ordinal() & 0xFF | getStyle().ordinal() << 8); |         setValue(FlagType.HORSE_COLOR, color.ordinal() & 0xFF | getStyle().ordinal() << 8); | ||||||
|         sendData(14); |         sendData(FlagType.HORSE_COLOR); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void setHorseFlag(int i, boolean flag) |     private void setHorseFlag(int i, boolean flag) | ||||||
|     { |     { | ||||||
|         byte j = (byte) getValue(12, (byte) 0); |         byte j = getValue(FlagType.HORSE_META); | ||||||
|  |  | ||||||
|         if (flag) |         if (flag) | ||||||
|         { |         { | ||||||
|             setValue(12, (byte) (j | i)); |             setValue(FlagType.HORSE_META, (byte) (j | i)); | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             setValue(12, (byte) (j & ~i)); |             setValue(FlagType.HORSE_META, (byte) (j & ~i)); | ||||||
|         } |         } | ||||||
|         sendData(12); |  | ||||||
|  |         sendData(FlagType.HORSE_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setGrazing(boolean grazing) |     public void setGrazing(boolean grazing) | ||||||
| @@ -162,16 +169,18 @@ public class HorseWatcher extends AgeableWatcher | |||||||
|  |  | ||||||
|     protected void setHorseArmor(int armor) |     protected void setHorseArmor(int armor) | ||||||
|     { |     { | ||||||
|         setValue(16, armor); |         setValue(FlagType.HORSE_ARMOR, armor); | ||||||
|         sendData(16); |         sendData(FlagType.HORSE_ARMOR); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setHorseArmor(ItemStack item) |     public void setHorseArmor(ItemStack item) | ||||||
|     { |     { | ||||||
|         int value = 0; |         int value = 0; | ||||||
|  |  | ||||||
|         if (item != null) |         if (item != null) | ||||||
|         { |         { | ||||||
|             Material mat = item.getType(); |             Material mat = item.getType(); | ||||||
|  |  | ||||||
|             if (mat == Material.IRON_BARDING) |             if (mat == Material.IRON_BARDING) | ||||||
|             { |             { | ||||||
|                 value = 1; |                 value = 1; | ||||||
| @@ -185,6 +194,7 @@ public class HorseWatcher extends AgeableWatcher | |||||||
|                 value = 3; |                 value = 3; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         setHorseArmor(value); |         setHorseArmor(value); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -195,8 +205,8 @@ public class HorseWatcher extends AgeableWatcher | |||||||
|  |  | ||||||
|     public void setOwner(UUID uuid) |     public void setOwner(UUID uuid) | ||||||
|     { |     { | ||||||
|         setValue(15, Optional.of(uuid)); |         setValue(FlagType.HORSE_OWNER, Optional.of(uuid)); | ||||||
|         sendData(15); |         sendData(FlagType.HORSE_OWNER); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setRearing(boolean rear) |     public void setRearing(boolean rear) | ||||||
| @@ -211,8 +221,8 @@ public class HorseWatcher extends AgeableWatcher | |||||||
|  |  | ||||||
|     public void setStyle(Style style) |     public void setStyle(Style style) | ||||||
|     { |     { | ||||||
|         setValue(14, getColor().ordinal() & 0xFF | style.ordinal() << 8); |         setValue(FlagType.HORSE_STYLE, getColor().ordinal() & 0xFF | style.ordinal() << 8); | ||||||
|         sendData(14); |         sendData(FlagType.HORSE_STYLE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setTamed(boolean tamed) |     public void setTamed(boolean tamed) | ||||||
|   | |||||||
| @@ -0,0 +1,63 @@ | |||||||
|  | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
|  | public class InsentientWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |     public InsentientWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|  |         super(disguise); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setLeftHanded(boolean leftHanded) | ||||||
|  |     { | ||||||
|  |         setRightHanded(!leftHanded); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setRightHanded(boolean rightHanded) | ||||||
|  |     { | ||||||
|  |         setInsentientFlag(2, rightHanded); | ||||||
|  |         sendData(FlagType.INSENTIENT_META); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isRightHanded() | ||||||
|  |     { | ||||||
|  |         return getInsentientFlag(2); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isLeftHanded() | ||||||
|  |     { | ||||||
|  |         return !isRightHanded(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean isAI() | ||||||
|  |     { | ||||||
|  |         return getInsentientFlag(1); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setAI(boolean ai) | ||||||
|  |     { | ||||||
|  |         setInsentientFlag(1, ai); | ||||||
|  |         sendData(FlagType.INSENTIENT_META); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void setInsentientFlag(int i, boolean flag) | ||||||
|  |     { | ||||||
|  |         byte b0 = (byte) getValue(FlagType.INSENTIENT_META); | ||||||
|  |  | ||||||
|  |         if (flag) | ||||||
|  |         { | ||||||
|  |             setValue(FlagType.INSENTIENT_META, (byte) (b0 | 1 << i)); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             setValue(FlagType.INSENTIENT_META, (byte) (b0 & (~1 << i))); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private boolean getInsentientFlag(int i) | ||||||
|  |     { | ||||||
|  |         return ((byte) getValue(FlagType.PLAYER_SKIN) & 1 << i) != 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,40 +1,53 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
|  | import org.bukkit.Material; | ||||||
| import org.bukkit.inventory.ItemStack; | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
|  |  | ||||||
| public class ItemFrameWatcher extends FlagWatcher { | public class ItemFrameWatcher extends FlagWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public ItemFrameWatcher(Disguise disguise) { |     public ItemFrameWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public ItemStack getItem() { |     public ItemStack getItem() | ||||||
|         if (getValue(5, null) == null) { |     { | ||||||
|             return new ItemStack(0); |         if (getValue(FlagType.ITEMFRAME_ITEM) == null) | ||||||
|  |         { | ||||||
|  |             return new ItemStack(Material.AIR); | ||||||
|         } |         } | ||||||
|         return (ItemStack) getValue(5, null); |  | ||||||
|  |         return (ItemStack) getValue(FlagType.ITEMFRAME_ITEM); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int getRotation() { |     public int getRotation() | ||||||
|         return (int) getValue(6, 0); |     { | ||||||
|  |         return getValue(FlagType.ITEMFRAME_ROTATION); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setItem(ItemStack newItem) { |     public void setItem(ItemStack newItem) | ||||||
|         if (newItem == null) { |     { | ||||||
|             newItem = new ItemStack(0); |         if (newItem == null) | ||||||
|  |         { | ||||||
|  |             newItem = new ItemStack(Material.AIR); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         newItem = newItem.clone(); |         newItem = newItem.clone(); | ||||||
|         newItem.setAmount(1); |         newItem.setAmount(1); | ||||||
|         setValue(5, newItem); |  | ||||||
|         sendData(5); |         setValue(FlagType.ITEMFRAME_ITEM, newItem); | ||||||
|  |         sendData(FlagType.ITEMFRAME_ITEM); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setRotation(int rotation) { |     public void setRotation(int rotation) | ||||||
|         setValue(6, (byte) (rotation % 4)); |     { | ||||||
|         sendData(6); |         setValue(FlagType.ITEMFRAME_ROTATION, (byte) (rotation % 4)); | ||||||
|  |         sendData(FlagType.ITEMFRAME_ROTATION); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,13 +20,13 @@ import com.comphenix.protocol.wrappers.WrappedAttribute.Builder; | |||||||
|  |  | ||||||
| import me.libraryaddict.disguise.DisguiseAPI; | import me.libraryaddict.disguise.DisguiseAPI; | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
| import me.libraryaddict.disguise.utilities.ReflectionManager; | import me.libraryaddict.disguise.utilities.ReflectionManager; | ||||||
|  |  | ||||||
| public class LivingWatcher extends FlagWatcher | public class LivingWatcher extends FlagWatcher | ||||||
| { | { | ||||||
|  |  | ||||||
|     static Map<Integer, Object> list = new HashMap<>(); |     static Map<Integer, Object> list = new HashMap<>(); | ||||||
|     static Method getId; |     static Method getId; | ||||||
|  |  | ||||||
| @@ -36,6 +36,7 @@ public class LivingWatcher extends FlagWatcher | |||||||
|         { |         { | ||||||
|             getId = ReflectionManager.getNmsMethod("MobEffectList", "getId", ReflectionManager.getNmsClass("MobEffectList")); |             getId = ReflectionManager.getNmsMethod("MobEffectList", "getId", ReflectionManager.getNmsClass("MobEffectList")); | ||||||
|             Object REGISTRY = ReflectionManager.getNmsField("MobEffectList", "REGISTRY").get(null); |             Object REGISTRY = ReflectionManager.getNmsField("MobEffectList", "REGISTRY").get(null); | ||||||
|  |  | ||||||
|             for (Object next : ((Iterable) REGISTRY)) |             for (Object next : ((Iterable) REGISTRY)) | ||||||
|             { |             { | ||||||
|                 int id = (int) getId.invoke(null, next); |                 int id = (int) getId.invoke(null, next); | ||||||
| @@ -81,7 +82,7 @@ public class LivingWatcher extends FlagWatcher | |||||||
|  |  | ||||||
|     public float getHealth() |     public float getHealth() | ||||||
|     { |     { | ||||||
|         return (float) getValue(6, 0F); |         return (float) getValue(FlagType.LIVING_HEALTH); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public double getMaxHealth() |     public double getMaxHealth() | ||||||
| @@ -91,7 +92,7 @@ public class LivingWatcher extends FlagWatcher | |||||||
|  |  | ||||||
|     public boolean isPotionParticlesAmbient() |     public boolean isPotionParticlesAmbient() | ||||||
|     { |     { | ||||||
|         return (boolean) getValue(8, false); |         return (boolean) getValue(FlagType.LIVING_POTION_AMBIENT); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private int getPotions() |     private int getPotions() | ||||||
| @@ -151,31 +152,31 @@ public class LivingWatcher extends FlagWatcher | |||||||
|  |  | ||||||
|     public void setPotionParticlesAmbient(boolean particles) |     public void setPotionParticlesAmbient(boolean particles) | ||||||
|     { |     { | ||||||
|         setValue(8, particles); |         setValue(FlagType.LIVING_POTION_AMBIENT, particles); | ||||||
|         sendData(8); |         sendData(FlagType.LIVING_POTION_AMBIENT); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void sendPotionEffects() |     private void sendPotionEffects() | ||||||
|     { |     { | ||||||
|         setValue(7, getPotions()); |         setValue(FlagType.LIVING_POTIONS, getPotions()); | ||||||
|         sendData(7); |         sendData(FlagType.LIVING_POTIONS); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setHealth(float health) |     public void setHealth(float health) | ||||||
|     { |     { | ||||||
|         setValue(6, health); |         setValue(FlagType.LIVING_HEALTH, health); | ||||||
|         sendData(6); |         sendData(FlagType.LIVING_HEALTH); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int getArrowsSticking() |     public int getArrowsSticking() | ||||||
|     { |     { | ||||||
|         return (int) getValue(9, 0); |         return (int) getValue(FlagType.LIVING_ARROWS); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setArrowsSticking(int arrowsNo) |     public void setArrowsSticking(int arrowsNo) | ||||||
|     { |     { | ||||||
|         setValue(9, arrowsNo); |         setValue(FlagType.LIVING_ARROWS, arrowsNo); | ||||||
|         sendData(9); |         sendData(FlagType.LIVING_ARROWS); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setMaxHealth(double newHealth) |     public void setMaxHealth(double newHealth) | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | |||||||
| import org.bukkit.inventory.ItemStack; | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
|  |  | ||||||
| public class MinecartWatcher extends FlagWatcher | public class MinecartWatcher extends FlagWatcher | ||||||
| @@ -15,39 +16,42 @@ public class MinecartWatcher extends FlagWatcher | |||||||
|  |  | ||||||
|     public ItemStack getBlockInCart() |     public ItemStack getBlockInCart() | ||||||
|     { |     { | ||||||
|         int id = (int) getValue(8, 0) & 0xffff; |         int id = (int) getValue(FlagType.MINECART_BLOCK) & 0xffff; | ||||||
|         int data = (int) getValue(8, 0) >> 16; |         int data = (int) getValue(FlagType.MINECART_BLOCK) >> 16; | ||||||
|  |  | ||||||
|         return new ItemStack(id, 1, (short) data); |         return new ItemStack(id, 1, (short) data); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int getBlockYOffset() |     public int getBlockYOffset() | ||||||
|     { |     { | ||||||
|         return (int) getValue(9, 0); |         return (int) getValue(FlagType.MINECART_BLOCK_Y); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isViewBlockInCart() |     public boolean isViewBlockInCart() | ||||||
|     { |     { | ||||||
|         return (boolean) getValue(10, false); |         return (boolean) getValue(FlagType.MINECART_BLOCK_VISIBLE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setBlockInCart(ItemStack item) |     public void setBlockInCart(ItemStack item) | ||||||
|     { |     { | ||||||
|         int id = item.getTypeId(); |         int id = item.getTypeId(); | ||||||
|         int data = item.getDurability(); |         int data = item.getDurability(); | ||||||
|         setValue(8, id & 0xffff | data << 16); |  | ||||||
|         setValue(10, true); // Show block |         setValue(FlagType.MINECART_BLOCK, id & 0xffff | data << 16); | ||||||
|         sendData(8, 10); |         setValue(FlagType.MINECART_BLOCK_VISIBLE, true); // Show block | ||||||
|  |  | ||||||
|  |         sendData(FlagType.MINECART_BLOCK); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setBlockOffset(int i) |     public void setBlockOffset(int i) | ||||||
|     { |     { | ||||||
|         setValue(9, i); |         setValue(FlagType.MINECART_BLOCK_Y, i); | ||||||
|         sendData(9); |         sendData(FlagType.MINECART_BLOCK_Y); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setViewBlockInCart(boolean viewBlock) |     public void setViewBlockInCart(boolean viewBlock) | ||||||
|     { |     { | ||||||
|         setValue(10, viewBlock); |         setValue(FlagType.MINECART_BLOCK_VISIBLE, viewBlock); | ||||||
|         sendData(10); |         sendData(FlagType.MINECART_BLOCK_VISIBLE); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,19 +4,24 @@ import org.bukkit.entity.Ocelot; | |||||||
| import org.bukkit.entity.Ocelot.Type; | import org.bukkit.entity.Ocelot.Type; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class OcelotWatcher extends TameableWatcher { | public class OcelotWatcher extends TameableWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public OcelotWatcher(Disguise disguise) { |     public OcelotWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Type getType() { |     public Type getType() | ||||||
|         return Ocelot.Type.getType((int) getValue(14, 0)); |     { | ||||||
|  |         return Ocelot.Type.getType(getValue(FlagType.OCELOT_TYPE)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setType(Type newType) { |     public void setType(Type newType) | ||||||
|         setValue(14, newType.getId()); |     { | ||||||
|         sendData(14); |         setValue(FlagType.OCELOT_TYPE, newType.getId()); | ||||||
|  |         sendData(FlagType.OCELOT_TYPE); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,28 +6,36 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | |||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  |  | ||||||
| public class PaintingWatcher extends FlagWatcher { | public class PaintingWatcher extends FlagWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     private Art painting; |     private Art painting; | ||||||
|  |  | ||||||
|     public PaintingWatcher(Disguise disguise) { |     public PaintingWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public PaintingWatcher clone(Disguise disguise) { |     public PaintingWatcher clone(Disguise disguise) | ||||||
|  |     { | ||||||
|         PaintingWatcher watcher = (PaintingWatcher) super.clone(disguise); |         PaintingWatcher watcher = (PaintingWatcher) super.clone(disguise); | ||||||
|         watcher.setArt(getArt()); |         watcher.setArt(getArt()); | ||||||
|  |  | ||||||
|         return watcher; |         return watcher; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Art getArt() { |     public Art getArt() | ||||||
|  |     { | ||||||
|         return painting; |         return painting; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setArt(Art newPainting) { |     public void setArt(Art newPainting) | ||||||
|  |     { | ||||||
|         this.painting = newPainting; |         this.painting = newPainting; | ||||||
|         if (getDisguise().getEntity() != null && getDisguise().getWatcher() == this) { |  | ||||||
|  |         if (getDisguise().getEntity() != null && getDisguise().getWatcher() == this) | ||||||
|  |         { | ||||||
|             DisguiseUtilities.refreshTrackers(getDisguise()); |             DisguiseUtilities.refreshTrackers(getDisguise()); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,19 +1,24 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class PigWatcher extends AgeableWatcher { | public class PigWatcher extends AgeableWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public PigWatcher(Disguise disguise) { |     public PigWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isSaddled() { |     public boolean isSaddled() | ||||||
|         return (boolean) getValue(12, false); |     { | ||||||
|  |         return (boolean) getValue(FlagType.PIG_SADDLED); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setSaddled(boolean isSaddled) { |     public void setSaddled(boolean isSaddled) | ||||||
|         setValue(12, isSaddled); |     { | ||||||
|         sendData(12); |         setValue(FlagType.PIG_SADDLED, isSaddled); | ||||||
|  |         sendData(FlagType.PIG_SADDLED); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ import com.comphenix.protocol.wrappers.WrappedGameProfile; | |||||||
| import me.libraryaddict.disguise.DisguiseAPI; | import me.libraryaddict.disguise.DisguiseAPI; | ||||||
| import me.libraryaddict.disguise.DisguiseConfig; | import me.libraryaddict.disguise.DisguiseConfig; | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  |  | ||||||
| @@ -60,7 +61,7 @@ public class PlayerWatcher extends LivingWatcher | |||||||
|  |  | ||||||
|     private boolean isSkinFlag(int i) |     private boolean isSkinFlag(int i) | ||||||
|     { |     { | ||||||
|         return ((byte) getValue(12, (byte) 0) & 1 << i) != 0; |         return ((byte) getValue(FlagType.PLAYER_SKIN) & 1 << i) != 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isCapeEnabled() |     public boolean isCapeEnabled() | ||||||
| @@ -101,43 +102,50 @@ public class PlayerWatcher extends LivingWatcher | |||||||
|     public void setCapeEnabled(boolean enabled) |     public void setCapeEnabled(boolean enabled) | ||||||
|     { |     { | ||||||
|         setSkinFlags(1, enabled); |         setSkinFlags(1, enabled); | ||||||
|         sendData(12); |  | ||||||
|  |         sendData(FlagType.PLAYER_SKIN); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setJackedEnabled(boolean enabled) |     public void setJackedEnabled(boolean enabled) | ||||||
|     { |     { | ||||||
|         setSkinFlags(2, enabled); |         setSkinFlags(2, enabled); | ||||||
|         sendData(12); |  | ||||||
|  |         sendData(FlagType.PLAYER_SKIN); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setLeftSleeveEnabled(boolean enabled) |     public void setLeftSleeveEnabled(boolean enabled) | ||||||
|     { |     { | ||||||
|         setSkinFlags(3, enabled); |         setSkinFlags(3, enabled); | ||||||
|         sendData(12); |  | ||||||
|  |         sendData(FlagType.PLAYER_SKIN); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setRightSleeveEnabled(boolean enabled) |     public void setRightSleeveEnabled(boolean enabled) | ||||||
|     { |     { | ||||||
|         setSkinFlags(4, enabled); |         setSkinFlags(4, enabled); | ||||||
|         sendData(12); |  | ||||||
|  |         sendData(FlagType.PLAYER_SKIN); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setLeftPantsEnabled(boolean enabled) |     public void setLeftPantsEnabled(boolean enabled) | ||||||
|     { |     { | ||||||
|         setSkinFlags(5, enabled); |         setSkinFlags(5, enabled); | ||||||
|         sendData(12); |  | ||||||
|  |         sendData(FlagType.PLAYER_SKIN); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setRightPantsEnabled(boolean enabled) |     public void setRightPantsEnabled(boolean enabled) | ||||||
|     { |     { | ||||||
|         setSkinFlags(6, enabled); |         setSkinFlags(6, enabled); | ||||||
|         sendData(12); |  | ||||||
|  |         sendData(FlagType.PLAYER_SKIN); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setHatEnabled(boolean enabled) |     public void setHatEnabled(boolean enabled) | ||||||
|     { |     { | ||||||
|         setSkinFlags(7, enabled); |         setSkinFlags(7, enabled); | ||||||
|         sendData(12); |  | ||||||
|  |         sendData(FlagType.PLAYER_SKIN); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isSleeping() |     public boolean isSleeping() | ||||||
| @@ -232,14 +240,15 @@ public class PlayerWatcher extends LivingWatcher | |||||||
|  |  | ||||||
|     private void setSkinFlags(int i, boolean flag) |     private void setSkinFlags(int i, boolean flag) | ||||||
|     { |     { | ||||||
|         byte b0 = (byte) getValue(12, (byte) 0); |         byte b0 = (byte) getValue(FlagType.PLAYER_SKIN); | ||||||
|  |  | ||||||
|         if (flag) |         if (flag) | ||||||
|         { |         { | ||||||
|             setValue(12, (byte) (b0 | 1 << i)); |             setValue(FlagType.PLAYER_SKIN, (byte) (b0 | 1 << i)); | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             setValue(12, (byte) (b0 & (~1 << i))); |             setValue(FlagType.PLAYER_SKIN, (byte) (b0 & (~1 << i))); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,23 +1,28 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.RabbitType; | import me.libraryaddict.disguise.disguisetypes.RabbitType; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  |  | ||||||
| public class RabbitWatcher extends AgeableWatcher { | public class RabbitWatcher extends AgeableWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public RabbitWatcher(Disguise disguise) { |     public RabbitWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|         setType(RabbitType.values()[DisguiseUtilities.random.nextInt(RabbitType.values().length)]); |         setType(RabbitType.values()[DisguiseUtilities.random.nextInt(RabbitType.values().length)]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public RabbitType getType() { |     public RabbitType getType() | ||||||
|         return RabbitType.getType((int) getValue(18, 0)); |     { | ||||||
|  |         return RabbitType.getType((int) getValue(FlagType.RABBIT_TYPE)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setType(RabbitType type) { |     public void setType(RabbitType type) | ||||||
|         setValue(12, type.getTypeId()); |     { | ||||||
|         sendData(12); |         setValue(FlagType.RABBIT_TYPE, type.getTypeId()); | ||||||
|  |         sendData(FlagType.RABBIT_TYPE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,39 +4,54 @@ import org.bukkit.DyeColor; | |||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.AnimalColor; | import me.libraryaddict.disguise.disguisetypes.AnimalColor; | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class SheepWatcher extends AgeableWatcher { | public class SheepWatcher extends AgeableWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public SheepWatcher(Disguise disguise) { |     public SheepWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|         setValue(12, (byte) 0); |  | ||||||
|  |         setValue(FlagType.SHEEP_WOOL, (byte) 0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public AnimalColor getColor() { |     public AnimalColor getColor() | ||||||
|         return AnimalColor.getColor(((int) getValue(12, (byte) 0) & 15)); |     { | ||||||
|  |         return AnimalColor.getColor(((int) getValue(FlagType.SHEEP_WOOL) & 15)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isSheared() { |     public boolean isSheared() | ||||||
|         return ((byte) getValue(12, (byte) 0) & 16) != 0; |     { | ||||||
|  |         return ((byte) getValue(FlagType.SHEEP_WOOL) & 16) != 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setColor(AnimalColor color) { |     public void setColor(AnimalColor color) | ||||||
|  |     { | ||||||
|         setColor(DyeColor.getByWoolData((byte) color.getId())); |         setColor(DyeColor.getByWoolData((byte) color.getId())); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setColor(DyeColor color) { |     public void setColor(DyeColor color) | ||||||
|         byte b0 = (byte) getValue(12, (byte) 0); |     { | ||||||
|         setValue(12, (byte) (b0 & 240 | color.getWoolData() & 15)); |         byte b0 = (byte) getValue(FlagType.SHEEP_WOOL); | ||||||
|         sendData(12); |  | ||||||
|  |         setValue(FlagType.SHEEP_WOOL, (byte) (b0 & 240 | color.getWoolData() & 15)); | ||||||
|  |         sendData(FlagType.SHEEP_WOOL); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setSheared(boolean flag) { |     public void setSheared(boolean flag) | ||||||
|         byte b0 = (byte) getValue(12, (byte) 0); |     { | ||||||
|         if (flag) { |         byte b0 = (byte) getValue(FlagType.SHEEP_WOOL); | ||||||
|             setValue(12, (byte) (b0 | 16)); |  | ||||||
|         } else { |         if (flag) | ||||||
|             setValue(12, (byte) (b0 & -17)); |         { | ||||||
|  |             setValue(FlagType.SHEEP_WOOL, (byte) (b0 | 16)); | ||||||
|         } |         } | ||||||
|         sendData(12); |         else | ||||||
|  |         { | ||||||
|  |             setValue(FlagType.SHEEP_WOOL, (byte) (b0 & -17)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         sendData(FlagType.SHEEP_WOOL); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,34 +10,42 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | |||||||
| /** | /** | ||||||
|  * @author Navid |  * @author Navid | ||||||
|  */ |  */ | ||||||
| //TODO: Add the appropriate data values to this class | // TODO: Add the appropriate data values to this class | ||||||
| public class ShulkerWatcher extends LivingWatcher { | public class ShulkerWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public ShulkerWatcher(Disguise disguise) { |     public ShulkerWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public BlockFace getFacingDirection() { |     public BlockFace getFacingDirection() | ||||||
|  |     { | ||||||
|         return BlockFace.UP; |         return BlockFace.UP; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setFacingDirection() { |     public void setFacingDirection() | ||||||
|  |     { | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Optional<BlockPosition> getAttachmentPosition() { |     public Optional<BlockPosition> getAttachmentPosition() | ||||||
|  |     { | ||||||
|         return Optional.absent(); |         return Optional.absent(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setAttachmentPosition(BlockPosition pos) { |     public void setAttachmentPosition(BlockPosition pos) | ||||||
|  |     { | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public byte getShieldHeight() { |     public byte getShieldHeight() | ||||||
|  |     { | ||||||
|         return 0x00; |         return 0x00; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setShieldHeight() { |     public void setShieldHeight() | ||||||
|  |     { | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,22 +3,26 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | |||||||
| import org.bukkit.entity.Skeleton.SkeletonType; | import org.bukkit.entity.Skeleton.SkeletonType; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @author Navid |  * @author Navid | ||||||
|  */ |  */ | ||||||
| public class SkeletonWatcher extends LivingWatcher { | public class SkeletonWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|     public SkeletonWatcher(Disguise disguise) { |     public SkeletonWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setType(SkeletonType type) { |     public void setType(SkeletonType type) | ||||||
|         setValue(11, type.getId()); |     { | ||||||
|         sendData(11); |         setValue(FlagType.SKELETON_TYPE, type.ordinal()); | ||||||
|  |         sendData(FlagType.SKELETON_TYPE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public SkeletonType getType() { |     public SkeletonType getType() | ||||||
|         return SkeletonType.getType((int) getValue(11, SkeletonType.NORMAL.getId())); |     { | ||||||
|  |         return SkeletonType.values()[getValue(FlagType.SKELETON_TYPE)]; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,25 +1,32 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  |  | ||||||
| public class SlimeWatcher extends LivingWatcher { | public class SlimeWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public SlimeWatcher(Disguise disguise) { |     public SlimeWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|         setSize(DisguiseUtilities.random.nextInt(4) + 1); |         setSize(DisguiseUtilities.random.nextInt(4) + 1); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int getSize() { |     public int getSize() | ||||||
|         return (int) getValue(11, 1); |     { | ||||||
|  |         return (int) getValue(FlagType.SLIME_SIZE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setSize(int size) { |     public void setSize(int size) | ||||||
|         if (size <= 0 || size >= 128) { |     { | ||||||
|  |         if (size <= 0 || size >= 128) | ||||||
|  |         { | ||||||
|             size = 1; |             size = 1; | ||||||
|         } |         } | ||||||
|         setValue(11, size); |  | ||||||
|         sendData(11); |         setValue(FlagType.SLIME_SIZE, size); | ||||||
|  |         sendData(FlagType.SLIME_SIZE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,28 +4,35 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; | |||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  |  | ||||||
| public class SplashPotionWatcher extends FlagWatcher { | public class SplashPotionWatcher extends FlagWatcher | ||||||
|  | { | ||||||
|     private int potionId; |     private int potionId; | ||||||
|  |  | ||||||
|     public SplashPotionWatcher(Disguise disguise) { |     public SplashPotionWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public SplashPotionWatcher clone(Disguise disguise) { |     public SplashPotionWatcher clone(Disguise disguise) | ||||||
|  |     { | ||||||
|         SplashPotionWatcher watcher = (SplashPotionWatcher) super.clone(disguise); |         SplashPotionWatcher watcher = (SplashPotionWatcher) super.clone(disguise); | ||||||
|         watcher.setPotionId(getPotionId()); |         watcher.setPotionId(getPotionId()); | ||||||
|  |  | ||||||
|         return watcher; |         return watcher; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int getPotionId() { |     public int getPotionId() | ||||||
|  |     { | ||||||
|         return potionId; |         return potionId; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setPotionId(int newPotionId) { |     public void setPotionId(int newPotionId) | ||||||
|  |     { | ||||||
|         this.potionId = newPotionId; |         this.potionId = newPotionId; | ||||||
|         if (getDisguise().getEntity() != null && getDisguise().getWatcher() == this) { |  | ||||||
|  |         if (getDisguise().getEntity() != null && getDisguise().getWatcher() == this) | ||||||
|  |         { | ||||||
|             DisguiseUtilities.refreshTrackers(getDisguise()); |             DisguiseUtilities.refreshTrackers(getDisguise()); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -5,10 +5,10 @@ import java.util.UUID; | |||||||
| import com.google.common.base.Optional; | import com.google.common.base.Optional; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class TameableWatcher extends AgeableWatcher | public class TameableWatcher extends AgeableWatcher | ||||||
| { | { | ||||||
|  |  | ||||||
|     public TameableWatcher(Disguise disguise) |     public TameableWatcher(Disguise disguise) | ||||||
|     { |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
| @@ -16,7 +16,7 @@ public class TameableWatcher extends AgeableWatcher | |||||||
|  |  | ||||||
|     public Optional<UUID> getOwner() |     public Optional<UUID> getOwner() | ||||||
|     { |     { | ||||||
|         return getValue(13, Optional.<UUID> absent()); |         return getValue(FlagType.TAMEABLE_OWNER); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isSitting() |     public boolean isSitting() | ||||||
| @@ -31,27 +31,29 @@ public class TameableWatcher extends AgeableWatcher | |||||||
|  |  | ||||||
|     protected boolean isTameableFlag(int no) |     protected boolean isTameableFlag(int no) | ||||||
|     { |     { | ||||||
|         return ((byte) getValue(12, (byte) 0) & no) != 0; |         return ((byte) getValue(FlagType.TAMEABLE_META) & no) != 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected void setTameableFlag(int no, boolean flag) |     protected void setTameableFlag(int no, boolean flag) | ||||||
|     { |     { | ||||||
|         byte value = (byte) getValue(12, (byte) 0); |         byte value = (byte) getValue(FlagType.TAMEABLE_META); | ||||||
|  |  | ||||||
|         if (flag) |         if (flag) | ||||||
|         { |         { | ||||||
|             setValue(12, (byte) (value | no)); |             setValue(FlagType.TAMEABLE_META, (byte) (value | no)); | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             setValue(12, (byte) (value & -(no + 1))); |             setValue(FlagType.TAMEABLE_META, (byte) (value & -(no + 1))); | ||||||
|         } |         } | ||||||
|         sendData(12); |  | ||||||
|  |         sendData(FlagType.TAMEABLE_META); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setOwner(UUID owner) |     public void setOwner(UUID owner) | ||||||
|     { |     { | ||||||
|         setValue(13, Optional.of(owner)); |         setValue(FlagType.TAMEABLE_OWNER, Optional.of(owner)); | ||||||
|         sendData(13); |         sendData(FlagType.TAMEABLE_OWNER); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setSitting(boolean sitting) |     public void setSitting(boolean sitting) | ||||||
|   | |||||||
| @@ -3,28 +3,35 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | |||||||
| import org.bukkit.Color; | import org.bukkit.Color; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @author Navid |  * @author Navid | ||||||
|  */ |  */ | ||||||
| public class TippedArrowWatcher extends ArrowWatcher { | public class TippedArrowWatcher extends ArrowWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public TippedArrowWatcher(Disguise disguise) { |     public TippedArrowWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|  |  | ||||||
|         int r = DisguiseUtilities.random.nextInt(256); |         int r = DisguiseUtilities.random.nextInt(256); | ||||||
|         int g = DisguiseUtilities.random.nextInt(256); |         int g = DisguiseUtilities.random.nextInt(256); | ||||||
|         int b = DisguiseUtilities.random.nextInt(256); |         int b = DisguiseUtilities.random.nextInt(256); | ||||||
|  |  | ||||||
|         setColor(Color.fromRGB(r, g, b)); |         setColor(Color.fromRGB(r, g, b)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Color getColor() { |     public Color getColor() | ||||||
|         int color = (int) getValue(5, Color.WHITE.asRGB()); |     { | ||||||
|  |         int color = (int) getValue(FlagType.TIPPED_ARROW_COLOR); | ||||||
|         return Color.fromRGB(color); |         return Color.fromRGB(color); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setColor(Color color) { |     public void setColor(Color color) | ||||||
|         setValue(5, color.asRGB()); |     { | ||||||
|         sendData(5); |         setValue(FlagType.TIPPED_ARROW_COLOR, color.asRGB()); | ||||||
|  |         sendData(FlagType.TIPPED_ARROW_COLOR); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,25 +3,31 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | |||||||
| import org.bukkit.entity.Villager.Profession; | import org.bukkit.entity.Villager.Profession; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
|  |  | ||||||
| public class VillagerWatcher extends AgeableWatcher { | public class VillagerWatcher extends AgeableWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public VillagerWatcher(Disguise disguise) { |     public VillagerWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|         setProfession(Profession.values()[DisguiseUtilities.random.nextInt(Profession.values().length)]); |         setProfession(Profession.values()[DisguiseUtilities.random.nextInt(Profession.values().length)]); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public Profession getProfession() { |     public Profession getProfession() | ||||||
|         return Profession.getProfession((int) getValue(16, 0)); |     { | ||||||
|  |         return Profession.values()[getValue(FlagType.VILLAGER_PROFESSION)]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setProfession(int professionId) { |     public void setProfession(int professionId) | ||||||
|         setValue(12, professionId); |     { | ||||||
|         sendData(12); |         setValue(FlagType.VILLAGER_PROFESSION, professionId); | ||||||
|  |         sendData(FlagType.VILLAGER_PROFESSION); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setProfession(Profession newProfession) { |     public void setProfession(Profession newProfession) | ||||||
|         setProfession(newProfession.getId()); |     { | ||||||
|  |         setProfession(newProfession.ordinal()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,24 +1,28 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @author Navid |  * @author Navid | ||||||
|  */ |  */ | ||||||
| public class WitchWatcher extends LivingWatcher { | public class WitchWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public WitchWatcher(Disguise disguise) { |     public WitchWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public boolean isAggressive() | ||||||
|     public boolean isAggressive() { |     { | ||||||
|         return (boolean) getValue(11, false); |         return (boolean) getValue(FlagType.WITCH_AGGRESSIVE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setAggressive(boolean aggressive) { |     public void setAggressive(boolean aggressive) | ||||||
|         setValue(11, aggressive); |     { | ||||||
|         sendData(11); |         setValue(FlagType.WITCH_AGGRESSIVE, aggressive); | ||||||
|  |         sendData(FlagType.WITCH_AGGRESSIVE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,21 +1,26 @@ | |||||||
| package me.libraryaddict.disguise.disguisetypes.watchers; | package me.libraryaddict.disguise.disguisetypes.watchers; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | import me.libraryaddict.disguise.disguisetypes.FlagWatcher; | ||||||
|  |  | ||||||
| public class WitherSkullWatcher extends FlagWatcher { | public class WitherSkullWatcher extends FlagWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public WitherSkullWatcher(Disguise disguise) { |     public WitherSkullWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isBlue() { |     public boolean isBlue() | ||||||
|         return (boolean) getValue(5, false); |     { | ||||||
|  |         return (boolean) getValue(FlagType.WITHERSKULL_BLUE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setBlue(boolean blue) { |     public void setBlue(boolean blue) | ||||||
|         setValue(5, blue); |     { | ||||||
|         sendData(5); |         setValue(FlagType.WITHERSKULL_BLUE, blue); | ||||||
|  |         sendData(FlagType.WITHERSKULL_BLUE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -5,42 +5,54 @@ import java.security.InvalidParameterException; | |||||||
| import org.bukkit.ChatColor; | import org.bukkit.ChatColor; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class WitherWatcher extends LivingWatcher { | public class WitherWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public WitherWatcher(Disguise disguise) { |     public WitherWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Returns the amount of time this Wither is invulnerable for |      * Returns the amount of time this Wither is invulnerable for | ||||||
|  |      *  | ||||||
|      * @return |      * @return | ||||||
|      */ |      */ | ||||||
|     public int getInvulnerability() { |     public int getInvulnerability() | ||||||
|         return (int) getValue(14, 0); |     { | ||||||
|  |         return (int) getValue(FlagType.WITHER_INVUL); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int[] getTargets() { |     public int[] getTargets() | ||||||
|         return new int[]{(Integer) getValue(11, 0), (Integer) getValue(12, 0), (Integer) getValue(13, 0)}; |     { | ||||||
|  |         return new int[] | ||||||
|  |             { | ||||||
|  |                     getValue(FlagType.WITHER_TARGET_1), getValue(FlagType.WITHER_TARGET_2), getValue(FlagType.WITHER_TARGET_3) | ||||||
|  |             }; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Sets the amount of time this Wither is invulnerable for |      * Sets the amount of time this Wither is invulnerable for | ||||||
|      */ |      */ | ||||||
|     public void setInvulnerability(int invulnerability) { |     public void setInvulnerability(int invulnerability) | ||||||
|         setValue(14, invulnerability); |     { | ||||||
|         sendData(14); |         setValue(FlagType.WITHER_INVUL, invulnerability); | ||||||
|  |         sendData(FlagType.WITHER_INVUL); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setTargets(int... targets) { |     public void setTargets(int... targets) | ||||||
|         if (targets.length != 3) { |     { | ||||||
|             throw new InvalidParameterException(ChatColor.RED + "Expected 3 numbers for wither setTargets. Received " |         if (targets.length != 3) | ||||||
|                     + targets.length); |         { | ||||||
|  |             throw new InvalidParameterException( | ||||||
|  |                     ChatColor.RED + "Expected 3 numbers for wither setTargets. Received " + targets.length); | ||||||
|         } |         } | ||||||
|         setValue(11, targets[0]); |         setValue(FlagType.WITHER_TARGET_1, targets[0]); | ||||||
|         setValue(12, targets[1]); |         setValue(FlagType.WITHER_TARGET_2, targets[1]); | ||||||
|         setValue(13, targets[2]); |         setValue(FlagType.WITHER_TARGET_3, targets[2]); | ||||||
|         sendData(11, 12, 13); |         sendData(FlagType.WITHER_TARGET_1, FlagType.WITHER_TARGET_2, FlagType.WITHER_TARGET_3); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -4,63 +4,82 @@ import org.bukkit.DyeColor; | |||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.AnimalColor; | import me.libraryaddict.disguise.disguisetypes.AnimalColor; | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class WolfWatcher extends TameableWatcher { | public class WolfWatcher extends TameableWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public WolfWatcher(Disguise disguise) { |     public WolfWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public AnimalColor getCollarColor() { |     public AnimalColor getCollarColor() | ||||||
|         return AnimalColor.getColor((int) getValue(16, 14)); |     { | ||||||
|  |         return AnimalColor.getColor(getValue(FlagType.WOLF_COLLAR)); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Used for tail rotation. |      * Used for tail rotation. | ||||||
|  |      *  | ||||||
|      * @return |      * @return | ||||||
|      */ |      */ | ||||||
|     public float getDamageTaken() { |     public float getDamageTaken() | ||||||
|         return (float) getValue(14, 0); |     { | ||||||
|  |         return (float) getValue(FlagType.WOLF_DAMAGE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Used for tail rotation. |      * Used for tail rotation. | ||||||
|  |      *  | ||||||
|      * @param damage |      * @param damage | ||||||
|      */ |      */ | ||||||
|     public void setDamageTaken(float damage) { |     public void setDamageTaken(float damage) | ||||||
|         setValue(14, damage); |     { | ||||||
|         sendData(14); |         setValue(FlagType.WOLF_DAMAGE, damage); | ||||||
|  |         sendData(FlagType.WOLF_DAMAGE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isBegging() { |     public boolean isBegging() | ||||||
|         return (boolean) getValue(15, false); |     { | ||||||
|  |         return (boolean) getValue(FlagType.WOLF_BEGGING); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setBegging(boolean begging) { |     public void setBegging(boolean begging) | ||||||
|         setValue(15, begging); |     { | ||||||
|         sendData(15); |         setValue(FlagType.WOLF_BEGGING, begging); | ||||||
|  |         sendData(FlagType.WOLF_BEGGING); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isAngry() { |     public boolean isAngry() | ||||||
|  |     { | ||||||
|         return isTameableFlag(2); |         return isTameableFlag(2); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setAngry(boolean angry) { |     public void setAngry(boolean angry) | ||||||
|  |     { | ||||||
|         setTameableFlag(2, angry); |         setTameableFlag(2, angry); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setCollarColor(AnimalColor color) { |     public void setCollarColor(AnimalColor color) | ||||||
|  |     { | ||||||
|         setCollarColor(DyeColor.getByWoolData((byte) color.getId())); |         setCollarColor(DyeColor.getByWoolData((byte) color.getId())); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setCollarColor(DyeColor newColor) { |     public void setCollarColor(DyeColor newColor) | ||||||
|         if (!isTamed()) { |     { | ||||||
|  |         if (!isTamed()) | ||||||
|  |         { | ||||||
|             setTamed(true); |             setTamed(true); | ||||||
|         } |         } | ||||||
|         if (newColor.getWoolData() != getCollarColor().getId()) { |  | ||||||
|             setValue(16, (int) newColor.getDyeData()); |         if (newColor.getWoolData() == getCollarColor().getId()) | ||||||
|             sendData(16); |         { | ||||||
|  |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         setValue(FlagType.WOLF_COLLAR, (int) newColor.getDyeData()); | ||||||
|  |         sendData(FlagType.WOLF_COLLAR); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,87 +3,104 @@ package me.libraryaddict.disguise.disguisetypes.watchers; | |||||||
| import org.bukkit.entity.Villager.Profession; | import org.bukkit.entity.Villager.Profession; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.Disguise; | import me.libraryaddict.disguise.disguisetypes.Disguise; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class ZombieWatcher extends LivingWatcher { | public class ZombieWatcher extends LivingWatcher | ||||||
|  | { | ||||||
|  |  | ||||||
|     public ZombieWatcher(Disguise disguise) { |     public ZombieWatcher(Disguise disguise) | ||||||
|  |     { | ||||||
|         super(disguise); |         super(disguise); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isAdult() { |     public boolean isAdult() | ||||||
|  |     { | ||||||
|         return !isBaby(); |         return !isBaby(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isBaby() { |     public boolean isBaby() | ||||||
|         return (boolean) getValue(11, false); |     { | ||||||
|  |         return getValue(FlagType.ZOMBIE_BABY); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isShaking() { |     public boolean isShaking() | ||||||
|         return (boolean) getValue(14, false); |     { | ||||||
|  |         return getValue(FlagType.ZOMBIE_SHAKING); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Is this zombie a villager? |      * Is this zombie a villager? | ||||||
|  |      *  | ||||||
|      * @return |      * @return | ||||||
|      */ |      */ | ||||||
|     public boolean isVillager() { |     public boolean isVillager() | ||||||
|         return ((int)getValue(12, 0)) != 0; |     { | ||||||
|  |         return ((int) getValue(FlagType.ZOMBIE_PROFESSION)) != 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public boolean isAggressive() { |     public boolean isAggressive() | ||||||
|         return (boolean) getValue(14, false); |     { | ||||||
|  |         return (boolean) getValue(FlagType.ZOMBIE_AGGRESSIVE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Only returns a valid value if this zombie |      * Only returns a valid value if this zombie is a villager. | ||||||
|      * is a villager. |      *  | ||||||
|      * @return |      * @return | ||||||
|      */ |      */ | ||||||
|     public Profession getProfession() { |     public Profession getProfession() | ||||||
|         return Profession.getProfession((int) getValue(12, 0)); |     { | ||||||
|  |         return Profession.values()[getValue(FlagType.ZOMBIE_PROFESSION)]; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setAdult() { |     public void setAdult() | ||||||
|  |     { | ||||||
|         setBaby(false); |         setBaby(false); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setBaby() { |     public void setBaby() | ||||||
|  |     { | ||||||
|         setBaby(true); |         setBaby(true); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setBaby(boolean baby) { |     public void setBaby(boolean baby) | ||||||
|         setValue(11, baby); |     { | ||||||
|         sendData(11); |         setValue(FlagType.ZOMBIE_BABY, baby); | ||||||
|  |         sendData(FlagType.ZOMBIE_BABY); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setShaking(boolean shaking) { |     public void setShaking(boolean shaking) | ||||||
|         setValue(13, (byte) (shaking ? 1 : 0)); |     { | ||||||
|         sendData(13); |         setValue(FlagType.ZOMBIE_SHAKING, shaking); | ||||||
|  |         sendData(FlagType.ZOMBIE_SHAKING); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Sets the profession of this zombie, in turn |      * Sets the profession of this zombie, in turn turning it into a Zombie Villager | ||||||
|      * turning it into a Zombie Villager |      *  | ||||||
|      * @param id |      * @param id | ||||||
|      */ |      */ | ||||||
|     public void setProfession(int id) { |     public void setProfession(int id) | ||||||
|         setValue(12, id); |     { | ||||||
|         sendData(12); |         setValue(FlagType.ZOMBIE_PROFESSION, id); | ||||||
|  |         sendData(FlagType.ZOMBIE_PROFESSION); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Sets the profession of this zombie, in turn |      * Sets the profession of this zombie, in turn turning it into a Zombie Villager | ||||||
|      * turning it into a Zombie Villager |      *  | ||||||
|      * @param profession |      * @param profession | ||||||
|      */ |      */ | ||||||
|     public void setProfession(Profession profession) { |     public void setProfession(Profession profession) | ||||||
|         setValue(12, profession.getId()); |     { | ||||||
|         sendData(12); |         setValue(FlagType.ZOMBIE_PROFESSION, profession.ordinal()); | ||||||
|  |         sendData(FlagType.ZOMBIE_PROFESSION); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setAggressive(boolean handsup) { |     public void setAggressive(boolean handsup) | ||||||
|         setValue(14, handsup); |     { | ||||||
|         sendData(14); |         setValue(FlagType.ZOMBIE_AGGRESSIVE, handsup); | ||||||
|  |         sendData(FlagType.ZOMBIE_AGGRESSIVE); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -57,7 +57,6 @@ import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; | |||||||
|  |  | ||||||
| public class DisguiseUtilities | public class DisguiseUtilities | ||||||
| { | { | ||||||
|  |  | ||||||
|     public static final Random random = new Random(); |     public static final Random random = new Random(); | ||||||
|     /** |     /** | ||||||
|      * This is a list of names which was called by other plugins. As such, don't remove from the gameProfiles as its the duty of |      * This is a list of names which was called by other plugins. As such, don't remove from the gameProfiles as its the duty of | ||||||
| @@ -359,30 +358,30 @@ public class DisguiseUtilities | |||||||
|         { |         { | ||||||
|             Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); |             Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); | ||||||
|  |  | ||||||
|             if (entityTrackerEntry != null) |             if (entityTrackerEntry == null) | ||||||
|             { |                 return; | ||||||
|                 Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") |  | ||||||
|                         .get(entityTrackerEntry); |  | ||||||
|  |  | ||||||
|                 // If the tracker exists. Remove himself from his tracker |             Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") | ||||||
|                 trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent |                     .get(entityTrackerEntry); | ||||||
|                                                                             // ConcurrentModificationException |  | ||||||
|  |  | ||||||
|                 PacketContainer destroyPacket = new PacketContainer(Server.ENTITY_DESTROY); |             // If the tracker exists. Remove himself from his tracker | ||||||
|  |             trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent | ||||||
|  |                                                                         // ConcurrentModificationException | ||||||
|  |  | ||||||
|                 destroyPacket.getIntegerArrays().write(0, new int[] |             PacketContainer destroyPacket = new PacketContainer(Server.ENTITY_DESTROY); | ||||||
|                     { |  | ||||||
|                             disguise.getEntity().getEntityId() |  | ||||||
|                     }); |  | ||||||
|  |  | ||||||
|                 for (Object p : trackedPlayers) |             destroyPacket.getIntegerArrays().write(0, new int[] | ||||||
|                 { |                 { | ||||||
|                     Player player = (Player) ReflectionManager.getBukkitEntity(p); |                         disguise.getEntity().getEntityId() | ||||||
|  |                 }); | ||||||
|  |  | ||||||
|                     if (player == disguise.getEntity() || disguise.canSee(player)) |             for (Object p : trackedPlayers) | ||||||
|                     { |             { | ||||||
|                         ProtocolLibrary.getProtocolManager().sendServerPacket(player, destroyPacket); |                 Player player = (Player) ReflectionManager.getBukkitEntity(p); | ||||||
|                     } |  | ||||||
|  |                 if (player == disguise.getEntity() || disguise.canSee(player)) | ||||||
|  |                 { | ||||||
|  |                     ProtocolLibrary.getProtocolManager().sendServerPacket(player, destroyPacket); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @@ -664,6 +663,7 @@ public class DisguiseUtilities | |||||||
|                 for (Object p : trackedPlayers) |                 for (Object p : trackedPlayers) | ||||||
|                 { |                 { | ||||||
|                     Player player = (Player) ReflectionManager.getBukkitEntity(p); |                     Player player = (Player) ReflectionManager.getBukkitEntity(p); | ||||||
|  |  | ||||||
|                     if (((TargetedDisguise) disguise).canSee(player)) |                     if (((TargetedDisguise) disguise).canSee(player)) | ||||||
|                     { |                     { | ||||||
|                         players.add(player); |                         players.add(player); | ||||||
| @@ -919,48 +919,48 @@ public class DisguiseUtilities | |||||||
|             { |             { | ||||||
|                 final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); |                 final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity()); | ||||||
|  |  | ||||||
|                 if (entityTrackerEntry != null) |                 if (entityTrackerEntry == null) | ||||||
|  |                     return; | ||||||
|  |  | ||||||
|  |                 Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") | ||||||
|  |                         .get(entityTrackerEntry); | ||||||
|  |  | ||||||
|  |                 Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", | ||||||
|  |                         ReflectionManager.getNmsClass("EntityPlayer")); | ||||||
|  |  | ||||||
|  |                 final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", | ||||||
|  |                         ReflectionManager.getNmsClass("EntityPlayer")); | ||||||
|  |  | ||||||
|  |                 trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent | ||||||
|  |                                                                             // ConcurrentModificationException | ||||||
|  |                 for (final Object p : trackedPlayers) | ||||||
|                 { |                 { | ||||||
|                     Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers") |                     Player pl = (Player) ReflectionManager.getBukkitEntity(p); | ||||||
|                             .get(entityTrackerEntry); |  | ||||||
|  |  | ||||||
|                     Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear", |                     if (!player.equalsIgnoreCase((pl).getName())) | ||||||
|                             ReflectionManager.getNmsClass("EntityPlayer")); |                         continue; | ||||||
|  |  | ||||||
|                     final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer", |                     clear.invoke(entityTrackerEntry, p); | ||||||
|                             ReflectionManager.getNmsClass("EntityPlayer")); |  | ||||||
|  |  | ||||||
|                     trackedPlayers = (Set) new HashSet(trackedPlayers).clone(); // Copy before iterating to prevent |                     ProtocolLibrary.getProtocolManager().sendServerPacket(pl, destroyPacket); | ||||||
|                                                                                 // ConcurrentModificationException |  | ||||||
|                     for (final Object p : trackedPlayers) |                     Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() | ||||||
|                     { |                     { | ||||||
|                         Player pl = (Player) ReflectionManager.getBukkitEntity(p); |  | ||||||
|  |  | ||||||
|                         if (player.equalsIgnoreCase((pl).getName())) |                         @Override | ||||||
|  |                         public void run() | ||||||
|                         { |                         { | ||||||
|                             clear.invoke(entityTrackerEntry, p); |                             try | ||||||
|  |  | ||||||
|                             ProtocolLibrary.getProtocolManager().sendServerPacket(pl, destroyPacket); |  | ||||||
|  |  | ||||||
|                             Bukkit.getScheduler().scheduleSyncDelayedTask(libsDisguises, new Runnable() |  | ||||||
|                             { |                             { | ||||||
|  |                                 updatePlayer.invoke(entityTrackerEntry, p); | ||||||
|                                 @Override |                             } | ||||||
|                                 public void run() |                             catch (Exception ex) | ||||||
|                                 { |                             { | ||||||
|                                     try |                                 ex.printStackTrace(System.out); | ||||||
|                                     { |                             } | ||||||
|                                         updatePlayer.invoke(entityTrackerEntry, p); |  | ||||||
|                                     } |  | ||||||
|                                     catch (Exception ex) |  | ||||||
|                                     { |  | ||||||
|                                         ex.printStackTrace(System.out); |  | ||||||
|                                     } |  | ||||||
|                                 } |  | ||||||
|                             }, 2); |  | ||||||
|                             break; |  | ||||||
|                         } |                         } | ||||||
|                     } |                     }, 2); | ||||||
|  |                     break; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.utilities; | |||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
|  |  | ||||||
| import me.libraryaddict.disguise.disguisetypes.DisguiseType; | import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.FlagType; | ||||||
|  |  | ||||||
| public class DisguiseValues | public class DisguiseValues | ||||||
| { | { | ||||||
| @@ -39,7 +40,7 @@ public class DisguiseValues | |||||||
|         return values.get(type); |         return values.get(type); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public static HashMap<Integer, Object> getMetaValues(DisguiseType type) |     public static HashMap<FlagType, Object> getMetaValues(DisguiseType type) | ||||||
|     { |     { | ||||||
|         return getDisguiseValues(type).getMetaValues(); |         return getDisguiseValues(type).getMetaValues(); | ||||||
|     } |     } | ||||||
| @@ -53,7 +54,7 @@ public class DisguiseValues | |||||||
|     private FakeBoundingBox babyBox; |     private FakeBoundingBox babyBox; | ||||||
|     private float[] entitySize; |     private float[] entitySize; | ||||||
|     private double maxHealth; |     private double maxHealth; | ||||||
|     private HashMap<Integer, Object> metaValues = new HashMap<>(); |     private HashMap<FlagType, Object> metaValues = new HashMap<>(); | ||||||
|     private Class nmsEntityClass; |     private Class nmsEntityClass; | ||||||
|  |  | ||||||
|     public DisguiseValues(DisguiseType type, Class classType, int entitySize, double maxHealth) |     public DisguiseValues(DisguiseType type, Class classType, int entitySize, double maxHealth) | ||||||
| @@ -83,7 +84,7 @@ public class DisguiseValues | |||||||
|         return maxHealth; |         return maxHealth; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public HashMap<Integer, Object> getMetaValues() |     public HashMap<FlagType, Object> getMetaValues() | ||||||
|     { |     { | ||||||
|         return metaValues; |         return metaValues; | ||||||
|     } |     } | ||||||
| @@ -108,7 +109,7 @@ public class DisguiseValues | |||||||
|         this.entitySize = size; |         this.entitySize = size; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void setMetaValue(int id, Object value) |     public void setMetaValue(FlagType id, Object value) | ||||||
|     { |     { | ||||||
|         metaValues.put(id, value); |         metaValues.put(id, value); | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user