diff --git a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java index c1244d40..087646b8 100644 --- a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java @@ -22,6 +22,7 @@ import me.libraryaddict.disguise.disguisetypes.watchers.GuardianWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.MinecartWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.SkeletonWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.SlimeWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.TameableWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; @@ -130,6 +131,9 @@ public class LibsDisguises extends JavaPlugin { case ENDERMITE: watcherClass = LivingWatcher.class; break; + case WITHER_SKELETON: + watcherClass = SkeletonWatcher.class; + break; default: watcherClass = Class.forName("me.libraryaddict.disguise.disguisetypes.watchers." + toReadable(disguiseType.name()) + "Watcher"); diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java index c9a389d7..2fe5083b 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -10,7 +10,9 @@ import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.BatWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.GuardianWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.HorseWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.SkeletonWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; import me.libraryaddict.disguise.events.DisguiseEvent; import me.libraryaddict.disguise.events.UndisguiseEvent; @@ -24,6 +26,8 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Horse.Variant; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton.SkeletonType; +import org.bukkit.entity.Villager.Profession; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; @@ -33,6 +37,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Random; import java.util.UUID; public abstract class Disguise { @@ -98,19 +103,17 @@ public abstract class Disguise { } // If the disguise type is a wither, set the flagwatcher value for the skeleton to a wither skeleton if (getType() == DisguiseType.WITHER_SKELETON) { - getWatcher().setValue(13, (byte) 1); + ((SkeletonWatcher)getWatcher()).setType(SkeletonType.WITHER); } // Else if its a zombie, but the disguise type is a zombie villager. Set the value. else if (getType() == DisguiseType.ZOMBIE_VILLAGER) { - getWatcher().setValue(13, (byte) 1); + ((ZombieWatcher)getWatcher()).setProfession(Profession.values()[new Random().nextInt(Profession.values().length)]); } else if (getType() == DisguiseType.ELDER_GUARDIAN) { - getWatcher().setValue(16, 4); + ((GuardianWatcher)getWatcher()).setElder(true); } // Else if its a horse. Set the horse watcher type else if (getWatcher() instanceof HorseWatcher) { try { - // Don't mess with this because Varient is something like ZombieHorse and so on. - // Not something that a watcher needs to access. Variant horseType = Variant.valueOf(getType().name()); - getWatcher().setValue(19, (byte) horseType.ordinal()); + ((HorseWatcher)getWatcher()).setVariant(horseType); } catch (Exception ex) { // Ok.. So it aint a horse } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index 8920074e..8e9d63ff 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -159,7 +159,7 @@ public class FlagWatcher { return disguise; } - private boolean getFlag(int byteValue) { + private boolean getEntityFlag(int byteValue) { return ((byte) getValue(0, (byte) 0) & 1 << byteValue) != 0; } @@ -199,10 +199,6 @@ public class FlagWatcher { return entityValues.containsKey(no); } - public boolean isBurning() { - return getFlag(0); - } - public boolean isCustomNameVisible() { return (byte) getValue(3, (byte) 0) == 1; } @@ -211,20 +207,32 @@ public class FlagWatcher { return addEntityAnimations; } - public boolean isInvisible() { - return getFlag(5); - } - - public boolean isRightClicking() { - return getFlag(4); + public boolean isBurning() { + return getEntityFlag(0); } public boolean isSneaking() { - return getFlag(1); + return getEntityFlag(1); } public boolean isSprinting() { - return getFlag(3); + return getEntityFlag(3); + } + + public boolean isRightClicking() { + return getEntityFlag(4); + } + + public boolean isInvisible() { + return getEntityFlag(5); + } + + public boolean isFlyingWithElytra() { + return getEntityFlag(6); + } + + public boolean isGlowing() { + return getEntityFlag(7); } public void rebuildWatchableObjects() { @@ -289,7 +297,7 @@ public class FlagWatcher { } public void setBurning(boolean setBurning) { - setFlag(0, setBurning); + setEntityFlag(0, setBurning); sendData(0); } @@ -306,7 +314,7 @@ public class FlagWatcher { sendData(3); } - private void setFlag(int byteValue, boolean flag) { + private void setEntityFlag(int byteValue, boolean flag) { modifiedEntityAnimations.add(byteValue); byte b0 = (byte) getValue(0, (byte) 0); if (flag) { @@ -317,7 +325,17 @@ public class FlagWatcher { } public void setInvisible(boolean setInvis) { - setFlag(5, setInvis); + setEntityFlag(5, setInvis); + sendData(0); + } + + public void setGlowing(boolean glowing) { + setEntityFlag(6, glowing); + sendData(0); + } + + public void setFlyingWithElytra(boolean flying) { + setEntityFlag(7, flying); sendData(0); } @@ -413,17 +431,17 @@ public class FlagWatcher { } public void setRightClicking(boolean setRightClicking) { - setFlag(4, setRightClicking); + setEntityFlag(4, setRightClicking); sendData(0); } public void setSneaking(boolean setSneaking) { - setFlag(1, setSneaking); + setEntityFlag(1, setSneaking); sendData(0); } public void setSprinting(boolean setSprinting) { - setFlag(3, setSprinting); + setEntityFlag(3, setSprinting); sendData(0); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java index 17123950..e5a1d9f9 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AgeableWatcher.java @@ -1,15 +1,14 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; +import org.bukkit.entity.Entity; public class AgeableWatcher extends LivingWatcher { public AgeableWatcher(Disguise disguise) { super(disguise); - } + Entity e; - public int getAge() { - return (Integer) getValue(12, 0); } public boolean isAdult() { @@ -17,25 +16,20 @@ public class AgeableWatcher extends LivingWatcher { } public boolean isBaby() { - return ((byte) getValue(12, (byte) 0)) < 0; + return (boolean) getValue(11, false); } public void setAdult() { setBaby(false); } - public void setAge(int newAge) { - setValue(12, (byte) newAge); - sendData(12); - } - public void setBaby() { setBaby(true); } public void setBaby(boolean isBaby) { - setValue(12, (byte) (isBaby ? -1 : 0)); - sendData(12); + setValue(11, isBaby); + sendData(11); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java index 4630b4f6..d5562d85 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArmorStandWatcher.java @@ -8,27 +8,31 @@ public class ArmorStandWatcher extends LivingWatcher { super(disguise); } - private boolean get10(int value) { + private boolean getArmorStandFlag(int value) { return ((byte) getValue(10, 0) & value) != 0; } public boolean isNoBasePlate() { - return get10(8); + return getArmorStandFlag(8); } public boolean isNoGravity() { - return get10(2); + return getArmorStandFlag(2); } public boolean isShowArms() { - return get10(4); + return getArmorStandFlag(4); } public boolean isSmall() { - return get10(1); + return getArmorStandFlag(1); } - private void set10(int value, boolean isTrue) { + public boolean isMarker() { + return getArmorStandFlag(10); + } + + private void setArmorStandFlag(int value, boolean isTrue) { byte b1 = (byte) getValue(10, (byte) 0); if (isTrue) { b1 = (byte) (b1 | value); @@ -40,22 +44,27 @@ public class ArmorStandWatcher extends LivingWatcher { } public void setNoBasePlate(boolean noBasePlate) { - set10(8, noBasePlate); + setArmorStandFlag(8, noBasePlate); sendData(10); } public void setNoGravity(boolean noGravity) { - set10(2, noGravity); + setArmorStandFlag(2, noGravity); sendData(10); } public void setShowArms(boolean showArms) { - set10(4, showArms); + setArmorStandFlag(4, showArms); sendData(10); } public void setSmall(boolean isSmall) { - set10(1, isSmall); + setArmorStandFlag(1, isSmall); + sendData(10); + } + + public void setMarker(boolean isMarker) { + setArmorStandFlag(10, isMarker); sendData(10); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java index e76b86ef..93c5d890 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java @@ -10,12 +10,12 @@ public class ArrowWatcher extends FlagWatcher { } public boolean isCritical() { - return (byte) getValue(16, (byte) 0) == 1; + return (byte) getValue(5, (byte) 0) == 1; } public void setCritical(boolean critical) { - setValue(16, (byte) (critical ? 1 : 0)); - sendData(16); + setValue(5, (byte) (critical ? 1 : 0)); + sendData(5); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java index f9730652..0a1e5dfe 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java @@ -10,11 +10,11 @@ public class BatWatcher extends LivingWatcher { } public boolean isFlying() { - return (byte) getValue(16, (byte) 1) == 0; + return (boolean) getValue(11, true); } public void setFlying(boolean flying) { - setValue(16, (byte) (flying ? 0 : 1)); - sendData(16); + setValue(11, flying); + sendData(11); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java index 6277f1af..675c7378 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BlazeWatcher.java @@ -9,12 +9,12 @@ public class BlazeWatcher extends LivingWatcher { } public boolean isBlazing() { - return (byte) getValue(16, (byte) 0) == 1; + return (boolean) getValue(11, false); } public void setBlazing(boolean isBlazing) { - setValue(16, (byte) (isBlazing ? 1 : 0)); - sendData(16); + setValue(11, isBlazing); + sendData(11); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java index 6bf47dce..e848e5ad 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BoatWatcher.java @@ -5,26 +5,20 @@ import me.libraryaddict.disguise.disguisetypes.FlagWatcher; public class BoatWatcher extends FlagWatcher { + //TODO: Add stuff for new boat values + public BoatWatcher(Disguise disguise) { super(disguise); } public int getDamage() { - return (Integer) getValue(19, 40F); - } - - public int getHealth() { - return (Integer) getValue(17, 10); + return (int) getValue(7, 40F); } public void setDamage(float dmg) { - setValue(19, dmg); - sendData(19); + setValue(7, dmg); + sendData(7); } - public void setHealth(int health) { - setValue(17, health); - sendData(17); - } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java index aa04fda4..79189c95 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CreeperWatcher.java @@ -9,21 +9,21 @@ public class CreeperWatcher extends LivingWatcher { } public boolean isIgnited() { - return (byte) getValue(18, (byte) 0) == 1; + return (boolean) getValue(13, false); } public boolean isPowered() { - return (byte) getValue(17, (byte) 0) == 1; + return (boolean) getValue(12, false); } public void setIgnited(boolean ignited) { - setValue(18, (byte) (ignited ? 1 : 0)); - sendData(18); + setValue(13, ignited); + sendData(13); } public void setPowered(boolean powered) { - setValue(17, (byte) (powered ? 1 : 0)); - sendData(17); + setValue(12, powered); + sendData(12); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java index b326d4b8..511ec654 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/DroppedItemWatcher.java @@ -2,7 +2,6 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; - import org.bukkit.inventory.ItemStack; public class DroppedItemWatcher extends FlagWatcher { @@ -12,12 +11,12 @@ public class DroppedItemWatcher extends FlagWatcher { } public ItemStack getItemStack() { - return (ItemStack) getValue(10, new ItemStack(1)); + return (ItemStack) getValue(5, new ItemStack(1)); } public void setItemStack(ItemStack item) { - setValue(10, item); - sendData(10); + setValue(5, item); + sendData(5); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java new file mode 100644 index 00000000..f299b18c --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java @@ -0,0 +1,22 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; + +/** + * @author Navid + */ +public class EnderDragonWatcher extends LivingWatcher { + + public EnderDragonWatcher(Disguise disguise) { + super(disguise); + } + + public int getPhase() { + return (int) getValue(11, 0); + } + + public void setPhase(int phase) { + setValue(11, phase); + sendData(11); + } +} diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java index fc14ad11..d2b8521e 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java @@ -11,22 +11,21 @@ public class EndermanWatcher extends LivingWatcher { @Override public ItemStack getItemInMainHand() { - return new ItemStack((byte) getValue(16, (byte) 0), 1, ((byte) getValue(17, (byte) 0))); - } - - public boolean isAggressive() { - return (byte) getValue(18, (byte) 0) == 1; - } - - public void setAggressive(boolean isAggressive) { - setValue(18, (byte) (isAggressive ? 1 : 0)); - sendData(18); + return new ItemStack((int) getValue(11, 1), 1, (short) 0); } @Override public void setItemInMainHand(ItemStack itemstack) { - setValue(16, (short) (itemstack.getTypeId() & 255)); - setValue(17, (byte) (itemstack.getDurability() & 255)); + setValue(11, itemstack.getTypeId()); + } + + public boolean isAggressive() { + return (boolean) getValue(12, false); + } + + public void setAggressive(boolean isAggressive) { + setValue(12, isAggressive); + sendData(12); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java index b71ab1ab..dc8ef3f0 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java @@ -1,17 +1,17 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; public class FallingBlockWatcher extends FlagWatcher { private ItemStack block; + //TODO: Check this watcher and make sure it works public FallingBlockWatcher(Disguise disguise) { super(disguise); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.java index 8ea75400..e965df26 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GhastWatcher.java @@ -9,12 +9,12 @@ public class GhastWatcher extends LivingWatcher { } public boolean isAggressive() { - return (byte) getValue(16, (byte) 0) == 1; + return (boolean) getValue(11, false); } public void setAggressive(boolean isAggressive) { - setValue(16, (byte) (isAggressive ? 1 : 0)); - sendData(16); + setValue(11, isAggressive); + sendData(11); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java index ad9af212..e0a45591 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java @@ -1,6 +1,8 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; public class GuardianWatcher extends LivingWatcher { @@ -8,13 +10,62 @@ public class GuardianWatcher extends LivingWatcher { super(disguise); } - public boolean isBeam() { - return (Integer) getValue(17, 0) == 1; + /** + * Is this guardian targetting someone? + * @return + */ + public boolean isTarget() { + return ((int)getValue(12, 0)) != 0; } - public void setBeam(boolean isBeaming) { - setValue(17, isBeaming ? 1 : 0); - sendData(17); + /** + * Shoot a beam at the given entityId. + * @param entityId + */ + public void setTarget(int entityId) { + setValue(12, entityId); + sendData(12); + } + + /** + * Shoot a beam at the given player name. + * @param playername + */ + public void setTarget(String playername) { + Player player = Bukkit.getPlayer(playername); + if (player == null) return; + setValue(12, player.getEntityId()); + sendData(12); + } + + public boolean isRetractingSpikes() { + return isGuardianFlag(2); + } + + public void setRetractingSpikes(boolean isRetracting) { + setGuardianFlag(2, isRetracting); + } + + public boolean isElder() { + return isGuardianFlag(4); + } + + public void setElder(boolean isGuardian) { + setGuardianFlag(4, isGuardian); + } + + protected boolean isGuardianFlag(int no) { + return ((byte) getValue(11, (byte) 0) & no) != 0; + } + + protected void setGuardianFlag(int no, boolean flag) { + byte b0 = (byte) getValue(11, (byte) 0); + if (flag) { + setValue(11, (byte) (b0 | no)); + } else { + setValue(11, (byte) (b0 & -(no + 1))); + } + sendData(11); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java index f4e6ec06..ea6f9168 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java @@ -1,14 +1,16 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import java.util.Random; - +import com.google.common.base.Optional; import me.libraryaddict.disguise.disguisetypes.Disguise; - import org.bukkit.Material; import org.bukkit.entity.Horse.Color; import org.bukkit.entity.Horse.Style; +import org.bukkit.entity.Horse.Variant; import org.bukkit.inventory.ItemStack; +import java.util.Random; +import java.util.UUID; + public class HorseWatcher extends AgeableWatcher { public HorseWatcher(Disguise disguise) { @@ -16,8 +18,18 @@ public class HorseWatcher extends AgeableWatcher { setColor(Color.values()[new Random().nextInt(Color.values().length)]); } + //TODO: Check and make sure Variants work + public Variant getVariant() { + return Variant.values()[(int) getValue(14, 0)]; + } + + public void setVariant(Variant variant) { + setValue(14, variant.ordinal()); + sendData(14); + } + public Color getColor() { - return Color.values()[((Integer) getValue(20, 0) & 0xFF)]; + return Color.values()[((Integer) getValue(13, 0) & 0xFF)]; } public ItemStack getHorseArmor() { @@ -35,93 +47,91 @@ public class HorseWatcher extends AgeableWatcher { return null; } - @Deprecated - public int getHorseArmorAsInt() { - return (Integer) getValue(22, 0); + protected int getHorseArmorAsInt() { + return (int) getValue(16, 0); } - public String getOwnerName() { - return (String) getValue(21, null); + public Optional getOwner() { + return (Optional) getValue(15, Optional.absent()); } public Style getStyle() { - return Style.values()[((Integer) getValue(20, 0) >>> 8)]; + return Style.values()[((int) getValue(13, 0) >>> 8)]; } public boolean hasChest() { - return isTrue(8); + return isHorseFlag(8); } public boolean isBreedable() { - return isTrue(16); + return isHorseFlag(16); } public boolean isGrazing() { - return isTrue(32); + return isHorseFlag(32); } public boolean isMouthOpen() { - return isTrue(128); + return isHorseFlag(128); } public boolean isRearing() { - return isTrue(64); + return isHorseFlag(64); } public boolean isSaddled() { - return isTrue(4); + return isHorseFlag(4); } public boolean isTamed() { - return isTrue(2); + return isHorseFlag(2); } - private boolean isTrue(int i) { - return ((Integer) getValue(16, (byte) 0) & i) != 0; + private boolean isHorseFlag(int i) { + return ((Integer) getValue(12, (byte) 0) & i) != 0; } public void setCanBreed(boolean breed) { - setFlag(16, breed); + setHorseFlag(16, breed); } public void setCarryingChest(boolean chest) { - setFlag(8, chest); + setHorseFlag(8, chest); } public void setColor(Color color) { - setValue(20, color.ordinal() & 0xFF | getStyle().ordinal() << 8); - sendData(20); + setValue(13, color.ordinal() & 0xFF | getStyle().ordinal() << 8); + sendData(13); } - private void setFlag(int i, boolean flag) { - int j = (Integer) getValue(16, 0); + private void setHorseFlag(int i, boolean flag) { + int j = (int) getValue(12, 0); if (flag) { - setValue(16, j | i); + setValue(12, j | i); } else { - setValue(16, j & ~i); + setValue(12, j & ~i); } - sendData(16); + sendData(12); } public void setGrazing(boolean grazing) { - setFlag(32, grazing); + setHorseFlag(32, grazing); } - @Deprecated - public void setHorseArmor(int armor) { - setValue(22, armor % 4); - sendData(22); + protected void setHorseArmor(int armor) { + setValue(16, armor); + sendData(16); } public void setHorseArmor(ItemStack item) { int value = 0; if (item != null) { Material mat = item.getType(); - if (mat.name().equals("IRON_BARDING")) { + if (mat == Material.IRON_BARDING) { value = 1; - } else if (mat.name().equals("GOLD_BARDING")) { + } else if (mat == Material.GOLD_BARDING) { value = 2; - } else if (mat.name().equals("DIAMOND_BARDING")) { + } else if (mat == Material.DIAMOND_BARDING) { value = 3; } } @@ -129,29 +139,29 @@ public class HorseWatcher extends AgeableWatcher { } public void setMouthOpen(boolean mouthOpen) { - setFlag(128, mouthOpen); + setHorseFlag(128, mouthOpen); } - public void setOwnerName(String name) { - setValue(21, name); - sendData(21); + public void setOwner(Optional uuid) { + setValue(15, uuid); + sendData(15); } public void setRearing(boolean rear) { - setFlag(64, rear); + setHorseFlag(64, rear); } public void setSaddled(boolean saddled) { - setFlag(4, saddled); + setHorseFlag(4, saddled); } public void setStyle(Style style) { - setValue(20, getColor().ordinal() & 0xFF | style.ordinal() << 8); - sendData(20); + setValue(13, getColor().ordinal() & 0xFF | style.ordinal() << 8); + sendData(13); } public void setTamed(boolean tamed) { - setFlag(2, tamed); + setHorseFlag(2, tamed); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java index e44cd921..a6483d51 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ItemFrameWatcher.java @@ -11,14 +11,14 @@ public class ItemFrameWatcher extends FlagWatcher { } public ItemStack getItem() { - if (getValue(2, null) == null) { + if (getValue(5, null) == null) { return new ItemStack(0); } - return (ItemStack) getValue(8, null); + return (ItemStack) getValue(5, null); } public int getRotation() { - return (Integer) getValue(9, 0); + return (int) getValue(6, 0); } public void setItem(ItemStack newItem) { @@ -27,13 +27,13 @@ public class ItemFrameWatcher extends FlagWatcher { } newItem = newItem.clone(); newItem.setAmount(1); - setValue(8, newItem); - sendData(8); + setValue(5, newItem); + sendData(5); } public void setRotation(int rotation) { - setValue(9, (byte) (rotation % 4)); - sendData(9); + setValue(6, (byte) (rotation % 4)); + sendData(6); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java index 5659df03..b0a3609b 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java @@ -65,15 +65,15 @@ public class LivingWatcher extends FlagWatcher { } public float getHealth() { - return (Float) getValue(6, 0F); + return (float) getValue(6, 0F); } public double getMaxHealth() { return maxHealth; } - public boolean getPotionParticlesRemoved() { - return (byte) getValue(8, (byte) 0) == 1; + public boolean isPotionParticlesAmbient() { + return (boolean) getValue(8, false); } private int getPotions() { @@ -121,8 +121,8 @@ public class LivingWatcher extends FlagWatcher { } } - public void removePotionParticles(boolean particles) { - setValue(8, (byte) (particles ? 1 : 0)); + public void setPotionParticlesAmbient(boolean particles) { + setValue(8, particles); sendData(8); } @@ -136,6 +136,15 @@ public class LivingWatcher extends FlagWatcher { sendData(6); } + public int getArrowsSticking() { + return (int) getValue(9, 0); + } + + public void setArrowsSticking(int arrowsNo) { + setValue(9, arrowsNo); + sendData(9); + } + public void setMaxHealth(double newHealth) { this.maxHealth = newHealth; this.maxHealthSet = true; diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java index 301b2cba..8cf490d9 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java @@ -11,39 +11,30 @@ public class MinecartWatcher extends FlagWatcher { } public ItemStack getBlockInCart() { - int id = (Integer) getValue(20, 0) & 0xffff; - int data = (Integer) getValue(20, 0) >> 16; + int id = (int) getValue(8, 0) & 0xffff; + int data = (int) getValue(8, 0) >> 16; return new ItemStack(id, 1, (short) data); } - public int getBlockOffset() { - return (Integer) getValue(21, 0); + public int getBlockYOffset() { + return (int) getValue(9, 0); } - @Deprecated - public int getBlockOffSet() { - return getBlockOffset(); - } - - public float getDamage() { - return (Float) getValue(19, 0F); - } - - public boolean getViewBlockInCart() { - return ((byte) getValue(22, (byte) 0)) == (byte) 1; + public boolean isViewBlockInCart() { + return (boolean) getValue(10, false); } public void setBlockInCart(ItemStack item) { int id = item.getTypeId(); int data = item.getDurability(); - setValue(20, id & 0xffff | data << 16); - setValue(22, (byte) 1); - sendData(20, 22); + setValue(8, id & 0xffff | data << 16); + setValue(10, true); //Show block + sendData(8, 10); } public void setBlockOffset(int i) { - setValue(21, i); - sendData(21); + setValue(9, i); + sendData(9); } @Deprecated @@ -51,13 +42,8 @@ public class MinecartWatcher extends FlagWatcher { setBlockOffset(i); } - public void setDamage(float damage) { - setValue(19, damage); - sendData(19); - } - public void setViewBlockInCart(boolean viewBlock) { - setValue(22, (byte) (viewBlock ? 1 : 0)); - sendData(22); + setValue(10, viewBlock); + sendData(10); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java index a4b55887..70450436 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/OcelotWatcher.java @@ -11,11 +11,11 @@ public class OcelotWatcher extends TameableWatcher { } public Type getType() { - return Ocelot.Type.getType((byte) getValue(18, (byte) 0)); + return Ocelot.Type.getType((int) getValue(14, 0)); } public void setType(Type newType) { - setValue(18, (byte) newType.getId()); - sendData(18); + setValue(14, newType.getId()); + sendData(14); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java index 98f42c17..94c0e9b4 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PaintingWatcher.java @@ -1,14 +1,15 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import org.bukkit.Art; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import org.bukkit.Art; public class PaintingWatcher extends FlagWatcher { private Art painting; + //TODO: Check this public PaintingWatcher(Disguise disguise) { super(disguise); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java index 967e051e..348b218d 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java @@ -4,6 +4,7 @@ import com.comphenix.protocol.PacketType.Play.Server; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.reflect.StructureModifier; +import com.comphenix.protocol.wrappers.WrappedGameProfile; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.disguisetypes.Disguise; @@ -28,10 +29,6 @@ public class PlayerWatcher extends LivingWatcher { return watcher; } - public int getArrowsSticking() { - return (byte) getValue(9, (byte) 0); - } - public BlockFace getSleepingDirection() { if (sleepingDirection == null) { if (this.getDisguise().getEntity() != null && isSleeping()) { @@ -44,32 +41,95 @@ public class PlayerWatcher extends LivingWatcher { return sleepingDirection; } - private boolean getValue16(int i) { - return ((byte) getValue(16, (byte) 0) & 1 << i) != 0; + +// Bit 0 (0x01): Cape enabled +// Bit 1 (0x02): Jacket enabled +// Bit 2 (0x04): Left Sleeve enabled +// Bit 3 (0x08): Right Sleeve enabled +// Bit 4 (0x10): Left Pants Leg enabled +// Bit 5 (0x20): Right Pants Leg enabled +// Bit 6 (0x40): Hat enabled + + private boolean isSkinFlag(int i) { + return ((byte) getValue(12, (byte) 0) & 1 << i) != 0; } - public boolean isHideCape() { - return getValue16(1); + public boolean isCapeEnabled() { + return isSkinFlag(1); } + public boolean isJackedEnabled() { + return isSkinFlag(2); + } + + public boolean isLeftSleeveEnabled() { + return isSkinFlag(3); + } + + public boolean isRightSleeveEnabled() { + return isSkinFlag(4); + } + + public boolean isLeftPantsEnabled() { + return isSkinFlag(5); + } + + public boolean isRightPantsEnabled() { + return isSkinFlag(6); + } + + public boolean isHatEnabled() { + return isSkinFlag(7); + } + + public void setCapeEnabled(boolean enabled) { + setSkinFlags(1, enabled); + sendData(12); + } + + public void setJackedEnabled(boolean enabled) { + setSkinFlags(2, enabled); + sendData(12); + } + + public void setLeftSleeveEnabled(boolean enabled) { + setSkinFlags(3, enabled); + sendData(12); + } + + public void setRightSleeveEnabled(boolean enabled) { + setSkinFlags(4, enabled); + sendData(12); + } + + public void setLeftPantsEnabled(boolean enabled) { + setSkinFlags(5, enabled); + sendData(12); + } + + public void setRightPantsEnabled(boolean enabled) { + setSkinFlags(6, enabled); + sendData(12); + } + + public void setHatEnabled(boolean enabled) { + setSkinFlags(7, enabled); + sendData(12); + } + + public boolean isSleeping() { return isInBed; } - public void setArrowsSticking(int arrowsNo) { - setValue(9, (byte) arrowsNo); - sendData(9); - } - - public void setHideCape(boolean hideCape) { - setValue16(1, hideCape); - sendData(16); - } - public void setSkin(String playerName) { ((PlayerDisguise) getDisguise()).setSkin(playerName); } + public void setSkin(WrappedGameProfile profile) { + ((PlayerDisguise) getDisguise()).setSkin(profile); + } + public void setSleeping(BlockFace sleepingDirection) { setSleeping(true, sleepingDirection); } @@ -125,12 +185,12 @@ public class PlayerWatcher extends LivingWatcher { } } - private void setValue16(int i, boolean flag) { - byte b0 = (byte) getValue(16, (byte) 0); + private void setSkinFlags(int i, boolean flag) { + byte b0 = (byte) getValue(12, (byte) 0); if (flag) { - setValue(16, (byte) (b0 | 1 << i)); + setValue(12, (byte) (b0 | 1 << i)); } else { - setValue(16, (byte) (b0 & (~1 << i))); + setValue(12, (byte) (b0 & (~1 << i))); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java index 89a91790..4a9e4159 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java @@ -13,12 +13,12 @@ public class RabbitWatcher extends AgeableWatcher { } public RabbitType getType() { - return RabbitType.getType((Integer) getValue(18, 0)); + return RabbitType.getType((int) getValue(18, 0)); } public void setType(RabbitType type) { - setValue(18, (byte) type.getTypeId()); - sendData(18); + setValue(12, type.getTypeId()); + sendData(12); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java index 71476417..66f4f9b3 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java @@ -7,30 +7,30 @@ public class SheepWatcher extends AgeableWatcher { public SheepWatcher(Disguise disguise) { super(disguise); - setValue(16, (byte) 0); + setValue(12, (byte) 0); } public AnimalColor getColor() { - return AnimalColor.getColor((byte) getValue(16, (byte) 0) & 15); + return AnimalColor.getColor((byte) getValue(12, (byte) 0) & 15); } public boolean isSheared() { - return ((byte) getValue(16, (byte) 0) & 16) != 0; + return ((byte) getValue(12, (byte) 0) & 16) != 0; } public void setColor(AnimalColor color) { - byte b0 = (byte) getValue(16, (byte) 0); - setValue(16, (byte) (b0 & 240 | color.getId() & 15)); - sendData(16); + byte b0 = (byte) getValue(12, (byte) 0); + setValue(12, (byte) (b0 & 240 | color.getId() & 15)); + sendData(12); } public void setSheared(boolean flag) { - byte b0 = (byte) getValue(16, (byte) 0); + byte b0 = (byte) getValue(12, (byte) 0); if (flag) { - setValue(16, (byte) (b0 | 16)); + setValue(12, (byte) (b0 | 16)); } else { - setValue(16, (byte) (b0 & -17)); + setValue(12, (byte) (b0 & -17)); } - sendData(16); + sendData(12); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java new file mode 100644 index 00000000..089ddb5f --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java @@ -0,0 +1,43 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import com.comphenix.protocol.wrappers.BlockPosition; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import org.bukkit.block.BlockFace; + +import java.util.Optional; + +/** + * @author Navid + */ +//TODO: Add the appropriate data values to this class +public class ShulkerWatcher extends LivingWatcher { + + public ShulkerWatcher(Disguise disguise) { + super(disguise); + } + + public BlockFace getFacingDirection() { + return BlockFace.UP; + } + + public void setFacingDirection() { + + } + + public Optional getAttachmentPosition() { + return Optional.empty(); + } + + public void setAttachmentPosition(BlockPosition pos) { + + } + + public byte getShieldHeight() { + return 0x00; + } + + public void setShieldHeight() { + + } + +} diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java new file mode 100644 index 00000000..ad010ad5 --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java @@ -0,0 +1,23 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; +import org.bukkit.entity.Skeleton.SkeletonType; + +/** + * @author Navid + */ +public class SkeletonWatcher extends LivingWatcher { + + public SkeletonWatcher(Disguise disguise) { + super(disguise); + } + + public void setType(SkeletonType type) { + setValue(11, type.getId()); + sendData(11); + } + + public SkeletonType getType() { + return SkeletonType.getType((int) getValue(11, SkeletonType.NORMAL.getId())); + } +} diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java index fb2a40fb..1a8b5a11 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java @@ -12,15 +12,15 @@ public class SlimeWatcher extends LivingWatcher { } public int getSize() { - return (byte) getValue(16, (byte) 1); + return (int) getValue(11, 1); } public void setSize(int size) { if (size <= 0 || size >= 128) { size = 1; } - setValue(16, (byte) size); - sendData(16); + setValue(11, size); + sendData(11); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java index 2381b90e..c240336a 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TameableWatcher.java @@ -1,62 +1,53 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import com.google.common.base.Optional; import me.libraryaddict.disguise.disguisetypes.Disguise; +import java.util.UUID; + public class TameableWatcher extends AgeableWatcher { public TameableWatcher(Disguise disguise) { super(disguise); } - @Override - public float getHealth() { - return (Float) getValue(18, 8F); - } - - public String getOwner() { - return (String) getValue(17, null); + public Optional getOwner() { + return (Optional) getValue(13, Optional.absent()); } public boolean isSitting() { - return isTrue(1); + return isTameableFlag(1); } public boolean isTamed() { - return isTrue(4); + return isTameableFlag(4); } - protected boolean isTrue(int no) { - return ((byte) getValue(16, (byte) 0) & no) != 0; + protected boolean isTameableFlag(int no) { + return ((byte) getValue(12, (byte) 0) & no) != 0; } - protected void setFlag(int no, boolean flag) { - byte b0 = (byte) getValue(16, (byte) 0); + protected void setTameableFlag(int no, boolean flag) { + byte b0 = (byte) getValue(12, (byte) 0); if (flag) { - setValue(16, (byte) (b0 | no)); + setValue(12, (byte) (b0 | no)); } else { - setValue(16, (byte) (b0 & -(no + 1))); + setValue(12, (byte) (b0 & -(no + 1))); } - sendData(16); + sendData(12); } - @Override - public void setHealth(float newHealth) { - setValue(18, newHealth); - setValue(6, newHealth); - sendData(6, 18); - } - - public void setOwner(String owner) { - setValue(17, owner); - sendData(17); + public void setOwner(Optional owner) { + setValue(13, owner); + sendData(13); } public void setSitting(boolean sitting) { - setFlag(1, sitting); + setTameableFlag(1, sitting); } public void setTamed(boolean tamed) { - setFlag(4, tamed); + setTameableFlag(4, tamed); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java new file mode 100644 index 00000000..20a5254a --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java @@ -0,0 +1,24 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; +import org.bukkit.Color; + +/** + * @author Navid + */ +public class TippedArrowWatcher extends ArrowWatcher { + + public TippedArrowWatcher(Disguise disguise) { + super(disguise); + } + + public Color getColor() { + int color = (int) getValue(5, Color.WHITE.asRGB()); + return Color.fromRGB(color); + } + + public void setColor(Color color) { + setValue(5, color.asRGB()); + sendData(5); + } +} diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java index 97ed639b..9413b946 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java @@ -1,11 +1,10 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import java.util.Random; - import me.libraryaddict.disguise.disguisetypes.Disguise; - import org.bukkit.entity.Villager.Profession; +import java.util.Random; + public class VillagerWatcher extends AgeableWatcher { public VillagerWatcher(Disguise disguise) { @@ -14,12 +13,12 @@ public class VillagerWatcher extends AgeableWatcher { } public Profession getProfession() { - return Profession.values()[(Integer) getValue(16, 0)]; + return Profession.getProfession((int) getValue(16, 0)); } public void setProfession(int professionId) { - setValue(16, professionId % 6); - sendData(16); + setValue(12, professionId); + sendData(12); } public void setProfession(Profession newProfession) { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.java new file mode 100644 index 00000000..4dd4f491 --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.java @@ -0,0 +1,24 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; + +/** + * @author Navid + */ +public class WitchWatcher extends LivingWatcher { + + public WitchWatcher(Disguise disguise) { + super(disguise); + } + + + public boolean isAggressive() { + return (boolean) getValue(11, false); + } + + public void setAggressive(boolean aggressive) { + setValue(11, aggressive); + sendData(11); + } + +} diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.java index f2fa809f..2c39a5ae 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherSkullWatcher.java @@ -10,12 +10,12 @@ public class WitherSkullWatcher extends FlagWatcher { } public boolean isBlue() { - return (byte) getValue(10, (byte) 0) == 1; + return (boolean) getValue(5, false); } public void setBlue(boolean blue) { - setValue(10, (byte) (blue ? 1 : 0)); - sendData(10); + setValue(5, blue); + sendData(5); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java index d80603e1..fb482c34 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitherWatcher.java @@ -1,10 +1,9 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import java.security.InvalidParameterException; - +import me.libraryaddict.disguise.disguisetypes.Disguise; import org.bukkit.ChatColor; -import me.libraryaddict.disguise.disguisetypes.Disguise; +import java.security.InvalidParameterException; public class WitherWatcher extends LivingWatcher { @@ -12,25 +11,24 @@ public class WitherWatcher extends LivingWatcher { super(disguise); } - public int getInvul() { - return getInvulnerability(); - } - + /** + * Returns the amount of time this Wither is invulnerable for + * @return + */ public int getInvulnerability() { - return (Integer) getValue(20, 0); + return (int) getValue(14, 0); } public int[] getTargets() { - return new int[]{(Integer) getValue(17, 0), (Integer) getValue(18, 0), (Integer) getValue(19, 0)}; - } - - public void setInvul(int invulnerability) { - setInvulnerability(invulnerability); + return new int[]{(Integer) getValue(11, 0), (Integer) getValue(12, 0), (Integer) getValue(13, 0)}; } + /** + * Sets the amount of time this Wither is invulnerable for + */ public void setInvulnerability(int invulnerability) { - setValue(20, invulnerability); - sendData(20); + setValue(14, invulnerability); + sendData(14); } public void setTargets(int... targets) { @@ -38,10 +36,10 @@ public class WitherWatcher extends LivingWatcher { throw new InvalidParameterException(ChatColor.RED + "Expected 3 numbers for wither setTargets. Received " + targets.length); } - setValue(17, targets[0]); - setValue(18, targets[1]); - setValue(19, targets[2]); - sendData(17, 18, 19); + setValue(11, targets[0]); + setValue(12, targets[1]); + setValue(13, targets[2]); + sendData(11, 12, 13); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java index a440975d..097c9f75 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java @@ -10,15 +10,41 @@ public class WolfWatcher extends TameableWatcher { } public AnimalColor getCollarColor() { - return AnimalColor.getColor((byte) getValue(20, (byte) 14)); + return AnimalColor.getColor((int) getValue(16, 14)); + } + + /** + * Used for tail rotation. + * @return + */ + public float getDamageTaken() { + return (float) getValue(14, 0); + } + + /** + * Used for tail rotation. + * @param damage + */ + public void setDamageTaken(float damage) { + setValue(14, damage); + sendData(14); + } + + public boolean isBegging() { + return (boolean) getValue(15, false); + } + + public void setBegging(boolean begging) { + setValue(15, begging); + sendData(15); } public boolean isAngry() { - return isTrue(2); + return isTameableFlag(2); } public void setAngry(boolean angry) { - setFlag(2, angry); + setTameableFlag(2, angry); } public void setCollarColor(AnimalColor newColor) { @@ -26,8 +52,8 @@ public class WolfWatcher extends TameableWatcher { setTamed(true); } if (newColor != getCollarColor()) { - setValue(20, (byte) newColor.getId()); - sendData(20); + setValue(14, (byte) newColor.getId()); + sendData(14); } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java index 82a4d134..09ca4537 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieWatcher.java @@ -1,6 +1,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; +import org.bukkit.entity.Villager.Profession; public class ZombieWatcher extends LivingWatcher { @@ -13,15 +14,32 @@ public class ZombieWatcher extends LivingWatcher { } public boolean isBaby() { - return (byte) getValue(12, (byte) 0) == 1; + return (boolean) getValue(11, false); } public boolean isShaking() { - return (byte) getValue(14, (byte) 0) == 1; + return (boolean) getValue(14, false); } + /** + * Is this zombie a villager? + * @return + */ public boolean isVillager() { - return (byte) getValue(13, (byte) 0) == 1; + return ((int)getValue(12, 0)) != 0; + } + + public boolean isAggressive() { + return (boolean) getValue(14, false); + } + + /** + * Only returns a valid value if this zombie + * is a villager. + * @return + */ + public Profession getProfession() { + return Profession.getProfession((int) getValue(12, 0)); } public void setAdult() { @@ -33,18 +51,38 @@ public class ZombieWatcher extends LivingWatcher { } public void setBaby(boolean baby) { - setValue(12, (byte) (baby ? 1 : 0)); - sendData(12); + setValue(11, baby); + sendData(11); } public void setShaking(boolean shaking) { - setValue(14, (byte) (shaking ? 1 : 0)); - sendData(14); - } - - public void setVillager(boolean villager) { - setValue(13, (byte) (villager ? 1 : 0)); + setValue(13, (byte) (shaking ? 1 : 0)); sendData(13); } + /** + * Sets the profession of this zombie, in turn + * turning it into a Zombie Villager + * @param id + */ + public void setProfession(int id) { + setValue(12, id); + sendData(12); + } + + /** + * Sets the profession of this zombie, in turn + * turning it into a Zombie Villager + * @param profession + */ + public void setProfession(Profession profession) { + setValue(12, profession.getId()); + sendData(12); + } + + public void setAggressive(boolean handsup) { + setValue(14, handsup); + sendData(14); + } + } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index c28fb5a7..42217160 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -699,6 +699,7 @@ public class DisguiseUtilities { /** * Resends the entity to all the watching players, which is where the magic begins */ + //TODO: Check this method, something's not right here public static void refreshTrackers(final TargetedDisguise disguise) { if (disguise.getEntity().isValid()) { PacketContainer destroyPacket = getDestroyPacket(disguise.getEntity().getEntityId()); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java index 841aebb7..28aed4ba 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -12,6 +12,8 @@ import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.wrappers.WrappedAttribute; import com.comphenix.protocol.wrappers.WrappedAttribute.Builder; import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedWatchableObject; import me.libraryaddict.disguise.DisguiseAPI; @@ -26,6 +28,7 @@ import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; import me.libraryaddict.disguise.disguisetypes.watchers.LivingWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.SheepWatcher; +import me.libraryaddict.disguise.disguisetypes.watchers.SlimeWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.WolfWatcher; import org.bukkit.Art; import org.bukkit.Bukkit; @@ -39,6 +42,7 @@ import org.bukkit.entity.ExperienceOrb; import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.entity.Slime; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; @@ -114,7 +118,6 @@ public class PacketsManager { public static PacketContainer[][] constructSpawnPackets(final Player player, Disguise disguise, Entity disguisedEntity) { if (disguise.getEntity() == null) disguise.setEntity(disguisedEntity); - Object nmsEntity = ReflectionManager.getNmsEntity(disguisedEntity); ArrayList packets = new ArrayList<>(); // This sends the armor packets so that the player isn't naked. // Please note it only sends the packets that wouldn't be sent normally @@ -170,6 +173,7 @@ public class PacketsManager { } if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) { + //TODO: Fix experience orb spawnPackets[0] = new PacketContainer(Server.SPAWN_ENTITY_EXPERIENCE_ORB); StructureModifier mods = spawnPackets[0].getModifier(); mods.write(0, disguisedEntity.getEntityId()); @@ -178,13 +182,15 @@ public class PacketsManager { mods.write(3, Math.floor(loc.getZ() * 32)); mods.write(4, 1); } else if (disguise.getType() == DisguiseType.PAINTING) { + //TODO: Fix painting spawnPackets[0] = new PacketContainer(Server.SPAWN_ENTITY_PAINTING); StructureModifier mods = spawnPackets[0].getModifier(); mods.write(0, disguisedEntity.getEntityId()); - mods.write(1, ReflectionManager.getBlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); - mods.write(2, ReflectionManager.getEnumDirection(((int) loc.getYaw()) % 4)); + mods.write(1, disguisedEntity.getUniqueId()); + mods.write(2, ReflectionManager.getBlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); + mods.write(3, ReflectionManager.getEnumDirection(((int) loc.getYaw()) % 4)); int id = ((MiscDisguise) disguise).getData(); - mods.write(3, ReflectionManager.getEnumArt(Art.values()[id])); + mods.write(4, ReflectionManager.getEnumArt(Art.values()[id])); // Make the teleport packet to make it visible.. spawnPackets[1] = new PacketContainer(Server.ENTITY_TELEPORT); @@ -265,19 +271,26 @@ public class PacketsManager { } else if (disguise.getType().isMob() || disguise.getType() == DisguiseType.ARMOR_STAND) { Class entityClass = disguise.getType().getEntityClass(); + int entityId = disguise.getType().getEntityId(); Entity entity = Bukkit.getWorlds().get(0).spawn(disguise.getEntity().getLocation(), entityClass); entity.setVelocity(disguisedEntity.getVelocity()); + if (disguise.getType() == DisguiseType.SLIME || disguise.getType() == DisguiseType.MAGMA_CUBE) { + ((Slime)entity).setSize(((SlimeWatcher)disguise.getWatcher()).getSize()); + } Object nms = ReflectionManager.getNmsEntity(entity); - PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.SPAWN_ENTITY_LIVING, nms) - .createPacket(nms); + PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.SPAWN_ENTITY_LIVING, nms).createPacket(nms); spawnPackets[0] = packet; - spawnPackets[0].getDataWatcherModifier().write(0, - createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); + spawnPackets[0].getIntegers().write(0, entityId); + spawnPackets[0].getDataWatcherModifier().write(0, createDataWatcher(WrappedDataWatcher.getEntityWatcher(disguisedEntity), disguise.getWatcher())); entity.remove(); //You know, as cheap as this may seem, this is pretty damn effective } else if (disguise.getType().isMisc()) { //TODO: Fix miscs - int id = disguise.getType().getEntityId(); + Class entityClass = disguise.getType().getEntityClass(); + Entity entity = Bukkit.getWorlds().get(0).spawn(disguise.getEntity().getLocation().add(0, 0.5, 0), entityClass); + entity.setVelocity(disguisedEntity.getVelocity()); + int entityId = disguise.getType().getEntityId(); + int typeId = disguise.getType().getTypeId(); int data = ((MiscDisguise) disguise).getData(); if (disguise.getType() == DisguiseType.FALLING_BLOCK) { data = (((MiscDisguise) disguise).getId() | data << 16); @@ -287,12 +300,10 @@ public class PacketsManager { } else if (disguise.getType() == DisguiseType.ITEM_FRAME) { data = ((((int) loc.getYaw() % 360) + 720 + 45) / 90) % 4; } - spawnPackets[0] = ProtocolLibrary.getProtocolManager() - .createPacketConstructor(Server.SPAWN_ENTITY, nmsEntity, id, data) - .createPacket(nmsEntity, id, data); - spawnPackets[0].getModifier().write(2, (int) Math.floor(loc.getY() * 32D)); - spawnPackets[0].getModifier().write(7, pitch); - spawnPackets[0].getModifier().write(8, yaw); + Object nms = ReflectionManager.getNmsEntity(entity); + spawnPackets[0] = ProtocolLibrary.getProtocolManager().createPacketConstructor(Server.SPAWN_ENTITY, nms, typeId, data) + .createPacket(nms, typeId, data); + spawnPackets[0].getIntegers().write(0, entityId); if (disguise.getType() == DisguiseType.ITEM_FRAME) { if (data % 2 == 0) { spawnPackets[0].getModifier().write(3, (int) Math.floor((loc.getZ() + (data == 0 ? -1 : 1)) * 32D)); @@ -300,6 +311,7 @@ public class PacketsManager { spawnPackets[0].getModifier().write(1, (int) Math.floor((loc.getX() + (data == 3 ? -1 : 1)) * 32D)); } } + entity.remove(); } if (spawnPackets[1] == null || disguise.isPlayerDisguise()) { int entry = spawnPackets[1] == null ? 1 : 0; @@ -320,13 +332,15 @@ public class PacketsManager { * Create a new datawatcher but with the 'correct' values */ private static WrappedDataWatcher createDataWatcher(WrappedDataWatcher watcher, FlagWatcher flagWatcher) { - //TODO: Specify a serializer... WrappedDataWatcher newWatcher = new WrappedDataWatcher(); try { List list = DisguiseConfig.isMetadataPacketsEnabled() ? flagWatcher.convert(watcher.getWatchableObjects()) : flagWatcher.getWatchableObjects(); for (WrappedWatchableObject watchableObject : list) { - newWatcher.setObject(watchableObject.getWatcherObject(), watchableObject.getValue()); + if (watchableObject.getValue() == null) continue; + if (Registry.get(watchableObject.getValue().getClass()) == null) continue; + WrappedDataWatcherObject obj = new WrappedDataWatcherObject(watchableObject.getIndex(), Registry.get(watchableObject.getValue().getClass())); + newWatcher.setObject(obj, watchableObject.getValue()); } } catch (Exception ex) { ex.printStackTrace(); @@ -912,7 +926,7 @@ public class PacketsManager { } else if (event.getPacketType() == PacketType.Play.Client.WINDOW_CLICK) { int slot = event.getPacket().getIntegers().read(1); org.bukkit.inventory.ItemStack clickedItem; - if (event.getPacket().getIntegers().read(3) == 1) { + if (event.getPacket().getShorts().read(3) == 1) { // Its a shift click clickedItem = event.getPacket().getItemModifier().read(0); if (clickedItem != null && clickedItem.getType() != Material.AIR) {