From 878f4bbe631fa3304ac3c715a35fc42682a883ae Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 13 Jan 2021 03:55:47 +0300 Subject: [PATCH] End slime refactor & lake variant --- .../ru/betterend/entity/EntityCubozoa.java | 1 - .../ru/betterend/entity/EntityEndSlime.java | 41 +++++++- .../entity/model/EndSlimeEntityModel.java | 63 ++++++++++++ .../entity/render/RendererEntityEndSlime.java | 96 +++++++++++++++--- .../betterend/world/biome/BiomeMegalake.java | 1 + .../world/biome/BiomeMegalakeGrove.java | 1 + .../entity/{ => end_slime}/end_slime.png | Bin .../entity/{ => end_slime}/end_slime_glow.png | Bin .../entity/end_slime/end_slime_lake.png | Bin 0 -> 6056 bytes .../entity/end_slime/end_slime_lake_glow.png | Bin 0 -> 2320 bytes .../{ => end_slime}/end_slime_mossy.png | Bin 11 files changed, 182 insertions(+), 21 deletions(-) create mode 100644 src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java rename src/main/resources/assets/betterend/textures/entity/{ => end_slime}/end_slime.png (100%) rename src/main/resources/assets/betterend/textures/entity/{ => end_slime}/end_slime_glow.png (100%) create mode 100644 src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake.png create mode 100644 src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png rename src/main/resources/assets/betterend/textures/entity/{ => end_slime}/end_slime_mossy.png (100%) diff --git a/src/main/java/ru/betterend/entity/EntityCubozoa.java b/src/main/java/ru/betterend/entity/EntityCubozoa.java index e2cf0812..25f79963 100644 --- a/src/main/java/ru/betterend/entity/EntityCubozoa.java +++ b/src/main/java/ru/betterend/entity/EntityCubozoa.java @@ -45,7 +45,6 @@ public class EntityCubozoa extends SchoolingFishEntity { public EntityCubozoa(EntityType entityType, World world) { super(entityType, world); - //this.moveControl = new CubozoaMoveControl(this); } @Override diff --git a/src/main/java/ru/betterend/entity/EntityEndSlime.java b/src/main/java/ru/betterend/entity/EntityEndSlime.java index b651ac72..b1ad4440 100644 --- a/src/main/java/ru/betterend/entity/EntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/EntityEndSlime.java @@ -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 MOSSY = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BOOLEAN); + private static final TrackedData VARIANT = DataTracker.registerData(EntityEndSlime.class, TrackedDataHandlerRegistry.BYTE); private static final Mutable POS = new Mutable(); public EntityEndSlime(EntityType 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 type, ServerWorldAccess world, SpawnReason spawnReason, BlockPos pos, Random random) { diff --git a/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java new file mode 100644 index 00000000..dfea3069 --- /dev/null +++ b/src/main/java/ru/betterend/entity/model/EndSlimeEntityModel.java @@ -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 extends CompositeEntityModel { + 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 getParts() { + return ImmutableList.of(this.innerCube, this.rightEye, this.leftEye, this.mouth); + } +} diff --git a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java index bdf2229a..8cc8f7c3 100644 --- a/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java +++ b/src/main/java/ru/betterend/entity/render/RendererEntityEndSlime.java @@ -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> { + 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>(this) { + super(entityRenderDispatcher, new EndSlimeEntityModel(false, 0), 0.25F); + this.addFeature(new OverlayFeatureRenderer(this)); + this.addFeature(new EyesFeatureRenderer>(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 extends FeatureRenderer> { + private final EndSlimeEntityModel modelOrdinal = new EndSlimeEntityModel(true, 0); + private final EndSlimeEntityModel modelLake = new EndSlimeEntityModel(true, 1); + + public OverlayFeatureRenderer(FeatureRendererContext> 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 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")); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java index 86ed7887..9b740291 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalake.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalake.java @@ -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)); } } diff --git a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java b/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java index 2404e851..b8a0e01b 100644 --- a/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java +++ b/src/main/java/ru/betterend/world/biome/BiomeMegalakeGrove.java @@ -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)); } } diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime.png similarity index 100% rename from src/main/resources/assets/betterend/textures/entity/end_slime.png rename to src/main/resources/assets/betterend/textures/entity/end_slime/end_slime.png diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png similarity index 100% rename from src/main/resources/assets/betterend/textures/entity/end_slime_glow.png rename to src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_glow.png diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake.png new file mode 100644 index 0000000000000000000000000000000000000000..080fd4b6a1f39735412c81cbf51ee641cd55c894 GIT binary patch literal 6056 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png b/src/main/resources/assets/betterend/textures/entity/end_slime/end_slime_lake_glow.png new file mode 100644 index 0000000000000000000000000000000000000000..d44ec4136758dfe14726b792a77f7433df6686d9 GIT binary patch literal 2320 zcmb_e4Qvxt94`~t92uX3O;9;+5=Z2EpKb4MbRVoMo6s?!y7A5R?zJmxd!=`y?KEr} zBP=pd2O7r57)o%A;6gwHj1YnN2@IVBl>i|bfq-O!gQ-LGUDs8(w?dqqiTc4`a z4Qz1ROVkqER9=+5dO?yMKp*n@AzG)Km=*F1Vi`~o2XMK4X0&tP0TgjdX0+H~BW(U$ zQ0mUF2!NRtg?6!`OyndqD-)R*;-LXAPz5C9_4pJ%WJV))dDzyvaTJL_)G{-gqd7!M zY(+?}8~}(xZ^T5Bp%4?NCyfM0F%uAqAWb-7!but1fgDD)PPocs)nHR=n# znbA^J_47C$3o|#z!PyUi8$~8FYu`f#F8Dcfc4q$3+wwRCma`Ad&E)+Fy2@E5eko%$)d)N=~89qysY=9{9c_)vIuSb?NwlnCI{ny`gNKZ%;aQPjAab~a|j|yv8=;Mfta;v z0XJM~g6DRt8Y>A}G!nD}2o8Wb4J3z|1V+MGf&&=E(E=qoM3G<#P0$gI@cC{9Rxcb~ zA~V6_Xv^b9BC_BGQIoqF6}37835|BU?~{*5@*JHXECtZ$LyF()U6Gw?PzZn=7tGzG z=nH=ke??gGaQ3W0k~kwPVyuY(m_cM57)P@dMgx+TSb|_Un(K=`#y+M;iYGbVK=tYI zU$T!TM=TY5E&z8>9Q_aRJd!$liQXH}UF++AjR)8E&R(hEcdIZmcH2G+%Ngl{o43}C zof_~ZcJ2TlOjQ7$D%PQ=n{>Lkkp-3jLsb|{#m6iLi*2tNI_x?J9ikk~A%>Mk;`JQn9 ziS^y2q5>f?_&uazHe30t%2_L@apb@{~(?Al|W4E!LY{>bQ`zhyR`Jb3Bi*;5Ub z&Ne6i<;Mr8)`ZgQM{z4tYd^V&pZ0V`_iS6u-s`{L+_a+Vr}gveFSl)&=6q73mtCI! zY3r$PI=@(18*-oftY_iyrkN=hbcU;NIn;|Dvor<5(us7pNGv*z%k ziKez{efx)V64Ou2+Bg>3@W+DLx|PS;>Mph1?0V_9rK{67mAJx7tDM6Zuva?1E33#T z`$d?9*M!HHZ=Pbf^lsdB|Cv|jPjBt+GTw@3wm-3N-R`Ub^wFnA&e4ai*o!J1U1u{J z(~5U(y*l3d-hxA~Z#1>OzkF0n-Pl7DGQs4%`nq}Hmm5pRO=)V(Zfv`WtgJG2-x`v! zxqW~0p*@LfFe%v6UE|C+JNC_5Q|svCucb_RaowQPv+~v_OddD)SlBjZ+gejrcG{++ zTg|6?D&KPDbT-Msoc+|`)PB0-dm4nSij=a*C&|6H4mJLV8%f)`PG