diff --git a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java index b89507ba..4534836e 100644 --- a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java @@ -13,6 +13,7 @@ import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.LibsPremium; import me.libraryaddict.disguise.utilities.metrics.MetricsInitalizer; import me.libraryaddict.disguise.utilities.packets.PacketsManager; +import me.libraryaddict.disguise.utilities.parser.DisguiseParser; import me.libraryaddict.disguise.utilities.reflection.DisguiseValues; import me.libraryaddict.disguise.utilities.reflection.FakeBoundingBox; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; @@ -77,6 +78,8 @@ public class LibsDisguises extends JavaPlugin { DisguiseConfig.loadConfig(); + DisguiseParser.createDefaultMethods(); + PacketsManager.addPacketListeners(); listener = new DisguiseListener(this); diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java index c6e1f01c..ba033726 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseCommand.java @@ -87,7 +87,7 @@ public class DisguiseCommand extends DisguiseBaseCommand implements TabCompleter private boolean setViewDisguise(String[] strings) { for (String string : strings) { - if (!string.equalsIgnoreCase("setViewSelfDisguise")) + if (!string.equalsIgnoreCase("setSelfDisguiseVisible")) continue; return true; diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java index 64e68c09..fda5cac8 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguisePlayerCommand.java @@ -131,7 +131,7 @@ public class DisguisePlayerCommand extends DisguiseBaseCommand implements TabCom private boolean setViewDisguise(String[] strings) { for (String string : strings) { - if (!string.equalsIgnoreCase("setViewSelfDisguise")) + if (!string.equalsIgnoreCase("setSelfDisguiseVisible")) continue; return true; diff --git a/src/main/java/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java b/src/main/java/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java index 0f96eaaa..614a01cf 100644 --- a/src/main/java/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java +++ b/src/main/java/me/libraryaddict/disguise/commands/DisguiseRadiusCommand.java @@ -219,7 +219,7 @@ public class DisguiseRadiusCommand extends DisguiseBaseCommand implements TabCom private boolean setViewDisguise(String[] strings) { for (String string : strings) { - if (!string.equalsIgnoreCase("setViewSelfDisguise")) + if (!string.equalsIgnoreCase("setSelfDisguiseVisible")) continue; return true; diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java index 28040917..fcaaf14b 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -406,14 +406,24 @@ public abstract class Disguise { return playerHiddenFromTab; } + @Deprecated public boolean isHidingArmorFromSelf() { return hideArmorFromSelf; } + @Deprecated public boolean isHidingHeldItemFromSelf() { return hideHeldItemFromSelf; } + public boolean isHideArmorFromSelf() { + return hideArmorFromSelf; + } + + public boolean isHideHeldItemFromSelf() { + return hideHeldItemFromSelf; + } + public boolean isKeepDisguiseOnPlayerDeath() { return this.keepDisguisePlayerDeath; } @@ -442,6 +452,7 @@ public abstract class Disguise { (getEntity() instanceof Player ? !isKeepDisguiseOnPlayerDeath() : getEntity().isDead()); } + @Deprecated public boolean isSelfDisguiseSoundsReplaced() { return hearSelfDisguise; } @@ -455,6 +466,10 @@ public abstract class Disguise { return viewSelfDisguise; } + public void setSelfDisguiseVisible(boolean selfDisguiseVisible) { + setViewSelfDisguise(selfDisguiseVisible); + } + /** * Returns true if the entity's name is showing through the disguise * @@ -619,6 +634,10 @@ public abstract class Disguise { return this; } + public boolean isHearSelfDisguise() { + return hearSelfDisguise; + } + public Disguise setHearSelfDisguise(boolean hearSelfDisguise) { this.hearSelfDisguise = hearSelfDisguise; @@ -711,8 +730,6 @@ public abstract class Disguise { getWatcher().setBackupValue(flag, backup == null ? null : backup.getDefault()); } - getWatcher().setNoGravity(true); - if (getEntity() instanceof Player && !getWatcher().hasCustomName()) { getWatcher().setCustomName(""); } @@ -730,6 +747,7 @@ public abstract class Disguise { * @param viewSelfDisguise * @return */ + @Deprecated public Disguise setViewSelfDisguise(boolean viewSelfDisguise) { if (isSelfDisguiseVisible() != viewSelfDisguise) { this.viewSelfDisguise = viewSelfDisguise; diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index 12b59a56..f4f16463 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -44,6 +44,8 @@ public class FlagWatcher { public FlagWatcher(Disguise disguise) { this.disguise = (TargetedDisguise) disguise; equipment = new LibsEquipment(this); + + setNoGravity(true); } private byte addEntityAnimations(byte originalValue, byte entityValue) { @@ -265,7 +267,7 @@ public class FlagWatcher { return getCustomName() != null; } - protected boolean hasValue(MetaIndex no) { + public boolean hasValue(MetaIndex no) { if (no == null) return false; @@ -280,6 +282,7 @@ public class FlagWatcher { return getData(MetaIndex.ENTITY_CUSTOM_NAME_VISIBLE); } + @Deprecated public boolean isEntityAnimationsAdded() { return addEntityAnimations; } @@ -335,7 +338,8 @@ public class FlagWatcher { } protected void sendData(MetaIndex... dataValues) { - if (!DisguiseAPI.isDisguiseInUse(getDisguise()) || getDisguise().getWatcher() != this) { + if (getDisguise() == null || !DisguiseAPI.isDisguiseInUse(getDisguise()) || + getDisguise().getWatcher() != this) { return; } @@ -391,6 +395,10 @@ public class FlagWatcher { } } + public boolean isAddEntityAnimations() { + return isEntityAnimationsAdded(); + } + public void setAddEntityAnimations(boolean isEntityAnimationsAdded) { addEntityAnimations = isEntityAnimationsAdded; } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AbstractHorseWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AbstractHorseWatcher.java index 6a032ae0..00571470 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AbstractHorseWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AbstractHorseWatcher.java @@ -24,6 +24,10 @@ public abstract class AbstractHorseWatcher extends AgeableWatcher { return isHorseFlag(8); } + public boolean isCarryingChest() { + return hasChest(); + } + /** * If the horse can be breeded, no visible effect * @@ -71,6 +75,11 @@ public abstract class AbstractHorseWatcher extends AgeableWatcher { return getData(MetaIndex.HORSE_META); } + public void setBreedable(boolean breedable) { + setCanBreed(breedable); + } + + @Deprecated public void setCanBreed(boolean breed) { setHorseFlag(16, breed); } @@ -84,8 +93,7 @@ public abstract class AbstractHorseWatcher extends AgeableWatcher { if (flag) { setData(MetaIndex.HORSE_META, (byte) (j | i)); - } - else { + } else { setData(MetaIndex.HORSE_META, (byte) (j & ~i)); } @@ -116,5 +124,4 @@ public abstract class AbstractHorseWatcher extends AgeableWatcher { public void setTamed(boolean tamed) { setHorseFlag(2, tamed); } - } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AbstractVillagerWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AbstractVillagerWatcher.java index bfb20892..dc73bbac 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AbstractVillagerWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AbstractVillagerWatcher.java @@ -15,4 +15,12 @@ public class AbstractVillagerWatcher extends AgeableWatcher { setData(MetaIndex.ABSTRACT_VILLAGER_ANGRY, ticks); sendData(MetaIndex.ABSTRACT_VILLAGER_ANGRY); } + + public int getAngry() { + return getData(MetaIndex.ABSTRACT_VILLAGER_ANGRY); + } + + public boolean isAngry() { + return getAngry() > 0; + } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java index e1ec6392..b41c531d 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java @@ -4,6 +4,7 @@ import com.comphenix.protocol.wrappers.WrappedParticle; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.disguisetypes.MetaIndex; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import org.apache.commons.lang.math.RandomUtils; import org.bukkit.Color; import org.bukkit.Particle; @@ -36,6 +37,7 @@ public class AreaEffectCloudWatcher extends FlagWatcher { return Color.fromRGB(color); } + @RandomDefaultValue public void setColor(Color color) { setData(MetaIndex.AREA_EFFECT_CLOUD_COLOR, color.asRGB()); sendData(MetaIndex.AREA_EFFECT_CLOUD_COLOR); 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 829e7edf..291f6fbe 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/BatWatcher.java @@ -3,23 +3,19 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; -public class BatWatcher extends InsentientWatcher -{ +public class BatWatcher extends InsentientWatcher { - public BatWatcher(Disguise disguise) - { + public BatWatcher(Disguise disguise) { super(disguise); setHanging(false); } - public boolean isHanging() - { + public boolean isHanging() { return getData(MetaIndex.BAT_HANGING) == 1; } - public void setHanging(boolean hanging) - { + public void setHanging(boolean hanging) { setData(MetaIndex.BAT_HANGING, hanging ? (byte) 1 : (byte) 0); sendData(MetaIndex.BAT_HANGING); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CatWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CatWatcher.java index 78f8a6cb..f9ca8359 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CatWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/CatWatcher.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.AnimalColor; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import org.bukkit.DyeColor; import org.bukkit.entity.Cat; @@ -22,6 +23,7 @@ public class CatWatcher extends TameableWatcher { return Cat.Type.values()[getData(MetaIndex.CAT_TYPE)]; } + @RandomDefaultValue public void setType(Cat.Type type) { setData(MetaIndex.CAT_TYPE, type.ordinal()); sendData(MetaIndex.CAT_TYPE); @@ -37,7 +39,7 @@ public class CatWatcher extends TameableWatcher { setTamed(true); } - if (newColor == getCollarColor().getDyeColor()) { + if (newColor == getCollarColor()) { return; } @@ -45,8 +47,8 @@ public class CatWatcher extends TameableWatcher { sendData(MetaIndex.CAT_COLLAR); } - public AnimalColor getCollarColor() { - return AnimalColor.getColorByWool(getData(MetaIndex.CAT_COLLAR)); + public DyeColor getCollarColor() { + return AnimalColor.getColorByWool(getData(MetaIndex.CAT_COLLAR)).getDyeColor(); } public void setLyingDown(boolean value) { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java index 372cb30d..f6eada77 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EnderCrystalWatcher.java @@ -10,33 +10,26 @@ import java.util.Optional; /** * @author Navid */ -public class EnderCrystalWatcher extends FlagWatcher -{ - public EnderCrystalWatcher(Disguise disguise) - { +public class EnderCrystalWatcher extends FlagWatcher { + public EnderCrystalWatcher(Disguise disguise) { super(disguise); } - public void setBeamTarget(BlockPosition position) - { - setData(MetaIndex.ENDER_CRYSTAL_BEAM, Optional.of(position)); + public void setBeamTarget(BlockPosition position) { + setData(MetaIndex.ENDER_CRYSTAL_BEAM, position == null ? Optional.empty() : Optional.of(position)); sendData(MetaIndex.ENDER_CRYSTAL_BEAM); } - public Optional getBeamTarget() - { - return getData(MetaIndex.ENDER_CRYSTAL_BEAM); + public BlockPosition getBeamTarget() { + return getData(MetaIndex.ENDER_CRYSTAL_BEAM).orElse(null); } - public void setShowBottom(boolean bool) - { + public void setShowBottom(boolean bool) { setData(MetaIndex.ENDER_CRYSTAL_PLATE, bool); sendData(MetaIndex.ENDER_CRYSTAL_PLATE); } - public boolean isShowBottom() - { + public boolean isShowBottom() { return getData(MetaIndex.ENDER_CRYSTAL_PLATE); } - } 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 70e3721c..58ca207e 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/EndermanWatcher.java @@ -55,9 +55,4 @@ public class EndermanWatcher extends InsentientWatcher { setData(MetaIndex.ENDERMAN_AGRESSIVE, isAggressive); sendData(MetaIndex.ENDERMAN_AGRESSIVE); } - - public void setUnknown(boolean bo) { - setData(MetaIndex.ENDERMAN_UNKNOWN, bo); - sendData(MetaIndex.ENDERMAN_UNKNOWN); - } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FoxWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FoxWatcher.java index 13b0fa5d..a5ef8bed 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FoxWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FoxWatcher.java @@ -2,6 +2,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import org.bukkit.entity.Fox; import java.util.Random; @@ -40,6 +41,7 @@ public class FoxWatcher extends AgeableWatcher { setFoxFlag(32, value); } + @RandomDefaultValue public Fox.Type getType() { return Fox.Type.values()[getData(MetaIndex.FOX_TYPE)]; } 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 6a9d3679..28a3e95b 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/GuardianWatcher.java @@ -31,6 +31,13 @@ public class GuardianWatcher extends InsentientWatcher { sendData(MetaIndex.GUARDIAN_TARGET); } + /** + * @return Entity id of target + */ + public int getTarget() { + return getData(MetaIndex.GUARDIAN_TARGET); + } + public void setTarget(Entity entity) { setTarget(entity == null ? 0 : entity.getEntityId()); } @@ -58,5 +65,4 @@ public class GuardianWatcher extends InsentientWatcher { setData(MetaIndex.GUARDIAN_RETRACT_SPIKES, isRetracting); sendData(MetaIndex.GUARDIAN_RETRACT_SPIKES); } - } 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 59d9cf7f..3dc00f07 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HorseWatcher.java @@ -1,13 +1,12 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import org.bukkit.Material; -import org.bukkit.entity.Horse.Color; -import org.bukkit.entity.Horse.Style; -import org.bukkit.inventory.ItemStack; - import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; +import org.bukkit.entity.Horse.Color; +import org.bukkit.entity.Horse.Style; +import org.bukkit.inventory.ItemStack; public class HorseWatcher extends AbstractHorseWatcher { public HorseWatcher(Disguise disguise) { @@ -25,11 +24,13 @@ public class HorseWatcher extends AbstractHorseWatcher { return Style.values()[(getData(MetaIndex.HORSE_COLOR) >>> 8)]; } + @RandomDefaultValue public void setColor(Color color) { setData(MetaIndex.HORSE_COLOR, color.ordinal() & 0xFF | getStyle().ordinal() << 8); sendData(MetaIndex.HORSE_COLOR); } + @RandomDefaultValue public void setStyle(Style style) { setData(MetaIndex.HORSE_COLOR, getColor().ordinal() & 0xFF | style.ordinal() << 8); sendData(MetaIndex.HORSE_COLOR); 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 3aff5e87..6de51820 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java @@ -17,10 +17,7 @@ import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; +import java.util.*; public class LivingWatcher extends FlagWatcher { private double maxHealth; @@ -122,6 +119,22 @@ public class LivingWatcher extends FlagWatcher { return maxHealthSet; } + public PotionEffectType[] getPotionEffects() { + PotionEffectType[] effects = new PotionEffectType[potionEffects.size()]; + + int i = 0; + + Iterator itel = potionEffects.iterator(); + + while (itel.hasNext()) { + PotionEffectType type = PotionEffectType.getByName(itel.next()); + + effects[i++] = type; + } + + return effects; + } + public void addPotionEffect(PotionEffectType potionEffect) { if (!hasPotionEffect(potionEffect)) { potionEffects.add(potionEffect.getName()); diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LlamaWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LlamaWatcher.java index c03d6760..46933142 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LlamaWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/LlamaWatcher.java @@ -31,8 +31,12 @@ public class LlamaWatcher extends ChestedHorseWatcher { setCarpet(color.getDyeColor()); } - public AnimalColor getCarpet() { - return AnimalColor.getColorByWool(getData(MetaIndex.LLAMA_CARPET)); + public DyeColor getCarpet() { + if (!hasValue(MetaIndex.LLAMA_CARPET)) { + return null; + } + + return AnimalColor.getColorByWool(getData(MetaIndex.LLAMA_CARPET)).getDyeColor(); } public void setStrength(int strength) { 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 6f428feb..01fa4468 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/MinecartWatcher.java @@ -14,13 +14,22 @@ public class MinecartWatcher extends FlagWatcher { } public ItemStack getBlockInCart() { + if (!hasValue(MetaIndex.MINECART_BLOCK)) { + return new ItemStack(Material.AIR); + } + return ReflectionManager.getItemStackByCombinedId(getData(MetaIndex.MINECART_BLOCK)); } + @Deprecated public int getBlockYOffset() { return getData(MetaIndex.MINECART_BLOCK_Y); } + public int getBlockOffset() { + return getData(MetaIndex.MINECART_BLOCK_Y); + } + public boolean isViewBlockInCart() { return getData(MetaIndex.MINECART_BLOCK_VISIBLE); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PandaWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PandaWatcher.java index bbfdb9c9..404177ef 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PandaWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PandaWatcher.java @@ -2,6 +2,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import org.bukkit.entity.Panda; import java.util.Random; @@ -45,11 +46,13 @@ public class PandaWatcher extends AgeableWatcher { return Panda.Gene.NORMAL; } + @RandomDefaultValue public void setMainGene(Panda.Gene gene) { setData(MetaIndex.PANDA_MAIN_GENE, (byte) gene.ordinal()); sendData(MetaIndex.PANDA_MAIN_GENE); } + @RandomDefaultValue public void setHiddenGene(Panda.Gene gene) { setData(MetaIndex.PANDA_HIDDEN_GENE, (byte) gene.ordinal()); sendData(MetaIndex.PANDA_HIDDEN_GENE); @@ -92,6 +95,11 @@ public class PandaWatcher extends AgeableWatcher { sendData(MetaIndex.PANDA_HEAD_SHAKING); } + public int getHeadShaking() { + return getHeadShakingTicks(); + } + + @Deprecated public int getHeadShakingTicks() { return getData(MetaIndex.PANDA_HEAD_SHAKING); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PillagerWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PillagerWatcher.java index d099b1d0..39578a7a 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PillagerWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PillagerWatcher.java @@ -11,7 +11,7 @@ public class PillagerWatcher extends IllagerWatcher { super(disguise); } - public void setAimimgBow(boolean value) { + public void setAimingBow(boolean value) { setData(MetaIndex.PILLAGER_AIMING_BOW, value); sendData(MetaIndex.PILLAGER_AIMING_BOW); } 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 2bd0385b..a3e9fbfe 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PlayerWatcher.java @@ -1,22 +1,14 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import me.libraryaddict.disguise.disguisetypes.EntityPose; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; -import org.bukkit.inventory.MainHand; - -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 com.google.gson.Gson; +import com.mojang.authlib.GameProfile; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; -import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; +import org.bukkit.inventory.MainHand; public class PlayerWatcher extends LivingWatcher { private boolean alwaysShowInTab = DisguiseConfig.isShowDisguisedPlayersInTab(); @@ -70,7 +62,7 @@ public class PlayerWatcher extends LivingWatcher { return isSkinFlag(1); } - public boolean isJackedEnabled() { + public boolean isJacketEnabled() { return isSkinFlag(2); } @@ -136,10 +128,15 @@ public class PlayerWatcher extends LivingWatcher { sendData(MetaIndex.PLAYER_SKIN); } + public WrappedGameProfile getSkin() { + return ((PlayerDisguise) getDisguise()).getGameProfile(); + } + public void setSkin(String playerName) { ((PlayerDisguise) getDisguise()).setSkin(playerName); } + @RandomDefaultValue public void setSkin(WrappedGameProfile profile) { ((PlayerDisguise) getDisguise()).setSkin(profile); } 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 ff0ff036..27dc9e73 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/RabbitWatcher.java @@ -4,25 +4,22 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.disguisetypes.RabbitType; import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; -public class RabbitWatcher extends AgeableWatcher -{ +public class RabbitWatcher extends AgeableWatcher { - public RabbitWatcher(Disguise disguise) - { + public RabbitWatcher(Disguise disguise) { super(disguise); setType(RabbitType.values()[DisguiseUtilities.random.nextInt(RabbitType.values().length)]); } - public RabbitType getType() - { + public RabbitType getType() { return RabbitType.getType(getData(MetaIndex.RABBIT_TYPE)); } - public void setType(RabbitType type) - { + @RandomDefaultValue + public void setType(RabbitType type) { setData(MetaIndex.RABBIT_TYPE, type.getTypeId()); sendData(MetaIndex.RABBIT_TYPE); } - } 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 83652e13..9707db83 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SheepWatcher.java @@ -11,8 +11,8 @@ public class SheepWatcher extends AgeableWatcher { super(disguise); } - public AnimalColor getColor() { - return AnimalColor.getColorByWool(((int) getData(MetaIndex.SHEEP_WOOL) & 15)); + public DyeColor getColor() { + return AnimalColor.getColorByWool(((int) getData(MetaIndex.SHEEP_WOOL) & 15)).getDyeColor(); } public boolean isSheared() { diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java index ef25a993..83b8f6af 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ShulkerWatcher.java @@ -29,7 +29,7 @@ public class ShulkerWatcher extends InsentientWatcher { } public BlockPosition getAttachmentPosition() { - return getData(MetaIndex.SHULKER_ATTACHED).get(); + return getData(MetaIndex.SHULKER_ATTACHED).orElse(BlockPosition.ORIGIN); } public void setAttachmentPosition(BlockPosition pos) { @@ -59,7 +59,7 @@ public class ShulkerWatcher extends InsentientWatcher { } public void setColor(DyeColor newColor) { - if (newColor == getColor().getDyeColor()) { + if (newColor == getColor()) { return; } @@ -67,7 +67,11 @@ public class ShulkerWatcher extends InsentientWatcher { sendData(MetaIndex.SHULKER_COLOR); } - public AnimalColor getColor() { - return AnimalColor.getColorByWool(getData(MetaIndex.SHULKER_COLOR)); + public DyeColor getColor() { + if (!hasValue(MetaIndex.SHULKER_COLOR)) { + return DyeColor.PURPLE; + } + + return AnimalColor.getColorByWool(getData(MetaIndex.SHULKER_COLOR)).getDyeColor(); } } 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 a57caf0b..e16d3000 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/SlimeWatcher.java @@ -3,11 +3,13 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; public class SlimeWatcher extends InsentientWatcher { public SlimeWatcher(Disguise disguise) { super(disguise); + setSize(DisguiseUtilities.random.nextInt(4) + 1); } @@ -15,6 +17,7 @@ public class SlimeWatcher extends InsentientWatcher { return getData(MetaIndex.SLIME_SIZE); } + @RandomDefaultValue public void setSize(int size) { if (size < 1) { size = 1; diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ThrowableWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ThrowableWatcher.java index 2764c3b2..bc593fd3 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ThrowableWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ThrowableWatcher.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.disguisetypes.MetaIndex; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import org.bukkit.inventory.ItemStack; /** @@ -21,6 +22,7 @@ public abstract class ThrowableWatcher extends FlagWatcher { return getData(MetaIndex.THROWABLE_ITEM); } + @RandomDefaultValue public void setItemStack(ItemStack item) { setData(MetaIndex.THROWABLE_ITEM, item); sendData(MetaIndex.THROWABLE_ITEM); diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java index 58828732..690b4f5f 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.MetaIndex; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import org.apache.commons.lang.math.RandomUtils; import org.bukkit.Color; @@ -20,10 +21,15 @@ public class TippedArrowWatcher extends ArrowWatcher { } public Color getColor() { + if (!hasValue(MetaIndex.TIPPED_ARROW_COLOR)) { + return Color.GRAY; + } + int color = getData(MetaIndex.TIPPED_ARROW_COLOR); return Color.fromRGB(color); } + @RandomDefaultValue public void setColor(Color color) { setData(MetaIndex.TIPPED_ARROW_COLOR, color.asRGB()); sendData(MetaIndex.TIPPED_ARROW_COLOR); diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TropicalFishWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TropicalFishWatcher.java index ce27f49e..81a7bd71 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TropicalFishWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/TropicalFishWatcher.java @@ -2,6 +2,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import org.bukkit.DyeColor; import org.bukkit.entity.TropicalFish; @@ -71,6 +72,7 @@ public class TropicalFishWatcher extends FishWatcher { return DyeColor.getByWoolData((byte) (getVariant() >> 24 & 0xFF)); } + @RandomDefaultValue public void setPatternColor(DyeColor dyeColor) { setVariant(getData(dyeColor, getBodyColor(), getPattern())); } @@ -84,6 +86,7 @@ public class TropicalFishWatcher extends FishWatcher { return DyeColor.getByWoolData((byte) (getVariant() >> 16 & 0xFF)); } + @RandomDefaultValue public void setBodyColor(DyeColor dyeColor) { setVariant(getData(dyeColor, dyeColor, getPattern())); } @@ -92,6 +95,7 @@ public class TropicalFishWatcher extends FishWatcher { return CraftPattern.fromData(getVariant() & 0xFFFF); } + @RandomDefaultValue public void setPattern(TropicalFish.Pattern pattern) { setVariant(getData(getPatternColor(), getBodyColor(), pattern)); } 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 375d3f4d..af8bd766 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/VillagerWatcher.java @@ -4,6 +4,7 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.disguisetypes.VillagerData; import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import org.bukkit.entity.Villager; import org.bukkit.entity.Villager.Profession; @@ -45,6 +46,7 @@ public class VillagerWatcher extends AbstractVillagerWatcher { return getVillagerData().getLevel(); } + @RandomDefaultValue public void setProfession(Profession profession) { setVillagerData(new VillagerData(getType(), profession, getLevel())); } 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 0641c950..64e8c70b 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java @@ -11,8 +11,8 @@ public class WolfWatcher extends TameableWatcher { super(disguise); } - public AnimalColor getCollarColor() { - return AnimalColor.getColorByWool(getData(MetaIndex.WOLF_COLLAR)); + public DyeColor getCollarColor() { + return AnimalColor.getColorByWool(getData(MetaIndex.WOLF_COLLAR)).getDyeColor(); } public boolean isBegging() { @@ -42,7 +42,7 @@ public class WolfWatcher extends TameableWatcher { setTamed(true); } - if (newColor == getCollarColor().getDyeColor()) { + if (newColor == getCollarColor()) { return; } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieVillagerWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieVillagerWatcher.java index 1e87cb94..c3a0bead 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieVillagerWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZombieVillagerWatcher.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.disguisetypes.VillagerData; +import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue; import org.bukkit.entity.Villager; import org.bukkit.entity.Villager.Profession; @@ -55,6 +56,7 @@ public class ZombieVillagerWatcher extends ZombieWatcher { return getVillagerData().getLevel(); } + @RandomDefaultValue public void setProfession(Profession profession) { setVillagerData(new VillagerData(getType(), profession, getLevel())); } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 570db515..8398a9f7 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -1,15 +1,13 @@ package me.libraryaddict.disguise.utilities; -import com.comphenix.protocol.PacketType; import com.comphenix.protocol.PacketType.Play.Server; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.wrappers.*; -import com.google.common.collect.ConcurrentHashMultiset; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonSyntaxException; import com.mojang.authlib.properties.PropertyMap; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseConfig; @@ -18,7 +16,6 @@ import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.*; import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType; import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher; -import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher; import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher; import me.libraryaddict.disguise.utilities.json.*; import me.libraryaddict.disguise.utilities.packets.LibsPackets; @@ -29,8 +26,10 @@ import me.libraryaddict.disguise.utilities.reflection.LibsProfileLookup; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import me.libraryaddict.disguise.utilities.translations.LibsMsg; import org.apache.logging.log4j.util.Strings; -import org.bukkit.*; -import org.bukkit.block.BlockFace; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.craftbukkit.libs.org.apache.commons.io.FileUtils; import org.bukkit.entity.*; import org.bukkit.inventory.EquipmentSlot; @@ -600,6 +599,12 @@ public class DisguiseUtilities { return gson.fromJson(cached, WrappedGameProfile.class); } + catch (JsonSyntaxException ex) { + DisguiseUtilities.getLogger() + .warning("Gameprofile " + file.getName() + " had invalid gson and has been deleted"); + cachedNames.remove(playerName.toLowerCase()); + file.delete(); + } catch (Exception e) { e.printStackTrace(); } @@ -705,8 +710,14 @@ public class DisguiseUtilities { final String playerName = origName.toLowerCase(); if (DisguiseConfig.isSaveGameProfiles() && hasGameProfile(playerName)) { - return getGameProfile(playerName); - } else if (Pattern.matches("([A-Za-z0-9_]){1,16}", origName)) { + WrappedGameProfile profile = getGameProfile(playerName); + + if (profile != null) { + return profile; + } + } + + if (Pattern.matches("([A-Za-z0-9_]){1,16}", origName)) { final Player player = Bukkit.getPlayerExact(playerName); if (player != null) { diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerClientInteract.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerClientInteract.java index 9f2455a4..f39eced9 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerClientInteract.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerClientInteract.java @@ -182,17 +182,19 @@ public class PacketListenerClientInteract extends PacketAdapter { if (disguise.getType() == DisguiseType.SHEEP) { SheepWatcher watcher = (SheepWatcher) disguise.getWatcher(); - watcher.setColor(DisguiseConfig.isSheepDyeable() ? color : watcher.getColor()); + watcher.setColor(DisguiseConfig.isSheepDyeable() ? color.getDyeColor() : watcher.getColor()); break; } else if (disguise.getType() == DisguiseType.WOLF) { WolfWatcher watcher = (WolfWatcher) disguise.getWatcher(); - watcher.setCollarColor(DisguiseConfig.isWolfDyeable() ? color : watcher.getCollarColor()); + watcher.setCollarColor( + DisguiseConfig.isWolfDyeable() ? color.getDyeColor() : watcher.getCollarColor()); break; } else if (disguise.getType() == DisguiseType.CAT) { CatWatcher watcher = (CatWatcher) disguise.getWatcher(); - watcher.setCollarColor(DisguiseConfig.isCatDyeable() ? color : watcher.getCollarColor()); + watcher.setCollarColor( + DisguiseConfig.isCatDyeable() ? color.getDyeColor() : watcher.getCollarColor()); break; } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java index 5d81ea88..e2e3a4c8 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguiseParser.java @@ -1,6 +1,7 @@ package me.libraryaddict.disguise.utilities.parser; import com.comphenix.protocol.wrappers.WrappedGameProfile; +import com.google.gson.Gson; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.disguisetypes.*; import me.libraryaddict.disguise.utilities.DisguiseUtilities; @@ -17,6 +18,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.potion.PotionEffectType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -25,6 +27,185 @@ import java.util.Map.Entry; import java.util.concurrent.TimeUnit; public class DisguiseParser { + private static HashMap> defaultWatcherValues = new HashMap<>(); + + public static void createDefaultMethods() { + try { + for (DisguiseType type : DisguiseType.values()) { + Disguise disguise; + + if (type.isMisc()) { + disguise = new MiscDisguise(type); + } else if (type.isMob()) { + disguise = new MobDisguise(type); + } else { + disguise = new PlayerDisguise("Foobar"); + } + + FlagWatcher watcher = type.getWatcherClass().getConstructor(Disguise.class).newInstance(disguise); + + Method[] methods = ParamInfoManager.getDisguiseWatcherMethods(watcher.getClass()); + + for (Method setMethod : methods) { + // Invalidate methods that can't be handled normally + if (setMethod.getName().equals("addPotionEffect") || (setMethod.getName().equals("setSkin") && + setMethod.getParameterTypes()[0] == String.class) || + (setMethod.getName().equals("setTarget") && + setMethod.getParameterTypes()[0] != int.class) || + (setMethod.getName().equals("setItemInMainHand") && + setMethod.getParameterTypes()[0] == Material.class)) { + continue; + } + + String getName = setMethod.getName().substring(3); // Remove 'set' + + if (getName.equals("HasNectar")) { + getName = "hasNectar"; + } else if (getName.equals("HasStung")) { + getName = "hasStung"; + } else if (setMethod.getParameterTypes()[0].isAssignableFrom(boolean.class)) { + getName = "is" + getName; + } else { + getName = "get" + getName; + } + + Method getMethod = null; + + for (Method m : setMethod.getDeclaringClass().getDeclaredMethods()) { + if (!m.getName().equals(getName)) { + continue; + } + + if (m.getParameterTypes().length > 0 || m.getReturnType() != setMethod.getParameterTypes()[0]) { + continue; + } + + getMethod = m; + break; + } + + if (getMethod == null) { + DisguiseUtilities.getLogger().severe(String + .format("No such method '%s' when looking for the companion of '%s' in '%s'", getName, + setMethod.getName(), setMethod.getDeclaringClass().getSimpleName())); + continue; + } + + Object defaultValue = null; + + // Value is randomish so shouldn't be checked, should always specify value when setting + if (!setMethod.isAnnotationPresent(RandomDefaultValue.class)) { + Object invokeWith = watcher; + + if (!FlagWatcher.class.isAssignableFrom(getMethod.getDeclaringClass())) { + invokeWith = disguise; + } + + defaultValue = getMethod.invoke(invokeWith); + } + + addWatcherDefault(setMethod, getMethod, defaultValue); + } + } + } + catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + } + } + + public static String parseToString(Disguise disguise) { + try { + StringBuilder stringBuilder = new StringBuilder(); + + stringBuilder.append(disguise.getType().name()); + + if (disguise.isPlayerDisguise()) { + stringBuilder.append(" ").append(((PlayerDisguise) disguise).getName()); + } + + for (Method m : ParamInfoManager.getDisguiseWatcherMethods(disguise.getType().getWatcherClass())) { + // Special handling for this method + if (m.getName().equals("addPotionEffect")) { + PotionEffectType[] types = (PotionEffectType[]) m.getDeclaringClass().getMethod("getPotionEffects") + .invoke(disguise.getWatcher()); + + for (PotionEffectType type : types) { + if (type == null) { + continue; + } + + stringBuilder.append(" ").append(m.getName()).append(" ").append(type.getName()); + } + } else { + Entry entry = defaultWatcherValues.get(m); + + if (entry == null) { + continue; + } + + Object invokeWith = m.getDeclaringClass().isInstance(disguise) ? disguise : disguise.getWatcher(); + + Object ourValue = entry.getKey().invoke(invokeWith); + + // Escape a hacky fix for custom names, disguised players with custom names don't want to show it + // so it was set to an empty string. + if ("".equals(ourValue) && m.getName().equals("setCustomName")) { + ourValue = null; + } + + // If its the same as default, continue + if (!m.isAnnotationPresent(RandomDefaultValue.class) && + Objects.deepEquals(entry.getValue(), ourValue)) { + continue; + } + + stringBuilder.append(" ").append(m.getName()); + + if (ourValue instanceof Boolean && (Boolean) ourValue) { + continue; + } + + String valueString; + + if (ourValue != null) { + valueString = ParamInfoManager.getParamInfo(ourValue.getClass()).toString(ourValue); + + if (valueString.contains(" ") || valueString.contains("\"")) { + valueString = "\"" + valueString.replace("\\", "\\\\").replace("\"", "\\\"") + "\""; + } + } else { + valueString = "null"; + } + + stringBuilder.append(" ").append(valueString); + } + } + + return stringBuilder.toString(); + } + catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + } + + return null; + } + + private static void addWatcherDefault(Method setMethod, Method getMethod, Object object) { + Map.Entry entry = new HashMap.SimpleEntry<>(getMethod, object); + + if (defaultWatcherValues.containsKey(setMethod)) { + Object dObj = defaultWatcherValues.get(setMethod); + + if (!Objects.deepEquals(defaultWatcherValues.get(setMethod).getValue(), object)) { + throw new IllegalStateException(String.format("%s has conflicting values!", setMethod.getName())); + } + + return; + } + + defaultWatcherValues.put(setMethod, entry); + } + private static void doCheck(CommandSender sender, DisguisePermissions permissions, DisguisePerm disguisePerm, Collection usedOptions) throws DisguiseParseException { diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/RandomDefaultValue.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/RandomDefaultValue.java new file mode 100644 index 00000000..c88bab6f --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/RandomDefaultValue.java @@ -0,0 +1,14 @@ +package me.libraryaddict.disguise.utilities.parser; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Created by libraryaddict on 31/12/2019. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface RandomDefaultValue { +} diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfo.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfo.java index 9936abe5..2097f67c 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfo.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfo.java @@ -77,6 +77,8 @@ public abstract class ParamInfo { protected abstract Object fromString(String string) throws DisguiseParseException; + public abstract String toString(Object object); + public Object fromString(List arguments) throws DisguiseParseException { // Don't consume a string immediately, if it errors we need to check other param types String string = arguments.get(0); @@ -101,7 +103,7 @@ public abstract class ParamInfo { return getValues() != null; } - private Class getParamClass() { + protected Class getParamClass() { return paramClass; } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfoManager.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfoManager.java index 0c216da0..e4dd4f0a 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfoManager.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfoManager.java @@ -105,8 +105,8 @@ public class ParamInfoManager { }); // Add these last as it's what we want to present to be called the least - for (String methodName : new String[]{"setViewSelfDisguise", "setHideHeldItemFromSelf", "setHideArmorFromSelf", - "setHearSelfDisguise", "setHidePlayer", "setExpires"}) { + for (String methodName : new String[]{"setSelfDisguiseVisible", "setHideHeldItemFromSelf", + "setHideArmorFromSelf", "setHearSelfDisguise", "setHidePlayer", "setExpires"}) { try { methods.add(Disguise.class .getMethod(methodName, methodName.equals("setExpires") ? long.class : boolean.class)); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfoTypes.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfoTypes.java index f8a1d639..f4ae5ae7 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfoTypes.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/ParamInfoTypes.java @@ -107,9 +107,9 @@ public class ParamInfoTypes { return paramInfos; } - private Map getColors() { + private Map getColors() { try { - Map map = new HashMap<>(); + Map map = new HashMap<>(); Class cl = Class.forName("org.bukkit.Color"); for (Field field : cl.getFields()) { @@ -117,7 +117,7 @@ public class ParamInfoTypes { continue; } - map.put(field.getName(), field.get(null)); + map.put(field.getName(), (Color) field.get(null)); } return map; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/ParamInfoEnum.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/ParamInfoEnum.java index 526dfc45..26b9b73a 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/ParamInfoEnum.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/ParamInfoEnum.java @@ -21,7 +21,7 @@ public class ParamInfoEnum extends ParamInfo { super(paramClass, name, name, description, possibleValues); } - public ParamInfoEnum(Class paramClass, String name, String description, Map possibleValues) { + public ParamInfoEnum(Class paramClass, String name, String description, Map possibleValues) { super(paramClass, name, name, description, possibleValues); } @@ -39,4 +39,9 @@ public class ParamInfoEnum extends ParamInfo { return null; } + + @Override + public String toString(Object object) { + return object.toString(); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoBoolean.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoBoolean.java index 2037a972..3d168277 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoBoolean.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoBoolean.java @@ -42,6 +42,11 @@ public class ParamInfoBoolean extends ParamInfo { throw new IllegalStateException("This shouldn't be called"); } + @Override + public String toString(Object object) { + return object.toString(); + } + @Override public int getMinArguments() { return 0; diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoDouble.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoDouble.java index 97874087..1fad43b6 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoDouble.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoDouble.java @@ -19,4 +19,9 @@ public class ParamInfoDouble extends ParamInfo { protected Object fromString(String string) { return Double.parseDouble(string); } + + @Override + public String toString(Object object) { + return object.toString(); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoFloat.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoFloat.java index 7830c3bb..1c37e2e2 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoFloat.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoFloat.java @@ -19,4 +19,9 @@ public class ParamInfoFloat extends ParamInfo { protected Object fromString(String string) { return Float.parseFloat(string); } + + @Override + public String toString(Object object) { + return object.toString(); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoInteger.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoInteger.java index 0b0e2dc3..4ac17030 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoInteger.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoInteger.java @@ -19,4 +19,9 @@ public class ParamInfoInteger extends ParamInfo { protected Object fromString(String string) { return Integer.parseInt(string); } + + @Override + public String toString(Object object) { + return object.toString(); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoString.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoString.java index d6da3512..c7a17efa 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoString.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/base/ParamInfoString.java @@ -15,4 +15,9 @@ public class ParamInfoString extends ParamInfo { protected Object fromString(String string) { return ChatColor.translateAlternateColorCodes('&', string); } + + @Override + public String toString(Object object) { + return object.toString(); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoBlockPosition.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoBlockPosition.java index ec59651e..f31a40d9 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoBlockPosition.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoBlockPosition.java @@ -21,4 +21,11 @@ public class ParamInfoBlockPosition extends ParamInfo { return new BlockPosition(Integer.parseInt(split[0]), Integer.parseInt(split[1]), Integer.parseInt(split[2])); } + + @Override + public String toString(Object object) { + BlockPosition position = (BlockPosition) object; + + return String.format("%s,%s,%s", position.getX(), position.getY(), position.getZ()); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoColor.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoColor.java index 48112ac0..e81c7758 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoColor.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoColor.java @@ -9,23 +9,23 @@ import java.util.Map; * Created by libraryaddict on 19/09/2018. */ public class ParamInfoColor extends ParamInfoEnum { - private static Map staticColors; + private static Map staticColors; - public ParamInfoColor(Class paramClass, String name, String description, Map possibleValues) { + public ParamInfoColor(Class paramClass, String name, String description, Map possibleValues) { super(paramClass, name, description, possibleValues); - staticColors = possibleValues; + staticColors = (Map) possibleValues; } - protected static Color parseToColor(String string) { + protected Color parseToColor(String string) { string = string.replace("_", ""); - for (Map.Entry entry : staticColors.entrySet()) { + for (Map.Entry entry : staticColors.entrySet()) { if (!entry.getKey().replace("_", "").equalsIgnoreCase(string)) { continue; } - return (Color) entry.getValue(); + return entry.getValue(); } String[] split = string.split(","); @@ -39,6 +39,23 @@ public class ParamInfoColor extends ParamInfoEnum { return null; } + @Override + public String toString(Object object) { + Color color = (Color) object; + + if (staticColors.containsValue(color)) { + for (String key : staticColors.keySet()) { + if (staticColors.get(key) != color) { + continue; + } + + return key; + } + } + + return String.format("%s,%s,%s", color.getRed(), color.getGreen(), color.getBlue()); + } + @Override protected Object fromString(String string) { return parseToColor(string); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoEulerAngle.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoEulerAngle.java index ec17ee83..839447b1 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoEulerAngle.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoEulerAngle.java @@ -21,4 +21,11 @@ public class ParamInfoEulerAngle extends ParamInfo { return new EulerAngle(Double.parseDouble(split[0]), Double.parseDouble(split[1]), Double.parseDouble(split[2])); } + + @Override + public String toString(Object object) { + EulerAngle angle = (EulerAngle) object; + + return String.format("%s,%s,%s", angle.getX(), angle.getY(), angle.getZ()); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoGameProfile.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoGameProfile.java index 585962a5..abb26392 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoGameProfile.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoGameProfile.java @@ -1,11 +1,11 @@ package me.libraryaddict.disguise.utilities.parser.params.types.custom; import com.comphenix.protocol.wrappers.WrappedGameProfile; +import com.google.gson.Gson; +import com.mojang.authlib.GameProfile; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.parser.params.ParamInfo; -import java.lang.reflect.Method; - /** * Created by libraryaddict on 7/09/2018. */ @@ -15,7 +15,12 @@ public class ParamInfoGameProfile extends ParamInfo { } @Override - protected Object fromString( String string) { + protected Object fromString(String string) { return DisguiseUtilities.getGson().fromJson(string, WrappedGameProfile.class); } + + @Override + public String toString(Object object) { + return DisguiseUtilities.getGson().toJson(((WrappedGameProfile) object).getHandle(), GameProfile.class); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoItemStack.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoItemStack.java index 51ae597e..fe0527b2 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoItemStack.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoItemStack.java @@ -1,10 +1,12 @@ package me.libraryaddict.disguise.utilities.parser.params.types.custom; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.translations.TranslateType; import me.libraryaddict.disguise.utilities.parser.params.types.ParamInfoEnum; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; /** * Created by libraryaddict on 7/09/2018. @@ -32,7 +34,20 @@ public class ParamInfoItemStack extends ParamInfoEnum { return parseToItemstack(string); } + @Override + public String toString(Object object) { + return DisguiseUtilities.getGson().toJson(object); + } + protected static ItemStack parseToItemstack(String string) { + if (string.startsWith("{") && string.endsWith("}")) { + try { + return DisguiseUtilities.getGson().fromJson(string, ItemStack.class); + } + catch (Exception ex) { + } + } + return parseToItemstack(string.split("[:,]")); // Split on colon or comma } @@ -70,4 +85,8 @@ public class ParamInfoItemStack extends ParamInfoEnum { return itemStack; } + + public boolean isParam(Class paramClass) { + return getParamClass().isAssignableFrom(paramClass); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoItemStackArray.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoItemStackArray.java index cf7883e9..88c9ddad 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoItemStackArray.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoItemStackArray.java @@ -1,5 +1,6 @@ package me.libraryaddict.disguise.utilities.parser.params.types.custom; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; import org.bukkit.inventory.ItemStack; import java.util.LinkedHashSet; @@ -36,8 +37,21 @@ public class ParamInfoItemStackArray extends ParamInfoItemStack { return toReturn; } + @Override + public String toString(Object object) { + return DisguiseUtilities.getGson().toJson(object); + } + @Override public Object fromString(String string) { + if (string.startsWith("{") && string.endsWith("}")) { + try { + return DisguiseUtilities.getGson().fromJson(string, ItemStack[].class); + } + catch (Exception ex) { + } + } + String[] split = string.split(",", -1); if (split.length != 4) { diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoParticle.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoParticle.java index 70658ae4..7611e693 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoParticle.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoParticle.java @@ -2,13 +2,15 @@ package me.libraryaddict.disguise.utilities.parser.params.types.custom; import com.comphenix.protocol.wrappers.WrappedBlockData; import com.comphenix.protocol.wrappers.WrappedParticle; -import me.libraryaddict.disguise.utilities.translations.LibsMsg; import me.libraryaddict.disguise.utilities.parser.DisguiseParseException; +import me.libraryaddict.disguise.utilities.parser.params.ParamInfoManager; import me.libraryaddict.disguise.utilities.parser.params.types.ParamInfoEnum; +import me.libraryaddict.disguise.utilities.translations.LibsMsg; import org.apache.commons.lang.StringUtils; import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.Particle; +import org.bukkit.inventory.ItemStack; import java.util.Arrays; import java.util.HashSet; @@ -57,6 +59,32 @@ public class ParamInfoParticle extends ParamInfoEnum { return enums; } + @Override + public String toString(Object object) { + WrappedParticle particle = (WrappedParticle) object; + + Object data = particle.getData(); + String returns = particle.getParticle().name(); + + if (data != null) { + if (data instanceof ItemStack) { + returns += "," + ((ItemStack) data).getType().name(); + } else if (data instanceof WrappedBlockData) { + + returns += "," + ((WrappedBlockData) data).getType().name(); + } else if (data instanceof Particle.DustOptions) { + returns += "," + + ParamInfoManager.getParamInfo(Color.class).toString(((Particle.DustOptions) data).getColor()); + + if (((Particle.DustOptions) data).getSize() != 1f) { + returns += "," + ((Particle.DustOptions) data).getSize(); + } + } + } + + return returns; + } + @Override public Object fromString(String string) throws DisguiseParseException { String[] split = string.split("[:,]"); // Split on comma or colon @@ -99,7 +127,7 @@ public class ParamInfoParticle extends ParamInfoEnum { throw new DisguiseParseException(LibsMsg.PARSE_PARTICLE_REDSTONE, particle.name(), string); } - Color color = ParamInfoColor.parseToColor( + Color color = ((ParamInfoColor) ParamInfoManager.getParamInfo(Color.class)).parseToColor( StringUtils.join(Arrays.copyOfRange(split, 1, split.length - (split.length % 2)), ",")); if (color == null) { diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoTime.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoTime.java index 4eedc80f..71ca05d5 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoTime.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/params/types/custom/ParamInfoTime.java @@ -15,6 +15,10 @@ public class ParamInfoTime extends ParamInfo { @Override protected Object fromString(String string) throws DisguiseParseException { + if (string.matches("[0-9]{13,}")) { + return Long.parseLong(string); + } + long time = DisguiseParser.parseStringToTime(string); // If disguise expires X ticks afterwards @@ -27,4 +31,9 @@ public class ParamInfoTime extends ParamInfo { return time; } + + @Override + public String toString(Object object) { + return object.toString(); + } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java index 8ff43ecf..1cb88289 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java @@ -650,6 +650,9 @@ public class ReflectionManager { return null; } + /** + * Gets the UUID of the player, as well as properly capitalized playername + */ public static WrappedGameProfile grabProfileAddUUID(String playername) { try { Object minecraftServer = getMinecraftServer();