diff --git a/src/main/java/com/minelittlepony/client/model/ModelType.java b/src/main/java/com/minelittlepony/client/model/ModelType.java index fe94eec6..9639eb02 100644 --- a/src/main/java/com/minelittlepony/client/model/ModelType.java +++ b/src/main/java/com/minelittlepony/client/model/ModelType.java @@ -1,6 +1,8 @@ package com.minelittlepony.client.model; import net.minecraft.client.model.Model; +import net.minecraft.client.model.Model.SinglePartModel; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.model.ModelPart; import net.minecraft.entity.LivingEntity; @@ -35,6 +37,7 @@ public final class ModelType { public static final ModelKey> ZOMBIE = register("zombie", ZomponyModel::new); public static final ModelKey PIGLIN = register("piglin", PiglinPonyModel::new); public static final ModelKey> SKELETON = register("skeleton", SkeleponyModel::new); + public static final ModelKey BOGGED_MUSHROOMS = register("bogged_mushrooms", tree -> new SinglePartModel(tree, RenderLayer::getEntityTranslucent)); public static final ModelKey> SKELETON_CLOTHES = register("skeleton_clothes", SkeleponyModel::new); public static final ModelKey PILLAGER = register("pillager", PillagerPonyModel::new); public static final ModelKey> ILLAGER = register("illager", IllagerPonyModel::new); diff --git a/src/main/java/com/minelittlepony/client/render/MobRenderers.java b/src/main/java/com/minelittlepony/client/render/MobRenderers.java index 0c8a880c..9189c512 100644 --- a/src/main/java/com/minelittlepony/client/render/MobRenderers.java +++ b/src/main/java/com/minelittlepony/client/render/MobRenderers.java @@ -52,6 +52,7 @@ public record MobRenderers (String name, BiConsumer { registry.registerEntityRenderer(EntityType.SKELETON, state, SkeleponyRenderer::skeleton); registry.registerEntityRenderer(EntityType.STRAY, state, SkeleponyRenderer::stray); + registry.registerEntityRenderer(EntityType.BOGGED, state, SkeleponyRenderer::bogged); registry.registerEntityRenderer(EntityType.WITHER_SKELETON, state, SkeleponyRenderer::wither); }); public static final MobRenderers GUARDIAN = register("guardians", (state, registry) -> { diff --git a/src/main/java/com/minelittlepony/client/render/entity/SkeleponyRenderer.java b/src/main/java/com/minelittlepony/client/render/entity/SkeleponyRenderer.java index 702be9db..93433a0c 100644 --- a/src/main/java/com/minelittlepony/client/render/entity/SkeleponyRenderer.java +++ b/src/main/java/com/minelittlepony/client/render/entity/SkeleponyRenderer.java @@ -1,68 +1,102 @@ package com.minelittlepony.client.render.entity; -import com.minelittlepony.api.model.ModelAttributes; -import com.minelittlepony.api.model.PonyModel; +import com.minelittlepony.api.model.*; import com.minelittlepony.api.pony.Pony; import com.minelittlepony.api.pony.meta.Race; import com.minelittlepony.client.MineLittlePony; import com.minelittlepony.client.model.ModelType; import com.minelittlepony.client.model.entity.SkeleponyModel; -import com.minelittlepony.client.render.entity.feature.AbstractClothingFeature; +import com.minelittlepony.client.render.entity.feature.ClothingFeature; import com.minelittlepony.client.render.entity.npc.textures.TextureSupplier; import com.minelittlepony.client.render.entity.state.PonyRenderState; +import net.minecraft.client.model.Model.SinglePartModel; +import net.minecraft.client.render.*; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.LivingEntityRenderer; +import net.minecraft.client.render.entity.feature.FeatureRenderer; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.*; +import net.minecraft.util.Colors; import net.minecraft.util.Identifier; -public class SkeleponyRenderer extends PonyRenderer> { +public class SkeleponyRenderer extends PonyRenderer> { public static final Identifier SKELETON = MineLittlePony.id("textures/entity/skeleton/skeleton_pony.png"); public static final Identifier WITHER = MineLittlePony.id("textures/entity/skeleton/skeleton_wither_pony.png"); public static final Identifier STRAY = MineLittlePony.id("textures/entity/skeleton/stray_pony.png"); + public static final Identifier BOGGED = MineLittlePony.id("textures/entity/skeleton/bogged_pony.png"); + + public static final Identifier STRAY_SKELETON_OVERLAY = MineLittlePony.id("textures/entity/skeleton/stray_pony_overlay.png"); + public static final Identifier BOGGED_SKELETON_OVERLAY = MineLittlePony.id("textures/entity/skeleton/bogged_pony_overlay.png"); public SkeleponyRenderer(EntityRendererFactory.Context context, Identifier texture, float scale) { super(context, ModelType.SKELETON, TextureSupplier.of(texture), scale); } + @SuppressWarnings("unchecked") @Override - public SkeleponyRenderer.State createRenderState() { - return new State(); + public S createRenderState() { + return (S)new State(); } - public static SkeleponyRenderer skeleton(EntityRendererFactory.Context context) { + public static SkeleponyRenderer skeleton(EntityRendererFactory.Context context) { return new SkeleponyRenderer<>(context, SKELETON, 1); } - public static SkeleponyRenderer stray(EntityRendererFactory.Context context) { - return PonyRenderer.appendFeature(new SkeleponyRenderer<>(context, STRAY, 1), StrayClothingFeature::new); + public static SkeleponyRenderer stray(EntityRendererFactory.Context context) { + return PonyRenderer.appendFeature(new SkeleponyRenderer(context, STRAY, 1), ctx -> { + return new ClothingFeature<>(ctx, ModelType.SKELETON_CLOTHES, STRAY_SKELETON_OVERLAY); + }); } - public static SkeleponyRenderer wither(EntityRendererFactory.Context context) { + public static SkeleponyRenderer bogged(EntityRendererFactory.Context context) { + return PonyRenderer.appendFeature(PonyRenderer.appendFeature(new SkeleponyRenderer<>(context, BOGGED, 1) { + @Override + public BoggedState createRenderState() { + return new BoggedState(); + } + }, ctx -> { + return new ClothingFeature<>(ctx, ModelType.SKELETON_CLOTHES, BOGGED_SKELETON_OVERLAY); + }), BoggedMushroomsFeature::new); + } + + public static SkeleponyRenderer wither(EntityRendererFactory.Context context) { return new SkeleponyRenderer<>(context, WITHER, 1.2F); } - public static class StrayClothingFeature< + public static class BoggedMushroomsFeature< T extends AbstractSkeletonEntity, S extends SkeleponyRenderer.State - > extends AbstractClothingFeature> { - public static final Identifier STRAY_SKELETON_OVERLAY = MineLittlePony.id("textures/entity/skeleton/stray_pony_overlay.png"); + > extends FeatureRenderer> { + public static final Identifier MUSHROOMS = MineLittlePony.id("textures/entity/skeleton/bogged_pony_mushrooms.png"); - private final SkeleponyModel overlayModel = ModelType.SKELETON_CLOTHES.createModel(); + private final SinglePartModel model = ModelType.BOGGED_MUSHROOMS.createModel(); - public StrayClothingFeature(LivingEntityRenderer> render) { - super(render); + public BoggedMushroomsFeature(LivingEntityRenderer> renderer) { + super(renderer); } @Override - protected SkeleponyModel getOverlayModel() { - return overlayModel; + public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, BoggedState state, float limbAngle, float limbDistance) { + if (!state.sheared) { + matrices.push(); + getContextModel().transform(state, BodyPart.HEAD, matrices); + getContextModel().head.rotate(matrices); + VertexConsumer buffer = vertices.getBuffer(model.getLayer(MUSHROOMS)); + model.render(matrices, buffer, light, OverlayTexture.DEFAULT_UV, Colors.WHITE); + matrices.pop(); + } } + } + + public static class BoggedState extends State { + public boolean sheared; @Override - protected Identifier getOverlayTexture() { - return STRAY_SKELETON_OVERLAY; + public void updateState(LivingEntity entity, PonyModel model, Pony pony, ModelAttributes.Mode mode) { + super.updateState(entity, model, pony, mode); + sheared = entity instanceof BoggedEntity bogged && bogged.isSheared(); } } diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractClothingFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractClothingFeature.java deleted file mode 100644 index 5fe33a01..00000000 --- a/src/main/java/com/minelittlepony/client/render/entity/feature/AbstractClothingFeature.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.minelittlepony.client.render.entity.feature; - -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.Colors; -import net.minecraft.util.Identifier; - -import com.minelittlepony.api.model.PonyModel; -import com.minelittlepony.client.render.entity.state.PonyRenderState; - -// separate class in case I need it later -public abstract class AbstractClothingFeature< - T extends LivingEntity, - S extends PonyRenderState, - M extends BipedEntityModel & PonyModel - > extends FeatureRenderer { - - protected final FeatureRendererContext renderer; - - public AbstractClothingFeature(FeatureRendererContext render) { - super(render); - renderer = render; - } - - @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, S state, float limbAngle, float limbDistance) { - M overlayModel = getOverlayModel(); - - overlayModel.setAngles(state); - VertexConsumer buffer = vertices.getBuffer(overlayModel.getLayer(getOverlayTexture())); - overlayModel.render(matrices, buffer, light, OverlayTexture.DEFAULT_UV, Colors.WHITE); - } - - protected abstract M getOverlayModel(); - - protected abstract Identifier getOverlayTexture(); -} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/client/render/entity/feature/ClothingFeature.java b/src/main/java/com/minelittlepony/client/render/entity/feature/ClothingFeature.java new file mode 100644 index 00000000..202d17ca --- /dev/null +++ b/src/main/java/com/minelittlepony/client/render/entity/feature/ClothingFeature.java @@ -0,0 +1,39 @@ +package com.minelittlepony.client.render.entity.feature; + +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.VertexConsumer; +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.util.math.MatrixStack; +import net.minecraft.util.Colors; +import net.minecraft.util.Identifier; + +import com.minelittlepony.client.model.ClientPonyModel; +import com.minelittlepony.client.render.entity.state.PonyRenderState; +import com.minelittlepony.mson.api.ModelKey; + +// separate class in case I need it later +public class ClothingFeature< + S extends PonyRenderState, + M extends ClientPonyModel + > extends FeatureRenderer { + + protected final FeatureRendererContext context; + private final M model; + private final Identifier texture; + + public ClothingFeature(FeatureRendererContext context, ModelKey model, Identifier texture) { + super(context); + this.context = context; + this.model = model.createModel(); + this.texture = texture; + } + + @Override + public void render(MatrixStack matrices, VertexConsumerProvider vertices, int light, S state, float limbAngle, float limbDistance) { + model.setAngles(state); + VertexConsumer buffer = vertices.getBuffer(model.getLayer(texture)); + model.render(matrices, buffer, light, OverlayTexture.DEFAULT_UV, Colors.WHITE); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minelittlepony/models/entity/bogged_mushrooms.json b/src/main/resources/assets/minelittlepony/models/entity/bogged_mushrooms.json new file mode 100644 index 00000000..c203a01f --- /dev/null +++ b/src/main/resources/assets/minelittlepony/models/entity/bogged_mushrooms.json @@ -0,0 +1,58 @@ +{ + "texture": {"u": 50, "w": 64, "h": 32}, + "data": { + "mushrooms": { + "pivot": [0, 1, -2], + "children": { + "red_mushroom_1": { + "texture": {"v": 16}, + "pivot": [3, -8, 3], + "rotate": [0, 45, 0], + "cubes": [ + { "from": [-3, -3, 0], "size": [6, 4, 0]} + ] + }, + "red_mushroom_2": { + "texture": {"v": 16}, + "pivot": [3, -8, 3], + "rotate": [0, 134, 0], + "cubes": [ + { "from": [-3, -3, 0], "size": [6, 4, 0]} + ] + }, + "brown_mushroom_1": { + "texture": {"v": 22}, + "pivot": [-3, -8, -3], + "rotate": [0, 45, 0], + "cubes": [ + { "from": [-3, -3, 0], "size": [6, 4, 0]} + ] + }, + "brown_mushroom_2": { + "texture": {"v": 22}, + "pivot": [-3, -8, -3], + "rotate": [0, 134, 0], + "cubes": [ + { "from": [-3, -3, 0], "size": [6, 4, 0]} + ] + }, + "brown_mushroom_3": { + "texture": {"v": 28}, + "pivot": [-2, -1, 4], + "rotate": [-90, 0, 45], + "cubes": [ + { "from": [-3, -4, 0], "size": [6, 4, 0]} + ] + }, + "brown_mushroom_4": { + "texture": {"v": 28}, + "pivot": [-2, -1, 4], + "rotate": [-90, 0, 134], + "cubes": [ + { "from": [-3, -4, 0], "size": [6, 4, 0]} + ] + } + } + } + } +} diff --git a/src/main/resources/assets/minelittlepony/textures/entity/skeleton/bogged_pony.png b/src/main/resources/assets/minelittlepony/textures/entity/skeleton/bogged_pony.png new file mode 100644 index 00000000..0d07300e Binary files /dev/null and b/src/main/resources/assets/minelittlepony/textures/entity/skeleton/bogged_pony.png differ diff --git a/src/main/resources/assets/minelittlepony/textures/entity/skeleton/bogged_pony_mushrooms.png b/src/main/resources/assets/minelittlepony/textures/entity/skeleton/bogged_pony_mushrooms.png new file mode 100644 index 00000000..e915420d Binary files /dev/null and b/src/main/resources/assets/minelittlepony/textures/entity/skeleton/bogged_pony_mushrooms.png differ diff --git a/src/main/resources/assets/minelittlepony/textures/entity/skeleton/bogged_pony_overlay.png b/src/main/resources/assets/minelittlepony/textures/entity/skeleton/bogged_pony_overlay.png new file mode 100644 index 00000000..09c68707 Binary files /dev/null and b/src/main/resources/assets/minelittlepony/textures/entity/skeleton/bogged_pony_overlay.png differ