ClientReflectionUtils.java 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package me.km.utils;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.util.Map;
  6. import me.km.overrides.ModFluidBlockRenderer;
  7. import me.km.overrides.ModPlayerRenderer;
  8. import static me.km.utils.ReflectionUtils.getField;
  9. import static me.km.utils.ReflectionUtils.getMethod;
  10. import net.minecraft.client.Minecraft;
  11. import net.minecraft.client.gui.overlay.BossOverlayGui;
  12. import net.minecraft.client.renderer.BlockRendererDispatcher;
  13. import net.minecraft.client.renderer.entity.EntityRenderer;
  14. import net.minecraft.client.renderer.entity.EntityRendererManager;
  15. import net.minecraft.client.renderer.entity.LivingRenderer;
  16. import net.minecraft.client.renderer.entity.PlayerRenderer;
  17. import net.minecraft.entity.Entity;
  18. import net.minecraft.entity.LivingEntity;
  19. import net.minecraftforge.api.distmarker.Dist;
  20. import net.minecraftforge.api.distmarker.OnlyIn;
  21. import org.apache.logging.log4j.LogManager;
  22. @OnlyIn(Dist.CLIENT)
  23. public class ClientReflectionUtils
  24. {
  25. private final static Method CAN_RENDER_NAME = getMethod(LivingRenderer.class, "func_177070_b", LivingEntity.class);
  26. private final static Method RENDER_ENTITY_NAME = getMethod(EntityRenderer.class, "func_188296_a", Entity.class, double.class, double.class, double.class, String.class, double.class);
  27. public static boolean canRenderName(LivingRenderer lr, LivingEntity liv)
  28. {
  29. try
  30. {
  31. return (boolean) CAN_RENDER_NAME.invoke(lr, liv);
  32. }
  33. catch(Exception ex)
  34. {
  35. LogManager.getLogger().warn("canRenderName - " + ex);
  36. return false;
  37. }
  38. }
  39. public static void renderEntityName(LivingRenderer lr, LivingEntity liv, double x, double y, double z, String name, double distanceSq)
  40. {
  41. try
  42. {
  43. RENDER_ENTITY_NAME.invoke(lr, liv, x, y, z, name, distanceSq);
  44. }
  45. catch(Exception ex)
  46. {
  47. LogManager.getLogger().warn("renderEntityName - " + ex);
  48. }
  49. }
  50. private final static Field BOSS_BAR_MAP = getField(BossOverlayGui.class, "field_184060_g");
  51. public static boolean isRenderingBossBar()
  52. {
  53. return !ReflectionUtils.getFieldValue(Map.class, Minecraft.getInstance().ingameGUI.getBossOverlay(), BOSS_BAR_MAP).isEmpty();
  54. }
  55. private final static Field SKIN_MAP = getField(EntityRendererManager.class, "field_178636_l"); // skinMap
  56. private final static Field PLAYER_RENDERER = getField(EntityRendererManager.class, "field_178637_m"); // playerRenderer
  57. public static void updatePlayerRenderer()
  58. {
  59. EntityRendererManager erm = Minecraft.getInstance().getRenderManager();
  60. ModPlayerRenderer normal = new ModPlayerRenderer(erm, false);
  61. ModPlayerRenderer slim = new ModPlayerRenderer(erm, true);
  62. ReflectionUtils.setFieldValue(erm, PLAYER_RENDERER, normal);
  63. Map<String, PlayerRenderer> map =
  64. ReflectionUtils.getFieldValue(Map.class, erm, SKIN_MAP);
  65. map.put("default", normal);
  66. map.put("slim", slim);
  67. }
  68. private final static Field FLUID_RENDERER = getField(BlockRendererDispatcher.class, "field_175025_e"); // fluidRenderer
  69. public static void updateFluidRenderer()
  70. {
  71. ModFluidBlockRenderer mfbr = new ModFluidBlockRenderer();
  72. ReflectionUtils.setFieldValue(Minecraft.getInstance().getBlockRendererDispatcher(), FLUID_RENDERER, mfbr);
  73. }
  74. }