diff --git a/src/main/java/com/minelittlepony/api/model/Models.java b/src/main/java/com/minelittlepony/api/model/Models.java index 5abd3c91..ccece120 100644 --- a/src/main/java/com/minelittlepony/api/model/Models.java +++ b/src/main/java/com/minelittlepony/api/model/Models.java @@ -34,7 +34,8 @@ public record Models> ( } public Optional> getArmourModel(ItemStack stack, ArmourLayer layer, ArmourVariant variant) { - return ArmorModelRegistry.getModelKey(stack.getItem(), layer).or(() -> variant.getDefaultModel(layer).filter(l -> stack.getItem() instanceof ArmorItem)) + return ArmorModelRegistry.getModelKey(stack.getItem(), layer) + .or(() -> variant.getDefaultModel(layer).filter(l -> stack.getItem() instanceof ArmorItem)) .map(armor); } } diff --git a/src/main/java/com/minelittlepony/client/LegacySkinConverter.java b/src/main/java/com/minelittlepony/client/LegacySkinConverter.java index 4165242c..f06ee4b6 100644 --- a/src/main/java/com/minelittlepony/client/LegacySkinConverter.java +++ b/src/main/java/com/minelittlepony/client/LegacySkinConverter.java @@ -14,8 +14,8 @@ import static com.minelittlepony.common.event.SkinFilterCallback.copy; */ class LegacySkinConverter implements SkinFilterCallback { @Override - public void processImage(NativeImage image, boolean legacy) { - if (legacy) { + public NativeImage processImage(NativeImage image, int initialWidth, int initialHeight) { + if (SkinFilterCallback.isLegacyAspectRatio(initialWidth, initialHeight)) { // ( from ) ( offset ) (size) flipX flipY copy(image, 58, 16, 0, 16, 2, 2, true, false); // top copy(image, 60, 16, 0, 16, 2, 2, true, false); // bottom @@ -24,5 +24,7 @@ class LegacySkinConverter implements SkinFilterCallback { copy(image, 56, 18, 4, 16, 2, 14, true, false); // outside copy(image, 62, 18, 0, 16, 2, 14, true, false); // front } + + return image; } } diff --git a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java index f4c38b3e..99f606d1 100644 --- a/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java +++ b/src/main/java/com/minelittlepony/client/model/AbstractPonyModel.java @@ -1,7 +1,6 @@ package com.minelittlepony.client.model; import com.minelittlepony.api.model.*; -import com.minelittlepony.api.events.PonyModelPrepareCallback; import com.minelittlepony.api.pony.meta.SizePreset; import com.minelittlepony.client.render.entity.state.PonyRenderState; import com.minelittlepony.client.transform.PonyTransformation; @@ -15,12 +14,9 @@ import java.util.function.Supplier; import net.minecraft.client.model.ModelPart; import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.entity.PlayerEntityRenderer; -import net.minecraft.client.render.entity.state.BipedEntityRenderState; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EntityPose; -import net.minecraft.entity.LivingEntity; import net.minecraft.item.consume.UseAction; import net.minecraft.util.*; import net.minecraft.util.math.*; diff --git a/src/main/java/com/minelittlepony/client/model/ModelType.java b/src/main/java/com/minelittlepony/client/model/ModelType.java index ab13364d..f92e62e0 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelType.java +++ b/src/main/java/com/minelittlepony/client/model/ModelType.java @@ -58,7 +58,7 @@ public final class ModelType { public static final GearModelKey SADDLEBAGS_BOTH = registerGear("saddlebags", Wearable.SADDLE_BAGS_BOTH, t -> new SaddleBags(t, Wearable.SADDLE_BAGS_BOTH)); public static final GearModelKey SADDLEBAGS_LEFT = registerGear(SADDLEBAGS_BOTH, Wearable.SADDLE_BAGS_LEFT, t -> new SaddleBags(t, Wearable.SADDLE_BAGS_LEFT)); public static final GearModelKey SADDLEBAGS_RIGHT = registerGear(SADDLEBAGS_BOTH, Wearable.SADDLE_BAGS_RIGHT, t -> new SaddleBags(t, Wearable.SADDLE_BAGS_RIGHT)); - public static final GearModelKey CROWN = registerGear("crown", Wearable.CROWN, Crown::new); + public static final GearModelKey CROWN = registerGear("crown", Wearable.CROWN, t -> new WearableGear(t.getChild("crown"), Wearable.CROWN, BodyPart.HEAD, 0.1F)); public static final GearModelKey MUFFIN = registerGear("muffin", Wearable.MUFFIN, t -> new WearableGear(t.getChild("crown"), Wearable.MUFFIN, BodyPart.HEAD, 0.45F)); public static final GearModelKey WITCH_HAT = registerGear("witch_hat", Wearable.HAT, t -> new WearableGear(t.getChild("hat"), Wearable.HAT, BodyPart.HEAD, 0.7F)); public static final GearModelKey ANTLERS = registerGear("antlers", Wearable.ANTLERS, DeerAntlers::new); diff --git a/src/main/java/com/minelittlepony/client/model/armour/ArmourRendererPlugin.java b/src/main/java/com/minelittlepony/client/model/armour/ArmourRendererPlugin.java index ff0c79a1..a1994275 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/ArmourRendererPlugin.java +++ b/src/main/java/com/minelittlepony/client/model/armour/ArmourRendererPlugin.java @@ -11,7 +11,6 @@ import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.type.DyedColorComponent; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; import net.minecraft.item.*; import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.item.equipment.EquipmentModel.LayerType; @@ -108,15 +107,15 @@ public interface ArmourRendererPlugin { } @Nullable - default VertexConsumer getCapeConsumer(LivingEntity entity, VertexConsumerProvider provider, Identifier texture) { - if (entity.getEquippedStack(EquipmentSlot.CHEST).isOf(Items.ELYTRA)) { + default VertexConsumer getCapeConsumer(BipedEntityRenderState entity, VertexConsumerProvider provider, Identifier texture) { + if (entity.equippedChestStack.isOf(Items.ELYTRA)) { return null; } return getOptionalBuffer(provider, getCapeLayer(entity, texture)); } @Nullable - default RenderLayer getCapeLayer(LivingEntity entity, Identifier texture) { + default RenderLayer getCapeLayer(BipedEntityRenderState entity, Identifier texture) { return RenderLayer.getEntitySolid(texture); } diff --git a/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java b/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java index 2360de4d..02155b47 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java +++ b/src/main/java/com/minelittlepony/client/model/armour/PonifiedEquipmentRenderer.java @@ -71,7 +71,8 @@ public class PonifiedEquipmentRenderer extends EquipmentRenderer { for (EquipmentModel.Layer layer : layers) { int j = getDyeColor(layer, i); if (j != 0) { - ArmourTexture armorTexture = plugin.getTextureLookup().getTexture(stack, layerType == LayerType.HUMANOID_LEGGINGS ? ArmourLayer.INNER : ArmourLayer.OUTER, layer); + ArmourLayer armourLayer = layerType == LayerType.HUMANOID_LEGGINGS ? ArmourLayer.INNER : ArmourLayer.OUTER; + ArmourTexture armorTexture = plugin.getTextureLookup().getTexture(stack, armourLayer, layer); Identifier layerTexture = layer.usePlayerTexture() && texture != null ? texture : armorTexture.texture(); @@ -81,7 +82,9 @@ public class PonifiedEquipmentRenderer extends EquipmentRenderer { ArmourVariant variant = layer.usePlayerTexture() ? ArmourVariant.NORMAL : armorTexture.variant(); models.getArmourModel(stack, null, variant).ifPresent(model -> { VertexConsumer glintConsumer = hasGlint ? plugin.getGlintConsumer(equipmentSlot, vertexConsumers, layerType) : null; - model.render(matrices, glintConsumer != null ? VertexConsumers.union(plugin.getGlintConsumer(equipmentSlot, vertexConsumers, layerType), armorConsumer) : armorConsumer, light, OverlayTexture.DEFAULT_UV, j); + if (model.poseModel(equipmentSlot, armourLayer, models.body())) { + model.render(matrices, glintConsumer != null ? VertexConsumers.union(plugin.getGlintConsumer(equipmentSlot, vertexConsumers, layerType), armorConsumer) : armorConsumer, light, OverlayTexture.DEFAULT_UV, j); + } }); } } diff --git a/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java b/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java index 3d75fb88..e6cc3a2c 100644 --- a/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java +++ b/src/main/java/com/minelittlepony/client/model/armour/PonyArmourModel.java @@ -1,7 +1,6 @@ package com.minelittlepony.client.model.armour; import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.entity.EquipmentSlot; import com.minelittlepony.api.model.PonyModel; @@ -14,21 +13,12 @@ public class PonyArmourModel extends AbstractPonyMode super(tree, false); } - public boolean poseModel(S state, - EquipmentSlot slot, ArmourLayer layer, - PonyModel mainModel) { - + public boolean poseModel(EquipmentSlot slot, ArmourLayer layer, PonyModel mainModel) { if (!setVisibilities(slot, layer)) { return false; } - setAngles(state); - if (mainModel instanceof BipedEntityModel biped) { - head.copyTransform(biped.head); - body.copyTransform(biped.body); - rightArm.copyTransform(biped.rightArm); - leftArm.copyTransform(biped.leftArm); - rightLeg.copyTransform(biped.rightLeg); - leftLeg.copyTransform(biped.leftLeg); + if (mainModel instanceof AbstractPonyModel abs) { + abs.copyTransforms(this); } return true; } diff --git a/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java b/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java index 5043ab63..60e0f164 100644 --- a/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java +++ b/src/main/java/com/minelittlepony/client/model/entity/EnderStallionModel.java @@ -21,9 +21,9 @@ public class EnderStallionModel extends SkeleponyModel extends EarthPonyModel i protected final ModelPart unicornArmRight; protected final ModelPart unicornArmLeft; - protected UnicornHorn horn; + protected UnicornHorn horn; public UnicornModel(ModelPart tree, boolean smallArms) { super(tree, smallArms); diff --git a/src/main/java/com/minelittlepony/client/model/gear/Crown.java b/src/main/java/com/minelittlepony/client/model/gear/Crown.java deleted file mode 100644 index d6ff11a7..00000000 --- a/src/main/java/com/minelittlepony/client/model/gear/Crown.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.minelittlepony.client.model.gear; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.mob.AbstractPiglinEntity; -import net.minecraft.entity.mob.ZombifiedPiglinEntity; -import net.minecraft.entity.player.PlayerEntity; - -import com.minelittlepony.api.model.BodyPart; -import com.minelittlepony.api.model.PonyModel; -import com.minelittlepony.api.model.gear.WearableGear; -import com.minelittlepony.api.pony.meta.Wearable; - -public class Crown extends WearableGear { - - public Crown(ModelPart tree) { - super(tree.getChild("crown"), Wearable.CROWN, BodyPart.HEAD, 0.1F); - } - - @Override - public boolean canRender(PonyModel model, EntityRenderState entity) { - return super.canRender(model, entity) - || (( - entity instanceof AbstractPiglinEntity - || entity instanceof PlayerEntity - || entity instanceof ZombifiedPiglinEntity - ) && entity.hasCustomName() && entity.getCustomName().getString().equalsIgnoreCase("technoblade") - ); - } -} diff --git a/src/main/java/com/minelittlepony/client/model/part/UnicornHorn.java b/src/main/java/com/minelittlepony/client/model/part/UnicornHorn.java index 43b0335b..db422c78 100644 --- a/src/main/java/com/minelittlepony/client/model/part/UnicornHorn.java +++ b/src/main/java/com/minelittlepony/client/model/part/UnicornHorn.java @@ -11,7 +11,7 @@ import com.minelittlepony.api.model.SubModel; import com.minelittlepony.client.render.MagicGlow; import com.minelittlepony.client.render.entity.state.PonyRenderState; -public class UnicornHorn implements SubModel { +public class UnicornHorn implements SubModel { private final ModelPart horn; private final ModelPart glow; @@ -38,8 +38,8 @@ public class UnicornHorn implements SubModel { } @Override - public void setVisible(boolean visible, PonyRenderState state) { - horn.visible = visible; - glow.visible = visible; + public void setVisible(boolean visible, T state) { + horn.visible = this.visible && visible; + glow.visible = this.visible && visible; } } diff --git a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java index 86931672..a07203ec 100644 --- a/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java +++ b/src/main/java/com/minelittlepony/client/render/EquineRenderManager.java @@ -7,6 +7,7 @@ import com.minelittlepony.api.model.*; import com.minelittlepony.api.pony.Pony; import com.minelittlepony.api.pony.PonyData; import com.minelittlepony.client.PonyDataLoader; +import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.render.entity.state.PonyRenderState; import com.minelittlepony.client.transform.PonyPosture; import com.minelittlepony.mson.api.ModelKey; @@ -30,7 +31,7 @@ import org.jetbrains.annotations.Nullable; public class EquineRenderManager< T extends LivingEntity, S extends PonyRenderState, - M extends EntityModel & PonyModel> { + M extends ClientPonyModel> { private Models models; @@ -39,7 +40,9 @@ public class EquineRenderManager< private final PonyRenderContext context; private final Transformer transformer; - private final FrustrumCheck frustrum; + private final FrustrumCheck frustrum = new FrustrumCheck<>(); + + private final MinecraftClient client = MinecraftClient.getInstance(); public static void disableModelRenderProfile() { RenderSystem.disableBlend(); @@ -49,7 +52,6 @@ public class EquineRenderManager< this.context = context; this.transformer = transformer; this.models = models; - frustrum = new FrustrumCheck<>(context); context.setModel(models.body()); } @@ -74,7 +76,8 @@ public class EquineRenderManager< if (entity.isSleeping() || !PonyConfig.getInstance().frustrum.get()) { return vanilla; } - return frustrum.withCamera(entity, vanilla); + + return frustrum.withCamera(context.getVanillaRenderer().getAndUpdateRenderState(entity, client.getRenderTickCounter().getTickDelta(false)), vanilla); } public void updateState(T entity, S state, ModelAttributes.Mode mode) { diff --git a/src/main/java/com/minelittlepony/client/render/FrustrumCheck.java b/src/main/java/com/minelittlepony/client/render/FrustrumCheck.java index 270f5b36..90ae179b 100644 --- a/src/main/java/com/minelittlepony/client/render/FrustrumCheck.java +++ b/src/main/java/com/minelittlepony/client/render/FrustrumCheck.java @@ -1,14 +1,13 @@ package com.minelittlepony.client.render; import net.minecraft.client.render.Frustum; -import net.minecraft.entity.LivingEntity; import net.minecraft.util.math.Box; import org.joml.Matrix4f; -import com.minelittlepony.client.PonyBounds; +import com.minelittlepony.client.render.entity.state.PonyRenderState; -public class FrustrumCheck extends Frustum { +public class FrustrumCheck extends Frustum { public static final Frustum ALWAYS_VISIBLE = new Frustum(new Matrix4f(), new Matrix4f()) { public boolean isVisible(Box bounds) { return true; @@ -19,11 +18,8 @@ public class FrustrumCheck extends Frustum { private Frustum vanilla; - private final PonyRenderContext context; - - public FrustrumCheck(PonyRenderContext context) { + public FrustrumCheck() { super(new Matrix4f(), new Matrix4f()); - this.context = context; } public Frustum withCamera(T entity, Frustum vanillaFrustrum) { @@ -34,7 +30,7 @@ public class FrustrumCheck extends Frustum { @Override public boolean isVisible(Box bounds) { - return vanilla.isVisible(PonyBounds.getBoundingBox(context.getEntityPony(entity), entity)); + return vanilla.isVisible(DebugBoundingBoxRenderer.getBoundingBox(entity)); } @Override diff --git a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java index 6fe54f53..e9f8c1ac 100644 --- a/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/LevitatingItemRenderer.java @@ -1,17 +1,14 @@ package com.minelittlepony.client.render; import com.minelittlepony.api.config.PonyConfig; -import com.minelittlepony.api.model.HornedPonyModel; 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; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; -import net.minecraft.client.render.entity.LivingEntityRenderer; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; @@ -110,8 +107,7 @@ public class LevitatingItemRenderer { action == UseAction.BOW || action == UseAction.CROSSBOW || action == UseAction.BLOCK - || item.getItem() instanceof ToolItem - || item.getItem() instanceof RangedWeaponItem + || item.contains(DataComponentTypes.TOOL) || PonyConfig.getInstance().forwardHoldingItems.get().contains(Registries.ITEM.getId(item.getItem())); float distanceChange = handHeldTool ? -0.3F : -0.6F; diff --git a/src/main/java/com/minelittlepony/client/render/PonyRenderContext.java b/src/main/java/com/minelittlepony/client/render/PonyRenderContext.java index 33f99d64..fcb2655f 100644 --- a/src/main/java/com/minelittlepony/client/render/PonyRenderContext.java +++ b/src/main/java/com/minelittlepony/client/render/PonyRenderContext.java @@ -1,17 +1,22 @@ package com.minelittlepony.client.render; -import com.minelittlepony.api.model.PonyModel; import com.minelittlepony.api.model.gear.Gear; import com.minelittlepony.api.pony.Pony; +import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.render.entity.state.PonyRenderState; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.render.entity.state.EntityRenderState; import net.minecraft.entity.LivingEntity; +import org.jetbrains.annotations.Nullable; + public interface PonyRenderContext< T extends LivingEntity, S extends PonyRenderState, - M extends EntityModel & PonyModel + M extends ClientPonyModel > extends Gear.Context { Pony getEntityPony(T entity); @@ -19,4 +24,15 @@ public interface PonyRenderContext< EquineRenderManager getInternalRenderer(); void setModel(M model); + + @Nullable + @SuppressWarnings("unchecked") + default EntityRenderer getVanillaRenderer() { + return this instanceof EntityRenderer ? (EntityRenderer)(Object)this : null; + } + + @SuppressWarnings("unchecked") + default > FeatureRendererContext upcast() { + return (FeatureRendererContext)this; + } } diff --git a/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java b/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java index a2b69967..b8210977 100644 --- a/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java +++ b/src/main/java/com/minelittlepony/client/render/PonyRenderDispatcher.java @@ -3,10 +3,10 @@ package com.minelittlepony.client.render; import java.util.function.Function; import com.google.common.base.Predicates; -import com.minelittlepony.api.model.PonyModel; import com.minelittlepony.api.model.PreviewModel; import com.minelittlepony.api.pony.*; import com.minelittlepony.client.mixin.MixinEntityRenderers; +import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.render.entity.*; import com.minelittlepony.client.render.entity.state.PonyRenderState; @@ -16,7 +16,6 @@ import com.minelittlepony.mson.api.Mson; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.entity.*; -import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.state.EntityRenderState; import net.minecraft.client.util.SkinTextures; import net.minecraft.entity.Entity; @@ -80,7 +79,7 @@ public class PonyRenderDispatcher { @SuppressWarnings("unchecked") @Nullable - public & PonyModel, R extends LivingEntityRenderer & PonyRenderContext> R getPonyRenderer(@Nullable T entity) { + public , R extends LivingEntityRenderer & PonyRenderContext> R getPonyRenderer(@Nullable T entity) { if (entity != null && MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(entity) instanceof PonyRenderContext c) { return (R)c; } diff --git a/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java index d6c96c40..53721d2d 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/AbstractPonyRenderer.java @@ -1,7 +1,6 @@ package com.minelittlepony.client.render.entity; import com.minelittlepony.api.model.ModelAttributes; -import com.minelittlepony.api.model.PonyModel; import com.minelittlepony.api.pony.Pony; import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.client.model.*; @@ -22,8 +21,6 @@ import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.MobEntityRenderer; import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.model.*; -import net.minecraft.client.render.entity.state.BipedEntityRenderState; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.mob.MobEntity; @@ -33,18 +30,18 @@ import net.minecraft.util.Identifier; public abstract class AbstractPonyRenderer< T extends MobEntity, S extends PonyRenderState, - M extends EntityModel & PonyModel + M extends ClientPonyModel > extends MobEntityRenderer implements PonyRenderContext { protected final EquineRenderManager manager; private final Map wearableTextures = new EnumMap<>(Wearable.class); - private final TextureSupplier texture; + private final TextureSupplier texture; private final float scale; - public AbstractPonyRenderer(EntityRendererFactory.Context context, ModelKey key, TextureSupplier texture, float scale) { + public AbstractPonyRenderer(EntityRendererFactory.Context context, ModelKey key, TextureSupplier texture, float scale) { super(context, null, 0.5F); this.manager = new EquineRenderManager(this, super::setupTransforms, key); this.texture = texture; @@ -59,25 +56,28 @@ public abstract class AbstractPonyRenderer< } protected void addFeatures(EntityRendererFactory.Context context) { - addFeature(new ArmourFeature<>(this, context.getModelManager())); - addFeature(createHeldItemFeature(context)); + addFeature(new ArmourFeature<>(this, context.getEquipmentModelLoader())); + addPonyFeature(createHeldItemFeature(context)); addFeature(new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer())); - addFeature(new ElytraFeature<>(this)); + addPonyFeature(new ElytraFeature<>(this, context.getEquipmentRenderer())); addFeature(new GearFeature<>(this)); } @SuppressWarnings({"unchecked", "rawtypes"}) - protected final boolean addPonyFeature(FeatureRenderer> feature) { + protected final boolean addPonyFeature(FeatureRenderer< + ? extends PlayerEntityRenderState, + ? extends ClientPonyModel + > feature) { return ((List)features).add(feature); } - protected HeldItemFeature createHeldItemFeature(EntityRendererFactory.Context context) { - return new HeldItemFeature(this, context.getItemRenderer()); + protected HeldItemFeature createHeldItemFeature(EntityRendererFactory.Context context) { + return new HeldItemFeature<>(this, context.getItemRenderer()); } @Override public final Identifier getTexture(S entity) { - return texture.apply(entity); + return entity.pony.texture(); } @Override @@ -147,7 +147,7 @@ public abstract class AbstractPonyRenderer< @Override public Pony getEntityPony(T entity) { - return Pony.getManager().getPony(getTexture(entity)); + return Pony.getManager().getPony(texture.apply(entity)); } public static , T extends PonyRenderer, F extends FeatureRenderer> @@ -160,9 +160,9 @@ public abstract class AbstractPonyRenderer< public static < T extends MobEntity, S extends PonyRenderState, - M extends EntityModel & PonyModel> AbstractPonyRenderer proxy( + M extends ClientPonyModel> AbstractPonyRenderer proxy( EntityRendererFactory.Context context, ModelKey key, - TextureSupplier texture, + TextureSupplier texture, float scale, List exportedLayers, Consumer modelConsumer, diff --git a/src/main/java/com/minelittlepony/client/render/entity/AquaticPlayerPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/AquaticPlayerPonyRenderer.java index 7acbc9d9..0d1f9f6a 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/AquaticPlayerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/AquaticPlayerPonyRenderer.java @@ -2,7 +2,6 @@ package com.minelittlepony.client.render.entity; import com.minelittlepony.api.model.*; import com.minelittlepony.api.pony.*; -import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.client.render.entity.state.PlayerPonyRenderState; import com.minelittlepony.util.MathUtil; @@ -10,6 +9,7 @@ import java.util.function.Predicate; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.entity.EntityPose; import net.minecraft.entity.LivingEntity; import net.minecraft.particle.ParticleTypes; @@ -22,15 +22,15 @@ public class AquaticPlayerPonyRenderer extends FormChangingPlayerPonyRenderer { } @Override - protected Race getPlayerRace(PlayerPonyRenderState state) { - Race race = super.getPlayerRace(state); - return ((State)state).skinOverride != null ? Race.SEAPONY : race == Race.SEAPONY ? Race.UNICORN : race; + public PlayerEntityRenderState createRenderState() { + return new State(); } - protected class State extends FormChangingPlayerPonyRenderer.State { + class State extends PlayerPonyRenderState { @Override public void updateState(LivingEntity entity, PonyModel model, Pony pony, ModelAttributes.Mode mode) { super.updateState(entity, model, pony, mode); + Identifier skinOverride = getSkinOverride((AbstractClientPlayerEntity)entity); yOffset = skinOverride != null ? (0.6 + (isInSneakingPose ? 0.125 : 0)) : 0; pose = EntityPose.STANDING; isInSneakingPose = false; diff --git a/src/main/java/com/minelittlepony/client/render/entity/FormChangingPlayerPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/FormChangingPlayerPonyRenderer.java index c269b327..6a13e957 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/FormChangingPlayerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/FormChangingPlayerPonyRenderer.java @@ -1,20 +1,13 @@ package com.minelittlepony.client.render.entity; -import com.minelittlepony.api.model.ModelAttributes; -import com.minelittlepony.api.model.PonyModel; import com.minelittlepony.api.pony.*; -import com.minelittlepony.client.render.entity.state.PlayerPonyRenderState; import java.util.function.Predicate; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.entity.LivingEntity; import net.minecraft.util.Identifier; -import org.jetbrains.annotations.Nullable; - public class FormChangingPlayerPonyRenderer extends PlayerPonyRenderer { private final Identifier alternateFormSkinId; private final Predicate formModifierPredicate; @@ -26,32 +19,13 @@ public class FormChangingPlayerPonyRenderer extends PlayerPonyRenderer { this.formModifierPredicate = formModifierPredicate; } - public PlayerEntityRenderState createRenderState() { - return new State(); - } - @Override - public Identifier getTexture(PlayerEntityRenderState state) { - if (((State)state).skinOverride != null) { - return ((State)state).skinOverride; - } - return super.getTexture(state); + public Pony getEntityPony(AbstractClientPlayerEntity entity) { + Identifier skinOverride = getSkinOverride((AbstractClientPlayerEntity)entity); + return skinOverride == null ? super.getEntityPony(entity) : Pony.getManager().getPony(skinOverride); } - protected class State extends PlayerPonyRenderState { - @Nullable - public Identifier skinOverride; - - @Override - public void updateState(LivingEntity entity, PonyModel model, Pony pony, ModelAttributes.Mode mode) { - super.updateState(entity, model, pony, mode); - skinOverride = formModifierPredicate.test((AbstractClientPlayerEntity)entity) - ? getSkinOverride((AbstractClientPlayerEntity)entity) - : null; - } - - protected Identifier getSkinOverride(AbstractClientPlayerEntity player) { - return SkinsProxy.getInstance().getSkin(alternateFormSkinId, player).orElse(null); - } + protected Identifier getSkinOverride(AbstractClientPlayerEntity player) { + return formModifierPredicate.test(player) ? SkinsProxy.getInstance().getSkin(alternateFormSkinId, player).orElse(null) : null; } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java index e656e947..f9f23547 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PlayerPonyRenderer.java @@ -3,7 +3,6 @@ package com.minelittlepony.client.render.entity; import com.minelittlepony.api.model.ModelAttributes; import com.minelittlepony.api.model.Models; import com.minelittlepony.api.pony.Pony; -import com.minelittlepony.api.pony.SkinsProxy; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.api.pony.meta.Wearable; import com.minelittlepony.client.model.*; @@ -19,7 +18,6 @@ import java.util.function.Function; import com.minelittlepony.client.render.EquineRenderManager; -import net.minecraft.block.BedBlock; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.*; @@ -31,11 +29,16 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EntityPose; import net.minecraft.text.Text; import net.minecraft.util.*; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; public class PlayerPonyRenderer extends PlayerEntityRenderer - implements PonyRenderContext> { + implements PonyRenderContext< + AbstractClientPlayerEntity, + PlayerPonyRenderState, + ClientPonyModel + > { private final Function>> modelsCache; protected final EquineRenderManager> manager; @@ -49,7 +52,6 @@ public class PlayerPonyRenderer addPonyFeatures(context); } - @SuppressWarnings({"unchecked", "rawtypes"}) protected void addPonyFeatures(EntityRendererFactory.Context context) { // remove vanilla features (keep modded ones) features.removeIf(feature -> { @@ -61,18 +63,21 @@ public class PlayerPonyRenderer || feature instanceof ElytraFeatureRenderer || feature instanceof ShoulderParrotFeatureRenderer; }); - addPonyFeature(new ArmourFeature<>(this, context.getModelManager())); - addPonyFeature(new HeldItemFeature(this, context.getItemRenderer())); + addPonyFeature(new ArmourFeature<>(this, context.getEquipmentModelLoader())); + addPonyFeature(new HeldItemFeature<>(this, context.getItemRenderer())); addPonyFeature(new DJPon3Feature<>(this)); - addPonyFeature(new CapeFeature<>(this)); + addFeature(new CapeFeature(this, context.getModelLoader(), context.getEquipmentModelLoader())); addPonyFeature(new SkullFeature<>(this, context.getModelLoader(), context.getItemRenderer())); - addPonyFeature(new ElytraFeature<>(this)); + addPonyFeature(new ElytraFeature<>(this, context.getEquipmentRenderer())); addPonyFeature(new PassengerFeature<>(this, context)); addPonyFeature(new GearFeature<>(this)); } @SuppressWarnings({"unchecked", "rawtypes"}) - protected final boolean addPonyFeature(FeatureRenderer> feature) { + protected final boolean addPonyFeature(FeatureRenderer< + ? extends PlayerEntityRenderState, + ? extends ClientPonyModel + > feature) { return ((List)features).add(feature); } @@ -90,6 +95,9 @@ public class PlayerPonyRenderer public void updateRenderState(AbstractClientPlayerEntity entity, PlayerEntityRenderState state, float tickDelta) { super.updateRenderState(entity, state, tickDelta); manager.updateState(entity, (PlayerPonyRenderState)state, mode); + + // Rotate cape to align with the pony back + state.field_53536 += MathHelper.PI / 2; } public final PlayerPonyRenderState getAndUpdateRenderState(AbstractClientPlayerEntity entity, float tickDelta, ModelAttributes.Mode mode) { @@ -206,7 +214,7 @@ public class PlayerPonyRenderer } @Override - public Identifier getTexture(PlayerEntityRenderState state) { + public final Identifier getTexture(PlayerEntityRenderState state) { return ((PonyRenderState)state).pony.texture(); } 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 878d86bc..2eb754ba 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyRenderer.java @@ -16,11 +16,11 @@ public abstract class PonyRenderer< > extends AbstractPonyRenderer { protected static final float BASE_MODEL_SCALE = 15/16F; - public PonyRenderer(EntityRendererFactory.Context context, ModelKey key, TextureSupplier texture) { + public PonyRenderer(EntityRendererFactory.Context context, ModelKey key, TextureSupplier texture) { this(context, key, texture, 1); } - public PonyRenderer(EntityRendererFactory.Context context, ModelKey key, TextureSupplier texture, float scale) { + public PonyRenderer(EntityRendererFactory.Context context, ModelKey key, TextureSupplier texture, float scale) { super(context, key, texture, scale); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java index d1e071fe..012fce9a 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/PonyStandRenderer.java @@ -1,25 +1,22 @@ package com.minelittlepony.client.render.entity; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.ArmorStandEntityRenderer; -import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.*; import net.minecraft.client.render.entity.feature.*; import net.minecraft.client.render.entity.model.ArmorStandArmorEntityModel; -import net.minecraft.client.render.entity.model.EntityModelLayers; +import net.minecraft.client.render.entity.state.ArmorStandEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.decoration.ArmorStandEntity; -import net.minecraft.util.math.Vec3d; import com.minelittlepony.api.model.Models; -import com.minelittlepony.api.pony.PonyData; -import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.client.model.ModelType; +import com.minelittlepony.client.model.armour.PonifiedEquipmentRenderer; import com.minelittlepony.client.model.entity.PonyArmourStandModel; import com.minelittlepony.client.model.entity.race.EarthPonyModel; -import com.minelittlepony.client.render.entity.feature.ArmourFeature; +import com.minelittlepony.client.render.entity.feature.*; +import com.minelittlepony.client.render.entity.state.PonyRenderState; public class PonyStandRenderer extends ArmorStandEntityRenderer { - private final PonyArmourStandModel pony = ModelType.ARMOUR_STAND.createModel(); private final ArmorStandArmorEntityModel human; @@ -27,67 +24,65 @@ public class PonyStandRenderer extends ArmorStandEntityRenderer { super(context); human = model; - features.removeIf(feature -> { - return feature instanceof ArmorFeatureRenderer - || feature instanceof HeldItemFeatureRenderer - || feature instanceof ElytraFeatureRenderer - || feature instanceof HeadFeatureRenderer; - }); - addFeature(new Armour(this, context)); - addFeature(new HeldItemFeatureRenderer<>(this, context.getHeldItemRenderer())); - addFeature(new ElytraFeatureRenderer<>(this, context.getModelLoader())); - addFeature(new HeadFeatureRenderer<>(this, context.getModelLoader(), context.getHeldItemRenderer())); + for (int i = 0; i < features.size(); i++) { + var feature = features.get(i); + if (feature instanceof ArmorFeatureRenderer) { + features.set(i, new SwappableFeature<>(this, feature, new Armour(this, context), state -> ((State)state).hasPonyForm)); + } + if (feature instanceof ElytraFeatureRenderer) { + features.set(i, new SwappableFeature<>(this, feature, new ElytraFeature<>(this, context.getEquipmentRenderer()), state -> ((State)state).hasPonyForm)); + } + } + + //addFeature(new HeadFeatureRenderer<>(this, context.getModelLoader(), context.getItemRenderer())); } - public Vec3d getPositionOffset(ArmorStandEntity entity, float tickDelta) { - this.model = isPonita(entity) ? pony : human; - try { - return super.getPositionOffset(entity, tickDelta); - } catch (Throwable t) { - // We need to avoid overriding render() because other mods keep overriding it via mixins which breaks the class heirarchy. - return Vec3d.ZERO; + @Override + public ArmorStandEntityRenderState createRenderState() { + return new State(); + } + + public void updateRenderState(ArmorStandEntity entity, ArmorStandEntityRenderState state, float tickDelta) { + boolean ponified = entity.hasCustomName() && "Ponita".equals(entity.getCustomName().getString()); + + super.updateRenderState(entity, state, tickDelta); + ((State)state).hasPonyForm = ponified; + if (ponified) { + state.pitch = 0.017453292F * entity.getHeadRotation().getPitch(); + state.yawDegrees = 0.017453292F * entity.getHeadRotation().getYaw(); } } @Override - protected void setupTransforms(ArmorStandEntity entity, MatrixStack stack, float animationProgress, float bodyYaw, float tickDelta, float scale) { - super.setupTransforms(entity, stack, animationProgress, bodyYaw, tickDelta, scale); - if (isPonita(entity)) { - stack.translate(0, 0, scale * -4/16F); + protected void setupTransforms(ArmorStandEntityRenderState state, MatrixStack stack, float animationProgress, float bodyYaw) { + super.setupTransforms(state, stack, animationProgress, bodyYaw); + if (((State)state).hasPonyForm) { + stack.translate(0, 0, state.baseScale * -4/16F); + this.model = pony; + } else { + this.model = human; } } - class Armour extends ArmorFeatureRenderer { - private final Models> pony = ModelType.EARTH_PONY.>create(false); + class Armour extends FeatureRenderer { + private final Models> pony = ModelType.EARTH_PONY.create(false); - public Armour(FeatureRendererContext renderer, EntityRendererFactory.Context context) { - super(renderer, - new ArmorStandArmorEntityModel(context.getPart(EntityModelLayers.ARMOR_STAND_INNER_ARMOR)), - new ArmorStandArmorEntityModel(context.getPart(EntityModelLayers.ARMOR_STAND_OUTER_ARMOR)), - context.getModelManager() - ); + private final PonifiedEquipmentRenderer equipmentRenderer; - pony.applyMetadata(PonyData.emptyOf(Race.EARTH)); + public Armour(FeatureRendererContext renderer, EntityRendererFactory.Context context) { + super(renderer); + equipmentRenderer = new PonifiedEquipmentRenderer(context.getEquipmentModelLoader()); } @Override - public void render(MatrixStack stack, VertexConsumerProvider renderContext, int lightUv, ArmorStandEntity entity, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) { - if (isPonita(entity)) { - - headPitch = 0.017453292F * entity.getHeadRotation().getPitch(); - headYaw = 0.017453292F * entity.getHeadRotation().getYaw(); - - pony.body().animateModel(entity, limbDistance, limbAngle, tickDelta); - pony.body().setAngles(entity, limbDistance, limbAngle, age, headYaw, headPitch); - PonyStandRenderer.this.pony.applyAnglesTo(pony.body()); - ArmourFeature.renderArmor(pony, stack, renderContext, lightUv, entity, limbDistance, limbAngle, age, headYaw, headPitch); - } else { - super.render(stack, renderContext, lightUv, entity, limbDistance, limbAngle, tickDelta, age, headYaw, headPitch); - } + public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, ArmorStandEntityRenderState state, float limbAngle, float limbDistance) { + pony.body().setAngles(((State)state).ponyState); + ArmourFeature.renderArmor(pony, matrices, vertices, light, ((State)state).ponyState, limbDistance, limbAngle, equipmentRenderer); } } - static boolean isPonita(ArmorStandEntity entity) { - return entity.hasCustomName() && "Ponita".equals(entity.getCustomName().getString()); + public static final class State extends ArmorStandEntityRenderState { + public boolean hasPonyForm; + public PonyRenderState ponyState = new PonyRenderState(); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/SeaponyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/SeaponyRenderer.java index b9b1c1b8..18063e63 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/SeaponyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/SeaponyRenderer.java @@ -28,7 +28,7 @@ public class SeaponyRenderer extends PonyRenderer texture, float scale) { + public SeaponyRenderer(EntityRendererFactory.Context context, TextureSupplier texture, float scale) { super(context, ModelType.GUARDIAN, texture, scale); } diff --git a/src/main/java/com/minelittlepony/client/render/entity/ZomponyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/ZomponyRenderer.java index f73e82bc..dd363d5d 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/ZomponyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/ZomponyRenderer.java @@ -22,7 +22,7 @@ public class ZomponyRenderer extends PonyRenderer texture, float scale) { + protected ZomponyRenderer(EntityRendererFactory.Context context, TextureSupplier texture, float scale) { super(context, ModelType.ZOMBIE, texture, scale); } @@ -32,7 +32,7 @@ public class ZomponyRenderer extends PonyRenderer zombie(EntityRendererFactory.Context context) { - return new ZomponyRenderer<>(context, entity -> entity.isCozyGlow ? DEMON_CHILD : ZOMBIE, 1); + return new ZomponyRenderer<>(context, entity -> isCozyGlow(entity) ? DEMON_CHILD : ZOMBIE, 1); } public static ZomponyRenderer husk(EntityRendererFactory.Context context) { @@ -47,13 +47,17 @@ public class ZomponyRenderer extends PonyRenderer(context, TextureSupplier.of(ZOMBIE), 6.8F); } + static boolean isCozyGlow(LivingEntity entity) { + return entity.isBaby() && entity.getUuid().getLeastSignificantBits() % 160 == 0; + } + public static class State extends PonyRenderState { public boolean isWinged; public boolean isCozyGlow; public void updateState(LivingEntity entity, PonyModel model, Pony pony, ModelAttributes.Mode mode) { super.updateState(entity, model, pony, mode); - isCozyGlow = baby && entity.getUuid().getLeastSignificantBits() % 160 == 0; + isCozyGlow = isCozyGlow(entity); isWinged = entity.getUuid().getLeastSignificantBits() % 30 == 0; } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyFeature.java index 91215018..6b49279f 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractPonyFeature.java @@ -1,25 +1,23 @@ package com.minelittlepony.client.render.entity.feature; import com.minelittlepony.api.model.Models; -import com.minelittlepony.api.model.PonyModel; +import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.entity.LivingEntity; public abstract class AbstractPonyFeature< S extends PonyRenderState, - M extends EntityModel & PonyModel + M extends ClientPonyModel > extends FeatureRenderer { private final PonyRenderContext context; - @SuppressWarnings("unchecked") public AbstractPonyFeature(PonyRenderContext context) { - super((FeatureRendererContext)context); + super(context.upcast()); this.context = context; } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java index 06c2052f..ea41eb3f 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/ArmourFeature.java @@ -2,13 +2,13 @@ package com.minelittlepony.client.render.entity.feature; import com.minelittlepony.api.model.Models; import com.minelittlepony.api.model.PonyModel; +import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.model.armour.*; import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.render.*; import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; -import net.minecraft.client.render.entity.model.*; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.EquippableComponent; @@ -18,7 +18,11 @@ import net.minecraft.item.*; import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.util.Identifier; -public class ArmourFeature & PonyModel> extends AbstractPonyFeature { +public class ArmourFeature< + T extends LivingEntity, + S extends PonyRenderState, + M extends ClientPonyModel + > extends AbstractPonyFeature { private final PonifiedEquipmentRenderer equipmentRenderer; diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java index 36cd55b9..24649991 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/CapeFeature.java @@ -5,79 +5,63 @@ import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.model.armour.ArmourLayer; import com.minelittlepony.client.model.armour.ArmourRendererPlugin; import com.minelittlepony.client.render.PonyRenderContext; +import com.minelittlepony.client.render.entity.state.PlayerPonyRenderState; +import com.minelittlepony.common.util.render.RenderLayerUtil; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; +import net.minecraft.client.render.entity.feature.CapeFeatureRenderer; +import net.minecraft.client.render.entity.model.EntityModelLoader; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.player.PlayerModelPart; -import net.minecraft.util.math.*; +import net.minecraft.util.Identifier; -public class CapeFeature> extends AbstractPonyFeature { +public class CapeFeature extends CapeFeatureRenderer { - public CapeFeature(PonyRenderContext context) { - super(context); + private final PonyRenderContext> context; + + public CapeFeature(PonyRenderContext> context, EntityModelLoader modelLoader, EquipmentModelLoader equipmentModelLoader) { + super(context.upcast(), modelLoader, equipmentModelLoader); + this.context = context; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider provider, int light, AbstractClientPlayerEntity player, float limbDistance, float limbAngle, float tickDelta, float age, float headYaw, float headPitch) { - M model = getModelWrapper().body(); - - if (!player.isInvisible() - && player.isPartVisible(PlayerModelPart.CAPE) - && player.getSkinTextures().capeTexture() != null) { + public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, PlayerEntityRenderState player, float limbAngle, float limbDistance) { + ClientPonyModel model = context.getInternalRenderer().getModels().body(); + if (!player.invisible && player.capeVisible) { ArmourRendererPlugin plugin = ArmourRendererPlugin.INSTANCE.get(); - VertexConsumer vertices = plugin.getCapeConsumer(player, provider, player.getSkinTextures().capeTexture()); - if (vertices == null) { + Identifier capeTexture = player.skinTextures.capeTexture(); + VertexConsumer buffer = plugin.getCapeConsumer(player, vertices, player.skinTextures.capeTexture()); + if (buffer == null) { return; } + boolean[] rendered = {false}; matrices.push(); + super.render(matrices, layer -> { + if (RenderLayerUtil.getTexture(layer).orElse(null) == capeTexture) { + rendered[0] = true; - matrices.translate(0, 0.24F, 0); - if (model.getAttributes().isLyingDown) { - matrices.translate(0, -0.05F, 0); - } - model.transform(BodyPart.BODY, matrices); - model.getBodyPart(BodyPart.BODY).rotate(matrices); + matrices.translate(0, 0.24F, 0); + if (((PlayerPonyRenderState)player).getAttributes().isLyingDown) { + matrices.translate(0, -0.05F, 0); + } + model.transform((PlayerPonyRenderState)player, BodyPart.BODY, matrices); + model.getBodyPart(BodyPart.BODY).rotate(matrices); - double capeX = MathHelper.lerp(tickDelta, player.capeX, player.prevCapeX) - MathHelper.lerp(tickDelta, player.prevX, player.getX()); - double capeY = MathHelper.lerp(tickDelta, player.capeY, player.prevCapeY) - MathHelper.lerp(tickDelta, player.prevY, player.getY()); - double capeZ = MathHelper.lerp(tickDelta, player.capeZ, player.prevCapeZ) - MathHelper.lerp(tickDelta, player.prevZ, player.getZ()); - - float motionYaw = player.prevBodyYaw + (player.bodyYaw - player.prevBodyYaw); - - double sin = MathHelper.sin(motionYaw * MathHelper.RADIANS_PER_DEGREE); - double cos = -MathHelper.cos(motionYaw * MathHelper.RADIANS_PER_DEGREE); - - float capeMotionY = (float) capeY * 10; - - if (capeMotionY < -6) capeMotionY = -6; - if (capeMotionY > 32) capeMotionY = 32; - - float capeMotionX = (float) (capeX * sin + capeZ * cos) * 100; - - float diagMotion = (float) (capeX * cos - capeZ * sin) * 100; - - if (capeMotionX < 0) capeMotionX = 0; - - float camera = MathHelper.lerp(tickDelta, player.prevStrideDistance, player.strideDistance); - capeMotionY += MathHelper.sin(MathHelper.lerp(tickDelta, player.prevHorizontalSpeed, player.horizontalSpeed) * 6) * 32 * camera; - - matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(2 + capeMotionX / 12 + capeMotionY)); - matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees( diagMotion / 2)); - matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-diagMotion / 2)); - matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180)); - matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90)); - - model.renderCape(matrices, vertices, light, OverlayTexture.DEFAULT_UV); + return buffer; + } + return vertices.getBuffer(layer); + }, light, player, limbAngle, limbDistance); matrices.pop(); - plugin.onArmourRendered(player, matrices, provider, EquipmentSlot.BODY, ArmourLayer.OUTER, ArmourRendererPlugin.ArmourType.CAPE); + if (rendered[0]) { + plugin.onArmourRendered(player, matrices, vertices, EquipmentSlot.BODY, ArmourLayer.OUTER, ArmourRendererPlugin.ArmourType.CAPE); + } } } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/DJPon3Feature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/DJPon3Feature.java index 5fee5d70..ee4d459c 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/DJPon3Feature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/DJPon3Feature.java @@ -4,21 +4,18 @@ import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Colors; -import com.minelittlepony.client.model.ModelType; import com.minelittlepony.api.model.BodyPart; -import com.minelittlepony.api.model.PonyModel; -import com.minelittlepony.client.model.DJPon3EarsModel; +import com.minelittlepony.client.model.*; import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.entity.state.PonyRenderState; public class DJPon3Feature< T extends AbstractClientPlayerEntity, S extends PonyRenderState, - M extends EntityModel & PonyModel + M extends ClientPonyModel > extends AbstractPonyFeature { private final DJPon3EarsModel deadMau5 = ModelType.DJ_PON_3.createModel(); diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java index 7c6041b2..afb86543 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/ElytraFeature.java @@ -1,9 +1,7 @@ package com.minelittlepony.client.render.entity.feature; import com.minelittlepony.api.model.BodyPart; -import com.minelittlepony.api.model.PonyModel; -import com.minelittlepony.client.model.ModelType; -import com.minelittlepony.client.model.PonyElytra; +import com.minelittlepony.client.model.*; import com.minelittlepony.client.model.armour.ArmourLayer; import com.minelittlepony.client.model.armour.ArmourRendererPlugin; import com.minelittlepony.client.render.PonyRenderContext; @@ -11,64 +9,70 @@ import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.equipment.EquipmentRenderer; +import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.render.entity.state.BipedEntityRenderState; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.util.SkinTextures; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.EquippableComponent; -import net.minecraft.entity.LivingEntity; import net.minecraft.entity.EquipmentSlot; import net.minecraft.item.ItemStack; import net.minecraft.item.equipment.EquipmentModel; import net.minecraft.util.Identifier; public class ElytraFeature< - T extends LivingEntity, - S extends PonyRenderState, - M extends EntityModel & PonyModel - > extends AbstractPonyFeature { + S extends BipedEntityRenderState, + M extends EntityModel + > extends FeatureRenderer { private static final Identifier TEXTURE = Identifier.ofVanilla("textures/entity/elytra.png"); private final PonyElytra model = ModelType.ELYTRA.createModel(); + private final FeatureRendererContext context; private final EquipmentRenderer equipmentRenderer; - public ElytraFeature(PonyRenderContext context, EquipmentRenderer equipmentRenderer) { + public ElytraFeature(FeatureRendererContext context, EquipmentRenderer equipmentRenderer) { super(context); + this.context = context; this.equipmentRenderer = equipmentRenderer; } @Override - public void render(MatrixStack matrices, VertexConsumerProvider provider, int light, S entity, float limbAngle, float limbDistance) { + public void render(MatrixStack matrices, VertexConsumerProvider provider, int light, S state, float limbAngle, float limbDistance) { ArmourRendererPlugin plugin = ArmourRendererPlugin.INSTANCE.get(); - for (ItemStack stack : plugin.getArmorStacks(entity, EquipmentSlot.CHEST, ArmourLayer.OUTER, ArmourRendererPlugin.ArmourType.ELYTRA)) { + for (ItemStack stack : plugin.getArmorStacks(state, EquipmentSlot.CHEST, ArmourLayer.OUTER, ArmourRendererPlugin.ArmourType.ELYTRA)) { EquippableComponent equippable = stack.get(DataComponentTypes.EQUIPPABLE); if (equippable != null && !equippable.model().isEmpty()) { Identifier equipmentModel = equippable.model().get(); - float alpha = plugin.getElytraAlpha(stack, model, entity); + float alpha = plugin.getElytraAlpha(stack, model, state); if (alpha <= 0) { return; } matrices.push(); - model.setAngles(entity); - preRenderCallback(entity, matrices); - equipmentRenderer.render(EquipmentModel.LayerType.WINGS, equipmentModel, model, stack, matrices, provider, light, getElytraTexture(entity)); + model.setAngles(state); + preRenderCallback(state, matrices); + equipmentRenderer.render(EquipmentModel.LayerType.WINGS, equipmentModel, model, stack, matrices, provider, light, getElytraTexture(state)); matrices.pop(); } } - plugin.onArmourRendered(entity, matrices, provider, EquipmentSlot.BODY, ArmourLayer.OUTER, ArmourRendererPlugin.ArmourType.ELYTRA); + plugin.onArmourRendered(state, matrices, provider, EquipmentSlot.BODY, ArmourLayer.OUTER, ArmourRendererPlugin.ArmourType.ELYTRA); } + @SuppressWarnings("unchecked") protected void preRenderCallback(S state, MatrixStack stack) { - M body = getModelWrapper().body(); - stack.translate(0, state.riderOffset, 0.125); - body.transform(state, BodyPart.BODY, stack); + if (state instanceof PonyRenderState ponyState && context instanceof PonyRenderContext context) { + stack.translate(0, ponyState.riderOffset, 0.125); + + ((ClientPonyModel)context.getInternalRenderer().getModels().body()).transform(ponyState, BodyPart.BODY, stack); + } } protected Identifier getElytraTexture(S state) { @@ -79,7 +83,7 @@ public class ElytraFeature< return textures.elytraTexture(); } - if (textures.capeTexture() != null && state.capeVisible) { + if (textures.capeTexture() != null && playerState.capeVisible) { return textures.capeTexture(); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java index 0d0e1669..a82aa84c 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/GearFeature.java @@ -4,7 +4,6 @@ import it.unimi.dsi.fastutil.objects.Object2FloatLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2FloatMap; import net.minecraft.block.SkullBlock; import net.minecraft.client.render.*; -import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; @@ -17,9 +16,9 @@ import net.minecraft.world.EmptyBlockView; import com.google.common.cache.*; import com.google.common.collect.Streams; import com.minelittlepony.api.model.BodyPart; -import com.minelittlepony.api.model.PonyModel; import com.minelittlepony.api.model.gear.Gear; import com.minelittlepony.api.pony.meta.Wearable; +import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.armour.ArmourLayer; import com.minelittlepony.client.model.armour.ArmourRendererPlugin; @@ -33,7 +32,7 @@ import java.util.stream.Collectors; public class GearFeature< T extends LivingEntity, S extends PonyRenderState, - M extends EntityModel & PonyModel + M extends ClientPonyModel > extends AbstractPonyFeature { private final List gears = Streams.concat( diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingEyesFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingEyesFeature.java index 7fa3640a..5e75131b 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingEyesFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/GlowingEyesFeature.java @@ -3,17 +3,16 @@ package com.minelittlepony.client.render.entity.feature; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.util.Identifier; -import com.minelittlepony.api.model.PonyModel; +import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.entity.state.PonyRenderState; public class GlowingEyesFeature< S extends PonyRenderState, - M extends EntityModel & PonyModel + M extends ClientPonyModel > extends EyesFeatureRenderer { private final RenderLayer layer; 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 44fcf34a..5a1f9e3f 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,13 +1,12 @@ package com.minelittlepony.client.render.entity.feature; import com.minelittlepony.api.model.*; +import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.render.PonyRenderContext; import com.minelittlepony.client.render.entity.state.PonyRenderState; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.feature.HeldItemFeatureRenderer; -import net.minecraft.client.render.entity.model.EntityModel; +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.util.math.MatrixStack; @@ -18,13 +17,13 @@ import net.minecraft.util.Arm; @SuppressWarnings(value = {"unchecked"}) public class HeldItemFeature< S extends PonyRenderState, - M extends EntityModel & PonyModel - > extends HeldItemFeatureRenderer { + M extends ClientPonyModel + > extends PlayerHeldItemFeatureRenderer { private final PonyRenderContext context; public HeldItemFeature(PonyRenderContext context, ItemRenderer renderer) { - super((FeatureRendererContext)context, renderer); + super(context.upcast(), renderer); this.context = context; } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java index 3fbb53cd..3be0c201 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/SkullFeature.java @@ -2,6 +2,7 @@ package com.minelittlepony.client.render.entity.feature; import com.minelittlepony.api.model.BodyPart; import com.minelittlepony.api.model.PonyModel; +import com.minelittlepony.client.model.ClientPonyModel; import com.minelittlepony.client.model.armour.ArmourLayer; import com.minelittlepony.client.model.armour.ArmourRendererPlugin; import com.minelittlepony.client.render.PonyRenderContext; @@ -25,7 +26,8 @@ import net.minecraft.item.*; public class SkullFeature< T extends LivingEntity, S extends PonyRenderState, - M extends EntityModel & PonyModel> extends AbstractPonyFeature { + M extends ClientPonyModel + > extends AbstractPonyFeature { private final ItemRenderer itemRenderer; public SkullFeature(PonyRenderContext renderPony, EntityModelLoader entityModelLoader, ItemRenderer itemRenderer) { diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java new file mode 100644 index 00000000..a729e1ca --- /dev/null +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/SwappableFeature.java @@ -0,0 +1,35 @@ +package com.minelittlepony.client.render.entity.feature; + +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.EntityModel; +import net.minecraft.client.render.entity.state.EntityRenderState; +import net.minecraft.client.util.math.MatrixStack; + +import java.util.function.Predicate; + +public final class SwappableFeature> extends FeatureRenderer { + + private final FeatureRenderer normal; + private final FeatureRenderer swapped; + + private final Predicate swapCondition; + + public SwappableFeature( + FeatureRendererContext context, + FeatureRenderer normal, + FeatureRenderer swapped, + Predicate swapCondition + ) { + super(context); + this.normal = normal; + this.swapped = swapped; + this.swapCondition = swapCondition; + } + + @Override + public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, S state, float limbAngle, float limbDistance) { + (swapCondition.test(state) ? swapped : normal).render(matrices, vertices, light, state, limbAngle, limbDistance); + } +} 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 ac6d3ad2..4479dbcf 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 @@ -28,7 +28,7 @@ abstract class AbstractNpcRenderer< return ModelType.getPlayerModel(race).create(false, this::initializeModel); }); - public AbstractNpcRenderer(EntityRendererFactory.Context context, String type, TextureSupplier textureSupplier, TextureSupplier formatter) { + public AbstractNpcRenderer(EntityRendererFactory.Context context, String type, TextureSupplier textureSupplier, TextureSupplier formatter) { super(context, ModelType.getPlayerModel(Race.EARTH).getKey(false), SillyPonyTextureSupplier.create(textureSupplier, formatter)); clothing = new NpcClothingFeature<>(this, type); this.manager.setModelsLookup(entity -> models.apply(entity.getRace())); diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/VillagerPonyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/npc/VillagerPonyRenderer.java index d2f2702c..5ea94cd5 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/VillagerPonyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/VillagerPonyRenderer.java @@ -13,7 +13,7 @@ import com.minelittlepony.client.render.entity.npc.textures.*; public class VillagerPonyRenderer extends AbstractNpcRenderer { private static final TextureSupplier FORMATTER = TextureSupplier.formatted("minelittlepony", "textures/entity/villager/%s.png"); - private static final TextureSupplier TEXTURES = TextureSupplier.ofPool( + private static final TextureSupplier TEXTURES = TextureSupplier.ofPool( VariatedTextureSupplier.BACKGROUND_PONIES_POOL, PlayerTextureSupplier.create(ProfessionTextureSupplier.create(FORMATTER)) ); diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/ZomponyVillagerRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/npc/ZomponyVillagerRenderer.java index 367e628a..17956650 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/ZomponyVillagerRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/ZomponyVillagerRenderer.java @@ -13,7 +13,7 @@ import com.minelittlepony.client.render.entity.npc.textures.*; public class ZomponyVillagerRenderer extends AbstractNpcRenderer { private static final TextureSupplier FORMATTER = TextureSupplier.formatted("minelittlepony", "textures/entity/zombie_villager/zombie_%s.png"); - private static final TextureSupplier TEXTURES = TextureSupplier.ofPool( + private static final TextureSupplier TEXTURES = TextureSupplier.ofPool( VariatedTextureSupplier.BACKGROUND_ZOMPONIES_POOL, TextureSupplier.ofPool( VariatedTextureSupplier.BACKGROUND_PONIES_POOL, diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/textures/PlayerTextureSupplier.java b/src/main/java/com/minelittlepony/client/render/entity/npc/textures/PlayerTextureSupplier.java index e05e27b1..2c07fc23 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/textures/PlayerTextureSupplier.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/textures/PlayerTextureSupplier.java @@ -1,18 +1,18 @@ package com.minelittlepony.client.render.entity.npc.textures; import net.minecraft.block.entity.SkullBlockEntity; +import net.minecraft.entity.LivingEntity; import net.minecraft.util.Identifier; import net.minecraft.util.Util; import com.minelittlepony.api.pony.Pony; import com.minelittlepony.api.pony.SkinsProxy; -import com.minelittlepony.client.render.entity.state.PonyRenderState; import java.util.concurrent.CompletableFuture; import java.util.function.Function; public class PlayerTextureSupplier { - public static TextureSupplier create(TextureSupplier fallback) { + public static TextureSupplier create(TextureSupplier fallback) { Function> customNameCache = Util.memoize(name -> { return SkullBlockEntity.fetchProfileByName(name).thenApply(profile -> { return profile @@ -22,7 +22,7 @@ public class PlayerTextureSupplier { }); }); return entity -> { - Identifier override = entity.customName != null ? customNameCache.apply(entity.customName.getString()).getNow(null) : null; + Identifier override = entity.hasCustomName() ? customNameCache.apply(entity.getCustomName().getString()).getNow(null) : null; if (override != null) { return override; } diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/textures/SillyPonyTextureSupplier.java b/src/main/java/com/minelittlepony/client/render/entity/npc/textures/SillyPonyTextureSupplier.java index 2bb79a37..d6c08576 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/textures/SillyPonyTextureSupplier.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/textures/SillyPonyTextureSupplier.java @@ -10,10 +10,10 @@ import com.minelittlepony.api.pony.Pony; import com.minelittlepony.client.render.entity.state.PonyRenderState; public class SillyPonyTextureSupplier { - public static TextureSupplier create(TextureSupplier fallback, TextureSupplier formatter) { + public static TextureSupplier create(TextureSupplier fallback, TextureSupplier formatter) { Identifier egg = formatter.apply("silly_pony"); Identifier egg2 = formatter.apply("tiny_silly_pony"); - return entity -> entity.isDerpy ? (entity.isDinky ? egg2 : egg) : fallback.apply(entity); + return entity -> SillyPonyTextureSupplier.isBestPony(entity) ? (isDinky(entity) ? egg2 : egg) : fallback.apply(entity); } public static boolean isBestPony(LivingEntity entity) { @@ -28,6 +28,10 @@ public class SillyPonyTextureSupplier { return isBestPony(entity) && entity.getUuid().getLeastSignificantBits() % 20 == 0; } + public static boolean isDinky(LivingEntity entity) { + return entity.hasCustomName() && "Dinky".equals(entity.getCustomName().getString()); + } + public static class State extends PonyRenderState implements VillagerDataContainer { public VillagerData villagerData; diff --git a/src/main/java/com/minelittlepony/client/render/entity/npc/textures/TextureSupplier.java b/src/main/java/com/minelittlepony/client/render/entity/npc/textures/TextureSupplier.java index f682e4b7..5f4df661 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/npc/textures/TextureSupplier.java +++ b/src/main/java/com/minelittlepony/client/render/entity/npc/textures/TextureSupplier.java @@ -1,10 +1,11 @@ package com.minelittlepony.client.render.entity.npc.textures; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; import net.minecraft.util.Identifier; import net.minecraft.util.Util; import com.minelittlepony.client.MineLittlePony; -import com.minelittlepony.client.render.entity.state.PonyRenderState; import java.util.Map; import java.util.UUID; @@ -27,13 +28,13 @@ public interface TextureSupplier extends Function { return key -> Identifier.of(domain, String.format(path, key)); } - static TextureSupplier ofVariations(Identifier poolId, TextureSupplier fallback) { + static TextureSupplier ofVariations(Identifier poolId, TextureSupplier fallback) { return entity -> { - return MineLittlePony.getInstance().getVariatedTextures().get(poolId).getId(entity.attributes.getEntityId()).orElse(fallback.apply(entity)); + return MineLittlePony.getInstance().getVariatedTextures().get(poolId).getId(entity.getUuid()).orElse(fallback.apply(entity)); }; } - static TextureSupplier ofPool(Identifier poolId, TextureSupplier fallback) { + static TextureSupplier ofPool(Identifier poolId, TextureSupplier fallback) { final BiFunction cache = Util.memoize((name, uuid) -> { return MineLittlePony.getInstance().getVariatedTextures() .get(poolId) @@ -41,7 +42,7 @@ public interface TextureSupplier extends Function { .orElse(null); }); return entity -> { - Identifier override = entity.customName != null ? cache.apply(entity.customName.getString(), entity.attributes.getEntityId()) : null; + Identifier override = entity.hasCustomName() ? cache.apply(entity.getCustomName().getString(), entity.getUuid()) : null; if (override != null) { return override; } diff --git a/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java b/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java index a899c026..caf51c28 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java +++ b/src/main/java/com/minelittlepony/client/render/entity/state/PonyRenderState.java @@ -4,6 +4,9 @@ import net.minecraft.block.BedBlock; import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.entity.EntityPose; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.mob.AbstractPiglinEntity; +import net.minecraft.entity.mob.ZombifiedPiglinEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.MathHelper; import com.minelittlepony.api.config.PonyConfig; @@ -25,6 +28,7 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode public boolean sleepingInBed; public boolean submergedInWater; public boolean onGround; + public boolean isTechnoblade; public Pony pony; @@ -43,6 +47,13 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode pose = EntityPose.SITTING; } + isTechnoblade = (( + entity instanceof AbstractPiglinEntity + || entity instanceof PlayerEntity + || entity instanceof ZombifiedPiglinEntity + ) && entity.hasCustomName() && entity.getCustomName().getString().equalsIgnoreCase("technoblade") + ); + PonyPosture.of(attributes).updateState(entity, this); PonyModelPrepareCallback.EVENT.invoker().onPonyModelPrepared(attributes, model, ModelAttributes.Mode.OTHER); } @@ -114,7 +125,7 @@ public class PonyRenderState extends PlayerEntityRenderState implements PonyMode * Tests if this model is wearing the given piece of gear. */ public boolean isWearing(Wearable wearable) { - return isEmbedded(wearable) || attributes.featureSkins.contains(wearable.getId()); + return isEmbedded(wearable) || attributes.featureSkins.contains(wearable.getId()) || isTechnoblade && wearable == Wearable.CROWN; } /** diff --git a/src/main/resources/minelp.aw b/src/main/resources/minelp.aw index a9ca30e4..1f422828 100644 --- a/src/main/resources/minelp.aw +++ b/src/main/resources/minelp.aw @@ -1,2 +1,4 @@ accessWidener v1 named accessible class net/minecraft/client/render/VertexConsumers$Union + +extendable method net/minecraft/client/model/Model render (Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;III)V