From 9174c83a332d5cc426883392ea9bac199a4324fa Mon Sep 17 00:00:00 2001 From: Leo dev Date: Fri, 28 Mar 2025 03:32:19 +0100 Subject: [PATCH] proper hat rendering --- .../cosmetics/CustomHeadFeatureRenderer.java | 65 ++++++++++++++++++ .../mixin/ArmorFeatureRendererMixin.java | 21 ------ .../mixin/PlayerEntityRendererMixin.java | 28 ++++++++ .../assets/saturnclient/items/hat.json | 6 ++ .../assets/saturnclient/models/item/hat.json | 42 +++++++++++ .../assets/saturnclient/textures/item/hat.png | Bin 0 -> 214 bytes src/main/resources/saturnclient.mixins.json | 2 +- 7 files changed, 142 insertions(+), 22 deletions(-) create mode 100644 src/main/java/org/saturnclient/saturnclient/cosmetics/CustomHeadFeatureRenderer.java delete mode 100644 src/main/java/org/saturnclient/saturnclient/mixin/ArmorFeatureRendererMixin.java create mode 100644 src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java create mode 100644 src/main/resources/assets/saturnclient/items/hat.json create mode 100644 src/main/resources/assets/saturnclient/models/item/hat.json create mode 100644 src/main/resources/assets/saturnclient/textures/item/hat.png diff --git a/src/main/java/org/saturnclient/saturnclient/cosmetics/CustomHeadFeatureRenderer.java b/src/main/java/org/saturnclient/saturnclient/cosmetics/CustomHeadFeatureRenderer.java new file mode 100644 index 0000000..6a62199 --- /dev/null +++ b/src/main/java/org/saturnclient/saturnclient/cosmetics/CustomHeadFeatureRenderer.java @@ -0,0 +1,65 @@ +package org.saturnclient.saturnclient.cosmetics; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.VertexConsumerProvider; +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.render.item.ItemRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.ModelTransformationMode; +import net.minecraft.util.Identifier; + +public class CustomHeadFeatureRenderer extends FeatureRenderer { + public CustomHeadFeatureRenderer(FeatureRendererContext context) { + super(context); + } + + @Override + public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, + PlayerEntityRenderState state, float limbAngle, float limbDistance) { + ItemStack headItem = state.equippedHeadStack; + if (headItem.isEmpty()) { + matrices.push(); + + // Apply the head's rotations to align with the player's head orientation + this.getContextModel().head.rotate(matrices); + + // Scale the item to fit properly + matrices.scale(0.5f, .5f, 0.5f); + + // Position the item properly + matrices.translate(0.0f, -0.8f, 0.0f); + + // Rotate the item 180 degrees around the X-axis to fix the upside-down issue + matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(180.0f)); + + // Create an ItemStack for the custom head item + ItemStack customHat = new ItemStack(Items.STICK); + customHat.set(DataComponentTypes.ITEM_MODEL, Identifier.of("saturnclient:hat")); + + // Get the ItemRenderer instance + ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer(); + + // Render the item as headwear + itemRenderer.renderItem( + customHat, + ModelTransformationMode.HEAD, + light, + OverlayTexture.DEFAULT_UV, + matrices, + vertexConsumers, + null, // World can be null for entity rendering + 0 // Seed for randomness, not needed here + ); + + // Pop the matrix stack to restore previous transformations + matrices.pop(); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/ArmorFeatureRendererMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/ArmorFeatureRendererMixin.java deleted file mode 100644 index a677ab8..0000000 --- a/src/main/java/org/saturnclient/saturnclient/mixin/ArmorFeatureRendererMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.saturnclient.saturnclient.mixin; - -import net.minecraft.client.render.entity.feature.ArmorFeatureRenderer; -import net.minecraft.client.render.entity.state.BipedEntityRenderState; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(ArmorFeatureRenderer.class) -public class ArmorFeatureRendererMixin { - @Redirect(method = "render", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/entity/state/BipedEntityRenderState;equippedHeadStack:Lnet/minecraft/item/ItemStack;", opcode = org.objectweb.asm.Opcodes.GETFIELD)) - private ItemStack redirectEquippedHeadStack(BipedEntityRenderState state) { - ItemStack original = state.equippedHeadStack; - if (original.isEmpty()) { - return new ItemStack(Items.DIAMOND_HELMET); - } - return original; - } -} \ No newline at end of file diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java new file mode 100644 index 0000000..4e72a1f --- /dev/null +++ b/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java @@ -0,0 +1,28 @@ +package org.saturnclient.saturnclient.mixin; + +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.PlayerEntityRenderer; +import net.minecraft.client.render.entity.model.PlayerEntityModel; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.entity.player.PlayerEntity; + +import org.saturnclient.saturnclient.cosmetics.CustomHeadFeatureRenderer; +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(PlayerEntityRenderer.class) +public abstract class PlayerEntityRendererMixin + extends LivingEntityRenderer { + + protected PlayerEntityRendererMixin() { + super(null, null, 0.0f); + } + + @Inject(method = "", at = @At("TAIL")) + private void addCustomFeatureRenderer(EntityRendererFactory.Context context, boolean slim, CallbackInfo ci) { + this.addFeature(new CustomHeadFeatureRenderer(this)); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/saturnclient/items/hat.json b/src/main/resources/assets/saturnclient/items/hat.json new file mode 100644 index 0000000..f74fe0c --- /dev/null +++ b/src/main/resources/assets/saturnclient/items/hat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "saturnclient:item/hat" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/saturnclient/models/item/hat.json b/src/main/resources/assets/saturnclient/models/item/hat.json new file mode 100644 index 0000000..38a2183 --- /dev/null +++ b/src/main/resources/assets/saturnclient/models/item/hat.json @@ -0,0 +1,42 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "saturnclient:item/hat", + "particle": "saturnclient:item/hat" + }, + "elements": [ + { + "from": [3, 0, 3], + "to": [13, 1, 13], + "rotation": {"angle": 0, "axis": "x", "origin": [4, 0, 4]}, + "faces": { + "north": {"uv": [8, 0, 16, 1], "texture": "#0"}, + "east": {"uv": [8, 1, 16, 2], "texture": "#0"}, + "south": {"uv": [8, 2, 16, 3], "texture": "#0"}, + "west": {"uv": [8, 3, 16, 4], "texture": "#0"}, + "up": {"uv": [8, 8, 0, 0], "texture": "#0"}, + "down": {"uv": [8, 8, 0, 16], "texture": "#0"} + } + }, + { + "from": [4, 1, 4], + "to": [12, 8, 12], + "rotation": {"angle": 0, "axis": "x", "origin": [4, 1, 4]}, + "faces": { + "north": {"uv": [8, 0, 16, 1], "texture": "#0"}, + "east": {"uv": [8, 1, 16, 2], "texture": "#0"}, + "south": {"uv": [8, 2, 16, 3], "texture": "#0"}, + "west": {"uv": [8, 3, 16, 4], "texture": "#0"}, + "up": {"uv": [8, 8, 0, 0], "texture": "#0"}, + "down": {"uv": [8, 8, 0, 16], "texture": "#0"} + } + } + ], + "display": { + "head": { + "translation": [0, 18.25, 0], + "scale": [1.5, 1.5, 1.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/saturnclient/textures/item/hat.png b/src/main/resources/assets/saturnclient/textures/item/hat.png new file mode 100644 index 0000000000000000000000000000000000000000..84cfaecb6edfc0ddaa23b6d193c23a566380ae47 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}6FglULn2y} z?-V_KSkK0F;FI{FDH-Vri3te_8v-UOdVlV;_Se`X^Nzvm0QcOPA}`YyU16NU)a9J; z`ucK_m-4?9Kcp|^aQ)R@$MGQ~)G%mK{Q>8MD~yZzBnsF!7zC^gQ@+jkxmuln##5dR z0u#ihD|mmtJY8R->_Efv#z6KSD~Q_C11p##Bvyp1p2*GM9wh1Sbn&+f&}|H!u6{1- HoD!M