From 7e06692d73c9e71a9cfef06e80f3d3fc03e470c2 Mon Sep 17 00:00:00 2001 From: MistPhizzle Date: Mon, 1 Dec 2014 16:36:02 -0500 Subject: [PATCH 1/6] Begin Spigot 1.8 Support Uses Spigot's version of CraftBukkit. Update methods to include getOnlinePlayers() method. --- .classpath | 2 +- src/com/projectkorra/ProjectKorra/MetricsLite.java | 2 +- src/com/projectkorra/ProjectKorra/RevertChecker.java | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.classpath b/.classpath index 6798fda0..62a50fd3 100644 --- a/.classpath +++ b/.classpath @@ -2,7 +2,6 @@ - @@ -14,5 +13,6 @@ + diff --git a/src/com/projectkorra/ProjectKorra/MetricsLite.java b/src/com/projectkorra/ProjectKorra/MetricsLite.java index 1e6f262d..683af9f3 100644 --- a/src/com/projectkorra/ProjectKorra/MetricsLite.java +++ b/src/com/projectkorra/ProjectKorra/MetricsLite.java @@ -284,7 +284,7 @@ public class MetricsLite { boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if online mode is enabled String pluginVersion = description.getVersion(); String serverVersion = Bukkit.getVersion(); - int playersOnline = Bukkit.getServer().getOnlinePlayers().length; + int playersOnline = Bukkit.getServer().getOnlinePlayers().size(); // END server software specific section -- all code below does not use any code outside of this class / Java diff --git a/src/com/projectkorra/ProjectKorra/RevertChecker.java b/src/com/projectkorra/ProjectKorra/RevertChecker.java index 5c3c2ee1..cc46eba3 100644 --- a/src/com/projectkorra/ProjectKorra/RevertChecker.java +++ b/src/com/projectkorra/ProjectKorra/RevertChecker.java @@ -43,9 +43,8 @@ public class RevertChecker implements Runnable { @Override public ArrayList call() throws Exception { ArrayList chunks = new ArrayList(); - Player[] players = server.getOnlinePlayers(); - - for (Player player : players) { + + for (Player player : server.getOnlinePlayers()) { Chunk chunk = player.getLocation().getChunk(); if (!chunks.contains(chunk)) chunks.add(chunk); From 7801239208e42c46be18965f6c42433489168139 Mon Sep 17 00:00:00 2001 From: MistPhizzle Date: Sun, 7 Dec 2014 10:40:27 -0500 Subject: [PATCH 2/6] Merge remote-tracking branch 'origin/master' Conflicts: .classpath src/com/projectkorra/ProjectKorra/RevertChecker.java --- .../Utilities/ParticleEffect.java | 1196 ++++++++++------- .../Utilities/ReflectionHandler.java | 548 -------- .../Utilities/ReflectionUtils.java | 758 +++++++++++ .../ProjectKorra/earthbending/LavaFlow.java | 21 +- 4 files changed, 1504 insertions(+), 1019 deletions(-) delete mode 100644 src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java create mode 100644 src/com/projectkorra/ProjectKorra/Utilities/ReflectionUtils.java diff --git a/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java b/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java index 1691c577..c87e005e 100644 --- a/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java +++ b/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java @@ -1,508 +1,798 @@ package com.projectkorra.ProjectKorra.Utilities; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; +import com.projectkorra.ProjectKorra.Utilities.ReflectionUtils.PackageType; +import com.projectkorra.ProjectKorra.Utilities.ReflectionUtils.PacketType; + +/** + * ParticleEffect Library + *

+ * This library was created by @DarkBlade12 based on content related to particles of @microgeek (names and packet parameters), it allows you to display all Minecraft particle effects on a Bukkit server + *

+ * You are welcome to use it, modify it and redistribute it under the following conditions: + *

    + *
  • Don't claim this class as your own + *
  • Don't remove this disclaimer + *
+ *

