141 lines
3.9 KiB
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;
|
|
}
|
|
} |