diff --git a/src/main/java/noppes/npcs/client/ClientEventHandler.java b/src/main/java/noppes/npcs/client/ClientEventHandler.java index 7fb6300ae..52ea9b6bc 100644 --- a/src/main/java/noppes/npcs/client/ClientEventHandler.java +++ b/src/main/java/noppes/npcs/client/ClientEventHandler.java @@ -1,7 +1,12 @@ package noppes.npcs.client; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.relauncher.Side; import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.model.ModelRenderer; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RendererLivingEntity; import net.minecraft.entity.player.EntityPlayer; @@ -12,12 +17,14 @@ import noppes.npcs.client.gui.customoverlay.OverlayCustom; import noppes.npcs.client.renderer.RenderCNPCPlayer; import noppes.npcs.constants.EnumAnimationPart; import noppes.npcs.controllers.data.Animation; +import noppes.npcs.controllers.data.FramePart; import noppes.npcs.entity.EntityNPCInterface; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.Set; public class ClientEventHandler { public static final RenderCNPCPlayer renderCNPCPlayer = new RenderCNPCPlayer(); @@ -32,6 +39,9 @@ public class ClientEventHandler { public static HashMap partNames = new HashMap<>(); public static HashMap,Field[]> declaredFieldCache = new HashMap<>(); + public static HashMap originalValues = new HashMap<>(); + public static ModelBase playerModel; + @SubscribeEvent public void onMouse(MouseEvent event) { if (Minecraft.getMinecraft().currentScreen != null) @@ -81,8 +91,43 @@ public class ClientEventHandler { AnimationData data = null; if (event.entity instanceof EntityNPCInterface) { data = ClientEventHandler.renderingNpc.display.animationData; - } else if (event.entity instanceof EntityPlayer && Client.playerAnimations.containsKey(event.entity.getUniqueID())) { - data = Client.playerAnimations.get(event.entity.getUniqueID()); + } else if (event.entity instanceof EntityPlayer) { + if (Client.playerAnimations.containsKey(event.entity.getUniqueID())) { + data = Client.playerAnimations.get(event.entity.getUniqueID()); + } + + Class RenderClass = playerModel.getClass(); + Object model = playerModel; + + while (RenderClass != Object.class) { + Field[] declared; + if (ClientEventHandler.declaredFieldCache.containsKey(RenderClass)) { + declared = ClientEventHandler.declaredFieldCache.get(RenderClass); + } else { + declared = RenderClass.getDeclaredFields(); + ClientEventHandler.declaredFieldCache.put(RenderClass,declared); + } + for (Field f : declared) { + f.setAccessible(true); + try { + ModelRenderer fieldValue = (ModelRenderer) f.get(model); + EnumAnimationPart enumPart = this.getPlayerPartType(fieldValue); + if (originalValues.containsKey(enumPart)) { + FramePart part = originalValues.get(enumPart); + fieldValue.rotationPointX = part.pivot[0]; + fieldValue.rotationPointY = part.pivot[1]; + fieldValue.rotationPointZ = part.pivot[2]; + fieldValue.rotateAngleX = part.rotation[0]; + fieldValue.rotateAngleY = part.rotation[1]; + fieldValue.rotateAngleZ = part.rotation[2]; + } + } catch (Exception ignored) {} + } + RenderClass = RenderClass.getSuperclass(); + } + + originalValues.clear(); + ClientEventHandler.playerModel = null; } if (data != null && data.isActive()) { @@ -94,19 +139,73 @@ public class ClientEventHandler { ClientEventHandler.renderingNpc = null; } - @SubscribeEvent - public void onUpdateEntity(LivingEvent.LivingUpdateEvent event) { - AnimationData data = null; - if (event.entity instanceof EntityNPCInterface) { - data = ((EntityNPCInterface)event.entity).display.animationData; - } else if (event.entity instanceof EntityPlayer && Client.playerAnimations.containsKey(event.entity.getUniqueID())) { - data = Client.playerAnimations.get(event.entity.getUniqueID()); + public 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; + } } - if (data != null && data.isActive()) { - Animation animation = data.animation; - if (data.isActive() && !animation.currentFrame().useRenderTicks()) { - animation.increaseTime(); + try { + Class ModelBipedBody = Class.forName("JinRyuu.JRMCore.entity.ModelBipedBody"); + Object model = renderer.baseModel; + Field[] declared; + if (ClientEventHandler.declaredFieldCache.containsKey(ModelBipedBody)) { + declared = ClientEventHandler.declaredFieldCache.get(ModelBipedBody); + } else { + declared = ModelBipedBody.getDeclaredFields(); + ClientEventHandler.declaredFieldCache.put(ModelBipedBody,declared); + } + Set> entrySet = ClientEventHandler.partNames.entrySet(); + for (Field f : declared) { + f.setAccessible(true); + for (Map.Entry entry : entrySet) { + String[] names = entry.getValue(); + for (String partName : names) { + try { + if (partName.equals(f.getName()) && renderer == f.get(model)) { + return entry.getKey(); + } + } catch (IllegalAccessException ignored) {} + } + } + } + } catch (ClassNotFoundException ignored) {} + + return null; + } + + @SubscribeEvent + public void onUpdateEntity(LivingEvent.LivingUpdateEvent event) { + if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) { + AnimationData data = null; + if (event.entity instanceof EntityNPCInterface) { + data = ((EntityNPCInterface) event.entity).display.animationData; + } else if (event.entity instanceof EntityPlayer && Client.playerAnimations.containsKey(event.entity.getUniqueID())) { + data = Client.playerAnimations.get(event.entity.getUniqueID()); + } + + if (data != null && data.isActive()) { + Animation animation = data.animation; + if (data.isActive() && !animation.currentFrame().useRenderTicks()) { + animation.increaseTime(); + } } } } diff --git a/src/main/java/noppes/npcs/client/PacketHandlerClient.java b/src/main/java/noppes/npcs/client/PacketHandlerClient.java index e95870b50..746d3864d 100644 --- a/src/main/java/noppes/npcs/client/PacketHandlerClient.java +++ b/src/main/java/noppes/npcs/client/PacketHandlerClient.java @@ -304,16 +304,16 @@ public class PacketHandlerClient extends PacketHandlerServer{ EntityPlayer sendingPlayer = Minecraft.getMinecraft().theWorld.getPlayerEntityByName(Server.readString(buffer)); if (sendingPlayer != null) { AnimationData data; - if (!Client.playerAnimations.containsKey(player.getUniqueID())) { - data = new AnimationData(player); + if (!Client.playerAnimations.containsKey(sendingPlayer.getUniqueID())) { + data = new AnimationData(sendingPlayer); data.readFromNBT(compound); } else { - data = Client.playerAnimations.get(player.getUniqueID()); + data = Client.playerAnimations.get(sendingPlayer.getUniqueID()); data.readFromNBT(compound); } data.animation = new Animation(); data.animation.readFromNBT(compound.getCompoundTag("Animation")); - Client.playerAnimations.put(player.getUniqueID(), data); + Client.playerAnimations.put(sendingPlayer.getUniqueID(), data); } } } diff --git a/src/main/java/noppes/npcs/controllers/data/FramePart.java b/src/main/java/noppes/npcs/controllers/data/FramePart.java index 84f5c07a2..d321caa00 100644 --- a/src/main/java/noppes/npcs/controllers/data/FramePart.java +++ b/src/main/java/noppes/npcs/controllers/data/FramePart.java @@ -26,6 +26,8 @@ public class FramePart implements IFramePart { public float partialPivotTick; public float[] originalRotations = {(float) Math.PI,(float) Math.PI,(float) Math.PI}; public float[] originalPivots = {0,0,0}; + public float[] renderRotations = {(float) Math.PI,(float) Math.PI,(float) Math.PI}; + public float[] renderPivots = {0,0,0}; public FramePart(){} diff --git a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java index bf05740ca..c63905ccf 100644 --- a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java +++ b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java @@ -105,6 +105,9 @@ public abstract class MixinModelRenderer { this.rotateAngleZ = currentPart.prevRotations[2]; } + if (ClientEventHandler.renderingPlayer != null) { + ClientEventHandler.playerModel = ((ModelRenderer) (Object) this).baseModel; + } if (ClientEventHandler.renderingPlayer != null && Client.playerAnimations.containsKey(ClientEventHandler.renderingPlayer.getUniqueID())) { animData = Client.playerAnimations.get(ClientEventHandler.renderingPlayer.getUniqueID()); EnumAnimationPart mainPartType = this.getPlayerPartType((ModelRenderer) (Object) this); @@ -113,6 +116,12 @@ public abstract class MixinModelRenderer { pivotEqualPart = this.pivotEqualPart((ModelRenderer) (Object) this); } partType = mainPartType != null ? mainPartType : pivotEqualPart; + if (partType != null && !ClientEventHandler.originalValues.containsKey(partType)) { + FramePart part = new FramePart(partType); + part.pivot = new float[]{prevPointX,prevPointY,prevPointZ}; + part.rotation = new float[]{prevAngleX,prevAngleY,prevAngleZ}; + ClientEventHandler.originalValues.put(partType,part); + } if (partType != null && animData != null) { if (animData.isActive()) { Frame frame = (Frame) animData.animation.currentFrame();