Advertisement
Guest User

Reflections

a guest
May 30th, 2015
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4.  
  5. import org.bukkit.Bukkit;
  6. import org.bukkit.World;
  7. import org.bukkit.entity.Entity;
  8. import org.bukkit.entity.Player;
  9.  
  10. public class Reflections {
  11.    
  12.     public static String cbVer() {
  13.         return "org.bukkit.craftbukkit."+ver()+".";
  14.     }
  15.     public static String nmsVer() {
  16.         return "net.minecraft.server."+ver()+".";
  17.     }
  18.     public static String ver() {
  19.         String pkg = Bukkit.getServer().getClass().getPackage().getName();
  20.         return pkg.substring(pkg.lastIndexOf(".") + 1);
  21.     }
  22.    
  23.     public static Class<?> wrapperToPrimitive(Class<?> clazz) {
  24.         if(clazz == Boolean.class) return boolean.class;
  25.         if(clazz == Integer.class) return int.class;
  26.         if(clazz == Double.class) return double.class;
  27.         if(clazz == Float.class) return float.class;
  28.         if(clazz == Long.class) return long.class;
  29.         if(clazz == Short.class) return short.class;
  30.         if(clazz == Byte.class) return byte.class;
  31.         if(clazz == Void.class) return void.class;
  32.         if(clazz == Character.class) return char.class;
  33.         return clazz;
  34.     }
  35.     public static Class<?>[] toParamTypes(Object... params) {
  36.         Class<?>[] classes = new Class<?>[params.length];
  37.         for(int i = 0; i < params.length; i++)
  38.             classes[i] = wrapperToPrimitive(params[i].getClass());
  39.         return classes;
  40.     }
  41.     public static Object getHandle(Entity e) {
  42.         return callMethod(e, "getHandle");
  43.     }
  44.     public static Object getHandle(World w) {
  45.         return callMethod(w, "getHandle");
  46.     }
  47.    
  48.     public static Object playerConnection(Player p) {
  49.         return playerConnection(getHandle(p));
  50.     }
  51.     public static Object playerConnection(Object handle) {
  52.         return getDeclaredField(handle, "playerConnection");
  53.     }
  54.    
  55.     public static void sendPacket(Player p, Object packet) {
  56.         Object pc = playerConnection(p);
  57.         try {
  58.             pc.getClass().getMethod("sendPacket", getNMSClass("Packet")).invoke(pc, packet);
  59.         } catch(Exception e) {
  60.             e.printStackTrace();
  61.         }
  62.     }
  63.    
  64.     public static Object getPacket(String name, Object... params) {
  65.         return callDeclaredConstructor(getNMSClass(name), params);
  66.     }
  67.  
  68.     public static void sendJson(Player p, String json) {
  69.         Object comp = callDeclaredMethod(getNMSClass("ChatSerializer"),
  70.                 "a", json);
  71.         sendPacket(p, getPacket("PacketPlayOutChat", comp, true));
  72.     }
  73.     public static Class<?> getClass(String name) {
  74.         try {
  75.             return Class.forName(name);
  76.         } catch(Exception e) {
  77.             return null;
  78.         }
  79.     }
  80.     public static Class<?> getNMSClass(String name) {
  81.         return getClass(nmsVer()+name);
  82.     }
  83.     public static Class<?> getCBClass(String name) {
  84.         return getClass(cbVer()+name);
  85.     }
  86.    
  87.     public static Object callDeclaredMethod(Object object, String method, Object... params) {
  88.         try {
  89.             Method m = object.getClass().getDeclaredMethod(method, toParamTypes(params));
  90.             m.setAccessible(true);
  91.             return m.invoke(object, params);
  92.             } catch(Exception e) {
  93.                 e.printStackTrace();
  94.                 return null;
  95.             }
  96.     }
  97.     public static Object callMethod(Object object, String method, Object... params) {
  98.         try {
  99.             Method m = object.getClass().getMethod(method, toParamTypes(params));
  100.             m.setAccessible(true);
  101.             return m.invoke(object, params);
  102.             } catch(Exception e) {
  103.                 e.printStackTrace();
  104.                 return null;
  105.             }
  106.     }
  107.     public static Object callDeclaredConstructor(Class<?> clazz, Object... params) {
  108.         try {
  109.             Constructor<?> con = clazz.getDeclaredConstructor(toParamTypes(params));
  110.             con.setAccessible(true);
  111.             return con.newInstance(params);
  112.             } catch(Exception e) {
  113.                 e.printStackTrace();
  114.                 return null;
  115.             }
  116.     }
  117.     public static Object callConstructor(Class<?> clazz, Object... params) {
  118.         try {
  119.             Constructor<?> con = clazz.getConstructor(toParamTypes(params));
  120.             con.setAccessible(true);
  121.             return con.newInstance(params);
  122.             } catch(Exception e) {
  123.                 e.printStackTrace();
  124.                 return null;
  125.             }
  126.     }
  127.  
  128.     public static Object getDeclaredField(Object object, String field) {
  129.         try {
  130.         Field f = object.getClass().getDeclaredField(field);
  131.         f.setAccessible(true);
  132.         return f.get(object);
  133.         } catch(Exception e) {
  134.             e.printStackTrace();
  135.             return null;
  136.         }
  137.     }
  138.     public static Object getField(Object object, String field) {
  139.         try {
  140.         Field f = object.getClass().getField(field);
  141.         f.setAccessible(true);
  142.         return f.get(object);
  143.         } catch(Exception e) {
  144.             e.printStackTrace();
  145.             return null;
  146.         }
  147.     }
  148.     public static void setDeclaredField(Object object, String field, Object value) {
  149.         try {
  150.             Field f = object.getClass().getDeclaredField(field);
  151.             f.setAccessible(true);
  152.             f.set(object, value);
  153.         } catch(Exception e) {
  154.             e.printStackTrace();
  155.         }
  156.     }  
  157.     public static void setField(Object object, String field, Object value) {
  158.         try {
  159.             Field f = object.getClass().getField(field);
  160.             f.setAccessible(true);
  161.             f.set(object, value);
  162.         } catch(Exception e) {
  163.             e.printStackTrace();
  164.         }
  165.     }  
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement