From 956fef9ca1a7cee23a67bfc6d50b7ef2f767495c Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Wed, 4 Jun 2014 14:43:58 +1200 Subject: [PATCH] Add a config option which fixes a bug where you can dye sheep/wolf client sidedly --- config.yml | 6 ++++++ .../disguise/DisguiseConfig.java | 20 +++++++++++++++++++ .../disguise/utilities/PacketsManager.java | 20 ++++++++++++++++++- 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/config.yml b/config.yml index eb23d528..7eade644 100644 --- a/config.yml +++ b/config.yml @@ -28,6 +28,12 @@ RemoveHeldItem: false # Set this to true if you want the disguise to get the animations of the disguised entity. Such as invisible, on fire, sprinting, sneaking, blocking # This is only valid if you set a animation on the disguise itself. Because the entitys animations are applied otherwise. AddEntityAnimations: true +# When a sheep or wolf is right clicked with dye. The client automatically assumes it was successful and displays the sheeps wool or the wolfs collar as dyed. +# This is a option that either prevents that happening, or it changes their color officially in the plugin so that everyone sees it changed. +# Its currently set to false which means that the color is not changed and will refresh itself to the player. +# Please note that this will not remove the dye from their hands. This also does not check if the disguised entity is actually a sheep/wolf and wants a say in its color. +DyeableSheep: false +DyeableWolf: false # This is only called into action when the disguise is constructed using the commands. # And when the disguise supports that. This will not be used at all for plugins constructing the disguises for instance. # Such as prophunt. Its also false because its kind of a retarded feature. diff --git a/src/me/libraryaddict/disguise/DisguiseConfig.java b/src/me/libraryaddict/disguise/DisguiseConfig.java index f6284fcd..6220533e 100644 --- a/src/me/libraryaddict/disguise/DisguiseConfig.java +++ b/src/me/libraryaddict/disguise/DisguiseConfig.java @@ -9,6 +9,8 @@ public class DisguiseConfig { private static boolean bedEnabled; private static boolean blowDisguisesOnAttack; private static boolean collectEnabled; + private static boolean colorizeSheep; + private static boolean colorizeWolf; private static String disguiseBlownMessage; private static int disguiseCloneExpire; private static int disguiseEntityExpire; @@ -81,6 +83,8 @@ public class DisguiseConfig { setDisguiseEntityExpire(config.getInt("DisguiseEntityExpire")); setDisguiseCloneExpire(config.getInt("DisguiseCloneExpire")); setMaxClonedDisguises(config.getInt("DisguiseCloneSize")); + setSheepDyeable(config.getBoolean("DyeableSheep")); + setWolfDyeable(config.getBoolean("DyeableWolf")); } public static boolean isAnimationPacketsEnabled() { @@ -177,6 +181,10 @@ public class DisguiseConfig { return hearSelfDisguise; } + public static boolean isSheepDyeable() { + return colorizeSheep; + } + /** * Is the sound packets caught and modified */ @@ -202,6 +210,10 @@ public class DisguiseConfig { return witherSkullEnabled; } + public static boolean isWolfDyeable() { + return colorizeWolf; + } + public static void setAddEntityAnimations(boolean isEntityAnimationsAdded) { entityAnimationsAdded = isEntityAnimationsAdded; } @@ -347,6 +359,10 @@ public class DisguiseConfig { } } + public static void setSheepDyeable(boolean color) { + colorizeSheep = color; + } + /** * Set if the disguises play sounds when hurt */ @@ -369,6 +385,10 @@ public class DisguiseConfig { witherSkullEnabled = enabled; } + public static void setWolfDyeable(boolean color) { + colorizeWolf = color; + } + private DisguiseConfig() { } } diff --git a/src/me/libraryaddict/disguise/utilities/PacketsManager.java b/src/me/libraryaddict/disguise/utilities/PacketsManager.java index 0204d209..6e2d7ee2 100644 --- a/src/me/libraryaddict/disguise/utilities/PacketsManager.java +++ b/src/me/libraryaddict/disguise/utilities/PacketsManager.java @@ -8,6 +8,7 @@ import java.util.Random; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.LibsDisguises; +import me.libraryaddict.disguise.disguisetypes.AnimalColor; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; @@ -16,6 +17,8 @@ import me.libraryaddict.disguise.disguisetypes.MobDisguise; 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.WolfWatcher; import me.libraryaddict.disguise.utilities.DisguiseSound.SoundType; import me.libraryaddict.disguise.utilities.ReflectionManager.LibVersion; @@ -75,11 +78,26 @@ public class PacketsManager { try { Player observer = event.getPlayer(); StructureModifier entityModifer = event.getPacket().getEntityModifier(observer.getWorld()); - org.bukkit.entity.Entity entity = entityModifer.read(LibVersion.is1_7() ? 0 : 1); + Entity entity = entityModifer.read(LibVersion.is1_7() ? 0 : 1); if (entity instanceof ExperienceOrb || entity instanceof Item || entity instanceof Arrow || entity == observer) { event.setCancelled(true); } + ItemStack item = observer.getItemInHand(); + if (item != null && item.getType() == Material.INK_SACK) { + Disguise disguise = DisguiseAPI.getDisguise(observer, entity); + if (disguise != null + && (disguise.getType() == DisguiseType.SHEEP || disguise.getType() == DisguiseType.WOLF)) { + AnimalColor color = AnimalColor.getColor(item.getDurability()); + if (disguise.getType() == DisguiseType.SHEEP) { + SheepWatcher watcher = (SheepWatcher) disguise.getWatcher(); + watcher.setColor(DisguiseConfig.isSheepDyeable() ? color : watcher.getColor()); + } else { + WolfWatcher watcher = (WolfWatcher) disguise.getWatcher(); + watcher.setCollarColor(DisguiseConfig.isWolfDyeable() ? color : watcher.getCollarColor()); + } + } + } } catch (Exception e) { e.printStackTrace(); }