2018-09-13 12:03:28 -04:00
|
|
|
package noppes.npcs.client;
|
|
|
|
|
|
2024-04-08 13:44:42 -04:00
|
|
|
import cpw.mods.fml.common.eventhandler.EventPriority;
|
2022-01-30 04:05:01 -06:00
|
|
|
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
2022-05-20 05:02:18 -05:00
|
|
|
import net.minecraft.client.Minecraft;
|
2024-04-08 13:44:42 -04:00
|
|
|
import net.minecraft.client.entity.AbstractClientPlayer;
|
2024-09-24 18:13:49 -05:00
|
|
|
import net.minecraft.client.entity.EntityClientPlayerMP;
|
2023-01-19 00:00:03 -06:00
|
|
|
import net.minecraft.client.model.ModelBase;
|
2024-04-01 00:15:43 -05:00
|
|
|
import net.minecraft.client.model.ModelBiped;
|
2023-01-19 00:00:03 -06:00
|
|
|
import net.minecraft.client.model.ModelRenderer;
|
2024-09-24 18:13:49 -05:00
|
|
|
import net.minecraft.client.renderer.entity.Render;
|
2022-06-15 03:48:32 -05:00
|
|
|
import net.minecraft.client.renderer.entity.RenderManager;
|
2023-01-09 21:08:22 -06:00
|
|
|
import net.minecraft.client.renderer.entity.RendererLivingEntity;
|
2025-02-12 13:16:39 -06:00
|
|
|
import net.minecraft.entity.Entity;
|
2022-06-15 03:48:32 -05:00
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
2024-04-01 00:15:43 -05:00
|
|
|
import net.minecraft.util.ResourceLocation;
|
2025-02-12 13:16:39 -06:00
|
|
|
import net.minecraftforge.client.event.*;
|
2022-01-30 04:05:01 -06:00
|
|
|
import noppes.npcs.client.gui.customoverlay.OverlayCustom;
|
2025-02-23 04:58:41 -05:00
|
|
|
import noppes.npcs.client.gui.hud.ClientHudManager;
|
2025-02-23 05:58:56 -05:00
|
|
|
import noppes.npcs.client.gui.hud.CompassHudComponent;
|
2025-02-23 04:58:41 -05:00
|
|
|
import noppes.npcs.client.gui.hud.EnumHudComponent;
|
|
|
|
|
import noppes.npcs.client.gui.hud.QuestTrackingComponent;
|
2024-02-21 03:02:39 -05:00
|
|
|
import noppes.npcs.client.renderer.MarkRenderer;
|
2022-05-20 05:02:18 -05:00
|
|
|
import noppes.npcs.client.renderer.RenderCNPCPlayer;
|
2023-01-17 13:08:10 -06:00
|
|
|
import noppes.npcs.constants.EnumAnimationPart;
|
2024-02-21 03:02:39 -05:00
|
|
|
import noppes.npcs.constants.MarkType;
|
2025-02-20 21:40:39 -05:00
|
|
|
import noppes.npcs.controllers.data.FramePart;
|
|
|
|
|
import noppes.npcs.controllers.data.MarkData;
|
|
|
|
|
import noppes.npcs.controllers.data.PlayerData;
|
2023-01-09 21:08:22 -06:00
|
|
|
import noppes.npcs.entity.EntityNPCInterface;
|
2018-09-13 12:03:28 -04:00
|
|
|
|
2023-01-18 21:28:16 -06:00
|
|
|
import java.lang.reflect.Field;
|
2024-09-24 18:13:49 -05:00
|
|
|
import java.util.*;
|
2022-06-13 17:21:02 -05:00
|
|
|
|
2022-01-30 04:05:01 -06:00
|
|
|
public class ClientEventHandler {
|
2024-04-08 13:44:42 -04:00
|
|
|
public static final RenderCNPCPlayer renderCNPCSelf = new RenderCNPCPlayer();
|
2022-08-31 07:53:35 -05:00
|
|
|
public static final RenderCNPCPlayer renderCNPCPlayer = new RenderCNPCPlayer();
|
2025-03-13 17:14:45 -04:00
|
|
|
public static HashMap<Integer, Long> disabledButtonTimes = new HashMap<>();
|
2022-08-31 07:53:35 -05:00
|
|
|
public static float partialHandTicks;
|
2024-02-08 01:31:54 -06:00
|
|
|
public static boolean firstPersonAnimation;
|
2024-04-01 00:15:43 -05:00
|
|
|
public static ModelBiped firstPersonModel;
|
|
|
|
|
|
|
|
|
|
public static final ResourceLocation steveTextures = new ResourceLocation("textures/entity/steve.png");
|
|
|
|
|
public static final ResourceLocation fem = new ResourceLocation("jinryuufamilyc:fem.png");
|
2022-06-13 17:21:02 -05:00
|
|
|
|
2022-12-31 18:47:13 -06:00
|
|
|
public static float partialRenderTick;
|
2023-01-18 21:28:16 -06:00
|
|
|
public static RendererLivingEntity renderer;
|
|
|
|
|
|
2023-01-09 21:08:22 -06:00
|
|
|
public static EntityNPCInterface renderingNpc;
|
2022-12-31 18:47:13 -06:00
|
|
|
public static EntityPlayer renderingPlayer;
|
2025-03-13 17:14:45 -04:00
|
|
|
public static HashMap<EnumAnimationPart, String[]> partNames = new HashMap<>();
|
|
|
|
|
public static HashMap<Class<?>, Field[]> declaredFieldCache = new HashMap<>();
|
2022-12-31 18:47:13 -06:00
|
|
|
|
2024-09-24 18:13:49 -05:00
|
|
|
private static final HashSet<Render> processedPlayerRenderers = new HashSet<>();
|
2025-03-13 17:14:45 -04:00
|
|
|
public static final HashMap<ModelRenderer, FramePart> originalValues = new HashMap<>();
|
2023-01-19 00:00:03 -06:00
|
|
|
public static ModelBase playerModel;
|
|
|
|
|
|
2024-09-11 04:02:04 -03:00
|
|
|
private Class<?> renderPlayerJBRA;
|
|
|
|
|
|
|
|
|
|
public ClientEventHandler() {
|
|
|
|
|
try {
|
|
|
|
|
renderPlayerJBRA = Class.forName("JinRyuu.JBRA.RenderPlayerJBRA");
|
|
|
|
|
} catch (ClassNotFoundException e) {
|
|
|
|
|
renderPlayerJBRA = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-13 17:21:02 -05:00
|
|
|
@SubscribeEvent
|
|
|
|
|
public void onMouse(MouseEvent event) {
|
|
|
|
|
if (Minecraft.getMinecraft().currentScreen != null)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
ArrayList<Integer> removeList = new ArrayList<>();
|
2025-03-13 17:14:45 -04:00
|
|
|
for (Map.Entry<Integer, Long> entry : disabledButtonTimes.entrySet()) {
|
2022-06-13 17:21:02 -05:00
|
|
|
if (entry.getValue() > 0) {
|
|
|
|
|
if (entry.getKey() == event.button || entry.getKey() == -1) {
|
|
|
|
|
event.setCanceled(true);
|
|
|
|
|
}
|
|
|
|
|
disabledButtonTimes.put(entry.getKey(), entry.getValue() - 1);
|
|
|
|
|
} else {
|
|
|
|
|
removeList.add(entry.getKey());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i : removeList) {
|
|
|
|
|
disabledButtonTimes.remove(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-05-20 05:02:18 -05:00
|
|
|
|
2022-01-30 04:05:01 -06:00
|
|
|
@SubscribeEvent
|
2025-03-13 17:14:45 -04:00
|
|
|
public void onOverlayRender(RenderGameOverlayEvent.Post event) {
|
|
|
|
|
if (event.type == RenderGameOverlayEvent.ElementType.ALL) {
|
2023-06-05 18:50:41 -05:00
|
|
|
for (OverlayCustom overlayCustom : ClientCacheHandler.customOverlays.values()) {
|
2022-01-30 13:29:00 -06:00
|
|
|
overlayCustom.renderGameOverlay(event.partialTicks);
|
|
|
|
|
}
|
2022-05-27 14:32:24 -05:00
|
|
|
|
2025-03-13 17:14:45 -04:00
|
|
|
if (ClientHudManager.getInstance().getHudComponents().isEmpty()) {
|
2025-02-23 04:58:41 -05:00
|
|
|
ClientHudManager.getInstance().registerHud(EnumHudComponent.QuestTracker, new QuestTrackingComponent(Minecraft.getMinecraft()));
|
2025-02-23 05:58:56 -05:00
|
|
|
ClientHudManager.getInstance().registerHud(EnumHudComponent.QuestCompass, new CompassHudComponent(Minecraft.getMinecraft()));
|
2022-05-27 14:32:24 -05:00
|
|
|
}
|
2025-02-23 04:58:41 -05:00
|
|
|
|
|
|
|
|
ClientHudManager.getInstance().renderAllHUDs(event.partialTicks);
|
2022-01-30 04:05:01 -06:00
|
|
|
}
|
|
|
|
|
}
|
2022-05-20 05:02:18 -05:00
|
|
|
|
2023-01-09 21:08:22 -06:00
|
|
|
@SubscribeEvent
|
|
|
|
|
public void onRenderEntity(RenderLivingEvent.Pre event) {
|
|
|
|
|
if (event.entity instanceof EntityNPCInterface) {
|
2025-03-31 22:52:08 -05:00
|
|
|
ClientEventHandler.renderingPlayer = null;
|
2023-01-09 21:08:22 -06:00
|
|
|
ClientEventHandler.renderingNpc = (EntityNPCInterface) event.entity;
|
|
|
|
|
}
|
|
|
|
|
ClientEventHandler.renderer = event.renderer;
|
|
|
|
|
ClientEventHandler.partialRenderTick = Minecraft.getMinecraft().timer.renderPartialTicks;
|
2024-09-24 18:13:49 -05:00
|
|
|
|
2025-02-12 13:16:39 -06:00
|
|
|
this.setOriginalPlayerParts(event.entity);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@SubscribeEvent
|
|
|
|
|
public void renderHand(RenderHandEvent event) {
|
|
|
|
|
this.setOriginalPlayerParts(Minecraft.getMinecraft().thePlayer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void setOriginalPlayerParts(Entity entity) {
|
|
|
|
|
if (entity instanceof EntityClientPlayerMP) {
|
|
|
|
|
Render render = RenderManager.instance.getEntityClassRenderObject(entity.getClass());
|
2024-09-24 18:13:49 -05:00
|
|
|
if (!processedPlayerRenderers.contains(render)) {
|
|
|
|
|
processedPlayerRenderers.add(render);
|
|
|
|
|
Collection<ModelRenderer> modelRenderers = getAllModelRenderers(render);
|
|
|
|
|
for (ModelRenderer modelRenderer : modelRenderers) {
|
|
|
|
|
if (!ClientEventHandler.originalValues.containsKey(modelRenderer)) {
|
|
|
|
|
FramePart part = new FramePart();
|
|
|
|
|
part.pivot = new float[]{modelRenderer.rotationPointX, modelRenderer.rotationPointY, modelRenderer.rotationPointZ};
|
|
|
|
|
part.rotation = new float[]{modelRenderer.rotateAngleX, modelRenderer.rotateAngleY, modelRenderer.rotateAngleZ};
|
|
|
|
|
ClientEventHandler.originalValues.put(modelRenderer, part);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-01-09 21:08:22 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@SubscribeEvent
|
|
|
|
|
public void onRenderEntity(RenderLivingEvent.Post event) {
|
|
|
|
|
if (event.entity instanceof EntityNPCInterface) {
|
2024-02-21 03:02:39 -05:00
|
|
|
MarkData markData = MarkData.get((EntityNPCInterface) event.entity);
|
|
|
|
|
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
|
2025-03-13 17:14:45 -04:00
|
|
|
if (PlayerData.get(player) != null) {
|
|
|
|
|
for (MarkData.Mark m : markData.marks) {
|
|
|
|
|
if (m.getType() != MarkType.NONE && m.availability.isAvailable(player)) {
|
2024-03-07 22:31:29 -05:00
|
|
|
MarkRenderer.render(event.entity, event.x, event.y, event.z, m);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-02-21 03:02:39 -05:00
|
|
|
}
|
|
|
|
|
}
|
2023-01-19 00:00:03 -06:00
|
|
|
} else if (event.entity instanceof EntityPlayer) {
|
2025-03-13 17:14:45 -04:00
|
|
|
for (Map.Entry<ModelRenderer, FramePart> entry : ClientEventHandler.originalValues.entrySet()) {
|
2023-01-23 18:47:23 -06:00
|
|
|
ModelRenderer renderer = entry.getKey();
|
|
|
|
|
FramePart part = entry.getValue();
|
|
|
|
|
renderer.rotateAngleX = part.rotation[0];
|
|
|
|
|
renderer.rotateAngleY = part.rotation[1];
|
|
|
|
|
renderer.rotateAngleZ = part.rotation[2];
|
|
|
|
|
renderer.rotationPointX = part.pivot[0];
|
|
|
|
|
renderer.rotationPointY = part.pivot[1];
|
|
|
|
|
renderer.rotationPointZ = part.pivot[2];
|
2023-01-19 00:00:03 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ClientEventHandler.playerModel = null;
|
2023-01-16 13:53:15 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ClientEventHandler.renderingNpc = null;
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-31 18:47:13 -06:00
|
|
|
@SubscribeEvent
|
|
|
|
|
public void onRenderPlayer(RenderPlayerEvent.Pre event) {
|
2025-03-31 22:52:08 -05:00
|
|
|
ClientEventHandler.renderingNpc = null;
|
2023-01-06 23:47:55 -06:00
|
|
|
ClientEventHandler.renderingPlayer = event.entityPlayer;
|
2022-12-31 18:47:13 -06:00
|
|
|
}
|
|
|
|
|
|
2025-03-13 17:14:45 -04:00
|
|
|
@SubscribeEvent(priority = EventPriority.LOWEST)
|
|
|
|
|
public void pre(RenderPlayerEvent.Pre event) {
|
|
|
|
|
if (!(event.entity instanceof AbstractClientPlayer))
|
2024-04-08 13:44:42 -04:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-20 05:02:18 -05:00
|
|
|
@SubscribeEvent
|
|
|
|
|
public void onRenderPlayer(RenderPlayerEvent.Post event) {
|
2023-01-05 18:18:28 -06:00
|
|
|
EntityPlayer player = event.entityPlayer;
|
2022-12-31 18:47:13 -06:00
|
|
|
ClientEventHandler.renderingPlayer = null;
|
|
|
|
|
|
2025-04-21 03:08:42 -04:00
|
|
|
if (hasOverlays(player)) {
|
|
|
|
|
if (renderPlayerJBRA != null && renderPlayerJBRA.isInstance(event.renderer))
|
2024-09-11 04:02:04 -03:00
|
|
|
return;
|
2022-07-03 15:06:37 -05:00
|
|
|
|
|
|
|
|
if (!(event.renderer instanceof RenderCNPCPlayer)) {
|
2024-04-08 20:59:42 -04:00
|
|
|
renderCNPCPlayer.mainModel = event.renderer.mainModel;
|
|
|
|
|
renderCNPCPlayer.modelBipedMain = event.renderer.modelBipedMain;
|
|
|
|
|
renderCNPCPlayer.modelArmor = event.renderer.modelArmor;
|
|
|
|
|
renderCNPCPlayer.modelArmorChestplate = event.renderer.modelArmorChestplate;
|
2022-07-03 15:06:37 -05:00
|
|
|
renderCNPCPlayer.tempRenderPartialTicks = event.partialRenderTick;
|
2023-01-05 18:18:28 -06:00
|
|
|
double d0 = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) event.partialRenderTick - RenderManager.renderPosX;
|
|
|
|
|
double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) event.partialRenderTick - RenderManager.renderPosY;
|
|
|
|
|
double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double) event.partialRenderTick - RenderManager.renderPosZ;
|
|
|
|
|
float f1 = player.prevRotationYaw + (player.rotationYaw - player.prevRotationYaw) * event.partialRenderTick;
|
2022-07-03 15:06:37 -05:00
|
|
|
|
2023-01-05 18:18:28 -06:00
|
|
|
if (Minecraft.getMinecraft().thePlayer.equals(player)) {
|
2022-07-03 15:06:37 -05:00
|
|
|
d0 = 0;
|
|
|
|
|
d1 = 0;
|
|
|
|
|
d2 = 0;
|
|
|
|
|
}
|
2022-06-15 03:48:32 -05:00
|
|
|
|
2023-01-05 18:18:28 -06:00
|
|
|
renderCNPCPlayer.doRender(player, d0, d1, d2, f1, event.partialRenderTick);
|
2022-07-03 15:06:37 -05:00
|
|
|
}
|
2022-05-20 05:02:18 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-21 20:00:45 -05:00
|
|
|
@SubscribeEvent
|
2022-06-13 00:47:39 -05:00
|
|
|
public void cancelSpecials(RenderPlayerEvent.Specials.Pre event) {
|
|
|
|
|
if (event.renderer instanceof RenderCNPCPlayer) {
|
2022-05-29 19:51:03 -05:00
|
|
|
event.setCanceled(true);
|
2022-06-13 00:47:39 -05:00
|
|
|
}
|
2022-05-29 19:51:03 -05:00
|
|
|
}
|
|
|
|
|
|
2022-07-01 00:42:23 -05:00
|
|
|
@SubscribeEvent
|
|
|
|
|
public void tryRenderDBC(RenderPlayerEvent.Specials.Post event) {
|
2025-04-21 03:08:42 -04:00
|
|
|
if (!hasOverlays(event.entityPlayer)) {
|
2024-09-11 04:02:04 -03:00
|
|
|
return;
|
|
|
|
|
}
|
2022-07-03 15:06:37 -05:00
|
|
|
|
2025-04-21 03:10:23 -04:00
|
|
|
if (renderPlayerJBRA == null || !renderPlayerJBRA.isInstance(event.renderer)) {
|
2024-09-11 04:02:04 -03:00
|
|
|
return;
|
2022-07-03 15:06:37 -05:00
|
|
|
}
|
2024-09-11 04:02:04 -03:00
|
|
|
|
|
|
|
|
renderCNPCPlayer.renderDBCModel(event);
|
2022-07-01 00:42:23 -05:00
|
|
|
}
|
|
|
|
|
|
2022-08-31 07:53:35 -05:00
|
|
|
public static boolean hasOverlays(EntityPlayer player) {
|
2024-04-08 04:35:03 -04:00
|
|
|
return ClientCacheHandler.skinOverlays.containsKey(player.getUniqueID()) && !ClientCacheHandler.skinOverlays.get(player.getUniqueID()).values().isEmpty();
|
2022-07-03 15:06:37 -05:00
|
|
|
}
|
2024-09-24 18:13:49 -05:00
|
|
|
|
|
|
|
|
// Function to recursively get all ModelRenderer objects from a given object
|
|
|
|
|
public static Collection<ModelRenderer> getAllModelRenderers(Object object) {
|
|
|
|
|
HashSet<ModelRenderer> modelRenderers = new HashSet<>();
|
|
|
|
|
|
|
|
|
|
HashSet<ModelBase> modelBases = getAllModelBases(object);
|
|
|
|
|
for (ModelBase modelBase : modelBases) {
|
|
|
|
|
modelRenderers.addAll(getModelRenderersFromModelBase(modelBase));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return modelRenderers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Recursively find all ModelBase objects in a given object
|
|
|
|
|
private static HashSet<ModelBase> getAllModelBases(Object object) {
|
|
|
|
|
HashSet<ModelBase> modelBases = new HashSet<>();
|
|
|
|
|
|
|
|
|
|
if (object == null) {
|
|
|
|
|
return modelBases;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get all fields from the object's class and superclasses
|
|
|
|
|
Class<?> clazz = object.getClass();
|
|
|
|
|
while (clazz != null) {
|
|
|
|
|
Field[] fields = clazz.getDeclaredFields();
|
|
|
|
|
|
|
|
|
|
for (Field field : fields) {
|
|
|
|
|
field.setAccessible(true);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
Object value = field.get(object);
|
|
|
|
|
if (value instanceof ModelBase) {
|
|
|
|
|
modelBases.add((ModelBase) value);
|
|
|
|
|
}
|
|
|
|
|
} catch (IllegalAccessException ignored) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clazz = clazz.getSuperclass();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return modelBases;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Recursively find all ModelRenderer objects within a ModelBase
|
|
|
|
|
private static HashSet<ModelRenderer> getModelRenderersFromModelBase(ModelBase modelBase) {
|
|
|
|
|
HashSet<ModelRenderer> modelRenderers = new HashSet<>();
|
|
|
|
|
|
|
|
|
|
Class<?> clazz = modelBase.getClass();
|
|
|
|
|
while (clazz != null) {
|
|
|
|
|
Field[] fields = clazz.getDeclaredFields();
|
|
|
|
|
|
|
|
|
|
for (Field field : fields) {
|
|
|
|
|
field.setAccessible(true);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
Object value = field.get(modelBase);
|
|
|
|
|
|
|
|
|
|
if (value instanceof ModelRenderer && getPlayerPartType((ModelRenderer) value) != null) {
|
|
|
|
|
modelRenderers.add((ModelRenderer) value);
|
|
|
|
|
}
|
|
|
|
|
} catch (IllegalAccessException ignored) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clazz = clazz.getSuperclass();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return modelRenderers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static EnumAnimationPart getPlayerPartType(ModelRenderer renderer) {
|
|
|
|
|
if (renderer.baseModel instanceof ModelBiped) {
|
|
|
|
|
if (renderer == ((ModelBiped) renderer.baseModel).bipedHead
|
|
|
|
|
|| renderer == ((ModelBiped) renderer.baseModel).bipedHeadwear) {
|
|
|
|
|
return EnumAnimationPart.HEAD;
|
|
|
|
|
}
|
|
|
|
|
if (renderer == ((ModelBiped) renderer.baseModel).bipedBody) {
|
|
|
|
|
return EnumAnimationPart.BODY;
|
|
|
|
|
}
|
|
|
|
|
if (renderer == ((ModelBiped) renderer.baseModel).bipedRightArm) {
|
|
|
|
|
return EnumAnimationPart.RIGHT_ARM;
|
|
|
|
|
}
|
|
|
|
|
if (renderer == ((ModelBiped) renderer.baseModel).bipedLeftArm) {
|
|
|
|
|
return EnumAnimationPart.LEFT_ARM;
|
|
|
|
|
}
|
|
|
|
|
if (renderer == ((ModelBiped) renderer.baseModel).bipedRightLeg) {
|
|
|
|
|
return EnumAnimationPart.RIGHT_LEG;
|
|
|
|
|
}
|
|
|
|
|
if (renderer == ((ModelBiped) renderer.baseModel).bipedLeftLeg) {
|
|
|
|
|
return EnumAnimationPart.LEFT_LEG;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
Class<?> ModelBipedBody = Class.forName("JinRyuu.JRMCore.entity.ModelBipedBody");
|
|
|
|
|
Object model = renderer.baseModel;
|
2025-03-13 17:14:45 -04:00
|
|
|
if (!(model instanceof ModelBiped))
|
2024-09-24 18:13:49 -05:00
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
Field[] declared;
|
|
|
|
|
if (ClientEventHandler.declaredFieldCache.containsKey(ModelBipedBody)) {
|
|
|
|
|
declared = ClientEventHandler.declaredFieldCache.get(ModelBipedBody);
|
|
|
|
|
} else {
|
|
|
|
|
declared = ModelBipedBody.getDeclaredFields();
|
2025-03-13 17:14:45 -04:00
|
|
|
ClientEventHandler.declaredFieldCache.put(ModelBipedBody, declared);
|
2024-09-24 18:13:49 -05:00
|
|
|
}
|
|
|
|
|
Set<Map.Entry<EnumAnimationPart, String[]>> entrySet = ClientEventHandler.partNames.entrySet();
|
|
|
|
|
for (Field f : declared) {
|
|
|
|
|
f.setAccessible(true);
|
|
|
|
|
for (Map.Entry<EnumAnimationPart, String[]> entry : entrySet) {
|
|
|
|
|
String[] names = entry.getValue();
|
|
|
|
|
for (String partName : names) {
|
|
|
|
|
try {
|
|
|
|
|
if (partName.equals(f.getName()) && renderer == f.get(model)) {
|
|
|
|
|
return entry.getKey();
|
|
|
|
|
}
|
2025-03-13 17:14:45 -04:00
|
|
|
} catch (IllegalAccessException ignored) {
|
|
|
|
|
}
|
2024-09-24 18:13:49 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-03-13 17:14:45 -04:00
|
|
|
} catch (Exception ignored) {
|
|
|
|
|
}
|
2024-09-24 18:13:49 -05:00
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2018-09-13 12:03:28 -04:00
|
|
|
}
|