Working Player tracking

This commit is contained in:
2026-04-08 19:18:31 +02:00
parent f79849d9fb
commit 84947d6b33
4 changed files with 18 additions and 73 deletions
@@ -11,10 +11,10 @@ import org.saturnclient.common.ref.asset.IdentifierRef;
import org.saturnclient.config.Config;
import org.saturnclient.cosmetics.Cloaks;
import org.saturnclient.impl.cosmetics.utils.ShaderUtils;
import org.saturnclient.saturnclient.SaturnRenderState;
import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.command.OrderedRenderCommandQueue;
import net.minecraft.client.render.entity.equipment.EquipmentModel;
import net.minecraft.client.render.entity.equipment.EquipmentModelLoader;
@@ -281,78 +281,15 @@ public class CloakFeatureRenderer extends FeatureRenderer<PlayerEntityRenderStat
private long lastUpdate = 0;
public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int light,
PlayerEntityRenderState playerEntityRenderState, float f, float g) {
if (playerEntityRenderState.invisible || !playerEntityRenderState.capeVisible
|| playerEntityRenderState.skinTextures.cape() != null) {
return;
}
SaturnPlayer player = SaturnPlayer.get(playerEntityRenderState.playerName.getString());
if (player == null) {
return;
}
IdentifierRef customCape = Cloaks.getCurrentCloakTexture(player.cloak);
if (customCape == null
|| this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, LayerType.WINGS)) {
return;
}
int minBrightness = 7;
int blockLight = (light >> 4) & 0xF;
int skyLight = (light >> 20) & 0xF;
blockLight = Math.max(blockLight, minBrightness);
skyLight = Math.max(skyLight, minBrightness);
light = (skyLight << 20) | (blockLight << 4);
VertexConsumer vertexConsumer = vertexConsumerProvider
.getBuffer(ShaderUtils.getRenderLayer(customCape));
matrixStack.push();
matrixStack.translate(0.0f, 0.0f, 0.12f);
if (this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, LayerType.HUMANOID)) {
matrixStack.translate(0.0F, -0.053125F, 0.06875F);
}
if (playerEntityRenderState.isInSneakingPose) {
matrixStack.translate(0, 0.16f, 0.0f);
matrixStack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(29.0f));
}
long now = System.currentTimeMillis();
if (now - lastUpdate >= 20) {
float velX = Math.min(0.6f, playerEntityRenderState.field_53537 / 108.0f);
float rawVelY = playerEntityRenderState.field_53536;
float velY = (rawVelY > 3.4f ? rawVelY : rawVelY < -3.4f ? rawVelY : 0.0f) / 16;
float value = Math.max(0.0f, Math.min(2.0f, playerEntityRenderState.isSwimming ? 0.0f : velX + velY));
if (Config.cloakPhysics.value) {
updateSegmentValues(segmentValues[0] + (value - segmentValues[0]) * 0.3f);
} else {
Arrays.fill(segmentValues, segmentValues[0] + (value - segmentValues[0]) * 0.05f);
}
lastUpdate = now;
}
renderCape(matrixStack, vertexConsumer, playerEntityRenderState, light, OverlayTexture.DEFAULT_UV);
matrixStack.pop();
}
@Override
public void render(MatrixStack matrices, OrderedRenderCommandQueue queue, int light, PlayerEntityRenderState state,
float limbAngle, float limbDistance) {
if (state.playerName == null || state.invisible || !state.capeVisible
if (state.invisible || !state.capeVisible
|| state.skinTextures.cape() != null) {
return;
}
SaturnPlayer player = SaturnPlayer.get(state.playerName.getString());
SaturnPlayer player = state.getData(SaturnRenderState.saturnDataKey);
if (player == null) {
return;
@@ -0,0 +1,12 @@
package org.saturnclient.saturnclient;
import org.jspecify.annotations.NonNull;
import org.saturnclient.client.player.SaturnPlayer;
import net.fabricmc.fabric.api.client.rendering.v1.RenderStateDataKey;
public class SaturnRenderState {
@NonNull
public static RenderStateDataKey<SaturnPlayer> saturnDataKey = RenderStateDataKey
.create(() -> "saturn-client-player");
}
@@ -1,6 +1,5 @@
package org.saturnclient.saturnclient.mixin;
import net.fabricmc.fabric.api.client.rendering.v1.RenderStateDataKey;
import net.minecraft.client.network.ClientPlayerLikeEntity;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.render.entity.LivingEntityRenderer;
@@ -12,11 +11,11 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import org.jspecify.annotations.NonNull;
import org.saturnclient.client.player.Roles;
import org.saturnclient.client.player.SaturnPlayer;
import org.saturnclient.impl.cosmetics.CloakFeatureRenderer;
import org.saturnclient.impl.cosmetics.HatFeatureRenderer;
import org.saturnclient.saturnclient.SaturnRenderState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -26,9 +25,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class PlayerEntityRendererMixin
extends LivingEntityRenderer<PlayerEntity, PlayerEntityRenderState, PlayerEntityModel> {
@NonNull
RenderStateDataKey<SaturnPlayer> saturnDataKey = RenderStateDataKey.create(() -> "saturn-client-player");
protected PlayerEntityRendererMixin() {
super(null, null, 0.0f);
}
@@ -49,7 +45,7 @@ public abstract class PlayerEntityRendererMixin
SaturnPlayer player = SaturnPlayer.get(entity.getUuid());
state.setData(saturnDataKey, player);
state.setData(SaturnRenderState.saturnDataKey, player);
if (player != null) {
MutableText iconText = Text.literal(Roles.getSaturnIndicator())
@@ -155,8 +155,8 @@ public abstract class SplashOverlayMixin {
reloadCompleteTime = Util.getMeasuringTimeMs();
Window window = client.getWindow();
if (client.currentScreen != null) {
Window window = this.client.getWindow();
client.currentScreen.init(window.getScaledWidth(), window.getScaledHeight());
}
}