diff --git a/src/main/java/noppes/npcs/client/ClientEventHandler.java b/src/main/java/noppes/npcs/client/ClientEventHandler.java index ab259c44f..0439765f4 100644 --- a/src/main/java/noppes/npcs/client/ClientEventHandler.java +++ b/src/main/java/noppes/npcs/client/ClientEventHandler.java @@ -2,16 +2,21 @@ package noppes.npcs.client; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.client.Minecraft; +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.RenderPlayer; +import net.minecraft.client.renderer.entity.RendererLivingEntity; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.*; import noppes.npcs.client.gui.customoverlay.OverlayCustom; import noppes.npcs.client.renderer.RenderCNPCPlayer; import noppes.npcs.controllers.data.PlayerModelData; +import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.roles.JobPuppet; import org.lwjgl.opengl.GL11; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -22,8 +27,9 @@ public class ClientEventHandler { public static float partialHandTicks; public static float partialRenderTick; + public static EntityNPCInterface renderingNpc; public static EntityPlayer renderingPlayer; - public static RenderPlayer renderer; + public static RendererLivingEntity renderer; @SubscribeEvent public void onMouse(MouseEvent event) { @@ -60,11 +66,25 @@ public class ClientEventHandler { } } + @SubscribeEvent + public void onRenderEntity(RenderLivingEvent.Pre event) { + if (event.entity instanceof EntityNPCInterface) { + ClientEventHandler.renderingNpc = (EntityNPCInterface) event.entity; + } + ClientEventHandler.renderer = event.renderer; + ClientEventHandler.partialRenderTick = Minecraft.getMinecraft().timer.renderPartialTicks; + } + + @SubscribeEvent + public void onRenderEntity(RenderLivingEvent.Post event) { + if (event.entity instanceof EntityNPCInterface) { + ClientEventHandler.renderingNpc = null; + } + } + @SubscribeEvent public void onRenderPlayer(RenderPlayerEvent.Pre event) { ClientEventHandler.renderingPlayer = event.entityPlayer; - ClientEventHandler.renderer = event.renderer; - ClientEventHandler.partialRenderTick = event.partialRenderTick; } @SubscribeEvent diff --git a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java index 5c66e2789..c5bd47c34 100644 --- a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java +++ b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java @@ -4,9 +4,11 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.model.ModelBiped; import net.minecraft.client.model.ModelRenderer; +import net.minecraft.entity.EntityLivingBase; import noppes.npcs.client.Client; import noppes.npcs.client.ClientEventHandler; import noppes.npcs.controllers.data.PlayerModelData; +import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.roles.JobPuppet; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,7 +16,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.lang.reflect.Field; import java.util.HashMap; +import java.util.Map; @Mixin(value = ModelRenderer.class) public class MixinModelRenderer { @@ -25,96 +29,98 @@ public class MixinModelRenderer { @Shadow public float rotateAngleY; @Shadow public float rotateAngleZ; - HashMap partNames = new HashMap<>(); + HashMap modelNameMap = new HashMap<>(); String partName = ""; + HashMap partNames = new HashMap<>(); @SideOnly(Side.CLIENT) @Inject(method = "render", at = @At(value = "HEAD")) private void puppetRotations(float p_78785_1_, CallbackInfo callbackInfo) { - if (ClientEventHandler.renderingPlayer == null) { - return; + if (partNames.isEmpty()) { + String[] headNames = new String[]{"bipedHead","bipedHeadwear","head","Head","bipedHeadAll", + "bipedHeadg","bipedHeadt","bipedHeadgh","bipedHeadv","bipedHeadb","bipedHeadt2"}; + String[] bodyNames = new String[]{"bipedBody","B1","body","UpperBody","Body1","BodyBase"}; + String[] larmNames = new String[]{"bipedLeftArm","LA","leftarm","ArmL","Arm1L","ArmL1"}; + String[] rarmNames = new String[]{"bipedRightArm","RA","rightarm","ArmR","Arm1R","ArmR1"}; + String[] llegNames = new String[]{"bipedLeftLeg","LL","leftleg","LegL","Leg1L","LegL1"}; + String[] rlegNames = new String[]{"bipedRightLeg","RL","rightleg","LegR","Leg1R","LegR1"}; + + partNames.put("head", headNames); + partNames.put("body", bodyNames); + partNames.put("larm", larmNames); + partNames.put("rarm", rarmNames); + partNames.put("lleg", llegNames); + partNames.put("rleg", rlegNames); } - if (!Client.playerModelData.containsKey(ClientEventHandler.renderingPlayer.getUniqueID())) { - return; + if (ClientEventHandler.renderingPlayer != null && Client.playerModelData.containsKey(ClientEventHandler.renderingPlayer.getUniqueID())) { + this.partName = this.getPartName((ModelRenderer) (Object) this, this.partNames); + PlayerModelData modelData = Client.playerModelData.get(ClientEventHandler.renderingPlayer.getUniqueID()); + this.setModelParts(modelData); + if (modelData.enabled) { + JobPuppet.PartConfig[] partConfigs = new JobPuppet.PartConfig[]{modelData.head, modelData.body, modelData.larm, modelData.rarm, modelData.lleg, modelData.rleg}; + + for (JobPuppet.PartConfig partConfig : partConfigs) { + if (isPart(partConfig)) { + this.rotateAngleX = partConfig.prevRotations[0]; + this.rotateAngleY = partConfig.prevRotations[1]; + this.rotateAngleZ = partConfig.prevRotations[2]; + this.setInterpolatedAngles(partConfig); + this.addInterpolatedOffset(partConfig); + partConfig.prevRotations = new float[]{this.rotateAngleX, this.rotateAngleY, this.rotateAngleZ}; + } + } + } } + if (ClientEventHandler.renderingNpc != null && ClientEventHandler.renderingNpc.jobInterface instanceof JobPuppet) { + this.partName = this.getPartName((ModelRenderer) (Object) this, this.partNames); + JobPuppet modelData = (JobPuppet) ClientEventHandler.renderingNpc.jobInterface; + this.setModelParts(modelData); + if (modelData.isActive()) { + JobPuppet.PartConfig[] partConfigs = new JobPuppet.PartConfig[]{modelData.head, modelData.body, modelData.larm, modelData.rarm, modelData.lleg, modelData.rleg}; - this.partName = this.getPartName((ModelRenderer)(Object)this); - PlayerModelData modelData = Client.playerModelData.get(ClientEventHandler.renderingPlayer.getUniqueID()); - this.setModelParts(modelData); - if (modelData.enabled) { - JobPuppet.PartConfig[] partConfigs = new JobPuppet.PartConfig[]{modelData.head,modelData.body,modelData.larm,modelData.rarm,modelData.lleg,modelData.rleg}; - - for (JobPuppet.PartConfig partConfig : partConfigs) { - if (isPart(partConfig)) { - this.rotateAngleX = partConfig.prevRotations[0]; - this.rotateAngleY = partConfig.prevRotations[1]; - this.rotateAngleZ = partConfig.prevRotations[2]; - this.setInterpolatedAngles(partConfig); - this.addInterpolatedOffset(partConfig); - partConfig.prevRotations = new float[]{this.rotateAngleX, this.rotateAngleY, this.rotateAngleZ}; + for (JobPuppet.PartConfig partConfig : partConfigs) { + if (isPart(partConfig)) { + EntityLivingBase entityModel = ((EntityCustomNpc) ClientEventHandler.renderingNpc).modelData.getEntity(ClientEventHandler.renderingNpc); + if (partConfig.npcModel != entityModel) { + partConfig.setOriginalPivot = false; + } + this.rotateAngleX = partConfig.prevRotations[0]; + this.rotateAngleY = partConfig.prevRotations[1]; + this.rotateAngleZ = partConfig.prevRotations[2]; + this.setInterpolatedAngles(partConfig); + this.addInterpolatedOffset(partConfig); + partConfig.prevRotations = new float[]{this.rotateAngleX, this.rotateAngleY, this.rotateAngleZ}; + partConfig.npcModel = entityModel; + } } } } } - public String getPartName(ModelRenderer renderer) { - if (renderer == ((ModelBiped) renderer.baseModel).bipedHead - || renderer == ((ModelBiped) renderer.baseModel).bipedHeadwear) { - return "head"; - } - if (renderer == ((ModelBiped) renderer.baseModel).bipedBody) { - return "body"; - } - if (renderer == ((ModelBiped) renderer.baseModel).bipedRightArm) { - return "rarm"; - } - if (renderer == ((ModelBiped) renderer.baseModel).bipedLeftArm) { - return "larm"; - } - if (renderer == ((ModelBiped) renderer.baseModel).bipedRightLeg) { - return "rleg"; - } - if (renderer == ((ModelBiped) renderer.baseModel).bipedLeftLeg) { - return "lleg"; - } + public String getPartName(ModelRenderer renderer, HashMap partNames) { + Class RenderClass = renderer.baseModel.getClass(); + Object model = renderer.baseModel; - try { - Class ModelBipedBody = Class.forName("JinRyuu.JRMCore.entity.ModelBipedBody"); - Object m = renderer.baseModel; - - if (renderer == ModelBipedBody.getField("bipedHeadwear").get(m) - || renderer == ModelBipedBody.getField("bipedHead").get(m)) { - return "head"; + for (Map.Entry entry : partNames.entrySet()) { + String[] names = entry.getValue(); + for (String partName : names) { + try { + Field field = RenderClass.getDeclaredField(partName); + field.setAccessible(true); + if (renderer == field.get(model)) { + return entry.getKey(); + } + } catch (Exception ignored) {} } - if (renderer == ModelBipedBody.getField("B1").get(m) - || renderer == ModelBipedBody.getField("bipedBody").get(m)) { - return "body"; - } - if (renderer == ModelBipedBody.getField("RA").get(m) - || renderer == ModelBipedBody.getField("bipedRightArm").get(m)) { - return "rarm"; - } - if (renderer == ModelBipedBody.getField("LA").get(m) - || renderer == ModelBipedBody.getField("bipedLeftArm").get(m)) { - return "larm"; - } - if (renderer == ModelBipedBody.getField("RL").get(m) - || renderer == ModelBipedBody.getField("bipedRightLeg").get(m)) { - return "rleg"; - } - if (renderer == ModelBipedBody.getField("LL").get(m) - || renderer == ModelBipedBody.getField("bipedLeftLeg").get(m)) { - return "lleg"; - } - } catch (Exception ignored) {} + } return ""; } public boolean isPart(JobPuppet.PartConfig puppetPart) { - return !puppetPart.disabled && this.partName.equals(partNames.get(puppetPart)); + return !puppetPart.disabled && this.partName.equals(modelNameMap.get(puppetPart)); } public void setInterpolatedAngles(JobPuppet.PartConfig modelPart) { @@ -187,12 +193,22 @@ public class MixinModelRenderer { } } - public void setModelParts(PlayerModelData modelData) { - partNames.put(modelData.head,"head"); - partNames.put(modelData.body,"body"); - partNames.put(modelData.rarm,"rarm"); - partNames.put(modelData.larm,"larm"); - partNames.put(modelData.rleg,"rleg"); - partNames.put(modelData.lleg,"lleg"); + public void setModelParts(Object modelData) { + if (modelData instanceof PlayerModelData) { + modelNameMap.put(((PlayerModelData) modelData).head, "head"); + modelNameMap.put(((PlayerModelData) modelData).body, "body"); + modelNameMap.put(((PlayerModelData) modelData).rarm, "rarm"); + modelNameMap.put(((PlayerModelData) modelData).larm, "larm"); + modelNameMap.put(((PlayerModelData) modelData).rleg, "rleg"); + modelNameMap.put(((PlayerModelData) modelData).lleg, "lleg"); + } + if (modelData instanceof JobPuppet) { + modelNameMap.put(((JobPuppet) modelData).head, "head"); + modelNameMap.put(((JobPuppet) modelData).body, "body"); + modelNameMap.put(((JobPuppet) modelData).rarm, "rarm"); + modelNameMap.put(((JobPuppet) modelData).larm, "larm"); + modelNameMap.put(((JobPuppet) modelData).rleg, "rleg"); + modelNameMap.put(((JobPuppet) modelData).lleg, "lleg"); + } } } diff --git a/src/main/java/noppes/npcs/roles/JobPuppet.java b/src/main/java/noppes/npcs/roles/JobPuppet.java index 4fa1b4638..15b0f66ed 100644 --- a/src/main/java/noppes/npcs/roles/JobPuppet.java +++ b/src/main/java/noppes/npcs/roles/JobPuppet.java @@ -1,5 +1,6 @@ package noppes.npcs.roles; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.api.handler.data.IModelPart; import noppes.npcs.entity.EntityNPCInterface; @@ -72,6 +73,7 @@ public class JobPuppet extends JobInterface{ public static class PartConfig implements IModelPart { public Object parent; + public EntityLivingBase npcModel; public float rotationX = 0f; public float rotationY = 0f; diff --git a/src/main/resources/META-INF/customnpcs_at.cfg b/src/main/resources/META-INF/customnpcs_at.cfg index aba827e00..9e75ca284 100644 --- a/src/main/resources/META-INF/customnpcs_at.cfg +++ b/src/main/resources/META-INF/customnpcs_at.cfg @@ -3,4 +3,6 @@ public net.minecraft.client.renderer.entity.RendererLivingEntity field_77046_h # #EntityRenderer public net.minecraft.client.renderer.EntityRenderer func_78476_b(FI)V # renderHand #ModelRenderer -public net.minecraft.client.model.ModelRenderer field_78810_s # baseModel \ No newline at end of file +public net.minecraft.client.model.ModelRenderer field_78810_s # baseModel +#Minecraft +public net.minecraft.client.Minecraft field_71428_T # timer \ No newline at end of file