Current work

This commit is contained in:
libraryaddict 2016-06-13 02:22:56 +12:00
parent 8e255c5ccf
commit e751cf4582
47 changed files with 1209 additions and 703 deletions

@ -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;
} }

@ -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);
} }