From 3cc2a7959f9ad2853e33da2ec82a805cf7a514ea Mon Sep 17 00:00:00 2001 From: Santiago Waimann Date: Sat, 30 May 2026 04:18:59 -0300 Subject: [PATCH] Dynamically stick goggles to head model --- .../item/goggle/GoggleArmorLayer.java | 19 +++++++------- .../item/goggle/IGoggleHelmet.java | 25 ++++++++++++++++++- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/com/robocraft999/creategoggles/item/goggle/GoggleArmorLayer.java b/common/src/main/java/com/robocraft999/creategoggles/item/goggle/GoggleArmorLayer.java index 392d167..c67cc53 100644 --- a/common/src/main/java/com/robocraft999/creategoggles/item/goggle/GoggleArmorLayer.java +++ b/common/src/main/java/com/robocraft999/creategoggles/item/goggle/GoggleArmorLayer.java @@ -16,6 +16,7 @@ import net.minecraft.world.entity.Pose; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; +import com.simibubi.create.AllPartialModels; public class GoggleArmorLayer> extends RenderLayer { @@ -36,14 +37,15 @@ public void render(PoseStack ms, MultiBufferSource buffer, int light, LivingEnti ItemStack stack = new ItemStack(AllItems.GOGGLES.get()); - // Translate and rotate with our head ms.pushPose(); - ms.translate(model.head.x / 16.0, model.head.y / 16.0, model.head.z / 16.0); - ms.mulPose(Axis.YP.rotation(model.head.yRot)); - ms.mulPose(Axis.XP.rotation(model.head.xRot)); - // Translate and scale to our head - ms.translate(0, -0.25, -0.05); + // Translate and rotate to our head + model.head.translateAndRotate(ms); + + // Translate offset + double zOffset = IGoggleHelmet.getGoggleZOffset(entity); + ms.translate(0.0D, -0.25D, (double) zOffset); + ms.mulPose(Axis.ZP.rotationDegrees(180.0f)); ms.scale(0.625f, 0.625f, 0.625f); @@ -52,9 +54,8 @@ public void render(PoseStack ms, MultiBufferSource buffer, int light, LivingEnti ms.translate(0, -0.25, 0); } - // Render - Minecraft.getInstance().getItemRenderer().renderStatic(stack, ItemDisplayContext.HEAD, light, OverlayTexture.NO_OVERLAY, ms, buffer, Minecraft.getInstance().level, 0); - //Minecraft.getInstance().getItemRenderer().render(stack, ItemDisplayContext.HEAD, false, ms, buffer, light, OverlayTexture.NO_OVERLAY, AllPartialModels.GOGGLES.get()); + Minecraft.getInstance().getItemRenderer().render(stack, ItemDisplayContext.HEAD, false, ms, buffer, light, OverlayTexture.NO_OVERLAY, AllPartialModels.GOGGLES.get()); + ms.popPose(); } } diff --git a/common/src/main/java/com/robocraft999/creategoggles/item/goggle/IGoggleHelmet.java b/common/src/main/java/com/robocraft999/creategoggles/item/goggle/IGoggleHelmet.java index f063fab..114c99f 100644 --- a/common/src/main/java/com/robocraft999/creategoggles/item/goggle/IGoggleHelmet.java +++ b/common/src/main/java/com/robocraft999/creategoggles/item/goggle/IGoggleHelmet.java @@ -40,4 +40,27 @@ static boolean isGoggleHelmet(LivingEntity entity) { return false; } -} + + static double getGoggleZOffset(LivingEntity entity) { + ItemStack headSlot = entity.getItemBySlot(EquipmentSlot.HEAD); + + if (headSlot.is(CGTags.Items.GOGGLE)) { + return -0.05D; + } + + if (Minecraft.getInstance().level != null) { + var optionalTrim = headSlot.get(DataComponents.TRIM); + if (optionalTrim != null && + optionalTrim.pattern().is(CGTrimPatterns.GOGGLE_PATTERN) && + optionalTrim.material().is(CGTrimPatterns.GOGGLE_MATERIAL)) { + return -0.05D; + } + } + + if (entity instanceof Player player && player.isCreative()) { + return 0.0D; + } + + return 0.05D; + } +} \ No newline at end of file