From fe831f309905d67abb585b869a7136728d777282 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 2 Jan 2022 23:53:44 +0200 Subject: [PATCH] The bangle of comradery is now visible on your arm in first person --- .../render/AccessoryFeatureRenderer.java | 20 +++++++-- .../render/BraceletFeatureRenderer.java | 31 ++++++++++++- .../client/MixinArmorFeatureRenderer.java | 13 +++++- .../client/MixinPlayerEntityRenderer.java | 45 +++++++++++++++++++ src/main/resources/unicopia.mixin.json | 1 + 5 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/client/MixinPlayerEntityRenderer.java diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java index 5def2769..5ea9d68d 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/AccessoryFeatureRenderer.java @@ -3,12 +3,14 @@ package com.minelittlepony.unicopia.client.render; import java.util.ArrayList; import java.util.List; +import net.minecraft.client.model.ModelPart; 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.BipedEntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; +import net.minecraft.util.Arm; public class AccessoryFeatureRenderer< T extends LivingEntity, @@ -30,9 +32,11 @@ public class AccessoryFeatureRenderer< @Override public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { - features.forEach(feature -> { - feature.render(matrices, vertexConsumers, light, entity, limbAngle, limbDistance, tickDelta, animationProgress, headYaw, headPitch); - }); + features.forEach(feature -> feature.render(matrices, vertexConsumers, light, entity, limbAngle, limbDistance, tickDelta, animationProgress, headYaw, headPitch)); + } + + public void renderArm(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, ModelPart arm, Arm side) { + features.forEach(feature -> feature.renderArm(matrices, vertexConsumers, light, entity, arm, side)); } public interface FeatureFactory { @@ -41,5 +45,15 @@ public class AccessoryFeatureRenderer< public interface Feature { void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch); + + default void renderArm(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, ModelPart arm, Arm side) { + + } + } + + public interface FeatureRoot< + T extends LivingEntity, + M extends BipedEntityModel> { + AccessoryFeatureRenderer getAccessories(); } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/BraceletFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/client/render/BraceletFeatureRenderer.java index 6552dff5..2443a23a 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/BraceletFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/BraceletFeatureRenderer.java @@ -1,6 +1,7 @@ package com.minelittlepony.unicopia.client.render; import com.minelittlepony.common.util.Color; +import com.minelittlepony.unicopia.client.minelittlepony.MineLPConnector; import com.minelittlepony.unicopia.item.FriendshipBraceletItem; import com.minelittlepony.unicopia.item.GlowableItem; @@ -52,8 +53,6 @@ public class BraceletFeatureRenderer implements Accessor ItemStack item = entity.getEquippedStack(EquipmentSlot.CHEST); if (item.getItem() instanceof FriendshipBraceletItem) { - - int j = ((DyeableItem)item.getItem()).getColor(item); boolean alex = entity instanceof ClientPlayerEntity && ((ClientPlayerEntity)entity).getModel().startsWith("slim"); @@ -77,6 +76,34 @@ public class BraceletFeatureRenderer implements Accessor } } + @Override + public void renderArm(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, E entity, ModelPart armModel, Arm side) { + ItemStack item = entity.getEquippedStack(EquipmentSlot.CHEST); + + if (item.getItem() instanceof FriendshipBraceletItem) { + int j = ((DyeableItem)item.getItem()).getColor(item); + + boolean alex = entity instanceof ClientPlayerEntity && ((ClientPlayerEntity)entity).getModel().startsWith("slim"); + + BraceletModel model = alex ? alexModel : steveModel; + + boolean glowing = ((GlowableItem)item.getItem()).isGlowing(item); + + + if (!MineLPConnector.getPlayerPonyRace().isDefault()) { + stack.translate(side == Arm.LEFT ? 0.06 : -0.06, 0.3, 0); + } else { + stack.translate(0, -0.1, 0); + } + + VertexConsumer consumer = ItemRenderer.getArmorGlintConsumer(renderContext, RenderLayer.getArmorCutoutNoCull(TEXTURE), false, false); + + model.setAngles(context.getModel()); + model.setVisible(side); + model.render(stack, consumer, glowing ? 0x0F00F0 : lightUv, OverlayTexture.DEFAULT_UV, Color.r(j), Color.g(j), Color.b(j), 1); + } + } + public static class BraceletModel extends Model { private final ModelPart leftArm; diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinArmorFeatureRenderer.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinArmorFeatureRenderer.java index 1511d2dc..de04cf6e 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinArmorFeatureRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinArmorFeatureRenderer.java @@ -16,12 +16,21 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; @Mixin(ArmorFeatureRenderer.class) -abstract class MixinArmorFeatureRenderer, A extends BipedEntityModel> extends FeatureRenderer { +abstract class MixinArmorFeatureRenderer< + T extends LivingEntity, + M extends BipedEntityModel, + A extends BipedEntityModel> + extends FeatureRenderer implements AccessoryFeatureRenderer.FeatureRoot { private AccessoryFeatureRenderer accessories; MixinArmorFeatureRenderer() { super(null); } + @Override + public AccessoryFeatureRenderer getAccessories() { + return accessories; + } + @Inject(method = "", at = @At("RETURN")) private void onInit(FeatureRendererContext context, A inner, A outer, CallbackInfo info) { accessories = new AccessoryFeatureRenderer<>(context); @@ -29,6 +38,6 @@ abstract class MixinArmorFeatureRenderer> { + @Nullable + private AccessoryFeatureRenderer> accessories; + + MixinPlayerEntityRenderer() { super(null, null, 0); } + + @SuppressWarnings("unchecked") + private AccessoryFeatureRenderer> getAccessories() { + if (accessories == null) { + accessories = features.stream() + .filter(a -> a instanceof FeatureRoot) + .map(a -> ((FeatureRoot>)a).getAccessories()) + .findFirst() + .orElseGet(() -> new AccessoryFeatureRenderer<>(this)); + } + return accessories; + } + + @Inject(method = "renderArm", at = @At("RETURN")) + private void onRenderArm(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, AbstractClientPlayerEntity player, ModelPart arm, ModelPart sleeve, CallbackInfo info) { + Arm a = this.getModel().leftArm == arm ? Arm.LEFT : Arm.RIGHT; + getAccessories().renderArm(matrices, vertexConsumers, light, player, arm, a); + } +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 6bf15099..d143b93d 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -43,6 +43,7 @@ "client.MixinKeyboardInput", "client.MixinLightmapTextureManager", "client.MixinMouse", + "client.MixinPlayerEntityRenderer", "client.MixinTooltipComponent", "client.MixinWorldRenderer" ],