package eu.univento.core.api.utils.reflection; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Reflection { public static final Class CLASS_CRAFTITEMSTACK = getCraftBukkitClass("inventory.CraftItemStack"); public static final Method METHOD_ASNMSCOPY = getMethod(CLASS_CRAFTITEMSTACK, "asNMSCopy"); public static void sendPacket(Player p, Object packet) { try { Object nmsPlayer = getNMSPlayer(p); Object connection = nmsPlayer.getClass() .getField("playerConnection").get(nmsPlayer); connection.getClass() .getMethod("sendPacket", new Class[] { getNMSClass("Packet") }) .invoke(connection, new Object[] { packet }); } catch (Exception e) { e.printStackTrace(); } } public static Field getField(Class clazz, String field) { Field re = null; try { re = clazz.getDeclaredField(field); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } return re; } public static void sendPacket(Player p, String packetName, Class[] parameterclass, Object[] parameters) { try { Object nmsPlayer = getNMSPlayer(p); Object connection = nmsPlayer.getClass() .getField("playerConnection").get(nmsPlayer); Object packet = Class.forName( nmsPlayer.getClass().getPackage().getName() + "." + packetName) .getConstructor(parameterclass).newInstance(parameters); connection.getClass() .getMethod("sendPacket", new Class[] { getNMSClass("Packet") }) .invoke(connection, new Object[] { packet }); } catch (Exception e) { e.printStackTrace(); } } 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 getCraftBukkitClass(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 asNMSCopy(ItemStack i) throws IllegalAccessException, InvocationTargetException { Object re = null; try { METHOD_ASNMSCOPY.invoke(null, new Object[] { i }); } catch (java.lang.IllegalArgumentException e) { e.printStackTrace(); } return re; } public static Field getField(Field f) { f.setAccessible(true); return f; } public static Constructor getConstructor(Class clazz, Class[] param) { Constructor re = null; try { re = clazz.getConstructor(param); } catch (Exception e) { e.printStackTrace(); } return re; } public static Object getHandle(Entity entity) { Object object = null; try { object = getMethod(entity.getClass(), "getHandle").invoke(entity, new Object[0]); } catch (Exception e) { e.printStackTrace(); } return object; } public static Object getNMSPlayer(Player player) { return getHandle(player); } public static Method getMethod(Class c, String methodName) { Method returnMethod = null; for (Method m : c.getDeclaredMethods()) { if (m.getName().equals(methodName)) { returnMethod = m; } } return returnMethod; } }