End slime refactor & lake variant
|
@ -45,7 +45,6 @@ public class EntityCubozoa extends SchoolingFishEntity {
|
|||
|
||||
public EntityCubozoa(EntityType<EntityCubozoa> entityType, World world) {
|
||||
super(entityType, world);
|
||||
//this.moveControl = new CubozoaMoveControl(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -42,9 +42,10 @@ import ru.betterend.interfaces.ISlime;
|
|||
import ru.betterend.registry.EndBiomes;
|
||||
import ru.betterend.util.BlocksHelper;
|
||||
import ru.betterend.util.MHelper;
|
||||
import ru.betterend.world.biome.EndBiome;
|
||||
|
||||
public class EntityEndSlime extends SlimeEntity {
|
||||
private static final TrackedData<Boolean> MOSSY = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BOOLEAN);
|
||||
private static final TrackedData<Byte> VARIANT = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BYTE);
|
||||
private static final Mutable POS = new Mutable();
|
||||
|
||||
public EntityEndSlime(EntityType<EntityEndSlime> entityType, World world) {
|
||||
|
@ -74,9 +75,13 @@ public class EntityEndSlime extends SlimeEntity {
|
|||
@Override
|
||||
public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, CompoundTag entityTag) {
|
||||
EntityData data = super.initialize(world, difficulty, spawnReason, entityData, entityTag);
|
||||
if (EndBiomes.getFromBiome(world.getBiome(getBlockPos())) == EndBiomes.FOGGY_MUSHROOMLAND) {
|
||||
EndBiome biome = EndBiomes.getFromBiome(world.getBiome(getBlockPos()));
|
||||
if (biome == EndBiomes.FOGGY_MUSHROOMLAND) {
|
||||
this.setMossy(true);
|
||||
}
|
||||
else if (biome == EndBiomes.MEGALAKE || biome == EndBiomes.MEGALAKE_GROVE) {
|
||||
this.setLake(true);
|
||||
}
|
||||
this.calculateDimensions();
|
||||
return data;
|
||||
}
|
||||
|
@ -84,7 +89,21 @@ public class EntityEndSlime extends SlimeEntity {
|
|||
@Override
|
||||
protected void initDataTracker() {
|
||||
super.initDataTracker();
|
||||
this.dataTracker.startTracking(MOSSY, false);
|
||||
this.dataTracker.startTracking(VARIANT, (byte) 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeCustomDataToTag(CompoundTag tag) {
|
||||
super.writeCustomDataToTag(tag);
|
||||
tag.putByte("Variant", (byte) getSlimeType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readCustomDataFromTag(CompoundTag tag) {
|
||||
super.readCustomDataFromTag(tag);
|
||||
if (tag.contains("Variant")) {
|
||||
this.dataTracker.set(VARIANT, tag.getByte("Variant"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -140,12 +159,24 @@ public class EntityEndSlime extends SlimeEntity {
|
|||
this.world.spawnEntity(drop);
|
||||
}
|
||||
|
||||
public int getSlimeType() {
|
||||
return this.dataTracker.get(VARIANT).intValue();
|
||||
}
|
||||
|
||||
protected void setMossy(boolean mossy) {
|
||||
this.dataTracker.set(MOSSY, mossy);
|
||||
this.dataTracker.set(VARIANT, (byte) 1);
|
||||
}
|
||||
|
||||
public boolean isMossy() {
|
||||
return this.dataTracker.get(MOSSY);
|
||||
return this.dataTracker.get(VARIANT) == 1;
|
||||
}
|
||||
|
||||
protected void setLake(boolean mossy) {
|
||||
this.dataTracker.set(VARIANT, (byte) 2);
|
||||
}
|
||||
|
||||
public boolean isLake() {
|
||||
return this.dataTracker.get(VARIANT) == 2;
|
||||
}
|
||||
|
||||
public static boolean canSpawn(EntityType<EntityEndSlime> type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) {
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
package ru.betterend.entity.model;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import net.minecraft.client.model.ModelPart;
|
||||
import net.minecraft.client.render.RenderLayer;
|
||||
import net.minecraft.client.render.VertexConsumer;
|
||||
import net.minecraft.client.render.entity.model.CompositeEntityModel;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import ru.betterend.entity.EntityEndSlime;
|
||||
|
||||
public class EndSlimeEntityModel<T extends EntityEndSlime> extends CompositeEntityModel<T> {
|
||||
private final ModelPart flower;
|
||||
private final ModelPart innerCube;
|
||||
private final ModelPart rightEye;
|
||||
private final ModelPart leftEye;
|
||||
private final ModelPart mouth;
|
||||
|
||||
public EndSlimeEntityModel(boolean onlyShell, int type) {
|
||||
super(RenderLayer::getEntityCutout);
|
||||
|
||||
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);
|
||||
|
||||
if (onlyShell) {
|
||||
this.innerCube.setTextureOffset(0, 0);
|
||||
this.innerCube.addCuboid(-4.0F, 16.0F, -4.0F, 8.0F, 8.0F, 8.0F);
|
||||
}
|
||||
else {
|
||||
this.innerCube.addCuboid(-3.0F, 17.0F, -3.0F, 6.0F, 6.0F, 6.0F);
|
||||
this.rightEye.addCuboid(-3.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
|
||||
this.leftEye.addCuboid(1.25F, 18.0F, -3.5F, 2.0F, 2.0F, 2.0F);
|
||||
this.mouth.addCuboid(0.0F, 21.0F, -3.5F, 1.0F, 1.0F, 1.0F);
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
ModelPart petalRot = new ModelPart(this);
|
||||
petalRot.yaw = i * 45F;
|
||||
|
||||
ModelPart petal = new ModelPart(this, 40, 0);
|
||||
petal.setPivot(-4, 8, 0);
|
||||
petal.addCuboid(0.0F, 0.0F, 0.0F, 8.0F, 8.0F, 0.0F, 0.0F);
|
||||
|
||||
this.flower.addChild(petalRot);
|
||||
petalRot.addChild(petal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAngles(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) {}
|
||||
|
||||
public void renderFlower(MatrixStack matrices, VertexConsumer vertices, int light, int overlay) {
|
||||
flower.render(matrices, vertices, light, overlay);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<ModelPart> getParts() {
|
||||
return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth);
|
||||
}
|
||||
}
|
|
@ -1,32 +1,98 @@
|
|||
package ru.betterend.entity.render;
|
||||
|
||||
import net.minecraft.client.render.OverlayTexture;
|
||||
import net.minecraft.client.render.RenderLayer;
|
||||
import net.minecraft.client.render.VertexConsumer;
|
||||
import net.minecraft.client.render.VertexConsumerProvider;
|
||||
import net.minecraft.client.render.entity.EntityRenderDispatcher;
|
||||
import net.minecraft.client.render.entity.SlimeEntityRenderer;
|
||||
import net.minecraft.client.render.entity.LivingEntityRenderer;
|
||||
import net.minecraft.client.render.entity.MobEntityRenderer;
|
||||
import net.minecraft.client.render.entity.feature.EyesFeatureRenderer;
|
||||
import net.minecraft.client.render.entity.model.SlimeEntityModel;
|
||||
import net.minecraft.entity.mob.SlimeEntity;
|
||||
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.Identifier;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import ru.betterend.BetterEnd;
|
||||
import ru.betterend.entity.EntityEndSlime;
|
||||
import ru.betterend.entity.model.EndSlimeEntityModel;
|
||||
|
||||
public class RendererEntityEndSlime extends SlimeEntityRenderer {
|
||||
private static final Identifier TEXTURE = BetterEnd.makeID("textures/entity/end_slime.png");
|
||||
private static final Identifier TEXTURE_MOSSY = BetterEnd.makeID("textures/entity/end_slime_mossy.png");
|
||||
private static final RenderLayer GLOW = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_slime_glow.png"));
|
||||
public class RendererEntityEndSlime extends MobEntityRenderer<EntityEndSlime, EndSlimeEntityModel<EntityEndSlime>> {
|
||||
private static final Identifier TEXTURE[] = new Identifier[3];
|
||||
private static final RenderLayer GLOW[] = new RenderLayer[3];
|
||||
|
||||
public RendererEntityEndSlime(EntityRenderDispatcher entityRenderDispatcher) {
|
||||
super(entityRenderDispatcher);
|
||||
this.addFeature(new EyesFeatureRenderer<SlimeEntity, SlimeEntityModel<SlimeEntity>>(this) {
|
||||
super(entityRenderDispatcher, new EndSlimeEntityModel<EntityEndSlime>(false, 0), 0.25F);
|
||||
this.addFeature(new OverlayFeatureRenderer<EntityEndSlime>(this));
|
||||
this.addFeature(new EyesFeatureRenderer<EntityEndSlime, EndSlimeEntityModel<EntityEndSlime>>(this) {
|
||||
@Override
|
||||
public RenderLayer getEyesTexture() {
|
||||
return GLOW;
|
||||
return GLOW[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, EntityEndSlime entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) {
|
||||
VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GLOW[entity.getSlimeType()]);
|
||||
this.getContextModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F);
|
||||
if (entity.isLake()) {
|
||||
this.getContextModel().renderFlower(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Identifier getTexture(SlimeEntity entity) {
|
||||
return ((EntityEndSlime) entity).isMossy() ? TEXTURE_MOSSY : TEXTURE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Identifier getTexture(EntityEndSlime entity) {
|
||||
return TEXTURE[entity.getSlimeType()];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(EntityEndSlime slimeEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) {
|
||||
this.shadowRadius = 0.25F * (float) slimeEntity.getSize();
|
||||
super.render(slimeEntity, f, g, matrixStack, vertexConsumerProvider, i);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void scale(EntityEndSlime slimeEntity, MatrixStack matrixStack, float f) {
|
||||
matrixStack.scale(0.999F, 0.999F, 0.999F);
|
||||
matrixStack.translate(0.0D, 0.0010000000474974513D, 0.0D);
|
||||
float h = (float) slimeEntity.getSize();
|
||||
float i = MathHelper.lerp(f, slimeEntity.lastStretch, slimeEntity.stretch) / (h * 0.5F + 1.0F);
|
||||
float j = 1.0F / (i + 1.0F);
|
||||
matrixStack.scale(j * h, 1.0F / j * h, j * h);
|
||||
}
|
||||
|
||||
private final class OverlayFeatureRenderer<T extends EntityEndSlime> extends FeatureRenderer<T, EndSlimeEntityModel<T>> {
|
||||
private final EndSlimeEntityModel<T> modelOrdinal = new EndSlimeEntityModel<T>(true, 0);
|
||||
private final EndSlimeEntityModel<T> modelLake = new EndSlimeEntityModel<T>(true, 1);
|
||||
|
||||
public OverlayFeatureRenderer(FeatureRendererContext<T, EndSlimeEntityModel<T>> featureRendererContext) {
|
||||
super(featureRendererContext);
|
||||
}
|
||||
|
||||
public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) {
|
||||
if (!livingEntity.isInvisible()) {
|
||||
if (livingEntity.isLake()) {
|
||||
VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityCutout(this.getTexture(livingEntity)));
|
||||
this.getContextModel().renderFlower(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlay(livingEntity, 0.0F));
|
||||
}
|
||||
|
||||
EndSlimeEntityModel<T> model = livingEntity.getSlimeType() == 1 ? modelLake : modelOrdinal;
|
||||
this.getContextModel().copyStateTo(model);
|
||||
model.animateModel(livingEntity, f, g, h);
|
||||
model.setAngles(livingEntity, f, g, j, k, l);
|
||||
VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityTranslucent(this.getTexture(livingEntity)));
|
||||
model.render(matrixStack, vertexConsumer, i, LivingEntityRenderer.getOverlay(livingEntity, 0.0F), 1.0F, 1.0F, 1.0F, 1.0F);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static {
|
||||
TEXTURE[0] = BetterEnd.makeID("textures/entity/end_slime/end_slime.png");
|
||||
TEXTURE[1] = BetterEnd.makeID("textures/entity/end_slime/end_slime_mossy.png");
|
||||
TEXTURE[2] = BetterEnd.makeID("textures/entity/end_slime/end_slime_lake.png");
|
||||
GLOW[0] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_slime/end_slime_glow.png"));
|
||||
GLOW[1] = GLOW[0];
|
||||
GLOW[2] = RenderLayer.getEyes(BetterEnd.makeID("textures/entity/end_slime/end_slime_lake_glow.png"));
|
||||
}
|
||||
}
|
|
@ -31,6 +31,7 @@ public class BiomeMegalake extends EndBiome {
|
|||
.addMobSpawn(EndEntities.DRAGONFLY, 50, 1, 3)
|
||||
.addMobSpawn(EndEntities.END_FISH, 50, 3, 8)
|
||||
.addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8)
|
||||
.addMobSpawn(EndEntities.END_SLIME, 5, 1, 2)
|
||||
.addMobSpawn(EntityType.ENDERMAN, 10, 1, 2));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@ public class BiomeMegalakeGrove extends EndBiome {
|
|||
.addMobSpawn(EndEntities.DRAGONFLY, 20, 1, 3)
|
||||
.addMobSpawn(EndEntities.END_FISH, 20, 3, 8)
|
||||
.addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8)
|
||||
.addMobSpawn(EndEntities.END_SLIME, 5, 1, 2)
|
||||
.addMobSpawn(EntityType.ENDERMAN, 10, 1, 2));
|
||||
}
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 138 B After Width: | Height: | Size: 138 B |
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |