Render *EndSlime*
This commit is contained in:
parent
d6696feb16
commit
e5bf933758
7 changed files with 124 additions and 37 deletions
|
@ -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
|
||||
|
|
|
@ -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<T extends EndSlimeEntity> extends ListModel<T> {
|
||||
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<T extends EndSlimeEntity> extends ListModel<T>
|
|||
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<T extends EndSlimeEntity> extends ListModel<T>
|
|||
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
|
||||
|
|
|
@ -20,7 +20,7 @@ public class RendererEntityCubozoa extends MobRenderer<CubozoaEntity, CubozoaEnt
|
|||
private static final RenderType[] GLOW = new RenderType[2];
|
||||
|
||||
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) {
|
||||
@Override
|
||||
public RenderType renderType() {
|
|
@ -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<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>> {
|
||||
private static final ResourceLocation TEXTURE[] = new ResourceLocation[4];
|
||||
private static final RenderType GLOW[] = new RenderType[4];
|
||||
|
||||
public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) {
|
||||
super(entityRenderDispatcher, new EndSlimeEntityModel<EndSlimeEntity>(false), 0.25F);
|
||||
this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this));
|
||||
public RendererEntityEndSlime(EntityRendererProvider.Context ctx) {
|
||||
super(ctx, new EndSlimeEntityModel<>(ctx.bakeLayer(EndEntitiesRenders.END_SLIME_MODEL)), 0.25f);
|
||||
this.addLayer(new OverlayFeatureRenderer<EndSlimeEntity>(this, ctx));
|
||||
this.addLayer(new EyesLayer<EndSlimeEntity, EndSlimeEntityModel<EndSlimeEntity>>(this) {
|
||||
@Override
|
||||
public RenderType renderType() {
|
||||
|
@ -69,11 +68,13 @@ public class RendererEntityEndSlime extends MobRenderer<EndSlimeEntity, EndSlime
|
|||
|
||||
private final class OverlayFeatureRenderer<T extends EndSlimeEntity>
|
||||
extends RenderLayer<T, EndSlimeEntityModel<T>> {
|
||||
private final EndSlimeEntityModel<T> modelOrdinal = new EndSlimeEntityModel<T>(true);
|
||||
private final EndSlimeEntityModel<T> modelLake = new EndSlimeEntityModel<T>(true);
|
||||
private final EndSlimeEntityModel<T> modelOrdinal;
|
||||
private final EndSlimeEntityModel<T> modelLake;
|
||||
|
||||
public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> featureRendererContext) {
|
||||
public OverlayFeatureRenderer(RenderLayerParent<T, EndSlimeEntityModel<T>> 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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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<? extends Slime> 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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<? extends MobRenderer<?, ?>> renderer) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue