package me.km.utils; import java.lang.reflect.Field; import java.util.Map; import java.util.UUID; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.passive.EntityVillager; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.PlayerCapabilities; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.server.management.PlayerList; import net.minecraft.util.FoodStats; import net.minecraftforge.fml.relauncher.ReflectionHelper; public class ReflectionUtils { // ----------------------------------------------------------------------------------- // helper stuff // ----------------------------------------------------------------------------------- private static Field getField(Class c, String... field) { try { return ReflectionHelper.findField(c, field); } catch(SecurityException | ReflectionHelper.UnableToFindFieldException ex) { System.out.println(String.join(", ", field) + " - " + ex); } return null; } private static void setInt(T t, Field f, int i) { try { f.setInt(t, i); } catch(SecurityException | IllegalArgumentException | IllegalAccessException | NullPointerException ex) { System.out.println(f + " - " + ex); } } private static int getInt(T t, Field f, int error) { try { return f.getInt(t); } catch(SecurityException | IllegalArgumentException | IllegalAccessException | NullPointerException ex) { System.out.println(f + " - " + ex); return error; } } private static void setFloat(T t, Field f, float fl) { try { f.setFloat(t, fl); } catch(SecurityException | IllegalArgumentException | IllegalAccessException | NullPointerException ex) { System.out.println(f + " - " + ex); } } private static float getFloat(T t, Field f, float error) { try { return f.getFloat(t); } catch(SecurityException | IllegalArgumentException | IllegalAccessException | NullPointerException ex) { System.out.println(f + " - " + ex); return error; } } private static T getFieldValue(Class cast, Object o, Field f) { try { return (T) f.get(o); } catch(SecurityException | IllegalAccessException | IllegalArgumentException ex) { System.out.println(f + " - " + ex); return null; } } // ----------------------------------------------------------------------------------- // villager stuff // ----------------------------------------------------------------------------------- private final static Field CARRER_LEVEL = getField(EntityVillager.class, "field_175562_bw", "careerLevel"); public static void setCareerLevel(EntityVillager v, int level) { setInt(v, CARRER_LEVEL, level); } // ----------------------------------------------------------------------------------- // food stats // ----------------------------------------------------------------------------------- private final static Field FOOD_EXHAUSTION_LEVEL = getField(FoodStats.class, "field_75126_c", "foodExhaustionLevel"); public static void setExhaustion(FoodStats stats, float f) { setFloat(stats, FOOD_EXHAUSTION_LEVEL, f); } public static float getExhaustion(FoodStats stats) { return getFloat(stats, FOOD_EXHAUSTION_LEVEL, 0); } private final static Field FOOD_SATURATION_LEVEL = getField(FoodStats.class, "field_75125_b", "foodSaturationLevel"); public static void setSaturation(FoodStats stats, float f) { setFloat(stats, FOOD_SATURATION_LEVEL, f); } public static float getSaturation(FoodStats stats) { return getFloat(stats, FOOD_SATURATION_LEVEL, 0); } // ----------------------------------------------------------------------------------- // player stats // ----------------------------------------------------------------------------------- private final static Field FLY_SPEED = getField(PlayerCapabilities.class, "field_75096_f", "flySpeed"); public static void setFlySpeed(PlayerCapabilities cap, float f) { setFloat(cap, FLY_SPEED, f); } private final static Field WALK_SPEED = getField(PlayerCapabilities.class, "field_75097_g", "walkSpeed"); public static void setWalkSpeed(PlayerCapabilities cap, float f) { setFloat(cap, WALK_SPEED, f); } // ----------------------------------------------------------------------------------- // random field gets // ----------------------------------------------------------------------------------- private final static Field TIME_IN_GROUND = getField(EntityArrow.class, "field_184552_b", "timeInGround"); public static int getArrowTimeInGround(EntityArrow arrow) { return getInt(arrow, TIME_IN_GROUND, 0); } private final static Field UUID_TO_PLAYER_MAP = getField(PlayerList.class, "field_177454_f", "uuidToPlayerMap"); public static Map getUuidToPlayerMap(PlayerList list) { return getFieldValue(Map.class, list, UUID_TO_PLAYER_MAP); } private final static Field ENTITY_ITEM_AGE = getField(EntityItem.class, "field_70292_b", "age"); public static int getAge(EntityItem item) { return getInt(item, UUID_TO_PLAYER_MAP, 0); } private final static Field BLOCK_MATERIAL = getField(Block.class, "field_149764_J", "blockMaterial"); public static Material getBlockMaterial(Block b) { return getFieldValue(Material.class, b, BLOCK_MATERIAL); } }