diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..176a458
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+* text=auto
diff --git a/.project b/.project
deleted file mode 100644
index 52727aa..0000000
--- a/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
<repositories> <repository> <id>confuser-repo</id> - <url>http://ci.frostcast.net/plugin/repository/everything</url> + <url>https://ci.frostcast.net/plugin/repository/everything</url> </repository> </repositories> @@ -37,7 +37,7 @@ <dependency> <groupId>me.confuser</groupId> <artifactId>BarAPI</artifactId> - <version>3.0</version> + <version>3.5</version> </dependency> </dependencies>
* http://forums.bukkit.org/threads/tutorial-utilizing-the-boss-health-bar * .158018/page-2#post-1760928 - * + * * @author James Mortemore */ public class Util { - public static boolean newProtocol = false; - public static String version; - public static Class> fakeDragonClass = v1_6.class; - - static { - detectVersion(); - } - - public static void detectVersion() { - if (BarAPI.useSpigotHack()) { - fakeDragonClass = v1_8Fake.class; - version = "v1_7_R4."; - } else { - String name = Bukkit.getServer().getClass().getPackage().getName(); - String mcVersion = name.substring(name.lastIndexOf('.') + 1); - String[] versions = mcVersion.split("_"); - - if (versions[0].equals("v1") && Integer.parseInt(versions[1]) > 6) { - newProtocol = true; - fakeDragonClass = v1_7.class; - } - - version = mcVersion + "."; - } - } - - public static FakeDragon newDragon(String message, Location loc) { - FakeDragon fakeDragon = null; - - try { - fakeDragon = (FakeDragon) fakeDragonClass.getConstructor(String.class, Location.class).newInstance(message, loc); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - - return fakeDragon; - } - - // Reflection Util - public static void sendPacket(Player p, Object packet) { - try { - Object nmsPlayer = getHandle(p); - Field con_field = nmsPlayer.getClass().getField("playerConnection"); - Object con = con_field.get(nmsPlayer); - Method packet_method = getMethod(con.getClass(), "sendPacket"); - packet_method.invoke(con, packet); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } - } - - public static Class> getCraftClass(String ClassName) { - String className = "net.minecraft.server." + version + ClassName; - Class> c = null; - try { - c = Class.forName(className); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - return c; - } - - public static Object getHandle(World world) { - Object nms_entity = null; - Method entity_getHandle = getMethod(world.getClass(), "getHandle"); - try { - nms_entity = entity_getHandle.invoke(world); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - return nms_entity; - } - - public static Object getHandle(Entity entity) { - Object nms_entity = null; - Method entity_getHandle = getMethod(entity.getClass(), "getHandle"); - try { - nms_entity = entity_getHandle.invoke(entity); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - return nms_entity; - } - - public static Field getField(Class> cl, String field_name) { - try { - Field field = cl.getDeclaredField(field_name); - return field; - } catch (SecurityException e) { - e.printStackTrace(); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } - return null; - } - - public static Method getMethod(Class> cl, String method, Class>[] args) { - for (Method m : cl.getMethods()) { - if (m.getName().equals(method) && ClassListEqual(args, m.getParameterTypes())) { - return m; - } - } - return null; - } - - public static Method getMethod(Class> cl, String method, Integer args) { - for (Method m : cl.getMethods()) { - if (m.getName().equals(method) && args.equals(new Integer(m.getParameterTypes().length))) { - return m; - } - } - return null; - } - - public static Method getMethod(Class> cl, String method) { - for (Method m : cl.getMethods()) { - if (m.getName().equals(method)) { - 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; - } + + public static boolean newProtocol = false; + public static String version; + public static Class> fakeDragonClass = v1_6.class; + public static boolean isBelowGround = true; + + static { + detectVersion(); + } + + public static void detectVersion() { + if (BarAPI.useSpigotHack()) { + fakeDragonClass = v1_8Fake.class; + version = "v1_7_R4."; + isBelowGround = false; + } else { + String name = Bukkit.getServer().getClass().getPackage().getName(); + String mcVersion = name.substring(name.lastIndexOf('.') + 1); + String[] versions = mcVersion.split("_"); + + if (versions[0].equals("v1")) { + int minor = Integer.parseInt(versions[1]); + + if (minor == 7) { + newProtocol = true; + fakeDragonClass = v1_7.class; + } else if (minor == 8) { + fakeDragonClass = v1_8.class; + isBelowGround = false; + } else if (minor >= 9) { + fakeDragonClass = v1_9.class; + } + } + + version = mcVersion + "."; + } + } + + public static FakeDragon newDragon(String message, Location loc) { + FakeDragon fakeDragon = null; + + try { + fakeDragon = (FakeDragon) fakeDragonClass.getConstructor(String.class, Location.class).newInstance(message, loc); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return fakeDragon; + } + + // Reflection Util + public static void sendPacket(Player p, Object packet) { + try { + Object nmsPlayer = getHandle(p); + Field con_field = nmsPlayer.getClass().getField("playerConnection"); + Object con = con_field.get(nmsPlayer); + Method packet_method = getMethod(con.getClass(), "sendPacket"); + packet_method.invoke(con, packet); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + + public static Class> getCraftClass(String ClassName) { + String className = "net.minecraft.server." + version + ClassName; + Class> c = null; + try { + c = Class.forName(className); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return c; + } + + public static Object getHandle(World world) { + Object nms_entity = null; + Method entity_getHandle = getMethod(world.getClass(), "getHandle"); + try { + nms_entity = entity_getHandle.invoke(world); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return nms_entity; + } + + public static Object getHandle(Entity entity) { + Object nms_entity = null; + Method entity_getHandle = getMethod(entity.getClass(), "getHandle"); + try { + nms_entity = entity_getHandle.invoke(entity); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return nms_entity; + } + + public static Field getField(Class> cl, String field_name) { + try { + Field field = cl.getDeclaredField(field_name); + return field; + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + return null; + } + + public static Method getMethod(Class> cl, String method, Class>[] args) { + for (Method m : cl.getMethods()) { + if (m.getName().equals(method) && ClassListEqual(args, m.getParameterTypes())) { + return m; + } + } + return null; + } + + public static Method getMethod(Class> cl, String method, Integer args) { + for (Method m : cl.getMethods()) { + if (m.getName().equals(method) && args.equals(new Integer(m.getParameterTypes().length))) { + return m; + } + } + return null; + } + + public static Method getMethod(Class> cl, String method) { + for (Method m : cl.getMethods()) { + if (m.getName().equals(method)) { + 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; + } } \ No newline at end of file diff --git a/src/me/confuser/barapi/nms/v1_8.java b/src/me/confuser/barapi/nms/v1_8.java new file mode 100644 index 0000000..ff1e3dc --- /dev/null +++ b/src/me/confuser/barapi/nms/v1_8.java @@ -0,0 +1,180 @@ +package me.confuser.barapi.nms; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import me.confuser.barapi.Util; + +import org.bukkit.Location; + +public class v1_8 extends FakeDragon { + private Object dragon; + private int id; + + public v1_8(String name, Location loc) { + super(name, loc); + } + + @Override + public Object getSpawnPacket() { + Class> Entity = Util.getCraftClass("Entity"); + Class> EntityLiving = Util.getCraftClass("EntityLiving"); + Class> EntityEnderDragon = Util.getCraftClass("EntityEnderDragon"); + Object packet = null; + + try { + dragon = EntityEnderDragon.getConstructor(Util.getCraftClass("World")).newInstance(getWorld()); + + Method setLocation = Util.getMethod(EntityEnderDragon, "setLocation", new Class>[] { double.class, double.class, double.class, float.class, float.class }); + setLocation.invoke(dragon, getX(), getY(), getZ(), getPitch(), getYaw()); + + Method setInvisible = Util.getMethod(EntityEnderDragon, "setInvisible", new Class>[] { boolean.class }); + setInvisible.invoke(dragon, true); + + Method setCustomName = Util.getMethod(EntityEnderDragon, "setCustomName", new Class>[] { String.class }); + setCustomName.invoke(dragon, name); + + Method setHealth = Util.getMethod(EntityEnderDragon, "setHealth", new Class>[] { float.class }); + setHealth.invoke(dragon, health); + + Field motX = Util.getField(Entity, "motX"); + motX.set(dragon, getXvel()); + + Field motY = Util.getField(Entity, "motY"); + motY.set(dragon, getYvel()); + + Field motZ = Util.getField(Entity, "motZ"); + motZ.set(dragon, getZvel()); + + Method getId = Util.getMethod(EntityEnderDragon, "getId", new Class>[] {}); + this.id = (Integer) getId.invoke(dragon); + + Class> PacketPlayOutSpawnEntityLiving = Util.getCraftClass("PacketPlayOutSpawnEntityLiving"); + + packet = PacketPlayOutSpawnEntityLiving.getConstructor(new Class>[] { EntityLiving }).newInstance(dragon); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return packet; + } + + @Override + public Object getDestroyPacket() { + Class> PacketPlayOutEntityDestroy = Util.getCraftClass("PacketPlayOutEntityDestroy"); + + Object packet = null; + try { + packet = PacketPlayOutEntityDestroy.newInstance(); + Field a = PacketPlayOutEntityDestroy.getDeclaredField("a"); + a.setAccessible(true); + a.set(packet, new int[] { id }); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } + + return packet; + } + + @Override + public Object getMetaPacket(Object watcher) { + Class> DataWatcher = Util.getCraftClass("DataWatcher"); + + Class> PacketPlayOutEntityMetadata = Util.getCraftClass("PacketPlayOutEntityMetadata"); + + Object packet = null; + try { + packet = PacketPlayOutEntityMetadata.getConstructor(new Class>[] { int.class, DataWatcher, boolean.class }).newInstance(id, watcher, true); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return packet; + } + + @Override + public Object getTeleportPacket(Location loc) { + Class> PacketPlayOutEntityTeleport = Util.getCraftClass("PacketPlayOutEntityTeleport"); + Object packet = null; + + try { + packet = PacketPlayOutEntityTeleport.getConstructor(new Class>[] { int.class, int.class, int.class, int.class, byte.class, byte.class, boolean.class }).newInstance(this.id, loc.getBlockX() * 32, loc.getBlockY() * 32, loc.getBlockZ() * 32, (byte) ((int) loc.getYaw() * 256 / 360), (byte) ((int) loc.getPitch() * 256 / 360), false); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return packet; + } + + @Override + public Object getWatcher() { + Class> Entity = Util.getCraftClass("Entity"); + Class> DataWatcher = Util.getCraftClass("DataWatcher"); + + Object watcher = null; + try { + watcher = DataWatcher.getConstructor(new Class>[] { Entity }).newInstance(dragon); + Method a = Util.getMethod(DataWatcher, "a", new Class>[] { int.class, Object.class }); + + a.invoke(watcher, 5, isVisible() ? (byte) 0 : (byte) 0x20); + a.invoke(watcher, 6, (Float) health); + a.invoke(watcher, 7, (Integer) 0); + a.invoke(watcher, 8, (Byte) (byte) 0); + a.invoke(watcher, 10, name); + a.invoke(watcher, 11, (Byte) (byte) 1); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return watcher; + } +} diff --git a/src/me/confuser/barapi/nms/v1_8Fake.java b/src/me/confuser/barapi/nms/v1_8Fake.java index a5da361..180d37e 100644 --- a/src/me/confuser/barapi/nms/v1_8Fake.java +++ b/src/me/confuser/barapi/nms/v1_8Fake.java @@ -1,204 +1,210 @@ package me.confuser.barapi.nms; +import me.confuser.barapi.Util; +import org.bukkit.Location; + import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import me.confuser.barapi.Util; - -import org.bukkit.Location; - /** -* This is the FakeDragon class for BarAPI. -* It is based on the code by SoThatsIt. -* -* http://forums.bukkit.org/threads/tutorial-utilizing-the-boss-health-bar.158018/page-5#post-2053705 -* -* @author James Mortemore -*/ + * This is the FakeDragon class for BarAPI. + * It is based on the code by SoThatsIt. + *
+ * http://forums.bukkit.org/threads/tutorial-utilizing-the-boss-health-bar.158018/page-5#post-2053705 + * + * @author James Mortemore + */ public class v1_8Fake extends FakeDragon { - private Object dragon; - private int id; - - public v1_8Fake(String name, Location loc) { - super(name, loc); - } - - @Override - public Object getSpawnPacket() { - Class> Entity = Util.getCraftClass("Entity"); - Class> EntityLiving = Util.getCraftClass("EntityLiving"); - Class> EntityEnderDragon = Util.getCraftClass("EntityEnderDragon"); - Object packet = null; - try { - dragon = EntityEnderDragon.getConstructor(Util.getCraftClass("World")).newInstance(getWorld()); - - Method setLocation = Util.getMethod(EntityEnderDragon, "setLocation", new Class>[] { double.class, double.class, double.class, float.class, float.class }); - setLocation.invoke(dragon, getX(), getY(), getZ(), getPitch(), getYaw()); - - Method setInvisible = Util.getMethod(EntityEnderDragon, "setInvisible", new Class>[] { boolean.class }); - setInvisible.invoke(dragon, true); - - Method setCustomName = Util.getMethod(EntityEnderDragon, "setCustomName", new Class>[] { String.class }); - setCustomName.invoke(dragon, name); - - Method setHealth = Util.getMethod(EntityEnderDragon, "setHealth", new Class>[] { float.class }); - setHealth.invoke(dragon, health); - - Field motX = Util.getField(Entity, "motX"); - motX.set(dragon, getXvel()); - - Field motY = Util.getField(Entity, "motY"); - motY.set(dragon, getYvel()); - - Field motZ = Util.getField(Entity, "motZ"); - motZ.set(dragon, getZvel()); - - Method getId = Util.getMethod(EntityEnderDragon, "getId", new Class>[] {}); - this.id = (Integer) getId.invoke(dragon); - - Class> PacketPlayOutSpawnEntityLiving = Util.getCraftClass("PacketPlayOutSpawnEntityLiving"); - - packet = PacketPlayOutSpawnEntityLiving.getConstructor(new Class>[] { EntityLiving }).newInstance(dragon); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - - return packet; - } - - @Override - public Object getDestroyPacket() { - Class> PacketPlayOutEntityDestroy = Util.getCraftClass("PacketPlayOutEntityDestroy"); - - Object packet = null; - try { - packet = PacketPlayOutEntityDestroy.newInstance(); - Field a = PacketPlayOutEntityDestroy.getDeclaredField("a"); - a.setAccessible(true); - a.set(packet, new int[] { id }); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } - - return packet; - } - - @Override - public Object getMetaPacket(Object watcher) { - Class> DataWatcher = Util.getCraftClass("DataWatcher"); - - Class> PacketPlayOutEntityMetadata = Util.getCraftClass("PacketPlayOutEntityMetadata"); - - Object packet = null; - try { - packet = PacketPlayOutEntityMetadata.getConstructor(new Class>[] { int.class, DataWatcher, boolean.class }).newInstance(id, watcher, true); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - - return packet; - } - - @Override - public Object getTeleportPacket(Location loc) { - Class> PacketPlayOutEntityTeleport = Util.getCraftClass("PacketPlayOutEntityTeleport"); - Object packet = null; - - try { - packet = PacketPlayOutEntityTeleport.getConstructor(new Class>[] { int.class, int.class, int.class, int.class, byte.class, byte.class, boolean.class, boolean.class }).newInstance(this.id, loc.getBlockX() * 32, loc.getBlockY() * 32, loc.getBlockZ() * 32, (byte) ((int) loc.getYaw() * 256 / 360), (byte) ((int) loc.getPitch() * 256 / 360), false, false); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - - return packet; - } - - @Override - public Object getWatcher() { - Class> Entity = Util.getCraftClass("Entity"); - Class> DataWatcher = Util.getCraftClass("DataWatcher"); - - Object watcher = null; - try { - watcher = DataWatcher.getConstructor(new Class>[] { Entity }).newInstance(dragon); - Method a = Util.getMethod(DataWatcher, "a", new Class>[] { int.class, Object.class }); - - a.invoke(watcher, 5, isVisible() ? (byte) 0 : (byte) 0x20); - a.invoke(watcher, 6, (Float) health); - a.invoke(watcher, 7, (Integer) 0); - a.invoke(watcher, 8, (Byte) (byte) 0); - a.invoke(watcher, 10, name); - a.invoke(watcher, 11, (Byte) (byte) 1); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - - return watcher; - } - - public static boolean isUsable() { - Class> PacketPlayOutEntityTeleport = Util.getCraftClass("PacketPlayOutEntityTeleport"); - - try { - PacketPlayOutEntityTeleport.getConstructor(new Class>[] { int.class, int.class, int.class, int.class, byte.class, byte.class, boolean.class, boolean.class }); - } catch (IllegalArgumentException e) { - return false; - } catch (SecurityException e) { - return false; - } catch (NoSuchMethodException e) { - return false; - } - - return true; - } + + private Object dragon; + private int id; + + public v1_8Fake(String name, Location loc) { + super(name, loc); + } + + public static boolean isUsable() { + Class> PacketPlayOutEntityTeleport = Util.getCraftClass("PacketPlayOutEntityTeleport"); + + try { + PacketPlayOutEntityTeleport + .getConstructor(new Class>[] { int.class, int.class, int.class, int.class, byte.class, byte.class, boolean.class, boolean.class }); + } catch (IllegalArgumentException e) { + return false; + } catch (SecurityException e) { + return false; + } catch (NoSuchMethodException e) { + return false; + } + + return true; + } + + @Override + public Object getSpawnPacket() { + Class> Entity = Util.getCraftClass("Entity"); + Class> EntityLiving = Util.getCraftClass("EntityLiving"); + Class> EntityEnderDragon = Util.getCraftClass("EntityEnderDragon"); + Object packet = null; + try { + dragon = EntityEnderDragon.getConstructor(Util.getCraftClass("World")).newInstance(getWorld()); + + Method setLocation = Util + .getMethod(EntityEnderDragon, "setLocation", new Class>[] { double.class, double.class, double.class, float.class, float.class }); + setLocation.invoke(dragon, getX(), getY(), getZ(), getPitch(), getYaw()); + + Method setInvisible = Util.getMethod(EntityEnderDragon, "setInvisible", new Class>[] { boolean.class }); + setInvisible.invoke(dragon, true); + + Method setCustomName = Util.getMethod(EntityEnderDragon, "setCustomName", new Class>[] { String.class }); + setCustomName.invoke(dragon, name); + + Method setHealth = Util.getMethod(EntityEnderDragon, "setHealth", new Class>[] { float.class }); + setHealth.invoke(dragon, health); + + Field motX = Util.getField(Entity, "motX"); + motX.set(dragon, getXvel()); + + Field motY = Util.getField(Entity, "motY"); + motY.set(dragon, getYvel()); + + Field motZ = Util.getField(Entity, "motZ"); + motZ.set(dragon, getZvel()); + + Method getId = Util.getMethod(EntityEnderDragon, "getId", new Class>[] {}); + this.id = (Integer) getId.invoke(dragon); + + Class> PacketPlayOutSpawnEntityLiving = Util.getCraftClass("PacketPlayOutSpawnEntityLiving"); + + packet = PacketPlayOutSpawnEntityLiving.getConstructor(new Class>[] { EntityLiving }).newInstance(dragon); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return packet; + } + + @Override + public Object getDestroyPacket() { + Class> PacketPlayOutEntityDestroy = Util.getCraftClass("PacketPlayOutEntityDestroy"); + + Object packet = null; + try { + packet = PacketPlayOutEntityDestroy.newInstance(); + Field a = PacketPlayOutEntityDestroy.getDeclaredField("a"); + a.setAccessible(true); + a.set(packet, new int[] { id }); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } + + return packet; + } + + @Override + public Object getMetaPacket(Object watcher) { + Class> DataWatcher = Util.getCraftClass("DataWatcher"); + + Class> PacketPlayOutEntityMetadata = Util.getCraftClass("PacketPlayOutEntityMetadata"); + + Object packet = null; + try { + packet = PacketPlayOutEntityMetadata.getConstructor(new Class>[] { int.class, DataWatcher, boolean.class }) + .newInstance(id, watcher, true); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return packet; + } + + @Override + public Object getTeleportPacket(Location loc) { + Class> PacketPlayOutEntityTeleport = Util.getCraftClass("PacketPlayOutEntityTeleport"); + Object packet = null; + + try { + packet = PacketPlayOutEntityTeleport + .getConstructor(new Class>[] { int.class, int.class, int.class, int.class, byte.class, byte.class, boolean.class, boolean.class }) + .newInstance(this.id, loc.getBlockX() * 32, loc.getBlockY() * 32, loc.getBlockZ() * 32, (byte) ((int) loc + .getYaw() * 256 / 360), (byte) ((int) loc.getPitch() * 256 / 360), false, false); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return packet; + } + + @Override + public Object getWatcher() { + Class> Entity = Util.getCraftClass("Entity"); + Class> DataWatcher = Util.getCraftClass("DataWatcher"); + + Object watcher = null; + try { + watcher = DataWatcher.getConstructor(new Class>[] { Entity }).newInstance(dragon); + Method a = Util.getMethod(DataWatcher, "a", new Class>[] { int.class, Object.class }); + + a.invoke(watcher, 5, isVisible() ? (byte) 0 : (byte) 0x20); + a.invoke(watcher, 6, (Float) health); + a.invoke(watcher, 7, (Integer) 0); + a.invoke(watcher, 8, (Byte) (byte) 0); + a.invoke(watcher, 10, name); + a.invoke(watcher, 11, (Byte) (byte) 1); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + + return watcher; + } } diff --git a/src/me/confuser/barapi/nms/v1_9.java b/src/me/confuser/barapi/nms/v1_9.java new file mode 100644 index 0000000..ef5a811 --- /dev/null +++ b/src/me/confuser/barapi/nms/v1_9.java @@ -0,0 +1,58 @@ +package me.confuser.barapi.nms; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; + +/** + * This is the FakeDragon class for BarAPI. + * It is based on the code by SoThatsIt. + *
+ * http://forums.bukkit.org/threads/tutorial-utilizing-the-boss-health-bar.158018/page-5#post-2053705 + * + * @author James Mortemore + */ + +public class v1_9 extends FakeDragon { + + private Object dragon; + private int id; + private BossBar bar; + + public v1_9(String name, Location loc) { + super(name, loc); + + bar = Bukkit.createBossBar(name, BarColor.PINK, BarStyle.SOLID); + } + + public BossBar getBar() { + return bar; + } + + @Override + public Object getSpawnPacket() { + return null; + } + + @Override + public Object getDestroyPacket() { + return null; + } + + @Override + public Object getMetaPacket(Object watcher) { + return null; + } + + @Override + public Object getTeleportPacket(Location loc) { + return null; + } + + @Override + public Object getWatcher() { + return null; + } +}