package eu.univento.core.api.utils; 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.Location; import org.bukkit.entity.Player; public class FakeDragon { private static Constructor packetPlayOutSpawnEntityLiving; private static Constructor entityEnderdragon; private static Method setLocation; private static Method setCustomName; private static Method setHealth; private static Method setInvisible; private static Method getWorldHandle; private static Method getPlayerHandle; private static Field playerConnection; private static Method sendPacket; private static Method getDatawatcher; private static Method a; private static Field d; public static Map playerDragons = new HashMap(); public static Map playerTextDragon = new HashMap(); static { try { packetPlayOutSpawnEntityLiving = getMCClass("PacketPlayOutSpawnEntityLiving").getConstructor(new Class[] { getMCClass("EntityLiving") }); entityEnderdragon = getMCClass("EntityEnderDragon").getConstructor(new Class[] { getMCClass("World") }); setLocation = getMCClass("EntityEnderDragon").getMethod("setLocation", new Class[] { Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE }); setCustomName = getMCClass("EntityEnderDragon").getMethod("setCustomName", new Class[] { String.class }); setHealth = getMCClass("EntityEnderDragon").getMethod("setHealth", new Class[] { Float.TYPE }); setInvisible = getMCClass("EntityEnderDragon").getMethod("setInvisible", new Class[] { Boolean.TYPE }); getWorldHandle = getCraftClass("CraftWorld").getMethod("getHandle", new Class[0]); getPlayerHandle = getCraftClass("entity.CraftPlayer").getMethod("getHandle", new Class[0]); playerConnection = getMCClass("EntityPlayer").getDeclaredField("playerConnection"); sendPacket = getMCClass("PlayerConnection").getMethod("sendPacket", new Class[] { getMCClass("Packet") }); getDatawatcher = getMCClass("EntityEnderDragon").getMethod("getDataWatcher", new Class[0]); a = getMCClass("DataWatcher").getMethod("a", new Class[] { Integer.TYPE, Object.class }); d = getMCClass("DataWatcher").getDeclaredField("d"); d.setAccessible(true); } catch (Exception e) { e.printStackTrace(); } } public static Object getEnderDragon(Player p) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException { if (playerDragons.containsKey(p.getName())) { return playerDragons.get(p.getName()); } Object nms_world = getWorldHandle.invoke(p.getWorld(), new Object[0]); playerDragons.put(p.getName(), entityEnderdragon.newInstance(new Object[] { nms_world })); return getEnderDragon(p); } public static void setBossBartext(Player p, String text) { playerTextDragon.put(p.getName(), text); try { Object nms_dragon = getEnderDragon(p); setLocation.invoke(nms_dragon, new Object[] { Double.valueOf(getPlayerLoc(p).getX()), Double.valueOf(getPlayerLoc(p).getY() + 800.0D), Double.valueOf(getPlayerLoc(p).getZ()), Float.valueOf(0.0F), Float.valueOf(0.0F) }); setCustomName.invoke(nms_dragon, new Object[] { text }); setHealth.invoke(nms_dragon, new Object[] { Integer.valueOf(200) }); setInvisible.invoke(nms_dragon, new Object[] { Boolean.valueOf(true) }); changeWatcher(nms_dragon, text); Object nms_packet = packetPlayOutSpawnEntityLiving.newInstance(new Object[] { nms_dragon }); Object nms_player = getPlayerHandle.invoke(p, new Object[0]); Object nms_connection = playerConnection.get(nms_player); sendPacket.invoke(nms_connection, new Object[] { nms_packet }); } catch (Exception e) { e.printStackTrace(); } } public static void setBossBar(Player p, String text, float vie) { playerTextDragon.put(p.getName(), text); try { Object nms_dragon = getEnderDragon(p); setLocation.invoke(nms_dragon, new Object[] { Double.valueOf(getPlayerLoc(p).getX()), Double.valueOf(getPlayerLoc(p).getY() + 800.0D), Double.valueOf(getPlayerLoc(p).getZ()), Float.valueOf(0.0F), Float.valueOf(0.0F) }); setCustomName.invoke(nms_dragon, new Object[] { text }); setHealth.invoke(nms_dragon, new Object[] { Float.valueOf(vie) }); setInvisible.invoke(nms_dragon, new Object[] { Boolean.valueOf(true) }); changeWatcher(nms_dragon, text); Object nms_packet = packetPlayOutSpawnEntityLiving.newInstance(new Object[] { nms_dragon }); Object nms_player = getPlayerHandle.invoke(p, new Object[0]); Object nms_connection = playerConnection.get(nms_player); sendPacket.invoke(nms_connection, new Object[] { nms_packet }); } catch (Exception e) { e.printStackTrace(); } } public static void removeBossBar(Player p) { playerTextDragon.remove(p.getName()); try { Object nms_dragon = getEnderDragon(p); setLocation.invoke(nms_dragon, new Object[] { Double.valueOf(p.getLocation().getX()), Integer.valueOf(-5000), Double.valueOf(p.getLocation().getZ()), Float.valueOf(0.0F), Float.valueOf(0.0F) }); setCustomName.invoke(nms_dragon, new Object[] { " " }); setHealth.invoke(nms_dragon, new Object[] { Integer.valueOf(0) }); setInvisible.invoke(nms_dragon, new Object[] { Boolean.valueOf(true) }); changeWatcher(nms_dragon, " "); Object nms_packet = packetPlayOutSpawnEntityLiving.newInstance(new Object[] { nms_dragon }); Object nms_player = getPlayerHandle.invoke(p, new Object[0]); Object nms_connection = playerConnection.get(nms_player); sendPacket.invoke(nms_connection, new Object[] { nms_packet }); } catch (Exception e) { e.printStackTrace(); } } public void removehorligneD(Player p) { playerDragons.remove(p.getName()); playerTextDragon.remove(p.getName()); } private static void changeWatcher(Object nms_entity, String text) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { Object nms_watcher = getDatawatcher.invoke(nms_entity, new Object[0]); Map map = (Map)d.get(nms_watcher); map.remove(Integer.valueOf(10)); a.invoke(nms_watcher, new Object[] { Integer.valueOf(10), text }); } private static Class getMCClass(String name) throws ClassNotFoundException { String version = org.bukkit.Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + "."; String className = "net.minecraft.server." + version + name; return Class.forName(className); } private static Class getCraftClass(String name) throws ClassNotFoundException { String version = org.bukkit.Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + "."; String className = "org.bukkit.craftbukkit." + version + name; return Class.forName(className); } public static String getCardinalDirection(Player player) { double rotation = (player.getLocation().getYaw() - 180.0F) % 360.0F; if (rotation < 0.0D) { rotation += 360.0D; } if ((0.0D <= rotation) && (rotation < 22.5D)) return "N"; if ((22.5D <= rotation) && (rotation < 67.5D)) return "NE"; if ((67.5D <= rotation) && (rotation < 112.5D)) return "E"; if ((112.5D <= rotation) && (rotation < 157.5D)) return "SE"; if ((157.5D <= rotation) && (rotation < 202.5D)) return "S"; if ((202.5D <= rotation) && (rotation < 247.5D)) return "SW"; if ((247.5D <= rotation) && (rotation < 292.5D)) return "W"; if ((292.5D <= rotation) && (rotation < 337.5D)) return "NW"; if ((337.5D <= rotation) && (rotation < 360.0D)) { return "N"; } return null; } public static Location getPlayerLoc(Player p) { Location loc = p.getLocation(); String str; switch ((str = getCardinalDirection(p)).hashCode()) { case 69: if (!str.equals("E")) break; break; case 78: case 83: if ((!str.equals("N")) || (goto 284) || (!str.equals("S"))) break; break; case 87: case 2487: if ((!str.equals("W")) || (goto 284) || (!str.equals("NE"))) break; break; case 2505: case 2642: if ((!str.equals("NW")) || (goto 284) || (!str.equals("SE"))) break; break; case 2660: if (!str.equals("SW")) { loc.add(0.0D, 0.0D, -150.0D); loc.add(150.0D, 0.0D, 0.0D); loc.add(0.0D, 0.0D, 150.0D); loc.add(-150.0D, 0.0D, 0.0D); loc.add(150.0D, 0.0D, -150.0D); loc.add(150.0D, 0.0D, 150.0D); loc.add(-150.0D, 0.0D, -150.0D); } else { loc.add(-150.0D, 0.0D, 150.0D); } } return loc; } }