From 2ace8f8f37e18ff51ee98f63d1584744ab1e4e73 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 13 Dec 2024 15:56:28 +0100 Subject: [PATCH] Fixed third person magic rendering --- .../client/mixin/MixinHeldItemRenderer.java | 2 - .../client/model/AbstractPonyModel.java | 10 +---- .../client/model/entity/WitchPonyModel.java | 2 +- .../model/entity/race/UnicornModel.java | 2 +- .../client/render/LevitatingItemRenderer.java | 20 ++++----- .../entity/feature/HeldItemFeature.java | 41 ++++++++++++++++++- 6 files changed, 52 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinHeldItemRenderer.java b/src/main/java/com/minelittlepony/client/mixin/MixinHeldItemRenderer.java index 3c2cbd43..c732f6bd 100644 --- a/src/main/java/com/minelittlepony/client/mixin/MixinHeldItemRenderer.java +++ b/src/main/java/com/minelittlepony/client/mixin/MixinHeldItemRenderer.java @@ -43,8 +43,6 @@ abstract class MixinHeldItemRenderer { VertexConsumerProvider vertices, @Nullable World world, int light, int overlay, int seed, Operation operation) { - - if (!MineLittlePony.getInstance().getRenderDispatcher().getMagicRenderer().renderItem(target, entity, stack, mode, left, matrices, vertices, world, light, overlay, seed, operation)) { operation.call(target, entity, stack, mode, left, matrices, vertices, world, light, overlay, seed); } diff --git a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java index 47ff7443..7f9c4940 100644 --- a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java @@ -528,15 +528,7 @@ public abstract class AbstractPonyModel extends Clien hat.visible = false; } - @Override - public final void setArmAngle(Arm arm, MatrixStack matrices) { - super.setArmAngle(arm, matrices); - if (currentState != null) { - positionheldItem(currentState, arm, matrices); - } - } - - protected void positionheldItem(T state, Arm arm, MatrixStack matrices) { + public void positionheldItem(T state, Arm arm, MatrixStack matrices) { float left = arm == Arm.LEFT ? -1 : 1; UseAction action = state.attributes.heldStack.getUseAction(); diff --git a/src/main/java/com/minelittlepony/client/model/entity/WitchPonyModel.java b/src/main/java/com/minelittlepony/client/model/entity/WitchPonyModel.java index 424cf82a..a7a7e6cc 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/WitchPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/WitchPonyModel.java @@ -48,7 +48,7 @@ public class WitchPonyModel extends EarthPonyModel { } @Override - protected void positionheldItem(WitchRenderer.State state, Arm arm, MatrixStack matrices) { + public void positionheldItem(WitchRenderer.State state, Arm arm, MatrixStack matrices) { super.positionheldItem(state, arm, matrices); matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(10)); } diff --git a/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java b/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java index ef9b3fde..a92819d8 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/race/UnicornModel.java @@ -78,7 +78,7 @@ public class UnicornModel extends EarthPonyModel { } @Override - protected void positionheldItem(T state, Arm arm, MatrixStack matrices) { + public void positionheldItem(T state, Arm arm, MatrixStack matrices) { super.positionheldItem(state, arm, matrices); if (!PonyConfig.getInstance().tpsmagic.get() || !state.hasMagicGlow()) { diff --git a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java index db358208..76a7da8f 100644 --- a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java @@ -4,6 +4,7 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.minelittlepony.api.config.PonyConfig; import com.minelittlepony.api.pony.Pony; import com.minelittlepony.client.MineLittlePony; +import com.minelittlepony.client.render.entity.state.PonyRenderState; import com.minelittlepony.common.util.render.RenderLayerUtil; import org.jetbrains.annotations.Nullable; @@ -23,7 +24,7 @@ import net.minecraft.util.math.RotationAxis; import net.minecraft.world.World; public class LevitatingItemRenderer { - private VertexConsumerProvider getProvider(Pony pony, VertexConsumerProvider provider) { + public static VertexConsumerProvider getProvider(Pony pony, VertexConsumerProvider provider) { final int color = pony.metadata().glowColor(); return layer -> { if (layer.getVertexFormat() != VertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL) { @@ -59,7 +60,7 @@ public class LevitatingItemRenderer { boolean doMagic = (mode.isFirstPerson() ? PonyConfig.getInstance().fpsmagic : PonyConfig.getInstance().tpsmagic).get() && state.hasMagicGlow(); if (doMagic && mode.isFirstPerson()) { - setupPerspective(entity, stack, left, matrices); + setupPerspective(state, stack, left, matrices); } original.call(itemRenderer, entity, stack, mode, left, matrices, vertices, world, light, overlay, seed); @@ -72,14 +73,11 @@ public class LevitatingItemRenderer { stack.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, false); } - float tickDelta = MinecraftClient.getInstance().getRenderTickCounter().getTickDelta(false) + entity.age; - - float driftStrength = 0.002F; - float xDrift = MathHelper.sin(tickDelta / 20F) * driftStrength; - float zDrift = MathHelper.cos((tickDelta + 20) / 20F) * driftStrength; + float xDrift = MathHelper.sin(state.age / 20F) * driftStrength; + float zDrift = MathHelper.cos((state.age + 20) / 20F) * driftStrength; - float scale = 1.1F + (MathHelper.sin(tickDelta / 20F) + 1) * driftStrength; + float scale = 1.1F + (MathHelper.sin(state.age / 20F) + 1) * driftStrength; matrices.scale(scale, scale, scale); matrices.translate(0.015F + xDrift, 0.01F, 0.01F + zDrift); @@ -96,14 +94,14 @@ public class LevitatingItemRenderer { /** * Moves held items to look like they're floating in the player's field. */ - private void setupPerspective(LivingEntity entity, ItemStack item, boolean left, MatrixStack stack) { + public static void setupPerspective(PonyRenderState state, ItemStack item, boolean left, MatrixStack stack) { UseAction action = item.getUseAction(); - boolean doNormal = entity.getItemUseTime() <= 0 || action == UseAction.NONE || (action == UseAction.CROSSBOW && CrossbowItem.isCharged(item)); + boolean doNormal = state.itemUseTime <= 0 || action == UseAction.NONE || (action == UseAction.CROSSBOW && CrossbowItem.isCharged(item)); if (doNormal) { // eating, blocking, and drinking are not transformed. Only held items. int sign = left ? 1 : -1; - float ticks = entity.age * sign; + float ticks = state.age * sign; float floatAmount = -(float)Math.sin(ticks / 9F) / 40F; float driftAmount = -(float)Math.cos(ticks / 6F) / 40F; diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java index e2c20fe3..907b3a79 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/HeldItemFeature.java @@ -1,7 +1,10 @@ package com.minelittlepony.client.render.entity.feature; +import com.minelittlepony.api.config.PonyConfig; import com.minelittlepony.api.model.*; +import com.minelittlepony.client.model.AbstractPonyModel; import com.minelittlepony.client.model.ClientPonyModel; +import com.minelittlepony.client.render.LevitatingItemRenderer; import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.entity.state.PonyRenderState; @@ -9,12 +12,16 @@ import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.feature.PlayerHeldItemFeatureRenderer; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.component.DataComponentTypes; import net.minecraft.item.ItemStack; import net.minecraft.item.ModelTransformationMode; import net.minecraft.util.Arm; +import net.minecraft.util.math.MathHelper; + +import org.jetbrains.annotations.Nullable; -@SuppressWarnings(value = {"unchecked"}) public class HeldItemFeature< S extends PonyRenderState, M extends ClientPonyModel @@ -27,6 +34,7 @@ public class HeldItemFeature< this.context = context; } + @SuppressWarnings(value = {"unchecked"}) @Deprecated @Override public final void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, PlayerEntityRenderState state, float limbAngle, float limbDistance) { @@ -50,4 +58,35 @@ public class HeldItemFeature< matrices.pop(); } } + + @SuppressWarnings(value = {"unchecked"}) + protected void renderItem(S state, @Nullable BakedModel model, ItemStack item, ModelTransformationMode mode, Arm arm, MatrixStack matrices, VertexConsumerProvider vertices, int light) { + if (context.getEquineManager().getModels().body() instanceof AbstractPonyModel m) { + m.positionheldItem(state, arm, matrices); + } + renderItem((PlayerEntityRenderState)state, model, item, mode, arm, matrices, vertices, light); + + if (PonyConfig.getInstance().tpsmagic.get() && state.hasMagicGlow()) { + vertices = LevitatingItemRenderer.getProvider(state.pony, vertices); + + if (item.hasGlint()) { + item = item.copy(); + item.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, false); + } + + float driftStrength = 0.002F; + float xDrift = MathHelper.sin(state.age / 10F) * driftStrength; + float zDrift = MathHelper.cos((state.age + 20) / 10F) * driftStrength; + + float scale = 1.1F + (MathHelper.sin(state.age / 20F) + 1) * driftStrength; + matrices.scale(scale, scale, scale); + matrices.translate(0.045F + xDrift, 0.01F - 0.12F, 0.03F + zDrift); + + renderItem((PlayerEntityRenderState)state, model, item, mode, arm, matrices, vertices, light); + matrices.scale(scale, scale, scale); + matrices.translate(0.1F, -0.1F, 0.1F); + matrices.translate(-0.03F - xDrift, -0.02F, -0.02F - zDrift); + renderItem((PlayerEntityRenderState)state, model, item, mode, arm, matrices, vertices, light); + } + } }