From 51483e05726c55a3cfe5d1f6bc3154e6a21083e5 Mon Sep 17 00:00:00 2001 From: NavidK0 Date: Sun, 6 Mar 2016 22:46:46 -0500 Subject: [PATCH] Updated all the flag watchers to 1.9 values Added some new flag watchers Added some new API methods to flag watchers Fixed some more disguises Added new options to some disguises Certain packets have been fixed Still not ready for use, but most mob disguises work WARNING, the plugin is still heavily in ALPHA - Currently not working: Player disguises Misc. disguises Joining a server while someone is disguised Sounds Names above heads Other packet related things --- .../libraryaddict/disguise/LibsDisguises.java | 4 + .../disguise/disguisetypes/Disguise.java | 15 ++- .../disguise/disguisetypes/FlagWatcher.java | 56 ++++++---- .../watchers/AgeableWatcher.java | 16 +-- .../watchers/ArmorStandWatcher.java | 29 +++-- .../disguisetypes/watchers/ArrowWatcher.java | 6 +- .../disguisetypes/watchers/BatWatcher.java | 6 +- .../disguisetypes/watchers/BlazeWatcher.java | 6 +- .../disguisetypes/watchers/BoatWatcher.java | 16 +-- .../watchers/CreeperWatcher.java | 12 +- .../watchers/DroppedItemWatcher.java | 7 +- .../watchers/EnderDragonWatcher.java | 22 ++++ .../watchers/EndermanWatcher.java | 23 ++-- .../watchers/FallingBlockWatcher.java | 6 +- .../disguisetypes/watchers/GhastWatcher.java | 6 +- .../watchers/GuardianWatcher.java | 61 +++++++++- .../disguisetypes/watchers/HorseWatcher.java | 100 +++++++++-------- .../watchers/ItemFrameWatcher.java | 14 +-- .../disguisetypes/watchers/LivingWatcher.java | 19 +++- .../watchers/MinecartWatcher.java | 40 +++---- .../disguisetypes/watchers/OcelotWatcher.java | 6 +- .../watchers/PaintingWatcher.java | 3 +- .../disguisetypes/watchers/PlayerWatcher.java | 104 ++++++++++++++---- .../disguisetypes/watchers/RabbitWatcher.java | 6 +- .../disguisetypes/watchers/SheepWatcher.java | 20 ++-- .../watchers/ShulkerWatcher.java | 43 ++++++++ .../watchers/SkeletonWatcher.java | 23 ++++ .../disguisetypes/watchers/SlimeWatcher.java | 6 +- .../watchers/TameableWatcher.java | 47 ++++---- .../watchers/TippedArrowWatcher.java | 24 ++++ .../watchers/VillagerWatcher.java | 11 +- .../disguisetypes/watchers/WitchWatcher.java | 24 ++++ .../watchers/WitherSkullWatcher.java | 6 +- .../disguisetypes/watchers/WitherWatcher.java | 36 +++--- .../disguisetypes/watchers/WolfWatcher.java | 36 +++++- .../disguisetypes/watchers/ZombieWatcher.java | 60 ++++++++-- .../disguise/utilities/DisguiseUtilities.java | 1 + .../disguise/utilities/PacketsManager.java | 50 ++++++--- 38 files changed, 655 insertions(+), 315 deletions(-) create mode 100644 src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java create mode 100644 src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java create mode 100644 src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SkeletonWatcher.java create mode 100644 src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java create mode 100644 src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WitchWatcher.java 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) {