From e5bf933758bdf7bfa9e128b62aad1db5c9b034df Mon Sep 17 00:00:00 2001 From: Frank Bauer Date: Thu, 24 Jun 2021 09:19:20 +0200 Subject: [PATCH] Render *EndSlime* --- .../ru/betterend/entity/EndSlimeEntity.java | 5 +- .../entity/model/EndSlimeEntityModel.java | 100 +++++++++++++++--- .../RendererEntityCubozoa.java | 2 +- .../entity/render/RendererEntityEndSlime.java | 21 ++-- .../java/ru/betterend/interfaces/ISlime.java | 3 + .../ru/betterend/mixin/common/SlimeMixin.java | 14 ++- .../registry/EndEntitiesRenders.java | 16 +-- 7 files changed, 124 insertions(+), 37 deletions(-) rename src/main/java/ru/betterend/entity/{model => render}/RendererEntityCubozoa.java (96%) diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index f790dbb5..48393a06 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -116,7 +116,7 @@ public class EndSlimeEntity extends Slime { } @Override - public void remove() { + public void remove(RemovalReason reason) { int i = this.getSize(); if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) { Component text = this.getCustomName(); @@ -144,7 +144,8 @@ public class EndSlimeEntity extends Slime { this.level.addFreshEntity(slimeEntity); } } - this.removed = true; + + ((ISlime)this).entityRemove(reason); } @Override diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java index 5d3bb97d..2abf6c55 100644 --- a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -6,37 +6,90 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.ListModel; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartNames; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; import net.minecraft.client.renderer.RenderType; import ru.bclib.util.MHelper; import ru.betterend.entity.EndSlimeEntity; public class EndSlimeEntityModel extends ListModel { - private final ModelPart flower; - private final ModelPart crop; private final ModelPart innerCube; private final ModelPart rightEye; private final ModelPart leftEye; private final ModelPart mouth; + private final ModelPart flower; + private final ModelPart crop; - public EndSlimeEntityModel(boolean onlyShell) { - super(RenderType::entityCutout); + public static LayerDefinition getShellOnlyTexturedModelData() { + return getTexturedModelData(true); + } + public static LayerDefinition getCompleteTexturedModelData() { + return getTexturedModelData(false); + } - this.innerCube = new ModelPart(this, 0, 16); - this.rightEye = new ModelPart(this, 32, 0); - this.leftEye = new ModelPart(this, 32, 4); - this.mouth = new ModelPart(this, 32, 8); - this.flower = new ModelPart(this); - this.crop = new ModelPart(this); + private static LayerDefinition getTexturedModelData(boolean onlyShell) { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + //this.innerCube = new ModelPart(this, 0, 16); if (onlyShell) { - this.innerCube.texOffs(0, 0); - this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); + modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 0) + .addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F), + PartPose.ZERO); + /* this.innerCube.texOffs(0, 0); + this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F);*/ } else { - this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); - this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); - this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create() + .texOffs(0, 16) + .addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F), + PartPose.ZERO); + //this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); + modelPartData.addOrReplaceChild(PartNames.RIGHT_EYE, CubeListBuilder.create() + .texOffs(32, 0) + .addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), + PartPose.ZERO); + //this.rightEye = new ModelPart(this, 32, 0); + //this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + + modelPartData.addOrReplaceChild(PartNames.LEFT_EYE, CubeListBuilder.create() + .texOffs(32, 4) + .addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F), + PartPose.ZERO); + //this.leftEye = new ModelPart(this, 32, 4); + //this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); + + modelPartData.addOrReplaceChild(PartNames.MOUTH, CubeListBuilder.create() + .texOffs(32, 8) + .addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F), + PartPose.ZERO); + //this.mouth = new ModelPart(this, 32, 8); + //this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F); + + PartDefinition flowerPart = modelPartData.addOrReplaceChild("flower", CubeListBuilder.create(), PartPose.ZERO); + PartDefinition cropPart = modelPartData.addOrReplaceChild("crop", CubeListBuilder.create(), PartPose.ZERO); + + for (int i = 0; i < 6; i++) { + final PartDefinition parent = i<4?flowerPart:cropPart; + final float rot = MHelper.degreesToRadians( i<4 ? (i * 45F) : ((i-4) * 90F + 45F) ); + + PartDefinition petalRotPart = parent.addOrReplaceChild("petalRot_"+i, + CubeListBuilder.create(), + PartPose.offsetAndRotation(0,0,0,0,rot, 0)); + + + petalRotPart.addOrReplaceChild("petal_"+i, + CubeListBuilder.create() + .texOffs(40, 0) + .addBox(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F), + PartPose.offset(-4, 8, 0)); + } + /* this.flower = new ModelPart(this); for (int i = 0; i < 4; i++) { ModelPart petalRot = new ModelPart(this); petalRot.yRot = MHelper.degreesToRadians(i * 45F); @@ -48,6 +101,7 @@ public class EndSlimeEntityModel extends ListModel this.flower.addChild(petalRot); petalRot.addChild(petal); } + this.crop = new ModelPart(this); for (int i = 0; i < 2; i++) { ModelPart petalRot = new ModelPart(this); @@ -60,7 +114,21 @@ public class EndSlimeEntityModel extends ListModel this.crop.addChild(petalRot); petalRot.addChild(petal); } + */ } + + return LayerDefinition.create(modelData, 64, 32); + } + + public EndSlimeEntityModel(ModelPart modelPart) { + super(RenderType::entityCutout); + + innerCube = modelPart.getChild(PartNames.BODY); + rightEye = modelPart.getChild(PartNames.RIGHT_EYE); + leftEye = modelPart.getChild(PartNames.LEFT_EYE); + mouth = modelPart.getChild(PartNames.MOUTH); + flower = modelPart.getChild("flower"); + crop = modelPart.getChild("crop"); } @Override diff --git a/src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java similarity index 96% rename from src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java rename to src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java index 27500043..d9a3fa47 100644 --- a/src/main/java/ru/betterend/entity/model/RendererEntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityCubozoa.java @@ -20,7 +20,7 @@ public class RendererEntityCubozoa extends MobRenderer(this) { @Override public RenderType renderType() { diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index 3fad8fc1..39fdf210 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -5,10 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.client.renderer.entity.MobRenderer; -import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.*; import net.minecraft.client.renderer.entity.layers.EyesLayer; import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -16,15 +13,17 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import ru.betterend.BetterEnd; import ru.betterend.entity.EndSlimeEntity; +import ru.betterend.entity.model.CubozoaEntityModel; import ru.betterend.entity.model.EndSlimeEntityModel; +import ru.betterend.registry.EndEntitiesRenders; public class RendererEntityEndSlime extends MobRenderer> { private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; private static final RenderType GLOW[] = new RenderType[4]; - public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { - super(entityRenderDispatcher, new EndSlimeEntityModel(false), 0.25F); - this.addLayer(new OverlayFeatureRenderer(this)); + public RendererEntityEndSlime(EntityRendererProvider.Context ctx) { + super(ctx, new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_MODEL)), 0.25f); + this.addLayer(new OverlayFeatureRenderer(this, ctx)); this.addLayer(new EyesLayer>(this) { @Override public RenderType renderType() { @@ -69,11 +68,13 @@ public class RendererEntityEndSlime extends MobRenderer extends RenderLayer> { - private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true); - private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true); + private final EndSlimeEntityModel modelOrdinal; + private final EndSlimeEntityModel modelLake; - public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext) { + public OverlayFeatureRenderer(RenderLayerParent> featureRendererContext, EntityRendererProvider.Context ctx) { super(featureRendererContext); + modelOrdinal = new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_SHELL_MODEL)); + modelLake = new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_SHELL_MODEL)); } public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity, diff --git a/src/main/java/ru/betterend/interfaces/ISlime.java b/src/main/java/ru/betterend/interfaces/ISlime.java index 7df19bc6..3994ad34 100644 --- a/src/main/java/ru/betterend/interfaces/ISlime.java +++ b/src/main/java/ru/betterend/interfaces/ISlime.java @@ -1,5 +1,8 @@ package ru.betterend.interfaces; +import net.minecraft.world.entity.Entity; + public interface ISlime { public void be_setSlimeSize(int size, boolean heal); + void entityRemove(Entity.RemovalReason removalReason); } diff --git a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java index 5d5ba94f..a6a9509c 100644 --- a/src/main/java/ru/betterend/mixin/common/SlimeMixin.java +++ b/src/main/java/ru/betterend/mixin/common/SlimeMixin.java @@ -1,5 +1,8 @@ package ru.betterend.mixin.common; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -7,7 +10,11 @@ import net.minecraft.world.entity.monster.Slime; import ru.betterend.interfaces.ISlime; @Mixin(Slime.class) -public class SlimeMixin implements ISlime { +public abstract class SlimeMixin extends Entity implements ISlime { + public SlimeMixin(EntityType entityType, Level level) { + super(entityType, level); + } + @Shadow protected void setSize(int size, boolean heal) {} @@ -15,4 +22,9 @@ public class SlimeMixin implements ISlime { public void be_setSlimeSize(int size, boolean heal) { setSize(size, heal); } + + @Override + public void entityRemove(Entity.RemovalReason removalReason){ + super.remove(removalReason); + } } diff --git a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java index d1e59f53..95746fcb 100644 --- a/src/main/java/ru/betterend/registry/EndEntitiesRenders.java +++ b/src/main/java/ru/betterend/registry/EndEntitiesRenders.java @@ -1,17 +1,15 @@ package ru.betterend.registry; -import java.util.function.Function; - import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityModelLayerRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.minecraft.client.model.geom.ModelLayerLocation; -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import ru.betterend.BetterEnd; import ru.betterend.entity.model.CubozoaEntityModel; -import ru.betterend.entity.model.RendererEntityCubozoa; +import ru.betterend.entity.model.EndSlimeEntityModel; +import ru.betterend.entity.render.RendererEntityCubozoa; import ru.betterend.entity.render.RendererEntityDragonfly; import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndSlime; @@ -19,8 +17,10 @@ import ru.betterend.entity.render.RendererEntityShadowWalker; import ru.betterend.entity.render.SilkMothEntityRenderer; public class EndEntitiesRenders { - public static final ModelLayerLocation DRAGONFLY_MODEL = registerMain("dragonfly"); - + public static final ModelLayerLocation CUBOZOA_MODEL = registerMain("cubozoa"); + public static final ModelLayerLocation END_SLIME_SHELL_MODEL = registerMain("endslime_shell"); + public static final ModelLayerLocation END_SLIME_MODEL = registerMain("endslime"); + public static void register() { register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); register(EndEntities.END_SLIME, RendererEntityEndSlime.class); @@ -29,7 +29,9 @@ public class EndEntitiesRenders { register(EndEntities.CUBOZOA, RendererEntityCubozoa.class); register(EndEntities.SILK_MOTH, SilkMothEntityRenderer.class); - EntityModelLayerRegistry.registerModelLayer(DRAGONFLY_MODEL, CubozoaEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(CUBOZOA_MODEL, CubozoaEntityModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_SLIME_SHELL_MODEL, EndSlimeEntityModel::getShellOnlyTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(END_SLIME_MODEL, EndSlimeEntityModel::getCompleteTexturedModelData); } private static void register(EntityType type, Class> renderer) {