mirror of
https://github.com/KAMKEEL/CustomNPC-Plus.git
synced 2026-11-12 03:47:27 +00:00
194 lines
9.5 KiB
Java
194 lines
9.5 KiB
Java
package noppes.npcs;
|
|||
|
|
|
||
|
|
import kamkeel.npcs.addon.DBCAddon;
|
||
|
|
import net.minecraft.client.model.ModelBiped;
|
||
|
|
import net.minecraft.client.model.ModelRenderer;
|
||
|
|
import net.minecraft.entity.Entity;
|
||
|
|
import net.minecraft.entity.EntityLivingBase;
|
||
|
|
import noppes.npcs.client.ClientCacheHandler;
|
||
|
|
import noppes.npcs.client.ClientEventHandler;
|
||
|
|
import noppes.npcs.constants.EnumAnimationPart;
|
||
|
|
import noppes.npcs.controllers.data.AnimationData;
|
||
|
|
import noppes.npcs.controllers.data.Frame;
|
||
|
|
import noppes.npcs.controllers.data.FramePart;
|
||
|
|
import org.lwjgl.opengl.GL11;
|
||
|
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||
|
|
|
||
|
|
import java.lang.reflect.Field;
|
||
|
|
import java.util.Map;
|
||
|
|
import java.util.Set;
|
||
|
|
|
||
|
|
public class AnimationMixinFunctions {
|
||
|
|
|
||
|
|
public static boolean applyValues(ModelRenderer modelRenderer) {
|
||
|
|
if (ClientEventHandler.renderingPlayer == null && ClientEventHandler.renderingNpc == null) {
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (ClientEventHandler.renderingPlayer != null) {
|
||
|
|
ClientEventHandler.playerModel = (modelRenderer).baseModel;
|
||
|
|
if (ClientCacheHandler.playerAnimations.containsKey(ClientEventHandler.renderingPlayer.getUniqueID())) {
|
||
|
|
AnimationData animData = ClientCacheHandler.playerAnimations.get(ClientEventHandler.renderingPlayer.getUniqueID());
|
||
|
|
EnumAnimationPart mainPartType = getPlayerPartType(modelRenderer);
|
||
|
|
EnumAnimationPart partType = mainPartType != null ? mainPartType : pivotEqualPart(modelRenderer);
|
||
|
|
if (partType != null && animData != null && animData.animation != null && animData.isActive()) {
|
||
|
|
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);
|
||
|
|
}
|
||
|
|
FramePart originalPart = ClientEventHandler.originalValues.get(modelRenderer);
|
||
|
|
Frame frame = (Frame) animData.animation.currentFrame();
|
||
|
|
if (frame != null && frame.frameParts.containsKey(partType)) {
|
||
|
|
FramePart part = frame.frameParts.get(partType);
|
||
|
|
if (partType == mainPartType) {
|
||
|
|
part.interpolateAngles();
|
||
|
|
part.interpolateOffset();
|
||
|
|
modelRenderer.rotationPointX = originalPart.pivot[0] + part.prevPivots[0];
|
||
|
|
modelRenderer.rotationPointY = originalPart.pivot[1] + part.prevPivots[1];
|
||
|
|
modelRenderer.rotationPointZ = originalPart.pivot[2] + part.prevPivots[2];
|
||
|
|
modelRenderer.rotateAngleX = part.prevRotations[0];
|
||
|
|
modelRenderer.rotateAngleY = part.prevRotations[1];
|
||
|
|
modelRenderer.rotateAngleZ = part.prevRotations[2];
|
||
|
|
} else {
|
||
|
|
modelRenderer.rotateAngleZ += part.prevRotations[2];
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} else if (ClientEventHandler.renderingNpc.display.animationData.isActive()) {
|
||
|
|
AnimationData animData = ClientEventHandler.renderingNpc.display.animationData;
|
||
|
|
EnumAnimationPart partType = getPartType(modelRenderer);
|
||
|
|
if (partType != null && animData != null) {
|
||
|
|
Frame frame = (Frame) animData.animation.currentFrame();
|
||
|
|
if (frame.frameParts.containsKey(partType)) {
|
||
|
|
FramePart part = frame.frameParts.get(partType);
|
||
|
|
part.interpolateOffset();
|
||
|
|
part.interpolateAngles();
|
||
|
|
modelRenderer.rotationPointX += part.prevPivots[0];
|
||
|
|
modelRenderer.rotationPointY += part.prevPivots[1];
|
||
|
|
modelRenderer.rotationPointZ += part.prevPivots[2];
|
||
|
|
modelRenderer.rotateAngleX = part.prevRotations[0];
|
||
|
|
modelRenderer.rotateAngleY = part.prevRotations[1];
|
||
|
|
modelRenderer.rotateAngleZ = part.prevRotations[2];
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return getPartType(renderer);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static EnumAnimationPart pivotEqualPart(ModelRenderer renderer) {
|
||
|
|
if(renderer.baseModel instanceof ModelBiped){
|
||
|
|
ModelRenderer head = ((ModelBiped) renderer.baseModel).bipedHead;
|
||
|
|
ModelRenderer body = ((ModelBiped) renderer.baseModel).bipedBody;
|
||
|
|
ModelRenderer larm = ((ModelBiped) renderer.baseModel).bipedLeftArm;
|
||
|
|
ModelRenderer rarm = ((ModelBiped) renderer.baseModel).bipedRightArm;
|
||
|
|
ModelRenderer lleg = ((ModelBiped) renderer.baseModel).bipedLeftLeg;
|
||
|
|
ModelRenderer rleg = ((ModelBiped) renderer.baseModel).bipedRightLeg;
|
||
|
|
|
||
|
|
if (pivotsEqual(renderer,head)) {
|
||
|
|
return EnumAnimationPart.HEAD;
|
||
|
|
}
|
||
|
|
if (pivotsEqual(renderer,body)) {
|
||
|
|
return EnumAnimationPart.BODY;
|
||
|
|
}
|
||
|
|
if (pivotsEqual(renderer,rarm)) {
|
||
|
|
return EnumAnimationPart.RIGHT_ARM;
|
||
|
|
}
|
||
|
|
if (pivotsEqual(renderer,larm)) {
|
||
|
|
return EnumAnimationPart.LEFT_ARM;
|
||
|
|
}
|
||
|
|
if (pivotsEqual(renderer,rleg)) {
|
||
|
|
return EnumAnimationPart.RIGHT_LEG;
|
||
|
|
}
|
||
|
|
if (pivotsEqual(renderer,lleg)) {
|
||
|
|
return EnumAnimationPart.LEFT_LEG;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
private static boolean pivotsEqual(ModelRenderer m1, ModelRenderer m2) {
|
||
|
|
return m1.rotationPointX == m2.rotationPointX && m1.rotationPointY == m2.rotationPointY && m1.rotationPointZ == m2.rotationPointZ;
|
||
|
|
}
|
||
|
|
|
||
|
|
private static EnumAnimationPart getPartType(ModelRenderer renderer) {
|
||
|
|
Class<?> RenderClass = renderer.baseModel.getClass();
|
||
|
|
Object model = renderer.baseModel;
|
||
|
|
|
||
|
|
Set<Map.Entry<EnumAnimationPart, String[]>> entrySet = ClientEventHandler.partNames.entrySet();
|
||
|
|
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);
|
||
|
|
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();
|
||
|
|
}
|
||
|
|
} catch (IllegalAccessException ignored) {}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
RenderClass = RenderClass.getSuperclass();
|
||
|
|
}
|
||
|
|
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
public static void playerFullModel_head(Entity p_78088_1_, CallbackInfo callbackInfo) {
|
||
|
|
if (!DBCAddon.IsAvailable() && ClientCacheHandler.playerAnimations.containsKey(p_78088_1_.getUniqueID())) {
|
||
|
|
AnimationData animData = ClientCacheHandler.playerAnimations.get(p_78088_1_.getUniqueID());
|
||
|
|
if (animData != null && animData.isActive()) {
|
||
|
|
Frame frame = (Frame) animData.animation.currentFrame();
|
||
|
|
if (frame.frameParts.containsKey(EnumAnimationPart.FULL_MODEL)) {
|
||
|
|
FramePart part = frame.frameParts.get(EnumAnimationPart.FULL_MODEL);
|
||
|
|
part.interpolateOffset();
|
||
|
|
part.interpolateAngles();
|
||
|
|
float pi = 180 / (float) Math.PI;
|
||
|
|
GL11.glTranslatef(part.prevPivots[0], part.prevPivots[1], part.prevPivots[2]);
|
||
|
|
GL11.glRotatef(part.prevRotations[0] * pi, 1, 0, 0);
|
||
|
|
GL11.glRotatef(part.prevRotations[1] * pi, 0, 1, 0);
|
||
|
|
GL11.glRotatef(part.prevRotations[2] * pi, 0, 0, 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|