diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerModelData.java b/src/main/java/noppes/npcs/controllers/data/PlayerModelData.java index 45caeae11..4b9a372bb 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerModelData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerModelData.java @@ -29,6 +29,7 @@ public class PlayerModelData implements IPlayerModelData { public boolean animate = false; public float animRate = 1.0F; + public boolean interpolate; //Client-sided use public float modelRotPartialTicks; @@ -75,6 +76,7 @@ public class PlayerModelData implements IPlayerModelData { compound.setBoolean("PuppetRotationEnabledY",rotationEnabledY); compound.setBoolean("PuppetRotationEnabledZ",rotationEnabledZ); + compound.setBoolean("PuppetInterpolate", interpolate); compound.setBoolean("PuppetAnimate", animate); compound.setFloat("PuppetAnimSpeed", animRate); return compound; @@ -101,6 +103,11 @@ public class PlayerModelData implements IPlayerModelData { rotationEnabledY = compound.getBoolean("PuppetRotationEnabledY"); rotationEnabledZ = compound.getBoolean("PuppetRotationEnabledZ"); + if (!compound.hasKey("PuppetInterpolate")) { + interpolate = true; + } else { + interpolate = compound.getBoolean("PuppetInterpolate"); + } animate = compound.getBoolean("PuppetAnimate"); animRate = compound.getFloat("PuppetAnimSpeed"); } @@ -121,6 +128,14 @@ public class PlayerModelData implements IPlayerModelData { return this.animate; } + public void setInterpolated(boolean interpolate) { + this.interpolate = interpolate; + } + + public boolean isInterpolated() { + return this.interpolate; + } + public void setFullAngles(boolean limit) { fullAngles = limit; } @@ -130,6 +145,8 @@ public class PlayerModelData implements IPlayerModelData { } public void setAnimRate(float animRate) { + if (animRate < 0) + animRate = 0; this.animRate = animRate; } diff --git a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java index 59aa152e5..223e001af 100644 --- a/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java +++ b/src/main/java/noppes/npcs/mixin/MixinModelRenderer.java @@ -193,12 +193,27 @@ public class MixinModelRenderer { this.rotateAngleZ = puppetPart.rotationZ * pi; } else if (puppetPart.partialRotationTick != ClientEventHandler.partialRenderTick) { puppetPart.partialRotationTick = ClientEventHandler.partialRenderTick; - if (puppetPart.rotationX * pi - this.rotateAngleX != 0) - this.rotateAngleX = (puppetPart.rotationX * pi - this.rotateAngleX) * modelData.animRate /10f + this.rotateAngleX; - if (puppetPart.rotationY * pi - this.rotateAngleY != 0) - this.rotateAngleY = (puppetPart.rotationY * pi - this.rotateAngleY) * modelData.animRate /10f + this.rotateAngleY; - if (puppetPart.rotationZ * pi - this.rotateAngleZ != 0) - this.rotateAngleZ = (puppetPart.rotationZ * pi - this.rotateAngleZ) * modelData.animRate /10f + this.rotateAngleZ; + if (modelData.interpolate) { + if (puppetPart.rotationX * pi - this.rotateAngleX != 0) + this.rotateAngleX = (puppetPart.rotationX * pi - this.rotateAngleX) * modelData.animRate / 10f + this.rotateAngleX; + if (puppetPart.rotationY * pi - this.rotateAngleY != 0) + this.rotateAngleY = (puppetPart.rotationY * pi - this.rotateAngleY) * modelData.animRate / 10f + this.rotateAngleY; + if (puppetPart.rotationZ * pi - this.rotateAngleZ != 0) + this.rotateAngleZ = (puppetPart.rotationZ * pi - this.rotateAngleZ) * modelData.animRate / 10f + this.rotateAngleZ; + } else { + int directionX = Float.compare(puppetPart.rotationX * pi, this.rotateAngleX); + this.rotateAngleX += directionX * modelData.animRate / 10f; + this.rotateAngleX = directionX == 1 ? + Math.min(puppetPart.rotationX * pi,this.rotateAngleX) : Math.max(puppetPart.rotationX * pi,this.rotateAngleX); + int directionY = Float.compare(puppetPart.rotationY * pi, this.rotateAngleY); + this.rotateAngleY += directionY * modelData.animRate / 10f; + this.rotateAngleY = directionY == 1 ? + Math.min(puppetPart.rotationY * pi,this.rotateAngleY) : Math.max(puppetPart.rotationY * pi,this.rotateAngleY); + int directionZ = Float.compare(puppetPart.rotationZ * pi, this.rotateAngleZ); + this.rotateAngleZ += directionZ * modelData.animRate / 10f; + this.rotateAngleZ = directionZ == 1 ? + Math.min(puppetPart.rotationZ * pi,this.rotateAngleZ) : Math.max(puppetPart.rotationZ * pi,this.rotateAngleZ); + } } } @@ -216,12 +231,27 @@ public class MixinModelRenderer { this.rotationPointZ = puppetPart.originalPivotZ + puppetPart.pivotZ; } else if (puppetPart.partialPivotTick != ClientEventHandler.partialRenderTick) { puppetPart.partialPivotTick = ClientEventHandler.partialRenderTick; - puppetPart.destPivotX = (puppetPart.pivotX - puppetPart.destPivotX) * modelData.animRate /10f + puppetPart.destPivotX; - this.rotationPointX = puppetPart.originalPivotX + puppetPart.destPivotX; - puppetPart.destPivotY = (puppetPart.pivotY - puppetPart.destPivotY) * modelData.animRate /10f + puppetPart.destPivotY; - this.rotationPointY = puppetPart.originalPivotY + puppetPart.destPivotY; - puppetPart.destPivotZ = (puppetPart.pivotZ - puppetPart.destPivotZ) * modelData.animRate /10f + puppetPart.destPivotZ; - this.rotationPointZ = puppetPart.originalPivotZ + puppetPart.destPivotZ; + if (modelData.interpolate) { + puppetPart.destPivotX = (puppetPart.pivotX - puppetPart.destPivotX) * modelData.animRate / 10f + puppetPart.destPivotX; + this.rotationPointX = puppetPart.originalPivotX + puppetPart.destPivotX; + puppetPart.destPivotY = (puppetPart.pivotY - puppetPart.destPivotY) * modelData.animRate / 10f + puppetPart.destPivotY; + this.rotationPointY = puppetPart.originalPivotY + puppetPart.destPivotY; + puppetPart.destPivotZ = (puppetPart.pivotZ - puppetPart.destPivotZ) * modelData.animRate / 10f + puppetPart.destPivotZ; + this.rotationPointZ = puppetPart.originalPivotZ + puppetPart.destPivotZ; + } else { + int directionX = Float.compare(puppetPart.pivotX, this.rotationPointX); + this.rotationPointX = puppetPart.originalPivotX + directionX * modelData.animRate / 10f; + this.rotationPointX = directionX == 1 ? + Math.min(puppetPart.originalPivotX + puppetPart.pivotX,this.rotationPointX) : Math.max(puppetPart.originalPivotX + puppetPart.pivotX,this.rotationPointX); + int directionY = Float.compare(puppetPart.pivotY, this.rotationPointY); + this.rotationPointY = puppetPart.originalPivotY + directionY * modelData.animRate / 10f; + this.rotationPointY = directionY == 1 ? + Math.min(puppetPart.originalPivotY + puppetPart.pivotY,this.rotationPointY) : Math.max(puppetPart.originalPivotY + puppetPart.pivotY,this.rotationPointY); + int directionZ = Float.compare(puppetPart.pivotZ, this.rotationPointZ); + this.rotationPointZ = puppetPart.originalPivotZ + directionZ * modelData.animRate / 10f; + this.rotationPointZ = directionZ == 1 ? + Math.min(puppetPart.originalPivotZ + puppetPart.pivotZ,this.rotationPointZ) : Math.max(puppetPart.originalPivotZ + puppetPart.pivotZ,this.rotationPointZ); + } } }