Vinetos

ReflectionUtils

Mar 6th, 2016
351
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import org.bukkit.Bukkit;
  2. import org.bukkit.entity.Player;
  3. import org.bukkit.scoreboard.Scoreboard;
  4.  
  5. import java.lang.reflect.Array;
  6. import java.lang.reflect.Field;
  7. import java.lang.reflect.Method;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10.  
  11. /**
  12.  * The MIT License (MIT)
  13.  * Created on 27/01/2016.
  14.  * Updated on 06/03/2016
  15.  * Copyright (c) 2016 Vinetos
  16.  */
  17. public class Reflection {
  18.  
  19.     public static Class<?> getClass(String classname) {
  20.         try {
  21.             String version = getNmsVersion();
  22.             String path = classname.replace("{nms}", "net.minecraft.server."+version)
  23.                     .replace("{nm}", "net.minecraft."+version)
  24.                     .replace("{cb}", "org.bukkit.craftbukkit.."+version);
  25.             return Class.forName(path);
  26.         } catch (Throwable t) {
  27.             t.printStackTrace();
  28.             return null;
  29.         }
  30.     }
  31.  
  32.     public static Class[] getArrayClass(String classname, int arraySize) {
  33.         try {
  34.             String version = getNmsVersion();
  35.             String path = classname.replace("{nms}", "net.minecraft.server."+version)
  36.                     .replace("{nm}", "net.minecraft."+version)
  37.                     .replace("{cb}", "org.bukkit.craftbukkit.."+version);
  38.             return new Class[]{ Array.newInstance(getClass(classname), arraySize).getClass() };
  39.         } catch (Throwable t) {
  40.             t.printStackTrace();
  41.             return null;
  42.         }
  43.     }
  44.  
  45.     public static String getNmsVersion(){
  46.         return Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
  47.     }
  48.  
  49.     public static Object getNmsPlayer(Player p) throws Exception{
  50.         Method getHandle = p.getClass().getMethod("getHandle");
  51.         return getHandle.invoke(p);
  52.     }
  53.  
  54.     public static Object getNmsScoreboard(Scoreboard s) throws Exception {
  55.         Method getHandle = s.getClass().getMethod("getHandle");
  56.         return getHandle.invoke(s);
  57.     }
  58.  
  59.     public static Object getFieldValue(Object instance, String fieldName) throws Exception {
  60.         Field field = instance.getClass().getDeclaredField(fieldName);
  61.         field.setAccessible(true);
  62.         return field.get(instance);
  63.     }
  64.  
  65.     public static ArrayList<Field> getFields(Object instance, Class<?> fieldType) throws Exception {
  66.         Field[] fields = instance.getClass().getDeclaredFields();
  67.         ArrayList<Field> fieldArrayList = new ArrayList<Field>();
  68.         for(Field field : fields){
  69.             if(field.getType()  == fieldType){
  70.                 field.setAccessible(true);
  71.                 fieldArrayList.add(field);
  72.             }
  73.         }
  74.  
  75.         return fieldArrayList;
  76.     }
  77.  
  78.     public static ArrayList<Field> getArraysFields(Object instance, Class<?> fieldType) throws Exception {
  79.         String[] values = fieldType.toString().split(" ");
  80.         String fieldName = values[values.length - 1];
  81.         Field[] fields = instance.getClass().getDeclaredFields();
  82.         ArrayList<Field> fieldArrayList = new ArrayList<Field>();
  83.         for(Field field : fields) {
  84.             if (field.getType().isArray()) {
  85.                 if (field.getType().toString().contains(fieldName)) {
  86.                     field.setAccessible(true);
  87.                     fieldArrayList.add(field);
  88.                 }
  89.             }
  90.         }
  91.         return fieldArrayList;
  92.     }
  93.  
  94.  
  95.     @SuppressWarnings("unchecked")
  96.     public static <T> T getFieldValue(Field field, Object obj) {
  97.         try {
  98.             return (T) field.get(obj);
  99.         } catch (Exception e) {
  100.             e.printStackTrace();
  101.             return null;
  102.         }
  103.     }
  104.  
  105.     public static Field getField(Class<?> clazz, String fieldName) throws Exception {
  106.         Field field = clazz.getDeclaredField(fieldName);
  107.         field.setAccessible(true);
  108.         return field;
  109.     }
  110.  
  111.     public static void setFieldValue(Object instance, String field, Object value) {
  112.         try {
  113.             Field f = instance.getClass().getDeclaredField(field);
  114.             f.setAccessible(true);
  115.             f.set(instance, value);
  116.         } catch (Throwable t) {
  117.             t.printStackTrace();
  118.         }
  119.     }
  120.     public static void sendAllPacket(Object packet) throws Exception {
  121.         for (Player p : Bukkit.getOnlinePlayers()) {
  122.             Object nmsPlayer = getNmsPlayer(p);
  123.             Object connection = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
  124.             connection.getClass().getMethod("sendPacket", Reflection.getClass("{nms}.Packet")).invoke(connection, packet);
  125.         }
  126.     }
  127.     public static void sendListPacket(List<String> players, Object packet) {
  128.         try {
  129.             for (String name : players) {
  130.                 Object nmsPlayer = getNmsPlayer(Bukkit.getPlayer(name));
  131.                 Object connection = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
  132.                 connection.getClass().getMethod("sendPacket", Reflection.getClass("{nms}.Packet")).invoke(connection, packet);
  133.             }
  134.         } catch (Throwable t) {
  135.             t.printStackTrace();
  136.         }
  137.     }
  138.     public static void sendPlayerPacket(Player p, Object packet) throws Exception {
  139.         Object nmsPlayer = getNmsPlayer(p);
  140.         Object connection = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
  141.         connection.getClass().getMethod("sendPacket", Reflection.getClass("{nms}.Packet")).invoke(connection, packet);
  142.     }
  143.  
  144.     public static void sendMessage(Player p, Object message) throws Exception {
  145.         Object nmsPlayer = getNmsPlayer(p);
  146.         nmsPlayer.getClass().getMethod("sendMessage", Reflection.getClass("{nms}.IChatBaseComponent")).invoke(nmsPlayer, message);
  147.  
  148.     }
  149.  
  150.     public static void sendMessages(Player p, Object message) throws Exception {
  151.         Object nmsPlayer = getNmsPlayer(p);
  152.         Class c = Reflection.getClass("{nms}.IChatBaseComponent");
  153.         Method m = nmsPlayer.getClass().getMethod("sendMessage", new Class[]{ Array.newInstance(c, 4).getClass() });
  154.         m.invoke(nmsPlayer, new Object[]{message});
  155.  
  156.     }
  157.  
  158.     public static int ping(Player p) throws Exception {
  159.         Object nmsPlayer = Reflection.getNmsPlayer(p);
  160.         return Integer.valueOf(getFieldValue(nmsPlayer, "ping").toString());
  161.     }
  162.  
  163.     public static Field getFirstFieldByType(Class<?> clazz, Class<?> type) {
  164.         for(Field field : clazz.getDeclaredFields()) {
  165.             field.setAccessible(true);
  166.             if(field.getType() == type) {
  167.                 return field;
  168.             }
  169.         }
  170.         return null;
  171.     }
  172. }
Advertisement
Add Comment
Please, Sign In to add comment