Core/src/eu/univento/core/api/utils/reflection/Reflection.java

141 lines
3.9 KiB
Java

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;
}
}