From 53625f6b44a588b7485057cc32128da61a2aacb8 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 20 Jun 2021 02:25:06 +0200 Subject: [PATCH] Added an option to turn off third person magic and make arm animations for unicorns consistent with other races --- .../minelittlepony/api/model/IUnicorn.java | 9 +--- .../client/model/AbstractPonyModel.java | 10 +++-- .../client/model/IPonyMixinModel.java | 8 +--- .../model/entity/race/UnicornModel.java | 41 ++++--------------- .../client/render/entity/PonyRenderer.java | 3 +- .../entity/feature/GlowingItemFeature.java | 24 ++++------- .../entity/npc/AbstractNpcRenderer.java | 3 +- .../minelittlepony/settings/PonyConfig.java | 1 + .../assets/minelittlepony/lang/en_us.json | 1 + 9 files changed, 26 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/minelittlepony/api/model/IUnicorn.java b/src/main/java/com/minelittlepony/api/model/IUnicorn.java index 2b0d186c..b67463c3 100644 --- a/src/main/java/com/minelittlepony/api/model/IUnicorn.java +++ b/src/main/java/com/minelittlepony/api/model/IUnicorn.java @@ -1,13 +1,6 @@ package com.minelittlepony.api.model; -import net.minecraft.util.Arm; - -public interface IUnicorn extends IModel { - /** - * Gets the arm used for holding items in their magic. - */ - ArmModel getUnicornArmForSide(Arm side); - +public interface IUnicorn extends IModel { /** * Returns true if this model is being applied to a race that can use magic. */ diff --git a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java index 6a4a8969..52148918 100644 --- a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java @@ -529,13 +529,15 @@ public abstract class AbstractPonyModel extends ClientPo float sin = MathHelper.sin(ticks * 0.067F) * 0.05F; if (shouldLiftArm(rightArmPose, leftArmPose, -1)) { - rightArm.roll += cos; - rightArm.pitch += sin; + ModelPart arm = getArm(Arm.RIGHT); + arm.roll += cos; + arm.pitch += sin; } if (shouldLiftArm(leftArmPose, rightArmPose, 1)) { - leftArm.roll += cos; - leftArm.pitch += sin; + ModelPart arm = getArm(Arm.LEFT); + arm.roll += cos; + arm.pitch += sin; } } diff --git a/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java b/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java index 49ffb511..ec09bcd7 100644 --- a/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java +++ b/src/main/java/com/minelittlepony/client/model/IPonyMixinModel.java @@ -106,13 +106,7 @@ public interface IPonyMixinModel return mixin().getBodyPart(part); } - interface Caster & IUnicorn, ArmModel> extends IPonyMixinModel, IUnicorn { - - @Override - default ArmModel getUnicornArmForSide(Arm side) { - return mixin().getUnicornArmForSide(side); - } - + interface Caster & IUnicorn, ArmModel> extends IPonyMixinModel, IUnicorn { @Override default boolean isCasting() { return mixin().isCasting(); 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 e80ca69e..c15d20b3 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 @@ -2,6 +2,7 @@ package com.minelittlepony.client.model.entity.race; import com.minelittlepony.api.model.BodyPart; import com.minelittlepony.api.model.IUnicorn; +import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.part.UnicornHorn; import com.minelittlepony.mson.api.ModelContext; @@ -10,12 +11,11 @@ import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; import net.minecraft.util.Arm; -import net.minecraft.util.math.MathHelper; /** * Used for both unicorns and alicorns since there's no logical way to keep them distinct and not duplicate stuff. */ -public class UnicornModel extends EarthPonyModel implements IUnicorn { +public class UnicornModel extends EarthPonyModel implements IUnicorn { protected final ModelPart unicornArmRight; protected final ModelPart unicornArmLeft; @@ -36,10 +36,7 @@ public class UnicornModel extends EarthPonyModel impl @Override public float getWobbleAmount() { - if (isCasting()) { - return 0; - } - return super.getWobbleAmount(); + return isCasting() ? 0 : super.getWobbleAmount(); } @Override @@ -53,34 +50,10 @@ public class UnicornModel extends EarthPonyModel impl unicornArmLeft.setPivot(-7, 12, -2); } - @Override - protected void animateBreathing(float ticks) { - if (canCast()) { - float cos = MathHelper.cos(ticks * 0.09F) * 0.05F + 0.05F; - float sin = MathHelper.sin(ticks * 0.067F) * 0.05F; - - if (rightArmPose != ArmPose.EMPTY) { - unicornArmRight.roll += cos; - unicornArmRight.pitch += sin; - } - - if (leftArmPose != ArmPose.EMPTY) { - unicornArmLeft.roll += cos; - unicornArmLeft.pitch += sin; - } - } else { - super.animateBreathing(ticks); - } - } - - @Override - public ModelPart getUnicornArmForSide(Arm side) { - return side == Arm.LEFT ? unicornArmLeft : unicornArmRight; - } - @Override public boolean isCasting() { - return rightArmPose != ArmPose.EMPTY || leftArmPose != ArmPose.EMPTY; + return MineLittlePony.getInstance().getConfig().tpsmagic.get() + && (rightArmPose != ArmPose.EMPTY || leftArmPose != ArmPose.EMPTY); } @Override @@ -115,8 +88,8 @@ public class UnicornModel extends EarthPonyModel impl @Override public ModelPart getArm(Arm side) { - if (canCast() && getArmPoseForSide(side) != ArmPose.EMPTY) { - return getUnicornArmForSide(side); + if (canCast() && getArmPoseForSide(side) != ArmPose.EMPTY && MineLittlePony.getInstance().getConfig().tpsmagic.get()) { + return side == Arm.LEFT ? unicornArmLeft : unicornArmRight; } return super.getArm(side); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java index 02abd6c3..64a56894 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java @@ -17,7 +17,6 @@ import com.minelittlepony.client.render.entity.feature.SkullFeature; import com.minelittlepony.client.render.entity.feature.ElytraFeature; import com.minelittlepony.mson.api.ModelKey; -import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.Frustum; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; @@ -128,7 +127,7 @@ public abstract class PonyRenderer return MineLittlePony.getInstance().getManager().getPony(findTexture(entity)); } - public abstract static class Caster & IUnicorn> extends PonyRenderer { + public abstract static class Caster & IUnicorn> extends PonyRenderer { public Caster(EntityRendererFactory.Context context, ModelKey key) { super(context, key); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingItemFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingItemFeature.java index b8aa3108..39927b8f 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingItemFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingItemFeature.java @@ -1,11 +1,11 @@ package com.minelittlepony.client.render.entity.feature; import com.minelittlepony.api.model.IUnicorn; +import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.IPonyModel; import com.minelittlepony.client.render.IPonyRenderContext; import com.minelittlepony.client.render.PonyRenderDispatcher; -import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.model.json.ModelTransformation; @@ -23,20 +23,21 @@ public class GlowingItemFeature } protected boolean isUnicorn() { - return getContextModel() instanceof IUnicorn && ((IUnicorn)getContextModel()).canCast(); + return MineLittlePony.getInstance().getConfig().tpsmagic.get() + && getContextModel() instanceof IUnicorn + && ((IUnicorn)getContextModel()).canCast(); } @Override protected void preItemRender(T entity, ItemStack drop, ModelTransformation.Mode transform, Arm hand, MatrixStack stack) { - float left = hand == Arm.LEFT ? 1 : -1; - super.preItemRender(entity, drop, transform, hand, stack); + float left = hand == Arm.LEFT ? 1 : -1; + if (isUnicorn()) { stack.translate(-0.3F - (0.3F * left), 0.375F, 0.6F); } - UseAction action = drop.getUseAction(); if (isUnicorn() && (action == UseAction.SPYGLASS || action == UseAction.BOW) && entity.getItemUseTimeLeft() > 0) { @@ -48,23 +49,12 @@ public class GlowingItemFeature stack.translate(-0.1F + (0.3F * left), -0.1F, -1.1F); } } - } @Override protected void postItemRender(T entity, ItemStack drop, ModelTransformation.Mode transform, Arm hand, MatrixStack stack, VertexConsumerProvider renderContext) { if (isUnicorn()) { - PonyRenderDispatcher.getInstance().getMagicRenderer().renderItemGlow(entity, drop, transform, hand, ((IUnicorn)getContextModel()).getMagicColor(), stack, renderContext); - } - } - - @SuppressWarnings("unchecked") - @Override - protected void renderArm(Arm arm, MatrixStack stack) { - if (isUnicorn()) { - ((IUnicorn)getContextModel()).getUnicornArmForSide(arm).rotate(stack); - } else { - super.renderArm(arm, stack); + PonyRenderDispatcher.getInstance().getMagicRenderer().renderItemGlow(entity, drop, transform, hand, ((IUnicorn)getContextModel()).getMagicColor(), stack, renderContext); } } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java index f638ea3b..37bf4ce1 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/AbstractNpcRenderer.java @@ -1,6 +1,5 @@ package com.minelittlepony.client.render.entity.npc; -import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.model.ModelWithHat; import net.minecraft.entity.mob.MobEntity; @@ -17,7 +16,7 @@ import com.minelittlepony.mson.api.ModelKey; abstract class AbstractNpcRenderer< T extends MobEntity & VillagerDataContainer, - M extends ClientPonyModel & IUnicorn & ModelWithHat> extends PonyRenderer.Caster { + M extends ClientPonyModel & IUnicorn & ModelWithHat> extends PonyRenderer.Caster { private final TextureSupplier baseTextures; diff --git a/src/main/java/com/minelittlepony/settings/PonyConfig.java b/src/main/java/com/minelittlepony/settings/PonyConfig.java index fa8a5765..9d3882d9 100644 --- a/src/main/java/com/minelittlepony/settings/PonyConfig.java +++ b/src/main/java/com/minelittlepony/settings/PonyConfig.java @@ -23,6 +23,7 @@ public class PonyConfig extends JsonConfig { public final Setting fillycam = value("settings", "fillycam", true); private final Setting showscale = value("settings", "showscale", true); public final Setting fpsmagic = value("settings", "fpsmagic", true); + public final Setting tpsmagic = value("settings", "tpsmagic", true); public final Setting ponyskulls = value("settings", "ponyskulls", true); public final Setting frustrum = value("settings", "frustrum", true); diff --git a/src/main/resources/assets/minelittlepony/lang/en_us.json b/src/main/resources/assets/minelittlepony/lang/en_us.json index 202df1fa..b61f1038 100644 --- a/src/main/resources/assets/minelittlepony/lang/en_us.json +++ b/src/main/resources/assets/minelittlepony/lang/en_us.json @@ -17,6 +17,7 @@ "minelp.options.fillycam": "Filly Cam", "minelp.options.showscale": "Show-accurate scaling", "minelp.options.fpsmagic": "Magic in first-person", + "minelp.options.tpsmagic": "Magic in third-person", "minelp.options.ponyskulls": "Pony Skulls", "minelp.options.frustrum": "Frustum checks", "minelp.options.button": "Display On Title Screen",