feat: pass cosmetic data through avatar render state

This commit is contained in:
2026-07-14 15:27:23 +02:00
parent 6eae5ab5cf
commit b42e397365
3 changed files with 72 additions and 0 deletions
@@ -0,0 +1,38 @@
package de.fullrisk.citrusDev.mixin;
import de.fullrisk.citrusDev.client.cosmetic.CosmeticData;
import de.fullrisk.citrusDev.client.cosmetic.CosmeticRenderData;
import de.fullrisk.citrusDev.client.cosmetic.CosmeticRenderStateKeys;
import de.fullrisk.citrusDev.client.cosmetic.PlayerCosmeticManager;
import net.minecraft.client.renderer.entity.player.AvatarRenderer;
import net.minecraft.client.renderer.entity.state.AvatarRenderState;
import net.minecraft.world.entity.Avatar;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.UUID;
@Mixin(AvatarRenderer.class)
abstract class AvatarRendererMixin {
@Inject(
method = "extractRenderState(Lnet/minecraft/world/entity/Avatar;Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;F)V",
at = @At("TAIL")
)
private void citrus$extractCosmetic(
Avatar avatar,
AvatarRenderState state,
float partialTick,
CallbackInfo callbackInfo
) {
UUID playerId = avatar.getUUID();
CosmeticData cosmetic = PlayerCosmeticManager.getCosmetic(playerId)
.filter(CosmeticData::visible)
.orElse(null);
state.setData(
CosmeticRenderStateKeys.COSMETIC,
cosmetic == null ? null : new CosmeticRenderData(playerId, cosmetic, partialTick)
);
}
}
@@ -0,0 +1,32 @@
package de.fullrisk.citrusDev.mixin;
import com.mojang.blaze3d.vertex.PoseStack;
import de.fullrisk.citrusDev.client.cosmetic.CosmeticRenderStateKeys;
import net.minecraft.client.renderer.SubmitNodeCollector;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.client.renderer.entity.state.AvatarRenderState;
import net.minecraft.client.renderer.entity.state.LivingEntityRenderState;
import net.minecraft.client.renderer.state.level.CameraRenderState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(LivingEntityRenderer.class)
abstract class LivingEntityRendererMixin {
@Inject(
method = "submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/CameraRenderState;)V",
at = @At("HEAD")
)
private void citrus$captureAvatarCamera(
LivingEntityRenderState state,
PoseStack poseStack,
SubmitNodeCollector nodeCollector,
CameraRenderState cameraRenderState,
CallbackInfo callbackInfo
) {
if (state instanceof AvatarRenderState avatarState) {
avatarState.setData(CosmeticRenderStateKeys.CAMERA, cameraRenderState);
}
}
}
@@ -6,8 +6,10 @@
"mixins": [
],
"client": [
"AvatarRendererMixin",
"HitboxColorMixin",
"LightmapRenderStateExtractorMixin",
"LivingEntityRendererMixin",
"MouseHandlerMixin",
"OwnNametagMixin",
"PlayerNametagMixin",