From a304cb921b17056d67389b3bee063f4edb6261e4 Mon Sep 17 00:00:00 2001 From: Sarocesch <91789564+Sarocesch@users.noreply.github.com> Date: Wed, 18 Feb 2026 00:02:08 +0100 Subject: [PATCH 1/6] Update ArmorNode.java --- .../java/fr/dynamx/client/renders/scene/node/ArmorNode.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/fr/dynamx/client/renders/scene/node/ArmorNode.java b/src/main/java/fr/dynamx/client/renders/scene/node/ArmorNode.java index f53f17fd3..843c81a8d 100644 --- a/src/main/java/fr/dynamx/client/renders/scene/node/ArmorNode.java +++ b/src/main/java/fr/dynamx/client/renders/scene/node/ArmorNode.java @@ -52,8 +52,7 @@ public void render(BaseRenderContext.ArmorRenderContext context, A packInfo, Mat public void renderItemModel(BaseRenderContext.ItemRenderContext context, A packInfo, Matrix4f transform) { EntityEquipmentSlot slot = ((DynamXItemArmor) context.getStack().getItem()).armorType; packInfo.getObjArmor().setActivePart(slot, context.getTextureId()); - //restore default rotations (contained in ModelBiped) - packInfo.getObjArmor().setModelAttributes(packInfo.getObjArmor()); + packInfo.getObjArmor().resetArmorRenderers(); if (context.getRenderType() != ItemCameraTransforms.TransformType.GUI) transform.rotate((float) (Math.PI / 2), 1, 0, 0); switch (slot) { From b176c7d4d1bb044284ed250382a8054919cca614 Mon Sep 17 00:00:00 2001 From: Sarocesch <91789564+Sarocesch@users.noreply.github.com> Date: Wed, 18 Feb 2026 00:02:27 +0100 Subject: [PATCH 2/6] Update ModelObjArmor.java --- .../client/renders/model/ModelObjArmor.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/fr/dynamx/client/renders/model/ModelObjArmor.java b/src/main/java/fr/dynamx/client/renders/model/ModelObjArmor.java index 4f37f239b..c7c44985e 100644 --- a/src/main/java/fr/dynamx/client/renders/model/ModelObjArmor.java +++ b/src/main/java/fr/dynamx/client/renders/model/ModelObjArmor.java @@ -222,6 +222,23 @@ protected void renderPart(Matrix4f transform, ArmorRenderer armor, boolean force armor.render(tempTransform, forceVanillaRender); } + public void resetArmorRenderers() { + if (head != null) resetRenderer(head); + if (body != null) resetRenderer(body); + if (arms != null) { for (ArmorRenderer arm : arms) resetRenderer(arm); } + if (legs != null) { for (ArmorRenderer leg : legs) resetRenderer(leg); } + if (foot != null) { for (ArmorRenderer f : foot) resetRenderer(f); } + } + + private static void resetRenderer(ArmorRenderer armor) { + armor.rotationPointX = armor.offsetX; + armor.rotationPointY = armor.offsetY; + armor.rotationPointZ = armor.offsetZ; + armor.rotateAngleX = 0; + armor.rotateAngleY = 0; + armor.rotateAngleZ = 0; + } + private static void copyModelAnglesForArmor(ModelRenderer bodyPart, ModelRenderer armor) { armor.rotationPointX = bodyPart.rotationPointX / 16f; armor.rotationPointY = bodyPart.rotationPointY / 16f; From 5585f65860b4e99ba274369d4c2701768d437b54 Mon Sep 17 00:00:00 2001 From: Sarocesch <91789564+Sarocesch@users.noreply.github.com> Date: Wed, 18 Feb 2026 00:03:58 +0100 Subject: [PATCH 3/6] Update Engine.java --- .../physics/entities/parts/engine/Engine.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/dynamx/common/physics/entities/parts/engine/Engine.java b/src/main/java/fr/dynamx/common/physics/entities/parts/engine/Engine.java index ebb5850b6..d452e6f0c 100644 --- a/src/main/java/fr/dynamx/common/physics/entities/parts/engine/Engine.java +++ b/src/main/java/fr/dynamx/common/physics/entities/parts/engine/Engine.java @@ -86,7 +86,12 @@ public float getPowerOutputAtRevs() { * @return the power at this rev-range, from 0 to getPower(). */ public float evaluateSpline(LinearSpline powerGraph, float range) { - int index = powerGraph.getControlPoints().size() - 1; + int size = powerGraph.getControlPoints().size(); + if (size < 2) { + return size == 1 ? powerGraph.getControlPoints().get(0).y : 0; + } + + int index = size - 1; Vector3f point = powerGraph.getControlPoints().get(index); while (point.x >= range && index > 0) { @@ -94,10 +99,16 @@ public float evaluateSpline(LinearSpline powerGraph, float range) { point = powerGraph.getControlPoints().get(index); } + // Clamp index so that index + 1 stays within bounds + if (index >= size - 1) { + index = size - 2; + } + float start = point.x; float end = powerGraph.getControlPoints().get(index + 1).x; float interp = map(range, start, end, 0, 1); + interp = DynamXMath.clamp(interp, 0, 1); return powerGraph.interpolate(interp, index, null).y; } From f57e0b64056b25096983e70f1d8f9e1382eef5e3 Mon Sep 17 00:00:00 2001 From: Sarocesch <91789564+Sarocesch@users.noreply.github.com> Date: Wed, 18 Feb 2026 00:04:16 +0100 Subject: [PATCH 4/6] Update BasePhysicsWorld.java --- .../fr/dynamx/common/physics/world/BasePhysicsWorld.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/dynamx/common/physics/world/BasePhysicsWorld.java b/src/main/java/fr/dynamx/common/physics/world/BasePhysicsWorld.java index 8e6976e1b..d6190d073 100644 --- a/src/main/java/fr/dynamx/common/physics/world/BasePhysicsWorld.java +++ b/src/main/java/fr/dynamx/common/physics/world/BasePhysicsWorld.java @@ -166,7 +166,7 @@ protected void stepSimulationImpl(Profiler profiler, Semaphore syncThreadsLock) //e.getNetwork().onPrePhysicsTick(profiler); e.getSynchronizer().onPrePhysicsTick(profiler); } catch (Exception ex) { - throw new PhysicsEntityException(e, "prePhysicsTick", ex); + DynamXMain.log.error("Exception during prePhysicsTick for entity " + e + ", skipping this tick", ex); } QuaternionPool.closePool(); Vector3fPool.closePool(); @@ -202,7 +202,7 @@ protected void stepSimulationImpl(Profiler profiler, Semaphore syncThreadsLock) try { e.getSynchronizer().onPostPhysicsTick(profiler); } catch (Exception ex) { - throw new PhysicsEntityException(e, "postPhysicsTick", ex); + DynamXMain.log.error("Exception during postPhysicsTick for entity " + e + ", skipping this tick", ex); } QuaternionPool.closePool(); Vector3fPool.closePool(); @@ -275,4 +275,4 @@ public void clearAll() { ClientDebugSystem.trackedRigidBodies.clear(); } } -} \ No newline at end of file +} From 58e2bc758ef979c38a736ea3e3ec3301468373fd Mon Sep 17 00:00:00 2001 From: Sarocesch <91789564+Sarocesch@users.noreply.github.com> Date: Wed, 18 Feb 2026 03:08:12 +0100 Subject: [PATCH 5/6] Update ModelObjArmor.java --- .../dynamx/client/renders/model/ModelObjArmor.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/fr/dynamx/client/renders/model/ModelObjArmor.java b/src/main/java/fr/dynamx/client/renders/model/ModelObjArmor.java index c7c44985e..7e7c5cc97 100644 --- a/src/main/java/fr/dynamx/client/renders/model/ModelObjArmor.java +++ b/src/main/java/fr/dynamx/client/renders/model/ModelObjArmor.java @@ -173,42 +173,42 @@ public void renderPart(Matrix4f transform, EntityEquipmentSlot part, boolean for public void renderHead(float scale) { if (head != null) { - setModelAttributes(this); //Reset rotations + resetArmorRenderers(); head.render(scale); } } public void renderChest(float scale) { if (body != null) { - setModelAttributes(this); //Reset rotations + resetArmorRenderers(); body.render(scale); } } public void renderLeftArm(float scale) { if (arms != null) { - setModelAttributes(this); //Reset rotations + resetArmorRenderers(); renderPart(arms[0], scale); } } public void renderRightArm(float scale) { if (arms != null) { - setModelAttributes(this); //Reset rotations + resetArmorRenderers(); renderPart(arms[1], scale); } } public void renderLeftLeg(float scale) { if (legs != null) { - setModelAttributes(this); //Reset rotations + resetArmorRenderers(); renderPart(legs[0], scale); } } public void renderRightLeg(float scale) { if (legs != null) { - setModelAttributes(this); //Reset rotations + resetArmorRenderers(); renderPart(legs[1], scale); } } From b0435050bf2187a59aa2ddfba436aea1c92d27c8 Mon Sep 17 00:00:00 2001 From: Sarocesch <91789564+Sarocesch@users.noreply.github.com> Date: Wed, 11 Mar 2026 22:00:37 +0100 Subject: [PATCH 6/6] setDead --- .../fr/dynamx/common/physics/world/BasePhysicsWorld.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/dynamx/common/physics/world/BasePhysicsWorld.java b/src/main/java/fr/dynamx/common/physics/world/BasePhysicsWorld.java index d6190d073..05b09cad8 100644 --- a/src/main/java/fr/dynamx/common/physics/world/BasePhysicsWorld.java +++ b/src/main/java/fr/dynamx/common/physics/world/BasePhysicsWorld.java @@ -166,7 +166,8 @@ protected void stepSimulationImpl(Profiler profiler, Semaphore syncThreadsLock) //e.getNetwork().onPrePhysicsTick(profiler); e.getSynchronizer().onPrePhysicsTick(profiler); } catch (Exception ex) { - DynamXMain.log.error("Exception during prePhysicsTick for entity " + e + ", skipping this tick", ex); + DynamXMain.log.error("Exception during prePhysicsTick for entity " + e + ", killing entity to prevent tick loops", ex); + e.setDead(); } QuaternionPool.closePool(); Vector3fPool.closePool(); @@ -202,7 +203,8 @@ protected void stepSimulationImpl(Profiler profiler, Semaphore syncThreadsLock) try { e.getSynchronizer().onPostPhysicsTick(profiler); } catch (Exception ex) { - DynamXMain.log.error("Exception during postPhysicsTick for entity " + e + ", skipping this tick", ex); + DynamXMain.log.error("Exception during postPhysicsTick for entity " + e + ", killing entity to prevent tick loops", ex); + e.setDead(); } QuaternionPool.closePool(); Vector3fPool.closePool();