ClientReflectionUtils.java 3.4 KB

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