+ * It would be nice if you provide credit to me if you use this class in a published project + * + * @author DarkBlade12 + * @version 1.5 + */ public enum ParticleEffect { + /** + * A particle effect which is displayed by exploding tnt and creepers: + *

    + *
  • It looks like a crowd of gray balls which are fading away + *
  • The speed value has no influence on this particle effect + *
+ */ + HUGE_EXPLOSION("hugeexplosion"), + /** + * A particle effect which is displayed by exploding ghast fireballs and wither skulls: + *
    + *
  • It looks like a gray ball which is fading away + *
  • The speed value slightly influences the size of this particle effect + *
+ */ + LARGE_EXPLODE("largeexplode"), + /** + * A particle effect which is displayed by launching fireworks: + *
    + *
  • It looks like a white star which is sparkling + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + FIREWORKS_SPARK("fireworksSpark"), + /** + * A particle effect which is displayed by swimming entities and arrows in water: + *
    + *
  • It looks like a bubble + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + BUBBLE("bubble", true), + /** + * A particle effect which is displayed by water: + *
    + *
  • It looks like a tiny blue square + *
  • The speed value has no influence on this particle effect + *
+ */ + SUSPEND("suspend", true), + /** + * A particle effect which is displayed by air when close to bedrock and the in the void: + *
    + *
  • It looks like a tiny gray square + *
  • The speed value has no influence on this particle effect + *
+ */ + DEPTH_SUSPEND("depthSuspend"), + /** + * A particle effect which is displayed by mycelium: + *
    + *
  • It looks like a tiny gray square + *
  • The speed value has no influence on this particle effect + *
+ */ + TOWN_AURA("townaura"), + /** + * A particle effect which is displayed when landing a critical hit and by arrows: + *
    + *
  • It looks like a light brown cross + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + CRIT("crit"), + /** + * A particle effect which is displayed when landing a hit with an enchanted weapon: + *
    + *
  • It looks like a cyan star + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + MAGIC_CRIT("magicCrit"), + /** + * A particle effect which is displayed by primed tnt, torches, droppers, dispensers, end portals, brewing stands and monster spawners: + *
    + *
  • It looks like a little gray cloud + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + SMOKE("smoke"), + /** + * A particle effect which is displayed by entities with active potion effects: + *
    + *
  • It looks like a colored swirl + *
  • The speed value causes the particle to be colored black when set to 0 + *
+ */ + MOB_SPELL("mobSpell"), + /** + * A particle effect which is displayed by entities with active potion effects applied through a beacon: + *
    + *
  • It looks like a transparent colored swirl + *
  • The speed value causes the particle to be always colored black when set to 0 + *
+ */ + MOB_SPELL_AMBIENT("mobSpellAmbient"), + /** + * A particle effect which is displayed when splash potions or bottles o' enchanting hit something: + *
    + *
  • It looks like a white swirl + *
  • The speed value causes the particle to only move upwards when set to 0 + *
+ */ + SPELL("spell"), + /** + * A particle effect which is displayed when instant splash potions hit something: + *
    + *
  • It looks like a white cross + *
  • The speed value causes the particle to only move upwards when set to 0 + *
+ */ + INSTANT_SPELL("instantSpell"), + /** + * A particle effect which is displayed by witches: + *
    + *
  • It looks like a purple cross + *
  • The speed value causes the particle to only move upwards when set to 0 + *
+ */ + WITCH_MAGIC("witchMagic"), + /** + * A particle effect which is displayed by note blocks: + *
    + *
  • It looks like a colored note + *
  • The speed value causes the particle to be colored green when set to 0 + *
+ */ + NOTE("note"), + /** + * A particle effect which is displayed by nether portals, endermen, ender pearls, eyes of ender, ender chests and dragon eggs: + *
    + *
  • It looks like a purple cloud + *
  • The speed value influences the spread of this particle effect + *
+ */ + PORTAL("portal"), + /** + * A particle effect which is displayed by enchantment tables which are nearby bookshelves: + *
    + *
  • It looks like a cryptic white letter + *
  • The speed value influences the spread of this particle effect + *
+ */ + ENCHANTMENT_TABLE("enchantmenttable"), + /** + * A particle effect which is displayed by exploding tnt and creepers: + *
    + *
  • It looks like a white cloud + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + EXPLODE("explode"), + /** + * A particle effect which is displayed by torches, active furnaces, magma cubes and monster spawners: + *
    + *
  • It looks like a tiny flame + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + FLAME("flame"), + /** + * A particle effect which is displayed by lava: + *
    + *
  • It looks like a spark + *
  • The speed value has no influence on this particle effect + *
+ */ + LAVA("lava"), + /** + * A particle effect which is currently unused: + *
    + *
  • It looks like a transparent gray square + *
  • The speed value has no influence on this particle effect + *
+ */ + FOOTSTEP("footstep"), + /** + * A particle effect which is displayed by swimming entities, rain dropping on the ground and shaking wolves: + *
    + *
  • It looks like a blue drop + *
  • The speed value has no influence on this particle effect + *
+ */ + SPLASH("splash"), + /** + * A particle effect which is displayed on water when fishing: + *
    + *
  • It looks like a blue droplet + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + WAKE("wake"), + /** + * A particle effect which is displayed by fire, minecarts with furnace and blazes: + *
    + *
  • It looks like a large gray cloud + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + LARGE_SMOKE("largesmoke"), + /** + * A particle effect which is displayed when a mob dies: + *
    + *
  • It looks like a large white cloud + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + CLOUD("cloud"), + /** + * A particle effect which is displayed by redstone ore, powered redstone, redstone torches and redstone repeaters: + *
    + *
  • It looks like a tiny colored cloud + *
  • The speed value causes the particle to be colored red when set to 0 + *
+ */ + RED_DUST("reddust"), + /** + * A particle effect which is displayed when snowballs or eggs hit something: + *
    + *
  • It looks like a tiny part of the snowball icon + *
  • The speed value has no influence on this particle effect + *
+ */ + SNOWBALL_POOF("snowballpoof"), + /** + * A particle effect which is displayed by blocks beneath a water source: + *
    + *
  • It looks like a blue drip + *
  • The speed value has no influence on this particle effect + *
+ */ + DRIP_WATER("dripWater"), + /** + * A particle effect which is displayed by blocks beneath a lava source: + *
    + *
  • It looks like an orange drip + *
  • The speed value has no influence on this particle effect + *
+ */ + DRIP_LAVA("dripLava"), + /** + * A particle effect which is currently unused: + *
    + *
  • It looks like a tiny white cloud + *
  • The speed value influences the velocity at which the particle flies off + *
+ */ + SNOW_SHOVEL("snowshovel"), + /** + * A particle effect which is displayed by slimes: + *
    + *
  • It looks like a tiny part of the slimeball icon + *
  • The speed value has no influence on this particle effect + *
+ */ + SLIME("slime"), + /** + * A particle effect which is displayed when breeding and taming animals: + *
    + *
  • It looks like a red heart + *
  • The speed value has no influence on this particle effect + *
+ */ + HEART("heart"), + /** + * A particle effect which is displayed when attacking a villager in a village: + *
    + *
  • It looks like a cracked gray heart + *
  • The speed value has no influence on this particle effect + *
+ */ + ANGRY_VILLAGER("angryVillager"), + /** + * A particle effect which is displayed when using bone meal and trading with a villager in a village: + *
    + *
  • It looks like a green star + *
  • The speed value has no influence on this particle effect + *
+ */ + HAPPY_VILLAGER("happyVillager"); - // == Support for 1.7 Implementation == - HUGE_EXPLOSION( - "hugeexplosion", - "EXPLOSION_HUGE"), - LARGE_EXPLODE( - "largeexplode", - "EXPLOSION_LARGE"), - BUBBLE( - "bubble", - "WATER_BUBBLE"), - SUSPEND( - "suspend", - "SUSPENDED"), - DEPTH_SUSPEND( - "depthSuspend", - "SUSPENDED_DEPTH"), - MAGIC_CRIT( - "magicCrit", - "CRIT_MAGIC"), - MOB_SPELL( - "mobSpell", - "SPELL_MOB"), - MOB_SPELL_AMBIENT( - "mobSpellAmbient", - "SPELL_MOB_AMBIENT"), - INSTANT_SPELL( - "instantSpell", - "SPELL_INSTANT"), - WITCH_MAGIC( - "witchMagic", - "SPELL_WITCH"), - EXPLODE( - "explode", - "EXPLOSION_NORMAL"), - SPLASH( - "splash", - "WATER_SPLASH"), - LARGE_SMOKE( - "largesmoke", - "SMOKE_LARGE"), - RED_DUST( - "reddust", - "REDSTONE"), - SNOWBALL_POOF( - "snowballpoof", - "SNOWBALL"), - ANGRY_VILLAGER( - "angryVillager", - "VILLAGER_ANGRY"), - HAPPY_VILLAGER( - "happerVillager", - "VILLAGER_HAPPY"), - // == 1.8 Particles and Supported 1.7 Particles == - /** - * 1.8 only! - * - * @see {@link #EXPLODE} - */ - EXPLOSION_NORMAL( - EXPLODE.getName()), - /** - * 1.8 only! - * - * @see {@link #LARGE_EXPLODE} - */ - EXPLOSION_LARGE( - LARGE_EXPLODE.getName()), - /** - * 1.8 only! - * - * @see {@link #HUGE_EXPLOSION} - */ - EXPLOSION_HUGE( - HUGE_EXPLOSION.getName()), - FIREWORKS_SPARK( - "fireworksSpark"), - /** - * 1.8 only! - * - * @see {@link #BUBBLE} - */ - WATER_BUBBLE( - BUBBLE.getName()), - /** - * 1.8 only! - * - * @see {@link #SPLASH} - */ - WATER_SPLASH( - SPLASH.getName()), - /** - * 1.8 only! - */ - WATER_WAKE, - /** - * 1.8 only! - * - * @see {@link #SUSPEND} - */ - SUSPENDED( - SUSPEND.getName()), - /** - * 1.8 only! - * - * @see {@link #DEPTH_SUSPEND} - */ - SUSPENDED_DEPTH( - DEPTH_SUSPEND.getName()), - CRIT( - "crit"), - /** - * 1.8 only! - * - * @see {@link #MAGIC_CRIT} - */ - CRIT_MAGIC( - MAGIC_CRIT.getName()), - /** - * 1.8 only! - */ - SMOKE_NORMAL, - /** - * 1.8 only! - * - * @see {@link #LARGE_SMOKE} - */ - SMOKE_LARGE( - LARGE_SMOKE.getName()), - SPELL( - "spell"), - /** - * 1.8 only! - * - * @see {@link #INSTANT_SPELL} - */ - SPELL_INSTANT( - INSTANT_SPELL.getName()), - /** - * 1.8 only! - * - * @see {@link #MOB_SPELL} - */ - SPELL_MOB( - MOB_SPELL.getName()), - /** - * 1.8 only! - * - * @see {@link #MOB_SPELL_AMBIENT} - */ - SPELL_MOB_AMBIENT( - MOB_SPELL_AMBIENT.getName()), - /** - * 1.8 only! - * - * @see {@link #WITCH_MAGIC} - */ - SPELL_WITCH( - WITCH_MAGIC.getName()), - DRIP_WATER( - "dripWater"), - DRIP_LAVA( - "dripLava"), - /** - * 1.8 only! - * - * @see {@link #ANGRY_VILLAGER} - */ - VILLAGER_ANGRY( - ANGRY_VILLAGER.getName()), - /** - * 1.8 only! - * - * @see {@link #HAPPY_VILLAGER} - */ - VILLAGER_HAPPY( - HAPPY_VILLAGER.getName()), - TOWN_AURA( - "townaura"), - NOTE( - "note"), - PORTAL( - "portal"), - ENCHANTMENT_TABLE( - "enchantmenttable"), - FLAME( - "flame"), - LAVA( - "lave"), - FOOTSTEP( - "footstep"), - CLOUD( - "cloud"), - REDSTONE( - "reddust"), - SNOWBALL( - "snowballpoof"), - SNOW_SHOVEL( - "snowshovel"), - SLIME( - "slime"), - HEART( - "heart"), - /** - * 1.8 only! - */ - BARRIER, - /** - * 1.8 only! - */ - ITEM_CRACK, - /** - * 1.8 only! - */ - BLOCK_CRACK, - /** - * 1.8 only! - */ - BLOCK_DUST, - /** - * 1.8 only! - */ - WATER_DROP, - /** - * 1.8 only! - */ - ITEM_TAKE, - /** - * 1.8 only! - */ - MOB_APPEARANCE; + private static final Map NAME_MAP = new HashMap(); + private final String name; + private final boolean requiresWater; - private String particleName; - private String enumValue; - - ParticleEffect(String particleName, String enumValue) { - this.particleName = particleName; - this.enumValue = enumValue; - } - - ParticleEffect(String particleName) { - this(particleName, null); - } - - ParticleEffect() { - this(null, null); - } - - public String getName() { - return this.particleName; - } - - private static Class nmsPacketPlayOutParticle = ReflectionUtilities.getNMSClass("PacketPlayOutWorldParticles"); - private static Class nmsEnumParticle; - private static int particleRange = 25; - - /** - * Modify the maximum Range of particles (only useful for Client versions 1.8+) - * - * @param range - * New range - */ - public static void setRange(int range) { - if (range < 0) throw new IllegalArgumentException("Range must be positive!"); - if (range > Integer.MAX_VALUE) throw new IllegalArgumentException("Range is too big!"); - particleRange = range; - } - - /** - * @return The current maximum Range of particles - */ - public static int getRange() { - return particleRange; - } - - /** - * Send the particle to a specific Player - * - * @param player - * Receiver of the particle - * @param location - * Location of the particle - * @param offsetX - * X size of the area to spawn particles in. - * @param offsetY - * Y size of the area to spawn particles in. - * @param offsetZ - * Z size of the area to spawn particles in. - * @param speed - * Speed of the Particle - * @param count - * Number of spawned particles - * @throws Exception - */ - public void sendToPlayer(Player player, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { - if (!isPlayerInRange(player, location)) return; - System.out.println(ReflectionUtilities.getVersion()); - if (ReflectionUtilities.getVersion().contains("v1_8")) { - try { - if (nmsEnumParticle == null) nmsEnumParticle = ReflectionUtilities.getNMSClass("EnumParticle"); - Object packet = nmsPacketPlayOutParticle.getConstructor(new Class[] { nmsEnumParticle, boolean.class, float.class, float.class, float.class, float.class, float.class, float.class, float.class, int.class, int[].class }) - .newInstance(getEnum(nmsEnumParticle.getName() + "." + (enumValue != null ? enumValue : name().toUpperCase())), true, (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, speed, count, new int[] {}); - Object handle = ReflectionUtilities.getHandle(player); - Object connection = ReflectionUtilities.getField(handle.getClass(), "playerConnection").get(handle); - ReflectionUtilities.getMethod(connection.getClass(), "sendPacket", new Class[0]).invoke(connection, new Object[] { packet }); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to send Particle " + name() + ". (Version 1.8): " + e.getMessage()); - } - } else { - try { - if (particleName == null) throw new Exception(); - Object packet = nmsPacketPlayOutParticle.getConstructor(new Class[] { String.class, float.class, float.class, float.class, float.class, float.class, float.class, float.class, int.class }).newInstance(particleName, (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, speed, count); - Object handle = ReflectionUtilities.getHandle(player); - Object connection = ReflectionUtilities.getField(handle.getClass(), "playerConnection").get(handle); - ReflectionUtilities.getMethod(connection.getClass(), "sendPacket", new Class[0]).invoke(connection, new Object[] { packet }); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to send Particle " + name() + ". (Invalid Server Version: 1.7) " + e.getMessage()); - } + // Initialize map for quick name lookup + static { + for (ParticleEffect effect : values()) { + NAME_MAP.put(effect.name, effect); } } /** - * Send the particle to a Collection of Players {@link #sendToPlayer(Player, Location, float, float, float, float, int)} - * - * @param player - * Receiver of the particle - * @param location - * Location of the particle - * @param offsetX - * X size of the area to spawn particles in. - * @param offsetY - * Y size of the area to spawn particles in. - * @param offsetZ - * Z size of the area to spawn particles in. - * @param speed - * Speed of the Particle - * @param count - * Number of spawned particles + * Construct a new particle effect + * + * @param name Name of this particle effect + * @param requiresWater Indicates whether water is required for this particle effect to display properly */ - public void sendToPlayers(Collection players, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { - for (Player p : players) - sendToPlayer(p, location, offsetX, offsetY, offsetZ, speed, count); + private ParticleEffect(String name, boolean requiresWater) { + this.name = name; + this.requiresWater = requiresWater; } /** - * Send the particle to an Array of Players {@link #sendToPlayer(Player, Location, float, float, float, float, int)} - * - * @param player - * Receiver of the particle - * @param location - * Location of the particle - * @param offsetX - * X size of the area to spawn particles in. - * @param offsetY - * Y size of the area to spawn particles in. - * @param offsetZ - * Z size of the area to spawn particles in. - * @param speed - * Speed of the Particle - * @param count - * Number of spawned particles + * Construct a new particle effect with {@link #requiresWater} set to false + * + * @param name Name of this particle effect + * @see #ParticleEffect(String, boolean) */ - public void sendToPlayers(Player[] players, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { - for (Player p : players) - sendToPlayer(p, location, offsetX, offsetY, offsetZ, speed, count); + private ParticleEffect(String name) { + this(name, false); } - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static Enum getEnum(String enumFullName) { - String[] x = enumFullName.split("\\.(?=[^\\.]+$)"); - if (x.length == 2) { - String enumClassName = x[0]; - String enumName = x[1]; - try { - Class cl = (Class) Class.forName(enumClassName); - return Enum.valueOf(cl, enumName); - } catch (ClassNotFoundException e) { - e.printStackTrace(); + /** + * Returns the name of this particle effect + * + * @return The name + */ + public String getName() { + return name; + } + + /** + * Determine if water is required for this particle effect to display properly + * + * @return Whether water is required or not + */ + public boolean getRequiresWater() { + return requiresWater; + } + + /** + * Returns the particle effect with the given name + * + * @param name Name of the particle effect + * @return The particle effect + */ + public static ParticleEffect fromName(String name) { + for (Entry entry : NAME_MAP.entrySet()) { + if (!entry.getKey().equalsIgnoreCase(name)) { + continue; } + return entry.getValue(); } return null; } - private static boolean isPlayerInRange(Player p, Location center) { - double distance = 0; - if ((distance = center.distance(p.getLocation())) > Double.MAX_VALUE) return false; - return distance < particleRange; + /** + * Determine if water is at a certain location + * + * @param location Location to check + * @return Whether water is at this location or not + */ + private static boolean isWater(Location location) { + Material material = location.getBlock().getType(); + return material == Material.WATER || material == Material.STATIONARY_WATER; } - public static class ReflectionUtilities { + /** + * Determine if an id is a block id + * + * @param id Id to check + * @return Whether id is a block or not + */ + @SuppressWarnings("deprecation") + private static boolean isBlock(int id) { + Material material = Material.getMaterial(id); + return material != null && material.isBlock(); + } + + /** + * Displays a particle effect which is only visible for all players within a certain range in the world of @param center + * + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param center Center location of the effect + * @param range Range of the visibility (Maximum range for particles is usually 16, but it can differ for some types) + * @throws IllegalArgumentException If the particle effect requires water and none is at the center location + * @see ParticleEffectPacket + * @see ParticleEffectPacket#sendTo(Location, double) + */ + public void display(float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, double range) throws IllegalArgumentException { + if (requiresWater && !isWater(center)) { + throw new IllegalArgumentException("There is no water at the center location"); + } + new ParticleEffectPacket(name, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, range); + } + + /** + * Displays a particle effect which is only visible for the specified players + * + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param center Center location of the effect + * @param players Receivers of the effect + * @throws IllegalArgumentException If the particle effect requires water and none is at the center location + * @see ParticleEffectPacket + * @see ParticleEffectPacket#sendTo(Location, List) + */ + public void display(float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, List players) throws IllegalArgumentException { + if (requiresWater && !isWater(center)) { + throw new IllegalArgumentException("There is no water at the center location"); + } + new ParticleEffectPacket(name, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, players); + } + + /** + * Displays an icon crack (item break) particle effect which is only visible for all players within a certain range in the world of @param center + * + * @param id Id of the icon + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param center Center location of the effect + * @param range Range of the visibility (Maximum range for particles is usually 16, but it can differ for some types) + * @see ParticleEffectPacket + * @see ParticleEffectPacket#sendTo(Location, double) + */ + public static void displayIconCrack(int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, double range) { + new ParticleEffectPacket("iconcrack_" + id + "_" + data, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, range); + } + + /** + * Displays an icon crack (item break) particle effect which is only visible for the specified players + * + * @param id Id of the icon + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param center Center location of the effect + * @param players Receivers of the effect + * @see ParticleEffectPacket + * @see ParticleEffectPacket#sendTo(Location, List) + */ + public static void displayIconCrack(int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, List players) { + new ParticleEffectPacket("iconcrack_" + id + "_" + data, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, players); + } + + /** + * Displays a block crack (block break) particle effect which is only visible for all players within a certain range in the world of @param center + * + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param amount Amount of particles + * @param center Center location of the effect + * @param range Range of the visibility (Maximum range for particles is usually 16, but it can differ for some types) + * @throws IllegalArgumentException If the specified id is not a block id + * @see ParticleEffectPacket + * @see ParticleEffectPacket#sendTo(Location, double) + */ + public static void displayBlockCrack(int id, byte data, float offsetX, float offsetY, float offsetZ, int amount, Location center, double range) throws IllegalArgumentException { + if (!isBlock(id)) { + throw new IllegalArgumentException("Invalid block id"); + } + new ParticleEffectPacket("blockcrack_" + id + "_" + data, offsetX, offsetY, offsetZ, 0, amount).sendTo(center, range); + } + + /** + * Displays a block crack (block break) particle effect which is only visible for the specified players + * + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param amount Amount of particles + * @param center Center location of the effect + * @param players Receivers of the effect + * @throws IllegalArgumentException If the specified id is not a block id + * @see ParticleEffectPacket + * @see ParticleEffectPacket#sendTo(Location, List) + */ + public static void displayBlockCrack(int id, byte data, float offsetX, float offsetY, float offsetZ, int amount, Location center, List players) throws IllegalArgumentException { + if (!isBlock(id)) { + throw new IllegalArgumentException("Invalid block id"); + } + new ParticleEffectPacket("blockcrack_" + id + "_" + data, offsetX, offsetY, offsetZ, 0, amount).sendTo(center, players); + } + + /** + * Displays a block dust particle effect which is only visible for all players within a certain range in the world of @param center + * + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param center Center location of the effect + * @param range Range of the visibility (Maximum range for particles is usually 16, but it can differ for some types) + * @throws IllegalArgumentException If the specified id is not a block id + * @see ParticleEffectPacket + * @see ParticleEffectPacket#sendTo(Location, double) + */ + public static void displayBlockDust(int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, double range) throws IllegalArgumentException { + if (!isBlock(id)) { + throw new IllegalArgumentException("Invalid block id"); + } + new ParticleEffectPacket("blockdust_" + id + "_" + data, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, range); + } + + /** + * Displays a block dust particle effect which is only visible for the specified players + * + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param center Center location of the effect + * @param players Receivers of the effect + * @throws IllegalArgumentException If the specified id is not a block id + * @see ParticleEffectPacket + * @see ParticleEffectPacket#sendTo(Location, List) + */ + public static void displayBlockDust(int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, List players) throws IllegalArgumentException { + if (!isBlock(id)) { + throw new IllegalArgumentException("Invalid block id"); + } + new ParticleEffectPacket("blockdust_" + id + "_" + data, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, players); + } + + /** + * Represents a particle effect packet with all attributes which is used for sending packets to the players + *

+ * This class is part of the ParticleEffect Library and follows the same usage conditions + * + * @author DarkBlade12 + * @since 1.5 + */ + public static final class ParticleEffectPacket { + private static Constructor packetConstructor; + private static Method getHandle; + private static Field playerConnection; + private static Method sendPacket; + private static boolean initialized; + private final String name; + private final float offsetX; + private final float offsetY; + private final float offsetZ; + private final float speed; + private final int amount; + private Object packet; /** - * sets a value of an {@link Object} via reflection + * Construct a new particle effect packet * - * @param instance - * instance the class to use - * @param fieldName - * the name of the {@link Field} to modify - * @param value - * the value to set - * @throws Exception + * @param name Name of the effect + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @throws IllegalArgumentException If the speed is lower than 0 or the amount is lower than 1 + * @see #initialize() */ - public static void setValue(Object instance, String fieldName, Object value) throws Exception { - Field field = instance.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - field.set(instance, value); + public ParticleEffectPacket(String name, float offsetX, float offsetY, float offsetZ, float speed, int amount) throws IllegalArgumentException { + initialize(); + if (speed < 0) { + throw new IllegalArgumentException("The speed is lower than 0"); + } + if (amount < 1) { + throw new IllegalArgumentException("The amount is lower than 1"); + } + this.name = name; + this.offsetX = offsetX; + this.offsetY = offsetY; + this.offsetZ = offsetZ; + this.speed = speed; + this.amount = amount; } /** - * get a value of an {@link Object}'s {@link Field} + * Initializes {@link #packetConstructor}, {@link #getHandle}, {@link #playerConnection} and {@link #sendPacket} and sets {@link #initialized} to true if it succeeds + *

+ * Note: These fields only have to be initialized once, so it will return if {@link #initialized} is already set to true * - * @param instance - * the target {@link Object} - * @param fieldName - * name of the {@link Field} - * @return the value of {@link Object} instance's {@link Field} with the name of fieldName - * @throws Exception + * @throws VersionIncompatibleException if accessed packets, fields or methods differ in your bukkit version */ - public static Object getValue(Object instance, String fieldName) throws Exception { - Field field = instance.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(instance); - } - - public static String getVersion() { - String name = Bukkit.getServer().getClass().getPackage().getName(); - String version = name.substring(name.lastIndexOf('.') + 1) + "."; - return version; - } - - public static Class getNMSClass(String className) { - String fullName = "net.minecraft.server." + getVersion() + className; - Class clazz = null; - try { - clazz = Class.forName(fullName); - } catch (Exception e) { - e.printStackTrace(); + public static void initialize() throws VersionIncompatibleException { + if (initialized) { + return; } - return clazz; - } - - public static Class getOBCClass(String className) { - String fullName = "org.bukkit.craftbukkit." + getVersion() + className; - Class clazz = null; try { - clazz = Class.forName(fullName); - } catch (Exception e) { - e.printStackTrace(); + int version = Integer.parseInt(Character.toString(PackageType.getServerVersion().charAt(3))); + Class packetClass = PackageType.MINECRAFT_SERVER.getClass(version < 7 ? "Packet63WorldParticles" : PacketType.PLAY_OUT_WORLD_PARTICLES.getName()); + packetConstructor = ReflectionUtils.getConstructor(packetClass); + getHandle = ReflectionUtils.getMethod("CraftPlayer", PackageType.CRAFTBUKKIT_ENTITY, "getHandle"); + playerConnection = ReflectionUtils.getField("EntityPlayer", PackageType.MINECRAFT_SERVER, false, "playerConnection"); + sendPacket = ReflectionUtils.getMethod(playerConnection.getType(), "sendPacket", PackageType.MINECRAFT_SERVER.getClass("Packet")); + } catch (Exception exception) { + throw new VersionIncompatibleException("Your current bukkit version seems to be incompatible with this library", exception); } - return clazz; + initialized = true; } - public static Object getHandle(Object obj) { - try { - return getMethod(obj.getClass(), "getHandle", new Class[0]).invoke(obj, new Object[0]); - } catch (Exception e) { - e.printStackTrace(); - } - return null; + /** + * Determine if {@link #packetConstructor}, {@link #getHandle}, {@link #playerConnection} and {@link #sendPacket} are initialized + * + * @return Whether these fields are initialized or not + * @see #initialize() + */ + public static boolean isInitialized() { + return initialized; } - public static Field getField(Class clazz, String name) { - try { - Field field = clazz.getDeclaredField(name); - field.setAccessible(true); - return field; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - public static Method getMethod(Class clazz, String name, Class... args) { - for (Method m : clazz.getMethods()) { - if ((m.getName().equals(name)) && ((args.length == 0) || (ClassListEqual(args, m.getParameterTypes())))) { - m.setAccessible(true); - return m; + /** + * Sends the packet to a single player and caches it + * + * @param center Center location of the effect + * @param player Receiver of the packet + * @throws PacketInstantiationException if instantion fails due to an unknown error + * @throws PacketSendingException if sending fails due to an unknown error + */ + public void sendTo(Location center, Player player) throws PacketInstantiationException, PacketSendingException { + if (packet == null) { + try { + packet = packetConstructor.newInstance(); + ReflectionUtils.setValue(packet, true, "a", name); + ReflectionUtils.setValue(packet, true, "b", (float) center.getX()); + ReflectionUtils.setValue(packet, true, "c", (float) center.getY()); + ReflectionUtils.setValue(packet, true, "d", (float) center.getZ()); + ReflectionUtils.setValue(packet, true, "e", offsetX); + ReflectionUtils.setValue(packet, true, "f", offsetY); + ReflectionUtils.setValue(packet, true, "g", offsetZ); + ReflectionUtils.setValue(packet, true, "h", speed); + ReflectionUtils.setValue(packet, true, "i", amount); + } catch (Exception exception) { + throw new PacketInstantiationException("Packet instantiation failed", exception); } } - return null; + try { + sendPacket.invoke(playerConnection.get(getHandle.invoke(player)), packet); + } catch (Exception exception) { + throw new PacketSendingException("Failed to send the packet to player '" + player.getName() + "'", exception); + } } - public static boolean ClassListEqual(Class[] l1, Class[] l2) { - boolean equal = true; - if (l1.length != l2.length) { - return false; + /** + * Sends the packet to all players in the list + * + * @param center Center location of the effect + * @param players Receivers of the packet + * @throws IllegalArgumentException If the player list is empty + * @see #sendTo(Location center, Player player) + */ + public void sendTo(Location center, List players) throws IllegalArgumentException { + if (players.isEmpty()) { + throw new IllegalArgumentException("The player list is empty"); } - for (int i = 0; i < l1.length; i++) { - if (l1[i] != l2[i]) { - equal = false; - break; + for (Player player : players) { + sendTo(center, player); + } + } + + /** + * Sends the packet to all players in a certain range + * + * @param center Center location of the effect + * @param range Range in which players will receive the packet (Maximum range for particles is usually 16, but it can differ for some types) + * @throws IllegalArgumentException If the range is lower than 1 + * @see #sendTo(Location center, Player player) + */ + @SuppressWarnings("deprecation") + public void sendTo(Location center, double range) throws IllegalArgumentException { + if (range < 1) { + throw new IllegalArgumentException("The range is lower than 1"); + } + String worldName = center.getWorld().getName(); + double squared = range * range; + for (Player player : Bukkit.getOnlinePlayers()) { + if (!player.getWorld().getName().equals(worldName) || player.getLocation().distanceSquared(center) > squared) { + continue; } + sendTo(center, player); + } + } + + /** + * Represents a runtime exception that is thrown if a bukkit version is not compatible with this library + *

+ * This class is part of the ParticleEffect Library and follows the same usage conditions + * + * @author DarkBlade12 + * @since 1.5 + */ + private static final class VersionIncompatibleException extends RuntimeException { + private static final long serialVersionUID = 3203085387160737484L; + + /** + * Construct a new version incompatible exception + * + * @param message Message that will be logged + * @param cause Cause of the exception + */ + public VersionIncompatibleException(String message, Throwable cause) { + super(message, cause); + } + } + + /** + * Represents a runtime exception that is thrown if packet instantiation fails + *

+ * This class is part of the ParticleEffect Library and follows the same usage conditions + * + * @author DarkBlade12 + * @since 1.4 + */ + private static final class PacketInstantiationException extends RuntimeException { + private static final long serialVersionUID = 3203085387160737484L; + + /** + * Construct a new packet instantiation exception + * + * @param message Message that will be logged + * @param cause Cause of the exception + */ + public PacketInstantiationException(String message, Throwable cause) { + super(message, cause); + } + } + + /** + * Represents a runtime exception that is thrown if packet sending fails + *

+ * This class is part of the ParticleEffect Library and follows the same usage conditions + * + * @author DarkBlade12 + * @since 1.4 + */ + private static final class PacketSendingException extends RuntimeException { + private static final long serialVersionUID = 3203085387160737484L; + + /** + * Construct a new packet sending exception + * + * @param message Message that will be logged + * @param cause Cause of the exception + */ + public PacketSendingException(String message, Throwable cause) { + super(message, cause); } - return equal; } } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java b/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java deleted file mode 100644 index 16b71f3e..00000000 --- a/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java +++ /dev/null @@ -1,548 +0,0 @@ -package com.projectkorra.ProjectKorra.Utilities; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - -import org.bukkit.Bukkit; - -/** - * ReflectionHandler v1.0 - * - * This class makes dealing with reflection much easier, especially when working with Bukkit - * - * You are welcome to use it, modify it and redistribute it under the following conditions: - * 1. Don't claim this class as your own - * 2. Don't remove this text - * - * (Would be nice if you provide credit to me) - * - * @author DarkBlade12 - */ -public final class ReflectionHandler { - private ReflectionHandler() {} - - public static Class getClass(String name, PackageType type) throws Exception { - return Class.forName(type + "." + name); - } - - public static Class getClass(String name, SubPackageType type) throws Exception { - return Class.forName(type + "." + name); - } - - public static Constructor getConstructor(Class clazz, Class... parameterTypes) { - Class[] p = DataType.convertToPrimitive(parameterTypes); - for (Constructor c : clazz.getConstructors()) - if (DataType.equalsArray(DataType.convertToPrimitive(c.getParameterTypes()), p)) - return c; - return null; - } - - public static Constructor getConstructor(String className, PackageType type, Class... parameterTypes) throws Exception { - return getConstructor(getClass(className, type), parameterTypes); - } - - public static Constructor getConstructor(String className, SubPackageType type, Class... parameterTypes) throws Exception { - return getConstructor(getClass(className, type), parameterTypes); - } - - public static Object newInstance(Class clazz, Object... args) throws Exception { - return getConstructor(clazz, DataType.convertToPrimitive(args)).newInstance(args); - } - - public static Object newInstance(String className, PackageType type, Object... args) throws Exception { - return newInstance(getClass(className, type), args); - } - - public static Object newInstance(String className, SubPackageType type, Object... args) throws Exception { - return newInstance(getClass(className, type), args); - } - - public static Method getMethod(Class clazz, String name, Class... parameterTypes) { - Class[] p = DataType.convertToPrimitive(parameterTypes); - for (Method m : clazz.getMethods()) - if (m.getName().equals(name) && DataType.equalsArray(DataType.convertToPrimitive(m.getParameterTypes()), p)) - return m; - return null; - } - - public static Method getMethod(String className, PackageType type, String name, Class... parameterTypes) throws Exception { - return getMethod(getClass(className, type), name, parameterTypes); - } - - public static Method getMethod(String className, SubPackageType type, String name, Class... parameterTypes) throws Exception { - return getMethod(getClass(className, type), name, parameterTypes); - } - - public static Object invokeMethod(String name, Object instance, Object... args) throws Exception { - return getMethod(instance.getClass(), name, DataType.convertToPrimitive(args)).invoke(instance, args); - } - - public static Object invokeMethod(Class clazz, String name, Object instance, Object... args) throws Exception { - return getMethod(clazz, name, DataType.convertToPrimitive(args)).invoke(instance, args); - } - - public static Object invokeMethod(String className, PackageType type, String name, Object instance, Object... args) throws Exception { - return invokeMethod(getClass(className, type), name, instance, args); - } - - public static Object invokeMethod(String className, SubPackageType type, String name, Object instance, Object... args) throws Exception { - return invokeMethod(getClass(className, type), name, instance, args); - } - - public static Field getField(Class clazz, String name) throws Exception { - Field f = clazz.getField(name); - f.setAccessible(true); - return f; - } - - public static Field getField(String className, PackageType type, String name) throws Exception { - return getField(getClass(className, type), name); - } - - public static Field getField(String className, SubPackageType type, String name) throws Exception { - return getField(getClass(className, type), name); - } - - public static Field getDeclaredField(Class clazz, String name) throws Exception { - Field f = clazz.getDeclaredField(name); - f.setAccessible(true); - return f; - } - - public static Field getDeclaredField(String className, PackageType type, String name) throws Exception { - return getDeclaredField(getClass(className, type), name); - } - - public static Field getDeclaredField(String className, SubPackageType type, String name) throws Exception { - return getDeclaredField(getClass(className, type), name); - } - - public static Object getValue(Object instance, String fieldName) throws Exception { - return getField(instance.getClass(), fieldName).get(instance); - } - - public static Object getValue(Class clazz, Object instance, String fieldName) throws Exception { - return getField(clazz, fieldName).get(instance); - } - - public static Object getValue(String className, PackageType type, Object instance, String fieldName) throws Exception { - return getValue(getClass(className, type), instance, fieldName); - } - - public static Object getValue(String className, SubPackageType type, Object instance, String fieldName) throws Exception { - return getValue(getClass(className, type), instance, fieldName); - } - - public static Object getDeclaredValue(Object instance, String fieldName) throws Exception { - return getDeclaredField(instance.getClass(), fieldName).get(instance); - } - - public static Object getDeclaredValue(Class clazz, Object instance, String fieldName) throws Exception { - return getDeclaredField(clazz, fieldName).get(instance); - } - - public static Object getDeclaredValue(String className, PackageType type, Object instance, String fieldName) throws Exception { - return getDeclaredValue(getClass(className, type), instance, fieldName); - } - - public static Object getDeclaredValue(String className, SubPackageType type, Object instance, String fieldName) throws Exception { - return getDeclaredValue(getClass(className, type), instance, fieldName); - } - - public static void setValue(Object instance, String fieldName, Object fieldValue) throws Exception { - Field f = getField(instance.getClass(), fieldName); - f.set(instance, fieldValue); - } - - public static void setValue(Object instance, FieldPair pair) throws Exception { - setValue(instance, pair.getName(), pair.getValue()); - } - - public static void setValue(Class clazz, Object instance, String fieldName, Object fieldValue) throws Exception { - Field f = getField(clazz, fieldName); - f.set(instance, fieldValue); - } - - public static void setValue(Class clazz, Object instance, FieldPair pair) throws Exception { - setValue(clazz, instance, pair.getName(), pair.getValue()); - } - - public static void setValue(String className, PackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { - setValue(getClass(className, type), instance, fieldName, fieldValue); - } - - public static void setValue(String className, PackageType type, Object instance, FieldPair pair) throws Exception { - setValue(className, type, instance, pair.getName(), pair.getValue()); - } - - public static void setValue(String className, SubPackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { - setValue(getClass(className, type), instance, fieldName, fieldValue); - } - - public static void setValue(String className, SubPackageType type, Object instance, FieldPair pair) throws Exception { - setValue(className, type, instance, pair.getName(), pair.getValue()); - } - - public static void setValues(Object instance, FieldPair... pairs) throws Exception { - for (FieldPair pair : pairs) - setValue(instance, pair); - } - - public static void setValues(Class clazz, Object instance, FieldPair... pairs) throws Exception { - for (FieldPair pair : pairs) - setValue(clazz, instance, pair); - } - - public static void setValues(String className, PackageType type, Object instance, FieldPair... pairs) throws Exception { - setValues(getClass(className, type), instance, pairs); - } - - public static void setValues(String className, SubPackageType type, Object instance, FieldPair... pairs) throws Exception { - setValues(getClass(className, type), instance, pairs); - } - - public static void setDeclaredValue(Object instance, String fieldName, Object fieldValue) throws Exception { - Field f = getDeclaredField(instance.getClass(), fieldName); - f.set(instance, fieldValue); - } - - public static void setDeclaredValue(Object instance, FieldPair pair) throws Exception { - setDeclaredValue(instance, pair.getName(), pair.getValue()); - } - - public static void setDeclaredValue(Class clazz, Object instance, String fieldName, Object fieldValue) throws Exception { - Field f = getDeclaredField(clazz, fieldName); - f.set(instance, fieldValue); - } - - public static void setDeclaredValue(Class clazz, Object instance, FieldPair pair) throws Exception { - setDeclaredValue(clazz, instance, pair.getName(), pair.getValue()); - } - - public static void setDeclaredValue(String className, PackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { - setDeclaredValue(getClass(className, type), instance, fieldName, fieldValue); - } - - public static void setDeclaredValue(String className, PackageType type, Object instance, FieldPair pair) throws Exception { - setDeclaredValue(className, type, instance, pair.getName(), pair.getValue()); - } - - public static void setDeclaredValue(String className, SubPackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { - setDeclaredValue(getClass(className, type), instance, fieldName, fieldValue); - } - - public static void setDeclaredValue(String className, SubPackageType type, Object instance, FieldPair pair) throws Exception { - setDeclaredValue(className, type, instance, pair.getName(), pair.getValue()); - } - - public static void setDeclaredValues(Object instance, FieldPair... pairs) throws Exception { - for (FieldPair pair : pairs) - setDeclaredValue(instance, pair); - } - - public static void setDeclaredValues(Class clazz, Object instance, FieldPair... pairs) throws Exception { - for (FieldPair pair : pairs) - setDeclaredValue(clazz, instance, pair); - } - - public static void setDeclaredValues(String className, PackageType type, Object instance, FieldPair... pairs) throws Exception { - setDeclaredValues(getClass(className, type), instance, pairs); - } - - public static void setDeclaredValues(String className, SubPackageType type, Object instance, FieldPair... pairs) throws Exception { - setDeclaredValues(getClass(className, type), instance, pairs); - } - - /** - * This class is part of the ReflectionHandler and follows the same usage conditions - * - * @author DarkBlade12 - */ - public enum DataType { - BYTE(byte.class, Byte.class), - SHORT(short.class, Short.class), - INTEGER(int.class, Integer.class), - LONG(long.class, Long.class), - CHARACTER(char.class, Character.class), - FLOAT(float.class, Float.class), - DOUBLE(double.class, Double.class), - BOOLEAN(boolean.class, Boolean.class); - - private static final Map, DataType> CLASS_MAP = new HashMap, DataType>(); - private final Class primitive; - private final Class reference; - - static { - for (DataType t : values()) { - CLASS_MAP.put(t.primitive, t); - CLASS_MAP.put(t.reference, t); - } - } - - private DataType(Class primitive, Class reference) { - this.primitive = primitive; - this.reference = reference; - } - - public Class getPrimitive() { - return this.primitive; - } - - public Class getReference() { - return this.reference; - } - - public static DataType fromClass(Class c) { - return CLASS_MAP.get(c); - } - - public static Class getPrimitive(Class c) { - DataType t = fromClass(c); - return t == null ? c : t.getPrimitive(); - } - - public static Class getReference(Class c) { - DataType t = fromClass(c); - return t == null ? c : t.getReference(); - } - - public static Class[] convertToPrimitive(Class[] classes) { - int length = classes == null ? 0 : classes.length; - Class[] types = new Class[length]; - for (int i = 0; i < length; i++) - types[i] = getPrimitive(classes[i]); - return types; - } - - public static Class[] convertToPrimitive(Object[] objects) { - int length = objects == null ? 0 : objects.length; - Class[] types = new Class[length]; - for (int i = 0; i < length; i++) - types[i] = getPrimitive(objects[i].getClass()); - return types; - } - - public static boolean equalsArray(Class[] a1, Class[] a2) { - if (a1 == null || a2 == null || a1.length != a2.length) - return false; - for (int i = 0; i < a1.length; i++) - if (!a1[i].equals(a2[i]) && !a1[i].isAssignableFrom(a2[i])) - return false; - return true; - } - } - - /** - * This class is part of the ReflectionHandler and follows the same usage conditions - * - * @author DarkBlade12 - */ - public final class FieldPair { - private final String name; - private final Object value; - - public FieldPair(String name, Object value) { - this.name = name; - this.value = value; - } - - public String getName() { - return this.name; - } - - public Object getValue() { - return this.value; - } - } - - /** - * This class is part of the ReflectionHandler and follows the same usage conditions - * - * @author DarkBlade12 - */ - public enum PackageType { - MINECRAFT_SERVER("net.minecraft.server." + Bukkit.getServer().getClass().getPackage().getName().substring(23)), - CRAFTBUKKIT(Bukkit.getServer().getClass().getPackage().getName()); - - private final String name; - - private PackageType(String name) { - this.name = name; - } - - public String getName() { - return this.name; - } - - @Override - public String toString() { - return name; - } - } - - /** - * This class is part of the ReflectionHandler and follows the same usage conditions - * - * @author DarkBlade12 - */ - public enum SubPackageType { - BLOCK, - CHUNKIO, - COMMAND, - CONVERSATIONS, - ENCHANTMENS, - ENTITY, - EVENT, - GENERATOR, - HELP, - INVENTORY, - MAP, - METADATA, - POTION, - PROJECTILES, - SCHEDULER, - SCOREBOARD, - UPDATER, - UTIL; - - private final String name; - - private SubPackageType() { - name = PackageType.CRAFTBUKKIT + "." + name().toLowerCase(); - } - - public String getName() { - return this.name; - } - - @Override - public String toString() { - return name; - } - } - - /** - * This class is part of the ReflectionHandler and follows the same usage conditions - * - * @author DarkBlade12 - */ - public enum PacketType { - HANDSHAKING_IN_SET_PROTOCOL("PacketHandshakingInSetProtocol"), - LOGIN_IN_ENCRYPTION_BEGIN("PacketLoginInEncryptionBegin"), - LOGIN_IN_START("PacketLoginInStart"), - LOGIN_OUT_DISCONNECT("PacketLoginOutDisconnect"), - LOGIN_OUT_ENCRYPTION_BEGIN("PacketLoginOutEncryptionBegin"), - LOGIN_OUT_SUCCESS("PacketLoginOutSuccess"), - PLAY_IN_ABILITIES("PacketPlayInAbilities"), - PLAY_IN_ARM_ANIMATION("PacketPlayInArmAnimation"), - PLAY_IN_BLOCK_DIG("PacketPlayInBlockDig"), - PLAY_IN_BLOCK_PLACE("PacketPlayInBlockPlace"), - PLAY_IN_CHAT("PacketPlayInChat"), - PLAY_IN_CLIENT_COMMAND("PacketPlayInClientCommand"), - PLAY_IN_CLOSE_WINDOW("PacketPlayInCloseWindow"), - PLAY_IN_CUSTOM_PAYLOAD("PacketPlayInCustomPayload"), - PLAY_IN_ENCHANT_ITEM("PacketPlayInEnchantItem"), - PLAY_IN_ENTITY_ACTION("PacketPlayInEntityAction"), - PLAY_IN_FLYING("PacketPlayInFlying"), - PLAY_IN_HELD_ITEM_SLOT("PacketPlayInHeldItemSlot"), - PLAY_IN_KEEP_ALIVE("PacketPlayInKeepAlive"), - PLAY_IN_LOOK("PacketPlayInLook"), - PLAY_IN_POSITION("PacketPlayInPosition"), - PLAY_IN_POSITION_LOOK("PacketPlayInPositionLook"), - PLAY_IN_SET_CREATIVE_SLOT("PacketPlayInSetCreativeSlot "), - PLAY_IN_SETTINGS("PacketPlayInSettings"), - PLAY_IN_STEER_VEHICLE("PacketPlayInSteerVehicle"), - PLAY_IN_TAB_COMPLETE("PacketPlayInTabComplete"), - PLAY_IN_TRANSACTION("PacketPlayInTransaction"), - PLAY_IN_UPDATE_SIGN("PacketPlayInUpdateSign"), - PLAY_IN_USE_ENTITY("PacketPlayInUseEntity"), - PLAY_IN_WINDOW_CLICK("PacketPlayInWindowClick"), - PLAY_OUT_ABILITIES("PacketPlayOutAbilities"), - PLAY_OUT_ANIMATION("PacketPlayOutAnimation"), - PLAY_OUT_ATTACH_ENTITY("PacketPlayOutAttachEntity"), - PLAY_OUT_BED("PacketPlayOutBed"), - PLAY_OUT_BLOCK_ACTION("PacketPlayOutBlockAction"), - PLAY_OUT_BLOCK_BREAK_ANIMATION("PacketPlayOutBlockBreakAnimation"), - PLAY_OUT_BLOCK_CHANGE("PacketPlayOutBlockChange"), - PLAY_OUT_CHAT("PacketPlayOutChat"), - PLAY_OUT_CLOSE_WINDOW("PacketPlayOutCloseWindow"), - PLAY_OUT_COLLECT("PacketPlayOutCollect"), - PLAY_OUT_CRAFT_PROGRESS_BAR("PacketPlayOutCraftProgressBar"), - PLAY_OUT_CUSTOM_PAYLOAD("PacketPlayOutCustomPayload"), - PLAY_OUT_ENTITY("PacketPlayOutEntity"), - PLAY_OUT_ENTITY_DESTROY("PacketPlayOutEntityDestroy"), - PLAY_OUT_ENTITY_EFFECT("PacketPlayOutEntityEffect"), - PLAY_OUT_ENTITY_EQUIPMENT("PacketPlayOutEntityEquipment"), - PLAY_OUT_ENTITY_HEAD_ROTATION("PacketPlayOutEntityHeadRotation"), - PLAY_OUT_ENTITY_LOOK("PacketPlayOutEntityLook"), - PLAY_OUT_ENTITY_METADATA("PacketPlayOutEntityMetadata"), - PLAY_OUT_ENTITY_STATUS("PacketPlayOutEntityStatus"), - PLAY_OUT_ENTITY_TELEPORT("PacketPlayOutEntityTeleport"), - PLAY_OUT_ENTITY_VELOCITY("PacketPlayOutEntityVelocity"), - PLAY_OUT_EXPERIENCE("PacketPlayOutExperience"), - PLAY_OUT_EXPLOSION("PacketPlayOutExplosion"), - PLAY_OUT_GAME_STATE_CHANGE("PacketPlayOutGameStateChange"), - PLAY_OUT_HELD_ITEM_SLOT("PacketPlayOutHeldItemSlot"), - PLAY_OUT_KEEP_ALIVE("PacketPlayOutKeepAlive"), - PLAY_OUT_KICK_DISCONNECT("PacketPlayOutKickDisconnect"), - PLAY_OUT_LOGIN("PacketPlayOutLogin"), - PLAY_OUT_MAP("PacketPlayOutMap"), - PLAY_OUT_MAP_CHUNK("PacketPlayOutMapChunk"), - PLAY_OUT_MAP_CHUNK_BULK("PacketPlayOutMapChunkBulk"), - PLAY_OUT_MULTI_BLOCK_CHANGE("PacketPlayOutMultiBlockChange"), - PLAY_OUT_NAMED_ENTITY_SPAWN("PacketPlayOutNamedEntitySpawn"), - PLAY_OUT_NAMED_SOUND_EFFECT("PacketPlayOutNamedSoundEffect"), - PLAY_OUT_OPEN_SIGN_EDITOR("PacketPlayOutOpenSignEditor"), - PLAY_OUT_OPEN_WINDOW("PacketPlayOutOpenWindow"), - PLAY_OUT_PLAYER_INFO("PacketPlayOutPlayerInfo"), - PLAY_OUT_POSITION("PacketPlayOutPosition"), - PLAY_OUT_REL_ENTITY_MOVE("PacketPlayOutRelEntityMove"), - PLAY_OUT_REL_ENTITY_MOVE_LOOK("PacketPlayOutRelEntityMoveLook"), - PLAY_OUT_REMOVE_ENTITY_EFFECT("PacketPlayOutRemoveEntityEffect"), - PLAY_OUT_RESPAWN("PacketPlayOutRespawn"), - PLAY_OUT_SCOREBOARD_DISPLAY_OBJECTIVE("PacketPlayOutScoreboardDisplayObjective"), - PLAY_OUT_SCOREBOARD_OBJECTIVE("PacketPlayOutScoreboardObjective"), - PLAY_OUT_SCOREBOARD_SCORE("PacketPlayOutScoreboardScore"), - PLAY_OUT_SCOREBOARD_TEAM("PacketPlayOutScoreboardTeam"), - PLAY_OUT_SET_SLOT("PacketPlayOutSetSlot"), - PLAY_OUT_SPAWN_ENTITY("PacketPlayOutSpawnEntity"), - PLAY_OUT_SPAWN_ENTITY_EXPERIENCE_ORB("PacketPlayOutSpawnEntityExperienceOrb"), - PLAY_OUT_SPAWN_ENTITY_LIVING("PacketPlayOutSpawnEntityLiving"), - PLAY_OUT_SPAWN_ENTITY_PAINTING("PacketPlayOutSpawnEntityPainting"), - PLAY_OUT_SPAWN_ENTITY_WEATHER("PacketPlayOutSpawnEntityWeather"), - PLAY_OUT_SPAWN_POSITION("PacketPlayOutSpawnPosition"), - PLAY_OUT_STATISTIC("PacketPlayOutStatistic"), - PLAY_OUT_TAB_COMPLETE("PacketPlayOutTabComplete"), - PLAY_OUT_TILE_ENTITY_DATA("PacketPlayOutTileEntityData"), - PLAY_OUT_TRANSACTION("PacketPlayOutTransaction"), - PLAY_OUT_UPDATE_ATTRIBUTES("PacketPlayOutUpdateAttributes"), - PLAY_OUT_UPDATE_HEALTH("PacketPlayOutUpdateHealth"), - PLAY_OUT_UPDATE_SIGN("PacketPlayOutUpdateSign"), - PLAY_OUT_UPDATE_TIME("PacketPlayOutUpdateTime"), - PLAY_OUT_WINDOW_ITEMS("PacketPlayOutWindowItems"), - PLAY_OUT_WORLD_EVENT("PacketPlayOutWorldEvent"), - PLAY_OUT_WORLD_PARTICLES("PacketPlayOutWorldParticles"), - STATUS_IN_PING("PacketStatusInPing"), - STATUS_IN_START("PacketStatusInStart"), - STATUS_OUT_PONG("PacketStatusOutPong"), - STATUS_OUT_SERVER_INFO("PacketStatusOutServerInfo"); - - private final String name; - private Class packet; - - private PacketType(String name) { - this.name = name; - } - - public String getName() { - return this.getName(); - } - - public Class getPacket() throws Exception { - return packet == null ? packet = ReflectionHandler.getClass(name, PackageType.MINECRAFT_SERVER) : packet; - } - } -} \ No newline at end of file diff --git a/src/com/projectkorra/ProjectKorra/Utilities/ReflectionUtils.java b/src/com/projectkorra/ProjectKorra/Utilities/ReflectionUtils.java new file mode 100644 index 00000000..791360ff --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/Utilities/ReflectionUtils.java @@ -0,0 +1,758 @@ +package com.projectkorra.ProjectKorra.Utilities; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Bukkit; + +/** + * ReflectionUtils + *

+ * This class provides useful methods which makes dealing with reflection much easier, especially when working with Bukkit + *

+ * You are welcome to use it, modify it and redistribute it under the following conditions: + *

    + *
  • Don't claim this class as your own + *
  • Don't remove this disclaimer + *
+ *

+ * It would be nice if you provide credit to me if you use this class in a published project + * + * @author DarkBlade12 + * @version 1.1 + */ +public final class ReflectionUtils { + // Prevent accidential construction + private ReflectionUtils() {} + + /** + * Returns the constructor of a given class with the given parameter types + * + * @param clazz Target class + * @param parameterTypes Parameter types of the desired constructor + * @return The constructor of the target class with the specified parameter types + * @throws NoSuchMethodException If the desired constructor with the specified parameter types cannot be found + * @see DataType + * @see DataType#getPrimitive(Class[]) + * @see DataType#compare(Class[], Class[]) + */ + public static Constructor getConstructor(Class clazz, Class... parameterTypes) throws NoSuchMethodException { + Class[] primitiveTypes = DataType.getPrimitive(parameterTypes); + for (Constructor constructor : clazz.getConstructors()) { + if (!DataType.compare(DataType.getPrimitive(constructor.getParameterTypes()), primitiveTypes)) { + continue; + } + return constructor; + } + throw new NoSuchMethodException("There is no such constructor in this class with the specified parameter types"); + } + + /** + * Returns the constructor of a desired class with the given parameter types + * + * @param className Name of the desired target class + * @param packageType Package where the desired target class is located + * @param parameterTypes Parameter types of the desired constructor + * @return The constructor of the desired target class with the specified parameter types + * @throws NoSuchMethodException If the desired constructor with the specified parameter types cannot be found + * @throws ClassNotFoundException ClassNotFoundException If the desired target class with the specified name and package cannot be found + * @see #getClass(String, PackageType) + * @see #getConstructor(Class, Class...) + */ + public static Constructor getConstructor(String className, PackageType packageType, Class... parameterTypes) throws NoSuchMethodException, ClassNotFoundException { + return getConstructor(packageType.getClass(className), parameterTypes); + } + + /** + * Returns an instance of a class with the given arguments + * + * @param clazz Target class + * @param arguments Arguments which are used to construct an object of the target class + * @return The instance of the target class with the specified arguments + * @throws InstantiationException If you cannot create an instance of the target class due to certain circumstances + * @throws IllegalAccessException If the desired constructor cannot be accessed due to certain circumstances + * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the constructor (this should not occur since it searches for a constructor with the types of the arguments) + * @throws InvocationTargetException If the desired constructor cannot be invoked + * @throws NoSuchMethodException If the desired constructor with the specified arguments cannot be found + */ + public static Object instantiateObject(Class clazz, Object... arguments) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException { + return getConstructor(clazz, DataType.getPrimitive(arguments)).newInstance(arguments); + } + + /** + * Returns an instance of a desired class with the given arguments + * + * @param className Name of the desired target class + * @param packageType Package where the desired target class is located + * @param arguments Arguments which are used to construct an object of the desired target class + * @return The instance of the desired target class with the specified arguments + * @throws InstantiationException If you cannot create an instance of the desired target class due to certain circumstances + * @throws IllegalAccessException If the desired constructor cannot be accessed due to certain circumstances + * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the constructor (this should not occur since it searches for a constructor with the types of the arguments) + * @throws InvocationTargetException If the desired constructor cannot be invoked + * @throws NoSuchMethodException If the desired constructor with the specified arguments cannot be found + * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found + * @see #getClass(String, PackageType) + * @see #instantiateObject(Class, Object...) + */ + public static Object instantiateObject(String className, PackageType packageType, Object... arguments) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException { + return instantiateObject(packageType.getClass(className), arguments); + } + + /** + * Returns a method of a class with the given parameter types + * + * @param clazz Target class + * @param methodName Name of the desired method + * @param parameterTypes Parameter types of the desired method + * @return The method of the target class with the specified name and parameter types + * @throws NoSuchMethodException If the desired method of the target class with the specified name and parameter types cannot be found + * @see DataType#getPrimitive(Class[]) + * @see DataType#compare(Class[], Class[]) + */ + public static Method getMethod(Class clazz, String methodName, Class... parameterTypes) throws NoSuchMethodException { + Class[] primitiveTypes = DataType.getPrimitive(parameterTypes); + for (Method method : clazz.getMethods()) { + if (!method.getName().equals(methodName) || !DataType.compare(DataType.getPrimitive(method.getParameterTypes()), primitiveTypes)) { + continue; + } + return method; + } + throw new NoSuchMethodException("There is no such method in this class with the specified name and parameter types"); + } + + /** + * Returns a method of a desired class with the given parameter types + * + * @param className Name of the desired target class + * @param packageType Package where the desired target class is located + * @param methodName Name of the desired method + * @param parameterTypes Parameter types of the desired method + * @return The method of the desired target class with the specified name and parameter types + * @throws NoSuchMethodException If the desired method of the desired target class with the specified name and parameter types cannot be found + * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found + * @see #getClass(String, PackageType) + * @see #getMethod(Class, String, Class...) + */ + public static Method getMethod(String className, PackageType packageType, String methodName, Class... parameterTypes) throws NoSuchMethodException, ClassNotFoundException { + return getMethod(packageType.getClass(className), methodName, parameterTypes); + } + + /** + * Invokes a method on an object with the given arguments + * + * @param instance Target object + * @param methodName Name of the desired method + * @param arguments Arguments which are used to invoke the desired method + * @return The result of invoking the desired method on the target object + * @throws IllegalAccessException If the desired method cannot be accessed due to certain circumstances + * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the method (this should not occur since it searches for a method with the types of the arguments) + * @throws InvocationTargetException If the desired method cannot be invoked on the target object + * @throws NoSuchMethodException If the desired method of the class of the target object with the specified name and arguments cannot be found + * @see #getMethod(Class, String, Class...) + * @see DataType#getPrimitive(Object[]) + */ + public static Object invokeMethod(Object instance, String methodName, Object... arguments) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException { + return getMethod(instance.getClass(), methodName, DataType.getPrimitive(arguments)).invoke(instance, arguments); + } + + /** + * Invokes a method of the target class on an object with the given arguments + * + * @param instance Target object + * @param clazz Target class + * @param methodName Name of the desired method + * @param arguments Arguments which are used to invoke the desired method + * @return The result of invoking the desired method on the target object + * @throws IllegalAccessException If the desired method cannot be accessed due to certain circumstances + * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the method (this should not occur since it searches for a method with the types of the arguments) + * @throws InvocationTargetException If the desired method cannot be invoked on the target object + * @throws NoSuchMethodException If the desired method of the target class with the specified name and arguments cannot be found + * @see #getMethod(Class, String, Class...) + * @see DataType#getPrimitive(Object[]) + */ + public static Object invokeMethod(Object instance, Class clazz, String methodName, Object... arguments) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException { + return getMethod(clazz, methodName, DataType.getPrimitive(arguments)).invoke(instance, arguments); + } + + /** + * Invokes a method of a desired class on an object with the given arguments + * + * @param instance Target object + * @param className Name of the desired target class + * @param packageType Package where the desired target class is located + * @param methodName Name of the desired method + * @param arguments Arguments which are used to invoke the desired method + * @return The result of invoking the desired method on the target object + * @throws IllegalAccessException If the desired method cannot be accessed due to certain circumstances + * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the method (this should not occur since it searches for a method with the types of the arguments) + * @throws InvocationTargetException If the desired method cannot be invoked on the target object + * @throws NoSuchMethodException If the desired method of the desired target class with the specified name and arguments cannot be found + * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found + * @see #getClass(String, PackageType) + * @see #invokeMethod(Object, Class, String, Object...) + */ + public static Object invokeMethod(Object instance, String className, PackageType packageType, String methodName, Object... arguments) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException { + return invokeMethod(instance, packageType.getClass(className), methodName, arguments); + } + + /** + * Returns a field of the target class with the given name + * + * @param clazz Target class + * @param declared Whether the desired field is declared or not + * @param fieldName Name of the desired field + * @return The field of the target class with the specified name + * @throws NoSuchFieldException If the desired field of the given class cannot be found + * @throws SecurityException If the desired field cannot be made accessible + */ + public static Field getField(Class clazz, boolean declared, String fieldName) throws NoSuchFieldException, SecurityException { + Field field = declared ? clazz.getDeclaredField(fieldName) : clazz.getField(fieldName); + field.setAccessible(true); + return field; + } + + /** + * Returns a field of a desired class with the given name + * + * @param className Name of the desired target class + * @param packageType Package where the desired target class is located + * @param declared Whether the desired field is declared or not + * @param fieldName Name of the desired field + * @return The field of the desired target class with the specified name + * @throws NoSuchFieldException If the desired field of the desired class cannot be found + * @throws SecurityException If the desired field cannot be made accessible + * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found + * @see #getField(Class, boolean, String) + */ + public static Field getField(String className, PackageType packageType, boolean declared, String fieldName) throws NoSuchFieldException, SecurityException, ClassNotFoundException { + return getField(packageType.getClass(className), declared, fieldName); + } + + /** + * Returns the value of a field of the given class of an object + * + * @param instance Target object + * @param clazz Target class + * @param declared Whether the desired field is declared or not + * @param fieldName Name of the desired field + * @return The value of field of the target object + * @throws IllegalArgumentException If the target object does not feature the desired field + * @throws IllegalAccessException If the desired field cannot be accessed + * @throws NoSuchFieldException If the desired field of the target class cannot be found + * @throws SecurityException If the desired field cannot be made accessible + * @see #getField(Class, boolean, String) + */ + public static Object getValue(Object instance, Class clazz, boolean declared, String fieldName) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { + return getField(clazz, declared, fieldName).get(instance); + } + + /** + * Returns the value of a field of a desired class of an object + * + * @param instance Target object + * @param className Name of the desired target class + * @param packageType Package where the desired target class is located + * @param declared Whether the desired field is declared or not + * @param fieldName Name of the desired field + * @return The value of field of the target object + * @throws IllegalArgumentException If the target object does not feature the desired field + * @throws IllegalAccessException If the desired field cannot be accessed + * @throws NoSuchFieldException If the desired field of the desired class cannot be found + * @throws SecurityException If the desired field cannot be made accessible + * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found + * @see #getValue(Object, Class, boolean, String) + */ + public static Object getValue(Object instance, String className, PackageType packageType, boolean declared, String fieldName) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, ClassNotFoundException { + return getValue(instance, packageType.getClass(className), declared, fieldName); + } + + /** + * Returns the value of a field with the given name of an object + * + * @param instance Target object + * @param declared Whether the desired field is declared or not + * @param fieldName Name of the desired field + * @return The value of field of the target object + * @throws IllegalArgumentException If the target object does not feature the desired field (should not occur since it searches for a field with the given name in the class of the object) + * @throws IllegalAccessException If the desired field cannot be accessed + * @throws NoSuchFieldException If the desired field of the target object cannot be found + * @throws SecurityException If the desired field cannot be made accessible + * @see #getValue(Object, Class, boolean, String) + */ + public static Object getValue(Object instance, boolean declared, String fieldName) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { + return getValue(instance, instance.getClass(), declared, fieldName); + } + + /** + * Sets the value of a field of the given class of an object + * + * @param instance Target object + * @param clazz Target class + * @param declared Whether the desired field is declared or not + * @param fieldName Name of the desired field + * @param value New value + * @throws IllegalArgumentException If the type of the value does not match the type of the desired field + * @throws IllegalAccessException If the desired field cannot be accessed + * @throws NoSuchFieldException If the desired field of the target class cannot be found + * @throws SecurityException If the desired field cannot be made accessible + * @see #getField(Class, boolean, String) + */ + public static void setValue(Object instance, Class clazz, boolean declared, String fieldName, Object value) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { + getField(clazz, declared, fieldName).set(instance, value); + } + + /** + * Sets the value of a field of a desired class of an object + * + * @param instance Target object + * @param className Name of the desired target class + * @param packageType Package where the desired target class is located + * @param declared Whether the desired field is declared or not + * @param fieldName Name of the desired field + * @param value New value + * @throws IllegalArgumentException If the type of the value does not match the type of the desired field + * @throws IllegalAccessException If the desired field cannot be accessed + * @throws NoSuchFieldException If the desired field of the desired class cannot be found + * @throws SecurityException If the desired field cannot be made accessible + * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found + * @see #setValue(Object, Class, boolean, String, Object) + */ + public static void setValue(Object instance, String className, PackageType packageType, boolean declared, String fieldName, Object value) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, ClassNotFoundException { + setValue(instance, packageType.getClass(className), declared, fieldName, value); + } + + /** + * Sets the value of a field with the given name of an object + * + * @param instance Target object + * @param declared Whether the desired field is declared or not + * @param fieldName Name of the desired field + * @param value New value + * @throws IllegalArgumentException If the type of the value does not match the type of the desired field + * @throws IllegalAccessException If the desired field cannot be accessed + * @throws NoSuchFieldException If the desired field of the target object cannot be found + * @throws SecurityException If the desired field cannot be made accessible + * @see #setValue(Object, Class, boolean, String, Object) + */ + public static void setValue(Object instance, boolean declared, String fieldName, Object value) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { + setValue(instance, instance.getClass(), declared, fieldName, value); + } + + /** + * Represents an enumeration of dynamic packages of NMS and CraftBukkit + *

+ * This class is part of the ReflectionUtils and follows the same usage conditions + * + * @author DarkBlade12 + * @since 1.0 + */ + public enum PackageType { + MINECRAFT_SERVER("net.minecraft.server." + getServerVersion()), + CRAFTBUKKIT("org.bukkit.craftbukkit." + getServerVersion()), + CRAFTBUKKIT_BLOCK(CRAFTBUKKIT, "block"), + CRAFTBUKKIT_CHUNKIO(CRAFTBUKKIT, "chunkio"), + CRAFTBUKKIT_COMMAND(CRAFTBUKKIT, "command"), + CRAFTBUKKIT_CONVERSATIONS(CRAFTBUKKIT, "conversations"), + CRAFTBUKKIT_ENCHANTMENS(CRAFTBUKKIT, "enchantments"), + CRAFTBUKKIT_ENTITY(CRAFTBUKKIT, "entity"), + CRAFTBUKKIT_EVENT(CRAFTBUKKIT, "event"), + CRAFTBUKKIT_GENERATOR(CRAFTBUKKIT, "generator"), + CRAFTBUKKIT_HELP(CRAFTBUKKIT, "help"), + CRAFTBUKKIT_INVENTORY(CRAFTBUKKIT, "inventory"), + CRAFTBUKKIT_MAP(CRAFTBUKKIT, "map"), + CRAFTBUKKIT_METADATA(CRAFTBUKKIT, "metadata"), + CRAFTBUKKIT_POTION(CRAFTBUKKIT, "potion"), + CRAFTBUKKIT_PROJECTILES(CRAFTBUKKIT, "projectiles"), + CRAFTBUKKIT_SCHEDULER(CRAFTBUKKIT, "scheduler"), + CRAFTBUKKIT_SCOREBOARD(CRAFTBUKKIT, "scoreboard"), + CRAFTBUKKIT_UPDATER(CRAFTBUKKIT, "updater"), + CRAFTBUKKIT_UTIL(CRAFTBUKKIT, "util"); + + private final String path; + + /** + * Construct a new package type + * + * @param path Path of the package + */ + private PackageType(String path) { + this.path = path; + } + + /** + * Construct a new package type + * + * @param parent Parent package of the package + * @param path Path of the package + */ + private PackageType(PackageType parent, String path) { + this(parent + "." + path); + } + + /** + * Returns the path of this package type + * + * @return The path + */ + public String getPath() { + return path; + } + + /** + * Returns the class with the given name + * + * @param className Name of the desired class + * @return The class with the specified name + * @throws ClassNotFoundException If the desired class with the specified name and package cannot be found + */ + public Class getClass(String className) throws ClassNotFoundException { + return Class.forName(this + "." + className); + } + + // Override for convenience + @Override + public String toString() { + return path; + } + + /** + * Returns the version of your server + * + * @return The server version + */ + public static String getServerVersion() { + return Bukkit.getServer().getClass().getPackage().getName().substring(23); + } + } + + /** + * Represents an enumeration of Java data types with corresponding classes + *

+ * This class is part of the ReflectionUtils and follows the same usage conditions + * + * @author DarkBlade12 + * @since 1.0 + */ + public enum DataType { + BYTE(byte.class, Byte.class), + SHORT(short.class, Short.class), + INTEGER(int.class, Integer.class), + LONG(long.class, Long.class), + CHARACTER(char.class, Character.class), + FLOAT(float.class, Float.class), + DOUBLE(double.class, Double.class), + BOOLEAN(boolean.class, Boolean.class); + + private static final Map, DataType> CLASS_MAP = new HashMap, DataType>(); + private final Class primitive; + private final Class reference; + + // Initialize map for quick class lookup + static { + for (DataType type : values()) { + CLASS_MAP.put(type.primitive, type); + CLASS_MAP.put(type.reference, type); + } + } + + /** + * Construct a new data type + * + * @param primitive Primitive class of this data type + * @param reference Reference class of this data type + */ + private DataType(Class primitive, Class reference) { + this.primitive = primitive; + this.reference = reference; + } + + /** + * Returns the primitive class of this data type + * + * @return The primitive class + */ + public Class getPrimitive() { + return primitive; + } + + /** + * Returns the reference class of this data type + * + * @return The reference class + */ + public Class getReference() { + return reference; + } + + /** + * Returns the data type with the given primitive/reference class + * + * @param clazz Primitive/Reference class of the data type + * @return The data type + */ + public static DataType fromClass(Class clazz) { + return CLASS_MAP.get(clazz); + } + + /** + * Returns the primitive class of the data type with the given reference class + * + * @param clazz Reference class of the data type + * @return The primitive class + */ + public static Class getPrimitive(Class clazz) { + DataType type = fromClass(clazz); + return type == null ? clazz : type.getPrimitive(); + } + + /** + * Returns the reference class of the data type with the given primitive class + * + * @param clazz Primitive class of the data type + * @return The reference class + */ + public static Class getReference(Class clazz) { + DataType type = fromClass(clazz); + return type == null ? clazz : type.getReference(); + } + + /** + * Returns the primitive class array of the given class array + * + * @param classes Given class array + * @return The primitive class array + */ + public static Class[] getPrimitive(Class[] classes) { + int length = classes == null ? 0 : classes.length; + Class[] types = new Class[length]; + for (int index = 0; index < length; index++) { + types[index] = getPrimitive(classes[index]); + } + return types; + } + + /** + * Returns the reference class array of the given class array + * + * @param classes Given class array + * @return The reference class array + */ + public static Class[] getReference(Class[] classes) { + int length = classes == null ? 0 : classes.length; + Class[] types = new Class[length]; + for (int index = 0; index < length; index++) { + types[index] = getReference(classes[index]); + } + return types; + } + + /** + * Returns the primitive class array of the given object array + * + * @param object Given object array + * @return The primitive class array + */ + public static Class[] getPrimitive(Object[] objects) { + int length = objects == null ? 0 : objects.length; + Class[] types = new Class[length]; + for (int index = 0; index < length; index++) { + types[index] = getPrimitive(objects[index].getClass()); + } + return types; + } + + /** + * Returns the reference class array of the given object array + * + * @param object Given object array + * @return The reference class array + */ + public static Class[] getReference(Object[] objects) { + int length = objects == null ? 0 : objects.length; + Class[] types = new Class[length]; + for (int index = 0; index < length; index++) { + types[index] = getReference(objects[index].getClass()); + } + return types; + } + + /** + * Compares two class arrays on equivalence + * + * @param primary Primary class array + * @param secondary Class array which is compared to the primary array + * @return Whether these arrays are equal or not + */ + public static boolean compare(Class[] primary, Class[] secondary) { + if (primary == null || secondary == null || primary.length != secondary.length) { + return false; + } + for (int index = 0; index < primary.length; index++) { + Class primaryClass = primary[index]; + Class secondaryClass = secondary[index]; + if (primaryClass.equals(secondaryClass) || primaryClass.isAssignableFrom(secondaryClass)) { + continue; + } + return false; + } + return true; + } + } + + /** + * Represents an enumeration of all packet types that are featured in Minecraft 1.7.10 + *

+ * If this enumeration is no longer up-to-date, please let me know in my forum post + *

+ * This class is part of the ReflectionUtils and follows the same usage conditions + * + * @author DarkBlade12 + * @since 1.0 + */ + public enum PacketType { + HANDSHAKING_IN_SET_PROTOCOL("PacketHandshakingInSetProtocol"), + LOGIN_IN_ENCRYPTION_BEGIN("PacketLoginInEncryptionBegin"), + LOGIN_IN_START("PacketLoginInStart"), + LOGIN_OUT_DISCONNECT("PacketLoginOutDisconnect"), + LOGIN_OUT_ENCRYPTION_BEGIN("PacketLoginOutEncryptionBegin"), + LOGIN_OUT_SUCCESS("PacketLoginOutSuccess"), + PLAY_IN_ABILITIES("PacketPlayInAbilities"), + PLAY_IN_ARM_ANIMATION("PacketPlayInArmAnimation"), + PLAY_IN_BLOCK_DIG("PacketPlayInBlockDig"), + PLAY_IN_BLOCK_PLACE("PacketPlayInBlockPlace"), + PLAY_IN_CHAT("PacketPlayInChat"), + PLAY_IN_CLIENT_COMMAND("PacketPlayInClientCommand"), + PLAY_IN_CLOSE_WINDOW("PacketPlayInCloseWindow"), + PLAY_IN_CUSTOM_PAYLOAD("PacketPlayInCustomPayload"), + PLAY_IN_ENCHANT_ITEM("PacketPlayInEnchantItem"), + PLAY_IN_ENTITY_ACTION("PacketPlayInEntityAction"), + PLAY_IN_FLYING("PacketPlayInFlying"), + PLAY_IN_HELD_ITEM_SLOT("PacketPlayInHeldItemSlot"), + PLAY_IN_KEEP_ALIVE("PacketPlayInKeepAlive"), + PLAY_IN_LOOK("PacketPlayInLook"), + PLAY_IN_POSITION("PacketPlayInPosition"), + PLAY_IN_POSITION_LOOK("PacketPlayInPositionLook"), + PLAY_IN_SET_CREATIVE_SLOT("PacketPlayInSetCreativeSlot "), + PLAY_IN_SETTINGS("PacketPlayInSettings"), + PLAY_IN_STEER_VEHICLE("PacketPlayInSteerVehicle"), + PLAY_IN_TAB_COMPLETE("PacketPlayInTabComplete"), + PLAY_IN_TRANSACTION("PacketPlayInTransaction"), + PLAY_IN_UPDATE_SIGN("PacketPlayInUpdateSign"), + PLAY_IN_USE_ENTITY("PacketPlayInUseEntity"), + PLAY_IN_WINDOW_CLICK("PacketPlayInWindowClick"), + PLAY_OUT_ABILITIES("PacketPlayOutAbilities"), + PLAY_OUT_ANIMATION("PacketPlayOutAnimation"), + PLAY_OUT_ATTACH_ENTITY("PacketPlayOutAttachEntity"), + PLAY_OUT_BED("PacketPlayOutBed"), + PLAY_OUT_BLOCK_ACTION("PacketPlayOutBlockAction"), + PLAY_OUT_BLOCK_BREAK_ANIMATION("PacketPlayOutBlockBreakAnimation"), + PLAY_OUT_BLOCK_CHANGE("PacketPlayOutBlockChange"), + PLAY_OUT_CHAT("PacketPlayOutChat"), + PLAY_OUT_CLOSE_WINDOW("PacketPlayOutCloseWindow"), + PLAY_OUT_COLLECT("PacketPlayOutCollect"), + PLAY_OUT_CRAFT_PROGRESS_BAR("PacketPlayOutCraftProgressBar"), + PLAY_OUT_CUSTOM_PAYLOAD("PacketPlayOutCustomPayload"), + PLAY_OUT_ENTITY("PacketPlayOutEntity"), + PLAY_OUT_ENTITY_DESTROY("PacketPlayOutEntityDestroy"), + PLAY_OUT_ENTITY_EFFECT("PacketPlayOutEntityEffect"), + PLAY_OUT_ENTITY_EQUIPMENT("PacketPlayOutEntityEquipment"), + PLAY_OUT_ENTITY_HEAD_ROTATION("PacketPlayOutEntityHeadRotation"), + PLAY_OUT_ENTITY_LOOK("PacketPlayOutEntityLook"), + PLAY_OUT_ENTITY_METADATA("PacketPlayOutEntityMetadata"), + PLAY_OUT_ENTITY_STATUS("PacketPlayOutEntityStatus"), + PLAY_OUT_ENTITY_TELEPORT("PacketPlayOutEntityTeleport"), + PLAY_OUT_ENTITY_VELOCITY("PacketPlayOutEntityVelocity"), + PLAY_OUT_EXPERIENCE("PacketPlayOutExperience"), + PLAY_OUT_EXPLOSION("PacketPlayOutExplosion"), + PLAY_OUT_GAME_STATE_CHANGE("PacketPlayOutGameStateChange"), + PLAY_OUT_HELD_ITEM_SLOT("PacketPlayOutHeldItemSlot"), + PLAY_OUT_KEEP_ALIVE("PacketPlayOutKeepAlive"), + PLAY_OUT_KICK_DISCONNECT("PacketPlayOutKickDisconnect"), + PLAY_OUT_LOGIN("PacketPlayOutLogin"), + PLAY_OUT_MAP("PacketPlayOutMap"), + PLAY_OUT_MAP_CHUNK("PacketPlayOutMapChunk"), + PLAY_OUT_MAP_CHUNK_BULK("PacketPlayOutMapChunkBulk"), + PLAY_OUT_MULTI_BLOCK_CHANGE("PacketPlayOutMultiBlockChange"), + PLAY_OUT_NAMED_ENTITY_SPAWN("PacketPlayOutNamedEntitySpawn"), + PLAY_OUT_NAMED_SOUND_EFFECT("PacketPlayOutNamedSoundEffect"), + PLAY_OUT_OPEN_SIGN_EDITOR("PacketPlayOutOpenSignEditor"), + PLAY_OUT_OPEN_WINDOW("PacketPlayOutOpenWindow"), + PLAY_OUT_PLAYER_INFO("PacketPlayOutPlayerInfo"), + PLAY_OUT_POSITION("PacketPlayOutPosition"), + PLAY_OUT_REL_ENTITY_MOVE("PacketPlayOutRelEntityMove"), + PLAY_OUT_REL_ENTITY_MOVE_LOOK("PacketPlayOutRelEntityMoveLook"), + PLAY_OUT_REMOVE_ENTITY_EFFECT("PacketPlayOutRemoveEntityEffect"), + PLAY_OUT_RESPAWN("PacketPlayOutRespawn"), + PLAY_OUT_SCOREBOARD_DISPLAY_OBJECTIVE("PacketPlayOutScoreboardDisplayObjective"), + PLAY_OUT_SCOREBOARD_OBJECTIVE("PacketPlayOutScoreboardObjective"), + PLAY_OUT_SCOREBOARD_SCORE("PacketPlayOutScoreboardScore"), + PLAY_OUT_SCOREBOARD_TEAM("PacketPlayOutScoreboardTeam"), + PLAY_OUT_SET_SLOT("PacketPlayOutSetSlot"), + PLAY_OUT_SPAWN_ENTITY("PacketPlayOutSpawnEntity"), + PLAY_OUT_SPAWN_ENTITY_EXPERIENCE_ORB("PacketPlayOutSpawnEntityExperienceOrb"), + PLAY_OUT_SPAWN_ENTITY_LIVING("PacketPlayOutSpawnEntityLiving"), + PLAY_OUT_SPAWN_ENTITY_PAINTING("PacketPlayOutSpawnEntityPainting"), + PLAY_OUT_SPAWN_ENTITY_WEATHER("PacketPlayOutSpawnEntityWeather"), + PLAY_OUT_SPAWN_POSITION("PacketPlayOutSpawnPosition"), + PLAY_OUT_STATISTIC("PacketPlayOutStatistic"), + PLAY_OUT_TAB_COMPLETE("PacketPlayOutTabComplete"), + PLAY_OUT_TILE_ENTITY_DATA("PacketPlayOutTileEntityData"), + PLAY_OUT_TRANSACTION("PacketPlayOutTransaction"), + PLAY_OUT_UPDATE_ATTRIBUTES("PacketPlayOutUpdateAttributes"), + PLAY_OUT_UPDATE_HEALTH("PacketPlayOutUpdateHealth"), + PLAY_OUT_UPDATE_SIGN("PacketPlayOutUpdateSign"), + PLAY_OUT_UPDATE_TIME("PacketPlayOutUpdateTime"), + PLAY_OUT_WINDOW_ITEMS("PacketPlayOutWindowItems"), + PLAY_OUT_WORLD_EVENT("PacketPlayOutWorldEvent"), + PLAY_OUT_WORLD_PARTICLES("PacketPlayOutWorldParticles"), + STATUS_IN_PING("PacketStatusInPing"), + STATUS_IN_START("PacketStatusInStart"), + STATUS_OUT_PONG("PacketStatusOutPong"), + STATUS_OUT_SERVER_INFO("PacketStatusOutServerInfo"); + + private static final Map NAME_MAP = new HashMap(); + private final String name; + private Class packet; + + // Initialize map for quick name lookup + static { + for (PacketType type : values()) { + NAME_MAP.put(type.name, type); + } + } + + /** + * Construct a new packet type + * + * @param name Name of this packet + */ + private PacketType(String name) { + this.name = name; + } + + /** + * Returns the name of this packet type + * + * @return The name + */ + public String getName() { + return name; + } + + /** + * Returns the class of this packet + * + * @return The packet class + * @throws ClassNotFoundException If the packet class cannot be found (the name differs in your Bukkit version) + * + */ + public Class getPacket() throws ClassNotFoundException { + return packet == null ? (packet = PackageType.MINECRAFT_SERVER.getClass(name)) : packet; + } + } +} \ No newline at end of file diff --git a/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java b/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java index 6cafc1cb..63e1c917 100644 --- a/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java +++ b/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java @@ -205,12 +205,7 @@ public class LavaFlow else if(Math.random() < PARTICLE_DENSITY && dSquared < Math.pow(currentRadius + PARTICLE_OFFSET, 2) && currentRadius + PARTICLE_OFFSET < maxRadius) { - try { - ParticleEffect.LAVA.sendToPlayers(Methods.getPlayersAroundPoint(loc, 100), loc, (float) Math.random(), (float) Math.random(), (float) Math.random(), 0, 1); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + ParticleEffect.LAVA.display(loc, (float) Math.random(), (float) Math.random(), (float) Math.random(), 0, 1); } } @@ -259,12 +254,7 @@ public class LavaFlow && !isLava(tempBlock) && Math.random() < PARTICLE_DENSITY && tempBlock.getLocation().distanceSquared(origin) <= Math.pow(radius,2)) - try { - ParticleEffect.LAVA.sendToPlayers(Methods.getPlayersAroundPoint(loc, 100), loc, 0, 0, 0, 0, 1); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + ParticleEffect.LAVA.display(loc, 0, 0, 0, 0, 1); } return; @@ -296,12 +286,7 @@ public class LavaFlow if(Math.random() < LAVA_CREATE_SPEED) createLava(tempBlock); else - try { - ParticleEffect.LAVA.sendToPlayers(Methods.getPlayersAroundPoint(loc, 100), loc, 0, 0, 0, 0, 1); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + ParticleEffect.LAVA.display(loc, (float) 0, (float) 0, (float) 0, 0, 1); } else if(!makeLava && isLava(tempBlock)) { From 182d35ea0593fd68ff0a1b3561a4a7f209f0b7bf Mon Sep 17 00:00:00 2001 From: MistPhizzle Date: Sun, 7 Dec 2014 10:40:40 -0500 Subject: [PATCH 3/6] Revert "Merge remote-tracking branch 'origin/master'" This reverts commit 7801239208e42c46be18965f6c42433489168139. --- .../Utilities/ParticleEffect.java | 1198 +++++++---------- .../Utilities/ReflectionHandler.java | 548 ++++++++ .../Utilities/ReflectionUtils.java | 758 ----------- .../ProjectKorra/earthbending/LavaFlow.java | 21 +- 4 files changed, 1020 insertions(+), 1505 deletions(-) create mode 100644 src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java delete mode 100644 src/com/projectkorra/ProjectKorra/Utilities/ReflectionUtils.java diff --git a/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java b/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java index c87e005e..1691c577 100644 --- a/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java +++ b/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java @@ -1,798 +1,508 @@ package com.projectkorra.ProjectKorra.Utilities; -import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import java.util.Collection; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.entity.Player; -import com.projectkorra.ProjectKorra.Utilities.ReflectionUtils.PackageType; -import com.projectkorra.ProjectKorra.Utilities.ReflectionUtils.PacketType; - -/** - * ParticleEffect Library - *

- * This library was created by @DarkBlade12 based on content related to particles of @microgeek (names and packet parameters), it allows you to display all Minecraft particle effects on a Bukkit server - *

- * You are welcome to use it, modify it and redistribute it under the following conditions: - *

    - *
  • Don't claim this class as your own - *
  • Don't remove this disclaimer - *
- *

- * It would be nice if you provide credit to me if you use this class in a published project - * - * @author DarkBlade12 - * @version 1.5 - */ public enum ParticleEffect { - /** - * A particle effect which is displayed by exploding tnt and creepers: - *

    - *
  • It looks like a crowd of gray balls which are fading away - *
  • The speed value has no influence on this particle effect - *
- */ - HUGE_EXPLOSION("hugeexplosion"), - /** - * A particle effect which is displayed by exploding ghast fireballs and wither skulls: - *
    - *
  • It looks like a gray ball which is fading away - *
  • The speed value slightly influences the size of this particle effect - *
- */ - LARGE_EXPLODE("largeexplode"), - /** - * A particle effect which is displayed by launching fireworks: - *
    - *
  • It looks like a white star which is sparkling - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - FIREWORKS_SPARK("fireworksSpark"), - /** - * A particle effect which is displayed by swimming entities and arrows in water: - *
    - *
  • It looks like a bubble - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - BUBBLE("bubble", true), - /** - * A particle effect which is displayed by water: - *
    - *
  • It looks like a tiny blue square - *
  • The speed value has no influence on this particle effect - *
- */ - SUSPEND("suspend", true), - /** - * A particle effect which is displayed by air when close to bedrock and the in the void: - *
    - *
  • It looks like a tiny gray square - *
  • The speed value has no influence on this particle effect - *
- */ - DEPTH_SUSPEND("depthSuspend"), - /** - * A particle effect which is displayed by mycelium: - *
    - *
  • It looks like a tiny gray square - *
  • The speed value has no influence on this particle effect - *
- */ - TOWN_AURA("townaura"), - /** - * A particle effect which is displayed when landing a critical hit and by arrows: - *
    - *
  • It looks like a light brown cross - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - CRIT("crit"), - /** - * A particle effect which is displayed when landing a hit with an enchanted weapon: - *
    - *
  • It looks like a cyan star - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - MAGIC_CRIT("magicCrit"), - /** - * A particle effect which is displayed by primed tnt, torches, droppers, dispensers, end portals, brewing stands and monster spawners: - *
    - *
  • It looks like a little gray cloud - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - SMOKE("smoke"), - /** - * A particle effect which is displayed by entities with active potion effects: - *
    - *
  • It looks like a colored swirl - *
  • The speed value causes the particle to be colored black when set to 0 - *
- */ - MOB_SPELL("mobSpell"), - /** - * A particle effect which is displayed by entities with active potion effects applied through a beacon: - *
    - *
  • It looks like a transparent colored swirl - *
  • The speed value causes the particle to be always colored black when set to 0 - *
- */ - MOB_SPELL_AMBIENT("mobSpellAmbient"), - /** - * A particle effect which is displayed when splash potions or bottles o' enchanting hit something: - *
    - *
  • It looks like a white swirl - *
  • The speed value causes the particle to only move upwards when set to 0 - *
- */ - SPELL("spell"), - /** - * A particle effect which is displayed when instant splash potions hit something: - *
    - *
  • It looks like a white cross - *
  • The speed value causes the particle to only move upwards when set to 0 - *
- */ - INSTANT_SPELL("instantSpell"), - /** - * A particle effect which is displayed by witches: - *
    - *
  • It looks like a purple cross - *
  • The speed value causes the particle to only move upwards when set to 0 - *
- */ - WITCH_MAGIC("witchMagic"), - /** - * A particle effect which is displayed by note blocks: - *
    - *
  • It looks like a colored note - *
  • The speed value causes the particle to be colored green when set to 0 - *
- */ - NOTE("note"), - /** - * A particle effect which is displayed by nether portals, endermen, ender pearls, eyes of ender, ender chests and dragon eggs: - *
    - *
  • It looks like a purple cloud - *
  • The speed value influences the spread of this particle effect - *
- */ - PORTAL("portal"), - /** - * A particle effect which is displayed by enchantment tables which are nearby bookshelves: - *
    - *
  • It looks like a cryptic white letter - *
  • The speed value influences the spread of this particle effect - *
- */ - ENCHANTMENT_TABLE("enchantmenttable"), - /** - * A particle effect which is displayed by exploding tnt and creepers: - *
    - *
  • It looks like a white cloud - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - EXPLODE("explode"), - /** - * A particle effect which is displayed by torches, active furnaces, magma cubes and monster spawners: - *
    - *
  • It looks like a tiny flame - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - FLAME("flame"), - /** - * A particle effect which is displayed by lava: - *
    - *
  • It looks like a spark - *
  • The speed value has no influence on this particle effect - *
- */ - LAVA("lava"), - /** - * A particle effect which is currently unused: - *
    - *
  • It looks like a transparent gray square - *
  • The speed value has no influence on this particle effect - *
- */ - FOOTSTEP("footstep"), - /** - * A particle effect which is displayed by swimming entities, rain dropping on the ground and shaking wolves: - *
    - *
  • It looks like a blue drop - *
  • The speed value has no influence on this particle effect - *
- */ - SPLASH("splash"), - /** - * A particle effect which is displayed on water when fishing: - *
    - *
  • It looks like a blue droplet - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - WAKE("wake"), - /** - * A particle effect which is displayed by fire, minecarts with furnace and blazes: - *
    - *
  • It looks like a large gray cloud - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - LARGE_SMOKE("largesmoke"), - /** - * A particle effect which is displayed when a mob dies: - *
    - *
  • It looks like a large white cloud - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - CLOUD("cloud"), - /** - * A particle effect which is displayed by redstone ore, powered redstone, redstone torches and redstone repeaters: - *
    - *
  • It looks like a tiny colored cloud - *
  • The speed value causes the particle to be colored red when set to 0 - *
- */ - RED_DUST("reddust"), - /** - * A particle effect which is displayed when snowballs or eggs hit something: - *
    - *
  • It looks like a tiny part of the snowball icon - *
  • The speed value has no influence on this particle effect - *
- */ - SNOWBALL_POOF("snowballpoof"), - /** - * A particle effect which is displayed by blocks beneath a water source: - *
    - *
  • It looks like a blue drip - *
  • The speed value has no influence on this particle effect - *
- */ - DRIP_WATER("dripWater"), - /** - * A particle effect which is displayed by blocks beneath a lava source: - *
    - *
  • It looks like an orange drip - *
  • The speed value has no influence on this particle effect - *
- */ - DRIP_LAVA("dripLava"), - /** - * A particle effect which is currently unused: - *
    - *
  • It looks like a tiny white cloud - *
  • The speed value influences the velocity at which the particle flies off - *
- */ - SNOW_SHOVEL("snowshovel"), - /** - * A particle effect which is displayed by slimes: - *
    - *
  • It looks like a tiny part of the slimeball icon - *
  • The speed value has no influence on this particle effect - *
- */ - SLIME("slime"), - /** - * A particle effect which is displayed when breeding and taming animals: - *
    - *
  • It looks like a red heart - *
  • The speed value has no influence on this particle effect - *
- */ - HEART("heart"), - /** - * A particle effect which is displayed when attacking a villager in a village: - *
    - *
  • It looks like a cracked gray heart - *
  • The speed value has no influence on this particle effect - *
- */ - ANGRY_VILLAGER("angryVillager"), - /** - * A particle effect which is displayed when using bone meal and trading with a villager in a village: - *
    - *
  • It looks like a green star - *
  • The speed value has no influence on this particle effect - *
- */ - HAPPY_VILLAGER("happyVillager"); - private static final Map NAME_MAP = new HashMap(); - private final String name; - private final boolean requiresWater; + // == Support for 1.7 Implementation == + HUGE_EXPLOSION( + "hugeexplosion", + "EXPLOSION_HUGE"), + LARGE_EXPLODE( + "largeexplode", + "EXPLOSION_LARGE"), + BUBBLE( + "bubble", + "WATER_BUBBLE"), + SUSPEND( + "suspend", + "SUSPENDED"), + DEPTH_SUSPEND( + "depthSuspend", + "SUSPENDED_DEPTH"), + MAGIC_CRIT( + "magicCrit", + "CRIT_MAGIC"), + MOB_SPELL( + "mobSpell", + "SPELL_MOB"), + MOB_SPELL_AMBIENT( + "mobSpellAmbient", + "SPELL_MOB_AMBIENT"), + INSTANT_SPELL( + "instantSpell", + "SPELL_INSTANT"), + WITCH_MAGIC( + "witchMagic", + "SPELL_WITCH"), + EXPLODE( + "explode", + "EXPLOSION_NORMAL"), + SPLASH( + "splash", + "WATER_SPLASH"), + LARGE_SMOKE( + "largesmoke", + "SMOKE_LARGE"), + RED_DUST( + "reddust", + "REDSTONE"), + SNOWBALL_POOF( + "snowballpoof", + "SNOWBALL"), + ANGRY_VILLAGER( + "angryVillager", + "VILLAGER_ANGRY"), + HAPPY_VILLAGER( + "happerVillager", + "VILLAGER_HAPPY"), + // == 1.8 Particles and Supported 1.7 Particles == + /** + * 1.8 only! + * + * @see {@link #EXPLODE} + */ + EXPLOSION_NORMAL( + EXPLODE.getName()), + /** + * 1.8 only! + * + * @see {@link #LARGE_EXPLODE} + */ + EXPLOSION_LARGE( + LARGE_EXPLODE.getName()), + /** + * 1.8 only! + * + * @see {@link #HUGE_EXPLOSION} + */ + EXPLOSION_HUGE( + HUGE_EXPLOSION.getName()), + FIREWORKS_SPARK( + "fireworksSpark"), + /** + * 1.8 only! + * + * @see {@link #BUBBLE} + */ + WATER_BUBBLE( + BUBBLE.getName()), + /** + * 1.8 only! + * + * @see {@link #SPLASH} + */ + WATER_SPLASH( + SPLASH.getName()), + /** + * 1.8 only! + */ + WATER_WAKE, + /** + * 1.8 only! + * + * @see {@link #SUSPEND} + */ + SUSPENDED( + SUSPEND.getName()), + /** + * 1.8 only! + * + * @see {@link #DEPTH_SUSPEND} + */ + SUSPENDED_DEPTH( + DEPTH_SUSPEND.getName()), + CRIT( + "crit"), + /** + * 1.8 only! + * + * @see {@link #MAGIC_CRIT} + */ + CRIT_MAGIC( + MAGIC_CRIT.getName()), + /** + * 1.8 only! + */ + SMOKE_NORMAL, + /** + * 1.8 only! + * + * @see {@link #LARGE_SMOKE} + */ + SMOKE_LARGE( + LARGE_SMOKE.getName()), + SPELL( + "spell"), + /** + * 1.8 only! + * + * @see {@link #INSTANT_SPELL} + */ + SPELL_INSTANT( + INSTANT_SPELL.getName()), + /** + * 1.8 only! + * + * @see {@link #MOB_SPELL} + */ + SPELL_MOB( + MOB_SPELL.getName()), + /** + * 1.8 only! + * + * @see {@link #MOB_SPELL_AMBIENT} + */ + SPELL_MOB_AMBIENT( + MOB_SPELL_AMBIENT.getName()), + /** + * 1.8 only! + * + * @see {@link #WITCH_MAGIC} + */ + SPELL_WITCH( + WITCH_MAGIC.getName()), + DRIP_WATER( + "dripWater"), + DRIP_LAVA( + "dripLava"), + /** + * 1.8 only! + * + * @see {@link #ANGRY_VILLAGER} + */ + VILLAGER_ANGRY( + ANGRY_VILLAGER.getName()), + /** + * 1.8 only! + * + * @see {@link #HAPPY_VILLAGER} + */ + VILLAGER_HAPPY( + HAPPY_VILLAGER.getName()), + TOWN_AURA( + "townaura"), + NOTE( + "note"), + PORTAL( + "portal"), + ENCHANTMENT_TABLE( + "enchantmenttable"), + FLAME( + "flame"), + LAVA( + "lave"), + FOOTSTEP( + "footstep"), + CLOUD( + "cloud"), + REDSTONE( + "reddust"), + SNOWBALL( + "snowballpoof"), + SNOW_SHOVEL( + "snowshovel"), + SLIME( + "slime"), + HEART( + "heart"), + /** + * 1.8 only! + */ + BARRIER, + /** + * 1.8 only! + */ + ITEM_CRACK, + /** + * 1.8 only! + */ + BLOCK_CRACK, + /** + * 1.8 only! + */ + BLOCK_DUST, + /** + * 1.8 only! + */ + WATER_DROP, + /** + * 1.8 only! + */ + ITEM_TAKE, + /** + * 1.8 only! + */ + MOB_APPEARANCE; - // Initialize map for quick name lookup - static { - for (ParticleEffect effect : values()) { - NAME_MAP.put(effect.name, effect); + private String particleName; + private String enumValue; + + ParticleEffect(String particleName, String enumValue) { + this.particleName = particleName; + this.enumValue = enumValue; + } + + ParticleEffect(String particleName) { + this(particleName, null); + } + + ParticleEffect() { + this(null, null); + } + + public String getName() { + return this.particleName; + } + + private static Class nmsPacketPlayOutParticle = ReflectionUtilities.getNMSClass("PacketPlayOutWorldParticles"); + private static Class nmsEnumParticle; + private static int particleRange = 25; + + /** + * Modify the maximum Range of particles (only useful for Client versions 1.8+) + * + * @param range + * New range + */ + public static void setRange(int range) { + if (range < 0) throw new IllegalArgumentException("Range must be positive!"); + if (range > Integer.MAX_VALUE) throw new IllegalArgumentException("Range is too big!"); + particleRange = range; + } + + /** + * @return The current maximum Range of particles + */ + public static int getRange() { + return particleRange; + } + + /** + * Send the particle to a specific Player + * + * @param player + * Receiver of the particle + * @param location + * Location of the particle + * @param offsetX + * X size of the area to spawn particles in. + * @param offsetY + * Y size of the area to spawn particles in. + * @param offsetZ + * Z size of the area to spawn particles in. + * @param speed + * Speed of the Particle + * @param count + * Number of spawned particles + * @throws Exception + */ + public void sendToPlayer(Player player, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { + if (!isPlayerInRange(player, location)) return; + System.out.println(ReflectionUtilities.getVersion()); + if (ReflectionUtilities.getVersion().contains("v1_8")) { + try { + if (nmsEnumParticle == null) nmsEnumParticle = ReflectionUtilities.getNMSClass("EnumParticle"); + Object packet = nmsPacketPlayOutParticle.getConstructor(new Class[] { nmsEnumParticle, boolean.class, float.class, float.class, float.class, float.class, float.class, float.class, float.class, int.class, int[].class }) + .newInstance(getEnum(nmsEnumParticle.getName() + "." + (enumValue != null ? enumValue : name().toUpperCase())), true, (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, speed, count, new int[] {}); + Object handle = ReflectionUtilities.getHandle(player); + Object connection = ReflectionUtilities.getField(handle.getClass(), "playerConnection").get(handle); + ReflectionUtilities.getMethod(connection.getClass(), "sendPacket", new Class[0]).invoke(connection, new Object[] { packet }); + } catch (Exception e) { + throw new IllegalArgumentException("Unable to send Particle " + name() + ". (Version 1.8): " + e.getMessage()); + } + } else { + try { + if (particleName == null) throw new Exception(); + Object packet = nmsPacketPlayOutParticle.getConstructor(new Class[] { String.class, float.class, float.class, float.class, float.class, float.class, float.class, float.class, int.class }).newInstance(particleName, (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, speed, count); + Object handle = ReflectionUtilities.getHandle(player); + Object connection = ReflectionUtilities.getField(handle.getClass(), "playerConnection").get(handle); + ReflectionUtilities.getMethod(connection.getClass(), "sendPacket", new Class[0]).invoke(connection, new Object[] { packet }); + } catch (Exception e) { + throw new IllegalArgumentException("Unable to send Particle " + name() + ". (Invalid Server Version: 1.7) " + e.getMessage()); + } } } /** - * Construct a new particle effect - * - * @param name Name of this particle effect - * @param requiresWater Indicates whether water is required for this particle effect to display properly + * Send the particle to a Collection of Players {@link #sendToPlayer(Player, Location, float, float, float, float, int)} + * + * @param player + * Receiver of the particle + * @param location + * Location of the particle + * @param offsetX + * X size of the area to spawn particles in. + * @param offsetY + * Y size of the area to spawn particles in. + * @param offsetZ + * Z size of the area to spawn particles in. + * @param speed + * Speed of the Particle + * @param count + * Number of spawned particles */ - private ParticleEffect(String name, boolean requiresWater) { - this.name = name; - this.requiresWater = requiresWater; + public void sendToPlayers(Collection players, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { + for (Player p : players) + sendToPlayer(p, location, offsetX, offsetY, offsetZ, speed, count); } /** - * Construct a new particle effect with {@link #requiresWater} set to false - * - * @param name Name of this particle effect - * @see #ParticleEffect(String, boolean) + * Send the particle to an Array of Players {@link #sendToPlayer(Player, Location, float, float, float, float, int)} + * + * @param player + * Receiver of the particle + * @param location + * Location of the particle + * @param offsetX + * X size of the area to spawn particles in. + * @param offsetY + * Y size of the area to spawn particles in. + * @param offsetZ + * Z size of the area to spawn particles in. + * @param speed + * Speed of the Particle + * @param count + * Number of spawned particles */ - private ParticleEffect(String name) { - this(name, false); + public void sendToPlayers(Player[] players, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { + for (Player p : players) + sendToPlayer(p, location, offsetX, offsetY, offsetZ, speed, count); } - /** - * Returns the name of this particle effect - * - * @return The name - */ - public String getName() { - return name; - } - - /** - * Determine if water is required for this particle effect to display properly - * - * @return Whether water is required or not - */ - public boolean getRequiresWater() { - return requiresWater; - } - - /** - * Returns the particle effect with the given name - * - * @param name Name of the particle effect - * @return The particle effect - */ - public static ParticleEffect fromName(String name) { - for (Entry entry : NAME_MAP.entrySet()) { - if (!entry.getKey().equalsIgnoreCase(name)) { - continue; + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static Enum getEnum(String enumFullName) { + String[] x = enumFullName.split("\\.(?=[^\\.]+$)"); + if (x.length == 2) { + String enumClassName = x[0]; + String enumName = x[1]; + try { + Class cl = (Class) Class.forName(enumClassName); + return Enum.valueOf(cl, enumName); + } catch (ClassNotFoundException e) { + e.printStackTrace(); } - return entry.getValue(); } return null; } - /** - * Determine if water is at a certain location - * - * @param location Location to check - * @return Whether water is at this location or not - */ - private static boolean isWater(Location location) { - Material material = location.getBlock().getType(); - return material == Material.WATER || material == Material.STATIONARY_WATER; + private static boolean isPlayerInRange(Player p, Location center) { + double distance = 0; + if ((distance = center.distance(p.getLocation())) > Double.MAX_VALUE) return false; + return distance < particleRange; } - /** - * Determine if an id is a block id - * - * @param id Id to check - * @return Whether id is a block or not - */ - @SuppressWarnings("deprecation") - private static boolean isBlock(int id) { - Material material = Material.getMaterial(id); - return material != null && material.isBlock(); - } - - /** - * Displays a particle effect which is only visible for all players within a certain range in the world of @param center - * - * @param offsetX Maximum distance particles can fly away from the center on the x-axis - * @param offsetY Maximum distance particles can fly away from the center on the y-axis - * @param offsetZ Maximum distance particles can fly away from the center on the z-axis - * @param speed Display speed of the particles - * @param amount Amount of particles - * @param center Center location of the effect - * @param range Range of the visibility (Maximum range for particles is usually 16, but it can differ for some types) - * @throws IllegalArgumentException If the particle effect requires water and none is at the center location - * @see ParticleEffectPacket - * @see ParticleEffectPacket#sendTo(Location, double) - */ - public void display(float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, double range) throws IllegalArgumentException { - if (requiresWater && !isWater(center)) { - throw new IllegalArgumentException("There is no water at the center location"); - } - new ParticleEffectPacket(name, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, range); - } - - /** - * Displays a particle effect which is only visible for the specified players - * - * @param offsetX Maximum distance particles can fly away from the center on the x-axis - * @param offsetY Maximum distance particles can fly away from the center on the y-axis - * @param offsetZ Maximum distance particles can fly away from the center on the z-axis - * @param speed Display speed of the particles - * @param amount Amount of particles - * @param center Center location of the effect - * @param players Receivers of the effect - * @throws IllegalArgumentException If the particle effect requires water and none is at the center location - * @see ParticleEffectPacket - * @see ParticleEffectPacket#sendTo(Location, List) - */ - public void display(float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, List players) throws IllegalArgumentException { - if (requiresWater && !isWater(center)) { - throw new IllegalArgumentException("There is no water at the center location"); - } - new ParticleEffectPacket(name, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, players); - } - - /** - * Displays an icon crack (item break) particle effect which is only visible for all players within a certain range in the world of @param center - * - * @param id Id of the icon - * @param data Data value - * @param offsetX Maximum distance particles can fly away from the center on the x-axis - * @param offsetY Maximum distance particles can fly away from the center on the y-axis - * @param offsetZ Maximum distance particles can fly away from the center on the z-axis - * @param speed Display speed of the particles - * @param amount Amount of particles - * @param center Center location of the effect - * @param range Range of the visibility (Maximum range for particles is usually 16, but it can differ for some types) - * @see ParticleEffectPacket - * @see ParticleEffectPacket#sendTo(Location, double) - */ - public static void displayIconCrack(int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, double range) { - new ParticleEffectPacket("iconcrack_" + id + "_" + data, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, range); - } - - /** - * Displays an icon crack (item break) particle effect which is only visible for the specified players - * - * @param id Id of the icon - * @param data Data value - * @param offsetX Maximum distance particles can fly away from the center on the x-axis - * @param offsetY Maximum distance particles can fly away from the center on the y-axis - * @param offsetZ Maximum distance particles can fly away from the center on the z-axis - * @param speed Display speed of the particles - * @param amount Amount of particles - * @param center Center location of the effect - * @param players Receivers of the effect - * @see ParticleEffectPacket - * @see ParticleEffectPacket#sendTo(Location, List) - */ - public static void displayIconCrack(int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, List players) { - new ParticleEffectPacket("iconcrack_" + id + "_" + data, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, players); - } - - /** - * Displays a block crack (block break) particle effect which is only visible for all players within a certain range in the world of @param center - * - * @param id Id of the block - * @param data Data value - * @param offsetX Maximum distance particles can fly away from the center on the x-axis - * @param offsetY Maximum distance particles can fly away from the center on the y-axis - * @param offsetZ Maximum distance particles can fly away from the center on the z-axis - * @param amount Amount of particles - * @param center Center location of the effect - * @param range Range of the visibility (Maximum range for particles is usually 16, but it can differ for some types) - * @throws IllegalArgumentException If the specified id is not a block id - * @see ParticleEffectPacket - * @see ParticleEffectPacket#sendTo(Location, double) - */ - public static void displayBlockCrack(int id, byte data, float offsetX, float offsetY, float offsetZ, int amount, Location center, double range) throws IllegalArgumentException { - if (!isBlock(id)) { - throw new IllegalArgumentException("Invalid block id"); - } - new ParticleEffectPacket("blockcrack_" + id + "_" + data, offsetX, offsetY, offsetZ, 0, amount).sendTo(center, range); - } - - /** - * Displays a block crack (block break) particle effect which is only visible for the specified players - * - * @param id Id of the block - * @param data Data value - * @param offsetX Maximum distance particles can fly away from the center on the x-axis - * @param offsetY Maximum distance particles can fly away from the center on the y-axis - * @param offsetZ Maximum distance particles can fly away from the center on the z-axis - * @param amount Amount of particles - * @param center Center location of the effect - * @param players Receivers of the effect - * @throws IllegalArgumentException If the specified id is not a block id - * @see ParticleEffectPacket - * @see ParticleEffectPacket#sendTo(Location, List) - */ - public static void displayBlockCrack(int id, byte data, float offsetX, float offsetY, float offsetZ, int amount, Location center, List players) throws IllegalArgumentException { - if (!isBlock(id)) { - throw new IllegalArgumentException("Invalid block id"); - } - new ParticleEffectPacket("blockcrack_" + id + "_" + data, offsetX, offsetY, offsetZ, 0, amount).sendTo(center, players); - } - - /** - * Displays a block dust particle effect which is only visible for all players within a certain range in the world of @param center - * - * @param id Id of the block - * @param data Data value - * @param offsetX Maximum distance particles can fly away from the center on the x-axis - * @param offsetY Maximum distance particles can fly away from the center on the y-axis - * @param offsetZ Maximum distance particles can fly away from the center on the z-axis - * @param speed Display speed of the particles - * @param amount Amount of particles - * @param center Center location of the effect - * @param range Range of the visibility (Maximum range for particles is usually 16, but it can differ for some types) - * @throws IllegalArgumentException If the specified id is not a block id - * @see ParticleEffectPacket - * @see ParticleEffectPacket#sendTo(Location, double) - */ - public static void displayBlockDust(int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, double range) throws IllegalArgumentException { - if (!isBlock(id)) { - throw new IllegalArgumentException("Invalid block id"); - } - new ParticleEffectPacket("blockdust_" + id + "_" + data, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, range); - } - - /** - * Displays a block dust particle effect which is only visible for the specified players - * - * @param id Id of the block - * @param data Data value - * @param offsetX Maximum distance particles can fly away from the center on the x-axis - * @param offsetY Maximum distance particles can fly away from the center on the y-axis - * @param offsetZ Maximum distance particles can fly away from the center on the z-axis - * @param speed Display speed of the particles - * @param amount Amount of particles - * @param center Center location of the effect - * @param players Receivers of the effect - * @throws IllegalArgumentException If the specified id is not a block id - * @see ParticleEffectPacket - * @see ParticleEffectPacket#sendTo(Location, List) - */ - public static void displayBlockDust(int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount, Location center, List players) throws IllegalArgumentException { - if (!isBlock(id)) { - throw new IllegalArgumentException("Invalid block id"); - } - new ParticleEffectPacket("blockdust_" + id + "_" + data, offsetX, offsetY, offsetZ, speed, amount).sendTo(center, players); - } - - /** - * Represents a particle effect packet with all attributes which is used for sending packets to the players - *

- * This class is part of the ParticleEffect Library and follows the same usage conditions - * - * @author DarkBlade12 - * @since 1.5 - */ - public static final class ParticleEffectPacket { - private static Constructor packetConstructor; - private static Method getHandle; - private static Field playerConnection; - private static Method sendPacket; - private static boolean initialized; - private final String name; - private final float offsetX; - private final float offsetY; - private final float offsetZ; - private final float speed; - private final int amount; - private Object packet; + public static class ReflectionUtilities { /** - * Construct a new particle effect packet + * sets a value of an {@link Object} via reflection * - * @param name Name of the effect - * @param offsetX Maximum distance particles can fly away from the center on the x-axis - * @param offsetY Maximum distance particles can fly away from the center on the y-axis - * @param offsetZ Maximum distance particles can fly away from the center on the z-axis - * @param speed Display speed of the particles - * @param amount Amount of particles - * @throws IllegalArgumentException If the speed is lower than 0 or the amount is lower than 1 - * @see #initialize() + * @param instance + * instance the class to use + * @param fieldName + * the name of the {@link Field} to modify + * @param value + * the value to set + * @throws Exception */ - public ParticleEffectPacket(String name, float offsetX, float offsetY, float offsetZ, float speed, int amount) throws IllegalArgumentException { - initialize(); - if (speed < 0) { - throw new IllegalArgumentException("The speed is lower than 0"); - } - if (amount < 1) { - throw new IllegalArgumentException("The amount is lower than 1"); - } - this.name = name; - this.offsetX = offsetX; - this.offsetY = offsetY; - this.offsetZ = offsetZ; - this.speed = speed; - this.amount = amount; + public static void setValue(Object instance, String fieldName, Object value) throws Exception { + Field field = instance.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(instance, value); } /** - * Initializes {@link #packetConstructor}, {@link #getHandle}, {@link #playerConnection} and {@link #sendPacket} and sets {@link #initialized} to true if it succeeds - *

- * Note: These fields only have to be initialized once, so it will return if {@link #initialized} is already set to true + * get a value of an {@link Object}'s {@link Field} * - * @throws VersionIncompatibleException if accessed packets, fields or methods differ in your bukkit version + * @param instance + * the target {@link Object} + * @param fieldName + * name of the {@link Field} + * @return the value of {@link Object} instance's {@link Field} with the name of fieldName + * @throws Exception */ - public static void initialize() throws VersionIncompatibleException { - if (initialized) { - return; - } + public static Object getValue(Object instance, String fieldName) throws Exception { + Field field = instance.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(instance); + } + + public static String getVersion() { + String name = Bukkit.getServer().getClass().getPackage().getName(); + String version = name.substring(name.lastIndexOf('.') + 1) + "."; + return version; + } + + public static Class getNMSClass(String className) { + String fullName = "net.minecraft.server." + getVersion() + className; + Class clazz = null; try { - int version = Integer.parseInt(Character.toString(PackageType.getServerVersion().charAt(3))); - Class packetClass = PackageType.MINECRAFT_SERVER.getClass(version < 7 ? "Packet63WorldParticles" : PacketType.PLAY_OUT_WORLD_PARTICLES.getName()); - packetConstructor = ReflectionUtils.getConstructor(packetClass); - getHandle = ReflectionUtils.getMethod("CraftPlayer", PackageType.CRAFTBUKKIT_ENTITY, "getHandle"); - playerConnection = ReflectionUtils.getField("EntityPlayer", PackageType.MINECRAFT_SERVER, false, "playerConnection"); - sendPacket = ReflectionUtils.getMethod(playerConnection.getType(), "sendPacket", PackageType.MINECRAFT_SERVER.getClass("Packet")); - } catch (Exception exception) { - throw new VersionIncompatibleException("Your current bukkit version seems to be incompatible with this library", exception); + clazz = Class.forName(fullName); + } catch (Exception e) { + e.printStackTrace(); } - initialized = true; + return clazz; } - /** - * Determine if {@link #packetConstructor}, {@link #getHandle}, {@link #playerConnection} and {@link #sendPacket} are initialized - * - * @return Whether these fields are initialized or not - * @see #initialize() - */ - public static boolean isInitialized() { - return initialized; + public static Class getOBCClass(String className) { + String fullName = "org.bukkit.craftbukkit." + getVersion() + className; + Class clazz = null; + try { + clazz = Class.forName(fullName); + } catch (Exception e) { + e.printStackTrace(); + } + return clazz; } - /** - * Sends the packet to a single player and caches it - * - * @param center Center location of the effect - * @param player Receiver of the packet - * @throws PacketInstantiationException if instantion fails due to an unknown error - * @throws PacketSendingException if sending fails due to an unknown error - */ - public void sendTo(Location center, Player player) throws PacketInstantiationException, PacketSendingException { - if (packet == null) { - try { - packet = packetConstructor.newInstance(); - ReflectionUtils.setValue(packet, true, "a", name); - ReflectionUtils.setValue(packet, true, "b", (float) center.getX()); - ReflectionUtils.setValue(packet, true, "c", (float) center.getY()); - ReflectionUtils.setValue(packet, true, "d", (float) center.getZ()); - ReflectionUtils.setValue(packet, true, "e", offsetX); - ReflectionUtils.setValue(packet, true, "f", offsetY); - ReflectionUtils.setValue(packet, true, "g", offsetZ); - ReflectionUtils.setValue(packet, true, "h", speed); - ReflectionUtils.setValue(packet, true, "i", amount); - } catch (Exception exception) { - throw new PacketInstantiationException("Packet instantiation failed", exception); + public static Object getHandle(Object obj) { + try { + return getMethod(obj.getClass(), "getHandle", new Class[0]).invoke(obj, new Object[0]); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static Field getField(Class clazz, String name) { + try { + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + return field; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static Method getMethod(Class clazz, String name, Class... args) { + for (Method m : clazz.getMethods()) { + if ((m.getName().equals(name)) && ((args.length == 0) || (ClassListEqual(args, m.getParameterTypes())))) { + m.setAccessible(true); + return m; } } - try { - sendPacket.invoke(playerConnection.get(getHandle.invoke(player)), packet); - } catch (Exception exception) { - throw new PacketSendingException("Failed to send the packet to player '" + player.getName() + "'", exception); - } + return null; } - /** - * Sends the packet to all players in the list - * - * @param center Center location of the effect - * @param players Receivers of the packet - * @throws IllegalArgumentException If the player list is empty - * @see #sendTo(Location center, Player player) - */ - public void sendTo(Location center, List players) throws IllegalArgumentException { - if (players.isEmpty()) { - throw new IllegalArgumentException("The player list is empty"); + public static boolean ClassListEqual(Class[] l1, Class[] l2) { + boolean equal = true; + if (l1.length != l2.length) { + return false; } - for (Player player : players) { - sendTo(center, player); - } - } - - /** - * Sends the packet to all players in a certain range - * - * @param center Center location of the effect - * @param range Range in which players will receive the packet (Maximum range for particles is usually 16, but it can differ for some types) - * @throws IllegalArgumentException If the range is lower than 1 - * @see #sendTo(Location center, Player player) - */ - @SuppressWarnings("deprecation") - public void sendTo(Location center, double range) throws IllegalArgumentException { - if (range < 1) { - throw new IllegalArgumentException("The range is lower than 1"); - } - String worldName = center.getWorld().getName(); - double squared = range * range; - for (Player player : Bukkit.getOnlinePlayers()) { - if (!player.getWorld().getName().equals(worldName) || player.getLocation().distanceSquared(center) > squared) { - continue; + for (int i = 0; i < l1.length; i++) { + if (l1[i] != l2[i]) { + equal = false; + break; } - sendTo(center, player); - } - } - - /** - * Represents a runtime exception that is thrown if a bukkit version is not compatible with this library - *

- * This class is part of the ParticleEffect Library and follows the same usage conditions - * - * @author DarkBlade12 - * @since 1.5 - */ - private static final class VersionIncompatibleException extends RuntimeException { - private static final long serialVersionUID = 3203085387160737484L; - - /** - * Construct a new version incompatible exception - * - * @param message Message that will be logged - * @param cause Cause of the exception - */ - public VersionIncompatibleException(String message, Throwable cause) { - super(message, cause); - } - } - - /** - * Represents a runtime exception that is thrown if packet instantiation fails - *

- * This class is part of the ParticleEffect Library and follows the same usage conditions - * - * @author DarkBlade12 - * @since 1.4 - */ - private static final class PacketInstantiationException extends RuntimeException { - private static final long serialVersionUID = 3203085387160737484L; - - /** - * Construct a new packet instantiation exception - * - * @param message Message that will be logged - * @param cause Cause of the exception - */ - public PacketInstantiationException(String message, Throwable cause) { - super(message, cause); - } - } - - /** - * Represents a runtime exception that is thrown if packet sending fails - *

- * This class is part of the ParticleEffect Library and follows the same usage conditions - * - * @author DarkBlade12 - * @since 1.4 - */ - private static final class PacketSendingException extends RuntimeException { - private static final long serialVersionUID = 3203085387160737484L; - - /** - * Construct a new packet sending exception - * - * @param message Message that will be logged - * @param cause Cause of the exception - */ - public PacketSendingException(String message, Throwable cause) { - super(message, cause); } + return equal; } } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java b/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java new file mode 100644 index 00000000..16b71f3e --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java @@ -0,0 +1,548 @@ +package com.projectkorra.ProjectKorra.Utilities; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Bukkit; + +/** + * ReflectionHandler v1.0 + * + * This class makes dealing with reflection much easier, especially when working with Bukkit + * + * You are welcome to use it, modify it and redistribute it under the following conditions: + * 1. Don't claim this class as your own + * 2. Don't remove this text + * + * (Would be nice if you provide credit to me) + * + * @author DarkBlade12 + */ +public final class ReflectionHandler { + private ReflectionHandler() {} + + public static Class getClass(String name, PackageType type) throws Exception { + return Class.forName(type + "." + name); + } + + public static Class getClass(String name, SubPackageType type) throws Exception { + return Class.forName(type + "." + name); + } + + public static Constructor getConstructor(Class clazz, Class... parameterTypes) { + Class[] p = DataType.convertToPrimitive(parameterTypes); + for (Constructor c : clazz.getConstructors()) + if (DataType.equalsArray(DataType.convertToPrimitive(c.getParameterTypes()), p)) + return c; + return null; + } + + public static Constructor getConstructor(String className, PackageType type, Class... parameterTypes) throws Exception { + return getConstructor(getClass(className, type), parameterTypes); + } + + public static Constructor getConstructor(String className, SubPackageType type, Class... parameterTypes) throws Exception { + return getConstructor(getClass(className, type), parameterTypes); + } + + public static Object newInstance(Class clazz, Object... args) throws Exception { + return getConstructor(clazz, DataType.convertToPrimitive(args)).newInstance(args); + } + + public static Object newInstance(String className, PackageType type, Object... args) throws Exception { + return newInstance(getClass(className, type), args); + } + + public static Object newInstance(String className, SubPackageType type, Object... args) throws Exception { + return newInstance(getClass(className, type), args); + } + + public static Method getMethod(Class clazz, String name, Class... parameterTypes) { + Class[] p = DataType.convertToPrimitive(parameterTypes); + for (Method m : clazz.getMethods()) + if (m.getName().equals(name) && DataType.equalsArray(DataType.convertToPrimitive(m.getParameterTypes()), p)) + return m; + return null; + } + + public static Method getMethod(String className, PackageType type, String name, Class... parameterTypes) throws Exception { + return getMethod(getClass(className, type), name, parameterTypes); + } + + public static Method getMethod(String className, SubPackageType type, String name, Class... parameterTypes) throws Exception { + return getMethod(getClass(className, type), name, parameterTypes); + } + + public static Object invokeMethod(String name, Object instance, Object... args) throws Exception { + return getMethod(instance.getClass(), name, DataType.convertToPrimitive(args)).invoke(instance, args); + } + + public static Object invokeMethod(Class clazz, String name, Object instance, Object... args) throws Exception { + return getMethod(clazz, name, DataType.convertToPrimitive(args)).invoke(instance, args); + } + + public static Object invokeMethod(String className, PackageType type, String name, Object instance, Object... args) throws Exception { + return invokeMethod(getClass(className, type), name, instance, args); + } + + public static Object invokeMethod(String className, SubPackageType type, String name, Object instance, Object... args) throws Exception { + return invokeMethod(getClass(className, type), name, instance, args); + } + + public static Field getField(Class clazz, String name) throws Exception { + Field f = clazz.getField(name); + f.setAccessible(true); + return f; + } + + public static Field getField(String className, PackageType type, String name) throws Exception { + return getField(getClass(className, type), name); + } + + public static Field getField(String className, SubPackageType type, String name) throws Exception { + return getField(getClass(className, type), name); + } + + public static Field getDeclaredField(Class clazz, String name) throws Exception { + Field f = clazz.getDeclaredField(name); + f.setAccessible(true); + return f; + } + + public static Field getDeclaredField(String className, PackageType type, String name) throws Exception { + return getDeclaredField(getClass(className, type), name); + } + + public static Field getDeclaredField(String className, SubPackageType type, String name) throws Exception { + return getDeclaredField(getClass(className, type), name); + } + + public static Object getValue(Object instance, String fieldName) throws Exception { + return getField(instance.getClass(), fieldName).get(instance); + } + + public static Object getValue(Class clazz, Object instance, String fieldName) throws Exception { + return getField(clazz, fieldName).get(instance); + } + + public static Object getValue(String className, PackageType type, Object instance, String fieldName) throws Exception { + return getValue(getClass(className, type), instance, fieldName); + } + + public static Object getValue(String className, SubPackageType type, Object instance, String fieldName) throws Exception { + return getValue(getClass(className, type), instance, fieldName); + } + + public static Object getDeclaredValue(Object instance, String fieldName) throws Exception { + return getDeclaredField(instance.getClass(), fieldName).get(instance); + } + + public static Object getDeclaredValue(Class clazz, Object instance, String fieldName) throws Exception { + return getDeclaredField(clazz, fieldName).get(instance); + } + + public static Object getDeclaredValue(String className, PackageType type, Object instance, String fieldName) throws Exception { + return getDeclaredValue(getClass(className, type), instance, fieldName); + } + + public static Object getDeclaredValue(String className, SubPackageType type, Object instance, String fieldName) throws Exception { + return getDeclaredValue(getClass(className, type), instance, fieldName); + } + + public static void setValue(Object instance, String fieldName, Object fieldValue) throws Exception { + Field f = getField(instance.getClass(), fieldName); + f.set(instance, fieldValue); + } + + public static void setValue(Object instance, FieldPair pair) throws Exception { + setValue(instance, pair.getName(), pair.getValue()); + } + + public static void setValue(Class clazz, Object instance, String fieldName, Object fieldValue) throws Exception { + Field f = getField(clazz, fieldName); + f.set(instance, fieldValue); + } + + public static void setValue(Class clazz, Object instance, FieldPair pair) throws Exception { + setValue(clazz, instance, pair.getName(), pair.getValue()); + } + + public static void setValue(String className, PackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { + setValue(getClass(className, type), instance, fieldName, fieldValue); + } + + public static void setValue(String className, PackageType type, Object instance, FieldPair pair) throws Exception { + setValue(className, type, instance, pair.getName(), pair.getValue()); + } + + public static void setValue(String className, SubPackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { + setValue(getClass(className, type), instance, fieldName, fieldValue); + } + + public static void setValue(String className, SubPackageType type, Object instance, FieldPair pair) throws Exception { + setValue(className, type, instance, pair.getName(), pair.getValue()); + } + + public static void setValues(Object instance, FieldPair... pairs) throws Exception { + for (FieldPair pair : pairs) + setValue(instance, pair); + } + + public static void setValues(Class clazz, Object instance, FieldPair... pairs) throws Exception { + for (FieldPair pair : pairs) + setValue(clazz, instance, pair); + } + + public static void setValues(String className, PackageType type, Object instance, FieldPair... pairs) throws Exception { + setValues(getClass(className, type), instance, pairs); + } + + public static void setValues(String className, SubPackageType type, Object instance, FieldPair... pairs) throws Exception { + setValues(getClass(className, type), instance, pairs); + } + + public static void setDeclaredValue(Object instance, String fieldName, Object fieldValue) throws Exception { + Field f = getDeclaredField(instance.getClass(), fieldName); + f.set(instance, fieldValue); + } + + public static void setDeclaredValue(Object instance, FieldPair pair) throws Exception { + setDeclaredValue(instance, pair.getName(), pair.getValue()); + } + + public static void setDeclaredValue(Class clazz, Object instance, String fieldName, Object fieldValue) throws Exception { + Field f = getDeclaredField(clazz, fieldName); + f.set(instance, fieldValue); + } + + public static void setDeclaredValue(Class clazz, Object instance, FieldPair pair) throws Exception { + setDeclaredValue(clazz, instance, pair.getName(), pair.getValue()); + } + + public static void setDeclaredValue(String className, PackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { + setDeclaredValue(getClass(className, type), instance, fieldName, fieldValue); + } + + public static void setDeclaredValue(String className, PackageType type, Object instance, FieldPair pair) throws Exception { + setDeclaredValue(className, type, instance, pair.getName(), pair.getValue()); + } + + public static void setDeclaredValue(String className, SubPackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { + setDeclaredValue(getClass(className, type), instance, fieldName, fieldValue); + } + + public static void setDeclaredValue(String className, SubPackageType type, Object instance, FieldPair pair) throws Exception { + setDeclaredValue(className, type, instance, pair.getName(), pair.getValue()); + } + + public static void setDeclaredValues(Object instance, FieldPair... pairs) throws Exception { + for (FieldPair pair : pairs) + setDeclaredValue(instance, pair); + } + + public static void setDeclaredValues(Class clazz, Object instance, FieldPair... pairs) throws Exception { + for (FieldPair pair : pairs) + setDeclaredValue(clazz, instance, pair); + } + + public static void setDeclaredValues(String className, PackageType type, Object instance, FieldPair... pairs) throws Exception { + setDeclaredValues(getClass(className, type), instance, pairs); + } + + public static void setDeclaredValues(String className, SubPackageType type, Object instance, FieldPair... pairs) throws Exception { + setDeclaredValues(getClass(className, type), instance, pairs); + } + + /** + * This class is part of the ReflectionHandler and follows the same usage conditions + * + * @author DarkBlade12 + */ + public enum DataType { + BYTE(byte.class, Byte.class), + SHORT(short.class, Short.class), + INTEGER(int.class, Integer.class), + LONG(long.class, Long.class), + CHARACTER(char.class, Character.class), + FLOAT(float.class, Float.class), + DOUBLE(double.class, Double.class), + BOOLEAN(boolean.class, Boolean.class); + + private static final Map, DataType> CLASS_MAP = new HashMap, DataType>(); + private final Class primitive; + private final Class reference; + + static { + for (DataType t : values()) { + CLASS_MAP.put(t.primitive, t); + CLASS_MAP.put(t.reference, t); + } + } + + private DataType(Class primitive, Class reference) { + this.primitive = primitive; + this.reference = reference; + } + + public Class getPrimitive() { + return this.primitive; + } + + public Class getReference() { + return this.reference; + } + + public static DataType fromClass(Class c) { + return CLASS_MAP.get(c); + } + + public static Class getPrimitive(Class c) { + DataType t = fromClass(c); + return t == null ? c : t.getPrimitive(); + } + + public static Class getReference(Class c) { + DataType t = fromClass(c); + return t == null ? c : t.getReference(); + } + + public static Class[] convertToPrimitive(Class[] classes) { + int length = classes == null ? 0 : classes.length; + Class[] types = new Class[length]; + for (int i = 0; i < length; i++) + types[i] = getPrimitive(classes[i]); + return types; + } + + public static Class[] convertToPrimitive(Object[] objects) { + int length = objects == null ? 0 : objects.length; + Class[] types = new Class[length]; + for (int i = 0; i < length; i++) + types[i] = getPrimitive(objects[i].getClass()); + return types; + } + + public static boolean equalsArray(Class[] a1, Class[] a2) { + if (a1 == null || a2 == null || a1.length != a2.length) + return false; + for (int i = 0; i < a1.length; i++) + if (!a1[i].equals(a2[i]) && !a1[i].isAssignableFrom(a2[i])) + return false; + return true; + } + } + + /** + * This class is part of the ReflectionHandler and follows the same usage conditions + * + * @author DarkBlade12 + */ + public final class FieldPair { + private final String name; + private final Object value; + + public FieldPair(String name, Object value) { + this.name = name; + this.value = value; + } + + public String getName() { + return this.name; + } + + public Object getValue() { + return this.value; + } + } + + /** + * This class is part of the ReflectionHandler and follows the same usage conditions + * + * @author DarkBlade12 + */ + public enum PackageType { + MINECRAFT_SERVER("net.minecraft.server." + Bukkit.getServer().getClass().getPackage().getName().substring(23)), + CRAFTBUKKIT(Bukkit.getServer().getClass().getPackage().getName()); + + private final String name; + + private PackageType(String name) { + this.name = name; + } + + public String getName() { + return this.name; + } + + @Override + public String toString() { + return name; + } + } + + /** + * This class is part of the ReflectionHandler and follows the same usage conditions + * + * @author DarkBlade12 + */ + public enum SubPackageType { + BLOCK, + CHUNKIO, + COMMAND, + CONVERSATIONS, + ENCHANTMENS, + ENTITY, + EVENT, + GENERATOR, + HELP, + INVENTORY, + MAP, + METADATA, + POTION, + PROJECTILES, + SCHEDULER, + SCOREBOARD, + UPDATER, + UTIL; + + private final String name; + + private SubPackageType() { + name = PackageType.CRAFTBUKKIT + "." + name().toLowerCase(); + } + + public String getName() { + return this.name; + } + + @Override + public String toString() { + return name; + } + } + + /** + * This class is part of the ReflectionHandler and follows the same usage conditions + * + * @author DarkBlade12 + */ + public enum PacketType { + HANDSHAKING_IN_SET_PROTOCOL("PacketHandshakingInSetProtocol"), + LOGIN_IN_ENCRYPTION_BEGIN("PacketLoginInEncryptionBegin"), + LOGIN_IN_START("PacketLoginInStart"), + LOGIN_OUT_DISCONNECT("PacketLoginOutDisconnect"), + LOGIN_OUT_ENCRYPTION_BEGIN("PacketLoginOutEncryptionBegin"), + LOGIN_OUT_SUCCESS("PacketLoginOutSuccess"), + PLAY_IN_ABILITIES("PacketPlayInAbilities"), + PLAY_IN_ARM_ANIMATION("PacketPlayInArmAnimation"), + PLAY_IN_BLOCK_DIG("PacketPlayInBlockDig"), + PLAY_IN_BLOCK_PLACE("PacketPlayInBlockPlace"), + PLAY_IN_CHAT("PacketPlayInChat"), + PLAY_IN_CLIENT_COMMAND("PacketPlayInClientCommand"), + PLAY_IN_CLOSE_WINDOW("PacketPlayInCloseWindow"), + PLAY_IN_CUSTOM_PAYLOAD("PacketPlayInCustomPayload"), + PLAY_IN_ENCHANT_ITEM("PacketPlayInEnchantItem"), + PLAY_IN_ENTITY_ACTION("PacketPlayInEntityAction"), + PLAY_IN_FLYING("PacketPlayInFlying"), + PLAY_IN_HELD_ITEM_SLOT("PacketPlayInHeldItemSlot"), + PLAY_IN_KEEP_ALIVE("PacketPlayInKeepAlive"), + PLAY_IN_LOOK("PacketPlayInLook"), + PLAY_IN_POSITION("PacketPlayInPosition"), + PLAY_IN_POSITION_LOOK("PacketPlayInPositionLook"), + PLAY_IN_SET_CREATIVE_SLOT("PacketPlayInSetCreativeSlot "), + PLAY_IN_SETTINGS("PacketPlayInSettings"), + PLAY_IN_STEER_VEHICLE("PacketPlayInSteerVehicle"), + PLAY_IN_TAB_COMPLETE("PacketPlayInTabComplete"), + PLAY_IN_TRANSACTION("PacketPlayInTransaction"), + PLAY_IN_UPDATE_SIGN("PacketPlayInUpdateSign"), + PLAY_IN_USE_ENTITY("PacketPlayInUseEntity"), + PLAY_IN_WINDOW_CLICK("PacketPlayInWindowClick"), + PLAY_OUT_ABILITIES("PacketPlayOutAbilities"), + PLAY_OUT_ANIMATION("PacketPlayOutAnimation"), + PLAY_OUT_ATTACH_ENTITY("PacketPlayOutAttachEntity"), + PLAY_OUT_BED("PacketPlayOutBed"), + PLAY_OUT_BLOCK_ACTION("PacketPlayOutBlockAction"), + PLAY_OUT_BLOCK_BREAK_ANIMATION("PacketPlayOutBlockBreakAnimation"), + PLAY_OUT_BLOCK_CHANGE("PacketPlayOutBlockChange"), + PLAY_OUT_CHAT("PacketPlayOutChat"), + PLAY_OUT_CLOSE_WINDOW("PacketPlayOutCloseWindow"), + PLAY_OUT_COLLECT("PacketPlayOutCollect"), + PLAY_OUT_CRAFT_PROGRESS_BAR("PacketPlayOutCraftProgressBar"), + PLAY_OUT_CUSTOM_PAYLOAD("PacketPlayOutCustomPayload"), + PLAY_OUT_ENTITY("PacketPlayOutEntity"), + PLAY_OUT_ENTITY_DESTROY("PacketPlayOutEntityDestroy"), + PLAY_OUT_ENTITY_EFFECT("PacketPlayOutEntityEffect"), + PLAY_OUT_ENTITY_EQUIPMENT("PacketPlayOutEntityEquipment"), + PLAY_OUT_ENTITY_HEAD_ROTATION("PacketPlayOutEntityHeadRotation"), + PLAY_OUT_ENTITY_LOOK("PacketPlayOutEntityLook"), + PLAY_OUT_ENTITY_METADATA("PacketPlayOutEntityMetadata"), + PLAY_OUT_ENTITY_STATUS("PacketPlayOutEntityStatus"), + PLAY_OUT_ENTITY_TELEPORT("PacketPlayOutEntityTeleport"), + PLAY_OUT_ENTITY_VELOCITY("PacketPlayOutEntityVelocity"), + PLAY_OUT_EXPERIENCE("PacketPlayOutExperience"), + PLAY_OUT_EXPLOSION("PacketPlayOutExplosion"), + PLAY_OUT_GAME_STATE_CHANGE("PacketPlayOutGameStateChange"), + PLAY_OUT_HELD_ITEM_SLOT("PacketPlayOutHeldItemSlot"), + PLAY_OUT_KEEP_ALIVE("PacketPlayOutKeepAlive"), + PLAY_OUT_KICK_DISCONNECT("PacketPlayOutKickDisconnect"), + PLAY_OUT_LOGIN("PacketPlayOutLogin"), + PLAY_OUT_MAP("PacketPlayOutMap"), + PLAY_OUT_MAP_CHUNK("PacketPlayOutMapChunk"), + PLAY_OUT_MAP_CHUNK_BULK("PacketPlayOutMapChunkBulk"), + PLAY_OUT_MULTI_BLOCK_CHANGE("PacketPlayOutMultiBlockChange"), + PLAY_OUT_NAMED_ENTITY_SPAWN("PacketPlayOutNamedEntitySpawn"), + PLAY_OUT_NAMED_SOUND_EFFECT("PacketPlayOutNamedSoundEffect"), + PLAY_OUT_OPEN_SIGN_EDITOR("PacketPlayOutOpenSignEditor"), + PLAY_OUT_OPEN_WINDOW("PacketPlayOutOpenWindow"), + PLAY_OUT_PLAYER_INFO("PacketPlayOutPlayerInfo"), + PLAY_OUT_POSITION("PacketPlayOutPosition"), + PLAY_OUT_REL_ENTITY_MOVE("PacketPlayOutRelEntityMove"), + PLAY_OUT_REL_ENTITY_MOVE_LOOK("PacketPlayOutRelEntityMoveLook"), + PLAY_OUT_REMOVE_ENTITY_EFFECT("PacketPlayOutRemoveEntityEffect"), + PLAY_OUT_RESPAWN("PacketPlayOutRespawn"), + PLAY_OUT_SCOREBOARD_DISPLAY_OBJECTIVE("PacketPlayOutScoreboardDisplayObjective"), + PLAY_OUT_SCOREBOARD_OBJECTIVE("PacketPlayOutScoreboardObjective"), + PLAY_OUT_SCOREBOARD_SCORE("PacketPlayOutScoreboardScore"), + PLAY_OUT_SCOREBOARD_TEAM("PacketPlayOutScoreboardTeam"), + PLAY_OUT_SET_SLOT("PacketPlayOutSetSlot"), + PLAY_OUT_SPAWN_ENTITY("PacketPlayOutSpawnEntity"), + PLAY_OUT_SPAWN_ENTITY_EXPERIENCE_ORB("PacketPlayOutSpawnEntityExperienceOrb"), + PLAY_OUT_SPAWN_ENTITY_LIVING("PacketPlayOutSpawnEntityLiving"), + PLAY_OUT_SPAWN_ENTITY_PAINTING("PacketPlayOutSpawnEntityPainting"), + PLAY_OUT_SPAWN_ENTITY_WEATHER("PacketPlayOutSpawnEntityWeather"), + PLAY_OUT_SPAWN_POSITION("PacketPlayOutSpawnPosition"), + PLAY_OUT_STATISTIC("PacketPlayOutStatistic"), + PLAY_OUT_TAB_COMPLETE("PacketPlayOutTabComplete"), + PLAY_OUT_TILE_ENTITY_DATA("PacketPlayOutTileEntityData"), + PLAY_OUT_TRANSACTION("PacketPlayOutTransaction"), + PLAY_OUT_UPDATE_ATTRIBUTES("PacketPlayOutUpdateAttributes"), + PLAY_OUT_UPDATE_HEALTH("PacketPlayOutUpdateHealth"), + PLAY_OUT_UPDATE_SIGN("PacketPlayOutUpdateSign"), + PLAY_OUT_UPDATE_TIME("PacketPlayOutUpdateTime"), + PLAY_OUT_WINDOW_ITEMS("PacketPlayOutWindowItems"), + PLAY_OUT_WORLD_EVENT("PacketPlayOutWorldEvent"), + PLAY_OUT_WORLD_PARTICLES("PacketPlayOutWorldParticles"), + STATUS_IN_PING("PacketStatusInPing"), + STATUS_IN_START("PacketStatusInStart"), + STATUS_OUT_PONG("PacketStatusOutPong"), + STATUS_OUT_SERVER_INFO("PacketStatusOutServerInfo"); + + private final String name; + private Class packet; + + private PacketType(String name) { + this.name = name; + } + + public String getName() { + return this.getName(); + } + + public Class getPacket() throws Exception { + return packet == null ? packet = ReflectionHandler.getClass(name, PackageType.MINECRAFT_SERVER) : packet; + } + } +} \ No newline at end of file diff --git a/src/com/projectkorra/ProjectKorra/Utilities/ReflectionUtils.java b/src/com/projectkorra/ProjectKorra/Utilities/ReflectionUtils.java deleted file mode 100644 index 791360ff..00000000 --- a/src/com/projectkorra/ProjectKorra/Utilities/ReflectionUtils.java +++ /dev/null @@ -1,758 +0,0 @@ -package com.projectkorra.ProjectKorra.Utilities; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - -import org.bukkit.Bukkit; - -/** - * ReflectionUtils - *

- * This class provides useful methods which makes dealing with reflection much easier, especially when working with Bukkit - *

- * You are welcome to use it, modify it and redistribute it under the following conditions: - *

    - *
  • Don't claim this class as your own - *
  • Don't remove this disclaimer - *
- *

- * It would be nice if you provide credit to me if you use this class in a published project - * - * @author DarkBlade12 - * @version 1.1 - */ -public final class ReflectionUtils { - // Prevent accidential construction - private ReflectionUtils() {} - - /** - * Returns the constructor of a given class with the given parameter types - * - * @param clazz Target class - * @param parameterTypes Parameter types of the desired constructor - * @return The constructor of the target class with the specified parameter types - * @throws NoSuchMethodException If the desired constructor with the specified parameter types cannot be found - * @see DataType - * @see DataType#getPrimitive(Class[]) - * @see DataType#compare(Class[], Class[]) - */ - public static Constructor getConstructor(Class clazz, Class... parameterTypes) throws NoSuchMethodException { - Class[] primitiveTypes = DataType.getPrimitive(parameterTypes); - for (Constructor constructor : clazz.getConstructors()) { - if (!DataType.compare(DataType.getPrimitive(constructor.getParameterTypes()), primitiveTypes)) { - continue; - } - return constructor; - } - throw new NoSuchMethodException("There is no such constructor in this class with the specified parameter types"); - } - - /** - * Returns the constructor of a desired class with the given parameter types - * - * @param className Name of the desired target class - * @param packageType Package where the desired target class is located - * @param parameterTypes Parameter types of the desired constructor - * @return The constructor of the desired target class with the specified parameter types - * @throws NoSuchMethodException If the desired constructor with the specified parameter types cannot be found - * @throws ClassNotFoundException ClassNotFoundException If the desired target class with the specified name and package cannot be found - * @see #getClass(String, PackageType) - * @see #getConstructor(Class, Class...) - */ - public static Constructor getConstructor(String className, PackageType packageType, Class... parameterTypes) throws NoSuchMethodException, ClassNotFoundException { - return getConstructor(packageType.getClass(className), parameterTypes); - } - - /** - * Returns an instance of a class with the given arguments - * - * @param clazz Target class - * @param arguments Arguments which are used to construct an object of the target class - * @return The instance of the target class with the specified arguments - * @throws InstantiationException If you cannot create an instance of the target class due to certain circumstances - * @throws IllegalAccessException If the desired constructor cannot be accessed due to certain circumstances - * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the constructor (this should not occur since it searches for a constructor with the types of the arguments) - * @throws InvocationTargetException If the desired constructor cannot be invoked - * @throws NoSuchMethodException If the desired constructor with the specified arguments cannot be found - */ - public static Object instantiateObject(Class clazz, Object... arguments) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException { - return getConstructor(clazz, DataType.getPrimitive(arguments)).newInstance(arguments); - } - - /** - * Returns an instance of a desired class with the given arguments - * - * @param className Name of the desired target class - * @param packageType Package where the desired target class is located - * @param arguments Arguments which are used to construct an object of the desired target class - * @return The instance of the desired target class with the specified arguments - * @throws InstantiationException If you cannot create an instance of the desired target class due to certain circumstances - * @throws IllegalAccessException If the desired constructor cannot be accessed due to certain circumstances - * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the constructor (this should not occur since it searches for a constructor with the types of the arguments) - * @throws InvocationTargetException If the desired constructor cannot be invoked - * @throws NoSuchMethodException If the desired constructor with the specified arguments cannot be found - * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found - * @see #getClass(String, PackageType) - * @see #instantiateObject(Class, Object...) - */ - public static Object instantiateObject(String className, PackageType packageType, Object... arguments) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException { - return instantiateObject(packageType.getClass(className), arguments); - } - - /** - * Returns a method of a class with the given parameter types - * - * @param clazz Target class - * @param methodName Name of the desired method - * @param parameterTypes Parameter types of the desired method - * @return The method of the target class with the specified name and parameter types - * @throws NoSuchMethodException If the desired method of the target class with the specified name and parameter types cannot be found - * @see DataType#getPrimitive(Class[]) - * @see DataType#compare(Class[], Class[]) - */ - public static Method getMethod(Class clazz, String methodName, Class... parameterTypes) throws NoSuchMethodException { - Class[] primitiveTypes = DataType.getPrimitive(parameterTypes); - for (Method method : clazz.getMethods()) { - if (!method.getName().equals(methodName) || !DataType.compare(DataType.getPrimitive(method.getParameterTypes()), primitiveTypes)) { - continue; - } - return method; - } - throw new NoSuchMethodException("There is no such method in this class with the specified name and parameter types"); - } - - /** - * Returns a method of a desired class with the given parameter types - * - * @param className Name of the desired target class - * @param packageType Package where the desired target class is located - * @param methodName Name of the desired method - * @param parameterTypes Parameter types of the desired method - * @return The method of the desired target class with the specified name and parameter types - * @throws NoSuchMethodException If the desired method of the desired target class with the specified name and parameter types cannot be found - * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found - * @see #getClass(String, PackageType) - * @see #getMethod(Class, String, Class...) - */ - public static Method getMethod(String className, PackageType packageType, String methodName, Class... parameterTypes) throws NoSuchMethodException, ClassNotFoundException { - return getMethod(packageType.getClass(className), methodName, parameterTypes); - } - - /** - * Invokes a method on an object with the given arguments - * - * @param instance Target object - * @param methodName Name of the desired method - * @param arguments Arguments which are used to invoke the desired method - * @return The result of invoking the desired method on the target object - * @throws IllegalAccessException If the desired method cannot be accessed due to certain circumstances - * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the method (this should not occur since it searches for a method with the types of the arguments) - * @throws InvocationTargetException If the desired method cannot be invoked on the target object - * @throws NoSuchMethodException If the desired method of the class of the target object with the specified name and arguments cannot be found - * @see #getMethod(Class, String, Class...) - * @see DataType#getPrimitive(Object[]) - */ - public static Object invokeMethod(Object instance, String methodName, Object... arguments) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException { - return getMethod(instance.getClass(), methodName, DataType.getPrimitive(arguments)).invoke(instance, arguments); - } - - /** - * Invokes a method of the target class on an object with the given arguments - * - * @param instance Target object - * @param clazz Target class - * @param methodName Name of the desired method - * @param arguments Arguments which are used to invoke the desired method - * @return The result of invoking the desired method on the target object - * @throws IllegalAccessException If the desired method cannot be accessed due to certain circumstances - * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the method (this should not occur since it searches for a method with the types of the arguments) - * @throws InvocationTargetException If the desired method cannot be invoked on the target object - * @throws NoSuchMethodException If the desired method of the target class with the specified name and arguments cannot be found - * @see #getMethod(Class, String, Class...) - * @see DataType#getPrimitive(Object[]) - */ - public static Object invokeMethod(Object instance, Class clazz, String methodName, Object... arguments) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException { - return getMethod(clazz, methodName, DataType.getPrimitive(arguments)).invoke(instance, arguments); - } - - /** - * Invokes a method of a desired class on an object with the given arguments - * - * @param instance Target object - * @param className Name of the desired target class - * @param packageType Package where the desired target class is located - * @param methodName Name of the desired method - * @param arguments Arguments which are used to invoke the desired method - * @return The result of invoking the desired method on the target object - * @throws IllegalAccessException If the desired method cannot be accessed due to certain circumstances - * @throws IllegalArgumentException If the types of the arguments do not match the parameter types of the method (this should not occur since it searches for a method with the types of the arguments) - * @throws InvocationTargetException If the desired method cannot be invoked on the target object - * @throws NoSuchMethodException If the desired method of the desired target class with the specified name and arguments cannot be found - * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found - * @see #getClass(String, PackageType) - * @see #invokeMethod(Object, Class, String, Object...) - */ - public static Object invokeMethod(Object instance, String className, PackageType packageType, String methodName, Object... arguments) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException { - return invokeMethod(instance, packageType.getClass(className), methodName, arguments); - } - - /** - * Returns a field of the target class with the given name - * - * @param clazz Target class - * @param declared Whether the desired field is declared or not - * @param fieldName Name of the desired field - * @return The field of the target class with the specified name - * @throws NoSuchFieldException If the desired field of the given class cannot be found - * @throws SecurityException If the desired field cannot be made accessible - */ - public static Field getField(Class clazz, boolean declared, String fieldName) throws NoSuchFieldException, SecurityException { - Field field = declared ? clazz.getDeclaredField(fieldName) : clazz.getField(fieldName); - field.setAccessible(true); - return field; - } - - /** - * Returns a field of a desired class with the given name - * - * @param className Name of the desired target class - * @param packageType Package where the desired target class is located - * @param declared Whether the desired field is declared or not - * @param fieldName Name of the desired field - * @return The field of the desired target class with the specified name - * @throws NoSuchFieldException If the desired field of the desired class cannot be found - * @throws SecurityException If the desired field cannot be made accessible - * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found - * @see #getField(Class, boolean, String) - */ - public static Field getField(String className, PackageType packageType, boolean declared, String fieldName) throws NoSuchFieldException, SecurityException, ClassNotFoundException { - return getField(packageType.getClass(className), declared, fieldName); - } - - /** - * Returns the value of a field of the given class of an object - * - * @param instance Target object - * @param clazz Target class - * @param declared Whether the desired field is declared or not - * @param fieldName Name of the desired field - * @return The value of field of the target object - * @throws IllegalArgumentException If the target object does not feature the desired field - * @throws IllegalAccessException If the desired field cannot be accessed - * @throws NoSuchFieldException If the desired field of the target class cannot be found - * @throws SecurityException If the desired field cannot be made accessible - * @see #getField(Class, boolean, String) - */ - public static Object getValue(Object instance, Class clazz, boolean declared, String fieldName) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { - return getField(clazz, declared, fieldName).get(instance); - } - - /** - * Returns the value of a field of a desired class of an object - * - * @param instance Target object - * @param className Name of the desired target class - * @param packageType Package where the desired target class is located - * @param declared Whether the desired field is declared or not - * @param fieldName Name of the desired field - * @return The value of field of the target object - * @throws IllegalArgumentException If the target object does not feature the desired field - * @throws IllegalAccessException If the desired field cannot be accessed - * @throws NoSuchFieldException If the desired field of the desired class cannot be found - * @throws SecurityException If the desired field cannot be made accessible - * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found - * @see #getValue(Object, Class, boolean, String) - */ - public static Object getValue(Object instance, String className, PackageType packageType, boolean declared, String fieldName) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, ClassNotFoundException { - return getValue(instance, packageType.getClass(className), declared, fieldName); - } - - /** - * Returns the value of a field with the given name of an object - * - * @param instance Target object - * @param declared Whether the desired field is declared or not - * @param fieldName Name of the desired field - * @return The value of field of the target object - * @throws IllegalArgumentException If the target object does not feature the desired field (should not occur since it searches for a field with the given name in the class of the object) - * @throws IllegalAccessException If the desired field cannot be accessed - * @throws NoSuchFieldException If the desired field of the target object cannot be found - * @throws SecurityException If the desired field cannot be made accessible - * @see #getValue(Object, Class, boolean, String) - */ - public static Object getValue(Object instance, boolean declared, String fieldName) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { - return getValue(instance, instance.getClass(), declared, fieldName); - } - - /** - * Sets the value of a field of the given class of an object - * - * @param instance Target object - * @param clazz Target class - * @param declared Whether the desired field is declared or not - * @param fieldName Name of the desired field - * @param value New value - * @throws IllegalArgumentException If the type of the value does not match the type of the desired field - * @throws IllegalAccessException If the desired field cannot be accessed - * @throws NoSuchFieldException If the desired field of the target class cannot be found - * @throws SecurityException If the desired field cannot be made accessible - * @see #getField(Class, boolean, String) - */ - public static void setValue(Object instance, Class clazz, boolean declared, String fieldName, Object value) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { - getField(clazz, declared, fieldName).set(instance, value); - } - - /** - * Sets the value of a field of a desired class of an object - * - * @param instance Target object - * @param className Name of the desired target class - * @param packageType Package where the desired target class is located - * @param declared Whether the desired field is declared or not - * @param fieldName Name of the desired field - * @param value New value - * @throws IllegalArgumentException If the type of the value does not match the type of the desired field - * @throws IllegalAccessException If the desired field cannot be accessed - * @throws NoSuchFieldException If the desired field of the desired class cannot be found - * @throws SecurityException If the desired field cannot be made accessible - * @throws ClassNotFoundException If the desired target class with the specified name and package cannot be found - * @see #setValue(Object, Class, boolean, String, Object) - */ - public static void setValue(Object instance, String className, PackageType packageType, boolean declared, String fieldName, Object value) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException, ClassNotFoundException { - setValue(instance, packageType.getClass(className), declared, fieldName, value); - } - - /** - * Sets the value of a field with the given name of an object - * - * @param instance Target object - * @param declared Whether the desired field is declared or not - * @param fieldName Name of the desired field - * @param value New value - * @throws IllegalArgumentException If the type of the value does not match the type of the desired field - * @throws IllegalAccessException If the desired field cannot be accessed - * @throws NoSuchFieldException If the desired field of the target object cannot be found - * @throws SecurityException If the desired field cannot be made accessible - * @see #setValue(Object, Class, boolean, String, Object) - */ - public static void setValue(Object instance, boolean declared, String fieldName, Object value) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { - setValue(instance, instance.getClass(), declared, fieldName, value); - } - - /** - * Represents an enumeration of dynamic packages of NMS and CraftBukkit - *

- * This class is part of the ReflectionUtils and follows the same usage conditions - * - * @author DarkBlade12 - * @since 1.0 - */ - public enum PackageType { - MINECRAFT_SERVER("net.minecraft.server." + getServerVersion()), - CRAFTBUKKIT("org.bukkit.craftbukkit." + getServerVersion()), - CRAFTBUKKIT_BLOCK(CRAFTBUKKIT, "block"), - CRAFTBUKKIT_CHUNKIO(CRAFTBUKKIT, "chunkio"), - CRAFTBUKKIT_COMMAND(CRAFTBUKKIT, "command"), - CRAFTBUKKIT_CONVERSATIONS(CRAFTBUKKIT, "conversations"), - CRAFTBUKKIT_ENCHANTMENS(CRAFTBUKKIT, "enchantments"), - CRAFTBUKKIT_ENTITY(CRAFTBUKKIT, "entity"), - CRAFTBUKKIT_EVENT(CRAFTBUKKIT, "event"), - CRAFTBUKKIT_GENERATOR(CRAFTBUKKIT, "generator"), - CRAFTBUKKIT_HELP(CRAFTBUKKIT, "help"), - CRAFTBUKKIT_INVENTORY(CRAFTBUKKIT, "inventory"), - CRAFTBUKKIT_MAP(CRAFTBUKKIT, "map"), - CRAFTBUKKIT_METADATA(CRAFTBUKKIT, "metadata"), - CRAFTBUKKIT_POTION(CRAFTBUKKIT, "potion"), - CRAFTBUKKIT_PROJECTILES(CRAFTBUKKIT, "projectiles"), - CRAFTBUKKIT_SCHEDULER(CRAFTBUKKIT, "scheduler"), - CRAFTBUKKIT_SCOREBOARD(CRAFTBUKKIT, "scoreboard"), - CRAFTBUKKIT_UPDATER(CRAFTBUKKIT, "updater"), - CRAFTBUKKIT_UTIL(CRAFTBUKKIT, "util"); - - private final String path; - - /** - * Construct a new package type - * - * @param path Path of the package - */ - private PackageType(String path) { - this.path = path; - } - - /** - * Construct a new package type - * - * @param parent Parent package of the package - * @param path Path of the package - */ - private PackageType(PackageType parent, String path) { - this(parent + "." + path); - } - - /** - * Returns the path of this package type - * - * @return The path - */ - public String getPath() { - return path; - } - - /** - * Returns the class with the given name - * - * @param className Name of the desired class - * @return The class with the specified name - * @throws ClassNotFoundException If the desired class with the specified name and package cannot be found - */ - public Class getClass(String className) throws ClassNotFoundException { - return Class.forName(this + "." + className); - } - - // Override for convenience - @Override - public String toString() { - return path; - } - - /** - * Returns the version of your server - * - * @return The server version - */ - public static String getServerVersion() { - return Bukkit.getServer().getClass().getPackage().getName().substring(23); - } - } - - /** - * Represents an enumeration of Java data types with corresponding classes - *

- * This class is part of the ReflectionUtils and follows the same usage conditions - * - * @author DarkBlade12 - * @since 1.0 - */ - public enum DataType { - BYTE(byte.class, Byte.class), - SHORT(short.class, Short.class), - INTEGER(int.class, Integer.class), - LONG(long.class, Long.class), - CHARACTER(char.class, Character.class), - FLOAT(float.class, Float.class), - DOUBLE(double.class, Double.class), - BOOLEAN(boolean.class, Boolean.class); - - private static final Map, DataType> CLASS_MAP = new HashMap, DataType>(); - private final Class primitive; - private final Class reference; - - // Initialize map for quick class lookup - static { - for (DataType type : values()) { - CLASS_MAP.put(type.primitive, type); - CLASS_MAP.put(type.reference, type); - } - } - - /** - * Construct a new data type - * - * @param primitive Primitive class of this data type - * @param reference Reference class of this data type - */ - private DataType(Class primitive, Class reference) { - this.primitive = primitive; - this.reference = reference; - } - - /** - * Returns the primitive class of this data type - * - * @return The primitive class - */ - public Class getPrimitive() { - return primitive; - } - - /** - * Returns the reference class of this data type - * - * @return The reference class - */ - public Class getReference() { - return reference; - } - - /** - * Returns the data type with the given primitive/reference class - * - * @param clazz Primitive/Reference class of the data type - * @return The data type - */ - public static DataType fromClass(Class clazz) { - return CLASS_MAP.get(clazz); - } - - /** - * Returns the primitive class of the data type with the given reference class - * - * @param clazz Reference class of the data type - * @return The primitive class - */ - public static Class getPrimitive(Class clazz) { - DataType type = fromClass(clazz); - return type == null ? clazz : type.getPrimitive(); - } - - /** - * Returns the reference class of the data type with the given primitive class - * - * @param clazz Primitive class of the data type - * @return The reference class - */ - public static Class getReference(Class clazz) { - DataType type = fromClass(clazz); - return type == null ? clazz : type.getReference(); - } - - /** - * Returns the primitive class array of the given class array - * - * @param classes Given class array - * @return The primitive class array - */ - public static Class[] getPrimitive(Class[] classes) { - int length = classes == null ? 0 : classes.length; - Class[] types = new Class[length]; - for (int index = 0; index < length; index++) { - types[index] = getPrimitive(classes[index]); - } - return types; - } - - /** - * Returns the reference class array of the given class array - * - * @param classes Given class array - * @return The reference class array - */ - public static Class[] getReference(Class[] classes) { - int length = classes == null ? 0 : classes.length; - Class[] types = new Class[length]; - for (int index = 0; index < length; index++) { - types[index] = getReference(classes[index]); - } - return types; - } - - /** - * Returns the primitive class array of the given object array - * - * @param object Given object array - * @return The primitive class array - */ - public static Class[] getPrimitive(Object[] objects) { - int length = objects == null ? 0 : objects.length; - Class[] types = new Class[length]; - for (int index = 0; index < length; index++) { - types[index] = getPrimitive(objects[index].getClass()); - } - return types; - } - - /** - * Returns the reference class array of the given object array - * - * @param object Given object array - * @return The reference class array - */ - public static Class[] getReference(Object[] objects) { - int length = objects == null ? 0 : objects.length; - Class[] types = new Class[length]; - for (int index = 0; index < length; index++) { - types[index] = getReference(objects[index].getClass()); - } - return types; - } - - /** - * Compares two class arrays on equivalence - * - * @param primary Primary class array - * @param secondary Class array which is compared to the primary array - * @return Whether these arrays are equal or not - */ - public static boolean compare(Class[] primary, Class[] secondary) { - if (primary == null || secondary == null || primary.length != secondary.length) { - return false; - } - for (int index = 0; index < primary.length; index++) { - Class primaryClass = primary[index]; - Class secondaryClass = secondary[index]; - if (primaryClass.equals(secondaryClass) || primaryClass.isAssignableFrom(secondaryClass)) { - continue; - } - return false; - } - return true; - } - } - - /** - * Represents an enumeration of all packet types that are featured in Minecraft 1.7.10 - *

- * If this enumeration is no longer up-to-date, please let me know in my forum post - *

- * This class is part of the ReflectionUtils and follows the same usage conditions - * - * @author DarkBlade12 - * @since 1.0 - */ - public enum PacketType { - HANDSHAKING_IN_SET_PROTOCOL("PacketHandshakingInSetProtocol"), - LOGIN_IN_ENCRYPTION_BEGIN("PacketLoginInEncryptionBegin"), - LOGIN_IN_START("PacketLoginInStart"), - LOGIN_OUT_DISCONNECT("PacketLoginOutDisconnect"), - LOGIN_OUT_ENCRYPTION_BEGIN("PacketLoginOutEncryptionBegin"), - LOGIN_OUT_SUCCESS("PacketLoginOutSuccess"), - PLAY_IN_ABILITIES("PacketPlayInAbilities"), - PLAY_IN_ARM_ANIMATION("PacketPlayInArmAnimation"), - PLAY_IN_BLOCK_DIG("PacketPlayInBlockDig"), - PLAY_IN_BLOCK_PLACE("PacketPlayInBlockPlace"), - PLAY_IN_CHAT("PacketPlayInChat"), - PLAY_IN_CLIENT_COMMAND("PacketPlayInClientCommand"), - PLAY_IN_CLOSE_WINDOW("PacketPlayInCloseWindow"), - PLAY_IN_CUSTOM_PAYLOAD("PacketPlayInCustomPayload"), - PLAY_IN_ENCHANT_ITEM("PacketPlayInEnchantItem"), - PLAY_IN_ENTITY_ACTION("PacketPlayInEntityAction"), - PLAY_IN_FLYING("PacketPlayInFlying"), - PLAY_IN_HELD_ITEM_SLOT("PacketPlayInHeldItemSlot"), - PLAY_IN_KEEP_ALIVE("PacketPlayInKeepAlive"), - PLAY_IN_LOOK("PacketPlayInLook"), - PLAY_IN_POSITION("PacketPlayInPosition"), - PLAY_IN_POSITION_LOOK("PacketPlayInPositionLook"), - PLAY_IN_SET_CREATIVE_SLOT("PacketPlayInSetCreativeSlot "), - PLAY_IN_SETTINGS("PacketPlayInSettings"), - PLAY_IN_STEER_VEHICLE("PacketPlayInSteerVehicle"), - PLAY_IN_TAB_COMPLETE("PacketPlayInTabComplete"), - PLAY_IN_TRANSACTION("PacketPlayInTransaction"), - PLAY_IN_UPDATE_SIGN("PacketPlayInUpdateSign"), - PLAY_IN_USE_ENTITY("PacketPlayInUseEntity"), - PLAY_IN_WINDOW_CLICK("PacketPlayInWindowClick"), - PLAY_OUT_ABILITIES("PacketPlayOutAbilities"), - PLAY_OUT_ANIMATION("PacketPlayOutAnimation"), - PLAY_OUT_ATTACH_ENTITY("PacketPlayOutAttachEntity"), - PLAY_OUT_BED("PacketPlayOutBed"), - PLAY_OUT_BLOCK_ACTION("PacketPlayOutBlockAction"), - PLAY_OUT_BLOCK_BREAK_ANIMATION("PacketPlayOutBlockBreakAnimation"), - PLAY_OUT_BLOCK_CHANGE("PacketPlayOutBlockChange"), - PLAY_OUT_CHAT("PacketPlayOutChat"), - PLAY_OUT_CLOSE_WINDOW("PacketPlayOutCloseWindow"), - PLAY_OUT_COLLECT("PacketPlayOutCollect"), - PLAY_OUT_CRAFT_PROGRESS_BAR("PacketPlayOutCraftProgressBar"), - PLAY_OUT_CUSTOM_PAYLOAD("PacketPlayOutCustomPayload"), - PLAY_OUT_ENTITY("PacketPlayOutEntity"), - PLAY_OUT_ENTITY_DESTROY("PacketPlayOutEntityDestroy"), - PLAY_OUT_ENTITY_EFFECT("PacketPlayOutEntityEffect"), - PLAY_OUT_ENTITY_EQUIPMENT("PacketPlayOutEntityEquipment"), - PLAY_OUT_ENTITY_HEAD_ROTATION("PacketPlayOutEntityHeadRotation"), - PLAY_OUT_ENTITY_LOOK("PacketPlayOutEntityLook"), - PLAY_OUT_ENTITY_METADATA("PacketPlayOutEntityMetadata"), - PLAY_OUT_ENTITY_STATUS("PacketPlayOutEntityStatus"), - PLAY_OUT_ENTITY_TELEPORT("PacketPlayOutEntityTeleport"), - PLAY_OUT_ENTITY_VELOCITY("PacketPlayOutEntityVelocity"), - PLAY_OUT_EXPERIENCE("PacketPlayOutExperience"), - PLAY_OUT_EXPLOSION("PacketPlayOutExplosion"), - PLAY_OUT_GAME_STATE_CHANGE("PacketPlayOutGameStateChange"), - PLAY_OUT_HELD_ITEM_SLOT("PacketPlayOutHeldItemSlot"), - PLAY_OUT_KEEP_ALIVE("PacketPlayOutKeepAlive"), - PLAY_OUT_KICK_DISCONNECT("PacketPlayOutKickDisconnect"), - PLAY_OUT_LOGIN("PacketPlayOutLogin"), - PLAY_OUT_MAP("PacketPlayOutMap"), - PLAY_OUT_MAP_CHUNK("PacketPlayOutMapChunk"), - PLAY_OUT_MAP_CHUNK_BULK("PacketPlayOutMapChunkBulk"), - PLAY_OUT_MULTI_BLOCK_CHANGE("PacketPlayOutMultiBlockChange"), - PLAY_OUT_NAMED_ENTITY_SPAWN("PacketPlayOutNamedEntitySpawn"), - PLAY_OUT_NAMED_SOUND_EFFECT("PacketPlayOutNamedSoundEffect"), - PLAY_OUT_OPEN_SIGN_EDITOR("PacketPlayOutOpenSignEditor"), - PLAY_OUT_OPEN_WINDOW("PacketPlayOutOpenWindow"), - PLAY_OUT_PLAYER_INFO("PacketPlayOutPlayerInfo"), - PLAY_OUT_POSITION("PacketPlayOutPosition"), - PLAY_OUT_REL_ENTITY_MOVE("PacketPlayOutRelEntityMove"), - PLAY_OUT_REL_ENTITY_MOVE_LOOK("PacketPlayOutRelEntityMoveLook"), - PLAY_OUT_REMOVE_ENTITY_EFFECT("PacketPlayOutRemoveEntityEffect"), - PLAY_OUT_RESPAWN("PacketPlayOutRespawn"), - PLAY_OUT_SCOREBOARD_DISPLAY_OBJECTIVE("PacketPlayOutScoreboardDisplayObjective"), - PLAY_OUT_SCOREBOARD_OBJECTIVE("PacketPlayOutScoreboardObjective"), - PLAY_OUT_SCOREBOARD_SCORE("PacketPlayOutScoreboardScore"), - PLAY_OUT_SCOREBOARD_TEAM("PacketPlayOutScoreboardTeam"), - PLAY_OUT_SET_SLOT("PacketPlayOutSetSlot"), - PLAY_OUT_SPAWN_ENTITY("PacketPlayOutSpawnEntity"), - PLAY_OUT_SPAWN_ENTITY_EXPERIENCE_ORB("PacketPlayOutSpawnEntityExperienceOrb"), - PLAY_OUT_SPAWN_ENTITY_LIVING("PacketPlayOutSpawnEntityLiving"), - PLAY_OUT_SPAWN_ENTITY_PAINTING("PacketPlayOutSpawnEntityPainting"), - PLAY_OUT_SPAWN_ENTITY_WEATHER("PacketPlayOutSpawnEntityWeather"), - PLAY_OUT_SPAWN_POSITION("PacketPlayOutSpawnPosition"), - PLAY_OUT_STATISTIC("PacketPlayOutStatistic"), - PLAY_OUT_TAB_COMPLETE("PacketPlayOutTabComplete"), - PLAY_OUT_TILE_ENTITY_DATA("PacketPlayOutTileEntityData"), - PLAY_OUT_TRANSACTION("PacketPlayOutTransaction"), - PLAY_OUT_UPDATE_ATTRIBUTES("PacketPlayOutUpdateAttributes"), - PLAY_OUT_UPDATE_HEALTH("PacketPlayOutUpdateHealth"), - PLAY_OUT_UPDATE_SIGN("PacketPlayOutUpdateSign"), - PLAY_OUT_UPDATE_TIME("PacketPlayOutUpdateTime"), - PLAY_OUT_WINDOW_ITEMS("PacketPlayOutWindowItems"), - PLAY_OUT_WORLD_EVENT("PacketPlayOutWorldEvent"), - PLAY_OUT_WORLD_PARTICLES("PacketPlayOutWorldParticles"), - STATUS_IN_PING("PacketStatusInPing"), - STATUS_IN_START("PacketStatusInStart"), - STATUS_OUT_PONG("PacketStatusOutPong"), - STATUS_OUT_SERVER_INFO("PacketStatusOutServerInfo"); - - private static final Map NAME_MAP = new HashMap(); - private final String name; - private Class packet; - - // Initialize map for quick name lookup - static { - for (PacketType type : values()) { - NAME_MAP.put(type.name, type); - } - } - - /** - * Construct a new packet type - * - * @param name Name of this packet - */ - private PacketType(String name) { - this.name = name; - } - - /** - * Returns the name of this packet type - * - * @return The name - */ - public String getName() { - return name; - } - - /** - * Returns the class of this packet - * - * @return The packet class - * @throws ClassNotFoundException If the packet class cannot be found (the name differs in your Bukkit version) - * - */ - public Class getPacket() throws ClassNotFoundException { - return packet == null ? (packet = PackageType.MINECRAFT_SERVER.getClass(name)) : packet; - } - } -} \ No newline at end of file diff --git a/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java b/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java index 63e1c917..6cafc1cb 100644 --- a/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java +++ b/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java @@ -205,7 +205,12 @@ public class LavaFlow else if(Math.random() < PARTICLE_DENSITY && dSquared < Math.pow(currentRadius + PARTICLE_OFFSET, 2) && currentRadius + PARTICLE_OFFSET < maxRadius) { - ParticleEffect.LAVA.display(loc, (float) Math.random(), (float) Math.random(), (float) Math.random(), 0, 1); + try { + ParticleEffect.LAVA.sendToPlayers(Methods.getPlayersAroundPoint(loc, 100), loc, (float) Math.random(), (float) Math.random(), (float) Math.random(), 0, 1); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } } @@ -254,7 +259,12 @@ public class LavaFlow && !isLava(tempBlock) && Math.random() < PARTICLE_DENSITY && tempBlock.getLocation().distanceSquared(origin) <= Math.pow(radius,2)) - ParticleEffect.LAVA.display(loc, 0, 0, 0, 0, 1); + try { + ParticleEffect.LAVA.sendToPlayers(Methods.getPlayersAroundPoint(loc, 100), loc, 0, 0, 0, 0, 1); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } return; @@ -286,7 +296,12 @@ public class LavaFlow if(Math.random() < LAVA_CREATE_SPEED) createLava(tempBlock); else - ParticleEffect.LAVA.display(loc, (float) 0, (float) 0, (float) 0, 0, 1); + try { + ParticleEffect.LAVA.sendToPlayers(Methods.getPlayersAroundPoint(loc, 100), loc, 0, 0, 0, 0, 1); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } else if(!makeLava && isLava(tempBlock)) { From 38db0e28b19277fd0a2fe7fc9262fecf5016ef83 Mon Sep 17 00:00:00 2001 From: MistPhizzle Date: Sun, 7 Dec 2014 10:52:26 -0500 Subject: [PATCH 4/6] Revert "Added support for 1.8 particles!" This reverts commit bb24c4cc6a5079aa976a01223cde11d0bcad7b3d. Conflicts: .classpath src/com/projectkorra/ProjectKorra/Methods.java src/com/projectkorra/ProjectKorra/RevertChecker.java src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java --- .classpath | 1 + .../projectkorra/ProjectKorra/Methods.java | 2 +- .../ProjectKorra/RevertChecker.java | 14 +- .../Utilities/ParticleEffect.java | 1019 ++++++++++------- .../Utilities/ReflectionHandler.java | 86 -- .../ProjectKorra/earthbending/LavaFlow.java | 21 +- 6 files changed, 596 insertions(+), 547 deletions(-) diff --git a/.classpath b/.classpath index 78c37861..36160442 100644 --- a/.classpath +++ b/.classpath @@ -14,5 +14,6 @@ + diff --git a/src/com/projectkorra/ProjectKorra/Methods.java b/src/com/projectkorra/ProjectKorra/Methods.java index cb46dd76..ba41b4cc 100644 --- a/src/com/projectkorra/ProjectKorra/Methods.java +++ b/src/com/projectkorra/ProjectKorra/Methods.java @@ -1447,7 +1447,7 @@ public class Methods { if (gpp != null && respectGriefPrevention) { Material type = player.getWorld().getBlockAt(location).getType(); if (type == null) type = Material.AIR; - String reason = GriefPrevention.instance.allowBuild(player, location, null); + String reason = GriefPrevention.instance.allowBuild(player, location, type); if (ignite.contains(ability)) { diff --git a/src/com/projectkorra/ProjectKorra/RevertChecker.java b/src/com/projectkorra/ProjectKorra/RevertChecker.java index 2aa244bf..6539cc80 100644 --- a/src/com/projectkorra/ProjectKorra/RevertChecker.java +++ b/src/com/projectkorra/ProjectKorra/RevertChecker.java @@ -43,15 +43,13 @@ public class RevertChecker implements Runnable { @Override public ArrayList call() throws Exception { - ArrayList chunks = new ArrayList(); - for (Player player : server.getOnlinePlayers()) { - Collection players = server.getOnlinePlayers(); - for (Player player2 : players) { - Chunk chunk = player2.getLocation().getChunk(); - if (!chunks.contains(chunk)) - chunks.add(chunk); - } + ArrayList chunks = new ArrayList(); + + for (Player player : server.getOnlinePlayers()) { + Chunk chunk = player.getLocation().getChunk(); + if (!chunks.contains(chunk)) + chunks.add(chunk); } return chunks; diff --git a/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java b/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java index 1691c577..b13145b1 100644 --- a/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java +++ b/src/com/projectkorra/ProjectKorra/Utilities/ParticleEffect.java @@ -1,508 +1,659 @@ package com.projectkorra.ProjectKorra.Utilities; - +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; - +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import net.minecraft.server.v1_8_R1.EnumParticle; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; - +import com.projectkorra.ProjectKorra.Utilities.ReflectionHandler.PackageType; +import com.projectkorra.ProjectKorra.Utilities.ReflectionHandler.PacketType; +import com.projectkorra.ProjectKorra.Utilities.ReflectionHandler.SubPackageType; +/** + * ParticleEffect Library v1.4 + * + * This library was created by @DarkBlade12 based on content related to particles of @microgeek (names and packet values), it allows you to display all Minecraft particle effects on a Bukkit server + * + * You are welcome to use it, modify it and redistribute it under the following conditions: + * 1. Don't claim this class as your own + * 2. Don't remove this text + * + * (Would be nice if you provide credit to me) + * + * @author DarkBlade12 + */ public enum ParticleEffect { - - // == Support for 1.7 Implementation == - HUGE_EXPLOSION( - "hugeexplosion", - "EXPLOSION_HUGE"), - LARGE_EXPLODE( - "largeexplode", - "EXPLOSION_LARGE"), - BUBBLE( - "bubble", - "WATER_BUBBLE"), - SUSPEND( - "suspend", - "SUSPENDED"), - DEPTH_SUSPEND( - "depthSuspend", - "SUSPENDED_DEPTH"), - MAGIC_CRIT( - "magicCrit", - "CRIT_MAGIC"), - MOB_SPELL( - "mobSpell", - "SPELL_MOB"), - MOB_SPELL_AMBIENT( - "mobSpellAmbient", - "SPELL_MOB_AMBIENT"), - INSTANT_SPELL( - "instantSpell", - "SPELL_INSTANT"), - WITCH_MAGIC( - "witchMagic", - "SPELL_WITCH"), - EXPLODE( - "explode", - "EXPLOSION_NORMAL"), - SPLASH( - "splash", - "WATER_SPLASH"), - LARGE_SMOKE( - "largesmoke", - "SMOKE_LARGE"), - RED_DUST( - "reddust", - "REDSTONE"), - SNOWBALL_POOF( - "snowballpoof", - "SNOWBALL"), - ANGRY_VILLAGER( - "angryVillager", - "VILLAGER_ANGRY"), - HAPPY_VILLAGER( - "happerVillager", - "VILLAGER_HAPPY"), - // == 1.8 Particles and Supported 1.7 Particles == /** - * 1.8 only! - * - * @see {@link #EXPLODE} + * @appearance Huge explosions + * @displayed by TNT and creepers */ - EXPLOSION_NORMAL( - EXPLODE.getName()), + HUGE_EXPLOSION("hugeexplosion"), /** - * 1.8 only! - * - * @see {@link #LARGE_EXPLODE} + * @appearance Smaller explosions + * @displayed by TNT and creepers */ - EXPLOSION_LARGE( - LARGE_EXPLODE.getName()), + LARGE_EXPLODE("largeexplode"), /** - * 1.8 only! - * - * @see {@link #HUGE_EXPLOSION} + * @appearance Little white sparkling stars + * @displayed by Fireworks */ - EXPLOSION_HUGE( - HUGE_EXPLOSION.getName()), - FIREWORKS_SPARK( - "fireworksSpark"), + FIREWORKS_SPARK("fireworksSpark"), /** - * 1.8 only! - * - * @see {@link #BUBBLE} + * @appearance Bubbles + * @displayed in water */ - WATER_BUBBLE( - BUBBLE.getName()), + BUBBLE("bubble"), /** - * 1.8 only! - * - * @see {@link #SPLASH} + * @appearance Unknown */ - WATER_SPLASH( - SPLASH.getName()), + SUSPEND("suspend"), /** - * 1.8 only! + * @appearance Little gray dots + * @displayed in the Void and water */ - WATER_WAKE, + DEPTH_SUSPEND("depthSuspend"), /** - * 1.8 only! - * - * @see {@link #SUSPEND} + * @appearance Little gray dots + * @displayed by Mycelium */ - SUSPENDED( - SUSPEND.getName()), + TOWN_AURA("townaura"), /** - * 1.8 only! - * - * @see {@link #DEPTH_SUSPEND} + * @appearance Light brown crosses + * @displayed by critical hits */ - SUSPENDED_DEPTH( - DEPTH_SUSPEND.getName()), - CRIT( - "crit"), + CRIT("crit"), /** - * 1.8 only! - * - * @see {@link #MAGIC_CRIT} + * @appearance Cyan stars + * @displayed by hits with an enchanted weapon */ - CRIT_MAGIC( - MAGIC_CRIT.getName()), + MAGIC_CRIT("magicCrit"), /** - * 1.8 only! + * @appearance Little black/gray clouds + * @displayed by torches, primed TNT and end portals */ - SMOKE_NORMAL, + SMOKE("smoke"), /** - * 1.8 only! - * - * @see {@link #LARGE_SMOKE} + * @appearance Colored swirls + * @displayed by potion effects */ - SMOKE_LARGE( - LARGE_SMOKE.getName()), - SPELL( - "spell"), + MOB_SPELL("mobSpell"), /** - * 1.8 only! - * - * @see {@link #INSTANT_SPELL} + * @appearance Transparent colored swirls + * @displayed by beacon effect */ - SPELL_INSTANT( - INSTANT_SPELL.getName()), + MOB_SPELL_AMBIENT("mobSpellAmbient"), /** - * 1.8 only! - * - * @see {@link #MOB_SPELL} + * @appearance Colored swirls + * @displayed by splash potions */ - SPELL_MOB( - MOB_SPELL.getName()), + SPELL("spell"), /** - * 1.8 only! - * - * @see {@link #MOB_SPELL_AMBIENT} + * @appearance Colored crosses + * @displayed by instant splash potions (instant health/instant damage) */ - SPELL_MOB_AMBIENT( - MOB_SPELL_AMBIENT.getName()), + INSTANT_SPELL("instantSpell"), /** - * 1.8 only! - * - * @see {@link #WITCH_MAGIC} + * @appearance Colored crosses + * @displayed by witches */ - SPELL_WITCH( - WITCH_MAGIC.getName()), - DRIP_WATER( - "dripWater"), - DRIP_LAVA( - "dripLava"), + WITCH_MAGIC("witchMagic"), /** - * 1.8 only! - * - * @see {@link #ANGRY_VILLAGER} + * @appearance Colored notes + * @displayed by note blocks */ - VILLAGER_ANGRY( - ANGRY_VILLAGER.getName()), + NOTE("note"), /** - * 1.8 only! - * - * @see {@link #HAPPY_VILLAGER} + * @appearance Little purple clouds + * @displayed by nether portals, endermen, ender pearls, eyes of ender and ender chests */ - VILLAGER_HAPPY( - HAPPY_VILLAGER.getName()), - TOWN_AURA( - "townaura"), - NOTE( - "note"), - PORTAL( - "portal"), - ENCHANTMENT_TABLE( - "enchantmenttable"), - FLAME( - "flame"), - LAVA( - "lave"), - FOOTSTEP( - "footstep"), - CLOUD( - "cloud"), - REDSTONE( - "reddust"), - SNOWBALL( - "snowballpoof"), - SNOW_SHOVEL( - "snowshovel"), - SLIME( - "slime"), - HEART( - "heart"), + PORTAL("portal"), /** - * 1.8 only! + * @appearance: White letters + * @displayed by enchantment tables that are near bookshelves */ - BARRIER, + ENCHANTMENT_TABLE("enchantmenttable"), /** - * 1.8 only! + * @appearance White clouds */ - ITEM_CRACK, + EXPLODE("explode"), /** - * 1.8 only! + * @appearance Little flames + * @displayed by torches, furnaces, magma cubes and monster spawners */ - BLOCK_CRACK, + FLAME("flame"), /** - * 1.8 only! + * @appearance Little orange blobs + * @displayed by lava */ - BLOCK_DUST, + LAVA("lava"), /** - * 1.8 only! + * @appearance Gray transparent squares */ - WATER_DROP, + FOOTSTEP("footstep"), /** - * 1.8 only! + * @appearance Blue drops + * @displayed by water, rain and shaking wolves */ - ITEM_TAKE, + SPLASH("splash"), /** - * 1.8 only! + * @appearance Blue droplets + * @displayed on water when fishing */ - MOB_APPEARANCE; - - private String particleName; - private String enumValue; - - ParticleEffect(String particleName, String enumValue) { - this.particleName = particleName; - this.enumValue = enumValue; + WAKE("wake"), + /** + * @appearance Black/Gray clouds + * @displayed by fire, minecarts with furance and blazes + */ + LARGE_SMOKE("largesmoke"), + /** + * @appearance Large white clouds + * @displayed on mob death + */ + CLOUD("cloud"), + /** + * @appearance Little colored clouds + * @displayed by active redstone wires and redstone torches + */ + RED_DUST("reddust"), + /** + * @appearance Little white parts + * @displayed by cracking snowballs and eggs + */ + SNOWBALL_POOF("snowballpoof"), + /** + * @appearance Blue drips + * @displayed by blocks below a water source + */ + DRIP_WATER("dripWater"), + /** + * @appearance Orange drips + * @displayed by blocks below a lava source + */ + DRIP_LAVA("dripLava"), + /** + * @appearance White clouds + */ + SNOW_SHOVEL("snowshovel"), + /** + * @appearance Little green parts + * @displayed by slimes + */ + SLIME("slime"), + /** + * @appearance Red hearts + * @displayed when breeding + */ + HEART("heart"), + /** + * @appearance Dark gray cracked hearts + * @displayed when attacking a villager in a village + */ + ANGRY_VILLAGER("angryVillager"), + /** + * @appearance Green stars + * @displayed by bone meal and when trading with a villager + */ + HAPPY_VILLAGER("happyVillager"); + private static final Map NAME_MAP = new HashMap(); + private static final double MAX_RANGE = 16; + private static Constructor packetPlayOutWorldParticles; + private static Method getHandle; + private static Field playerConnection; + private static Method sendPacket; + private final String name; + static { + for (ParticleEffect p : values()) + NAME_MAP.put(p.name, p); + try { + packetPlayOutWorldParticles = ReflectionHandler.getConstructor(PacketType.PLAY_OUT_WORLD_PARTICLES.getPacket(), net.minecraft.server.v1_8_R1.EnumParticle.class, boolean.class, float.class, float.class, float.class, float.class, float.class, + float.class, float.class, int.class, int[].class); + getHandle = ReflectionHandler.getMethod("CraftPlayer", SubPackageType.ENTITY, "getHandle"); + playerConnection = ReflectionHandler.getField("EntityPlayer", PackageType.MINECRAFT_SERVER, "playerConnection"); + sendPacket = ReflectionHandler.getMethod(playerConnection.getType(), "sendPacket", ReflectionHandler.getClass("Packet", PackageType.MINECRAFT_SERVER)); + } catch (Exception e) { + e.printStackTrace(); + } } - - ParticleEffect(String particleName) { - this(particleName, null); + /** + * @param name Name of this particle effect + */ + private ParticleEffect(String name) { + this.name = name; } - - ParticleEffect() { - this(null, null); - } - + /** + * @return The name of this particle effect + */ public String getName() { - return this.particleName; + return this.name; } - - private static Class nmsPacketPlayOutParticle = ReflectionUtilities.getNMSClass("PacketPlayOutWorldParticles"); - private static Class nmsEnumParticle; - private static int particleRange = 25; - /** - * Modify the maximum Range of particles (only useful for Client versions 1.8+) - * - * @param range - * New range + * Gets a particle effect from name + * + * @param name Name of the particle effect + * @return The particle effect */ - public static void setRange(int range) { - if (range < 0) throw new IllegalArgumentException("Range must be positive!"); - if (range > Integer.MAX_VALUE) throw new IllegalArgumentException("Range is too big!"); - particleRange = range; - } - - /** - * @return The current maximum Range of particles - */ - public static int getRange() { - return particleRange; - } - - /** - * Send the particle to a specific Player - * - * @param player - * Receiver of the particle - * @param location - * Location of the particle - * @param offsetX - * X size of the area to spawn particles in. - * @param offsetY - * Y size of the area to spawn particles in. - * @param offsetZ - * Z size of the area to spawn particles in. - * @param speed - * Speed of the Particle - * @param count - * Number of spawned particles - * @throws Exception - */ - public void sendToPlayer(Player player, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { - if (!isPlayerInRange(player, location)) return; - System.out.println(ReflectionUtilities.getVersion()); - if (ReflectionUtilities.getVersion().contains("v1_8")) { - try { - if (nmsEnumParticle == null) nmsEnumParticle = ReflectionUtilities.getNMSClass("EnumParticle"); - Object packet = nmsPacketPlayOutParticle.getConstructor(new Class[] { nmsEnumParticle, boolean.class, float.class, float.class, float.class, float.class, float.class, float.class, float.class, int.class, int[].class }) - .newInstance(getEnum(nmsEnumParticle.getName() + "." + (enumValue != null ? enumValue : name().toUpperCase())), true, (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, speed, count, new int[] {}); - Object handle = ReflectionUtilities.getHandle(player); - Object connection = ReflectionUtilities.getField(handle.getClass(), "playerConnection").get(handle); - ReflectionUtilities.getMethod(connection.getClass(), "sendPacket", new Class[0]).invoke(connection, new Object[] { packet }); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to send Particle " + name() + ". (Version 1.8): " + e.getMessage()); - } - } else { - try { - if (particleName == null) throw new Exception(); - Object packet = nmsPacketPlayOutParticle.getConstructor(new Class[] { String.class, float.class, float.class, float.class, float.class, float.class, float.class, float.class, int.class }).newInstance(particleName, (float) location.getX(), (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, speed, count); - Object handle = ReflectionUtilities.getHandle(player); - Object connection = ReflectionUtilities.getField(handle.getClass(), "playerConnection").get(handle); - ReflectionUtilities.getMethod(connection.getClass(), "sendPacket", new Class[0]).invoke(connection, new Object[] { packet }); - } catch (Exception e) { - throw new IllegalArgumentException("Unable to send Particle " + name() + ". (Invalid Server Version: 1.7) " + e.getMessage()); - } - } - } - - /** - * Send the particle to a Collection of Players {@link #sendToPlayer(Player, Location, float, float, float, float, int)} - * - * @param player - * Receiver of the particle - * @param location - * Location of the particle - * @param offsetX - * X size of the area to spawn particles in. - * @param offsetY - * Y size of the area to spawn particles in. - * @param offsetZ - * Z size of the area to spawn particles in. - * @param speed - * Speed of the Particle - * @param count - * Number of spawned particles - */ - public void sendToPlayers(Collection players, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { - for (Player p : players) - sendToPlayer(p, location, offsetX, offsetY, offsetZ, speed, count); - } - - /** - * Send the particle to an Array of Players {@link #sendToPlayer(Player, Location, float, float, float, float, int)} - * - * @param player - * Receiver of the particle - * @param location - * Location of the particle - * @param offsetX - * X size of the area to spawn particles in. - * @param offsetY - * Y size of the area to spawn particles in. - * @param offsetZ - * Z size of the area to spawn particles in. - * @param speed - * Speed of the Particle - * @param count - * Number of spawned particles - */ - public void sendToPlayers(Player[] players, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) throws Exception { - for (Player p : players) - sendToPlayer(p, location, offsetX, offsetY, offsetZ, speed, count); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static Enum getEnum(String enumFullName) { - String[] x = enumFullName.split("\\.(?=[^\\.]+$)"); - if (x.length == 2) { - String enumClassName = x[0]; - String enumName = x[1]; - try { - Class cl = (Class) Class.forName(enumClassName); - return Enum.valueOf(cl, enumName); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - } + public static ParticleEffect fromName(String name) { + if (name != null) + for (Entry e : NAME_MAP.entrySet()) + if (e.getKey().equalsIgnoreCase(name)) + return e.getValue(); return null; } - - private static boolean isPlayerInRange(Player p, Location center) { - double distance = 0; - if ((distance = center.distance(p.getLocation())) > Double.MAX_VALUE) return false; - return distance < particleRange; + /** + * Gets a list of players in a certain range + * + * @param center Center location + * @param range Range + * @return The list of players in the specified range + */ + private static List getPlayers(Location center, double range) { + List players = new ArrayList(); + String name = center.getWorld().getName(); + double squared = range * range; + for (Player p : Bukkit.getOnlinePlayers()) + if (p.getWorld().getName().equals(name) && p.getLocation().distanceSquared(center) <= squared) + players.add(p); + return players; } - - public static class ReflectionUtilities { - + /** + * Instantiates a new @PacketPlayOutWorldParticles object through reflection + * + * @param center Center location of the effect + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @return The packet object + * @throws #PacketInstantiationException if the amount is lower than 1 or if the @PacketPlayOutWorldParticles has changed its name or constructor parameters + */ + private static Object instantiatePacket(String name, Location center, float offsetX, float offsetY, float offsetZ, float speed, int amount) { + if (amount < 1) + throw new PacketInstantiationException("Amount cannot be lower than 1"); + try { + return packetPlayOutWorldParticles.newInstance(getEnumParticle(name), false, (float) center.getX(), (float) center.getY(), (float) center.getZ(), offsetX, offsetY, offsetZ, speed, amount, new int[0]); + } catch (Exception e) { + throw new PacketInstantiationException("Packet instantiation failed", e); + } + } + public static EnumParticle getEnumParticle(String name) + { + switch(name.toUpperCase()) + { + case "HUGEEXPLOSION": + return EnumParticle.EXPLOSION_HUGE; + case "BUBBLE": + return EnumParticle.WATER_BUBBLE; + case "SUSPEND": + return EnumParticle.SUSPENDED; + case "DEPTHSUSPEND": + return EnumParticle.SUSPENDED_DEPTH; + case "MAGICCRIT": + return EnumParticle.CRIT_MAGIC; + case "SMOKE": + return EnumParticle.SMOKE_NORMAL; + case "MOBSPELL": + return EnumParticle.SPELL_MOB; + case "MOBSPELLAMBIENT": + return EnumParticle.SPELL_MOB_AMBIENT; + case "INSTANTSPELL": + return EnumParticle.SPELL_INSTANT; + case "WITCHMAGIC": + return EnumParticle.SPELL_WITCH; + case "EXPLODE": + return EnumParticle.EXPLOSION_NORMAL; + case "SPLASH": + return EnumParticle.WATER_SPLASH; + case "WAKE": + return EnumParticle.WATER_WAKE; + case "LARGESMOKE": + return EnumParticle.SMOKE_LARGE; + case "REDDUST": + return EnumParticle.REDSTONE; + case "SNOWBALLPOOF": + return EnumParticle.SNOWBALL; + case "ANGRYVILLAGER": + return EnumParticle.VILLAGER_ANGRY; + case "HAPPYVILLAGER": + return EnumParticle.VILLAGER_HAPPY; + case "DRIPWATER": + return EnumParticle.DRIP_WATER; + case "DRIPLAVA": + return EnumParticle.DRIP_LAVA; + case "SNOWSHOVEL": + return EnumParticle.SNOW_SHOVEL; + case "ENCHANTMENTTABLE": + return EnumParticle.ENCHANTMENT_TABLE; + case "TOWNAURA": + return EnumParticle.TOWN_AURA; + case "FIREWORKSSPARK": + return EnumParticle.FIREWORKS_SPARK; + default: + return EnumParticle.valueOf(name.toUpperCase()); + } + } + /** + * Instantiates a new @PacketPlayOutWorldParticles object through reflection especially for the "iconcrack" effect + * + * @param id Id of the icon + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @return The packet object + * @throws #PacketInstantiationException if the amount is lower than 1 or if the @PacketPlayOutWorldParticles has changed its name or constructor parameters + * @see #instantiatePacket + */ + private static Object instantiateIconCrackPacket(int id, Location center, float offsetX, float offsetY, float offsetZ, float speed, int amount) { + return instantiatePacket("iconcrack_" + id, center, offsetX, offsetY, offsetZ, speed, amount); + } + /** + * Instantiates a new @PacketPlayOutWorldParticles object through reflection especially for the "blockcrack" effect + * + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param amount Amount of particles + * @return The packet object + * @throws #PacketInstantiationException if the amount is lower than 1 or if the @PacketPlayOutWorldParticles has changed its name or constructor parameters + * @see #instantiatePacket + */ + private static Object instantiateBlockCrackPacket(int id, byte data, Location center, float offsetX, float offsetY, float offsetZ, int amount) { + return instantiatePacket("blockcrack_" + id + "_" + data, center, offsetX, offsetY, offsetZ, 0, amount); + } + /** + * Instantiates a new @PacketPlayOutWorldParticles object through reflection especially for the "blockdust" effect + * + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @return The packet object + * @throws #PacketInstantiationException if the amount is lower than 1 or if the name or the constructor of @PacketPlayOutWorldParticles have changed + * @see #instantiatePacket + */ + private static Object instantiateBlockDustPacket(int id, byte data, Location center, float offsetX, float offsetY, float offsetZ, float speed, int amount) { + return instantiatePacket("blockdust_" + id + "_" + data, center, offsetX, offsetY, offsetZ, speed, amount); + } + /** + * Sends a packet through reflection to a player + * + * @param p Receiver of the packet + * @param packet Packet that is sent + * @throws #PacketSendingException if the packet is null or some methods which are accessed through reflection have changed + */ + private static void sendPacket(Player p, Object packet) { + try { + sendPacket.invoke(playerConnection.get(getHandle.invoke(p)), packet); + } catch (Exception e) { + throw new PacketSendingException("Failed to send a packet to player '" + p.getName() + "'", e); + } + } + /** + * Sends a packet through reflection to a collection of players + * + * @param players Receivers of the packet + * @param packet Packet that is sent + * @throws #PacketSendingException if the sending to a single player fails + * @see #sendPacket + */ + private static void sendPacket(Collection players, Object packet) { + for (Player p : players) + sendPacket(p, packet); + } + /** + * Displays a particle effect which is only visible for the specified players + * + * @param center Center location of the effect + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param players Receivers of the effect + * @see #sendPacket + * @see #instantiatePacket + */ + public void display(Location center, float offsetX, float offsetY, float offsetZ, float speed, int amount, Player... players) { + sendPacket(Arrays.asList(players), instantiatePacket(name, center, offsetX, offsetY, offsetZ, speed, amount)); + } + /** + * Displays a particle effect which is only visible for all players within a certain range in the world of @param center + * + * @param center Center location of the effect + * @param range Range of the visibility + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param players Receivers of the effect + * @throws @IllegalArgumentException if the range is higher than 20 + * @see #sendPacket + * @see #instantiatePacket + */ + public void display(Location center, double range, float offsetX, float offsetY, float offsetZ, float speed, int amount) { + if (range > MAX_RANGE) + throw new IllegalArgumentException("Range cannot exceed the maximum value of 16"); + sendPacket(getPlayers(center, range), instantiatePacket(name, center, offsetX, offsetY, offsetZ, speed, amount)); + } + /** + * Displays a particle effect which is only visible for all players within a range of 20 in the world of @param center + * + * @param center Center location of the effect + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param players Receivers of the effect + * @see #display(Location, double, float, float, float, float, int) + */ + public void display(Location center, float offsetX, float offsetY, float offsetZ, float speed, int amount) { + display(center, MAX_RANGE, offsetX, offsetY, offsetZ, speed, amount); + } + /** + * Displays an icon crack (item break) particle effect which is only visible for the specified players + * + * @param center Center location of the effect + * @param id Id of the icon + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param players Receivers of the effect + * @see #sendPacket + * @see #instantiateIconCrackPacket + */ + public static void displayIconCrack(Location center, int id, float offsetX, float offsetY, float offsetZ, float speed, int amount, Player... players) { + sendPacket(Arrays.asList(players), instantiateIconCrackPacket(id, center, offsetX, offsetY, offsetZ, speed, amount)); + } + /** + * Displays an icon crack (item break) particle effect which is only visible for all players within a certain range in the world of @param center + * + * @param center Center location of the effect + * @param range Range of the visibility + * @param id Id of the icon + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @throws @IllegalArgumentException if the range is higher than 20 + * @see #sendPacket + * @see #instantiateIconCrackPacket + */ + public static void displayIconCrack(Location center, double range, int id, float offsetX, float offsetY, float offsetZ, float speed, int amount) { + if (range > MAX_RANGE) + throw new IllegalArgumentException("Range has to be lower/equal the maximum of 16"); + sendPacket(getPlayers(center, range), instantiateIconCrackPacket(id, center, offsetX, offsetY, offsetZ, speed, amount)); + } + /** + * Displays an icon crack (item break) effect which is visible for all players whitin the maximum range of 20 blocks in the world of @param center + * + * @param center Center location of the effect + * @param id Id of the icon + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @see #displayIconCrack(Location, double, int, float, float, float, float, int) + */ + public static void displayIconCrack(Location center, int id, float offsetX, float offsetY, float offsetZ, float speed, int amount) { + displayIconCrack(center, MAX_RANGE, id, offsetX, offsetY, offsetZ, speed, amount); + } + /** + * Displays a block crack (block break) particle effect which is only visible for the specified players + * + * @param center Center location of the effect + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param amount Amount of particles + * @param players Receivers of the effect + * @see #sendPacket + * @see #instantiateBlockCrackPacket + */ + public static void displayBlockCrack(Location center, int id, byte data, float offsetX, float offsetY, float offsetZ, int amount, Player... players) { + sendPacket(Arrays.asList(players), instantiateBlockCrackPacket(id, data, center, offsetX, offsetY, offsetZ, amount)); + } + /** + * Displays a block crack (block break) particle effect which is only visible for all players within a certain range in the world of @param center + * + * @param center Center location of the effect + * @param range Range of the visibility + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param amount Amount of particles + * @throws @IllegalArgumentException if the range is higher than 20 + * @see #sendPacket + * @see #instantiateBlockCrackPacket + */ + public static void displayBlockCrack(Location center, double range, int id, byte data, float offsetX, float offsetY, float offsetZ, int amount) { + if (range > MAX_RANGE) + throw new IllegalArgumentException("Range has to be lower/equal the maximum of 16"); + sendPacket(getPlayers(center, range), instantiateBlockCrackPacket(id, data, center, offsetX, offsetY, offsetZ, amount)); + } + /** + * Displays a block crack (block break) effect which is visible for all players whitin the maximum range of 20 blocks in the world of @param center + * + * @param center Center location of the effect + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param amount Amount of particles + * @see #displayBlockCrack(Location, double, int, byte, float, float, float, int) + */ + public static void displayBlockCrack(Location center, int id, byte data, float offsetX, float offsetY, float offsetZ, int amount) { + displayBlockCrack(center, MAX_RANGE, id, data, offsetX, offsetY, offsetZ, amount); + } + /** + * Displays a block dust particle effect which is only visible for the specified players + * + * @param center Center location of the effect + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @param players Receivers of the effect + * @see #sendPacket + * @see #instantiateBlockDustPacket + */ + public static void displayBlockDust(Location center, int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount, Player... players) { + sendPacket(Arrays.asList(players), instantiateBlockDustPacket(id, data, center, offsetX, offsetY, offsetZ, speed, amount)); + } + /** + * Displays a block dust particle effect which is only visible for all players within a certain range in the world of @param center + * + * @param center Center location of the effect + * @param range Range of the visibility + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @throws @IllegalArgumentException if the range is higher than 20 + * @see #sendPacket + * @see #instantiateBlockDustPacket + */ + public static void displayBlockDust(Location center, double range, int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount) { + if (range > MAX_RANGE) + throw new IllegalArgumentException("Range has to be lower/equal the maximum of 16"); + sendPacket(getPlayers(center, range), instantiateBlockDustPacket(id, data, center, offsetX, offsetY, offsetZ, speed, amount)); + } + /** + * Displays a block dust effect which is visible for all players whitin the maximum range of 20 blocks in the world of @param center + * + * @param center Center location of the effect + * @param id Id of the block + * @param data Data value + * @param offsetX Maximum distance particles can fly away from the center on the x-axis + * @param offsetY Maximum distance particles can fly away from the center on the y-axis + * @param offsetZ Maximum distance particles can fly away from the center on the z-axis + * @param speed Display speed of the particles + * @param amount Amount of particles + * @see #displayBlockDust(Location, double, int, byte, float, float, float, float, int) + */ + public static void displayBlockDust(Location center, int id, byte data, float offsetX, float offsetY, float offsetZ, float speed, int amount) { + displayBlockDust(center, MAX_RANGE, id, data, offsetX, offsetY, offsetZ, speed, amount); + } + /** + * Represents a runtime exception that can be thrown upon packet instantiation + */ + private static final class PacketInstantiationException extends RuntimeException { + private static final long serialVersionUID = 3203085387160737484L; /** - * sets a value of an {@link Object} via reflection - * - * @param instance - * instance the class to use - * @param fieldName - * the name of the {@link Field} to modify - * @param value - * the value to set - * @throws Exception + * @param message Message that will be logged */ - public static void setValue(Object instance, String fieldName, Object value) throws Exception { - Field field = instance.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - field.set(instance, value); + public PacketInstantiationException(String message) { + super(message); } - /** - * get a value of an {@link Object}'s {@link Field} - * - * @param instance - * the target {@link Object} - * @param fieldName - * name of the {@link Field} - * @return the value of {@link Object} instance's {@link Field} with the name of fieldName - * @throws Exception + * @param message Message that will be logged + * @param cause Cause of the exception */ - public static Object getValue(Object instance, String fieldName) throws Exception { - Field field = instance.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(instance); + public PacketInstantiationException(String message, Throwable cause) { + super(message, cause); } - - public static String getVersion() { - String name = Bukkit.getServer().getClass().getPackage().getName(); - String version = name.substring(name.lastIndexOf('.') + 1) + "."; - return version; - } - - public static Class getNMSClass(String className) { - String fullName = "net.minecraft.server." + getVersion() + className; - Class clazz = null; - try { - clazz = Class.forName(fullName); - } catch (Exception e) { - e.printStackTrace(); - } - return clazz; - } - - public static Class getOBCClass(String className) { - String fullName = "org.bukkit.craftbukkit." + getVersion() + className; - Class clazz = null; - try { - clazz = Class.forName(fullName); - } catch (Exception e) { - e.printStackTrace(); - } - return clazz; - } - - public static Object getHandle(Object obj) { - try { - return getMethod(obj.getClass(), "getHandle", new Class[0]).invoke(obj, new Object[0]); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - public static Field getField(Class clazz, String name) { - try { - Field field = clazz.getDeclaredField(name); - field.setAccessible(true); - return field; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - public static Method getMethod(Class clazz, String name, Class... args) { - for (Method m : clazz.getMethods()) { - if ((m.getName().equals(name)) && ((args.length == 0) || (ClassListEqual(args, m.getParameterTypes())))) { - m.setAccessible(true); - return m; - } - } - return null; - } - - public static boolean ClassListEqual(Class[] l1, Class[] l2) { - boolean equal = true; - if (l1.length != l2.length) { - return false; - } - for (int i = 0; i < l1.length; i++) { - if (l1[i] != l2[i]) { - equal = false; - break; - } - } - return equal; + } + /** + * Represents a runtime exception that can be thrown upon packet sending + */ + private static final class PacketSendingException extends RuntimeException { + private static final long serialVersionUID = 3203085387160737484L; + /** + * @param message Message that will be logged + * @param cause Cause of the exception + */ + public PacketSendingException(String message, Throwable cause) { + super(message, cause); } } } \ No newline at end of file diff --git a/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java b/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java index 16b71f3e..260f950c 100644 --- a/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java +++ b/src/com/projectkorra/ProjectKorra/Utilities/ReflectionHandler.java @@ -5,9 +5,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; - import org.bukkit.Bukkit; - /** * ReflectionHandler v1.0 * @@ -23,15 +21,12 @@ import org.bukkit.Bukkit; */ public final class ReflectionHandler { private ReflectionHandler() {} - public static Class getClass(String name, PackageType type) throws Exception { return Class.forName(type + "." + name); } - public static Class getClass(String name, SubPackageType type) throws Exception { return Class.forName(type + "." + name); } - public static Constructor getConstructor(Class clazz, Class... parameterTypes) { Class[] p = DataType.convertToPrimitive(parameterTypes); for (Constructor c : clazz.getConstructors()) @@ -39,27 +34,21 @@ public final class ReflectionHandler { return c; return null; } - public static Constructor getConstructor(String className, PackageType type, Class... parameterTypes) throws Exception { return getConstructor(getClass(className, type), parameterTypes); } - public static Constructor getConstructor(String className, SubPackageType type, Class... parameterTypes) throws Exception { return getConstructor(getClass(className, type), parameterTypes); } - public static Object newInstance(Class clazz, Object... args) throws Exception { return getConstructor(clazz, DataType.convertToPrimitive(args)).newInstance(args); } - public static Object newInstance(String className, PackageType type, Object... args) throws Exception { return newInstance(getClass(className, type), args); } - public static Object newInstance(String className, SubPackageType type, Object... args) throws Exception { return newInstance(getClass(className, type), args); } - public static Method getMethod(Class clazz, String name, Class... parameterTypes) { Class[] p = DataType.convertToPrimitive(parameterTypes); for (Method m : clazz.getMethods()) @@ -67,195 +56,150 @@ public final class ReflectionHandler { return m; return null; } - public static Method getMethod(String className, PackageType type, String name, Class... parameterTypes) throws Exception { return getMethod(getClass(className, type), name, parameterTypes); } - public static Method getMethod(String className, SubPackageType type, String name, Class... parameterTypes) throws Exception { return getMethod(getClass(className, type), name, parameterTypes); } - public static Object invokeMethod(String name, Object instance, Object... args) throws Exception { return getMethod(instance.getClass(), name, DataType.convertToPrimitive(args)).invoke(instance, args); } - public static Object invokeMethod(Class clazz, String name, Object instance, Object... args) throws Exception { return getMethod(clazz, name, DataType.convertToPrimitive(args)).invoke(instance, args); } - public static Object invokeMethod(String className, PackageType type, String name, Object instance, Object... args) throws Exception { return invokeMethod(getClass(className, type), name, instance, args); } - public static Object invokeMethod(String className, SubPackageType type, String name, Object instance, Object... args) throws Exception { return invokeMethod(getClass(className, type), name, instance, args); } - public static Field getField(Class clazz, String name) throws Exception { Field f = clazz.getField(name); f.setAccessible(true); return f; } - public static Field getField(String className, PackageType type, String name) throws Exception { return getField(getClass(className, type), name); } - public static Field getField(String className, SubPackageType type, String name) throws Exception { return getField(getClass(className, type), name); } - public static Field getDeclaredField(Class clazz, String name) throws Exception { Field f = clazz.getDeclaredField(name); f.setAccessible(true); return f; } - public static Field getDeclaredField(String className, PackageType type, String name) throws Exception { return getDeclaredField(getClass(className, type), name); } - public static Field getDeclaredField(String className, SubPackageType type, String name) throws Exception { return getDeclaredField(getClass(className, type), name); } - public static Object getValue(Object instance, String fieldName) throws Exception { return getField(instance.getClass(), fieldName).get(instance); } - public static Object getValue(Class clazz, Object instance, String fieldName) throws Exception { return getField(clazz, fieldName).get(instance); } - public static Object getValue(String className, PackageType type, Object instance, String fieldName) throws Exception { return getValue(getClass(className, type), instance, fieldName); } - public static Object getValue(String className, SubPackageType type, Object instance, String fieldName) throws Exception { return getValue(getClass(className, type), instance, fieldName); } - public static Object getDeclaredValue(Object instance, String fieldName) throws Exception { return getDeclaredField(instance.getClass(), fieldName).get(instance); } - public static Object getDeclaredValue(Class clazz, Object instance, String fieldName) throws Exception { return getDeclaredField(clazz, fieldName).get(instance); } - public static Object getDeclaredValue(String className, PackageType type, Object instance, String fieldName) throws Exception { return getDeclaredValue(getClass(className, type), instance, fieldName); } - public static Object getDeclaredValue(String className, SubPackageType type, Object instance, String fieldName) throws Exception { return getDeclaredValue(getClass(className, type), instance, fieldName); } - public static void setValue(Object instance, String fieldName, Object fieldValue) throws Exception { Field f = getField(instance.getClass(), fieldName); f.set(instance, fieldValue); } - public static void setValue(Object instance, FieldPair pair) throws Exception { setValue(instance, pair.getName(), pair.getValue()); } - public static void setValue(Class clazz, Object instance, String fieldName, Object fieldValue) throws Exception { Field f = getField(clazz, fieldName); f.set(instance, fieldValue); } - public static void setValue(Class clazz, Object instance, FieldPair pair) throws Exception { setValue(clazz, instance, pair.getName(), pair.getValue()); } - public static void setValue(String className, PackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { setValue(getClass(className, type), instance, fieldName, fieldValue); } - public static void setValue(String className, PackageType type, Object instance, FieldPair pair) throws Exception { setValue(className, type, instance, pair.getName(), pair.getValue()); } - public static void setValue(String className, SubPackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { setValue(getClass(className, type), instance, fieldName, fieldValue); } - public static void setValue(String className, SubPackageType type, Object instance, FieldPair pair) throws Exception { setValue(className, type, instance, pair.getName(), pair.getValue()); } - public static void setValues(Object instance, FieldPair... pairs) throws Exception { for (FieldPair pair : pairs) setValue(instance, pair); } - public static void setValues(Class clazz, Object instance, FieldPair... pairs) throws Exception { for (FieldPair pair : pairs) setValue(clazz, instance, pair); } - public static void setValues(String className, PackageType type, Object instance, FieldPair... pairs) throws Exception { setValues(getClass(className, type), instance, pairs); } - public static void setValues(String className, SubPackageType type, Object instance, FieldPair... pairs) throws Exception { setValues(getClass(className, type), instance, pairs); } - public static void setDeclaredValue(Object instance, String fieldName, Object fieldValue) throws Exception { Field f = getDeclaredField(instance.getClass(), fieldName); f.set(instance, fieldValue); } - public static void setDeclaredValue(Object instance, FieldPair pair) throws Exception { setDeclaredValue(instance, pair.getName(), pair.getValue()); } - public static void setDeclaredValue(Class clazz, Object instance, String fieldName, Object fieldValue) throws Exception { Field f = getDeclaredField(clazz, fieldName); f.set(instance, fieldValue); } - public static void setDeclaredValue(Class clazz, Object instance, FieldPair pair) throws Exception { setDeclaredValue(clazz, instance, pair.getName(), pair.getValue()); } - public static void setDeclaredValue(String className, PackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { setDeclaredValue(getClass(className, type), instance, fieldName, fieldValue); } - public static void setDeclaredValue(String className, PackageType type, Object instance, FieldPair pair) throws Exception { setDeclaredValue(className, type, instance, pair.getName(), pair.getValue()); } - public static void setDeclaredValue(String className, SubPackageType type, Object instance, String fieldName, Object fieldValue) throws Exception { setDeclaredValue(getClass(className, type), instance, fieldName, fieldValue); } - public static void setDeclaredValue(String className, SubPackageType type, Object instance, FieldPair pair) throws Exception { setDeclaredValue(className, type, instance, pair.getName(), pair.getValue()); } - public static void setDeclaredValues(Object instance, FieldPair... pairs) throws Exception { for (FieldPair pair : pairs) setDeclaredValue(instance, pair); } - public static void setDeclaredValues(Class clazz, Object instance, FieldPair... pairs) throws Exception { for (FieldPair pair : pairs) setDeclaredValue(clazz, instance, pair); } - public static void setDeclaredValues(String className, PackageType type, Object instance, FieldPair... pairs) throws Exception { setDeclaredValues(getClass(className, type), instance, pairs); } - public static void setDeclaredValues(String className, SubPackageType type, Object instance, FieldPair... pairs) throws Exception { setDeclaredValues(getClass(className, type), instance, pairs); } - /** * This class is part of the ReflectionHandler and follows the same usage conditions * @@ -270,45 +214,36 @@ public final class ReflectionHandler { FLOAT(float.class, Float.class), DOUBLE(double.class, Double.class), BOOLEAN(boolean.class, Boolean.class); - private static final Map, DataType> CLASS_MAP = new HashMap, DataType>(); private final Class primitive; private final Class reference; - static { for (DataType t : values()) { CLASS_MAP.put(t.primitive, t); CLASS_MAP.put(t.reference, t); } } - private DataType(Class primitive, Class reference) { this.primitive = primitive; this.reference = reference; } - public Class getPrimitive() { return this.primitive; } - public Class getReference() { return this.reference; } - public static DataType fromClass(Class c) { return CLASS_MAP.get(c); } - public static Class getPrimitive(Class c) { DataType t = fromClass(c); return t == null ? c : t.getPrimitive(); } - public static Class getReference(Class c) { DataType t = fromClass(c); return t == null ? c : t.getReference(); } - public static Class[] convertToPrimitive(Class[] classes) { int length = classes == null ? 0 : classes.length; Class[] types = new Class[length]; @@ -316,7 +251,6 @@ public final class ReflectionHandler { types[i] = getPrimitive(classes[i]); return types; } - public static Class[] convertToPrimitive(Object[] objects) { int length = objects == null ? 0 : objects.length; Class[] types = new Class[length]; @@ -324,7 +258,6 @@ public final class ReflectionHandler { types[i] = getPrimitive(objects[i].getClass()); return types; } - public static boolean equalsArray(Class[] a1, Class[] a2) { if (a1 == null || a2 == null || a1.length != a2.length) return false; @@ -334,7 +267,6 @@ public final class ReflectionHandler { return true; } } - /** * This class is part of the ReflectionHandler and follows the same usage conditions * @@ -343,21 +275,17 @@ public final class ReflectionHandler { public final class FieldPair { private final String name; private final Object value; - public FieldPair(String name, Object value) { this.name = name; this.value = value; } - public String getName() { return this.name; } - public Object getValue() { return this.value; } } - /** * This class is part of the ReflectionHandler and follows the same usage conditions * @@ -366,23 +294,18 @@ public final class ReflectionHandler { public enum PackageType { MINECRAFT_SERVER("net.minecraft.server." + Bukkit.getServer().getClass().getPackage().getName().substring(23)), CRAFTBUKKIT(Bukkit.getServer().getClass().getPackage().getName()); - private final String name; - private PackageType(String name) { this.name = name; } - public String getName() { return this.name; } - @Override public String toString() { return name; } } - /** * This class is part of the ReflectionHandler and follows the same usage conditions * @@ -407,23 +330,18 @@ public final class ReflectionHandler { SCOREBOARD, UPDATER, UTIL; - private final String name; - private SubPackageType() { name = PackageType.CRAFTBUKKIT + "." + name().toLowerCase(); } - public String getName() { return this.name; } - @Override public String toString() { return name; } } - /** * This class is part of the ReflectionHandler and follows the same usage conditions * @@ -529,18 +447,14 @@ public final class ReflectionHandler { STATUS_IN_START("PacketStatusInStart"), STATUS_OUT_PONG("PacketStatusOutPong"), STATUS_OUT_SERVER_INFO("PacketStatusOutServerInfo"); - private final String name; private Class packet; - private PacketType(String name) { this.name = name; } - public String getName() { return this.getName(); } - public Class getPacket() throws Exception { return packet == null ? packet = ReflectionHandler.getClass(name, PackageType.MINECRAFT_SERVER) : packet; } diff --git a/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java b/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java index 6cafc1cb..87c8a49c 100644 --- a/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java +++ b/src/com/projectkorra/ProjectKorra/earthbending/LavaFlow.java @@ -205,12 +205,7 @@ public class LavaFlow else if(Math.random() < PARTICLE_DENSITY && dSquared < Math.pow(currentRadius + PARTICLE_OFFSET, 2) && currentRadius + PARTICLE_OFFSET < maxRadius) { - try { - ParticleEffect.LAVA.sendToPlayers(Methods.getPlayersAroundPoint(loc, 100), loc, (float) Math.random(), (float) Math.random(), (float) Math.random(), 0, 1); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + ParticleEffect.LAVA.display(loc, (float) Math.random(), (float) Math.random(), (float) Math.random(), 0, 1); } } @@ -259,12 +254,7 @@ public class LavaFlow && !isLava(tempBlock) && Math.random() < PARTICLE_DENSITY && tempBlock.getLocation().distanceSquared(origin) <= Math.pow(radius,2)) - try { - ParticleEffect.LAVA.sendToPlayers(Methods.getPlayersAroundPoint(loc, 100), loc, 0, 0, 0, 0, 1); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + ParticleEffect.LAVA.display(loc, 0, 0, 0, 0, 1); } return; @@ -296,12 +286,7 @@ public class LavaFlow if(Math.random() < LAVA_CREATE_SPEED) createLava(tempBlock); else - try { - ParticleEffect.LAVA.sendToPlayers(Methods.getPlayersAroundPoint(loc, 100), loc, 0, 0, 0, 0, 1); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + ParticleEffect.LAVA.display(loc, 0, 0, 0, 0, 1); } else if(!makeLava && isLava(tempBlock)) { From 065b75c6969ec90cbff596ed018a1a5c696a6c0f Mon Sep 17 00:00:00 2001 From: MistPhizzle Date: Sun, 7 Dec 2014 15:22:05 -0500 Subject: [PATCH 5/6] Remove LavaSurge There was an issue with falling blocks, until it is fixed, LavaSurge is gone. --- .../Ability/AbilityModuleManager.java | 2 +- .../ProjectKorra/Ability/StockAbilities.java | 4 ++-- .../ProjectKorra/ConfigManager.java | 18 +++++++++--------- .../projectkorra/ProjectKorra/PKListener.java | 6 +++--- .../ProjectKorra/earthbending/LavaSurge.java | 2 +- src/config.yml | 6 ------ 6 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/com/projectkorra/ProjectKorra/Ability/AbilityModuleManager.java b/src/com/projectkorra/ProjectKorra/Ability/AbilityModuleManager.java index 64d3c9fe..05c4c8be 100644 --- a/src/com/projectkorra/ProjectKorra/Ability/AbilityModuleManager.java +++ b/src/com/projectkorra/ProjectKorra/Ability/AbilityModuleManager.java @@ -118,7 +118,7 @@ public class AbilityModuleManager { if (a == StockAbilities.MetalClips) earthsubabilities.add(a.name()); if (a == StockAbilities.Extraction) earthsubabilities.add(a.name()); if (a == StockAbilities.LavaFlow) earthsubabilities.add(a.name()); - if (a == StockAbilities.LavaSurge) earthsubabilities.add(a.name()); +// if (a == StockAbilities.LavaSurge) earthsubabilities.add(a.name()); } } diff --git a/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java b/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java index 2390656c..83431a1a 100644 --- a/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java +++ b/src/com/projectkorra/ProjectKorra/Ability/StockAbilities.java @@ -18,7 +18,7 @@ public enum StockAbilities { AvatarState, // Project Korra - Extraction, MetalClips, Smokescreen, Combustion, LavaSurge, LavaFlow, Suffocate, IceBlast, WarriorStance, AcrobatStance; + Extraction, MetalClips, Smokescreen, Combustion, LavaFlow, Suffocate, IceBlast, WarriorStance, AcrobatStance; private enum AirbendingAbilities { AirBlast, AirBubble, AirShield, AirSuction, AirSwipe, Tornado, AirScooter, AirSpout, AirBurst, Suffocate; @@ -30,7 +30,7 @@ public enum StockAbilities { } private enum EarthbendingAbilities { - Catapult, RaiseEarth, EarthGrab, EarthTunnel, EarthBlast, Collapse, Tremorsense, EarthArmor, Shockwave, Extraction, MetalClips, LavaSurge, LavaFlow; + Catapult, RaiseEarth, EarthGrab, EarthTunnel, EarthBlast, Collapse, Tremorsense, EarthArmor, Shockwave, Extraction, MetalClips, LavaFlow; } private enum FirebendingAbilities { diff --git a/src/com/projectkorra/ProjectKorra/ConfigManager.java b/src/com/projectkorra/ProjectKorra/ConfigManager.java index 97cf48ac..efd4c4c1 100644 --- a/src/com/projectkorra/ProjectKorra/ConfigManager.java +++ b/src/com/projectkorra/ProjectKorra/ConfigManager.java @@ -463,15 +463,15 @@ public class ConfigManager { config.addDefault("Abilities.Earth.LavaFlow.AllowNaturalFlow", false); config.addDefault("Abilities.Earth.LavaFlow.ParticleDensity", 0.33); - config.addDefault("Abilities.Earth.LavaSurge.Enabled", true); - config.addDefault("Abilities.Earth.LavaSurge.Description", "LavaSurge is a fundamental move for any Lavabender out there. To use, simply sneak (Default: Shift) while looking at a source of Earth or Lava, then click in a direction. A surge of lava will swiftly travel towards the target you were pointing at, dealing moderate damage, a large knockback, and setting them on fire."); - config.addDefault("Abilities.Earth.LavaSurge.Damage", 4); - config.addDefault("Abilities.Earth.LavaSurge.Cooldown", 1000); - config.addDefault("Abilities.Earth.LavaSurge.FractureRadius", 1); - config.addDefault("Abilities.Earth.LavaSurge.PrepareRange", 7); - config.addDefault("Abilities.Earth.LavaSurge.TravelRange", 15); - config.addDefault("Abilities.Earth.LavaSurge.MaxLavaWaves", 10); - config.addDefault("Abilities.Earth.LavaSurge.SourceCanBeEarth", true); +// config.addDefault("Abilities.Earth.LavaSurge.Enabled", true); +// config.addDefault("Abilities.Earth.LavaSurge.Description", "LavaSurge is a fundamental move for any Lavabender out there. To use, simply sneak (Default: Shift) while looking at a source of Earth or Lava, then click in a direction. A surge of lava will swiftly travel towards the target you were pointing at, dealing moderate damage, a large knockback, and setting them on fire."); +// config.addDefault("Abilities.Earth.LavaSurge.Damage", 4); +// config.addDefault("Abilities.Earth.LavaSurge.Cooldown", 1000); +// config.addDefault("Abilities.Earth.LavaSurge.FractureRadius", 1); +// config.addDefault("Abilities.Earth.LavaSurge.PrepareRange", 7); +// config.addDefault("Abilities.Earth.LavaSurge.TravelRange", 15); +// config.addDefault("Abilities.Earth.LavaSurge.MaxLavaWaves", 10); +// config.addDefault("Abilities.Earth.LavaSurge.SourceCanBeEarth", true); config.addDefault("Abilities.Earth.MetalClips.Enabled", true); config.addDefault("Abilities.Earth.MetalClips.Description", "MetalClips has the potential to be both an offensive and a utility ability. To start, you must carry smelted Iron Ingots in your inventory. To apply the clips onto an entity, simply click at them. If the entity is a Zombie, a Skeleton, or a Player, the clips will form armor around the entity, giving you some control over them. Each additional clip will give you more control. If you have permission to do so, you may crush the entity against a wall with a 4th clip, hurting them. Without explicit permissions, you will only be able to strap three clips on your target. If the entity is not one of the above, the clip will simply do damage and fall to the ground, to be collected."); diff --git a/src/com/projectkorra/ProjectKorra/PKListener.java b/src/com/projectkorra/ProjectKorra/PKListener.java index 43767d30..999d879d 100644 --- a/src/com/projectkorra/ProjectKorra/PKListener.java +++ b/src/com/projectkorra/ProjectKorra/PKListener.java @@ -498,9 +498,9 @@ public class PKListener implements Listener { new MetalClips(player, 1); } - if (abil.equalsIgnoreCase("LavaSurge")) { - new LavaSurge(player); - } +// if (abil.equalsIgnoreCase("LavaSurge")) { +// new LavaSurge(player); +// } if (abil.equalsIgnoreCase("LavaFlow")) { new LavaFlow(player,LavaFlow.AbilityType.SHIFT); diff --git a/src/com/projectkorra/ProjectKorra/earthbending/LavaSurge.java b/src/com/projectkorra/ProjectKorra/earthbending/LavaSurge.java index 051d4c80..0590bf94 100644 --- a/src/com/projectkorra/ProjectKorra/earthbending/LavaSurge.java +++ b/src/com/projectkorra/ProjectKorra/earthbending/LavaSurge.java @@ -270,7 +270,7 @@ public class LavaSurge if(curTime > time + (fallingBlockInterval * fallingBlocksCount)) { - FallingBlock fbs = player.getWorld().spawnFallingBlock(sourceBlock.getLocation().add(0, 1, 0), Material.STATIONARY_LAVA, (byte) 0); + FallingBlock fbs = player.getWorld().spawnFallingBlock(sourceBlock.getLocation().add(0, 1, 0), Material.STATIONARY_LAVA, (byte) 1); fblocks.add(fbs); falling.add(fbs); double x = randy.nextDouble()/5; diff --git a/src/config.yml b/src/config.yml index 53471734..c898cdc2 100644 --- a/src/config.yml +++ b/src/config.yml @@ -348,12 +348,6 @@ Abilities: DoubleLootChance: 40 MetalClips: Enabled: true - LavaSurge: - Enabled: true - Description: "This ability allows an Earthbender to bend an existing Lava Source to create a large wave that deals damage and knocks back anything in its path. To use, simply tap sneak (Default: Shift) while targeting an earthbendable block. Once a source has been selected, left click to launch the wave off into the direction you are looking. This ability has a small knockback and does a fair amount of damage." - Radius: 3 - HorizontalPush: 0.5 - VerticalPush: 0.1 LavaFlow: Enabled: true Description: 'This ability allows an Earthbender to create lava using the Earth From 765daf6ddca63714cb3464fb38b31a73389b59f8 Mon Sep 17 00:00:00 2001 From: MistPhizzle Date: Sun, 7 Dec 2014 15:24:38 -0500 Subject: [PATCH 6/6] v1.5.1 1.8 Compatible --- Dev Builds/Korra.jar | Bin 561048 -> 564242 bytes src/plugin.yml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Dev Builds/Korra.jar b/Dev Builds/Korra.jar index 63f033501d8b68a9f0f43e8e7fab0c3a8af4f120..b7ce080a9a4e4e7fac524a6dfd271574ea03feb9 100644 GIT binary patch delta 196010 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�i(anehH@p>fBP*qfc6qH|SBbIu(zN(EuIuc%Y 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 z

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 B#(gwSv2RY+wh-Q)cN~@{{d&F0 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%0A&R(@LKJZq*DT9>M)$3M6@b_gE7#O) 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þ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 YU`tbKkaQ4q6Z{J|0FM@?AmpI`1CjgsH~;_u diff --git a/src/plugin.yml b/src/plugin.yml index 22b29fa1..8be618ff 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: ProjectKorra author: ProjectKorra -version: 1.5.0 +version: 1.5.1 main: com.projectkorra.ProjectKorra.ProjectKorra softdepend: [PreciousStones, WorldGuard, WorldEdit, Factions, MassiveCore, GriefPrevention, Towny, TagAPI, NoCheatPlus, LWC] commands: