From c25cb3f7eca3fc72c538b8635cc073493b043fa4 Mon Sep 17 00:00:00 2001 From: itsmeow Date: Tue, 17 Jan 2023 15:48:47 -0600 Subject: [PATCH] Add whale shark and fix basking passiveness --- .../client/ClientLifecycleHandler.java | 3 + .../model/entity/shark/ModelWhaleShark.java | 140 ++++++++++++++++++ .../common/entity/EntityShark.java | 8 +- .../PeacefulNearestAttackableTargetGoal.java | 3 +- .../common/entity/util/IPeacefulAware.java | 7 + .../util/abstracts/EntitySharkBase.java | 3 +- .../betteranimalsplus/init/ModEntities.java | 2 +- .../textures/entity/shark_whale.png | Bin 0 -> 19321 bytes 8 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 common/src/main/java/dev/itsmeow/betteranimalsplus/client/model/entity/shark/ModelWhaleShark.java create mode 100644 common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/util/IPeacefulAware.java create mode 100644 common/src/main/resources/assets/betteranimalsplus/textures/entity/shark_whale.png diff --git a/common/src/main/java/dev/itsmeow/betteranimalsplus/client/ClientLifecycleHandler.java b/common/src/main/java/dev/itsmeow/betteranimalsplus/client/ClientLifecycleHandler.java index f2ab3a4c..7d310674 100644 --- a/common/src/main/java/dev/itsmeow/betteranimalsplus/client/ClientLifecycleHandler.java +++ b/common/src/main/java/dev/itsmeow/betteranimalsplus/client/ClientLifecycleHandler.java @@ -106,6 +106,7 @@ public static void registerEntityRenders() { .mEntry(ModelMakoShark::new, "mako_shark") .mEntry(ModelGreatWhiteShark::new, "great_white_shark") .mEntry(ModelBaskingShark::new, "basking_shark") + .mEntry(ModelWhaleShark::new, "whale_shark") .preRender((e, s, p) -> { switch(e.getVariantNameOrEmpty()) { case "blue": @@ -133,6 +134,7 @@ public static void registerEntityRenders() { break; case "basking": case "mako": + case "whale": default: } })); @@ -261,6 +263,7 @@ public static void layerDefinitions(ImmutableMap.Builder extends ModelBAP { + + public ModelPart body; + public ModelPart tail00; + public ModelPart tail01; + public ModelPart tail02; + public ModelPart tail03; + public ModelPart tail04; + public ModelPart tailFinUpper00; + public ModelPart tailFinUpper01; + public ModelPart tailFinUpper02; + public ModelPart tailFinLower00; + public ModelPart tailFinLower01; + public ModelPart tailFinLower2; + public ModelPart smallTopFin; + public ModelPart lowSmallFin; + public ModelPart dorsalFin00; + public ModelPart dorsalFin1; + public ModelPart dorsalFin2; + public ModelPart cube_r1; + public ModelPart smallLFin; + public ModelPart smallRFin; + public ModelPart neck; + public ModelPart throat; + public ModelPart head; + public ModelPart cube_r2; + public ModelPart topJaw; + public ModelPart cube_r3; + public ModelPart cube_r4; + public ModelPart lowJaw; + public ModelPart lFin1; + public ModelPart lFin2; + public ModelPart lFin3; + public ModelPart cube_r5; + public ModelPart rFin1; + public ModelPart rFin2; + public ModelPart rFin3; + public ModelPart cube_r6; + + public ModelWhaleShark(ModelPart root) { + this.body = root.getChild("body"); + this.tail00 = body.getChild("tail00"); + this.tail01 = tail00.getChild("tail01"); + this.tail02 = tail01.getChild("tail02"); + this.tail03 = tail02.getChild("tail03"); + this.tail04 = tail03.getChild("tail04"); + this.tailFinUpper00 = tail04.getChild("tailFinUpper00"); + this.tailFinUpper01 = tailFinUpper00.getChild("tailFinUpper01"); + this.tailFinUpper02 = tailFinUpper01.getChild("tailFinUpper02"); + this.tailFinLower00 = tailFinUpper00.getChild("tailFinLower00"); + this.tailFinLower01 = tailFinLower00.getChild("tailFinLower01"); + this.tailFinLower2 = tailFinLower01.getChild("tailFinLower2"); + this.smallTopFin = tail02.getChild("smallTopFin"); + this.lowSmallFin = tail02.getChild("lowSmallFin"); + this.dorsalFin00 = tail00.getChild("dorsalFin00"); + this.dorsalFin1 = dorsalFin00.getChild("dorsalFin1"); + this.dorsalFin2 = dorsalFin00.getChild("dorsalFin2"); + this.cube_r1 = dorsalFin2.getChild("cube_r1"); + this.smallLFin = tail00.getChild("smallLFin"); + this.smallRFin = tail00.getChild("smallRFin"); + this.neck = body.getChild("neck"); + this.throat = neck.getChild("throat"); + this.head = neck.getChild("head"); + this.cube_r2 = head.getChild("cube_r2"); + this.topJaw = head.getChild("topJaw"); + this.cube_r3 = topJaw.getChild("cube_r3"); + this.cube_r4 = topJaw.getChild("cube_r4"); + this.lowJaw = head.getChild("lowJaw"); + this.lFin1 = body.getChild("lFin1"); + this.lFin2 = lFin1.getChild("lFin2"); + this.lFin3 = lFin2.getChild("lFin3"); + this.cube_r5 = lFin3.getChild("cube_r5"); + this.rFin1 = body.getChild("rFin1"); + this.rFin2 = rFin1.getChild("rFin2"); + this.rFin3 = rFin2.getChild("rFin3"); + this.cube_r6 = rFin3.getChild("cube_r6"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 0).addBox(-23.0F, -12.0F, -53.0F, 45.0F, 45.0F, 54.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.25F, -18.0F, -22.0F, 0.0175F, 0.0F, 0.0F)); + PartDefinition tail00 = body.addOrReplaceChild("tail00", CubeListBuilder.create().texOffs(0, 111).addBox(-20.0F, -12.0F, -1.0F, 39.0F, 40.0F, 42.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.0349F, 0.0F, 0.0F)); + PartDefinition tail01 = tail00.addOrReplaceChild("tail01", CubeListBuilder.create().texOffs(0, 203).addBox(-17.0F, -12.0F, -1.0F, 33.0F, 32.0F, 27.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 1.0F, 41.0F, -0.0175F, 0.0F, 0.0F)); + PartDefinition tail02 = tail01.addOrReplaceChild("tail02", CubeListBuilder.create().texOffs(0, 275).addBox(-14.0F, -11.0F, 0.0F, 27.0F, 28.0F, 25.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 25.0F)); + PartDefinition tail03 = tail02.addOrReplaceChild("tail03", CubeListBuilder.create().texOffs(0, 339).addBox(-11.0F, -12.0F, -1.0F, 21.0F, 23.0F, 28.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 1.0F, 26.0F)); + PartDefinition tail04 = tail03.addOrReplaceChild("tail04", CubeListBuilder.create().texOffs(0, 398).addBox(-7.0F, -12.0F, -1.0F, 14.0F, 17.0F, 25.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 1.0F, 27.0F)); + PartDefinition tailFinUpper00 = tail04.addOrReplaceChild("tailFinUpper00", CubeListBuilder.create().texOffs(0, 451).addBox(-2.5F, -2.0F, -1.0F, 5.0F, 18.0F, 20.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -11.0F, 14.0F, 0.7854F, 0.0F, 0.0F)); + PartDefinition tailFinUpper01 = tailFinUpper00.addOrReplaceChild("tailFinUpper01", CubeListBuilder.create().texOffs(64, 448).addBox(-2.0F, -2.0F, -1.0F, 4.0F, 14.0F, 20.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 19.0F, -0.1745F, 0.0F, 0.0F)); + PartDefinition tailFinUpper02 = tailFinUpper01.addOrReplaceChild("tailFinUpper02", CubeListBuilder.create().texOffs(131, 445).addBox(-2.0F, 0.0F, -1.0F, 4.0F, 10.0F, 24.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -2.0F, 20.0F, -0.0436F, 0.0F, 0.0F)); + PartDefinition tailFinLower00 = tailFinUpper00.addOrReplaceChild("tailFinLower00", CubeListBuilder.create().texOffs(106, 392).addBox(-2.0F, 2.0F, -7.0F, 4.0F, 22.0F, 16.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 7.0F, -2.0F, -0.3491F, 0.0F, 0.0F)); + PartDefinition tailFinLower01 = tailFinLower00.addOrReplaceChild("tailFinLower01", CubeListBuilder.create().texOffs(164, 401).addBox(-2.0F, 0.0F, 0.0F, 3.0F, 16.0F, 11.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.5F, 24.0F, -7.0F, 0.1309F, 0.0F, 0.0F)); + PartDefinition tailFinLower2 = tailFinLower01.addOrReplaceChild("tailFinLower2", CubeListBuilder.create().texOffs(195, 429).addBox(-1.0F, 0.0F, -1.0F, 2.0F, 11.0F, 8.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 16.0F, 1.0F, 0.1309F, 0.0F, 0.0F)); + PartDefinition smallTopFin = tail02.addOrReplaceChild("smallTopFin", CubeListBuilder.create().texOffs(250, 378).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -10.0F, 1.0F, 0.6981F, 0.0F, 0.0F)); + PartDefinition lowSmallFin = tail02.addOrReplaceChild("lowSmallFin", CubeListBuilder.create().texOffs(292, 273).addBox(-1.0F, -3.0F, -1.0F, 2.0F, 7.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 15.0F, 2.0F, -0.6109F, 0.0F, 0.0F)); + PartDefinition dorsalFin00 = tail00.addOrReplaceChild("dorsalFin00", CubeListBuilder.create().texOffs(136, 287).addBox(-2.5F, 0.0F, -1.0F, 5.0F, 13.0F, 12.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.25F, -12.0F, 0.0F, 0.8727F, 0.0F, 0.0F)); + PartDefinition dorsalFin1 = dorsalFin00.addOrReplaceChild("dorsalFin1", CubeListBuilder.create().texOffs(189, 289).addBox(-1.5F, 0.0F, -1.0F, 3.0F, 11.0F, 15.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 12.0F, -0.0873F, 0.0F, 0.0F)); + PartDefinition dorsalFin2 = dorsalFin00.addOrReplaceChild("dorsalFin2", CubeListBuilder.create().texOffs(239, 287).addBox(-1.0F, 0.2588F, 0.0341F, 2.0F, 11.0F, 11.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 1.0F, 26.0F, -0.48F, 0.0F, 0.0F)); + PartDefinition cube_r1 = dorsalFin2.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(128, 323).addBox(-1.0F, 0.0F, -18.0F, 2.0F, 12.0F, 19.0F, new CubeDeformation(-0.01F)), PartPose.offsetAndRotation(0.0F, 11.0F, 10.0F, -0.1309F, 0.0F, 0.0F)); + PartDefinition smallLFin = tail00.addOrReplaceChild("smallLFin", CubeListBuilder.create().texOffs(209, 334).mirror().addBox(-1.0F, -5.0F, -1.0F, 2.0F, 10.0F, 17.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-18.75F, 23.0F, 29.0F, -0.8027F, -0.1841F, 0.1872F)); + PartDefinition smallRFin = tail00.addOrReplaceChild("smallRFin", CubeListBuilder.create().texOffs(209, 334).addBox(-1.0F, -5.0F, -1.0F, 2.0F, 10.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(18.25F, 23.0F, 29.0F, -0.8027F, 0.1841F, -0.1872F)); + PartDefinition neck = body.addOrReplaceChild("neck", CubeListBuilder.create().texOffs(209, 0).addBox(-21.0F, 0.0F, -50.0F, 41.0F, 27.0F, 51.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -12.0F, -53.0F, 0.2618F, 0.0F, 0.0F)); + PartDefinition throat = neck.addOrReplaceChild("throat", CubeListBuilder.create().texOffs(198, 95).addBox(-20.0F, -17.0F, 2.0F, 39.0F, 17.0F, 42.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 27.0F, -52.0F, -0.3927F, 0.0F, 0.0F)); + PartDefinition head = neck.addOrReplaceChild("head", CubeListBuilder.create().texOffs(175, 173).addBox(-20.0F, -1.0F, -16.0F, 39.0F, 18.0F, 16.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 2.0F, -48.25F, 0.0873F, 0.0F, 0.0F)); + PartDefinition cube_r2 = head.addOrReplaceChild("cube_r2", CubeListBuilder.create().texOffs(298, 170).addBox(-19.5F, -0.5F, -1.25F, 38.0F, 19.0F, 22.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, -15.0F, -0.4363F, 0.0F, 0.0F)); + PartDefinition topJaw = head.addOrReplaceChild("topJaw", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 11.0F, -18.0F, -0.2182F, 0.0F, 0.0F)); + PartDefinition cube_r3 = topJaw.addOrReplaceChild("cube_r3", CubeListBuilder.create().texOffs(250, 231).addBox(-18.0F, -0.25F, 2.0F, 34.0F, 4.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -8.75F, -14.0F, 0.2182F, 0.0F, 0.0F)); + PartDefinition cube_r4 = topJaw.addOrReplaceChild("cube_r4", CubeListBuilder.create().texOffs(134, 225).addBox(-19.0F, -2.0F, -12.0F, 36.0F, 7.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, -5.9743F, -0.3916F, -0.0873F, 0.0F, 0.0F)); + PartDefinition lowJaw = head.addOrReplaceChild("lowJaw", CubeListBuilder.create().texOffs(150, 262).addBox(-18.0F, 0.0F, -10.0F, 34.0F, 7.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 9.0F, -20.0F, -0.5236F, 0.0F, 0.0F)); + PartDefinition lFin1 = body.addOrReplaceChild("lFin1", CubeListBuilder.create().texOffs(378, 267).addBox(-2.1472F, -0.3617F, -14.0F, 4.0F, 15.0F, 32.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(20.0F, 23.0F, -38.75F, 0.0F, 0.0F, -0.6109F)); + PartDefinition lFin2 = lFin1.addOrReplaceChild("lFin2", CubeListBuilder.create().texOffs(384, 337).addBox(-1.5F, 0.0F, 0.0F, 3.0F, 20.0F, 22.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.1472F, 14.6383F, -14.0F, 0.4363F, 0.0F, 0.0F)); + PartDefinition lFin3 = lFin2.addOrReplaceChild("lFin3", CubeListBuilder.create(), PartPose.offset(0.0F, 20.0F, 0.0F)); + PartDefinition cube_r5 = lFin3.addOrReplaceChild("cube_r5", CubeListBuilder.create().texOffs(398, 403).addBox(-1.0F, 0.0F, 0.0F, 2.0F, 21.0F, 14.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.2618F, 0.0F, 0.0F)); + PartDefinition rFin1 = body.addOrReplaceChild("rFin1", CubeListBuilder.create().texOffs(378, 267).mirror().addBox(-1.8528F, -0.3617F, -14.0F, 4.0F, 15.0F, 32.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-20.5F, 23.0F, -38.75F, 0.0F, 0.0F, 0.6109F)); + PartDefinition rFin2 = rFin1.addOrReplaceChild("rFin2", CubeListBuilder.create().texOffs(384, 337).mirror().addBox(-1.5F, 0.0F, 0.0F, 3.0F, 20.0F, 22.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.1472F, 14.6383F, -14.0F, 0.4363F, 0.0F, 0.0F)); + PartDefinition rFin3 = rFin2.addOrReplaceChild("rFin3", CubeListBuilder.create(), PartPose.offset(0.0F, 20.0F, 0.0F)); + PartDefinition cube_r6 = rFin3.addOrReplaceChild("cube_r6", CubeListBuilder.create().texOffs(398, 403).mirror().addBox(-1.0F, 0.0F, 0.0F, 2.0F, 21.0F, 14.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.2618F, 0.0F, 0.0F)); + return LayerDefinition.create(meshdefinition, 512, 512); + } + + @Override + public void renderToBuffer(PoseStack matrixStackIn, VertexConsumer bufferIn, int packedLightIn, int packedOverlayIn, float red, float green, float blue, float alpha) { + this.body.render(matrixStackIn, bufferIn, packedLightIn, packedOverlayIn); + } + + @Override + public void setupAnim(EntityShark entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + ModelBullShark.animate(entity, ageInTicks, body, tail00, tail01, tail02, lowJaw); + } +} \ No newline at end of file diff --git a/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/EntityShark.java b/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/EntityShark.java index 01a6acf8..cad04854 100644 --- a/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/EntityShark.java +++ b/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/EntityShark.java @@ -6,6 +6,7 @@ import dev.itsmeow.betteranimalsplus.common.entity.util.abstracts.EntitySharkBase; import dev.itsmeow.betteranimalsplus.common.entity.util.abstracts.EntityWaterMobPathing; import dev.itsmeow.betteranimalsplus.init.ModEntities; +import dev.itsmeow.betteranimalsplus.common.entity.util.IPeacefulAware; import dev.itsmeow.betteranimalsplus.util.OceanBiomeHelper; import dev.itsmeow.imdlib.entity.EntityTypeContainer; import dev.itsmeow.imdlib.entity.interfaces.IVariantTypes; @@ -33,7 +34,7 @@ import java.util.Optional; import java.util.Set; -public class EntityShark extends EntitySharkBase { +public class EntityShark extends EntitySharkBase implements IPeacefulAware { private float lastAttack = 0; private float lastGrab = 0; @@ -110,7 +111,7 @@ private void updateAttributes(String name) { this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(1.5D); } this.setHealth(this.getMaxHealth()); - this.isPeaceful = "basking".equals(name); + this.isPeaceful = "basking".equals(name) || "whale".equals(name); } public boolean shouldAttackForHealth(float health) { @@ -129,6 +130,7 @@ public boolean shouldAttackForHealth(float health) { case "whitetip": return health <= 16F; case "basking": + case "whale": default: return false; } @@ -215,6 +217,7 @@ public void onSyncedDataUpdated(EntityDataAccessor entityDataAccessor) { public EntityDimensions getDimensions(Pose pose) { String variantName = this.getVariantNameOrEmpty(); switch(variantName) { + case "whale": case "basking": return BASKING_DIMENSIONS.scale(this.getScale()); default: @@ -259,6 +262,7 @@ public String[] getTypesFor(ResourceKey biomeKey, Biome biome, Set targetClass @Override public boolean canUse() { - return this.mob.level.getDifficulty() != Difficulty.PEACEFUL && super.canUse(); + return (this.mob instanceof IPeacefulAware) ? !((IPeacefulAware) this.mob).isPeaceful() : this.mob.level.getDifficulty() != Difficulty.PEACEFUL && super.canUse(); } } diff --git a/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/util/IPeacefulAware.java b/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/util/IPeacefulAware.java new file mode 100644 index 00000000..a7440c40 --- /dev/null +++ b/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/util/IPeacefulAware.java @@ -0,0 +1,7 @@ +package dev.itsmeow.betteranimalsplus.common.entity.util; + +public interface IPeacefulAware { + + boolean isPeaceful(); + +} diff --git a/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/util/abstracts/EntitySharkBase.java b/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/util/abstracts/EntitySharkBase.java index 6749f1a8..e3d7c3f0 100644 --- a/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/util/abstracts/EntitySharkBase.java +++ b/common/src/main/java/dev/itsmeow/betteranimalsplus/common/entity/util/abstracts/EntitySharkBase.java @@ -2,6 +2,7 @@ import dev.itsmeow.betteranimalsplus.common.entity.util.IHaveHunger; import dev.itsmeow.betteranimalsplus.init.ModTriggers; +import dev.itsmeow.betteranimalsplus.common.entity.util.IPeacefulAware; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; @@ -12,7 +13,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; -public abstract class EntitySharkBase extends EntityWaterMobPathingWithSelectiveTypes implements Enemy, IHaveHunger { +public abstract class EntitySharkBase extends EntityWaterMobPathingWithSelectiveTypes implements Enemy, IHaveHunger, IPeacefulAware { private int hunger = 0; diff --git a/common/src/main/java/dev/itsmeow/betteranimalsplus/init/ModEntities.java b/common/src/main/java/dev/itsmeow/betteranimalsplus/init/ModEntities.java index 7672c893..7f3e7264 100644 --- a/common/src/main/java/dev/itsmeow/betteranimalsplus/init/ModEntities.java +++ b/common/src/main/java/dev/itsmeow/betteranimalsplus/init/ModEntities.java @@ -144,7 +144,7 @@ public class ModEntities { .size(2.5F, 1.2F) .despawn() .biomesOverworld(BiomeTypes.OCEAN) - .variants("blue", "bull", "tiger", "whitetip", "greenland", "hammerhead", "goblin", "mako", "great_white", "basking")); + .variants("blue", "bull", "tiger", "whitetip", "greenland", "hammerhead", "goblin", "mako", "great_white", "basking", "whale")); public static final EntityTypeContainer TURKEY = H.add(EntityTurkey.class, EntityTurkey::new, "turkey", () -> Mob.createMobAttributes() .add(Attributes.MAX_HEALTH, 6.5D) .add(Attributes.MOVEMENT_SPEED, 0.25D) diff --git a/common/src/main/resources/assets/betteranimalsplus/textures/entity/shark_whale.png b/common/src/main/resources/assets/betteranimalsplus/textures/entity/shark_whale.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d3711bae7ceea21e873432468ecbd7882b75dc GIT binary patch literal 19321 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Ðr3n+#^sK>q>&ov4?@qJ49 z)HZ89E5hs49H1%rgGP*p5=c>MoIZr07aG04{|HYgGInR%&O9=WpL+|lq<3R@K6WHF zt;W^^Sl9B#o?s{pKiR!vMUw3$&{+iFPL|^Ca;aJH##rDk&=J~kR){*c+;?t8xKDxX7 zKMS^`8{3Xpub_`D_Rit}|H|cQI%sMPBhyriZS9<3)OX$K3EKZB9oqQyJwMZB+W8wg z5UrLCNMvSpDa|4JX4`jNXb23UHP`-spb>!3`h!Ko;mm+PY$VnqauP(_N}-8sG!|_# zNbSU$VsE`|Rh0SNtt3%3G@@hnSyAR1ni5MjlsH#ZN|29|MX`2`8fiDRH76yrm^LM0 zCx@x2(7^X9zJA8lW`B39T45bsq zbIdBVCRuOnTG{GzU_f_9P}83Q@!m||7RSB(zQErbzuuv^N^&UBZ3&%!A$Xw+;Ol&E zR-h1g-@(J>lb$Y~|49yFn1@9t3P{=%DW2Kw(r%u5T0?kVt zDG2W}6aMlvAImGHx@f0m%vrC`5)D@61u5S89>#(kQo`7JFNKB+akw+G&i&Qk$~mp= zs^^kYd@2SD12auDsH>Yv@oJR=lflwGJA4a6&ySiY-NM1D)le(8oxfmoqaFoW4Grz& ztY<-yJ*TYv9O(s`<@gQ*J2?(Z7c!j6YjVYAMD{=BQ4`7uff~@acoA&`r6@A}i@r6n2XRN2xcNpRpH6#afudQuaC@kY0 zQpaN&dh_fv{s@mr#kh=hOksHDTkPhLw|oIBvdCbNCFM%$bmk=2Dz<#tAGg;3er-j< z&JHG6juhP1G2GY~h$agl+<$kEC~4H`L($90T&M($Nw0f1p+=zz!Bcy$jy zD>5@5;>iT0GD-S3w#Ht|F@k8BmWX>M2{9ImU*4z#rWbc*p&VZRjWs0f$tozbCM6(@ zcH<5N{bw(3{SWzs_*C|X_s}cEgsaGX&@9uLJ!8EjtC)WZEo;%$fq!MxKAwb zbtXdd#Y2jd-(hn&s!WIW2=V^yWHVGTtI2ECgY2p|O&w6)d> zXqMKss{oQ>T@k&v557QA^50bYnqOUAK3+bCq4qCAAV&eQR9FRmN2IPs!#f=6(C#6@Wy7E$GJhSdJU6edvjHr71Z5VO_32g2` z&gRpWQ=7N;y$3dO;Av!Bo1!PLH~@-CRqaq5o|M?UecYFoqa!oek6y67&uapzentXL z3NKcmb0if)2x;w~BQLm+4{r#dDMFv)*eIOpfal+E{ePWYX;hO*7OgLdVUfWMm_W0J z2tf&ppn@n%SRw%hS&eLgZW<6_ny3hfK*B1kfZEb6Z9*&JfEv?aWQUJk4K^Yuq(QbouhIDp;=;5LG9LrD?a`z;Vsrh9Vo2>54X!4FNY4%kI4~ zC4+G#c4ZA&xbn>#5(;kZ%oG!yE4v;OL0E_O`_`}o`&dWd>@H|9vij(~+iB0dHyB56g>>P-l=Q4tU_SwkVR(AoN)U7nJ%jCj->! z+OdoL%+g|x+SCl^XIW;tG~zG7H6Rlk<1trnTMjQ&xcHE7(HLPUrs zDdtTCGDuzSoSc5pRr}Avp1tvip$oN7l0vkWzrDadu+ouRm*ev}M%L5ClGwoyC&Y=G z2>h+QNQ9=)(|6QcsoKj`!7b`@t5{R1v8wN=VgCu%dKiJcvpR=f)lprQ?j6u###^pK zktyUeS<1`J_NTG<#l6pB=02x2LQ%sVFeLy!yDKtt3O_hTfN{o$m zptB1N#ZS|IL7tgBxsiKLnWtNH0`#2kf2qwzsVHn8R%k}a*uB1aTNEp|gM$U#4ycOxT<1Th$dRhbZYCSXqSarKM3yKPY zv%r?VZyvIaJlrHr#_y4NK9(6a@?x#idSvCP5Cb5yM9CI`P;)lZJk#c~CMr=mt|cF& z=7SBTPCR^}{9~}`q{te@0<=a&byWQ!DT!>IBf}m>1Z9Cx7!MZ?7=GO;@2^)%R*7qQ zP_&0x1Z1SME6T%*5(~!y{k*d zhNYxC>r)-WO;!}r{YqX2@Ls$L4>VZmyNJ8nH-{9pACfPR?Aw^@kwD_KtZkHf)VZg)OB5{Qw#R+H9K8ScM|{^jAED8+ z)Z5I1Yp{owrK5;YDYTG>cHhO`NJ>c~mGSqYW5yb~Zt>mbu9bYhlC~5|0GoeM9?h!& zwX>EJSWUChagj)pbeWkT3>mwppJEx^jvk_p++h;0S1^Yc{4q)To|d{2Wh!gRzdM%( z+%U21KN=i~dus`SXctxRdCeBT)q`bj-@}#gbTk%f{qwWIVpWm18N##VrCclW_md53 zYl;vNIUFGXE5UrW^xDtPQyEkfM?tUGzvb~^twS`NN^ED}Y=qvvg%~@r_6_pb+rx^=wf_8$lD^_@Zf(C{olnzW4DBX{m zgH+#pnlBVfnmEcoXoUi$E~w5tN?=+^ z2vpusEbwVm>&3(QVVM8YTVI7jy6naNRYLr~jy1NIwl}wD9)GYD%wFZmzP19c6c1;v IV`%z+0Eo9H!T