Render *EndSlime*

This commit is contained in:
Frank Bauer 2021-06-24 09:19:20 +02:00
parent d6696feb16
commit e5bf933758
7 changed files with 124 additions and 37 deletions

View file

@ -116,7 +116,7 @@ public class EndSlimeEntity extends Slime {
} }
@Override @Override
public void remove() { public void remove(RemovalReason reason) {
int i = this.getSize(); int i = this.getSize();
if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) { if (!this.level.isClientSide && i > 1 && this.isDeadOrDying()) {
Component text = this.getCustomName(); Component text = this.getCustomName();
@ -144,7 +144,8 @@ public class EndSlimeEntity extends Slime {
this.level.addFreshEntity(slimeEntity); this.level.addFreshEntity(slimeEntity);
} }
} }
this.removed = true;
((ISlime)this).entityRemove(reason);
} }
@Override @Override

View file

@ -6,37 +6,90 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.ListModel; import net.minecraft.client.model.ListModel;
import net.minecraft.client.model.geom.ModelPart; 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 net.minecraft.client.renderer.RenderType;
import ru.bclib.util.MHelper; import ru.bclib.util.MHelper;
import ru.betterend.entity.EndSlimeEntity; import ru.betterend.entity.EndSlimeEntity;
public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T> { public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T> {
private final ModelPart flower;
private final ModelPart crop;
private final ModelPart innerCube; private final ModelPart innerCube;
private final ModelPart rightEye; private final ModelPart rightEye;
private final ModelPart leftEye; private final ModelPart leftEye;
private final ModelPart mouth; private final ModelPart mouth;
private final ModelPart flower;
private final ModelPart crop;
public EndSlimeEntityModel(boolean onlyShell) { public static LayerDefinition getShellOnlyTexturedModelData() {
super(RenderType::entityCutout); return getTexturedModelData(true);
}
public static LayerDefinition getCompleteTexturedModelData() {
return getTexturedModelData(false);
}
this.innerCube = new ModelPart(this, 0, 16); private static LayerDefinition getTexturedModelData(boolean onlyShell) {
this.rightEye = new ModelPart(this, 32, 0); MeshDefinition modelData = new MeshDefinition();
this.leftEye = new ModelPart(this, 32, 4); PartDefinition modelPartData = modelData.getRoot();
this.mouth = new ModelPart(this, 32, 8);
this.flower = new ModelPart(this);
this.crop = new ModelPart(this);
//this.innerCube = new ModelPart(this, 0, 16);
if (onlyShell) { if (onlyShell) {
this.innerCube.texOffs(0, 0); modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
this.innerCube.addBox(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F); .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 { } else {
this.innerCube.addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F); modelPartData.addOrReplaceChild(PartNames.BODY, CubeListBuilder.create()
this.rightEye.addBox(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); .texOffs(0, 16)
this.leftEye.addBox(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F); .addBox(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F),
this.mouth.addBox(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.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++) { for (int i = 0; i < 4; i++) {
ModelPart petalRot = new ModelPart(this); ModelPart petalRot = new ModelPart(this);
petalRot.yRot = MHelper.degreesToRadians(i * 45F); petalRot.yRot = MHelper.degreesToRadians(i * 45F);
@ -48,6 +101,7 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
this.flower.addChild(petalRot); this.flower.addChild(petalRot);
petalRot.addChild(petal); petalRot.addChild(petal);
} }
this.crop = new ModelPart(this);
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
ModelPart petalRot = new ModelPart(this); ModelPart petalRot = new ModelPart(this);
@ -60,7 +114,21 @@ public class EndSlimeEntityModel<T extends EndSlimeEntity> extends ListModel<T>
this.crop.addChild(petalRot); this.crop.addChild(petalRot);
petalRot.addChild(petal); 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 @Override

View file

@ -20,7 +20,7 @@ public class RendererEntityCubozoa extends MobRenderer<CubozoaEntity, CubozoaEnt
private static final RenderType[] GLOW = new RenderType[2]; private static final RenderType[] GLOW = new RenderType[2];
public RendererEntityCubozoa(EntityRendererProvider.Context ctx) { public RendererEntityCubozoa(EntityRendererProvider.Context ctx) {
super(ctx, new CubozoaEntityModel(ctx.bakeLayer(EndEntitiesRenders.DRAGONFLY_MODEL)), 0.5f); super(ctx, new CubozoaEntityModel(ctx.bakeLayer(EndEntitiesRenders.CUBOZOA_MODEL)), 0.5f);
this.addLayer(new EyesLayer<CubozoaEntity, CubozoaEntityModel>(this) { this.addLayer(new EyesLayer<CubozoaEntity, CubozoaEntityModel>(this) {
@Override @Override
public RenderType renderType() { public RenderType renderType() {

View file

@ -5,10 +5,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.*;
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.layers.EyesLayer; import net.minecraft.client.renderer.entity.layers.EyesLayer;
import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.entity.layers.RenderLayer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
@ -16,15 +13,17 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.entity.EndSlimeEntity; import ru.betterend.entity.EndSlimeEntity;
import ru.betterend.entity.model.CubozoaEntityModel;
import ru.betterend.entity.model.EndSlimeEntityModel; import ru.betterend.entity.model.EndSlimeEntityModel;
import ru.betterend.registry.EndEntitiesRenders;
public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>> { public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>> {
private static final ResourceLocation TEXTURE[] = new ResourceLocation[4]; private static final ResourceLocation TEXTURE[] = new ResourceLocation[4];
private static final RenderType GLOW[] = new RenderType[4]; private static final RenderType GLOW[] = new RenderType[4];
public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) { public RendererEntityEndSlime(EntityRendererProvider.Context ctx) {
super(entityRenderDispatcher, new EndSlimeEntityModel<EndSlimeEntity>(false), 0.25F); super(ctx, new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_MODEL)), 0.25f);
this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this)); this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this, ctx));
this.addLayer(new EyesLayer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>>(this) { this.addLayer(new EyesLayer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>>(this) {
@Override @Override
public RenderType renderType() { public RenderType renderType() {
@ -69,11 +68,13 @@ public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlime
private final class OverlayFeatureRenderer<T extends EndSlimeEntity> private final class OverlayFeatureRenderer<T extends EndSlimeEntity>
extends RenderLayer<T, EndSlimeEntityModel<T>> { extends RenderLayer<T, EndSlimeEntityModel<T>> {
private final EndSlimeEntityModel<T> modelOrdinal = new EndSlimeEntityModel<T>(true); private final EndSlimeEntityModel<T> modelOrdinal;
private final EndSlimeEntityModel<T> modelLake = new EndSlimeEntityModel<T>(true); private final EndSlimeEntityModel<T> modelLake;
public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> featureRendererContext) { public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> featureRendererContext, EntityRendererProvider.Context ctx) {
super(featureRendererContext); 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, public void render(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, T livingEntity,

View file

@ -1,5 +1,8 @@
package ru.betterend.interfaces; package ru.betterend.interfaces;
import net.minecraft.world.entity.Entity;
public interface ISlime { public interface ISlime {
public void be_setSlimeSize(int size, boolean heal); public void be_setSlimeSize(int size, boolean heal);
void entityRemove(Entity.RemovalReason removalReason);
} }

View file

@ -1,5 +1,8 @@
package ru.betterend.mixin.common; 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.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@ -7,7 +10,11 @@ import net.minecraft.world.entity.monster.Slime;
import ru.betterend.interfaces.ISlime; import ru.betterend.interfaces.ISlime;
@Mixin(Slime.class) @Mixin(Slime.class)
public class SlimeMixin implements ISlime { public abstract class SlimeMixin extends Entity implements ISlime {
public SlimeMixin(EntityType<? extends Slime> entityType, Level level) {
super(entityType, level);
}
@Shadow @Shadow
protected void setSize(int size, boolean heal) {} protected void setSize(int size, boolean heal) {}
@ -15,4 +22,9 @@ public class SlimeMixin implements ISlime {
public void be_setSlimeSize(int size, boolean heal) { public void be_setSlimeSize(int size, boolean heal) {
setSize(size, heal); setSize(size, heal);
} }
@Override
public void entityRemove(Entity.RemovalReason removalReason){
super.remove(removalReason);
}
} }

View file

@ -1,17 +1,15 @@
package ru.betterend.registry; 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.EntityModelLayerRegistry;
import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry;
import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayerLocation;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.MobRenderer; import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import ru.betterend.BetterEnd; import ru.betterend.BetterEnd;
import ru.betterend.entity.model.CubozoaEntityModel; 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.RendererEntityDragonfly;
import ru.betterend.entity.render.RendererEntityEndFish; import ru.betterend.entity.render.RendererEntityEndFish;
import ru.betterend.entity.render.RendererEntityEndSlime; import ru.betterend.entity.render.RendererEntityEndSlime;
@ -19,8 +17,10 @@ import ru.betterend.entity.render.RendererEntityShadowWalker;
import ru.betterend.entity.render.SilkMothEntityRenderer; import ru.betterend.entity.render.SilkMothEntityRenderer;
public class EndEntitiesRenders { 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() { public static void register() {
register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class); register(EndEntities.DRAGONFLY, RendererEntityDragonfly.class);
register(EndEntities.END_SLIME, RendererEntityEndSlime.class); register(EndEntities.END_SLIME, RendererEntityEndSlime.class);
@ -29,7 +29,9 @@ public class EndEntitiesRenders {
register(EndEntities.CUBOZOA, RendererEntityCubozoa.class); register(EndEntities.CUBOZOA, RendererEntityCubozoa.class);
register(EndEntities.SILK_MOTH, SilkMothEntityRenderer.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<? extends MobRenderer<?, ?>> renderer) { private static void register(EntityType<?> type, Class<? extends MobRenderer<?, ?>> renderer) {