From 24039c0df7b433c36147e7abd04c38baa5eed53d Mon Sep 17 00:00:00 2001 From: Maxx <53229958+MBatt1@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:43:07 -0600 Subject: [PATCH] popom model --- .../client/model/ParadiseLostModelLayers.java | 2 +- .../client/model/entity/PopomEntityModel.java | 107 ++++++++++++++++++ .../entity/passive/PopomEntityRenderer.java | 20 +++- .../entities/ParadiseLostEntityTypes.java | 2 +- .../entities/passive/PopomEntity.java | 44 ++++++- .../textures/entity/popom/popom.png | Bin 3637 -> 2358 bytes .../textures/entity/popom/popom_clean.png | Bin 0 -> 2358 bytes .../textures/entity/popom/popom_fur.png | Bin 0 -> 2358 bytes 8 files changed, 163 insertions(+), 12 deletions(-) create mode 100644 src/main/java/net/id/paradiselost/client/model/entity/PopomEntityModel.java create mode 100644 src/main/resources/assets/paradise_lost/textures/entity/popom/popom_clean.png create mode 100644 src/main/resources/assets/paradise_lost/textures/entity/popom/popom_fur.png diff --git a/src/main/java/net/id/paradiselost/client/model/ParadiseLostModelLayers.java b/src/main/java/net/id/paradiselost/client/model/ParadiseLostModelLayers.java index 9984b91f4..cbacc9f9e 100644 --- a/src/main/java/net/id/paradiselost/client/model/ParadiseLostModelLayers.java +++ b/src/main/java/net/id/paradiselost/client/model/ParadiseLostModelLayers.java @@ -28,7 +28,7 @@ public class ParadiseLostModelLayers { public static final EntityModelLayer ENVOY_OUTER_ARMOR = register("envoy", "outer_armor", OUTER_ARMOR_MODEL_DATA); public static final EntityModelLayer MOA = register("moa", "main", MoaModel.getTexturedModelData()); public static final EntityModelLayer PHOENIX_ARMOR = register("phoenix_armor", "main", PhoenixArmorModel.getTexturedModelData()); - public static final EntityModelLayer POPOM = register("popom", "main", EnvoyEntityModel.getTexturedModelData()); + public static final EntityModelLayer POPOM = register("popom", "main", PopomEntityModel.getTexturedModelData()); public static EntityModelLayer register(Identifier id, String layer, TexturedModelData data) { diff --git a/src/main/java/net/id/paradiselost/client/model/entity/PopomEntityModel.java b/src/main/java/net/id/paradiselost/client/model/entity/PopomEntityModel.java new file mode 100644 index 000000000..00df62efb --- /dev/null +++ b/src/main/java/net/id/paradiselost/client/model/entity/PopomEntityModel.java @@ -0,0 +1,107 @@ +package net.id.paradiselost.client.model.entity; + +import com.google.common.collect.ImmutableList; +import net.id.paradiselost.entities.passive.PopomEntity; +import net.minecraft.client.model.ModelData; +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.model.ModelPartBuilder; +import net.minecraft.client.model.ModelPartData; +import net.minecraft.client.model.ModelTransform; +import net.minecraft.client.model.TexturedModelData; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.model.AnimalModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.MathHelper; + +public class PopomEntityModel extends AnimalModel { + + public int furSize = 0; + + private final ModelPart body0; + private final ModelPart body1; + private final ModelPart body2; + private final ModelPart body3; + private final ModelPart head; + private final ModelPart frleg; + private final ModelPart flleg; + private final ModelPart brleg; + private final ModelPart blleg; + + public PopomEntityModel(ModelPart root) { + super(true, 25.0F, 2.0F, 3.0F, 3.0F, 48.0F); + this.body0 = root.getChild("body0"); + this.body1 = root.getChild("body1"); + this.body2 = root.getChild("body2"); + this.body3 = root.getChild("body3"); + this.head = root.getChild("head"); + this.frleg = root.getChild("frleg"); + this.flleg = root.getChild("flleg"); + this.brleg = root.getChild("brleg"); + this.blleg = root.getChild("blleg"); + } + + public static TexturedModelData getTexturedModelData() { + ModelData ModelData = new ModelData(); + ModelPartData root = ModelData.getRoot(); + + ModelPartData body0 = root.addChild("body0", ModelPartBuilder.create().uv(0, 78).cuboid(-5.0F, -9.0F, -8.0F, 10.0F, 6.0F, 15.0F), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData body1 = root.addChild("body1", ModelPartBuilder.create().uv(0, 54).cuboid(-5.5F, -11.0F, -8.0F, 11.0F, 8.0F, 16.0F), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData body2 = root.addChild("body2", ModelPartBuilder.create().uv(0, 28).cuboid(-6.0F, -12.0F, -8.0F, 12.0F, 9.0F, 17.0F), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData body3 = root.addChild("body3", ModelPartBuilder.create().uv(0, 0).cuboid(-7.0F, -13.0F, -8.0F, 14.0F, 10.0F, 18.0F), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); + + ModelPartData head = root.addChild("head", ModelPartBuilder.create().uv(38, 54).cuboid(-4.0F, -2.0F, -4.0F, 8.0F, 4.0F, 4.0F) + .uv(38, 62).cuboid(-3.0F, -5.0F, -5.0F, 6.0F, 3.0F, 3.0F), ModelTransform.pivot(0.0F, 19.0F, -8.0F)); + + ModelPartData frleg = root.addChild("frleg", ModelPartBuilder.create().uv(0, 116).cuboid(-2.99F, 0.0F, -1.0F, 3.0F, 3.0F, 3.0F), ModelTransform.pivot(-2.0F, 21.0F, -5.0F)); + + ModelPartData flleg = root.addChild("flleg", ModelPartBuilder.create().uv(0, 122).cuboid(-0.01F, 0.0F, -1.0F, 3.0F, 3.0F, 3.0F), ModelTransform.pivot(2.0F, 21.0F, -5.0F)); + + ModelPartData brleg = root.addChild("brleg", ModelPartBuilder.create().uv(12, 116).cuboid(-2.99F, 0.0F, -1.0F, 3.0F, 3.0F, 3.0F), ModelTransform.pivot(-2.0F, 21.0F, 4.0F)); + + ModelPartData blleg = root.addChild("blleg", ModelPartBuilder.create().uv(12, 122).cuboid(-0.01F, 0.0F, -1.0F, 3.0F, 3.0F, 3.0F), ModelTransform.pivot(2.0F, 21.0F, 4.0F)); + + return TexturedModelData.of(ModelData, 64, 128); + } + + @Override + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, int color) { + super.render(matrices, vertices, light, overlay, color); + if (this.child) { + matrices.push(); + float f = 0.5F; + matrices.scale(f, f, f); + matrices.translate(0.0F, 1.6F, 0.0F); + this.getFurs()[2].render(matrices, vertices, light, overlay, color); + matrices.pop(); + } else { + this.getFurs()[furSize].render(matrices, vertices, light, overlay, color); + } + } + + @Override + protected Iterable getHeadParts() { + return ImmutableList.of(this.head); + } + + @Override + protected Iterable getBodyParts() { + return ImmutableList.of(this.frleg, this.flleg, this.brleg, this.blleg); + } + + protected ModelPart[] getFurs() { + return new ModelPart[]{this.body0, this.body1, this.body2, this.body3}; + } + + @Override + public void setAngles(PopomEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) { + this.head.pitch = headPitch * (float) (Math.PI / 180.0); + this.head.yaw = headYaw * (float) (Math.PI / 180.0); + this.brleg.pitch = MathHelper.cos(limbAngle * 0.6662F) * 1.4F * limbDistance; + this.blleg.pitch = MathHelper.cos(limbAngle * 0.6662F + (float) Math.PI) * 1.4F * limbDistance; + this.frleg.pitch = MathHelper.cos(limbAngle * 0.6662F + (float) Math.PI) * 1.4F * limbDistance; + this.flleg.pitch = MathHelper.cos(limbAngle * 0.6662F) * 1.4F * limbDistance; + } +} diff --git a/src/main/java/net/id/paradiselost/client/rendering/entity/passive/PopomEntityRenderer.java b/src/main/java/net/id/paradiselost/client/rendering/entity/passive/PopomEntityRenderer.java index d284fbca9..1f40e3716 100644 --- a/src/main/java/net/id/paradiselost/client/rendering/entity/passive/PopomEntityRenderer.java +++ b/src/main/java/net/id/paradiselost/client/rendering/entity/passive/PopomEntityRenderer.java @@ -4,22 +4,30 @@ import net.fabricmc.api.Environment; import net.id.paradiselost.ParadiseLost; import net.id.paradiselost.client.model.ParadiseLostModelLayers; +import net.id.paradiselost.client.model.entity.PopomEntityModel; import net.id.paradiselost.entities.passive.PopomEntity; +import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.PigEntityRenderer; -import net.id.paradiselost.client.rendering.entity.passive.PopomEntityRenderer; -import net.minecraft.entity.passive.PigEntity; +import net.minecraft.client.render.entity.MobEntityRenderer; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; @Environment(EnvType.CLIENT) -public class PopomEntityRenderer extends PigEntityRenderer { +public class PopomEntityRenderer extends MobEntityRenderer> { private static final Identifier TEXTURE = ParadiseLost.locate("textures/entity/popom/popom.png"); public PopomEntityRenderer(EntityRendererFactory.Context renderManager) { - super(renderManager); + super(renderManager, new PopomEntityModel<>(renderManager.getPart(ParadiseLostModelLayers.POPOM)), 0.7F); } - public Identifier getTexture(PigEntity entity) { + public void render(PopomEntity popomEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i) { + matrixStack.push(); + this.model.furSize = popomEntity.getFurSize(); + matrixStack.pop(); + super.render(popomEntity, f, g, matrixStack, vertexConsumerProvider, i); + } + + public Identifier getTexture(PopomEntity entity) { return TEXTURE; } } \ No newline at end of file diff --git a/src/main/java/net/id/paradiselost/entities/ParadiseLostEntityTypes.java b/src/main/java/net/id/paradiselost/entities/ParadiseLostEntityTypes.java index 11401d782..48ba7648f 100644 --- a/src/main/java/net/id/paradiselost/entities/ParadiseLostEntityTypes.java +++ b/src/main/java/net/id/paradiselost/entities/ParadiseLostEntityTypes.java @@ -42,7 +42,7 @@ public class ParadiseLostEntityTypes { public static final EntityType MOA = add("moa", of(MoaEntity::new, CREATURE, changing(0.8F, 1.9F), 5), attributes(MoaEntity::createMoaAttributes), spawnRestrictions(ParadiseLostAnimalEntity::isValidNaturalParadiseLostSpawn)); - public static final EntityType POPOM = add("popom", of(PopomEntity::new, CREATURE, changing(0.6F, 1.0F), 5), + public static final EntityType POPOM = add("popom", of(PopomEntity::new, CREATURE, changing(1.1F, 1.0F), 5), attributes(PopomEntity::createPopomAttributes), spawnRestrictions(PopomEntity::canMobSpawn)); // projectile diff --git a/src/main/java/net/id/paradiselost/entities/passive/PopomEntity.java b/src/main/java/net/id/paradiselost/entities/passive/PopomEntity.java index 8dcaed3b4..adb1353e8 100644 --- a/src/main/java/net/id/paradiselost/entities/passive/PopomEntity.java +++ b/src/main/java/net/id/paradiselost/entities/passive/PopomEntity.java @@ -1,20 +1,37 @@ package net.id.paradiselost.entities.passive; +import net.id.paradiselost.entities.hostile.EnvoyEntity; import net.id.paradiselost.util.ParadiseLostSoundEvents; import net.minecraft.entity.EntityType; import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.entity.passive.PassiveEntity; import net.minecraft.entity.passive.PigEntity; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.tag.ItemTags; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundEvent; import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; -public class PopomEntity extends PigEntity { +public class PopomEntity extends AnimalEntity { + + private static final TrackedData FUR_SIZE; public PopomEntity(EntityType entityType, World world) { super(entityType, world); } + protected void initDataTracker(DataTracker.Builder builder) { + super.initDataTracker(builder); + builder.add(FUR_SIZE, 0); + } + // Custom sounds for Popom @Override protected SoundEvent getAmbientSound() { @@ -33,19 +50,38 @@ protected SoundEvent getDeathSound() { // Define attributes for Popom public static DefaultAttributeContainer.Builder createPopomAttributes() { return createMobAttributes() - .add(EntityAttributes.GENERIC_MAX_HEALTH, 20.0D) + .add(EntityAttributes.GENERIC_MAX_HEALTH, 10.0D) .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.25D); } + @Nullable + @Override + public PassiveEntity createChild(ServerWorld world, PassiveEntity entity) { + return null; + } + @Override public void writeCustomDataToNbt(NbtCompound compound) { super.writeCustomDataToNbt(compound); - // Any custom data you want to save + compound.putInt("furSize", this.dataTracker.get(FUR_SIZE)); } @Override public void readCustomDataFromNbt(NbtCompound compound) { super.readCustomDataFromNbt(compound); - // Any custom data you want to load + this.dataTracker.set(FUR_SIZE, compound.getInt("furSize")); + } + + @Override + public boolean isBreedingItem(ItemStack stack) { + return stack.isIn(ItemTags.FLOWERS); + } + + public int getFurSize() { + return this.dataTracker.get(FUR_SIZE); + } + + static { + FUR_SIZE = DataTracker.registerData(PopomEntity.class, TrackedDataHandlerRegistry.INTEGER); } } \ No newline at end of file diff --git a/src/main/resources/assets/paradise_lost/textures/entity/popom/popom.png b/src/main/resources/assets/paradise_lost/textures/entity/popom/popom.png index 54322cf94e86a61ff17edb4009e69ddb26cd154c..356d6719cfc363d9aead319a31c367c8b26afe3c 100644 GIT binary patch literal 2358 zcmV-63CZ?}P)Px-@JU2LRCt{2T|HjZ+1J!Hr!cxCkjs zQdmvE7*fU9kj7n5S_unMM5uG4M&cf)Cj^3k(xtf+*4&$$o7unHyL(RV1M%M5+r8VJ zot>SXZ*P@ABy1h*l>h+Q^17NQKRIfo{rcN4)%WbmRR91;(+mIriXyL1!()OlNZ;q-h34k=F##7MG&k3Cz9EuhZ{onl&1a z;AyBGu@F@NCTPOJ-j^EB!G}Z)L=!-^ye^J$4VX7SJ@jf=QRJ1-VxZR{Amzoz(6LUz zZ9r`FHUuPO%j;^Rrn9_i{MyRgK76z`z=T^jZ$nY!wcf@?)0x1jH3VL6zb&!CzP&0qb;m&fIK*|^XGovsF5{0b=!C<%c!Jf;wOjR#ai!h;Xg zXt4L^XXX3zv(|!$A^;a&&?jIj#Q|57rOFQc_4hwjdRrlMZUg9bo=5W~a9D6Vu$n9- zR1k=*gS`?Bu`hZLiBTcgrc!N)Twl6e34v->h!6&g31aVtt{tu~T~4SV5HGjimbk!k z!Jt7=-11_}W5V5QH!2}eVY&*TmzZGJxO?qJLIr_%`g*gZp00#JG=Mrkw{G5!wuJtA z<%-@E#G}yEIj}s~g#KxmL<;J5sB|szrXsWNKU-Sqa`nJAT$C6F_9V&!tlC)?+OKwd&)+w^WUZp(`obF|k6vjF5>9qWc&qcxPzzp0p?eh~x*@9F|)81tWx@vx6x_#v88P zAICgW<+fouSWJ*ll`e0DNZuh0u;4xTeN8r{*SE%886n$CQCjb72GWGqLjYHNTBTfr zqgI&{=0Tz;s=*^7MC6UmsZjTF(t;x4N^6oMvzG|g%;{w~q$5O5(x zV(&AwA^JN*+BFj)(v}QqgD3)MLyAx`1fXspaq80IdA92==w%3Kgovc>Tmwu)BF1oO zEdZ}~1qmTys(gNW2v1*cmM#sP&T=F9X+ty{;B$6}v~;D{0QA)xMU0uEm#A&dv`oF~%;26B~kS0)CHJ z2qs1VWa5Kf;}Kq8Mu@KJeBNsDnI0!JvkNaky*K_KQ;-t#hQ1%@T2Ei!Aea}R@pf%_ zE4jBO0)}df#s#EllTWa{$7I3;peZ#MUceS_r!eJnXNPS0w5WU6(wb`Zb!;>g_6M)OR0YjkEt+EmpAredx zB_w9!1*x^?>aH<3eW6zyAbELRoDSuKRsyi8zRUZB0K?4y06l4dbW+riOdh#FG&mu@36SEUDY%V(lx$M#8w(grchWYKNxhB zR!CIVcDjV^Ia&w|XPQs}RI5Rs3ejHGB1CjA0OrxQ+S{OQjl=CQZPpSKypi-EyoTv0 zZE2S{2TyYu3Ve5|6ba__!Fz||5-qF|5d72DcnP+1g6K2&_313HrPI&0{=@_=vlf`- z>I+~#;zj~}hO`BqZ;$7JP`ZIzB4dW0Nk)tqF=E7s5hF&77%^hRh!G<`D%2vW^pK%1 zm%pgeAAI{jjJW#dUqlT4UuK4eDuC6?tF=!XeDf~~5`MN;Y|x{t77-HwfYr5noSvSz zhFD!&uhM<KfEdd=Bj&qc3k_e!8QM)8^m!I7`g&OW1I!XS%5*a@S0Wk&A({) c-_HX70wSpihxsAW&j0`b07*qoM6N<$g2cN|W&i*H literal 3637 zcmV-54$AR~P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T@2}TxgFZJT6pe_gv>=-vIb#q*UvC-vDSkRl2#VGALA51fmrw z-PovU5CRP6xdw`qWIk#{64$^JRb{2HA{f{C*dGB6E^4);PLs`gm9s)Q{C06mCI2d4 zajXOtY@9$?=Dp_{$FU0CxX#DE0dQoo$aDFvOyy)w;(>W9QE;H8PUmpVe|D@Sj8ySY zal|#D5+BPo5X|d*>`wuB?Ai@QXhCzZAhjd*=v0m-Bs^Ei`JmZUumD1+5MTnTz=VR& z9FAP)WB&jkdf;4TI#;9JBim#e!BY;$TOD|xaFJIv1@@Dfg0zzB!W$}vi}<|GN3izw zuX@)6(m;6o^r~8ewwm2O>dwYVV9<&+-rP{Pzhsy5o!TEz>rLxGh5|}pR-qN4995y@ zCm5g^REnzLdY{!*!<#q~IOI_kw3=PIsK(+zhwuK_Wu;>4hmZMkI3|9Tf^k*{JIdxN zsyV?1VJXkbO2ilqDyFp-Wy6ue#O4Bp3A9U4r%5W;Y-s6opZ|}gC@g1FjVC+WI(JUZ zUPE!SukqF;O;=YnzBI7~>i7d+)Zu&XQP7Fm%v?wByi12Ze3usA_kJc$G@nm2UB95= z+69d+tjZfb@C8AM8OjRHE}W}{ar(k3O{NpBIjcOKDa@^eTt12%;Y3UWkQVe>lvM%| z@p}OZ(Hh5mK@$pAGlChb*d8i`mQmbcu@5vMSBJ6^v+>T6V=Ub0bNQf{f~J_v^IOao+ig{Nkl#euGUbn8S=;>!qsu-g~ z1gZda`;9Qmyjn+>fK)-oD0gsAW@jyXaP8uEAJ*3Qf1r&=AKAM_+Whh3+IiwzqK~Pu@>f9t5AQtU=E+3E3=%MX)0K{Ht;w!yv`H(*Gj(6^6uW(vK z@aln>83kAdU*_`T9rfRJ2Yf%P(Wx`~(0kvfTTYx%KvstE-=0;{6GStDHLsM1pa3K! zuBmpfPar|{^lGO#+1bHKhsxxZ3ye~8N^BD}296FCUsC%@jFurO#&Omfh5FNWlHEiZ z{-8Mr>RcCK)~J^?dd#_&V-rA-+F&2JQbUSs(V|i{0EGNucz~=zkM9{B7)Jzj>GbW6FI8!qZD1{TyWe7ln41J~@IMN*S znTVQbnrU*B)soKE1%#F7SsNRm6ITTwpelHq2thR0wwqdlVj@==@U9q$+2h}ONae{F z6s(@tPapb5ee9J+HcmA@x1)`7n4#4z6=XD`dD#5N^C~t+wbtyyootVAgaxL`!7UbS zrph%aCm0?V;!rVOCXN-m@QAAwnPlMr=WQlKK%~}EUlHzAh5lt8Qy+V!LD5iisY&K6Gt6T; zMOmxRjWSKq5_$}R@5f_wu7Lw&vpFjV_F(`b+2xE3m-vOc*#em%LD@ohgMdw&L&SHq z`dxxYP{x#F?hQbTA;Cn{?7YmzGheX&(1X6@h7kK`t8;XA%s>K|5Jy&Dj3+SP?@;*N z5U>lN=DGgRM?Uf&Mdr$}_NA`?u|mUitRBtP_Qpjm;yTx!Kh5Vr)fRIT{6^RM3GxG9 zqE@@E{eF}xVLcw5Q76>Ki)YpAE!I?>t*x`^qiQT+wqR;BK-5u5-)w14FVk8&1dzSP z%-7+b@o-)J!3sd1R+t9rrFn`D;xMNM+3~b4smuqqy7Rn zhxxHlQEwxZx#amV4$V~70#lioyvpHG`Hn-`XET71DkYc}P%}T?k8Az0KE`~+;!P(g zn=^n}sX4$*Wk8>`+N@=ZY;xapim5U?f!A=Y1lNfWQVB9sdk|`-E+U|ajS72hM|rOY zrMsG;E8!w_lsH)HS+Ix#i#j)J8Jn5{A$#RTV34Moho-{il!c^*vsZ=w-C>WQX|PtR z;JE>%$b#(=!nw7u8RZQ>;-E)*Zlm@Wo(&~H+T5PTY={aKQWbi5m$n6jp2D-1Y>M&^ z5;TDQ&=94}6B87BaZ`*4WWp}!d+dFsgAQTCgcapYH#e2x-MuXa(QpL8Q@`g#-yu#R zuru+f*z|lv2WG~G=EnaQ2p}au6Li_F2vcpFhx7-8*wF^qItnX+!)*;Oo~z4bLEnGr zFV8BD@%Wr0*(8W^X2HP`&N-e@?r3cljSy4pafMEpR)m!9S~JL1?Qgg~gd@%6WdebK z#u$($eRo8ui;2pYfAy={34Z0bzfn9R^DNk!syv<6uf81-fA~i~frgR3`@}DHH}z@; zhzbej#3(=sTs(AGe!8O!%j;(ZyIsjz42QAl9bTeJ5G-iZI(P%!rget=5IyTz?ENDJ zo;D@MxKgp`4TRaTm(dpB*o;qxdEaaBV*G~3ANZLC%b;iu=NgaI2OjV_)^>`5cNYf~ z?l$Hm*ZQe*8gzS#5Zvix4%pco^?FVqIs<$AgYIB@BBB$p8FHoZ&Lwqw2MKDR?cokh z*NOtFQxzeMhZZy^paQM=<|VaT2b9D6*zC31XbV(8Y_9SF|Lft7Q;sr_gs4u*L^&Sf zeY_6da9F{S1?qdG&e8$+?sehC(`pz6hNZTi{d=uH#SAgS2Takc$}F>G{>VW!+Jwvi z(Qhg4V};R^Mw@f^jS}Rj<JRc6;#1vJyV4=~SHqhik)AB826b4I-T7 z4nmEovWgO#aIoEGghoJZXVd~o*E|5G_GO-`|C(cp7uftVG@x9?{6yVuU5dRqLC_K5 zJt|6_H8I*6skn&ex1J;j)xjK@r?*#Ub;&j#U~i%APgUMtx*%{=21irZgeE0I=0ol` zFF~hTm_sx{+*{W*8bP#FoM^r1y9}(a?)dK%gQa0Px-@JU2LRCt{2T|HjZ+1J!Hr!cxCkjs zQdmvE7*fU9kj7n5S_unMM5uG4M&cf)Cj^3k(xtf+*4&$$o7unHyL(RV1M%M5+r8VJ zot>SXZ*P@ABy1h*l>h+Q^17NQKRIfo{rcN4)%WbmRR91;(+mIriXyL1!()OlNZ;q-h34k=F##7MG&k3Cz9EuhZ{onl&1a z;AyBGu@F@NCTPOJ-j^EB!G}Z)L=!-^ye^J$4VX7SJ@jf=QRJ1-VxZR{Amzoz(6LUz zZ9r`FHUuPO%j;^Rrn9_i{MyRgK76z`z=T^jZ$nY!wcf@?)0x1jH3VL6zb&!CzP&0qb;m&fIK*|^XGovsF5{0b=!C<%c!Jf;wOjR#ai!h;Xg zXt4L^XXX3zv(|!$A^;a&&?jIj#Q|57rOFQc_4hwjdRrlMZUg9bo=5W~a9D6Vu$n9- zR1k=*gS`?Bu`hZLiBTcgrc!N)Twl6e34v->h!6&g31aVtt{tu~T~4SV5HGjimbk!k z!Jt7=-11_}W5V5QH!2}eVY&*TmzZGJxO?qJLIr_%`g*gZp00#JG=Mrkw{G5!wuJtA z<%-@E#G}yEIj}s~g#KxmL<;J5sB|szrXsWNKU-Sqa`nJAT$C6F_9V&!tlC)?+OKwd&)+w^WUZp(`obF|k6vjF5>9qWc&qcxPzzp0p?eh~x*@9F|)81tWx@vx6x_#v88P zAICgW<+fouSWJ*ll`e0DNZuh0u;4xTeN8r{*SE%886n$CQCjb72GWGqLjYHNTBTfr zqgI&{=0Tz;s=*^7MC6UmsZjTF(t;x4N^6oMvzG|g%;{w~q$5O5(x zV(&AwA^JN*+BFj)(v}QqgD3)MLyAx`1fXspaq80IdA92==w%3Kgovc>Tmwu)BF1oO zEdZ}~1qmTys(gNW2v1*cmM#sP&T=F9X+ty{;B$6}v~;D{0QA)xMU0uEm#A&dv`oF~%;26B~kS0)CHJ z2qs1VWa5Kf;}Kq8Mu@KJeBNsDnI0!JvkNaky*K_KQ;-t#hQ1%@T2Ei!Aea}R@pf%_ zE4jBO0)}df#s#EllTWa{$7I3;peZ#MUceS_r!eJnXNPS0w5WU6(wb`Zb!;>g_6M)OR0YjkEt+EmpAredx zB_w9!1*x^?>aH<3eW6zyAbELRoDSuKRsyi8zRUZB0K?4y06l4dbW+riOdh#FG&mu@36SEUDY%V(lx$M#8w(grchWYKNxhB zR!CIVcDjV^Ia&w|XPQs}RI5Rs3ejHGB1CjA0OrxQ+S{OQjl=CQZPpSKypi-EyoTv0 zZE2S{2TyYu3Ve5|6ba__!Fz||5-qF|5d72DcnP+1g6K2&_313HrPI&0{=@_=vlf`- z>I+~#;zj~}hO`BqZ;$7JP`ZIzB4dW0Nk)tqF=E7s5hF&77%^hRh!G<`D%2vW^pK%1 zm%pgeAAI{jjJW#dUqlT4UuK4eDuC6?tF=!XeDf~~5`MN;Y|x{t77-HwfYr5noSvSz zhFD!&uhM<KfEdd=Bj&qc3k_e!8QM)8^m!I7`g&OW1I!XS%5*a@S0Wk&A({) c-_HX70wSpihxsAW&j0`b07*qoM6N<$g2cN|W&i*H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/paradise_lost/textures/entity/popom/popom_fur.png b/src/main/resources/assets/paradise_lost/textures/entity/popom/popom_fur.png new file mode 100644 index 0000000000000000000000000000000000000000..356d6719cfc363d9aead319a31c367c8b26afe3c GIT binary patch literal 2358 zcmV-63CZ?}P)Px-@JU2LRCt{2T|HjZ+1J!Hr!cxCkjs zQdmvE7*fU9kj7n5S_unMM5uG4M&cf)Cj^3k(xtf+*4&$$o7unHyL(RV1M%M5+r8VJ zot>SXZ*P@ABy1h*l>h+Q^17NQKRIfo{rcN4)%WbmRR91;(+mIriXyL1!()OlNZ;q-h34k=F##7MG&k3Cz9EuhZ{onl&1a z;AyBGu@F@NCTPOJ-j^EB!G}Z)L=!-^ye^J$4VX7SJ@jf=QRJ1-VxZR{Amzoz(6LUz zZ9r`FHUuPO%j;^Rrn9_i{MyRgK76z`z=T^jZ$nY!wcf@?)0x1jH3VL6zb&!CzP&0qb;m&fIK*|^XGovsF5{0b=!C<%c!Jf;wOjR#ai!h;Xg zXt4L^XXX3zv(|!$A^;a&&?jIj#Q|57rOFQc_4hwjdRrlMZUg9bo=5W~a9D6Vu$n9- zR1k=*gS`?Bu`hZLiBTcgrc!N)Twl6e34v->h!6&g31aVtt{tu~T~4SV5HGjimbk!k z!Jt7=-11_}W5V5QH!2}eVY&*TmzZGJxO?qJLIr_%`g*gZp00#JG=Mrkw{G5!wuJtA z<%-@E#G}yEIj}s~g#KxmL<;J5sB|szrXsWNKU-Sqa`nJAT$C6F_9V&!tlC)?+OKwd&)+w^WUZp(`obF|k6vjF5>9qWc&qcxPzzp0p?eh~x*@9F|)81tWx@vx6x_#v88P zAICgW<+fouSWJ*ll`e0DNZuh0u;4xTeN8r{*SE%886n$CQCjb72GWGqLjYHNTBTfr zqgI&{=0Tz;s=*^7MC6UmsZjTF(t;x4N^6oMvzG|g%;{w~q$5O5(x zV(&AwA^JN*+BFj)(v}QqgD3)MLyAx`1fXspaq80IdA92==w%3Kgovc>Tmwu)BF1oO zEdZ}~1qmTys(gNW2v1*cmM#sP&T=F9X+ty{;B$6}v~;D{0QA)xMU0uEm#A&dv`oF~%;26B~kS0)CHJ z2qs1VWa5Kf;}Kq8Mu@KJeBNsDnI0!JvkNaky*K_KQ;-t#hQ1%@T2Ei!Aea}R@pf%_ zE4jBO0)}df#s#EllTWa{$7I3;peZ#MUceS_r!eJnXNPS0w5WU6(wb`Zb!;>g_6M)OR0YjkEt+EmpAredx zB_w9!1*x^?>aH<3eW6zyAbELRoDSuKRsyi8zRUZB0K?4y06l4dbW+riOdh#FG&mu@36SEUDY%V(lx$M#8w(grchWYKNxhB zR!CIVcDjV^Ia&w|XPQs}RI5Rs3ejHGB1CjA0OrxQ+S{OQjl=CQZPpSKypi-EyoTv0 zZE2S{2TyYu3Ve5|6ba__!Fz||5-qF|5d72DcnP+1g6K2&_313HrPI&0{=@_=vlf`- z>I+~#;zj~}hO`BqZ;$7JP`ZIzB4dW0Nk)tqF=E7s5hF&77%^hRh!G<`D%2vW^pK%1 zm%pgeAAI{jjJW#dUqlT4UuK4eDuC6?tF=!XeDf~~5`MN;Y|x{t77-HwfYr5noSvSz zhFD!&uhM<KfEdd=Bj&qc3k_e!8QM)8^m!I7`g&OW1I!XS%5*a@S0Wk&A({) c-_HX70wSpihxsAW&j0`b07*qoM6N<$g2cN|W&i*H literal 0 HcmV?d00001