From bb959991123c78903a21d6d113745d3a5d49563f Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 25 Feb 2026 04:34:57 +0100 Subject: [PATCH 01/11] Implementing cape curving --- .../cosmetics/CloakFeatureRenderer.java | 307 ++++-------------- 1 file changed, 63 insertions(+), 244 deletions(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index 6dc23bd..b52aaa5 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -1,28 +1,19 @@ package org.saturnclient.saturnclient.cosmetics; import org.saturnclient.saturnclient.client.player.SaturnPlayer; -import org.saturnclient.saturnclient.config.Config; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; -import net.minecraft.client.render.entity.equipment.EquipmentModel.LayerType; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.EquippableComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.item.equipment.EquipmentAsset; -import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; -import net.minecraft.util.math.RotationAxis; import net.minecraft.util.math.Vec3d; /** @@ -35,44 +26,6 @@ import net.minecraft.util.math.Vec3d; public class CloakFeatureRenderer extends FeatureRenderer { private final EquipmentModelLoader equipmentModelLoader; private static final int PARTS = 16; - private float currentVelocity = 0.0f; - - private static final float TEX_W = 176f; - private static final float TEX_H = 138f; - - private static final class PxRect { - final int x, y, w, h; - - PxRect(int x, int y, int w, int h) { - this.x = x; - this.y = y; - this.w = w; - this.h = h; - } - - float u1() { - return x / TEX_W; - } - - float v1() { - return y / TEX_H; - } - - float u2() { - return (x + w) / TEX_W; - } - - float v2() { - return (y + h) / TEX_H; - } - } - - private static final PxRect FRONT_RECT = new PxRect(8, 8, 80, 128); - private static final PxRect BACK_RECT = new PxRect(96, 8, 80, 128); - private static final PxRect LEFT_EDGE_RECT = new PxRect(0, 8, 8, 128); - private static final PxRect RIGHT_EDGE_RECT = new PxRect(88, 8, 8, 128); - private static final PxRect TOP_RECT = new PxRect(8, 0, 80, 8); - private static final PxRect BOTTOM_RECT = new PxRect(88, 0, 80, 8); public CloakFeatureRenderer(FeatureRendererContext context, EquipmentModelLoader equipmentModelLoader) { @@ -80,18 +33,6 @@ public class CloakFeatureRenderer extends FeatureRenderer) equippableComponent.assetId().get()); - return !equipmentModel.getLayers(layerType).isEmpty(); - } else { - return false; - } - } - private void renderCapeQuad(VertexConsumer vertexConsumer, MatrixStack matrixStack, Vec3d bottomLeft, Vec3d bottomRight, Vec3d topRight, Vec3d topLeft, float u1, float v1, float u2, float v2, int light, int overlay, @@ -137,215 +78,93 @@ public class CloakFeatureRenderer extends FeatureRenderer> 4) & 0xF; - int skyLight = (light >> 20) & 0xF; - blockLight = Math.max(blockLight, minBrightness); - skyLight = Math.max(skyLight, minBrightness); - light = (skyLight << 20) | (blockLight << 4); + VertexConsumer consumer = providers.getBuffer(RenderLayer.getEntityTranslucent(cape)); - matrixStack.push(); - VertexConsumer vertexConsumer = vertexConsumerProvider - .getBuffer(RenderLayer.getEntityAlpha(customCape)); - - float targetVelocity = ((6.0F + playerEntityRenderState.field_53537 / 2.0F - + playerEntityRenderState.field_53536) * 0.02f); - targetVelocity = Math.max(0.0f, targetVelocity - 0.1f); - - float accelerationRate = 0.02f; - this.currentVelocity = this.currentVelocity - + (targetVelocity - this.currentVelocity) * accelerationRate; - - float rotation = this.currentVelocity * 72.0f; - float curve = this.currentVelocity * 0.4f; - - if (playerEntityRenderState.sneaking && playerEntityRenderState.isInSneakingPose) { - matrixStack.translate(0, 0.24f, 0); - matrixStack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(27.0f)); - curve += 0.2f; - } - - matrixStack.translate(0.0f, -0.25f, 0.0f); - if (this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, - LayerType.HUMANOID)) { - matrixStack.translate(0.0F, -0.053125F, 0.06875F); - } - - if (playerEntityRenderState.isSwimming) { - curve = 0.0f; - rotation = 0.0f; - } - - if (!Config.bendyCloaks.value) { - curve = 0.0f; - } - - renderCape(matrixStack, vertexConsumer, playerEntityRenderState, light, - OverlayTexture.DEFAULT_UV, Math.min(rotation, 60.0f), Math.min(curve, 0.5f)); - - matrixStack.pop(); + renderCape( + matrices, + consumer, + state, + light, + OverlayTexture.DEFAULT_UV); } } From dfce271c379cf99b16d6f47b1b3bfd1716d6fa7b Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 25 Feb 2026 13:52:07 +0100 Subject: [PATCH 02/11] Cape segment specific rendering --- .../cosmetics/CloakFeatureRenderer.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index b52aaa5..948ad9b 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -1,5 +1,7 @@ package org.saturnclient.saturnclient.cosmetics; +import java.util.Arrays; + import org.saturnclient.saturnclient.client.player.SaturnPlayer; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; @@ -26,11 +28,14 @@ import net.minecraft.util.math.Vec3d; public class CloakFeatureRenderer extends FeatureRenderer { private final EquipmentModelLoader equipmentModelLoader; private static final int PARTS = 16; + private final float[] segmentValues = new float[PARTS]; public CloakFeatureRenderer(FeatureRendererContext context, EquipmentModelLoader equipmentModelLoader) { super(context); this.equipmentModelLoader = equipmentModelLoader; + + Arrays.fill(segmentValues, 0.0f); } private void renderCapeQuad(VertexConsumer vertexConsumer, MatrixStack matrixStack, @@ -93,21 +98,20 @@ public class CloakFeatureRenderer extends FeatureRenderer Date: Wed, 25 Feb 2026 14:17:57 +0100 Subject: [PATCH 03/11] Working full cape rendering --- .../cosmetics/CloakFeatureRenderer.java | 265 ++++++++++++++---- 1 file changed, 212 insertions(+), 53 deletions(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index 948ad9b..209a5f8 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -9,12 +9,19 @@ import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; +import net.minecraft.client.render.entity.equipment.EquipmentModel.LayerType; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.PlayerEntityModel; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.EquippableComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.item.equipment.EquipmentAsset; +import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; import net.minecraft.util.math.Vec3d; @@ -28,14 +35,63 @@ import net.minecraft.util.math.Vec3d; public class CloakFeatureRenderer extends FeatureRenderer { private final EquipmentModelLoader equipmentModelLoader; private static final int PARTS = 16; + private float currentVelocity = 0.0f; private final float[] segmentValues = new float[PARTS]; + private static final float TEX_W = 176f; + private static final float TEX_H = 138f; + + private static final class PxRect { + final int x, y, w, h; + + PxRect(int x, int y, int w, int h) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + } + + float u1() { + return x / TEX_W; + } + + float v1() { + return y / TEX_H; + } + + float u2() { + return (x + w) / TEX_W; + } + + float v2() { + return (y + h) / TEX_H; + } + } + + private static final PxRect FRONT_RECT = new PxRect(8, 8, 80, 128); + private static final PxRect BACK_RECT = new PxRect(96, 8, 80, 128); + private static final PxRect LEFT_EDGE_RECT = new PxRect(0, 8, 8, 128); + private static final PxRect RIGHT_EDGE_RECT = new PxRect(88, 8, 8, 128); + private static final PxRect TOP_RECT = new PxRect(8, 0, 80, 8); + private static final PxRect BOTTOM_RECT = new PxRect(88, 0, 80, 8); + public CloakFeatureRenderer(FeatureRendererContext context, EquipmentModelLoader equipmentModelLoader) { super(context); this.equipmentModelLoader = equipmentModelLoader; + Arrays.fill(segmentValues, 0.5f); + } - Arrays.fill(segmentValues, 0.0f); + private boolean hasCustomModelForLayer(ItemStack stack, EquipmentModel.LayerType layerType) { + EquippableComponent equippableComponent = (EquippableComponent) stack + .get(DataComponentTypes.EQUIPPABLE); + if (equippableComponent != null && !equippableComponent.assetId().isEmpty()) { + EquipmentModel equipmentModel = this.equipmentModelLoader + .get((RegistryKey) equippableComponent.assetId().get()); + return !equipmentModel.getLayers(layerType).isEmpty(); + } else { + return false; + } } private void renderCapeQuad(VertexConsumer vertexConsumer, MatrixStack matrixStack, @@ -83,35 +139,67 @@ public class CloakFeatureRenderer extends FeatureRenderer> 4) & 0xF; + int skyLight = (light >> 20) & 0xF; + blockLight = Math.max(blockLight, minBrightness); + skyLight = Math.max(skyLight, minBrightness); + light = (skyLight << 20) | (blockLight << 4); - Arrays.fill(segmentValues, 0.5f); + VertexConsumer vertexConsumer = vertexConsumerProvider + .getBuffer(RenderLayer.getEntityAlpha(customCape)); - renderCape( - matrices, - consumer, - state, - light, - OverlayTexture.DEFAULT_UV); + float base = Math.min(currentVelocity, 1.0f); + + for (int i = 0; i < PARTS; i++) { + float falloff = i / (float) (PARTS - 1); + segmentValues[i] = base * falloff; + } + + matrixStack.push(); + + matrixStack.translate(0.0f, -0.25f, 0.0f); + + if (this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, LayerType.HUMANOID)) { + matrixStack.translate(0.0F, -0.053125F, 0.06875F); + } + + renderCape(matrixStack, vertexConsumer, playerEntityRenderState, light, OverlayTexture.DEFAULT_UV); + + matrixStack.pop(); } } From f40d3026e61cfe69773d22a6cf131aa56ca78169 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 25 Feb 2026 14:41:22 +0100 Subject: [PATCH 04/11] Fixed reverse rendering and position --- .../cosmetics/CloakFeatureRenderer.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index 209a5f8..790b5f6 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -35,7 +35,6 @@ import net.minecraft.util.math.Vec3d; public class CloakFeatureRenderer extends FeatureRenderer { private final EquipmentModelLoader equipmentModelLoader; private static final int PARTS = 16; - private float currentVelocity = 0.0f; private final float[] segmentValues = new float[PARTS]; private static final float TEX_W = 176f; @@ -151,7 +150,6 @@ public class CloakFeatureRenderer extends FeatureRenderer Date: Wed, 25 Feb 2026 16:06:10 +0100 Subject: [PATCH 05/11] Fixing the rendering anchoring --- .../cosmetics/CloakFeatureRenderer.java | 157 +++++++----------- 1 file changed, 64 insertions(+), 93 deletions(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index 790b5f6..74b57a9 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -78,7 +78,7 @@ public class CloakFeatureRenderer extends FeatureRenderer Date: Wed, 25 Feb 2026 16:24:45 +0100 Subject: [PATCH 06/11] Working ish system --- .../saturnclient/cosmetics/CloakFeatureRenderer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index 74b57a9..6d07f02 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -181,7 +181,7 @@ public class CloakFeatureRenderer extends FeatureRenderer Date: Wed, 25 Feb 2026 16:34:06 +0100 Subject: [PATCH 07/11] Fixed gap --- .../saturnclient/cosmetics/CloakFeatureRenderer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index 6d07f02..712e543 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -78,7 +78,7 @@ public class CloakFeatureRenderer extends FeatureRenderer Date: Wed, 25 Feb 2026 16:52:12 +0100 Subject: [PATCH 08/11] Working simulation --- .../cosmetics/CloakFeatureRenderer.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index 712e543..b7d2f21 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -252,6 +252,19 @@ public class CloakFeatureRenderer extends FeatureRenderer 0; i--) { + segmentValues[i] = segmentValues[i - 1]; + } + + // Insert the new value at index 0 + segmentValues[0] = value; + } + + private long lastUpdate = 0; + public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int light, PlayerEntityRenderState playerEntityRenderState, float f, float g) { if (playerEntityRenderState.invisible || !playerEntityRenderState.capeVisible @@ -289,9 +302,12 @@ public class CloakFeatureRenderer extends FeatureRenderer= 20) { + float value = playerEntityRenderState.field_53537 / 108.0f; + updateSegmentValues(value); + lastUpdate = now; + } renderCape(matrixStack, vertexConsumer, playerEntityRenderState, light, OverlayTexture.DEFAULT_UV); From 84addc79964fe59d4d088f236fef9163d3929a62 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 25 Feb 2026 17:11:38 +0100 Subject: [PATCH 09/11] Fixed gaps in curve --- .../cosmetics/CloakFeatureRenderer.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index b7d2f21..7b7b564 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -181,33 +181,36 @@ public class CloakFeatureRenderer extends FeatureRenderer 0) ? (2.0f - segmentValues[i - 1]) * ((float) Math.PI / 2f) : angle; + float startAvgAngle = (angle + prevAngle) / 2.0f; + float thickYStart = (float) Math.sin(startAvgAngle) * capeDepth; + float thickZStart = (float) Math.cos(startAvgAngle) * capeDepth; + + // 2. Thickness at the END of this segment (Must match NEXT segment's start) + float nextAngle = (i < PARTS - 1) ? (2.0f - segmentValues[i + 1]) * ((float) Math.PI / 2f) : angle; + float endAvgAngle = (angle + nextAngle) / 2.0f; + float thickYEnd = (float) Math.sin(endAvgAngle) * capeDepth; + float thickZEnd = (float) Math.cos(endAvgAngle) * capeDepth; float nextY = curY + dirY * capePartHeight; float nextZ = curZ + dirZ * capePartHeight; - // Vertices for the "Inner" face (Front - facing player) + // Inner Vertices (The spine of the cape) Vec3d innerTopLeft = new Vec3d(x2, curY, curZ); Vec3d innerTopRight = new Vec3d(x1, curY, curZ); Vec3d innerBotLeft = new Vec3d(x2, nextY, nextZ); Vec3d innerBotRight = new Vec3d(x1, nextY, nextZ); - // Vertices for the "Outer" face (Back - facing world) - // We offset these by the thickness vector - Vec3d outerTopLeft = new Vec3d(x2, curY + thickY, curZ + thickZ); - Vec3d outerTopRight = new Vec3d(x1, curY + thickY, curZ + thickZ); - Vec3d outerBotLeft = new Vec3d(x2, nextY + thickY, nextZ + thickZ); - Vec3d outerBotRight = new Vec3d(x1, nextY + thickY, nextZ + thickZ); + // Outer Vertices (Offset by the specific joint thickness) + Vec3d outerTopLeft = new Vec3d(x2, curY + thickYStart, curZ + thickZStart); + Vec3d outerTopRight = new Vec3d(x1, curY + thickYStart, curZ + thickZStart); + Vec3d outerBotLeft = new Vec3d(x2, nextY + thickYEnd, nextZ + thickZEnd); + Vec3d outerBotRight = new Vec3d(x1, nextY + thickYEnd, nextZ + thickZEnd); // FRONT (Inner) - Changed winding/order to fix flipping this.renderCapeQuad(vertexConsumer, matrixStack, From 28d71e63a9bcbc88a4934c90b9c97476b8b16e3a Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 25 Feb 2026 17:35:50 +0100 Subject: [PATCH 10/11] Flat cloak --- .../saturnclient/config/Config.java | 4 ++-- .../cosmetics/CloakFeatureRenderer.java | 20 ++++++++++++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/saturnclient/saturnclient/config/Config.java b/src/main/java/org/saturnclient/saturnclient/config/Config.java index 08a5b90..109deea 100644 --- a/src/main/java/org/saturnclient/saturnclient/config/Config.java +++ b/src/main/java/org/saturnclient/saturnclient/config/Config.java @@ -12,7 +12,7 @@ public class Config { public static Property realisticLogo = Property.bool(false); public static Property saturnTitleScreen = Property.bool(true); - public static Property bendyCloaks = Property.bool(true); + public static Property cloakPhysics = Property.bool(true); public static Property openEmoteWheel = Property.keybinding(GLFW.GLFW_KEY_B); public static Property stagger = Property.bool(true); @@ -25,7 +25,7 @@ public class Config { config.property("Realistic logo", realisticLogo); config.property("Saturn client title screen", saturnTitleScreen); config.property("Open Emote Wheel", openEmoteWheel); - config.property("Bendy Cloaks", bendyCloaks); + config.property("Cloak Physics", cloakPhysics); config.property("Stagger Animations", stagger); // Initialize a sub namespace for theme diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index 7b7b564..2de5496 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -3,6 +3,7 @@ package org.saturnclient.saturnclient.cosmetics; import java.util.Arrays; import org.saturnclient.saturnclient.client.player.SaturnPlayer; +import org.saturnclient.saturnclient.config.Config; import org.saturnclient.saturnclient.cosmetics.cloaks.Cloaks; import net.minecraft.client.render.OverlayTexture; @@ -282,8 +283,8 @@ public class CloakFeatureRenderer extends FeatureRenderer= 20) { float value = playerEntityRenderState.field_53537 / 108.0f; - updateSegmentValues(value); + if (Config.cloakPhysics.value) { + updateSegmentValues(value); + } else { + float last = segmentValues[0]; + float maxStep = 0.02f; + float next = value; + + if (next > last) + next = Math.min(next, last + maxStep); + else if (next < last) + next = Math.max(next, last - maxStep); + + Arrays.fill(segmentValues, next); + } lastUpdate = now; } From 5b44caa3588ed9637c41ee24dd2b5981aff2faec Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 25 Feb 2026 17:47:49 +0100 Subject: [PATCH 11/11] Falling physics --- .../saturnclient/cosmetics/CloakFeatureRenderer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java index 2de5496..6a519d5 100644 --- a/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CloakFeatureRenderer.java @@ -308,7 +308,8 @@ public class CloakFeatureRenderer extends FeatureRenderer= 20) { - float value = playerEntityRenderState.field_53537 / 108.0f; + float value = Math.min(1.0f, playerEntityRenderState.field_53537 / 108.0f) + + (Math.max(0, playerEntityRenderState.field_53536) / 16); if (Config.cloakPhysics.value) { updateSegmentValues(value); } else {