From cc9dfe6bab836c5a9bfe4e509a671bf7f465b473 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Wed, 29 Aug 2018 13:05:29 +1200 Subject: [PATCH] Updated to 1.13.1 and other changes Updated error/debug output Changed quote splitter to use regex Updated default values for metadata to better replicate a normal entity Fixed typo, removed unused calls Fixed arrows gaining particles TippedArrows will now show a random color instead of aqua AreaEffectCloud will now show a random color AreaEffectCloud's color methods now uses color not int Added org.bukkit.Color to the disguise parameters available as RGB or name Added new method ParticlesColor to LivingWatcher Fixed LivingWatcher's potion effect particles --- pom.xml | 4 +- .../libraryaddict/disguise/LibsDisguises.java | 28 ++-- .../disguise/disguisetypes/MetaIndex.java | 72 ++++++---- .../watchers/AreaEffectCloudWatcher.java | 25 ++-- .../disguisetypes/watchers/ArrowWatcher.java | 2 +- .../watchers/EnderDragonWatcher.java | 6 +- .../disguisetypes/watchers/LivingWatcher.java | 135 ++++++++---------- .../watchers/TippedArrowWatcher.java | 14 +- .../disguise/utilities/DisguiseParser.java | 67 ++++----- .../disguise/utilities/DisguiseUtilities.java | 7 +- .../utilities/ReflectionFlagWatchers.java | 20 +++ .../disguise/utilities/ReflectionManager.java | 14 +- 12 files changed, 219 insertions(+), 175 deletions(-) diff --git a/pom.xml b/pom.xml index 27c85c2c..e60d7274 100644 --- a/pom.xml +++ b/pom.xml @@ -43,12 +43,12 @@ org.spigotmc spigot-api - 1.13-R0.1-SNAPSHOT + 1.13.1-R0.1-SNAPSHOT org.spigotmc spigot - 1.13-R0.1-SNAPSHOT + 1.13.1-R0.1-SNAPSHOT diff --git a/src/me/libraryaddict/disguise/LibsDisguises.java b/src/me/libraryaddict/disguise/LibsDisguises.java index a599849f..120ed000 100644 --- a/src/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/me/libraryaddict/disguise/LibsDisguises.java @@ -453,10 +453,6 @@ public class LibsDisguises extends JavaPlugin { default: break; } - - if (nmsEntityName != null) { - nmsClass = ReflectionManager.getNmsClass("Entity" + nmsEntityName); - } } try { @@ -506,6 +502,7 @@ public class LibsDisguises extends JavaPlugin { WrappedDataWatcher watcher = WrappedDataWatcher.getEntityWatcher(bukkitEntity); ArrayList indexes = MetaIndex.getFlags(disguiseType.getWatcherClass()); + boolean loggedName = false; for (WrappedWatchableObject watch : watcher.getWatchableObjects()) { MetaIndex flagType = MetaIndex.getFlag(watcherClass, watch.getIndex()); @@ -522,14 +519,25 @@ public class LibsDisguises extends JavaPlugin { Object ourValue = ReflectionManager.convertInvalidMeta(flagType.getDefault()); Object nmsValue = ReflectionManager.convertInvalidMeta(watch.getValue()); - if (ourValue != nmsValue && - ((ourValue == null || nmsValue == null) || ourValue.getClass() != nmsValue.getClass())) { - getLogger().severe("[MetaIndex mismatch for " + disguiseType + "! Index: " + watch.getIndex()); - getLogger().severe("MetaIndex: " + flagType.getDefault() + " (" + - flagType.getDefault().getClass() + ") (" + nmsEntity.getClass() + ") & " + - watcherClass.getSimpleName()); + if (ourValue.getClass() != nmsValue.getClass()) { + if (!loggedName) { + getLogger().severe(StringUtils.repeat("=", 20)); + getLogger().severe("MetaIndex mismatch! Disguise " + disguiseType + ", Entity " + + nmsEntityName); + loggedName = true; + } + + getLogger().severe(StringUtils.repeat("-", 20)); + getLogger().severe("Index: " + watch.getIndex() + " | " + + flagType.getFlagWatcher().getSimpleName() + " | " + MetaIndex.getName(flagType)); + Object flagDefault = flagType.getDefault(); + + getLogger().severe("LibsDisguises: " + flagDefault + " (" + flagDefault.getClass() + ")"); + getLogger().severe("LibsDisguises Converted: " + ourValue + " (" + ourValue.getClass() + ")"); getLogger().severe("Minecraft: " + watch.getRawValue() + " (" + watch.getRawValue().getClass() + ")"); + getLogger().severe("Minecraft Converted: " + nmsValue + " (" + nmsValue.getClass() + ")"); + getLogger().severe(StringUtils.repeat("-", 20)); } } diff --git a/src/me/libraryaddict/disguise/disguisetypes/MetaIndex.java b/src/me/libraryaddict/disguise/disguisetypes/MetaIndex.java index fcc3a20b..bca8306b 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/MetaIndex.java +++ b/src/me/libraryaddict/disguise/disguisetypes/MetaIndex.java @@ -33,7 +33,7 @@ public class MetaIndex { public static MetaIndex AREA_EFFECT_PARTICLE = new MetaIndex<>(AreaEffectCloudWatcher.class, 3, Particle.SPELL_MOB); - public static MetaIndex AREA_EFFECT_RADIUS = new MetaIndex<>(AreaEffectCloudWatcher.class, 0, 0F); + public static MetaIndex AREA_EFFECT_RADIUS = new MetaIndex<>(AreaEffectCloudWatcher.class, 0, 3F); public static MetaIndex ARMORSTAND_BODY = new MetaIndex<>(ArmorStandWatcher.class, 2, new Vector3F(0, 0, 0)); @@ -42,28 +42,30 @@ public class MetaIndex { new Vector3F(0, 0, 0)); public static MetaIndex ARMORSTAND_LEFT_ARM = new MetaIndex<>(ArmorStandWatcher.class, 3, - new Vector3F(0, 0, 0)); + new Vector3F(-10, 0, -10)); public static MetaIndex ARMORSTAND_LEFT_LEG = new MetaIndex<>(ArmorStandWatcher.class, 5, - new Vector3F(0, 0, 0)); + new Vector3F(-1, 0, -1)); public static MetaIndex ARMORSTAND_META = new MetaIndex<>(ArmorStandWatcher.class, 0, (byte) 0); public static MetaIndex ARMORSTAND_RIGHT_ARM = new MetaIndex<>(ArmorStandWatcher.class, 4, - new Vector3F(0, 0, 0)); + new Vector3F(-15, 0, 10)); public static MetaIndex ARMORSTAND_RIGHT_LEG = new MetaIndex<>(ArmorStandWatcher.class, 6, - new Vector3F(0, 0, 0)); + new Vector3F(1, 0, 1)); public static MetaIndex ARROW_CRITICAL = new MetaIndex<>(ArrowWatcher.class, 0, (byte) 0); + public static MetaIndex> ARROW_UUID = new MetaIndex<>(ArrowWatcher.class, 1, Optional.empty()); + public static MetaIndex BAT_HANGING = new MetaIndex<>(BatWatcher.class, 0, (byte) 1); public static MetaIndex BLAZE_BLAZING = new MetaIndex<>(BlazeWatcher.class, 0, (byte) 0); - public static MetaIndex BOAT_DAMAGE = new MetaIndex<>(BoatWatcher.class, 2, 40F); + public static MetaIndex BOAT_DAMAGE = new MetaIndex<>(BoatWatcher.class, 2, 0F); - public static MetaIndex BOAT_DIRECTION = new MetaIndex<>(BoatWatcher.class, 1, 0); + public static MetaIndex BOAT_DIRECTION = new MetaIndex<>(BoatWatcher.class, 1, 1); public static MetaIndex BOAT_LAST_HIT = new MetaIndex<>(BoatWatcher.class, 0, 0); @@ -89,21 +91,21 @@ public class MetaIndex { public static MetaIndex DOLPHIN_BREATH = new MetaIndex<>(DolphinWatcher.class, 2, 2400); public static MetaIndex DROPPED_ITEM = new MetaIndex<>(DroppedItemWatcher.class, 0, - new ItemStack(Material.STONE)); + new ItemStack(Material.AIR)); public static MetaIndex> ENDER_CRYSTAL_BEAM = new MetaIndex<>(EnderCrystalWatcher.class, 0, Optional.empty()); - public static MetaIndex ENDER_CRYSTAL_PLATE = new MetaIndex<>(EnderCrystalWatcher.class, 1, false); + public static MetaIndex ENDER_CRYSTAL_PLATE = new MetaIndex<>(EnderCrystalWatcher.class, 1, true); - public static MetaIndex ENDERD_RAGON_PHASE = new MetaIndex<>(EnderDragonWatcher.class, 0, 0); + public static MetaIndex ENDER_DRAGON_PHASE = new MetaIndex<>(EnderDragonWatcher.class, 0, 10); public static MetaIndex ENDERMAN_AGRESSIVE = new MetaIndex<>(EndermanWatcher.class, 1, false); public static MetaIndex> ENDERMAN_ITEM = new MetaIndex<>(EndermanWatcher.class, 0, Optional.empty()); - public static MetaIndex ENTITY_AIR_TICKS = new MetaIndex<>(FlagWatcher.class, 1, 0); + public static MetaIndex ENTITY_AIR_TICKS = new MetaIndex<>(FlagWatcher.class, 1, 300); public static MetaIndex> ENTITY_CUSTOM_NAME = new MetaIndex<>(FlagWatcher.class, 2, Optional.empty()); @@ -120,7 +122,7 @@ public class MetaIndex { BlockPosition.ORIGIN); public static MetaIndex FIREWORK_ITEM = new MetaIndex<>(FireworkWatcher.class, 0, - new ItemStack(Material.AIR)); + new ItemStack(Material.FIREWORK_ROCKET)); public static MetaIndex FISH_FROM_BUCKET = new MetaIndex<>(FishWatcher.class, 0, false); @@ -169,9 +171,9 @@ public class MetaIndex { public static MetaIndex LIVING_POTIONS = new MetaIndex<>(LivingWatcher.class, 2, 0); - public static MetaIndex LLAMA_CARPET = new MetaIndex<>(LlamaWatcher.class, 1, 0); + public static MetaIndex LLAMA_CARPET = new MetaIndex<>(LlamaWatcher.class, 1, -1); - public static MetaIndex LLAMA_COLOR = new MetaIndex<>(LlamaWatcher.class, 2, -1); + public static MetaIndex LLAMA_COLOR = new MetaIndex<>(LlamaWatcher.class, 2, 0); public static MetaIndex LLAMA_STRENGTH = new MetaIndex<>(LlamaWatcher.class, 0, 0); @@ -179,7 +181,7 @@ public class MetaIndex { public static MetaIndex MINECART_BLOCK_VISIBLE = new MetaIndex<>(MinecartWatcher.class, 5, false); - public static MetaIndex MINECART_BLOCK_Y = new MetaIndex<>(MinecartWatcher.class, 4, 0); + public static MetaIndex MINECART_BLOCK_Y = new MetaIndex<>(MinecartWatcher.class, 4, 6); public static MetaIndex MINECART_SHAKING_DIRECTION = new MetaIndex<>(MinecartWatcher.class, 1, 1); @@ -229,7 +231,7 @@ public class MetaIndex { public static MetaIndex> SHULKER_ATTACHED = new MetaIndex<>(ShulkerWatcher.class, 1, Optional.empty()); - public static MetaIndex SHULKER_COLOR = new MetaIndex<>(ShulkerWatcher.class, 3, (byte) 10); + public static MetaIndex SHULKER_COLOR = new MetaIndex<>(ShulkerWatcher.class, 3, (byte) 16); public static MetaIndex SHULKER_FACING = new MetaIndex<>(ShulkerWatcher.class, 0, Direction.DOWN); @@ -237,21 +239,21 @@ public class MetaIndex { public static MetaIndex SKELETON_SWING_ARMS = new MetaIndex<>(SkeletonWatcher.class, 0, false); - public static MetaIndex SLIME_SIZE = new MetaIndex<>(SlimeWatcher.class, 0, 0); + public static MetaIndex SLIME_SIZE = new MetaIndex<>(SlimeWatcher.class, 0, 1); public static MetaIndex SNOWMAN_DERP = new MetaIndex<>(SnowmanWatcher.class, 0, (byte) 16); public static MetaIndex SPIDER_CLIMB = new MetaIndex<>(SpiderWatcher.class, 0, (byte) 0); - public static MetaIndex SPLASH_POTION_ITEM; + public static MetaIndex SPLASH_POTION_ITEM = new MetaIndex<>(SplashPotionWatcher.class, 0, + new ItemStack(Material.SPLASH_POTION)); public static MetaIndex TAMEABLE_META = new MetaIndex<>(TameableWatcher.class, 0, (byte) 0); public static MetaIndex> TAMEABLE_OWNER = new MetaIndex<>(TameableWatcher.class, 1, Optional.empty()); - public static MetaIndex TIPPED_ARROW_COLOR = new MetaIndex<>(TippedArrowWatcher.class, 0, - Color.WHITE.asRGB()); + public static MetaIndex TIPPED_ARROW_COLOR = new MetaIndex<>(TippedArrowWatcher.class, 0, -1); public static MetaIndex TNT_FUSE_TICKS = new MetaIndex<>(TNTWatcher.class, 0, Integer.MAX_VALUE); @@ -293,7 +295,7 @@ public class MetaIndex { public static MetaIndex WOLF_COLLAR = new MetaIndex<>(WolfWatcher.class, 2, 14); - public static MetaIndex WOLF_DAMAGE = new MetaIndex<>(WolfWatcher.class, 0, 0F); + public static MetaIndex WOLF_DAMAGE = new MetaIndex<>(WolfWatcher.class, 0, 1F); public static MetaIndex ZOMBIE_AGGRESSIVE = new MetaIndex<>(ZombieWatcher.class, 2, false); @@ -308,14 +310,6 @@ public class MetaIndex { public static MetaIndex ZOMBIE_VILLAGER_SHAKING = new MetaIndex<>(ZombieVillagerWatcher.class, 0, false); static { - try { - SPLASH_POTION_ITEM = new MetaIndex<>(SplashPotionWatcher.class, 0, - new ItemStack(Material.valueOf("SPLASH_POTION"))); - } - catch (Exception ex) { - SPLASH_POTION_ITEM = new MetaIndex<>(SplashPotionWatcher.class, 0, new ItemStack(Material.POTION)); - } - setValues(); orderMetaIndexes(); } @@ -432,7 +426,7 @@ public class MetaIndex { toPrint.sort(String.CASE_INSENSITIVE_ORDER); for (String s : toPrint) { - DisguiseUtilities.getLogger().info(s); + DisguiseUtilities.getLogger().info(s); } } @@ -486,6 +480,24 @@ public class MetaIndex { return _values; } + @Deprecated + public static String getName(MetaIndex metaIndex) { + try { + for (Field field : MetaIndex.class.getFields()) { + if (field.get(null) != metaIndex) { + continue; + } + + return field.getName(); + } + } + catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return null; + } + public static void addMetaIndexes(MetaIndex... metaIndexes) { _values = Arrays.copyOf(values(), values().length + metaIndexes.length); diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java index c6be1090..76742ff2 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/AreaEffectCloudWatcher.java @@ -3,6 +3,8 @@ 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 org.apache.commons.lang.math.RandomUtils; +import org.bukkit.Color; import org.bukkit.Particle; /** @@ -13,21 +15,13 @@ public class AreaEffectCloudWatcher extends FlagWatcher { public AreaEffectCloudWatcher(Disguise disguise) { super(disguise); - setRadius(1); + setColor(Color.fromRGB(RandomUtils.nextInt(256), RandomUtils.nextInt(256), RandomUtils.nextInt(256))); } public float getRadius() { return getData(MetaIndex.AREA_EFFECT_RADIUS); } - public int getColor() { - return getData(MetaIndex.AREA_EFFECT_CLOUD_COLOR); - } - - public boolean isIgnoreRadius() { - return getData(MetaIndex.AREA_EFFECT_IGNORE_RADIUS); - } - public void setRadius(float radius) { if (radius > 30) radius = 30; @@ -36,11 +30,20 @@ public class AreaEffectCloudWatcher extends FlagWatcher { sendData(MetaIndex.AREA_EFFECT_RADIUS); } - public void setColor(int color) { - setData(MetaIndex.AREA_EFFECT_CLOUD_COLOR, color); + public Color getColor() { + int color = getData(MetaIndex.AREA_EFFECT_CLOUD_COLOR); + return Color.fromRGB(color); + } + + public void setColor(Color color) { + setData(MetaIndex.AREA_EFFECT_CLOUD_COLOR, color.asRGB()); sendData(MetaIndex.AREA_EFFECT_CLOUD_COLOR); } + public boolean isIgnoreRadius() { + return getData(MetaIndex.AREA_EFFECT_IGNORE_RADIUS); + } + public void setIgnoreRadius(boolean ignore) { setData(MetaIndex.AREA_EFFECT_IGNORE_RADIUS, ignore); sendData(MetaIndex.AREA_EFFECT_IGNORE_RADIUS); diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java index 307edb5c..bcb9de03 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/ArrowWatcher.java @@ -10,7 +10,7 @@ public class ArrowWatcher extends FlagWatcher { } public boolean isCritical() { - return (byte) getData(MetaIndex.ARROW_CRITICAL) == 1; + return getData(MetaIndex.ARROW_CRITICAL) == 1; } public void setCritical(boolean critical) { diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java index 79298032..3c9cd10f 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/EnderDragonWatcher.java @@ -16,12 +16,12 @@ public class EnderDragonWatcher extends InsentientWatcher public int getPhase() { - return getData(MetaIndex.ENDERD_RAGON_PHASE); + return getData(MetaIndex.ENDER_DRAGON_PHASE); } public void setPhase(int phase) { - setData(MetaIndex.ENDERD_RAGON_PHASE, phase); - sendData(MetaIndex.ENDERD_RAGON_PHASE); + setData(MetaIndex.ENDER_DRAGON_PHASE, phase); + sendData(MetaIndex.ENDER_DRAGON_PHASE); } } diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java index 3b260183..dfb50931 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/LivingWatcher.java @@ -1,71 +1,38 @@ package me.libraryaddict.disguise.disguisetypes.watchers; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; - -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.potion.PotionEffectType; - import com.comphenix.protocol.PacketType.Play.Server; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.WrappedAttribute; import com.comphenix.protocol.wrappers.WrappedAttribute.Builder; - import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; -import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; +import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.utilities.DisguiseUtilities; -import me.libraryaddict.disguise.utilities.ReflectionManager; +import org.bukkit.Color; +import org.bukkit.entity.Entity; +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; public class LivingWatcher extends FlagWatcher { - static Map list = new HashMap<>(); - static Method getId; - - static { - try { - getId = ReflectionManager - .getNmsMethod("MobEffectList", "getId", ReflectionManager.getNmsClass("MobEffectList")); - Object REGISTRY = ReflectionManager.getNmsField("MobEffectList", "REGISTRY").get(null); - - for (Object next : ((Iterable) REGISTRY)) { - int id = (int) getId.invoke(null, next); - list.put(id, next); - } - } - catch (Exception ex) { - ex.printStackTrace(); - } - } - private double maxHealth; private boolean maxHealthSet; - private HashSet potionEffects = new HashSet<>(); + private HashSet potionEffects = new HashSet<>(); public LivingWatcher(Disguise disguise) { super(disguise); } - public void addPotionEffect(PotionEffectType potionEffect) { - if (!hasPotionEffect(potionEffect)) { - removePotionEffect(potionEffect); - potionEffects.add(potionEffect.getId()); - - sendPotionEffects(); - } - } - @Override public LivingWatcher clone(Disguise disguise) { LivingWatcher clone = (LivingWatcher) super.clone(disguise); - clone.potionEffects = (HashSet) potionEffects.clone(); + clone.potionEffects = (HashSet) potionEffects.clone(); clone.maxHealth = maxHealth; clone.maxHealthSet = maxHealthSet; @@ -73,7 +40,7 @@ public class LivingWatcher extends FlagWatcher { } public float getHealth() { - return (float) getData(MetaIndex.LIVING_HEALTH); + return getData(MetaIndex.LIVING_HEALTH); } public double getMaxHealth() { @@ -81,53 +48,75 @@ public class LivingWatcher extends FlagWatcher { } public boolean isPotionParticlesAmbient() { - return (boolean) getData(MetaIndex.LIVING_POTION_AMBIENT); + return getData(MetaIndex.LIVING_POTION_AMBIENT); + } + + public Color getParticlesColor() { + int color = getData(MetaIndex.LIVING_POTIONS); + return Color.fromRGB(color); + } + + public void setParticlesColor(Color color) { + potionEffects.clear(); + + setData(MetaIndex.LIVING_POTIONS, color.asRGB()); + sendData(MetaIndex.LIVING_POTIONS); } private int getPotions() { - int m = 3694022; - if (potionEffects.isEmpty()) { - return m; + return 0; } - float f1 = 0.0F; - float f2 = 0.0F; - float f3 = 0.0F; - float f4 = 0.0F; - try { - for (int localMobEffect : potionEffects) { - int n = (Integer) getId.invoke(null, list.get(localMobEffect)); - f1 += (n >> 16 & 0xFF) / 255.0F; - f2 += (n >> 8 & 0xFF) / 255.0F; - f3 += (n & 0xFF) / 255.0F; - f4 += 1.0F; + ArrayList colors = new ArrayList<>(); + + for (String typeId : potionEffects) { + PotionEffectType type = PotionEffectType.getByName(typeId); + + if (type == null) { + continue; } - } - catch (Exception ex) { - ex.printStackTrace(); + + Color color = type.getColor(); + + if (color == null) { + continue; + } + + colors.add(color); } - f1 = f1 / f4 * 255.0F; - f2 = f2 / f4 * 255.0F; - f3 = f3 / f4 * 255.0F; + if (colors.isEmpty()) { + return 0; + } - return (int) f1 << 16 | (int) f2 << 8 | (int) f3; + Color color = colors.remove(0); + + return color.mixColors(colors.toArray(new Color[0])).asRGB(); } public boolean hasPotionEffect(PotionEffectType type) { - return potionEffects.contains(type.getId()); + return potionEffects.contains(type.getName()); } public boolean isMaxHealthSet() { return maxHealthSet; } - public void removePotionEffect(PotionEffectType type) { - if (potionEffects.contains(type.getId())) { - potionEffects.remove(type.getId()); - sendPotionEffects(); + public void addPotionEffect(PotionEffectType potionEffect) { + if (!hasPotionEffect(potionEffect)) { + potionEffects.add(potionEffect.getName()); } + + sendPotionEffects(); + } + + public void removePotionEffect(PotionEffectType potionEffect) { + if (hasPotionEffect(potionEffect)) { + potionEffects.remove(potionEffect.getId()); + } + + sendPotionEffects(); } public void setPotionParticlesAmbient(boolean particles) { diff --git a/src/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java b/src/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java index b73b85d0..58828732 100644 --- a/src/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java +++ b/src/me/libraryaddict/disguise/disguisetypes/watchers/TippedArrowWatcher.java @@ -1,26 +1,26 @@ 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.DisguiseUtilities; +import org.apache.commons.lang.math.RandomUtils; import org.bukkit.Color; /** * @author Navid */ public class TippedArrowWatcher extends ArrowWatcher { + public TippedArrowWatcher(Disguise disguise) { super(disguise); - int r = DisguiseUtilities.random.nextInt(256); - int g = DisguiseUtilities.random.nextInt(256); - int b = DisguiseUtilities.random.nextInt(256); - - setColor(Color.fromRGB(r, g, b)); + if (getDisguise().getType() != DisguiseType.ARROW) { + setColor(Color.fromRGB(RandomUtils.nextInt(256), RandomUtils.nextInt(256), RandomUtils.nextInt(256))); + } } public Color getColor() { - int color = (int) getData(MetaIndex.TIPPED_ARROW_COLOR); + int color = getData(MetaIndex.TIPPED_ARROW_COLOR); return Color.fromRGB(color); } diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseParser.java b/src/me/libraryaddict/disguise/utilities/DisguiseParser.java index 3c3c2aaa..6f569698 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseParser.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseParser.java @@ -17,10 +17,12 @@ import org.bukkit.util.EulerAngle; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map.Entry; import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class DisguiseParser { public static class DisguiseParseException extends Exception { @@ -435,41 +437,15 @@ public class DisguiseParser { * Splits a string while respecting quotes */ public static String[] split(String string) { - String[] strings = ChatColor.translateAlternateColorCodes('&', string).split(" "); + Matcher matcher = Pattern.compile("\"(?:\"(?=\\S)|\\\\\"|[^\"])*(?:[^\\\\]\"(?=\\s|$))|\\S+").matcher(string); - ArrayList list = new ArrayList<>(); - StringBuilder builder = new StringBuilder(); + List list = new ArrayList<>(); - for (String s : strings) { - String a = s.replaceAll("\\\\", ""); - - if (builder.length() != 0 || s.startsWith("\"")) { - if (builder.length() != 0) - builder.append(' '); - - String append; - - if (s.startsWith("\"")) - builder.append(s.substring(1)); - else if (a.endsWith("\"") && !a.endsWith("\\\"")) - builder.append(s.substring(0, s.length() - 1)); - else - builder.append(s); - - if (a.endsWith("\"") && !a.endsWith("\\\"")) { - list.add(builder.toString()); - builder = new StringBuilder(); - } - } else { - list.add(s); - } + while (matcher.find()) { + list.add(matcher.group()); } - if (builder.length() != 0) { - list.addAll(Arrays.asList(("\"" + builder.toString()).split(" "))); - } - - return list.toArray(new String[list.size()]); + return list.toArray(new String[0]); } /** @@ -844,6 +820,29 @@ public class DisguiseParser { } else if (param == Ocelot.Type.class) { // Parse to ocelot type value = callValueOf(param, valueString, methodName); + } else if (param == Color.class) { + Class cl = Class.forName("org.bukkit.Color"); + + try { + value = cl.getField(valueString.toUpperCase()).get(null); + } + catch (Exception ex) { + try { + String[] split = valueString.split(","); + + if (split.length == 1) { + value = Color.fromRGB(Integer.parseInt(split[0])); + } else if (split.length == 3) { + value = Color.fromRGB(Integer.parseInt(split[0]), Integer.parseInt(split[1]), + Integer.parseInt(split[2])); + } else { + throw new Exception(); + } + } + catch (Exception ex2) { + throw parseToException(param, valueString, methodName); + } + } } else if (param.getSimpleName().equals("TreeSpecies")) { // Parse to tree species value = callValueOf(param, valueString, methodName); @@ -915,7 +914,9 @@ public class DisguiseParser { try { String[] split = valueString.split(","); - assert split.length == 3; + if (split.length != 3) { + throw new Exception(); + } value = new BlockPosition(Integer.parseInt(split[0]), Integer.parseInt(split[1]), Integer.parseInt(split[2])); diff --git a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 33f960fe..fe6a8df5 100644 --- a/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -857,8 +857,7 @@ public class DisguiseUtilities { gson = gsonBuilder.create(); try { - Object server = ReflectionManager.getNmsMethod("MinecraftServer", "getServer").invoke(null); - Object world = ((List) server.getClass().getField("worlds").get(server)).get(0); + Object world = ReflectionManager.getWorldServer(Bukkit.getWorlds().get(0)); Class chunkClass = ReflectionManager.getNmsClass("Chunk"); Object bedChunk = null; @@ -883,8 +882,10 @@ public class DisguiseUtilities { .newInstance(0, true); Class blockClass = ReflectionManager.getNmsClass("Block"); + Object REGISTRY = ReflectionManager.getNmsField("IRegistry", "BLOCK").get(null); + Object minecraftKey = ReflectionManager.createMinecraftKey("white_bed"); - Object block = blockClass.getMethod("getByName", String.class).invoke(null, "white_bed"); + Object block = REGISTRY.getClass().getMethod("get", minecraftKey.getClass()).invoke(REGISTRY, minecraftKey); Object blockData = ReflectionManager.getNmsMethod(blockClass, "getBlockData").invoke(block); Method method = null; diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionFlagWatchers.java b/src/me/libraryaddict/disguise/utilities/ReflectionFlagWatchers.java index adfcb34b..3c18e99d 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionFlagWatchers.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionFlagWatchers.java @@ -14,6 +14,7 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.util.EulerAngle; import javax.annotation.Nullable; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.*; @@ -154,6 +155,25 @@ public class ReflectionFlagWatchers { new ParamInfo(TropicalFish.Pattern.class, "Pattern", "Patterns of a tropical fish"); new ParamInfo(DyeColor.class, "DyeColor", "Dye colors of many different colors"); + try { + ArrayList colors = new ArrayList<>(); + Class cl = Class.forName("org.bukkit.Color"); + + for (Field field : cl.getFields()) { + if (field.getType() != cl) { + continue; + } + + colors.add(field.getName()); + } + + new ParamInfo(Color.class, "Color", "Colors that can also be defined through RGB", + colors.toArray(new String[0])); + } + catch (ClassNotFoundException e) { + e.printStackTrace(); + } + ArrayList potionEnums = new ArrayList<>(); for (PotionEffectType effectType : PotionEffectType.values()) { diff --git a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java index 7e17991f..84210686 100644 --- a/src/me/libraryaddict/disguise/utilities/ReflectionManager.java +++ b/src/me/libraryaddict/disguise/utilities/ReflectionManager.java @@ -927,6 +927,16 @@ public class ReflectionManager { return null; } + public static Object createMinecraftKey(String name) { + try{ + return getNmsClass("MinecraftKey").getConstructor(String.class).newInstance(name); + }catch(Exception ex) { + ex.printStackTrace(); + } + + return null; + } + public static int getEntityType(Object nmsEntity) { try { Field entityTypesField = null; @@ -936,9 +946,9 @@ public class ReflectionManager { continue; Object entityType = method.invoke(nmsEntity); - Class typesClass = getNmsClass("EntityTypes"); + Class typesClass = getNmsClass("IRegistry"); - Object registry = typesClass.getField("REGISTRY").get(null); + Object registry = typesClass.getField("ENTITY_TYPE").get(null); return (int) registry.getClass().getMethod("a", Object.class).invoke(registry, entityType); }