From 7db531b0aa290802fd326377b282434ec589accc Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Sun, 23 Jun 2024 10:34:13 +0800 Subject: [PATCH] Updated Upstream (Purpur) --- patches/api/0004-Purpur-API-Changes.patch | 2 +- .../0001-Purpur-generated-api-Changes.patch | 2 +- .../server/0010-Purpur-Server-Changes.patch | 798 +++++++++++------- ...11-Fix-Pufferfish-and-Purpur-patches.patch | 4 +- .../server/0037-Petal-Async-Pathfinding.patch | 14 +- ...able-movement-speed-of-more-entities.patch | 46 +- ...me-missing-Pufferfish-configurations.patch | 8 +- ...missing-purpur-configuration-options.patch | 39 +- 8 files changed, 568 insertions(+), 345 deletions(-) diff --git a/patches/api/0004-Purpur-API-Changes.patch b/patches/api/0004-Purpur-API-Changes.patch index 6849efa0..85335458 100644 --- a/patches/api/0004-Purpur-API-Changes.patch +++ b/patches/api/0004-Purpur-API-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur API Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: b5f1c487e796a8e55f4441237d9ca830b4423573 +Commit: 9efd5fcda1d141b9fb50945f68b578e64d6bf78a Patches below are removed in this patch: Pufferfish-API-Changes.patch diff --git a/patches/generated-api/0001-Purpur-generated-api-Changes.patch b/patches/generated-api/0001-Purpur-generated-api-Changes.patch index 9713c3b9..5518f296 100644 --- a/patches/generated-api/0001-Purpur-generated-api-Changes.patch +++ b/patches/generated-api/0001-Purpur-generated-api-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur generated-api Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: b5f1c487e796a8e55f4441237d9ca830b4423573 +Commit: 9efd5fcda1d141b9fb50945f68b578e64d6bf78a diff --git a/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/com/destroystokyo/paper/entity/ai/VanillaGoal.java index 3add91218dd3f07052aa932f0503d1f10ac3799b..3e41a4141095bce989c75e989293deb3f47e8e6d 100644 diff --git a/patches/server/0010-Purpur-Server-Changes.patch b/patches/server/0010-Purpur-Server-Changes.patch index 8c6bc84c..ce3cd520 100644 --- a/patches/server/0010-Purpur-Server-Changes.patch +++ b/patches/server/0010-Purpur-Server-Changes.patch @@ -3,12 +3,12 @@ From: Github Actions Date: Fri, 21 Jun 2024 03:34:00 +0000 Subject: [PATCH] Purpur Server Changes -TODO - Dreeam: Check TODOs in ServerGamePacketListenerImpl & Fix-pufferfish-issues.patch +TODO - Dreeam: Check Fix-pufferfish-issues.patch Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: b5f1c487e796a8e55f4441237d9ca830b4423573 +Commit: 9efd5fcda1d141b9fb50945f68b578e64d6bf78a Patches below are removed in this patch: Brand changes in Rebrand.patch @@ -26,6 +26,7 @@ Add-5-second-tps-average-in-tps.patch Arrows-should-not-reset-despawn-counter.patch Halloween-options-and-optimizations.patch MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch +Option-to-disable-kick-for-out-of-order-chat.patch Remove-Timings.patch Remove-Mojang-Profiler.patch MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch @@ -1625,7 +1626,7 @@ index a720a05c47b2137a07515461960603cc5c939d16..b66fdb789fcb460d63fd81540112d655 try { String channels = payload.toString(com.google.common.base.Charsets.UTF_8); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index deb4282880aa5f28100a202c73514c892f487be0..554bff40f0dab4f49ed201cc6d6508ec0ec70f0a 100644 +index deb4282880aa5f28100a202c73514c892f487be0..e7ab86ea19c3ec5411a08c064cb2aa61ee7e75c3 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -337,6 +337,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @@ -1846,15 +1847,6 @@ index deb4282880aa5f28100a202c73514c892f487be0..554bff40f0dab4f49ed201cc6d6508ec private boolean isPlayerCollidingWithAnythingNew(LevelReader world, AABB box, double newX, double newY, double newZ) { AABB axisalignedbb1 = this.player.getBoundingBox().move(newX - this.player.getX(), newY - this.player.getY(), newZ - this.player.getZ()); Iterable iterable = world.getCollisions(this.player, axisalignedbb1.deflate(9.999999747378752E-6D)); -@@ -1603,7 +1681,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl - - do { - if (!iterator.hasNext()) { -- return false; -+ return !org.purpurmc.purpur.PurpurConfig.kickForOutOfOrderChat; // Purpur - } - - voxelshape1 = (VoxelShape) iterator.next(); @@ -1945,6 +2023,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl boolean cancelled; @@ -3667,7 +3659,7 @@ index 4addcfe248dd4705be7e67551b258ce86c57e194..82d3e442f6d31211701878fc5ae7a346 if (baseEntity == null) { if (this.isCombat && (!targetEntity.canBeSeenAsEnemy() || targetEntity.level().getDifficulty() == Difficulty.PEACEFUL)) { diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index f223e369dd8d781e32e1f06572b2ae717afd6f32..d88bf61a864c8d2f579a43e831cfa0e1740a5317 100644 +index f223e369dd8d781e32e1f06572b2ae717afd6f32..8938cd09b27bc204001e51c17cefe4dd0e86f25a 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -44,12 +44,59 @@ public class Bat extends AmbientCreature { @@ -3754,13 +3746,14 @@ index f223e369dd8d781e32e1f06572b2ae717afd6f32..d88bf61a864c8d2f579a43e831cfa0e1 super.customServerAiStep(); BlockPos blockposition = this.blockPosition(); BlockPos blockposition1 = blockposition.above(); -@@ -210,6 +265,28 @@ public class Bat extends AmbientCreature { +@@ -210,6 +265,29 @@ public class Bat extends AmbientCreature { } } + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.batMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.batScale); + this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level().purpurConfig.batFollowRange); + this.getAttribute(Attributes.KNOCKBACK_RESISTANCE).setBaseValue(this.level().purpurConfig.batKnockbackResistance); + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.batMovementSpeed); @@ -3897,7 +3890,7 @@ index e96fca314bebea5fcdb684d3478af1b6dc5f13cf..27250278968233b3de05c365ae304a41 entityanimal.resetLove(); worldserver.broadcastEntityEvent(this, (byte) 18); diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 1b3978f4ea7e8491e0c0cb6de23c141f44fab414..0422c4184c4823b8572afd398ef96fc6054e8485 100644 +index 1b3978f4ea7e8491e0c0cb6de23c141f44fab414..9a6ec5e465684be7f0d54b1f7e66bdf52603e442 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -144,6 +144,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -4012,13 +4005,14 @@ index 1b3978f4ea7e8491e0c0cb6de23c141f44fab414..0422c4184c4823b8572afd398ef96fc6 if (flag) { ++this.timeSinceSting; if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, 1, 1200)) == 0) { -@@ -428,6 +479,26 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -428,6 +479,27 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.beeMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.beeScale); + } + + @Override @@ -4039,7 +4033,7 @@ index 1b3978f4ea7e8491e0c0cb6de23c141f44fab414..0422c4184c4823b8572afd398ef96fc6 @Override public int getRemainingPersistentAngerTime() { return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME); -@@ -737,6 +808,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -737,6 +809,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { if (optional.isPresent()) { Bee.this.savedFlowerPos = (BlockPos) optional.get(); Bee.this.navigation.moveTo((double) Bee.this.savedFlowerPos.getX() + 0.5D, (double) Bee.this.savedFlowerPos.getY() + 0.5D, (double) Bee.this.savedFlowerPos.getZ() + 0.5D, 1.2000000476837158D); @@ -4047,7 +4041,7 @@ index 1b3978f4ea7e8491e0c0cb6de23c141f44fab414..0422c4184c4823b8572afd398ef96fc6 return true; } else { Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60); -@@ -793,6 +865,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -793,6 +866,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.pollinating = false; Bee.this.navigation.stop(); Bee.this.remainingCooldownBeforeLocatingNewFlower = 200; @@ -4055,7 +4049,7 @@ index 1b3978f4ea7e8491e0c0cb6de23c141f44fab414..0422c4184c4823b8572afd398ef96fc6 } @Override -@@ -839,6 +912,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -839,6 +913,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.setWantedPos(); } @@ -4063,7 +4057,7 @@ index 1b3978f4ea7e8491e0c0cb6de23c141f44fab414..0422c4184c4823b8572afd398ef96fc6 ++this.successfulPollinatingTicks; if (Bee.this.random.nextFloat() < 0.05F && this.successfulPollinatingTicks > this.lastSoundPlayedTick + 60) { this.lastSoundPlayedTick = this.successfulPollinatingTicks; -@@ -883,16 +957,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -883,16 +958,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } @@ -4084,10 +4078,10 @@ index 1b3978f4ea7e8491e0c0cb6de23c141f44fab414..0422c4184c4823b8572afd398ef96fc6 } diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 23d4dcc82115fd1a0a77565a0472304042d5f12d..80c67e2eb79f47fec6cd9456f691ea03fec361dd 100644 +index 23d4dcc82115fd1a0a77565a0472304042d5f12d..765cc746e0469f24de0e84666dc5a41b3d55f472 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -103,6 +103,53 @@ public class Cat extends TamableAnimal implements VariantHolder(this, Rabbit.class, false, (Predicate) null)); this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); } -@@ -308,6 +357,14 @@ public class Cat extends TamableAnimal implements VariantHolder { return itemstack.is(ItemTags.CHICKEN_FOOD); -@@ -66,6 +107,14 @@ public class Chicken extends Animal { +@@ -66,6 +108,14 @@ public class Chicken extends Animal { this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); @@ -4261,7 +4257,7 @@ index 8e347718f72297398b5e6d34a893264bc10efe18..f0e2fd8a91d0e87679686861a956ee2c } @Override -@@ -74,7 +123,7 @@ public class Chicken extends Animal { +@@ -74,7 +124,7 @@ public class Chicken extends Animal { } public static AttributeSupplier.Builder createAttributes() { @@ -4309,7 +4305,7 @@ index 824e5e4fe7619ae46061c3c978c9a044db8c84ab..f0b6118a9995bb41836685bbf94d2e7f public ItemStack getBucketItemStack() { return new ItemStack(Items.COD_BUCKET); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index e336934f37075a827843e4b1bb2b6b660d2c60c9..1dc83dd82d371321f43c1d6135e3330f7b5e4bc0 100644 +index e336934f37075a827843e4b1bb2b6b660d2c60c9..1145bf24abf35d5357c6f204e92f15a2b8d91ced 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java @@ -37,6 +37,7 @@ import org.bukkit.event.player.PlayerBucketFillEvent; @@ -4320,7 +4316,7 @@ index e336934f37075a827843e4b1bb2b6b660d2c60c9..1dc83dd82d371321f43c1d6135e3330f private static final EntityDimensions BABY_DIMENSIONS = EntityType.COW.getDimensions().scale(0.5F).withEyeHeight(0.665F); -@@ -44,18 +45,65 @@ public class Cow extends Animal { +@@ -44,18 +45,66 @@ public class Cow extends Animal { super(type, world); } @@ -4344,6 +4340,7 @@ index e336934f37075a827843e4b1bb2b6b660d2c60c9..1dc83dd82d371321f43c1d6135e3330f + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.cowMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.cowScale); + this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(this.level().purpurConfig.cowNaturallyAggressiveToPlayersDamage); // Purpur + } + @@ -4387,7 +4384,7 @@ index e336934f37075a827843e4b1bb2b6b660d2c60c9..1dc83dd82d371321f43c1d6135e3330f } @Override -@@ -64,7 +112,7 @@ public class Cow extends Animal { +@@ -64,7 +113,7 @@ public class Cow extends Animal { } public static AttributeSupplier.Builder createAttributes() { @@ -4396,7 +4393,7 @@ index e336934f37075a827843e4b1bb2b6b660d2c60c9..1dc83dd82d371321f43c1d6135e3330f } @Override -@@ -94,6 +142,7 @@ public class Cow extends Animal { +@@ -94,6 +143,7 @@ public class Cow extends Animal { @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -4404,7 +4401,7 @@ index e336934f37075a827843e4b1bb2b6b660d2c60c9..1dc83dd82d371321f43c1d6135e3330f ItemStack itemstack = player.getItemInHand(hand); if (itemstack.is(Items.BUCKET) && !this.isBaby()) { -@@ -102,7 +151,7 @@ public class Cow extends Animal { +@@ -102,7 +152,7 @@ public class Cow extends Animal { if (event.isCancelled()) { player.containerMenu.sendAllDataToRemote(); // Paper - Fix inventory desync @@ -4413,7 +4410,7 @@ index e336934f37075a827843e4b1bb2b6b660d2c60c9..1dc83dd82d371321f43c1d6135e3330f } // CraftBukkit end -@@ -111,6 +160,10 @@ public class Cow extends Animal { +@@ -111,6 +161,10 @@ public class Cow extends Animal { player.setItemInHand(hand, itemstack1); return InteractionResult.sidedSuccess(this.level().isClientSide); @@ -4424,7 +4421,7 @@ index e336934f37075a827843e4b1bb2b6b660d2c60c9..1dc83dd82d371321f43c1d6135e3330f } else { return super.mobInteract(player, hand); } -@@ -126,4 +179,66 @@ public class Cow extends Animal { +@@ -126,4 +180,66 @@ public class Cow extends Animal { public EntityDimensions getDefaultDimensions(Pose pose) { return this.isBaby() ? Cow.BABY_DIMENSIONS : super.getDefaultDimensions(pose); } @@ -4492,10 +4489,10 @@ index e336934f37075a827843e4b1bb2b6b660d2c60c9..1dc83dd82d371321f43c1d6135e3330f + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -index da45cc62985f8b67cdfeffc21cb33837db673555..da1b75e9cb453fa246b68e82ee105158c15d7777 100644 +index da45cc62985f8b67cdfeffc21cb33837db673555..ef0124ceb7cafd58c01c7f0b4b542f38a383ab88 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -81,19 +81,104 @@ public class Dolphin extends WaterAnimal { +@@ -81,19 +81,105 @@ public class Dolphin extends WaterAnimal { public static final Predicate ALLOWED_ITEMS = (entityitem) -> { return !entityitem.hasPickUpDelay() && entityitem.isAlive() && entityitem.isInWater(); }; @@ -4580,6 +4577,7 @@ index da45cc62985f8b67cdfeffc21cb33837db673555..da1b75e9cb453fa246b68e82ee105158 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.dolphinMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.dolphinScale); + } + + @Override @@ -4601,7 +4599,7 @@ index da45cc62985f8b67cdfeffc21cb33837db673555..da1b75e9cb453fa246b68e82ee105158 return super.finalizeSpawn(world, difficulty, spawnReason, entityData); } -@@ -158,17 +243,21 @@ public class Dolphin extends WaterAnimal { +@@ -158,17 +244,21 @@ public class Dolphin extends WaterAnimal { protected void registerGoals() { this.goalSelector.addGoal(0, new BreathAirGoal(this)); this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); @@ -4624,7 +4622,7 @@ index da45cc62985f8b67cdfeffc21cb33837db673555..da1b75e9cb453fa246b68e82ee105158 } public static AttributeSupplier.Builder createAttributes() { -@@ -207,7 +296,7 @@ public class Dolphin extends WaterAnimal { +@@ -207,7 +297,7 @@ public class Dolphin extends WaterAnimal { @Override protected boolean canRide(Entity entity) { @@ -4633,7 +4631,7 @@ index da45cc62985f8b67cdfeffc21cb33837db673555..da1b75e9cb453fa246b68e82ee105158 } @Override -@@ -242,6 +331,11 @@ public class Dolphin extends WaterAnimal { +@@ -242,6 +332,11 @@ public class Dolphin extends WaterAnimal { @Override public void tick() { super.tick(); @@ -4645,7 +4643,7 @@ index da45cc62985f8b67cdfeffc21cb33837db673555..da1b75e9cb453fa246b68e82ee105158 if (this.isNoAi()) { this.setAirSupply(this.getMaxAirSupply()); } else { -@@ -384,6 +478,7 @@ public class Dolphin extends WaterAnimal { +@@ -384,6 +479,7 @@ public class Dolphin extends WaterAnimal { @Override public boolean canUse() { @@ -4654,10 +4652,10 @@ index da45cc62985f8b67cdfeffc21cb33837db673555..da1b75e9cb453fa246b68e82ee105158 } diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31de7a6747b 100644 +index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..5d13c8827c0746d180b5a838b3f2be2cbd2cba14 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -145,6 +145,64 @@ public class Fox extends Animal implements VariantHolder { +@@ -145,6 +145,65 @@ public class Fox extends Animal implements VariantHolder { this.setCanPickUpLoot(true); } @@ -4702,6 +4700,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.foxMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.foxScale); + } + + @Override @@ -4722,7 +4721,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -@@ -164,6 +222,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -164,6 +223,7 @@ public class Fox extends Animal implements VariantHolder { return entityliving instanceof AbstractSchoolingFish; }); this.goalSelector.addGoal(0, new Fox.FoxFloatGoal()); @@ -4730,7 +4729,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d this.goalSelector.addGoal(0, new ClimbOnTopOfPowderSnowGoal(this, this.level())); this.goalSelector.addGoal(1, new Fox.FaceplantGoal()); this.goalSelector.addGoal(2, new Fox.FoxPanicGoal(2.2D)); -@@ -190,6 +249,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -190,6 +250,7 @@ public class Fox extends Animal implements VariantHolder { this.goalSelector.addGoal(11, new Fox.FoxSearchForItemsGoal()); this.goalSelector.addGoal(12, new Fox.FoxLookAtPlayerGoal(this, Player.class, 24.0F)); this.goalSelector.addGoal(13, new Fox.PerchAndSearchGoal()); @@ -4738,7 +4737,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d this.targetSelector.addGoal(3, new Fox.DefendTrustedTargetGoal(LivingEntity.class, false, false, (entityliving) -> { return Fox.TRUSTED_TARGET_SELECTOR.test(entityliving) && !this.trusts(entityliving.getUUID()); })); -@@ -344,6 +404,11 @@ public class Fox extends Animal implements VariantHolder { +@@ -344,6 +405,11 @@ public class Fox extends Animal implements VariantHolder { } private void setTargetGoals() { @@ -4750,7 +4749,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d if (this.getVariant() == Fox.Type.RED) { this.targetSelector.addGoal(4, this.landTargetGoal); this.targetSelector.addGoal(4, this.turtleEggTargetGoal); -@@ -377,6 +442,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -377,6 +443,7 @@ public class Fox extends Animal implements VariantHolder { public void setVariant(Fox.Type variant) { this.entityData.set(Fox.DATA_TYPE_ID, variant.getId()); @@ -4758,7 +4757,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d } List getTrustedUUIDs() { -@@ -717,6 +783,29 @@ public class Fox extends Animal implements VariantHolder { +@@ -717,6 +784,29 @@ public class Fox extends Animal implements VariantHolder { } // Paper end @@ -4788,7 +4787,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d @Override // Paper start - Cancellable death event protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(ServerLevel world, DamageSource damageSource) { -@@ -769,16 +858,16 @@ public class Fox extends Animal implements VariantHolder { +@@ -769,16 +859,16 @@ public class Fox extends Animal implements VariantHolder { return new Vec3(0.0D, (double) (0.55F * this.getEyeHeight()), (double) (this.getBbWidth() * 0.4F)); } @@ -4808,7 +4807,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d } } -@@ -789,16 +878,16 @@ public class Fox extends Animal implements VariantHolder { +@@ -789,16 +879,16 @@ public class Fox extends Animal implements VariantHolder { } } @@ -4828,7 +4827,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d } } -@@ -916,8 +1005,10 @@ public class Fox extends Animal implements VariantHolder { +@@ -916,8 +1006,10 @@ public class Fox extends Animal implements VariantHolder { CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer2, this.animal, this.partner, entityfox); } @@ -4841,7 +4840,7 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d this.animal.resetLove(); this.partner.resetLove(); worldserver.addFreshEntityWithPassengers(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason -@@ -1303,7 +1394,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -1303,7 +1395,7 @@ public class Fox extends Animal implements VariantHolder { } protected void onReachedTarget() { @@ -4851,10 +4850,10 @@ index 9a0adf65d4d54852301a91b6fe444e4c5a139f5d..30be013ceeb9263809a606f2a94fc31d if (iblockdata.is(Blocks.SWEET_BERRY_BUSH)) { diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index 1807da10d07d1f6e4ddbc0fa1b8da34a688d67c3..ec6d5dd532968b02a7f12c832eb896600b3ff2aa 100644 +index 1807da10d07d1f6e4ddbc0fa1b8da34a688d67c3..7bec03979bb5a4c576549baba822ffb908d7a2be 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -57,13 +57,58 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -57,13 +57,59 @@ public class IronGolem extends AbstractGolem implements NeutralMob { private int remainingPersistentAngerTime; @Nullable private UUID persistentAngerTarget; @@ -4883,6 +4882,7 @@ index 1807da10d07d1f6e4ddbc0fa1b8da34a688d67c3..ec6d5dd532968b02a7f12c832eb89660 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ironGolemMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ironGolemScale); + } + // Purpur end + @@ -4913,7 +4913,7 @@ index 1807da10d07d1f6e4ddbc0fa1b8da34a688d67c3..ec6d5dd532968b02a7f12c832eb89660 this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0D, true)); this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9D, 32.0F)); this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6D, false)); -@@ -71,6 +116,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -71,6 +117,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { this.goalSelector.addGoal(5, new OfferFlowerGoal(this)); this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); @@ -4921,7 +4921,7 @@ index 1807da10d07d1f6e4ddbc0fa1b8da34a688d67c3..ec6d5dd532968b02a7f12c832eb89660 this.targetSelector.addGoal(1, new DefendVillageTargetGoal(this)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -135,6 +181,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -135,6 +182,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); nbt.putBoolean("PlayerCreated", this.isPlayerCreated()); @@ -4929,7 +4929,7 @@ index 1807da10d07d1f6e4ddbc0fa1b8da34a688d67c3..ec6d5dd532968b02a7f12c832eb89660 this.addPersistentAngerSaveData(nbt); } -@@ -142,6 +189,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -142,6 +190,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { public void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); this.setPlayerCreated(nbt.getBoolean("PlayerCreated")); @@ -4937,7 +4937,7 @@ index 1807da10d07d1f6e4ddbc0fa1b8da34a688d67c3..ec6d5dd532968b02a7f12c832eb89660 this.readPersistentAngerSaveData(this.level(), nbt); } -@@ -273,18 +321,19 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -273,18 +322,19 @@ public class IronGolem extends AbstractGolem implements NeutralMob { ItemStack itemstack = player.getItemInHand(hand); if (!itemstack.is(Items.IRON_INGOT)) { @@ -5048,10 +5048,10 @@ index 5707c6287a691030841fa973e8f7f34a816103e4..4829e7178c3e8a4c8bbc2c70f2d5fb5e } return dropEntities; diff --git a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -index 97f4cc522706ec5914672aa4fdfbc35edc94aeb6..6e866ec44a83ec9064ac3228bd96eb251f3b28b0 100644 +index 97f4cc522706ec5914672aa4fdfbc35edc94aeb6..82ba970f265142e2fe7c8c5152f5004af984dc03 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -@@ -66,6 +66,43 @@ public class Ocelot extends Animal { +@@ -66,6 +66,44 @@ public class Ocelot extends Animal { this.reassessTrustingGoals(); } @@ -5075,6 +5075,7 @@ index 97f4cc522706ec5914672aa4fdfbc35edc94aeb6..6e866ec44a83ec9064ac3228bd96eb25 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ocelotMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ocelotScale); + } + + @Override @@ -5095,7 +5096,7 @@ index 97f4cc522706ec5914672aa4fdfbc35edc94aeb6..6e866ec44a83ec9064ac3228bd96eb25 public boolean isTrusting() { return (Boolean) this.entityData.get(Ocelot.DATA_TRUSTING); } -@@ -99,12 +136,14 @@ public class Ocelot extends Animal { +@@ -99,12 +137,14 @@ public class Ocelot extends Animal { return itemstack.is(ItemTags.OCELOT_FOOD); }, true); this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -5110,7 +5111,7 @@ index 97f4cc522706ec5914672aa4fdfbc35edc94aeb6..6e866ec44a83ec9064ac3228bd96eb25 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Chicken.class, false)); this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, false, false, Turtle.BABY_ON_LAND_SELECTOR)); } -@@ -245,7 +284,7 @@ public class Ocelot extends Animal { +@@ -245,7 +285,7 @@ public class Ocelot extends Animal { if (world.isUnobstructed(this) && !world.containsAnyLiquid(this.getBoundingBox())) { BlockPos blockposition = this.blockPosition(); @@ -5120,10 +5121,10 @@ index 97f4cc522706ec5914672aa4fdfbc35edc94aeb6..6e866ec44a83ec9064ac3228bd96eb25 } diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java -index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a66551d493 100644 +index e108f876d3f129c6287f13d68427aed2a6f0c5b1..1a0ffbe2f835cbe37ef670d01daf08fb2f48b4fa 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -121,6 +121,53 @@ public class Panda extends Animal { +@@ -121,6 +121,54 @@ public class Panda extends Animal { } @@ -5156,6 +5157,7 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pandaMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.pandaScale); + setAttributes(); + } + @@ -5177,7 +5179,7 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 @Override public boolean canTakeItem(ItemStack stack) { EquipmentSlot enumitemslot = this.getEquipmentSlotForItem(stack); -@@ -282,6 +329,7 @@ public class Panda extends Animal { +@@ -282,6 +330,7 @@ public class Panda extends Animal { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -5185,7 +5187,7 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 this.goalSelector.addGoal(2, new Panda.PandaPanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new Panda.PandaBreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new Panda.PandaAttackGoal(this, 1.2000000476837158D, true)); -@@ -299,6 +347,7 @@ public class Panda extends Animal { +@@ -299,6 +348,7 @@ public class Panda extends Animal { this.goalSelector.addGoal(12, new Panda.PandaRollGoal(this)); this.goalSelector.addGoal(13, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(14, new WaterAvoidingRandomStrollGoal(this, 1.0D)); @@ -5193,7 +5195,7 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 this.targetSelector.addGoal(1, (new Panda.PandaHurtByTargetGoal(this, new Class[0])).setAlertOthers(new Class[0])); } -@@ -637,7 +686,10 @@ public class Panda extends Animal { +@@ -637,7 +687,10 @@ public class Panda extends Animal { public void setAttributes() { if (this.isWeak()) { @@ -5205,7 +5207,7 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 } if (this.isLazy()) { -@@ -660,7 +712,7 @@ public class Panda extends Animal { +@@ -660,7 +713,7 @@ public class Panda extends Animal { ItemStack itemstack = player.getItemInHand(hand); if (this.isScared()) { @@ -5214,7 +5216,7 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 } else if (this.isOnBack()) { this.setOnBack(false); return InteractionResult.sidedSuccess(this.level().isClientSide); -@@ -678,7 +730,7 @@ public class Panda extends Animal { +@@ -678,7 +731,7 @@ public class Panda extends Animal { this.setInLove(player, breedCopy); // Paper - Fix EntityBreedEvent copying } else { if (this.level().isClientSide || this.isSitting() || this.isInWater()) { @@ -5223,7 +5225,7 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 } this.tryToSit(); -@@ -697,7 +749,7 @@ public class Panda extends Animal { +@@ -697,7 +750,7 @@ public class Panda extends Animal { return InteractionResult.SUCCESS; } else { @@ -5232,7 +5234,7 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 } } -@@ -742,7 +794,7 @@ public class Panda extends Animal { +@@ -742,7 +795,7 @@ public class Panda extends Animal { return this.isBaby() ? Panda.BABY_DIMENSIONS : super.getDefaultDimensions(pose); } @@ -5241,7 +5243,7 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 private final Panda panda; -@@ -752,9 +804,9 @@ public class Panda extends Animal { +@@ -752,9 +805,9 @@ public class Panda extends Animal { } @Override @@ -5254,10 +5256,10 @@ index e108f876d3f129c6287f13d68427aed2a6f0c5b1..a27f33b7bbf7f7d5cfb3dbb0bf5b93a6 } } diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index 97931bfd360725945ab9606ff698b518ae101076..eac0c3f8ee77099af65e823fc687e4236b3d2746 100644 +index 97931bfd360725945ab9606ff698b518ae101076..82310253297d3046936ff4a29583c7c25177ebee 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -124,12 +124,88 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, Level world) { super(type, world); @@ -5327,6 +5329,7 @@ index 97931bfd360725945ab9606ff698b518ae101076..eac0c3f8ee77099af65e823fc687e423 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.parrotMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.parrotScale); + } + + @Override @@ -5347,7 +5350,7 @@ index 97931bfd360725945ab9606ff698b518ae101076..eac0c3f8ee77099af65e823fc687e423 @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData) { -@@ -148,8 +224,11 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { -@@ -292,13 +372,13 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder { -@@ -155,6 +193,17 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { +@@ -155,6 +194,17 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { public InteractionResult mobInteract(Player player, InteractionHand hand) { boolean flag = this.isFood(player.getItemInHand(hand)); @@ -5473,10 +5477,10 @@ index 03d29d5114237f5700c188510a12f26507844c3d..c45148c3123ced978fe03b12499cd6eb if (!this.level().isClientSide) { player.startRiding(this); diff --git a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -index b69a2144769e598f0d70b0d5dfeb8af01ad740ca..c6d5391e81c53818dec51e767483a9c1f04f3e03 100644 +index b69a2144769e598f0d70b0d5dfeb8af01ad740ca..4cf1fa73f082600dc1484bf6fe0b1361f65399db 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -@@ -59,11 +59,81 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -59,11 +59,82 @@ public class PolarBear extends Animal implements NeutralMob { private int remainingPersistentAngerTime; @Nullable private UUID persistentAngerTarget; @@ -5517,6 +5521,7 @@ index b69a2144769e598f0d70b0d5dfeb8af01ad740ca..c6d5391e81c53818dec51e767483a9c1 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.polarBearMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.polarBearScale); + } + + public boolean canMate(Animal other) { @@ -5558,7 +5563,7 @@ index b69a2144769e598f0d70b0d5dfeb8af01ad740ca..c6d5391e81c53818dec51e767483a9c1 @Nullable @Override public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { -@@ -72,20 +142,28 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -72,20 +143,28 @@ public class PolarBear extends Animal implements NeutralMob { @Override public boolean isFood(ItemStack stack) { @@ -5588,7 +5593,7 @@ index b69a2144769e598f0d70b0d5dfeb8af01ad740ca..c6d5391e81c53818dec51e767483a9c1 this.targetSelector.addGoal(1, new PolarBear.PolarBearHurtByTargetGoal()); this.targetSelector.addGoal(2, new PolarBear.PolarBearAttackPlayersGoal()); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -202,6 +280,12 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -202,6 +281,12 @@ public class PolarBear extends Animal implements NeutralMob { if (!this.level().isClientSide) { this.updatePersistentAnger((ServerLevel)this.level(), true); } @@ -5601,7 +5606,7 @@ index b69a2144769e598f0d70b0d5dfeb8af01ad740ca..c6d5391e81c53818dec51e767483a9c1 } @Override -@@ -221,6 +305,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -221,6 +306,7 @@ public class PolarBear extends Animal implements NeutralMob { public void setStanding(boolean warning) { this.entityData.set(DATA_STANDING_ID, warning); @@ -5648,7 +5653,7 @@ index 3f0fad476fe573c3ba946a9436d1b3f7c5260ee2..c758f759ccae81b7651bfcba254f5433 protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index 0109c8ed8bf6a053674456fa4473934e028ca418..8741651193bb1aabc3c09024189eb1e5c1e5eda9 100644 +index 0109c8ed8bf6a053674456fa4473934e028ca418..459c0c95a27ddeb72e8714d3c2fcae1870051b3c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java @@ -89,6 +89,7 @@ public class Rabbit extends Animal implements VariantHolder { @@ -5659,7 +5664,7 @@ index 0109c8ed8bf6a053674456fa4473934e028ca418..8741651193bb1aabc3c09024189eb1e5 public Rabbit(EntityType type, Level world) { super(type, world); -@@ -96,9 +97,75 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -96,9 +97,76 @@ public class Rabbit extends Animal implements VariantHolder { this.moveControl = new Rabbit.RabbitMoveControl(this); } @@ -5710,6 +5715,7 @@ index 0109c8ed8bf6a053674456fa4473934e028ca418..8741651193bb1aabc3c09024189eb1e5 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.rabbitMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.rabbitScale); + } + + @Override @@ -5735,7 +5741,7 @@ index 0109c8ed8bf6a053674456fa4473934e028ca418..8741651193bb1aabc3c09024189eb1e5 this.goalSelector.addGoal(1, new ClimbOnTopOfPowderSnowGoal(this, this.level())); this.goalSelector.addGoal(1, new Rabbit.RabbitPanicGoal(this, 2.2D)); this.goalSelector.addGoal(2, new BreedGoal(this, 0.8D)); -@@ -115,6 +182,14 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -115,6 +183,14 @@ public class Rabbit extends Animal implements VariantHolder { @Override protected float getJumpPower() { @@ -5750,7 +5756,7 @@ index 0109c8ed8bf6a053674456fa4473934e028ca418..8741651193bb1aabc3c09024189eb1e5 float f = 0.3F; if (this.horizontalCollision || this.moveControl.hasWanted() && this.moveControl.getWantedY() > this.getY() + 0.5D) { -@@ -189,6 +264,13 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -189,6 +265,13 @@ public class Rabbit extends Animal implements VariantHolder { @Override public void customServerAiStep() { @@ -5764,7 +5770,7 @@ index 0109c8ed8bf6a053674456fa4473934e028ca418..8741651193bb1aabc3c09024189eb1e5 if (this.jumpDelayTicks > 0) { --this.jumpDelayTicks; } -@@ -403,10 +485,23 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -403,10 +486,23 @@ public class Rabbit extends Animal implements VariantHolder { } this.setVariant(entityrabbit_variant); @@ -5788,7 +5794,7 @@ index 0109c8ed8bf6a053674456fa4473934e028ca418..8741651193bb1aabc3c09024189eb1e5 Holder holder = world.getBiome(pos); int i = world.getRandom().nextInt(100); -@@ -470,7 +565,7 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -470,7 +566,7 @@ public class Rabbit extends Animal implements VariantHolder { } } @@ -5797,7 +5803,7 @@ index 0109c8ed8bf6a053674456fa4473934e028ca418..8741651193bb1aabc3c09024189eb1e5 private final Rabbit rabbit; private double nextJumpSpeed; -@@ -481,14 +576,14 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -481,14 +577,14 @@ public class Rabbit extends Animal implements VariantHolder { } @Override @@ -5814,7 +5820,7 @@ index 0109c8ed8bf6a053674456fa4473934e028ca418..8741651193bb1aabc3c09024189eb1e5 } @Override -@@ -550,7 +645,7 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -550,7 +646,7 @@ public class Rabbit extends Animal implements VariantHolder { @Override public boolean canUse() { if (this.nextStartTick <= 0) { @@ -5862,10 +5868,10 @@ index 0af79daa357f53a8871e293b57e16c099e5d3f64..382e47f26ee94506cb76463a677351b9 public int getMaxSchoolSize() { return 5; diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index eccb524111cec32ed55722817529e6ab992d381d..2b851c572a3a7e4f74aab094f9cba6703547732f 100644 +index eccb524111cec32ed55722817529e6ab992d381d..e55e5ffc58fb0aa62568d1c7664716c5f865b6a8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -115,10 +115,48 @@ public class Sheep extends Animal implements Shearable { +@@ -115,10 +115,49 @@ public class Sheep extends Animal implements Shearable { super(type, world); } @@ -5889,6 +5895,7 @@ index eccb524111cec32ed55722817529e6ab992d381d..2b851c572a3a7e4f74aab094f9cba670 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.sheepMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.sheepScale); + } + + @Override @@ -5914,7 +5921,7 @@ index eccb524111cec32ed55722817529e6ab992d381d..2b851c572a3a7e4f74aab094f9cba670 this.goalSelector.addGoal(1, new PanicGoal(this, 1.25D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.1D, (itemstack) -> { -@@ -257,7 +295,7 @@ public class Sheep extends Animal implements Shearable { +@@ -257,7 +296,7 @@ public class Sheep extends Animal implements Shearable { if (!this.level().isClientSide && this.readyForShearing()) { // CraftBukkit start // Paper start - custom shear drops @@ -5923,7 +5930,7 @@ index eccb524111cec32ed55722817529e6ab992d381d..2b851c572a3a7e4f74aab094f9cba670 org.bukkit.event.player.PlayerShearEntityEvent event = CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand, drops); if (event != null) { if (event.isCancelled()) { -@@ -282,12 +320,13 @@ public class Sheep extends Animal implements Shearable { +@@ -282,12 +321,13 @@ public class Sheep extends Animal implements Shearable { @Override public void shear(SoundSource shearedSoundCategory) { // Paper start - custom shear drops @@ -5940,10 +5947,10 @@ index eccb524111cec32ed55722817529e6ab992d381d..2b851c572a3a7e4f74aab094f9cba670 for (int j = 0; j < count; ++j) { dropEntities.add(new ItemStack(Sheep.ITEM_BY_DYE.get(this.getColor()))); diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index 5c2ed3c39c8eb850f3be1e2ea5b5a7ea266e16d1..0a301d09b59130d741ea9549ac9d967c8f78366d 100644 +index 5c2ed3c39c8eb850f3be1e2ea5b5a7ea266e16d1..7bd2d2b9bb1275fa8e4bdc6d498a59e47838930f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -47,17 +47,56 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -47,17 +47,57 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM private static final EntityDataAccessor DATA_PUMPKIN_ID = SynchedEntityData.defineId(SnowGolem.class, EntityDataSerializers.BYTE); private static final byte PUMPKIN_FLAG = 16; @@ -5973,6 +5980,7 @@ index 5c2ed3c39c8eb850f3be1e2ea5b5a7ea266e16d1..0a301d09b59130d741ea9549ac9d967c + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.snowGolemMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.snowGolemScale); + } + + @Nullable @@ -6001,7 +6009,7 @@ index 5c2ed3c39c8eb850f3be1e2ea5b5a7ea266e16d1..0a301d09b59130d741ea9549ac9d967c this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Mob.class, 10, true, false, (entityliving) -> { return entityliving instanceof Enemy; })); -@@ -77,6 +116,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -77,6 +117,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); nbt.putBoolean("Pumpkin", this.hasPumpkin()); @@ -6009,7 +6017,7 @@ index 5c2ed3c39c8eb850f3be1e2ea5b5a7ea266e16d1..0a301d09b59130d741ea9549ac9d967c } @Override -@@ -85,12 +125,13 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -85,12 +126,13 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM if (nbt.contains("Pumpkin")) { this.setPumpkin(nbt.getBoolean("Pumpkin")); } @@ -6024,7 +6032,7 @@ index 5c2ed3c39c8eb850f3be1e2ea5b5a7ea266e16d1..0a301d09b59130d741ea9549ac9d967c } @Override -@@ -101,10 +142,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -101,10 +143,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM this.hurt(this.damageSources().melting(), 1.0F); // CraftBukkit - DamageSources.ON_FIRE -> CraftEventFactory.MELTING } @@ -6037,7 +6045,7 @@ index 5c2ed3c39c8eb850f3be1e2ea5b5a7ea266e16d1..0a301d09b59130d741ea9549ac9d967c BlockState iblockdata = Blocks.SNOW.defaultBlockState(); for (int i = 0; i < 4; ++i) { -@@ -147,11 +189,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -147,11 +190,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM if (itemstack.is(Items.SHEARS) && this.readyForShearing()) { // CraftBukkit start // Paper start - custom shear drops @@ -6051,7 +6059,7 @@ index 5c2ed3c39c8eb850f3be1e2ea5b5a7ea266e16d1..0a301d09b59130d741ea9549ac9d967c } drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); } -@@ -164,19 +206,36 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -164,19 +207,36 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM } return InteractionResult.sidedSuccess(this.level().isClientSide); @@ -6092,10 +6100,10 @@ index 5c2ed3c39c8eb850f3be1e2ea5b5a7ea266e16d1..0a301d09b59130d741ea9549ac9d967c } diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index 42f4e544fe7fbc342f15eacb5e38d40849e3c419..e6244d8c7745570099638d96fafa6b4971c4beb8 100644 +index 42f4e544fe7fbc342f15eacb5e38d40849e3c419..3ca9a7f289d8c3f0b0df8f1cd4a5ca1254653c50 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -41,13 +41,66 @@ public class Squid extends WaterAnimal { +@@ -41,13 +41,67 @@ public class Squid extends WaterAnimal { public Squid(EntityType type, Level world) { super(type, world); @@ -6129,6 +6137,7 @@ index 42f4e544fe7fbc342f15eacb5e38d40849e3c419..e6244d8c7745570099638d96fafa6b49 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.squidMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.squidScale); + } + + @Override @@ -6163,7 +6172,7 @@ index 42f4e544fe7fbc342f15eacb5e38d40849e3c419..e6244d8c7745570099638d96fafa6b49 this.goalSelector.addGoal(1, new Squid.SquidFleeGoal()); } -@@ -116,6 +169,7 @@ public class Squid extends WaterAnimal { +@@ -116,6 +170,7 @@ public class Squid extends WaterAnimal { } if (this.isInWaterOrBubble()) { @@ -6171,7 +6180,7 @@ index 42f4e544fe7fbc342f15eacb5e38d40849e3c419..e6244d8c7745570099638d96fafa6b49 if (this.tentacleMovement < (float) Math.PI) { float f = this.tentacleMovement / (float) Math.PI; this.tentacleAngle = Mth.sin(f * f * (float) Math.PI) * (float) Math.PI * 0.25F; -@@ -289,10 +343,41 @@ public class Squid extends WaterAnimal { +@@ -289,10 +344,41 @@ public class Squid extends WaterAnimal { @Override public void tick() { @@ -6253,10 +6262,10 @@ index 3d03ffe2e12eca82dfa2f414471d12bb362d4552..2d04addd17d2c358fff598012b323cd7 return "entity.minecraft.tropical_fish.predefined." + variant; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index 4bfa947531c4a67989e18032754dabf4c69e989c..edd1114604c089a8b3a85e530e0254d4695dc9c4 100644 +index 4bfa947531c4a67989e18032754dabf4c69e989c..55d83c57d76e73d73dca1400f4c0c18661d49a94 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -87,6 +87,43 @@ public class Turtle extends Animal { +@@ -87,6 +87,44 @@ public class Turtle extends Animal { this.moveControl = new Turtle.TurtleMoveControl(this); } @@ -6280,6 +6289,7 @@ index 4bfa947531c4a67989e18032754dabf4c69e989c..edd1114604c089a8b3a85e530e0254d4 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.turtleMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.turtleScale); + } + + @Override @@ -6300,7 +6310,7 @@ index 4bfa947531c4a67989e18032754dabf4c69e989c..edd1114604c089a8b3a85e530e0254d4 public void setHomePos(BlockPos pos) { this.entityData.set(Turtle.HOME_POS, pos); } -@@ -189,6 +226,7 @@ public class Turtle extends Animal { +@@ -189,6 +227,7 @@ public class Turtle extends Animal { @Override protected void registerGoals() { @@ -6308,7 +6318,7 @@ index 4bfa947531c4a67989e18032754dabf4c69e989c..edd1114604c089a8b3a85e530e0254d4 this.goalSelector.addGoal(0, new Turtle.TurtlePanicGoal(this, 1.2D)); this.goalSelector.addGoal(1, new Turtle.TurtleBreedGoal(this, 1.0D)); this.goalSelector.addGoal(1, new Turtle.TurtleLayEggGoal(this, 1.0D)); -@@ -342,13 +380,15 @@ public class Turtle extends Animal { +@@ -342,13 +381,15 @@ public class Turtle extends Animal { return this.isBaby() ? Turtle.BABY_DIMENSIONS : super.getDefaultDimensions(pose); } @@ -6325,7 +6335,7 @@ index 4bfa947531c4a67989e18032754dabf4c69e989c..edd1114604c089a8b3a85e530e0254d4 } private void updateSpeed() { -@@ -368,7 +408,7 @@ public class Turtle extends Animal { +@@ -368,7 +409,7 @@ public class Turtle extends Animal { } @Override @@ -6334,7 +6344,7 @@ index 4bfa947531c4a67989e18032754dabf4c69e989c..edd1114604c089a8b3a85e530e0254d4 this.updateSpeed(); if (this.operation == MoveControl.Operation.MOVE_TO && !this.turtle.getNavigation().isDone()) { double d0 = this.wantedX - this.turtle.getX(); -@@ -384,7 +424,7 @@ public class Turtle extends Animal { +@@ -384,7 +425,7 @@ public class Turtle extends Animal { this.turtle.setYRot(this.rotlerp(this.turtle.getYRot(), f, 90.0F)); this.turtle.yBodyRot = this.turtle.getYRot(); @@ -6344,7 +6354,7 @@ index 4bfa947531c4a67989e18032754dabf4c69e989c..edd1114604c089a8b3a85e530e0254d4 this.turtle.setSpeed(Mth.lerp(0.125F, this.turtle.getSpeed(), f1)); this.turtle.setDeltaMovement(this.turtle.getDeltaMovement().add(0.0D, (double) this.turtle.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index c382a8f95f612db881b9cdbd07316d1ca1cd9c4b..865640831c988192adc937cb0cad4c7e241b1540 100644 +index c382a8f95f612db881b9cdbd07316d1ca1cd9c4b..a2df7cf565157db2f8e0f0d33778c8d8dea1cd95 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -106,6 +106,37 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); this.targetSelector.addGoal(7, new NearestAttackableTargetGoal<>(this, AbstractSkeleton.class, false)); this.targetSelector.addGoal(8, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -193,6 +299,7 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder { nbt.putString("variant", resourcekey.location().toString()); }); -@@ -210,6 +317,10 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder brainProvider() { return Brain.provider(Allay.MEMORY_TYPES, Allay.SENSOR_TYPES); -@@ -220,7 +255,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -220,7 +261,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep() { @@ -6627,10 +6644,10 @@ index d908b7723d1810a91a7bc8783bb72c64231ac8c3..b80531c3ecb11adc54001373fcde511c AllayAi.updateActivity(this); super.customServerAiStep(); diff --git a/src/main/java/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/src/main/java/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index a70077521a13d0fbdc987b39a89345442c8e8cc3..7c7b063b0b563716757294792653a705fe7436f9 100644 +index a70077521a13d0fbdc987b39a89345442c8e8cc3..642a4ec954f74d37348c59b5f79d6be310ce1d3c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/src/main/java/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -78,6 +78,33 @@ public class Armadillo extends Animal { +@@ -78,6 +78,34 @@ public class Armadillo extends Animal { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 12.0D).add(Attributes.MOVEMENT_SPEED, 0.14D); } @@ -6653,6 +6670,7 @@ index a70077521a13d0fbdc987b39a89345442c8e8cc3..7c7b063b0b563716757294792653a705 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.armadilloMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.armadilloScale); + } + + @Override @@ -6665,10 +6683,10 @@ index a70077521a13d0fbdc987b39a89345442c8e8cc3..7c7b063b0b563716757294792653a705 protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index c75dccb977e0d620e3834ca0197e8fd51bf3bfd4..2b98303d3be00469d9cd84d11cbb824ac0ba9c86 100644 +index c75dccb977e0d620e3834ca0197e8fd51bf3bfd4..15d4ff5ed6ceb7c9ad312f8c01be6f282a15acc5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -97,6 +97,43 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { return this.modelRotationValues; -@@ -272,7 +309,7 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder(this, LivingEntity.class, 0, false, false, WitherBoss.LIVING_ENTITY_SELECTOR)); } -@@ -136,6 +276,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -136,6 +277,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); nbt.putInt("Invul", this.getInvulnerableTicks()); @@ -8109,7 +8138,7 @@ index d3b4d492aee380dc17f4232d90eaae4f07bb9f86..49c48268431b06ea0e9dd680f7ed782f } @Override -@@ -145,6 +286,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -145,6 +287,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob if (this.hasCustomName()) { this.bossEvent.setName(this.getDisplayName()); } @@ -8117,7 +8146,7 @@ index d3b4d492aee380dc17f4232d90eaae4f07bb9f86..49c48268431b06ea0e9dd680f7ed782f } -@@ -263,6 +405,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -263,6 +406,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @Override protected void customServerAiStep() { @@ -8134,7 +8163,7 @@ index d3b4d492aee380dc17f4232d90eaae4f07bb9f86..49c48268431b06ea0e9dd680f7ed782f int i; if (this.getInvulnerableTicks() > 0) { -@@ -279,7 +431,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -279,7 +432,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } // CraftBukkit end @@ -8143,7 +8172,7 @@ index d3b4d492aee380dc17f4232d90eaae4f07bb9f86..49c48268431b06ea0e9dd680f7ed782f // CraftBukkit start - Use relative location for far away sounds // this.level().globalLevelEvent(1023, new BlockPosition(this), 0); int viewDistance = ((ServerLevel) this.level()).getCraftServer().getViewDistance() * 16; -@@ -304,7 +456,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -304,7 +457,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob this.setInvulnerableTicks(i); if (this.tickCount % 10 == 0) { @@ -8152,7 +8181,7 @@ index d3b4d492aee380dc17f4232d90eaae4f07bb9f86..49c48268431b06ea0e9dd680f7ed782f } } else { -@@ -364,7 +516,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -364,7 +517,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob if (this.destroyBlocksTick > 0) { --this.destroyBlocksTick; @@ -8161,7 +8190,7 @@ index d3b4d492aee380dc17f4232d90eaae4f07bb9f86..49c48268431b06ea0e9dd680f7ed782f boolean flag = false; j = Mth.floor(this.getBbWidth() / 2.0F + 1.0F); -@@ -391,8 +543,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -391,8 +544,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } } @@ -8174,7 +8203,7 @@ index d3b4d492aee380dc17f4232d90eaae4f07bb9f86..49c48268431b06ea0e9dd680f7ed782f } this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth()); -@@ -580,11 +734,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -580,11 +735,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } public int getAlternativeTarget(int headIndex) { @@ -8188,7 +8217,7 @@ index d3b4d492aee380dc17f4232d90eaae4f07bb9f86..49c48268431b06ea0e9dd680f7ed782f } @Override -@@ -594,6 +748,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -594,6 +749,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @Override protected boolean canRide(Entity entity) { @@ -8468,10 +8497,10 @@ index 3b5cf6ffb74d11bea5eb21bd66d679734ff5000c..e64a2a551a2190cf2edff3630f662f4a // Paper end - shouldBurnInDay API diff --git a/src/main/java/net/minecraft/world/entity/monster/Blaze.java b/src/main/java/net/minecraft/world/entity/monster/Blaze.java -index 61004bb35b0edcc4578b8a9c1b280096466ba279..1e1824eb80696452951cdbbdacad952ae0a7482b 100644 +index 61004bb35b0edcc4578b8a9c1b280096466ba279..6c68c1df84e006f9992435f4c8e328c17e88c51c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Blaze.java +++ b/src/main/java/net/minecraft/world/entity/monster/Blaze.java -@@ -32,26 +32,73 @@ public class Blaze extends Monster { +@@ -32,26 +32,74 @@ public class Blaze extends Monster { public Blaze(EntityType type, Level world) { super(type, world); @@ -8521,6 +8550,7 @@ index 61004bb35b0edcc4578b8a9c1b280096466ba279..1e1824eb80696452951cdbbdacad952a + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.blazeMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.blazeScale); + } + + @Override @@ -8547,7 +8577,7 @@ index 61004bb35b0edcc4578b8a9c1b280096466ba279..1e1824eb80696452951cdbbdacad952a } @Override -@@ -111,11 +158,18 @@ public class Blaze extends Monster { +@@ -111,11 +159,18 @@ public class Blaze extends Monster { @Override public boolean isSensitiveToWater() { @@ -8568,10 +8598,10 @@ index 61004bb35b0edcc4578b8a9c1b280096466ba279..1e1824eb80696452951cdbbdacad952a if (this.nextHeightOffsetChangeTick <= 0) { this.nextHeightOffsetChangeTick = 100; diff --git a/src/main/java/net/minecraft/world/entity/monster/Bogged.java b/src/main/java/net/minecraft/world/entity/monster/Bogged.java -index 6e290d67b00c88ecd2cf2ce5f612f52ebda9e280..a39ea8cf75adbf84388b74222b3417a4c45acef5 100644 +index 6e290d67b00c88ecd2cf2ce5f612f52ebda9e280..907d88f40f8c6c1d0612be4d31b63220fecb0ea1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Bogged.java +++ b/src/main/java/net/minecraft/world/entity/monster/Bogged.java -@@ -45,6 +45,28 @@ public class Bogged extends AbstractSkeleton implements Shearable { +@@ -45,6 +45,29 @@ public class Bogged extends AbstractSkeleton implements Shearable { super(type, world); } @@ -8594,13 +8624,14 @@ index 6e290d67b00c88ecd2cf2ce5f612f52ebda9e280..a39ea8cf75adbf84388b74222b3417a4 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.boggedMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.boggedScale); + } + // Purpur end + @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -@@ -159,7 +181,7 @@ public class Bogged extends AbstractSkeleton implements Shearable { +@@ -159,7 +182,7 @@ public class Bogged extends AbstractSkeleton implements Shearable { // Paper start - shear drops API @Override @@ -8610,10 +8641,10 @@ index 6e290d67b00c88ecd2cf2ce5f612f52ebda9e280..a39ea8cf75adbf84388b74222b3417a4 this.generateShearedMushrooms(drops::add); return drops; diff --git a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -index 87e4b300ac248f6c13d9b4a8f24fd78b24b565b4..43b5a0e7993ae9daef1c1ea67722347f9851d3a9 100644 +index 87e4b300ac248f6c13d9b4a8f24fd78b24b565b4..98b255cfe2fd04c93398ad4120db9b2fddcbe3e8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java +++ b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -@@ -26,6 +26,38 @@ public class CaveSpider extends Spider { +@@ -26,6 +26,39 @@ public class CaveSpider extends Spider { return Spider.createAttributes().add(Attributes.MAX_HEALTH, 12.0D); } @@ -8637,6 +8668,7 @@ index 87e4b300ac248f6c13d9b4a8f24fd78b24b565b4..43b5a0e7993ae9daef1c1ea67722347f + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.caveSpiderMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.caveSpiderScale); + } + + @Override @@ -8653,7 +8685,7 @@ index 87e4b300ac248f6c13d9b4a8f24fd78b24b565b4..43b5a0e7993ae9daef1c1ea67722347f public boolean doHurtTarget(Entity target) { if (super.doHurtTarget(target)) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index cb1b19e2e0d8f0744b2355b8f4da0206b196b19c..8da09124158ce679ce1e34fa1e3c5a049f2595fb 100644 +index cb1b19e2e0d8f0744b2355b8f4da0206b196b19c..322bc1a32b38b6d00e87549e8c3e64c645c7c170 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -61,21 +61,99 @@ public class Creeper extends Monster implements PowerableMob { @@ -8756,13 +8788,14 @@ index cb1b19e2e0d8f0744b2355b8f4da0206b196b19c..8da09124158ce679ce1e34fa1e3c5a04 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); } -@@ -175,6 +253,39 @@ public class Creeper extends Monster implements PowerableMob { +@@ -175,6 +253,40 @@ public class Creeper extends Monster implements PowerableMob { } } + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.creeperMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.creeperScale); + } + + public net.minecraft.world.entity.SpawnGroupData finalizeSpawn(net.minecraft.world.level.ServerLevelAccessor world, net.minecraft.world.DifficultyInstance difficulty, net.minecraft.world.entity.MobSpawnType spawnReason, @Nullable net.minecraft.world.entity.SpawnGroupData entityData) { @@ -8796,7 +8829,7 @@ index cb1b19e2e0d8f0744b2355b8f4da0206b196b19c..8da09124158ce679ce1e34fa1e3c5a04 @Override protected SoundEvent getHurtSound(DamageSource source) { return SoundEvents.CREEPER_HURT; -@@ -263,15 +374,18 @@ public class Creeper extends Monster implements PowerableMob { +@@ -263,15 +375,18 @@ public class Creeper extends Monster implements PowerableMob { } public void explodeCreeper() { @@ -8817,7 +8850,7 @@ index cb1b19e2e0d8f0744b2355b8f4da0206b196b19c..8da09124158ce679ce1e34fa1e3c5a04 this.spawnLingeringCloud(); this.triggerOnDeathMobEffects(Entity.RemovalReason.KILLED); this.discard(EntityRemoveEvent.Cause.EXPLODE); // CraftBukkit - add Bukkit remove cause -@@ -283,6 +397,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -283,6 +398,7 @@ public class Creeper extends Monster implements PowerableMob { // CraftBukkit end } @@ -8825,7 +8858,7 @@ index cb1b19e2e0d8f0744b2355b8f4da0206b196b19c..8da09124158ce679ce1e34fa1e3c5a04 } private void spawnLingeringCloud() { -@@ -324,6 +439,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -324,6 +440,7 @@ public class Creeper extends Monster implements PowerableMob { com.destroystokyo.paper.event.entity.CreeperIgniteEvent event = new com.destroystokyo.paper.event.entity.CreeperIgniteEvent((org.bukkit.entity.Creeper) getBukkitEntity(), ignited); if (event.callEvent()) { this.entityData.set(Creeper.DATA_IS_IGNITED, event.isIgnited()); @@ -8834,10 +8867,10 @@ index cb1b19e2e0d8f0744b2355b8f4da0206b196b19c..8da09124158ce679ce1e34fa1e3c5a04 } // Paper end - CreeperIgniteEvent diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..d1197b313f16f43f60ed242081a6164026e3c6a7 100644 +index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..94de51bf9acb32421838ffe54602310f0263b3c4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -71,6 +71,58 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -71,6 +71,59 @@ public class Drowned extends Zombie implements RangedAttackMob { return Zombie.createAttributes().add(Attributes.STEP_HEIGHT, 1.0D); } @@ -8861,6 +8894,7 @@ index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..d1197b313f16f43f60ed242081a61640 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.drownedMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.drownedScale); + } + + @Override @@ -8896,7 +8930,7 @@ index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..d1197b313f16f43f60ed242081a61640 @Override protected void addBehaviourGoals() { this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0D)); -@@ -78,10 +130,23 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -78,10 +131,23 @@ public class Drowned extends Zombie implements RangedAttackMob { this.goalSelector.addGoal(2, new Drowned.DrownedAttackGoal(this, 1.0D, false)); this.goalSelector.addGoal(5, new Drowned.DrownedGoToBeachGoal(this, 1.0D)); this.goalSelector.addGoal(6, new Drowned.DrownedSwimUpGoal(this, 1.0D, this.level().getSeaLevel())); @@ -8921,7 +8955,7 @@ index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..d1197b313f16f43f60ed242081a61640 this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Axolotl.class, true, false)); this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); -@@ -115,7 +180,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -115,7 +181,7 @@ public class Drowned extends Zombie implements RangedAttackMob { @Override public boolean supportsBreakDoorGoal() { @@ -8930,7 +8964,7 @@ index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..d1197b313f16f43f60ed242081a61640 } @Override -@@ -262,8 +327,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -262,8 +328,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.searchingForLand = targetingUnderwater; } @@ -8940,7 +8974,7 @@ index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..d1197b313f16f43f60ed242081a61640 private final Drowned drowned; public DrownedMoveControl(Drowned drowned) { -@@ -272,7 +336,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -272,7 +337,7 @@ public class Drowned extends Zombie implements RangedAttackMob { } @Override @@ -8949,7 +8983,7 @@ index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..d1197b313f16f43f60ed242081a61640 LivingEntity entityliving = this.drowned.getTarget(); if (this.drowned.wantsToSwim() && this.drowned.isInWater()) { -@@ -295,7 +359,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -295,7 +360,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.drowned.setYRot(this.rotlerp(this.drowned.getYRot(), f, 90.0F)); this.drowned.yBodyRot = this.drowned.getYRot(); @@ -8958,7 +8992,7 @@ index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..d1197b313f16f43f60ed242081a61640 float f2 = Mth.lerp(0.125F, this.drowned.getSpeed(), f1); this.drowned.setSpeed(f2); -@@ -305,7 +369,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -305,7 +370,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(0.0D, -0.008D, 0.0D)); } @@ -8968,10 +9002,10 @@ index cff1b5e0e3fd32d82157d5f13d83d4abdfad7378..d1197b313f16f43f60ed242081a61640 } diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -index fd995b1f29c47884e9db2cb92f1dd615d62ae032..7e8603ef5df722f19e85b9c5cdd4ebfdd6481e42 100644 +index fd995b1f29c47884e9db2cb92f1dd615d62ae032..9c9c8b83b3f793045b487891512e4de3430ef5a3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -@@ -33,6 +33,33 @@ public class ElderGuardian extends Guardian { +@@ -33,6 +33,34 @@ public class ElderGuardian extends Guardian { } @@ -8990,6 +9024,7 @@ index fd995b1f29c47884e9db2cb92f1dd615d62ae032..7e8603ef5df722f19e85b9c5cdd4ebfd + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.elderGuardianMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.elderGuardianScale); + } + + @Override @@ -9006,10 +9041,10 @@ index fd995b1f29c47884e9db2cb92f1dd615d62ae032..7e8603ef5df722f19e85b9c5cdd4ebfd return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.30000001192092896D).add(Attributes.ATTACK_DAMAGE, 8.0D).add(Attributes.MAX_HEALTH, 80.0D); } diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a0721989e 100644 +index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..144b7f4133091285e7b044daf64aaf634595fbed 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -92,12 +92,40 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -92,12 +92,41 @@ public class EnderMan extends Monster implements NeutralMob { public EnderMan(EntityType type, Level world) { super(type, world); @@ -9037,6 +9072,7 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.endermanMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.endermanScale); + } + + @Override @@ -9051,7 +9087,7 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a this.goalSelector.addGoal(1, new EnderMan.EndermanFreezeWhenLookedAt(this)); this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0D, false)); this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D, 0.0F)); -@@ -105,9 +133,10 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -105,9 +134,10 @@ public class EnderMan extends Monster implements NeutralMob { this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(10, new EnderMan.EndermanLeaveBlockGoal(this)); this.goalSelector.addGoal(11, new EnderMan.EndermanTakeBlockGoal(this)); @@ -9063,7 +9099,7 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a this.targetSelector.addGoal(4, new ResetUniversalAngerTargetGoal<>(this, false)); } -@@ -244,7 +273,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -244,7 +274,7 @@ public class EnderMan extends Monster implements NeutralMob { // Paper end - EndermanAttackPlayerEvent ItemStack itemstack = (ItemStack) player.getInventory().armor.get(3); @@ -9072,7 +9108,7 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a return false; } else { Vec3 vec3d = player.getViewVector(1.0F).normalize(); -@@ -276,12 +305,12 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -276,12 +306,12 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean isSensitiveToWater() { @@ -9087,7 +9123,7 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a float f = this.getLightLevelDependentMagicValue(); if (f > 0.5F && this.level().canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper - EndermanEscapeEvent -@@ -402,6 +431,8 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -402,6 +432,8 @@ public class EnderMan extends Monster implements NeutralMob { public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { return false; @@ -9096,7 +9132,7 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a } else { boolean flag = source.getDirectEntity() instanceof ThrownPotion; boolean flag1; -@@ -416,6 +447,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -416,6 +448,7 @@ public class EnderMan extends Monster implements NeutralMob { } else { flag1 = flag && this.hurtWithCleanWater(source, (ThrownPotion) source.getDirectEntity(), amount); @@ -9104,7 +9140,7 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - EndermanEscapeEvent for (int i = 0; i < 64; ++i) { if (this.teleport()) { -@@ -460,7 +492,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -460,7 +493,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { @@ -9113,7 +9149,7 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a } private static class EndermanFreezeWhenLookedAt extends Goal { -@@ -507,7 +539,16 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -507,7 +540,16 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { @@ -9131,7 +9167,7 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a } @Override -@@ -552,7 +593,16 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -552,7 +594,16 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { @@ -9150,10 +9186,10 @@ index 7b05ef99702af0e8a7d2a652984c4f8c15eefed8..1a4de372061158253cc070c94d55ad8a @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Endermite.java b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -index 9c78905762d9a484878fa9cf03a2ca3850e7e613..14d6796a124a85b8cbf5f3b719d89d99e0cf8db5 100644 +index 9c78905762d9a484878fa9cf03a2ca3850e7e613..f5b4623e3f4862cb6bf1ce7f345378c4c32f02cd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java +++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -@@ -32,20 +32,63 @@ public class Endermite extends Monster { +@@ -32,20 +32,64 @@ public class Endermite extends Monster { private static final int MAX_LIFE = 2400; public int life; @@ -9184,6 +9220,7 @@ index 9c78905762d9a484878fa9cf03a2ca3850e7e613..14d6796a124a85b8cbf5f3b719d89d99 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.endermiteMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.endermiteScale); + } + + @Override @@ -9217,7 +9254,7 @@ index 9c78905762d9a484878fa9cf03a2ca3850e7e613..14d6796a124a85b8cbf5f3b719d89d99 this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } -@@ -83,12 +126,14 @@ public class Endermite extends Monster { +@@ -83,12 +127,14 @@ public class Endermite extends Monster { public void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); this.life = nbt.getInt("Lifetime"); @@ -9233,10 +9270,10 @@ index 9c78905762d9a484878fa9cf03a2ca3850e7e613..14d6796a124a85b8cbf5f3b719d89d99 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -index 627cf7ba8f512285228121e46208fff51f22b563..781434438353d00f71f65af760fa4fb19ef6c3bb 100644 +index 627cf7ba8f512285228121e46208fff51f22b563..2c14df92b7b725584887d3f41c35659b2805a9ef 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -52,10 +52,43 @@ public class Evoker extends SpellcasterIllager { +@@ -52,10 +52,44 @@ public class Evoker extends SpellcasterIllager { this.xpReward = 10; } @@ -9260,6 +9297,7 @@ index 627cf7ba8f512285228121e46208fff51f22b563..781434438353d00f71f65af760fa4fb1 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.evokerMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.evokerScale); + } + + @Override @@ -9280,7 +9318,7 @@ index 627cf7ba8f512285228121e46208fff51f22b563..781434438353d00f71f65af760fa4fb1 this.goalSelector.addGoal(1, new Evoker.EvokerCastingSpellGoal()); this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 0.6D, 1.0D)); this.goalSelector.addGoal(4, new Evoker.EvokerSummonSpellGoal()); -@@ -64,6 +97,7 @@ public class Evoker extends SpellcasterIllager { +@@ -64,6 +98,7 @@ public class Evoker extends SpellcasterIllager { this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6D)); this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); @@ -9288,7 +9326,7 @@ index 627cf7ba8f512285228121e46208fff51f22b563..781434438353d00f71f65af760fa4fb1 this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Raider.class})).setAlertOthers()); this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300)); this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300)); -@@ -340,7 +374,7 @@ public class Evoker extends SpellcasterIllager { +@@ -340,7 +375,7 @@ public class Evoker extends SpellcasterIllager { return false; } else if (Evoker.this.tickCount < this.nextAttackTickCount) { return false; @@ -9298,7 +9336,7 @@ index 627cf7ba8f512285228121e46208fff51f22b563..781434438353d00f71f65af760fa4fb1 } else { List list = Evoker.this.level().getNearbyEntities(Sheep.class, this.wololoTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0D, 4.0D, 16.0D)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ghast.java b/src/main/java/net/minecraft/world/entity/monster/Ghast.java -index a836a902bebf318ceabaed4e98fab1141b46a28b..802d2e0eb9c007a1d087333a797ab9025edd24b7 100644 +index a836a902bebf318ceabaed4e98fab1141b46a28b..395904d83a72888cdbc018311da6e93c626e8210 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java @@ -43,11 +43,47 @@ public class Ghast extends FlyingMob implements Enemy { @@ -9349,13 +9387,14 @@ index a836a902bebf318ceabaed4e98fab1141b46a28b..802d2e0eb9c007a1d087333a797ab902 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entityliving) -> { return Math.abs(entityliving.getY() - this.getY()) <= 4.0D; })); -@@ -95,6 +131,21 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -95,6 +131,22 @@ public class Ghast extends FlyingMob implements Enemy { } } + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ghastMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ghastScale); + } + + @Override @@ -9371,7 +9410,7 @@ index a836a902bebf318ceabaed4e98fab1141b46a28b..802d2e0eb9c007a1d087333a797ab902 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -@@ -102,7 +153,7 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -102,7 +154,7 @@ public class Ghast extends FlyingMob implements Enemy { } public static AttributeSupplier.Builder createAttributes() { @@ -9380,7 +9419,7 @@ index a836a902bebf318ceabaed4e98fab1141b46a28b..802d2e0eb9c007a1d087333a797ab902 } @Override -@@ -154,7 +205,7 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -154,7 +206,7 @@ public class Ghast extends FlyingMob implements Enemy { } @@ -9389,7 +9428,7 @@ index a836a902bebf318ceabaed4e98fab1141b46a28b..802d2e0eb9c007a1d087333a797ab902 private final Ghast ghast; private int floatDuration; -@@ -165,7 +216,7 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -165,7 +217,7 @@ public class Ghast extends FlyingMob implements Enemy { } @Override @@ -9399,10 +9438,10 @@ index a836a902bebf318ceabaed4e98fab1141b46a28b..802d2e0eb9c007a1d087333a797ab902 if (this.floatDuration-- <= 0) { this.floatDuration += this.ghast.getRandom().nextInt(5) + 2; diff --git a/src/main/java/net/minecraft/world/entity/monster/Giant.java b/src/main/java/net/minecraft/world/entity/monster/Giant.java -index 118521ae54254b0a73bb7cba7b2871c9c26f89fc..262f0a9146d37ebdb600b8d304cea3d9bcfc8398 100644 +index 118521ae54254b0a73bb7cba7b2871c9c26f89fc..d2e1510e1bc9bbfa8bf21e1b74dda4bef18c6c50 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java -@@ -12,12 +12,94 @@ public class Giant extends Monster { +@@ -12,12 +12,95 @@ public class Giant extends Monster { super(type, world); } @@ -9456,6 +9495,7 @@ index 118521ae54254b0a73bb7cba7b2871c9c26f89fc..262f0a9146d37ebdb600b8d304cea3d9 + @Override + protected void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.giantMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.giantScale); + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.giantMovementSpeed); + this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(this.level().purpurConfig.giantAttackDamage); + } @@ -9499,10 +9539,10 @@ index 118521ae54254b0a73bb7cba7b2871c9c26f89fc..262f0a9146d37ebdb600b8d304cea3d9 } } diff --git a/src/main/java/net/minecraft/world/entity/monster/Guardian.java b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -index 5df07b59ff6e39687e361d89d7764381ca3ce9ca..5923c800f6b510eb6f17540867607bd64f8e70f5 100644 +index 5df07b59ff6e39687e361d89d7764381ca3ce9ca..d4de9b066004ec17696f547d8f4067a1f2c0443a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -@@ -66,15 +66,51 @@ public class Guardian extends Monster { +@@ -66,15 +66,52 @@ public class Guardian extends Monster { this.xpReward = 10; this.setPathfindingMalus(PathType.WATER, 0.0F); this.moveControl = new Guardian.GuardianMoveControl(this); @@ -9533,6 +9573,7 @@ index 5df07b59ff6e39687e361d89d7764381ca3ce9ca..5923c800f6b510eb6f17540867607bd6 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.guardianMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.guardianScale); + } + + @Override @@ -9554,7 +9595,7 @@ index 5df07b59ff6e39687e361d89d7764381ca3ce9ca..5923c800f6b510eb6f17540867607bd6 this.goalSelector.addGoal(4, this.guardianAttackGoal = new Guardian.GuardianAttackGoal(this)); // CraftBukkit - assign field this.goalSelector.addGoal(5, pathfindergoalmovetowardsrestriction); this.goalSelector.addGoal(7, this.randomStrollGoal); -@@ -83,6 +119,7 @@ public class Guardian extends Monster { +@@ -83,6 +120,7 @@ public class Guardian extends Monster { this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); this.randomStrollGoal.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); pathfindergoalmovetowardsrestriction.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); @@ -9562,7 +9603,7 @@ index 5df07b59ff6e39687e361d89d7764381ca3ce9ca..5923c800f6b510eb6f17540867607bd6 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new Guardian.GuardianAttackSelector(this))); } -@@ -333,7 +370,7 @@ public class Guardian extends Monster { +@@ -333,7 +371,7 @@ public class Guardian extends Monster { @Override public void travel(Vec3 movementInput) { if (this.isControlledByLocalInstance() && this.isInWater()) { @@ -9571,7 +9612,7 @@ index 5df07b59ff6e39687e361d89d7764381ca3ce9ca..5923c800f6b510eb6f17540867607bd6 this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.9D)); if (!this.isMoving() && this.getTarget() == null) { -@@ -345,7 +382,7 @@ public class Guardian extends Monster { +@@ -345,7 +383,7 @@ public class Guardian extends Monster { } @@ -9580,7 +9621,7 @@ index 5df07b59ff6e39687e361d89d7764381ca3ce9ca..5923c800f6b510eb6f17540867607bd6 private final Guardian guardian; -@@ -354,8 +391,17 @@ public class Guardian extends Monster { +@@ -354,8 +392,17 @@ public class Guardian extends Monster { this.guardian = guardian; } @@ -9599,7 +9640,7 @@ index 5df07b59ff6e39687e361d89d7764381ca3ce9ca..5923c800f6b510eb6f17540867607bd6 if (this.operation == MoveControl.Operation.MOVE_TO && !this.guardian.getNavigation().isDone()) { Vec3 vec3d = new Vec3(this.wantedX - this.guardian.getX(), this.wantedY - this.guardian.getY(), this.wantedZ - this.guardian.getZ()); double d0 = vec3d.length(); -@@ -366,7 +412,7 @@ public class Guardian extends Monster { +@@ -366,7 +413,7 @@ public class Guardian extends Monster { this.guardian.setYRot(this.rotlerp(this.guardian.getYRot(), f, 90.0F)); this.guardian.yBodyRot = this.guardian.getYRot(); @@ -9682,10 +9723,10 @@ index c34c8483a026f61fe20935697d321d7ef5d8dfbc..a9285aac811067313c5609d2d5708783 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -index c858556ea457931aa14e338e20672cb50cb19f0e..c21595b6b4eac187eb9f57c6aa4c6074da929162 100644 +index c858556ea457931aa14e338e20672cb50cb19f0e..f6450648b500733edfcee4564d382e8535d50fe2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -57,10 +57,45 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -57,10 +57,46 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } @@ -9711,6 +9752,7 @@ index c858556ea457931aa14e338e20672cb50cb19f0e..c21595b6b4eac187eb9f57c6aa4c6074 + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.illusionerMovementSpeed); + this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level().purpurConfig.illusionerFollowRange); + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.illusionerMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.illusionerScale); + } + + @Override @@ -9731,7 +9773,7 @@ index c858556ea457931aa14e338e20672cb50cb19f0e..c21595b6b4eac187eb9f57c6aa4c6074 this.goalSelector.addGoal(1, new SpellcasterIllager.SpellcasterCastingSpellGoal()); this.goalSelector.addGoal(4, new Illusioner.IllusionerMirrorSpellGoal()); this.goalSelector.addGoal(5, new Illusioner.IllusionerBlindnessSpellGoal()); -@@ -68,6 +103,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -68,6 +104,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6D)); this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); @@ -10248,10 +10290,10 @@ index c277dac448a64809e93dd7a447ee3dc2a86c860e..493e9ee0585ae419caffaa163f4975ab list.sort(Comparator.comparing((Entity e) -> { return e.getY(); }).reversed()); // CraftBukkit - decompile error Iterator iterator = list.iterator(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Pillager.java b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -index 4b4dcee6abe7a6db43638d04665125eec560496e..a43dbeaad8d8fda02a07680969eefdfd1e7fbae0 100644 +index 4b4dcee6abe7a6db43638d04665125eec560496e..6f5d28f55ba3b9d7cd2415ee86359303e5cde478 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -62,15 +62,49 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve +@@ -62,15 +62,50 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve super(type, world); } @@ -10275,6 +10317,7 @@ index 4b4dcee6abe7a6db43638d04665125eec560496e..a43dbeaad8d8fda02a07680969eefdfd + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pillagerMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.pillagerScale); + } + + @Override @@ -10302,10 +10345,10 @@ index 4b4dcee6abe7a6db43638d04665125eec560496e..a43dbeaad8d8fda02a07680969eefdfd this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 212d341425c0f93bba0376de69bea61ffcf4dbd6..0c494a8c71e316307af2c0e256ccfd23685f8219 100644 +index 212d341425c0f93bba0376de69bea61ffcf4dbd6..4f10d4686f12a81a77f5fc103139aa03069b398c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -69,14 +69,55 @@ public class Ravager extends Raider { +@@ -69,14 +69,56 @@ public class Ravager extends Raider { this.setPathfindingMalus(PathType.LEAVES, 0.0F); } @@ -10335,6 +10378,7 @@ index 212d341425c0f93bba0376de69bea61ffcf4dbd6..0c494a8c71e316307af2c0e256ccfd23 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ravagerMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ravagerScale); + } + + @Override @@ -10361,7 +10405,7 @@ index 212d341425c0f93bba0376de69bea61ffcf4dbd6..0c494a8c71e316307af2c0e256ccfd23 this.targetSelector.addGoal(2, (new HurtByTargetGoal(this, new Class[]{Raider.class})).setAlertOthers()); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true, (entityliving) -> { -@@ -129,7 +170,7 @@ public class Ravager extends Raider { +@@ -129,7 +171,7 @@ public class Ravager extends Raider { @Override public void aiStep() { super.aiStep(); @@ -10370,7 +10414,7 @@ index 212d341425c0f93bba0376de69bea61ffcf4dbd6..0c494a8c71e316307af2c0e256ccfd23 if (this.isImmobile()) { this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.0D); } else { -@@ -139,7 +180,7 @@ public class Ravager extends Raider { +@@ -139,7 +181,7 @@ public class Ravager extends Raider { this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1D, d1, d0)); } @@ -10379,7 +10423,7 @@ index 212d341425c0f93bba0376de69bea61ffcf4dbd6..0c494a8c71e316307af2c0e256ccfd23 boolean flag = false; AABB axisalignedbb = this.getBoundingBox().inflate(0.2D); Iterator iterator = BlockPos.betweenClosed(Mth.floor(axisalignedbb.minX), Mth.floor(axisalignedbb.minY), Mth.floor(axisalignedbb.minZ), Mth.floor(axisalignedbb.maxX), Mth.floor(axisalignedbb.maxY), Mth.floor(axisalignedbb.maxZ)).iterator(); -@@ -149,7 +190,7 @@ public class Ravager extends Raider { +@@ -149,7 +191,7 @@ public class Ravager extends Raider { BlockState iblockdata = this.level().getBlockState(blockposition); Block block = iblockdata.getBlock(); @@ -10389,10 +10433,19 @@ index 212d341425c0f93bba0376de69bea61ffcf4dbd6..0c494a8c71e316307af2c0e256ccfd23 if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state continue; diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index 920c7a92643e83598f39bf984cca430d9deed2cd..18fb2fd83a6b8234cca5d51e931582c391f60207 100644 +index 920c7a92643e83598f39bf984cca430d9deed2cd..76d37a649bfa1f504c969f92a34fcce0629cb347 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -97,12 +97,59 @@ public class Shulker extends AbstractGolem implements VariantHolder variant) { +@@ -598,7 +655,7 @@ public class Shulker extends AbstractGolem implements VariantHolder getVariant() { @@ -10488,7 +10551,7 @@ index 920c7a92643e83598f39bf984cca430d9deed2cd..18fb2fd83a6b8234cca5d51e931582c3 } @Nullable -@@ -608,7 +664,7 @@ public class Shulker extends AbstractGolem implements VariantHolder(this, Player.class, true)); } -@@ -167,7 +201,7 @@ public class Silverfish extends Monster { +@@ -167,7 +204,7 @@ public class Silverfish extends Monster { continue; } // CraftBukkit end @@ -10559,7 +10625,7 @@ index 860e385fc83f9787dca92efe35d21fd69c4dd635..c713e0b9b90784ad5f043f3a06ef50b5 world.destroyBlock(blockposition1, true, this.silverfish); } else { world.setBlock(blockposition1, ((InfestedBlock) block).hostStateByInfested(world.getBlockState(blockposition1)), 3); -@@ -205,7 +239,7 @@ public class Silverfish extends Monster { +@@ -205,7 +242,7 @@ public class Silverfish extends Monster { } else { RandomSource randomsource = this.mob.getRandom(); @@ -10872,10 +10938,10 @@ index adebb66e550f805f444bec22e9a4dd575a642b43..40c00f73502be66f2a0f3cdb36b963fb } diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java -index e675f1e3e5b6f9e1aa0d928ebb9abe76458edb38..834889f568c9b89d8b609d959adf8c6179c43417 100644 +index e675f1e3e5b6f9e1aa0d928ebb9abe76458edb38..44fc01ef40ae4cf7a5c884a9e8c6d6431247a496 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java -@@ -51,9 +51,42 @@ public class Spider extends Monster { +@@ -51,9 +51,43 @@ public class Spider extends Monster { super(type, world); } @@ -10899,6 +10965,7 @@ index e675f1e3e5b6f9e1aa0d928ebb9abe76458edb38..834889f568c9b89d8b609d959adf8c61 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.spiderMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.spiderScale); + } + + @Override @@ -10918,7 +10985,7 @@ index e675f1e3e5b6f9e1aa0d928ebb9abe76458edb38..834889f568c9b89d8b609d959adf8c61 this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Armadillo.class, 6.0F, 1.0D, 1.2D, (entityliving) -> { return !((Armadillo) entityliving).isScared(); })); -@@ -62,6 +95,7 @@ public class Spider extends Monster { +@@ -62,6 +96,7 @@ public class Spider extends Monster { this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.8D)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); @@ -10970,10 +11037,10 @@ index 1b8ab3f1090ea78bdba97265e05576c9a3e2deb3..588c8cefefde335cc9c02f77d0d050ee BlockPos blockPos = pos; diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index 2c5bfad3c1ae9a19b4762831a3abdd5e89ba24b3..346237b266f3044101d45c69b857f57c701411b3 100644 +index 2c5bfad3c1ae9a19b4762831a3abdd5e89ba24b3..70650cc6f76bed79a31a9e8c86205910994a920f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -91,12 +91,44 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -91,12 +91,45 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { super(type, world); this.steering = new ItemBasedSteering(this.entityData, Strider.DATA_BOOST_TIME, Strider.DATA_SADDLE_ID); this.blocksBuilding = true; @@ -11004,6 +11071,7 @@ index 2c5bfad3c1ae9a19b4762831a3abdd5e89ba24b3..346237b266f3044101d45c69b857f57c + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.striderMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.striderScale); + } + + @Override @@ -11019,7 +11087,7 @@ index 2c5bfad3c1ae9a19b4762831a3abdd5e89ba24b3..346237b266f3044101d45c69b857f57c public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable(); -@@ -158,6 +190,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -158,6 +191,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @Override protected void registerGoals() { this.goalSelector.addGoal(1, new PanicGoal(this, 1.65D)); @@ -11027,7 +11095,7 @@ index 2c5bfad3c1ae9a19b4762831a3abdd5e89ba24b3..346237b266f3044101d45c69b857f57c this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.temptGoal = new TemptGoal(this, 1.4D, (itemstack) -> { return itemstack.is(ItemTags.STRIDER_TEMPT_ITEMS); -@@ -414,7 +447,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -414,7 +448,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @Override public boolean isSensitiveToWater() { @@ -11036,7 +11104,7 @@ index 2c5bfad3c1ae9a19b4762831a3abdd5e89ba24b3..346237b266f3044101d45c69b857f57c } @Override -@@ -456,6 +489,19 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -456,6 +490,19 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { public InteractionResult mobInteract(Player player, InteractionHand hand) { boolean flag = this.isFood(player.getItemInHand(hand)); @@ -11056,7 +11124,7 @@ index 2c5bfad3c1ae9a19b4762831a3abdd5e89ba24b3..346237b266f3044101d45c69b857f57c if (!flag && this.isSaddled() && !this.isVehicle() && !player.isSecondaryUseActive()) { if (!this.level().isClientSide) { player.startRiding(this); -@@ -468,7 +514,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -468,7 +515,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { if (!enuminteractionresult.consumesAction()) { ItemStack itemstack = player.getItemInHand(hand); @@ -11066,10 +11134,10 @@ index 2c5bfad3c1ae9a19b4762831a3abdd5e89ba24b3..346237b266f3044101d45c69b857f57c if (flag && !this.isSilent()) { this.level().playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.STRIDER_EAT, this.getSoundSource(), 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index 2985296a9a034e535157f55e322fc8c107827752..3f2c335b895754695aa3e5fa1f021a39c4a604c7 100644 +index 2985296a9a034e535157f55e322fc8c107827752..f413815e65ffc4addb4ac75b96d5d0333507466b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -60,6 +60,65 @@ public class Vex extends Monster implements TraceableEntity { +@@ -60,6 +60,66 @@ public class Vex extends Monster implements TraceableEntity { this.xpReward = 3; } @@ -11119,6 +11187,7 @@ index 2985296a9a034e535157f55e322fc8c107827752..3f2c335b895754695aa3e5fa1f021a39 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.vexMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.vexScale); + } + + @Override @@ -11135,7 +11204,7 @@ index 2985296a9a034e535157f55e322fc8c107827752..3f2c335b895754695aa3e5fa1f021a39 @Override public boolean isFlapping() { return this.tickCount % Vex.TICKS_PER_FLAP == 0; -@@ -73,7 +132,7 @@ public class Vex extends Monster implements TraceableEntity { +@@ -73,7 +133,7 @@ public class Vex extends Monster implements TraceableEntity { @Override public void tick() { @@ -11144,7 +11213,7 @@ index 2985296a9a034e535157f55e322fc8c107827752..3f2c335b895754695aa3e5fa1f021a39 super.tick(); this.noPhysics = false; this.setNoGravity(true); -@@ -88,17 +147,19 @@ public class Vex extends Monster implements TraceableEntity { +@@ -88,17 +148,19 @@ public class Vex extends Monster implements TraceableEntity { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -11165,7 +11234,7 @@ index 2985296a9a034e535157f55e322fc8c107827752..3f2c335b895754695aa3e5fa1f021a39 } @Override -@@ -230,14 +291,14 @@ public class Vex extends Monster implements TraceableEntity { +@@ -230,14 +292,14 @@ public class Vex extends Monster implements TraceableEntity { this.setDropChance(EquipmentSlot.MAINHAND, 0.0F); } @@ -11182,7 +11251,7 @@ index 2985296a9a034e535157f55e322fc8c107827752..3f2c335b895754695aa3e5fa1f021a39 if (this.operation == MoveControl.Operation.MOVE_TO) { Vec3 vec3d = new Vec3(this.wantedX - Vex.this.getX(), this.wantedY - Vex.this.getY(), this.wantedZ - Vex.this.getZ()); double d0 = vec3d.length(); -@@ -246,7 +307,7 @@ public class Vex extends Monster implements TraceableEntity { +@@ -246,7 +308,7 @@ public class Vex extends Monster implements TraceableEntity { this.operation = MoveControl.Operation.WAIT; Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().scale(0.5D)); } else { @@ -11192,10 +11261,10 @@ index 2985296a9a034e535157f55e322fc8c107827752..3f2c335b895754695aa3e5fa1f021a39 Vec3 vec3d1 = Vex.this.getDeltaMovement(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index 0615bb305d70f660a6baa7f78078990d6db227d3..a03eeb0cb4615a9f730fb0cc1b747f5f9341a855 100644 +index 0615bb305d70f660a6baa7f78078990d6db227d3..d7d4c2fa1e3a9105b7accf742448e62161506695 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -53,14 +53,48 @@ public class Vindicator extends AbstractIllager { +@@ -53,14 +53,49 @@ public class Vindicator extends AbstractIllager { super(type, world); } @@ -11219,6 +11288,7 @@ index 0615bb305d70f660a6baa7f78078990d6db227d3..a03eeb0cb4615a9f730fb0cc1b747f5f + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.vindicatorMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.vindicatorScale); + } + + @Override @@ -11244,7 +11314,7 @@ index 0615bb305d70f660a6baa7f78078990d6db227d3..a03eeb0cb4615a9f730fb0cc1b747f5f this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true)); -@@ -127,6 +161,11 @@ public class Vindicator extends AbstractIllager { +@@ -127,6 +162,11 @@ public class Vindicator extends AbstractIllager { RandomSource randomSource = world.getRandom(); this.populateDefaultEquipmentSlots(randomSource, difficulty); this.populateDefaultEquipmentEnchantments(world, randomSource, difficulty); @@ -11257,10 +11327,10 @@ index 0615bb305d70f660a6baa7f78078990d6db227d3..a03eeb0cb4615a9f730fb0cc1b747f5f } diff --git a/src/main/java/net/minecraft/world/entity/monster/Witch.java b/src/main/java/net/minecraft/world/entity/monster/Witch.java -index b8ff1e3d280171378fe383bcc7c6a855d20ae5d1..2dd74108232af7e957f5924b3ee810c60e8edd77 100644 +index b8ff1e3d280171378fe383bcc7c6a855d20ae5d1..dd4f10fa5c8d580598bb55d859e70583026b16b3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java -@@ -56,6 +56,38 @@ public class Witch extends Raider implements RangedAttackMob { +@@ -56,6 +56,39 @@ public class Witch extends Raider implements RangedAttackMob { super(type, world); } @@ -11284,6 +11354,7 @@ index b8ff1e3d280171378fe383bcc7c6a855d20ae5d1..2dd74108232af7e957f5924b3ee810c6 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.witchMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.witchScale); + } + + @Override @@ -11299,7 +11370,7 @@ index b8ff1e3d280171378fe383bcc7c6a855d20ae5d1..2dd74108232af7e957f5924b3ee810c6 @Override protected void registerGoals() { super.registerGoals(); -@@ -64,10 +96,12 @@ public class Witch extends Raider implements RangedAttackMob { +@@ -64,10 +97,12 @@ public class Witch extends Raider implements RangedAttackMob { }); this.attackPlayersGoal = new NearestAttackableWitchTargetGoal<>(this, Player.class, 10, true, false, (Predicate) null); this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -11313,10 +11384,10 @@ index b8ff1e3d280171378fe383bcc7c6a855d20ae5d1..2dd74108232af7e957f5924b3ee810c6 this.targetSelector.addGoal(2, this.healRaidersGoal); this.targetSelector.addGoal(3, this.attackPlayersGoal); diff --git a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -index bb2e7cee612dc1fafa042674a0b0d07d7165b54c..fdec9ed0993fd3a670883901e8e451999e211f30 100644 +index bb2e7cee612dc1fafa042674a0b0d07d7165b54c..1abef17858b9549fe01d213d057cc1101df37b55 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -33,6 +33,38 @@ public class WitherSkeleton extends AbstractSkeleton { +@@ -33,6 +33,39 @@ public class WitherSkeleton extends AbstractSkeleton { this.setPathfindingMalus(PathType.LAVA, 8.0F); } @@ -11340,6 +11411,7 @@ index bb2e7cee612dc1fafa042674a0b0d07d7165b54c..fdec9ed0993fd3a670883901e8e45199 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.witherSkeletonMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.witherSkeletonScale); + } + + @Override @@ -11356,10 +11428,10 @@ index bb2e7cee612dc1fafa042674a0b0d07d7165b54c..fdec9ed0993fd3a670883901e8e45199 protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 0d447c8a141a7d7fcaf9218571bf0513dd28269e..5b87ff7f33054261107e4ab1b3afac1da8f0abc2 100644 +index 0d447c8a141a7d7fcaf9218571bf0513dd28269e..fdc57a81cbd7a02a3ade0da8ff84d7df5361c783 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -79,6 +79,38 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -79,6 +79,39 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { this.xpReward = 5; } @@ -11383,6 +11455,7 @@ index 0d447c8a141a7d7fcaf9218571bf0513dd28269e..5b87ff7f33054261107e4ab1b3afac1d + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zoglinMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zoglinScale); + } + + @Override @@ -11398,7 +11471,7 @@ index 0d447c8a141a7d7fcaf9218571bf0513dd28269e..5b87ff7f33054261107e4ab1b3afac1d @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -233,6 +265,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -233,6 +266,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { @Override protected void customServerAiStep() { @@ -11407,10 +11480,10 @@ index 0d447c8a141a7d7fcaf9218571bf0513dd28269e..5b87ff7f33054261107e4ab1b3afac1d this.updateActivity(); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce924cab51 100644 +index 2280004638fd19ed018cb3e77d53a018b34ec516..4578fc25456361b76c9821f066fd8a628cd4bd67 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -97,22 +97,69 @@ public class Zombie extends Monster { +@@ -97,22 +97,70 @@ public class Zombie extends Monster { private int inWaterTime; public int conversionTime; private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field @@ -11447,6 +11520,7 @@ index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombieScale); + } + + public boolean jockeyOnlyBaby() { @@ -11481,7 +11555,7 @@ index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce this.addBehaviourGoals(); } -@@ -122,7 +169,19 @@ public class Zombie extends Monster { +@@ -122,7 +170,19 @@ public class Zombie extends Monster { this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); @@ -11502,7 +11576,7 @@ index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); } -@@ -244,32 +303,7 @@ public class Zombie extends Monster { +@@ -244,32 +304,7 @@ public class Zombie extends Monster { @Override public void aiStep() { @@ -11536,7 +11610,7 @@ index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce super.aiStep(); } -@@ -307,6 +341,7 @@ public class Zombie extends Monster { +@@ -307,6 +342,7 @@ public class Zombie extends Monster { } @@ -11544,7 +11618,7 @@ index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce public boolean isSunSensitive() { return this.shouldBurnInDay; // Paper - Add more Zombie API } -@@ -435,7 +470,7 @@ public class Zombie extends Monster { +@@ -435,7 +471,7 @@ public class Zombie extends Monster { nbt.putBoolean("CanBreakDoors", this.canBreakDoors()); nbt.putInt("InWaterTime", this.isInWater() ? this.inWaterTime : -1); nbt.putInt("DrownedConversionTime", this.isUnderWaterConverting() ? this.conversionTime : -1); @@ -11553,7 +11627,7 @@ index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce } @Override -@@ -448,7 +483,7 @@ public class Zombie extends Monster { +@@ -448,7 +484,7 @@ public class Zombie extends Monster { this.startUnderWaterConversion(nbt.getInt("DrownedConversionTime")); } // Paper start - Add more Zombie API @@ -11562,7 +11636,7 @@ index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce this.shouldBurnInDay = nbt.getBoolean("Paper.ShouldBurnInDay"); } // Paper end - Add more Zombie API -@@ -520,19 +555,20 @@ public class Zombie extends Monster { +@@ -520,19 +556,20 @@ public class Zombie extends Monster { } if (object instanceof Zombie.ZombieGroupData entityzombie_groupdatazombie) { @@ -11589,7 +11663,7 @@ index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce Chicken entitychicken1 = (Chicken) EntityType.CHICKEN.create(this.level()); if (entitychicken1 != null) { -@@ -542,6 +578,7 @@ public class Zombie extends Monster { +@@ -542,6 +579,7 @@ public class Zombie extends Monster { this.startRiding(entitychicken1); world.addFreshEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit } @@ -11597,7 +11671,7 @@ index 2280004638fd19ed018cb3e77d53a018b34ec516..e8fb47996c804c1d273d5bada11c70ce } } } -@@ -588,7 +625,7 @@ public class Zombie extends Monster { +@@ -588,7 +626,7 @@ public class Zombie extends Monster { } protected void randomizeReinforcementsChance() { @@ -11683,10 +11757,10 @@ index e0dabbf6d7a87b8722769c78ef0d2ba4353ed2cb..5ead916772c21d8db98e389984d531aa return InteractionResult.SUCCESS; diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 10388cf33f6f33070aa84b3b2d7bd14fc50ceea8..727ee00adf344e17118d8d61161202664afa4dc2 100644 +index 10388cf33f6f33070aa84b3b2d7bd14fc50ceea8..1c04fbea0dce4167a0902b92b95d470f562825c2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -63,6 +63,53 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -63,6 +63,54 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.setPathfindingMalus(PathType.LAVA, 8.0F); } @@ -11710,6 +11784,7 @@ index 10388cf33f6f33070aa84b3b2d7bd14fc50ceea8..727ee00adf344e17118d8d6116120266 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombifiedPiglinMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombifiedPiglinScale); + } + + @Override @@ -11740,7 +11815,7 @@ index 10388cf33f6f33070aa84b3b2d7bd14fc50ceea8..727ee00adf344e17118d8d6116120266 @Override public void setPersistentAngerTarget(@Nullable UUID angryAt) { this.persistentAngerTarget = angryAt; -@@ -110,7 +157,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -110,7 +158,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.maybeAlertOthers(); } @@ -11749,7 +11824,7 @@ index 10388cf33f6f33070aa84b3b2d7bd14fc50ceea8..727ee00adf344e17118d8d6116120266 this.lastHurtByPlayerTime = this.tickCount; } -@@ -165,7 +212,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -165,7 +213,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.ticksUntilNextAlert = ZombifiedPiglin.ALERT_INTERVAL.sample(this.random); } @@ -11758,7 +11833,7 @@ index 10388cf33f6f33070aa84b3b2d7bd14fc50ceea8..727ee00adf344e17118d8d6116120266 this.setLastHurtByPlayer((Player) entityliving); } -@@ -245,7 +292,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -245,7 +293,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @Override protected void randomizeReinforcementsChance() { @@ -11768,10 +11843,10 @@ index 10388cf33f6f33070aa84b3b2d7bd14fc50ceea8..727ee00adf344e17118d8d6116120266 @Nullable diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 14878f825cc80296ffa09b5b2c0d8ed9a134491b..5596689f3850a0cf94c5791e3a23cf46358ab05f 100644 +index 14878f825cc80296ffa09b5b2c0d8ed9a134491b..e9efb85fdcbb5d4a4ae4971536da2ffd205a3e4e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -90,6 +90,43 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -90,6 +90,44 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { this.xpReward = 5; } @@ -11794,6 +11869,7 @@ index 14878f825cc80296ffa09b5b2c0d8ed9a134491b..5596689f3850a0cf94c5791e3a23cf46 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.hoglinMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.hoglinScale); + } + // Purpur end + @@ -11815,7 +11891,7 @@ index 14878f825cc80296ffa09b5b2c0d8ed9a134491b..5596689f3850a0cf94c5791e3a23cf46 @Override public boolean canBeLeashed() { return true; -@@ -156,7 +193,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -156,7 +194,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { private int behaviorTick; // Pufferfish @Override protected void customServerAiStep() { @@ -11825,10 +11901,10 @@ index 14878f825cc80296ffa09b5b2c0d8ed9a134491b..5596689f3850a0cf94c5791e3a23cf46 HoglinAi.updateActivity(this); if (this.isConverting()) { diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 6da1335186a6d31d8e78542f8b3bd11d214ef13c..4747896ee0d25cda0780458de75bfef2b3b24ac7 100644 +index 6da1335186a6d31d8e78542f8b3bd11d214ef13c..5f16aebecd621471a05a8bb72a5aa408b78da05e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -93,6 +93,38 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -93,6 +93,39 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento this.xpReward = 5; } @@ -11852,6 +11928,7 @@ index 6da1335186a6d31d8e78542f8b3bd11d214ef13c..4747896ee0d25cda0780458de75bfef2 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.piglinMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.piglinScale); + } + + @Override @@ -11867,7 +11944,7 @@ index 6da1335186a6d31d8e78542f8b3bd11d214ef13c..4747896ee0d25cda0780458de75bfef2 @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); -@@ -296,7 +328,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -296,7 +329,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento private int behaviorTick; // Pufferfish @Override protected void customServerAiStep() { @@ -11876,7 +11953,7 @@ index 6da1335186a6d31d8e78542f8b3bd11d214ef13c..4747896ee0d25cda0780458de75bfef2 this.getBrain().tick((ServerLevel) this.level(), this); PiglinAi.updateActivity(this); super.customServerAiStep(); -@@ -388,7 +420,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -388,7 +421,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override public boolean wantsToPickUp(ItemStack stack) { @@ -11910,10 +11987,10 @@ index 0192b62fd66621a72fcf2f20896647e5950ba993..d079d5492b6ed709b1e0a7d84fb5f8f6 piglin.getBrain().eraseMemory(MemoryModuleType.WALK_TARGET); piglin.getNavigation().stop(); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index 072c28e309d1d18cb3e3e719aec23d77dd966b47..723e4467e202669faeffd4d92a376ca85c199496 100644 +index 072c28e309d1d18cb3e3e719aec23d77dd966b47..b44bbeba8ed0b86afc8118d4b88026b0226e30a4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -@@ -62,6 +62,38 @@ public class PiglinBrute extends AbstractPiglin { +@@ -62,6 +62,39 @@ public class PiglinBrute extends AbstractPiglin { this.xpReward = 20; } @@ -11937,6 +12014,7 @@ index 072c28e309d1d18cb3e3e719aec23d77dd966b47..723e4467e202669faeffd4d92a376ca8 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.piglinBruteMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.piglinBruteScale); + } + + @Override @@ -11952,7 +12030,7 @@ index 072c28e309d1d18cb3e3e719aec23d77dd966b47..723e4467e202669faeffd4d92a376ca8 public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0).add(Attributes.MOVEMENT_SPEED, 0.35F).add(Attributes.ATTACK_DAMAGE, 7.0); } -@@ -106,6 +138,7 @@ public class PiglinBrute extends AbstractPiglin { +@@ -106,6 +139,7 @@ public class PiglinBrute extends AbstractPiglin { @Override protected void customServerAiStep() { @@ -12072,7 +12150,7 @@ index e0e5046c84941a8d17e18c177f3daea9cb631940..d503d7a5837dbeb98e58dbe8f7e5de45 } diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee699314048fba6 100644 +index c96d612f0b3efc96f3f60f35449811cacc93123c..6600ffa5a69c57385cfa0ae5395a9ccf51454888 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -144,6 +144,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -12084,7 +12162,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 public Villager(EntityType entityType, Level world) { this(entityType, world, VillagerType.PLAINS); -@@ -156,6 +158,91 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -156,6 +158,92 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.getNavigation().setCanFloat(true); this.setCanPickUpLoot(true); this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); @@ -12121,6 +12199,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 + @Override + public void initAttributes() { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.villagerMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.villagerScale); + } + + @Override @@ -12176,7 +12255,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 } @Override -@@ -192,7 +279,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -192,7 +280,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler brain.addActivity(Activity.PLAY, VillagerGoalPackages.getPlayPackage(0.5F)); } else { brain.setSchedule(Schedule.VILLAGER_DEFAULT); @@ -12185,7 +12264,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -255,12 +342,20 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -255,12 +343,20 @@ public class Villager extends AbstractVillager implements ReputationEventHandler // Paper start this.customServerAiStep(false); } @@ -12209,7 +12288,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 // Pufferfish end if (this.assignProfessionWhenSpawned) { this.assignProfessionWhenSpawned = false; -@@ -317,7 +412,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -317,7 +413,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler if (!itemstack.is(Items.VILLAGER_SPAWN_EGG) && this.isAlive() && !this.isTrading() && !this.isSleeping()) { if (this.isBaby()) { this.setUnhappy(); @@ -12218,7 +12297,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 } else { if (!this.level().isClientSide) { boolean flag = this.getOffers().isEmpty(); -@@ -331,9 +426,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -331,9 +427,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (flag) { @@ -12231,7 +12310,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 this.startTrading(player); } -@@ -503,7 +600,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -503,7 +601,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler while (iterator.hasNext()) { MerchantOffer merchantrecipe = (MerchantOffer) iterator.next(); @@ -12240,7 +12319,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 } } -@@ -745,7 +842,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -745,7 +843,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { @@ -12249,7 +12328,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 } private boolean hungry() { -@@ -938,6 +1035,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -938,6 +1036,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean hasFarmSeeds() { return this.getInventory().hasAnyMatching((itemstack) -> { @@ -12261,7 +12340,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 return itemstack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS); }); } -@@ -995,6 +1097,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -995,6 +1098,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public void spawnGolemIfNeeded(ServerLevel world, long time, int requiredCount) { @@ -12269,7 +12348,7 @@ index c96d612f0b3efc96f3f60f35449811cacc93123c..6740a06855f38f961fd741e4aee69931 if (this.wantsToSpawnGolem(time)) { AABB axisalignedbb = this.getBoundingBox().inflate(10.0D, 10.0D, 10.0D); List list = world.getEntitiesOfClass(Villager.class, axisalignedbb); -@@ -1059,6 +1162,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1059,6 +1163,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public void startSleeping(BlockPos pos) { @@ -18384,10 +18463,10 @@ index 0000000000000000000000000000000000000000..71787e9efaa8a711f4c41849793f01f3 +} diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b3512549a87 +index 0000000000000000000000000000000000000000..7cf54e37e1c70ebb7b1606074c3c7fe73f31a3ef --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -0,0 +1,3302 @@ +@@ -0,0 +1,3441 @@ +package org.purpurmc.purpur; + +import net.minecraft.core.registries.BuiltInRegistries; @@ -18395,6 +18474,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; ++import net.minecraft.world.entity.monster.Shulker; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; @@ -19547,16 +19627,21 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean allayRidable = false; + public boolean allayRidableInWater = true; + public boolean allayControllable = true; ++ public double allayMaxHealth = 20.0D; ++ public double allayScale = 1.0D; + private void allaySettings() { + allayRidable = getBoolean("mobs.allay.ridable", allayRidable); + allayRidableInWater = getBoolean("mobs.allay.ridable-in-water", allayRidableInWater); + allayControllable = getBoolean("mobs.allay.controllable", allayControllable); ++ allayMaxHealth = getDouble("mobs.allay.attributes.max_health", allayMaxHealth); ++ allayScale = Mth.clamp(getDouble("mobs.allay.attributes.scale", allayScale), 0.0625D, 16.0D); + } + + public boolean armadilloRidable = false; + public boolean armadilloRidableInWater = true; + public boolean armadilloControllable = true; + public double armadilloMaxHealth = 12.0D; ++ public double armadilloScale = 1.0D; + public int armadilloBreedingTicks = 6000; + private void armadilloSettings() { + armadilloRidable = getBoolean("mobs.armadillo.ridable", armadilloRidable); @@ -19564,11 +19649,13 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + armadilloControllable = getBoolean("mobs.armadillo.controllable", armadilloControllable); + armadilloMaxHealth = getDouble("mobs.armadillo.attributes.max_health", armadilloMaxHealth); + armadilloBreedingTicks = getInt("mobs.armadillo.breeding-delay-ticks", armadilloBreedingTicks); ++ armadilloScale = Mth.clamp(getDouble("mobs.armadillo.attributes.scale", armadilloScale), 0.0625D, 16.0D); + } + + public boolean axolotlRidable = false; + public boolean axolotlControllable = true; + public double axolotlMaxHealth = 14.0D; ++ public double axolotlScale = 1.0D; + public int axolotlBreedingTicks = 6000; + public boolean axolotlTakeDamageFromWater = false; + public boolean axolotlAlwaysDropExp = false; @@ -19576,6 +19663,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); + axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); + axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); ++ axolotlScale = Mth.clamp(getDouble("mobs.axolotl.attributes.scale", axolotlScale), 0.0625D, 16.0D); + axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); + axolotlTakeDamageFromWater = getBoolean("mobs.axolotl.takes-damage-from-water", axolotlTakeDamageFromWater); + axolotlAlwaysDropExp = getBoolean("mobs.axolotl.always-drop-exp", axolotlAlwaysDropExp); @@ -19586,6 +19674,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean batControllable = true; + public double batMaxY = 320D; + public double batMaxHealth = 6.0D; ++ public double batScale = 1.0D; + public double batFollowRange = 16.0D; + public double batKnockbackResistance = 0.0D; + public double batMovementSpeed = 0.6D; @@ -19606,6 +19695,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.bat.attributes.max_health", oldValue); + } + batMaxHealth = getDouble("mobs.bat.attributes.max_health", batMaxHealth); ++ batScale = Mth.clamp(getDouble("mobs.bat.attributes.scale", batScale), 0.0625D, 16.0D); + batFollowRange = getDouble("mobs.bat.attributes.follow_range", batFollowRange); + batKnockbackResistance = getDouble("mobs.bat.attributes.knockback_resistance", batKnockbackResistance); + batMovementSpeed = getDouble("mobs.bat.attributes.movement_speed", batMovementSpeed); @@ -19622,6 +19712,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean beeControllable = true; + public double beeMaxY = 320D; + public double beeMaxHealth = 10.0D; ++ public double beeScale = 1.0D; + public int beeBreedingTicks = 6000; + public boolean beeTakeDamageFromWater = false; + public boolean beeCanWorkAtNight = false; @@ -19639,6 +19730,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.bee.attributes.max_health", oldValue); + } + beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); ++ beeScale = Mth.clamp(getDouble("mobs.bee.attributes.scale", beeScale), 0.0625D, 16.0D); + beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); + beeTakeDamageFromWater = getBoolean("mobs.bee.takes-damage-from-water", beeTakeDamageFromWater); + beeCanWorkAtNight = getBoolean("mobs.bee.can-work-at-night", beeCanWorkAtNight); @@ -19652,6 +19744,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean blazeControllable = true; + public double blazeMaxY = 320D; + public double blazeMaxHealth = 20.0D; ++ public double blazeScale = 1.0D; + public boolean blazeTakeDamageFromWater = true; + public boolean blazeAlwaysDropExp = false; + private void blazeSettings() { @@ -19665,6 +19758,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.blaze.attributes.max_health", oldValue); + } + blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); ++ blazeScale = Mth.clamp(getDouble("mobs.blaze.attributes.scale", blazeScale), 0.0625D, 16.0D); + blazeTakeDamageFromWater = getBoolean("mobs.blaze.takes-damage-from-water", blazeTakeDamageFromWater); + blazeAlwaysDropExp = getBoolean("mobs.blaze.always-drop-exp", blazeAlwaysDropExp); + } @@ -19673,11 +19767,13 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean boggedRidableInWater = true; + public boolean boggedControllable = true; + public double boggedMaxHealth = 16.0D; ++ public double boggedScale = 1.0D; + private void boggedSettings() { + boggedRidable = getBoolean("mobs.bogged.ridable", boggedRidable); + boggedRidableInWater = getBoolean("mobs.bogged.ridable-in-water", boggedRidableInWater); + boggedControllable = getBoolean("mobs.bogged.controllable", boggedControllable); + boggedMaxHealth = getDouble("mobs.bogged.attributes.max_health", boggedMaxHealth); ++ boggedScale = Mth.clamp(getDouble("mobs.bogged.attributes.scale", boggedScale), 0.0625D, 16.0D); + } + + public boolean camelRidableInWater = false; @@ -19703,6 +19799,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean catRidableInWater = true; + public boolean catControllable = true; + public double catMaxHealth = 10.0D; ++ public double catScale = 1.0D; + public int catSpawnDelay = 1200; + public int catSpawnSwampHutScanRange = 16; + public int catSpawnVillageScanRange = 48; @@ -19720,6 +19817,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.cat.attributes.max_health", oldValue); + } + catMaxHealth = getDouble("mobs.cat.attributes.max_health", catMaxHealth); ++ catScale = Mth.clamp(getDouble("mobs.cat.attributes.scale", catScale), 0.0625D, 16.0D); + catSpawnDelay = getInt("mobs.cat.spawn-delay", catSpawnDelay); + catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); + catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); @@ -19737,6 +19835,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean caveSpiderRidableInWater = true; + public boolean caveSpiderControllable = true; + public double caveSpiderMaxHealth = 12.0D; ++ public double caveSpiderScale = 1.0D; + public boolean caveSpiderTakeDamageFromWater = false; + public boolean caveSpiderAlwaysDropExp = false; + private void caveSpiderSettings() { @@ -19749,6 +19848,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.cave_spider.attributes.max_health", oldValue); + } + caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); ++ caveSpiderScale = Mth.clamp(getDouble("mobs.cave_spider.attributes.scale", caveSpiderScale), 0.0625D, 16.0D); + caveSpiderTakeDamageFromWater = getBoolean("mobs.cave_spider.takes-damage-from-water", caveSpiderTakeDamageFromWater); + caveSpiderAlwaysDropExp = getBoolean("mobs.cave_spider.always-drop-exp", caveSpiderAlwaysDropExp); + } @@ -19757,6 +19857,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean chickenRidableInWater = false; + public boolean chickenControllable = true; + public double chickenMaxHealth = 4.0D; ++ public double chickenScale = 1.0D; + public boolean chickenRetaliate = false; + public int chickenBreedingTicks = 6000; + public boolean chickenTakeDamageFromWater = false; @@ -19771,6 +19872,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.chicken.attributes.max_health", oldValue); + } + chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); ++ chickenScale = Mth.clamp(getDouble("mobs.chicken.attributes.scale", chickenScale), 0.0625D, 16.0D); + chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); + chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); + chickenTakeDamageFromWater = getBoolean("mobs.chicken.takes-damage-from-water", chickenTakeDamageFromWater); @@ -19780,6 +19882,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean codRidable = false; + public boolean codControllable = true; + public double codMaxHealth = 3.0D; ++ public double codScale = 1.0D; + public boolean codTakeDamageFromWater = false; + public boolean codAlwaysDropExp = false; + private void codSettings() { @@ -19791,6 +19894,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.cod.attributes.max_health", oldValue); + } + codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); ++ codScale = Mth.clamp(getDouble("mobs.cod.attributes.scale", codScale), 0.0625D, 16.0D); + codTakeDamageFromWater = getBoolean("mobs.cod.takes-damage-from-water", codTakeDamageFromWater); + codAlwaysDropExp = getBoolean("mobs.cod.always-drop-exp", codAlwaysDropExp); + } @@ -19799,6 +19903,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean cowRidableInWater = true; + public boolean cowControllable = true; + public double cowMaxHealth = 10.0D; ++ public double cowScale = 1.0D; + public int cowFeedMushrooms = 0; + public int cowBreedingTicks = 6000; + public boolean cowTakeDamageFromWater = false; @@ -19820,6 +19925,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.cow.attributes.max_health", oldValue); + } + cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); ++ cowScale = Mth.clamp(getDouble("mobs.cow.attributes.scale", cowScale), 0.0625D, 16.0D); + cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); + cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); + cowTakeDamageFromWater = getBoolean("mobs.cow.takes-damage-from-water", cowTakeDamageFromWater); @@ -19832,6 +19938,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean creeperRidableInWater = true; + public boolean creeperControllable = true; + public double creeperMaxHealth = 20.0D; ++ public double creeperScale = 1.0D; + public double creeperChargedChance = 0.0D; + public boolean creeperAllowGriefing = true; + public boolean creeperBypassMobGriefing = false; @@ -19851,6 +19958,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.creeper.attributes.max_health", oldValue); + } + creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); ++ creeperScale = Mth.clamp(getDouble("mobs.creeper.attributes.scale", creeperScale), 0.0625D, 16.0D); + creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); + creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); + creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); @@ -19868,6 +19976,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public float dolphinSpitSpeed = 1.0F; + public float dolphinSpitDamage = 2.0F; + public double dolphinMaxHealth = 10.0D; ++ public double dolphinScale = 1.0D; + public boolean dolphinDisableTreasureSearching = false; + public boolean dolphinTakeDamageFromWater = false; + public double dolphinNaturallyAggressiveToPlayersChance = 0.0D; @@ -19884,6 +19993,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.dolphin.attributes.max_health", oldValue); + } + dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); ++ dolphinScale = Mth.clamp(getDouble("mobs.dolphin.attributes.scale", dolphinScale), 0.0625D, 16.0D); + dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); + dolphinTakeDamageFromWater = getBoolean("mobs.dolphin.takes-damage-from-water", dolphinTakeDamageFromWater); + dolphinNaturallyAggressiveToPlayersChance = getDouble("mobs.dolphin.naturally-aggressive-to-players-chance", dolphinNaturallyAggressiveToPlayersChance); @@ -19924,6 +20034,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean drownedRidableInWater = true; + public boolean drownedControllable = true; + public double drownedMaxHealth = 20.0D; ++ public double drownedScale = 1.0D; + public double drownedSpawnReinforcements = 0.1D; + public boolean drownedJockeyOnlyBaby = true; + public double drownedJockeyChance = 0.05D; @@ -19941,6 +20052,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.drowned.attributes.max_health", oldValue); + } + drownedMaxHealth = getDouble("mobs.drowned.attributes.max_health", drownedMaxHealth); ++ drownedScale = Mth.clamp(getDouble("mobs.drowned.attributes.scale", drownedScale), 0.0625D, 16.0D); + drownedSpawnReinforcements = getDouble("mobs.drowned.attributes.spawn_reinforcements", drownedSpawnReinforcements); + drownedJockeyOnlyBaby = getBoolean("mobs.drowned.jockey.only-babies", drownedJockeyOnlyBaby); + drownedJockeyChance = getDouble("mobs.drowned.jockey.chance", drownedJockeyChance); @@ -19953,6 +20065,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean elderGuardianRidable = false; + public boolean elderGuardianControllable = true; + public double elderGuardianMaxHealth = 80.0D; ++ public double elderGuardianScale = 1.0D; + public boolean elderGuardianTakeDamageFromWater = false; + public boolean elderGuardianAlwaysDropExp = false; + private void elderGuardianSettings() { @@ -19964,6 +20077,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.elder_guardian.attributes.max_health", oldValue); + } + elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); ++ elderGuardianScale = Mth.clamp(getDouble("mobs.elder_guardian.attributes.scale", elderGuardianScale), 0.0625D, 16.0D); + elderGuardianTakeDamageFromWater = getBoolean("mobs.elder_guardian.takes-damage-from-water", elderGuardianTakeDamageFromWater); + elderGuardianAlwaysDropExp = getBoolean("mobs.elder_guardian.always-drop-exp", elderGuardianAlwaysDropExp); + } @@ -20007,6 +20121,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean endermanRidableInWater = true; + public boolean endermanControllable = true; + public double endermanMaxHealth = 40.0D; ++ public double endermanScale = 1.0D; + public boolean endermanAllowGriefing = true; + public boolean endermanDespawnEvenWithBlock = false; + public boolean endermanBypassMobGriefing = false; @@ -20031,6 +20146,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.enderman.aggressive-towards-spawned-endermites", null); + } + endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); ++ endermanScale = Mth.clamp(getDouble("mobs.enderman.attributes.scale", endermanScale), 0.0625D, 16.0D); + endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); + endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); + endermanBypassMobGriefing = getBoolean("mobs.enderman.bypass-mob-griefing", endermanBypassMobGriefing); @@ -20047,6 +20163,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean endermiteRidableInWater = true; + public boolean endermiteControllable = true; + public double endermiteMaxHealth = 8.0D; ++ public double endermiteScale = 1.0D; + public boolean endermiteTakeDamageFromWater = false; + public boolean endermiteAlwaysDropExp = false; + private void endermiteSettings() { @@ -20059,6 +20176,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.endermite.attributes.max_health", oldValue); + } + endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); ++ endermiteScale = Mth.clamp(getDouble("mobs.endermite.attributes.scale", endermiteScale), 0.0625D, 16.0D); + endermiteTakeDamageFromWater = getBoolean("mobs.endermite.takes-damage-from-water", endermiteTakeDamageFromWater); + endermiteAlwaysDropExp = getBoolean("mobs.endermite.always-drop-exp", endermiteAlwaysDropExp); + } @@ -20067,6 +20185,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean evokerRidableInWater = true; + public boolean evokerControllable = true; + public double evokerMaxHealth = 24.0D; ++ public double evokerScale = 1.0D; + public boolean evokerBypassMobGriefing = false; + public boolean evokerTakeDamageFromWater = false; + public boolean evokerAlwaysDropExp = false; @@ -20080,6 +20199,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.evoker.attributes.max_health", oldValue); + } + evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); ++ evokerScale = Mth.clamp(getDouble("mobs.evoker.attributes.scale", evokerScale), 0.0625D, 16.0D); + evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); + evokerTakeDamageFromWater = getBoolean("mobs.evoker.takes-damage-from-water", evokerTakeDamageFromWater); + evokerAlwaysDropExp = getBoolean("mobs.evoker.always-drop-exp", evokerAlwaysDropExp); @@ -20089,6 +20209,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean foxRidableInWater = true; + public boolean foxControllable = true; + public double foxMaxHealth = 10.0D; ++ public double foxScale = 1.0D; + public boolean foxTypeChangesWithTulips = false; + public int foxBreedingTicks = 6000; + public boolean foxBypassMobGriefing = false; @@ -20104,6 +20225,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.fox.attributes.max_health", oldValue); + } + foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); ++ foxScale = Mth.clamp(getDouble("mobs.fox.attributes.scale", foxScale), 0.0625D, 16.0D); + foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); + foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); + foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); @@ -20129,6 +20251,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean ghastControllable = true; + public double ghastMaxY = 320D; + public double ghastMaxHealth = 10.0D; ++ public double ghastScale = 1.0D; + public boolean ghastTakeDamageFromWater = false; + public boolean ghastAlwaysDropExp = false; + private void ghastSettings() { @@ -20142,6 +20265,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.ghast.attributes.max_health", oldValue); + } + ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); ++ ghastScale = Mth.clamp(getDouble("mobs.ghast.attributes.scale", ghastScale), 0.0625D, 16.0D); + ghastTakeDamageFromWater = getBoolean("mobs.ghast.takes-damage-from-water", ghastTakeDamageFromWater); + ghastAlwaysDropExp = getBoolean("mobs.ghast.always-drop-exp", ghastAlwaysDropExp); + } @@ -20152,6 +20276,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public double giantMovementSpeed = 0.5D; + public double giantAttackDamage = 50.0D; + public double giantMaxHealth = 100.0D; ++ public double giantScale = 1.0D; + public float giantStepHeight = 2.0F; + public float giantJumpHeight = 1.0F; + public boolean giantHaveAI = false; @@ -20174,6 +20299,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.giant.attributes.max_health", oldValue); + } + giantMaxHealth = getDouble("mobs.giant.attributes.max_health", giantMaxHealth); ++ giantScale = Mth.clamp(getDouble("mobs.giant.attributes.scale", giantScale), 0.0625D, 16.0D); + giantStepHeight = (float) getDouble("mobs.giant.step-height", giantStepHeight); + giantJumpHeight = (float) getDouble("mobs.giant.jump-height", giantJumpHeight); + giantHaveAI = getBoolean("mobs.giant.have-ai", giantHaveAI); @@ -20185,6 +20311,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean glowSquidRidable = false; + public boolean glowSquidControllable = true; + public double glowSquidMaxHealth = 10.0D; ++ public double glowSquidScale = 1.0D; + public boolean glowSquidsCanFly = false; + public boolean glowSquidTakeDamageFromWater = false; + public boolean glowSquidAlwaysDropExp = false; @@ -20192,6 +20319,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); + glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); ++ glowSquidScale = Mth.clamp(getDouble("mobs.glow_squid.attributes.scale", glowSquidScale), 0.0625D, 16.0D); + glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); + glowSquidTakeDamageFromWater = getBoolean("mobs.glow_squid.takes-damage-from-water", glowSquidTakeDamageFromWater); + glowSquidAlwaysDropExp = getBoolean("mobs.glow_squid.always-drop-exp", glowSquidAlwaysDropExp); @@ -20201,6 +20329,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean goatRidableInWater = true; + public boolean goatControllable = true; + public double goatMaxHealth = 10.0D; ++ public double goatScale = 1.0D; + public int goatBreedingTicks = 6000; + public boolean goatTakeDamageFromWater = false; + public boolean goatAlwaysDropExp = false; @@ -20209,6 +20338,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); + goatControllable = getBoolean("mobs.goat.controllable", goatControllable); + goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); ++ goatScale = Mth.clamp(getDouble("mobs.goat.attributes.scale", goatScale), 0.0625D, 16.0D); + goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); + goatTakeDamageFromWater = getBoolean("mobs.goat.takes-damage-from-water", goatTakeDamageFromWater); + goatAlwaysDropExp = getBoolean("mobs.goat.always-drop-exp", goatAlwaysDropExp); @@ -20217,6 +20347,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean guardianRidable = false; + public boolean guardianControllable = true; + public double guardianMaxHealth = 30.0D; ++ public double guardianScale = 1.0D; + public boolean guardianTakeDamageFromWater = false; + public boolean guardianAlwaysDropExp = false; + private void guardianSettings() { @@ -20228,6 +20359,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.guardian.attributes.max_health", oldValue); + } + guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); ++ guardianScale = Mth.clamp(getDouble("mobs.guardian.attributes.scale", guardianScale), 0.0625D, 16.0D); + guardianTakeDamageFromWater = getBoolean("mobs.guardian.takes-damage-from-water", guardianTakeDamageFromWater); + guardianAlwaysDropExp = getBoolean("mobs.guardian.always-drop-exp", guardianAlwaysDropExp); + } @@ -20236,6 +20368,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean hoglinRidableInWater = true; + public boolean hoglinControllable = true; + public double hoglinMaxHealth = 40.0D; ++ public double hoglinScale = 1.0D; + public int hoglinBreedingTicks = 6000; + public boolean hoglinTakeDamageFromWater = false; + public boolean hoglinAlwaysDropExp = false; @@ -20249,6 +20382,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.hoglin.attributes.max_health", oldValue); + } + hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); ++ hoglinScale = Mth.clamp(getDouble("mobs.hoglin.attributes.scale", hoglinScale), 0.0625D, 16.0D); + hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); + hoglinTakeDamageFromWater = getBoolean("mobs.hoglin.takes-damage-from-water", hoglinTakeDamageFromWater); + hoglinAlwaysDropExp = getBoolean("mobs.hoglin.always-drop-exp", hoglinAlwaysDropExp); @@ -20288,6 +20422,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean huskRidableInWater = true; + public boolean huskControllable = true; + public double huskMaxHealth = 20.0D; ++ public double huskScale = 1.0D; + public double huskSpawnReinforcements = 0.1D; + public boolean huskJockeyOnlyBaby = true; + public double huskJockeyChance = 0.05D; @@ -20304,6 +20439,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.husk.attributes.max_health", oldValue); + } + huskMaxHealth = getDouble("mobs.husk.attributes.max_health", huskMaxHealth); ++ huskScale = Mth.clamp(getDouble("mobs.husk.attributes.scale", huskScale), 0.0625D, 16.0D); + huskSpawnReinforcements = getDouble("mobs.husk.attributes.spawn_reinforcements", huskSpawnReinforcements); + huskJockeyOnlyBaby = getBoolean("mobs.husk.jockey.only-babies", huskJockeyOnlyBaby); + huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); @@ -20318,6 +20454,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public double illusionerMovementSpeed = 0.5D; + public double illusionerFollowRange = 18.0D; + public double illusionerMaxHealth = 32.0D; ++ public double illusionerScale = 1.0D; + public boolean illusionerTakeDamageFromWater = false; + public boolean illusionerAlwaysDropExp = false; + private void illusionerSettings() { @@ -20336,6 +20473,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.illusioner.attributes.max_health", oldValue); + } + illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); ++ illusionerScale = Mth.clamp(getDouble("mobs.illusioner.attributes.scale", illusionerScale), 0.0625D, 16.0D); + illusionerTakeDamageFromWater = getBoolean("mobs.illusioner.takes-damage-from-water", illusionerTakeDamageFromWater); + illusionerAlwaysDropExp = getBoolean("mobs.illusioner.always-drop-exp", illusionerAlwaysDropExp); + } @@ -20345,6 +20483,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean ironGolemControllable = true; + public boolean ironGolemCanSwim = false; + public double ironGolemMaxHealth = 100.0D; ++ public double ironGolemScale = 1.0D; + public boolean ironGolemTakeDamageFromWater = false; + public boolean ironGolemPoppyCalm = false; + public boolean ironGolemHealCalm = false; @@ -20360,6 +20499,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.iron_golem.attributes.max_health", oldValue); + } + ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); ++ ironGolemScale = Mth.clamp(getDouble("mobs.iron_golem.attributes.scale", ironGolemScale), 0.0625D, 16.0D); + ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater); + ironGolemPoppyCalm = getBoolean("mobs.iron_golem.poppy-calms-anger", ironGolemPoppyCalm); + ironGolemHealCalm = getBoolean("mobs.iron_golem.healing-calms-anger", ironGolemHealCalm); @@ -20432,6 +20572,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean mooshroomRidableInWater = true; + public boolean mooshroomControllable = true; + public double mooshroomMaxHealth = 10.0D; ++ public double mooshroomScale = 1.0D; + public int mooshroomBreedingTicks = 6000; + public boolean mooshroomTakeDamageFromWater = false; + public boolean mooshroomAlwaysDropExp = false; @@ -20445,6 +20586,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.mooshroom.attributes.max_health", oldValue); + } + mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); ++ mooshroomScale = Mth.clamp(getDouble("mobs.mooshroom.attributes.scale", mooshroomScale), 0.0625D, 16.0D); + mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); + mooshroomTakeDamageFromWater = getBoolean("mobs.mooshroom.takes-damage-from-water", mooshroomTakeDamageFromWater); + mooshroomAlwaysDropExp = getBoolean("mobs.mooshroom.always-drop-exp", mooshroomAlwaysDropExp); @@ -20484,6 +20626,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean ocelotRidableInWater = true; + public boolean ocelotControllable = true; + public double ocelotMaxHealth = 10.0D; ++ public double ocelotScale = 1.0D; + public int ocelotBreedingTicks = 6000; + public boolean ocelotTakeDamageFromWater = false; + public boolean ocelotAlwaysDropExp = false; @@ -20498,6 +20641,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.ocelot.attributes.max_health", oldValue); + } + ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ++ ocelotScale = Mth.clamp(getDouble("mobs.ocelot.attributes.scale", ocelotScale), 0.0625D, 16.0D); + ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); + ocelotTakeDamageFromWater = getBoolean("mobs.ocelot.takes-damage-from-water", ocelotTakeDamageFromWater); + ocelotAlwaysDropExp = getBoolean("mobs.ocelot.always-drop-exp", ocelotAlwaysDropExp); @@ -20508,6 +20652,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean pandaRidableInWater = true; + public boolean pandaControllable = true; + public double pandaMaxHealth = 20.0D; ++ public double pandaScale = 1.0D; + public int pandaBreedingTicks = 6000; + public boolean pandaTakeDamageFromWater = false; + public boolean pandaAlwaysDropExp = false; @@ -20521,6 +20666,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.panda.attributes.max_health", oldValue); + } + pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); ++ pandaScale = Mth.clamp(getDouble("mobs.panda.attributes.scale", pandaScale), 0.0625D, 16.0D); + pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); + pandaTakeDamageFromWater = getBoolean("mobs.panda.takes-damage-from-water", pandaTakeDamageFromWater); + pandaAlwaysDropExp = getBoolean("mobs.panda.always-drop-exp", pandaAlwaysDropExp); @@ -20531,6 +20677,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean parrotControllable = true; + public double parrotMaxY = 320D; + public double parrotMaxHealth = 6.0D; ++ public double parrotScale = 1.0D; + public boolean parrotTakeDamageFromWater = false; + public boolean parrotBreedable = false; + public boolean parrotAlwaysDropExp = false; @@ -20545,6 +20692,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.parrot.attributes.max_health", oldValue); + } + parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); ++ parrotScale = Mth.clamp(getDouble("mobs.parrot.attributes.scale", parrotScale), 0.0625D, 16.0D); + parrotTakeDamageFromWater = getBoolean("mobs.parrot.takes-damage-from-water", parrotTakeDamageFromWater); + parrotBreedable = getBoolean("mobs.parrot.can-breed", parrotBreedable); + parrotAlwaysDropExp = getBoolean("mobs.parrot.always-drop-exp", parrotAlwaysDropExp); @@ -20627,6 +20775,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean pigRidableInWater = false; + public boolean pigControllable = true; + public double pigMaxHealth = 10.0D; ++ public double pigScale = 1.0D; + public boolean pigGiveSaddleBack = false; + public int pigBreedingTicks = 6000; + public boolean pigTakeDamageFromWater = false; @@ -20641,6 +20790,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.pig.attributes.max_health", oldValue); + } + pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); ++ pigScale = Mth.clamp(getDouble("mobs.pig.attributes.scale", pigScale), 0.0625D, 16.0D); + pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); + pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); + pigTakeDamageFromWater = getBoolean("mobs.pig.takes-damage-from-water", pigTakeDamageFromWater); @@ -20651,6 +20801,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean piglinRidableInWater = true; + public boolean piglinControllable = true; + public double piglinMaxHealth = 16.0D; ++ public double piglinScale = 1.0D; + public boolean piglinBypassMobGriefing = false; + public boolean piglinTakeDamageFromWater = false; + public int piglinPortalSpawnModifier = 2000; @@ -20667,6 +20818,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.piglin.attributes.max_health", oldValue); + } + piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); ++ piglinScale = Mth.clamp(getDouble("mobs.piglin.attributes.scale", piglinScale), 0.0625D, 16.0D); + piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); + piglinTakeDamageFromWater = getBoolean("mobs.piglin.takes-damage-from-water", piglinTakeDamageFromWater); + piglinPortalSpawnModifier = getInt("mobs.piglin.portal-spawn-modifier", piglinPortalSpawnModifier); @@ -20679,6 +20831,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean piglinBruteRidableInWater = true; + public boolean piglinBruteControllable = true; + public double piglinBruteMaxHealth = 50.0D; ++ public double piglinBruteScale = 1.0D; + public boolean piglinBruteTakeDamageFromWater = false; + public boolean piglinBruteAlwaysDropExp = false; + private void piglinBruteSettings() { @@ -20691,6 +20844,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.piglin_brute.attributes.max_health", oldValue); + } + piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); ++ piglinBruteScale = Mth.clamp(getDouble("mobs.piglin_brute.attributes.scale", piglinBruteScale), 0.0625D, 16.0D); + piglinBruteTakeDamageFromWater = getBoolean("mobs.piglin_brute.takes-damage-from-water", piglinBruteTakeDamageFromWater); + piglinBruteAlwaysDropExp = getBoolean("mobs.piglin_brute.always-drop-exp", piglinBruteAlwaysDropExp); + } @@ -20699,6 +20853,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean pillagerRidableInWater = true; + public boolean pillagerControllable = true; + public double pillagerMaxHealth = 24.0D; ++ public double pillagerScale = 1.0D; + public boolean pillagerBypassMobGriefing = false; + public boolean pillagerTakeDamageFromWater = false; + public boolean pillagerAlwaysDropExp = false; @@ -20712,6 +20867,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.pillager.attributes.max_health", oldValue); + } + pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); ++ pillagerScale = Mth.clamp(getDouble("mobs.pillager.attributes.scale", pillagerScale), 0.0625D, 16.0D); + pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); + pillagerTakeDamageFromWater = getBoolean("mobs.pillager.takes-damage-from-water", pillagerTakeDamageFromWater); + pillagerAlwaysDropExp = getBoolean("mobs.pillager.always-drop-exp", pillagerAlwaysDropExp); @@ -20721,6 +20877,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean polarBearRidableInWater = true; + public boolean polarBearControllable = true; + public double polarBearMaxHealth = 30.0D; ++ public double polarBearScale = 1.0D; + public String polarBearBreedableItemString = ""; + public Item polarBearBreedableItem = null; + public int polarBearBreedingTicks = 6000; @@ -20736,6 +20893,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.polar_bear.attributes.max_health", oldValue); + } + polarBearMaxHealth = getDouble("mobs.polar_bear.attributes.max_health", polarBearMaxHealth); ++ polarBearScale = Mth.clamp(getDouble("mobs.polar_bear.attributes.scale", polarBearScale), 0.0625D, 16.0D); + polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); + Item item = BuiltInRegistries.ITEM.get(ResourceLocation.parse(polarBearBreedableItemString)); + if (item != Items.AIR) polarBearBreedableItem = item; @@ -20747,6 +20905,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean pufferfishRidable = false; + public boolean pufferfishControllable = true; + public double pufferfishMaxHealth = 3.0D; ++ public double pufferfishScale = 1.0D; + public boolean pufferfishTakeDamageFromWater = false; + public boolean pufferfishAlwaysDropExp = false; + private void pufferfishSettings() { @@ -20758,6 +20917,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.pufferfish.attributes.max_health", oldValue); + } + pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); ++ pufferfishScale = Mth.clamp(getDouble("mobs.pufferfish.attributes.scale", pufferfishScale), 0.0625D, 16.0D); + pufferfishTakeDamageFromWater = getBoolean("mobs.pufferfish.takes-damage-from-water", pufferfishTakeDamageFromWater); + pufferfishAlwaysDropExp = getBoolean("mobs.pufferfish.always-drop-exp", pufferfishAlwaysDropExp); + } @@ -20766,6 +20926,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean rabbitRidableInWater = true; + public boolean rabbitControllable = true; + public double rabbitMaxHealth = 3.0D; ++ public double rabbitScale = 1.0D; + public double rabbitNaturalToast = 0.0D; + public double rabbitNaturalKiller = 0.0D; + public int rabbitBreedingTicks = 6000; @@ -20782,6 +20943,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.rabbit.attributes.max_health", oldValue); + } + rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); ++ rabbitScale = Mth.clamp(getDouble("mobs.rabbit.attributes.scale", rabbitScale), 0.0625D, 16.0D); + rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); + rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); + rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); @@ -20794,6 +20956,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean ravagerRidableInWater = false; + public boolean ravagerControllable = true; + public double ravagerMaxHealth = 100.0D; ++ public double ravagerScale = 1.0D; + public boolean ravagerBypassMobGriefing = false; + public boolean ravagerTakeDamageFromWater = false; + public List ravagerGriefableBlocks = new ArrayList<>(); @@ -20809,6 +20972,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.ravager.attributes.max_health", oldValue); + } + ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ++ ravagerScale = Mth.clamp(getDouble("mobs.ravager.attributes.scale", ravagerScale), 0.0625D, 16.0D); + ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); + ravagerTakeDamageFromWater = getBoolean("mobs.ravager.takes-damage-from-water", ravagerTakeDamageFromWater); + getList("mobs.ravager.griefable-blocks", new ArrayList(){{ @@ -20835,6 +20999,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean salmonRidable = false; + public boolean salmonControllable = true; + public double salmonMaxHealth = 3.0D; ++ public double salmonScale = 1.0D; + public boolean salmonTakeDamageFromWater = false; + public boolean salmonAlwaysDropExp = false; + private void salmonSettings() { @@ -20846,6 +21011,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.salmon.attributes.max_health", oldValue); + } + salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); ++ salmonScale = Mth.clamp(getDouble("mobs.salmon.attributes.scale", salmonScale), 0.0625D, 16.0D); + salmonTakeDamageFromWater = getBoolean("mobs.salmon.takes-damage-from-water", salmonTakeDamageFromWater); + salmonAlwaysDropExp = getBoolean("mobs.salmon.always-drop-exp", salmonAlwaysDropExp); + } @@ -20854,6 +21020,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean sheepRidableInWater = true; + public boolean sheepControllable = true; + public double sheepMaxHealth = 8.0D; ++ public double sheepScale = 1.0D; + public int sheepBreedingTicks = 6000; + public boolean sheepBypassMobGriefing = false; + public boolean sheepTakeDamageFromWater = false; @@ -20868,6 +21035,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.sheep.attributes.max_health", oldValue); + } + sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); ++ sheepScale = Mth.clamp(getDouble("mobs.sheep.attributes.scale", sheepScale), 0.0625D, 16.0D); + sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); + sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); + sheepTakeDamageFromWater = getBoolean("mobs.sheep.takes-damage-from-water", sheepTakeDamageFromWater); @@ -20878,6 +21046,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean shulkerRidableInWater = true; + public boolean shulkerControllable = true; + public double shulkerMaxHealth = 30.0D; ++ public double shulkerScale = 1.0D; + public boolean shulkerTakeDamageFromWater = false; + public float shulkerSpawnFromBulletBaseChance = 1.0F; + public boolean shulkerSpawnFromBulletRequireOpenLid = true; @@ -20896,6 +21065,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.shulker.attributes.max_health", oldValue); + } + shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); ++ shulkerScale = Mth.clamp(getDouble("mobs.shulker.attributes.scale", shulkerScale), 0.0625D, Shulker.MAX_SCALE); + shulkerTakeDamageFromWater = getBoolean("mobs.shulker.takes-damage-from-water", shulkerTakeDamageFromWater); + shulkerSpawnFromBulletBaseChance = (float) getDouble("mobs.shulker.spawn-from-bullet.base-chance", shulkerSpawnFromBulletBaseChance); + shulkerSpawnFromBulletRequireOpenLid = getBoolean("mobs.shulker.spawn-from-bullet.require-open-lid", shulkerSpawnFromBulletRequireOpenLid); @@ -20910,6 +21080,9 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean silverfishRidableInWater = true; + public boolean silverfishControllable = true; + public double silverfishMaxHealth = 8.0D; ++ public double silverfishScale = 1.0D; ++ public double silverfishMovementSpeed = 0.25D; ++ public double silverfishAttackDamage = 1.0D; + public boolean silverfishBypassMobGriefing = false; + public boolean silverfishTakeDamageFromWater = false; + public boolean silverfishAlwaysDropExp = false; @@ -20923,6 +21096,9 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.silverfish.attributes.max_health", oldValue); + } + silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); ++ silverfishScale = Mth.clamp(getDouble("mobs.silverfish.attributes.scale", silverfishScale), 0.0625D, 16.0D); ++ silverfishMovementSpeed = getDouble("mobs.silverfish.attributes.movement_speed", silverfishMovementSpeed); ++ silverfishAttackDamage = getDouble("mobs.silverfish.attributes.attack_damage", silverfishAttackDamage); + silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); + silverfishTakeDamageFromWater = getBoolean("mobs.silverfish.takes-damage-from-water", silverfishTakeDamageFromWater); + silverfishAlwaysDropExp = getBoolean("mobs.silverfish.always-drop-exp", silverfishAlwaysDropExp); @@ -20932,6 +21108,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean skeletonRidableInWater = true; + public boolean skeletonControllable = true; + public double skeletonMaxHealth = 20.0D; ++ public double skeletonScale = 1.0D; + public boolean skeletonTakeDamageFromWater = false; + public boolean skeletonAlwaysDropExp = false; + public double skeletonHeadVisibilityPercent = 0.5D; @@ -20948,6 +21125,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.skeleton.attributes.max_health", oldValue); + } + skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); ++ skeletonScale = Mth.clamp(getDouble("mobs.skeleton.attributes.scale", skeletonScale), 0.0625D, 16.0D); + skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); + skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); + skeletonHeadVisibilityPercent = getDouble("mobs.skeleton.head-visibility-percent", skeletonHeadVisibilityPercent); @@ -21028,6 +21206,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean snowGolemControllable = true; + public boolean snowGolemLeaveTrailWhenRidden = false; + public double snowGolemMaxHealth = 4.0D; ++ public double snowGolemScale = 1.0D; + public boolean snowGolemPutPumpkinBack = false; + public int snowGolemSnowBallMin = 20; + public int snowGolemSnowBallMax = 20; @@ -21047,6 +21226,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.snow_golem.attributes.max_health", oldValue); + } + snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); ++ snowGolemScale = Mth.clamp(getDouble("mobs.snow_golem.attributes.scale", snowGolemScale), 0.0625D, 16.0D); + snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); + snowGolemSnowBallMin = getInt("mobs.snow_golem.min-shoot-interval-ticks", snowGolemSnowBallMin); + snowGolemSnowBallMax = getInt("mobs.snow_golem.max-shoot-interval-ticks", snowGolemSnowBallMax); @@ -21061,18 +21241,21 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean snifferRidableInWater = true; + public boolean snifferControllable = true; + public double snifferMaxHealth = 14.0D; ++ public double snifferScale = 1.0D; + public int snifferBreedingTicks = 6000; + private void snifferSettings() { + snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); + snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); + snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable); + snifferMaxHealth = getDouble("mobs.sniffer.attributes.max_health", snifferMaxHealth); ++ snifferScale = Mth.clamp(getDouble("mobs.sniffer.attributes.scale", snifferScale), 0.0625D, 16.0D); + snifferBreedingTicks = getInt("mobs.sniffer.breeding-delay-ticks", snifferBreedingTicks); + } + + public boolean squidRidable = false; + public boolean squidControllable = true; + public double squidMaxHealth = 10.0D; ++ public double squidScale = 1.0D; + public boolean squidImmuneToEAR = true; + public double squidOffsetWaterCheck = 0.0D; + public boolean squidsCanFly = false; @@ -21087,6 +21270,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.squid.attributes.max_health", oldValue); + } + squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); ++ squidScale = Mth.clamp(getDouble("mobs.squid.attributes.scale", squidScale), 0.0625D, 16.0D); + squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); + squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); + squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); @@ -21098,6 +21282,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean spiderRidableInWater = false; + public boolean spiderControllable = true; + public double spiderMaxHealth = 16.0D; ++ public double spiderScale = 1.0D; + public boolean spiderTakeDamageFromWater = false; + public boolean spiderAlwaysDropExp = false; + private void spiderSettings() { @@ -21110,6 +21295,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.spider.attributes.max_health", oldValue); + } + spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); ++ spiderScale = Mth.clamp(getDouble("mobs.spider.attributes.scale", spiderScale), 0.0625D, 16.0D); + spiderTakeDamageFromWater = getBoolean("mobs.spider.takes-damage-from-water", spiderTakeDamageFromWater); + spiderAlwaysDropExp = getBoolean("mobs.spider.always-drop-exp", spiderAlwaysDropExp); + } @@ -21118,6 +21304,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean strayRidableInWater = true; + public boolean strayControllable = true; + public double strayMaxHealth = 20.0D; ++ public double strayScale = 1.0D; + public boolean strayTakeDamageFromWater = false; + public boolean strayAlwaysDropExp = false; + private void straySettings() { @@ -21130,6 +21317,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.stray.attributes.max_health", oldValue); + } + strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); ++ strayScale = Mth.clamp(getDouble("mobs.stray.attributes.scale", strayScale), 0.0625D, 16.0D); + strayTakeDamageFromWater = getBoolean("mobs.stray.takes-damage-from-water", strayTakeDamageFromWater); + strayAlwaysDropExp = getBoolean("mobs.stray.always-drop-exp", strayAlwaysDropExp); + } @@ -21138,6 +21326,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean striderRidableInWater = false; + public boolean striderControllable = true; + public double striderMaxHealth = 20.0D; ++ public double striderScale = 1.0D; + public int striderBreedingTicks = 6000; + public boolean striderGiveSaddleBack = false; + public boolean striderTakeDamageFromWater = true; @@ -21152,6 +21341,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.strider.attributes.max_health", oldValue); + } + striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); ++ striderScale = Mth.clamp(getDouble("mobs.strider.attributes.scale", striderScale), 0.0625D, 16.0D); + striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); + striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); + striderTakeDamageFromWater = getBoolean("mobs.strider.takes-damage-from-water", striderTakeDamageFromWater); @@ -21204,6 +21394,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean tropicalFishRidable = false; + public boolean tropicalFishControllable = true; + public double tropicalFishMaxHealth = 3.0D; ++ public double tropicalFishScale = 1.0D; + public boolean tropicalFishTakeDamageFromWater = false; + public boolean tropicalFishAlwaysDropExp = false; + private void tropicalFishSettings() { @@ -21215,6 +21406,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.tropical_fish.attributes.max_health", oldValue); + } + tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); ++ tropicalFishScale = Mth.clamp(getDouble("mobs.tropical_fish.attributes.scale", tropicalFishScale), 0.0625D, 16.0D); + tropicalFishTakeDamageFromWater = getBoolean("mobs.tropical_fish.takes-damage-from-water", tropicalFishTakeDamageFromWater); + tropicalFishAlwaysDropExp = getBoolean("mobs.tropical_fish.always-drop-exp", tropicalFishAlwaysDropExp); + } @@ -21223,6 +21415,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean turtleRidableInWater = true; + public boolean turtleControllable = true; + public double turtleMaxHealth = 30.0D; ++ public double turtleScale = 1.0D; + public int turtleBreedingTicks = 6000; + public boolean turtleTakeDamageFromWater = false; + public boolean turtleAlwaysDropExp = false; @@ -21236,6 +21429,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.turtle.attributes.max_health", oldValue); + } + turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); ++ turtleScale = Mth.clamp(getDouble("mobs.turtle.attributes.scale", turtleScale), 0.0625D, 16.0D); + turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); + turtleTakeDamageFromWater = getBoolean("mobs.turtle.takes-damage-from-water", turtleTakeDamageFromWater); + turtleAlwaysDropExp = getBoolean("mobs.turtle.always-drop-exp", turtleAlwaysDropExp); @@ -21246,6 +21440,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean vexControllable = true; + public double vexMaxY = 320D; + public double vexMaxHealth = 14.0D; ++ public double vexScale = 1.0D; + public boolean vexTakeDamageFromWater = false; + public boolean vexAlwaysDropExp = false; + private void vexSettings() { @@ -21259,6 +21454,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.vex.attributes.max_health", oldValue); + } + vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); ++ vexScale = Mth.clamp(getDouble("mobs.vex.attributes.scale", vexScale), 0.0625D, 16.0D); + vexTakeDamageFromWater = getBoolean("mobs.vex.takes-damage-from-water", vexTakeDamageFromWater); + vexAlwaysDropExp = getBoolean("mobs.vex.always-drop-exp", vexAlwaysDropExp); + } @@ -21267,6 +21463,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean villagerRidableInWater = true; + public boolean villagerControllable = true; + public double villagerMaxHealth = 20.0D; ++ public double villagerScale = 1.0D; + public boolean villagerFollowEmeraldBlock = false; + public boolean villagerCanBeLeashed = false; + public boolean villagerCanBreed = true; @@ -21296,6 +21493,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.villager.attributes.max_health", oldValue); + } + villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); ++ villagerScale = Mth.clamp(getDouble("mobs.villager.attributes.scale", villagerScale), 0.0625D, 16.0D); + villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); + villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); + villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); @@ -21330,6 +21528,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean vindicatorRidableInWater = true; + public boolean vindicatorControllable = true; + public double vindicatorMaxHealth = 24.0D; ++ public double vindicatorScale = 1.0D; + public double vindicatorJohnnySpawnChance = 0D; + public boolean vindicatorTakeDamageFromWater = false; + public boolean vindicatorAlwaysDropExp = false; @@ -21343,6 +21542,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.vindicator.attributes.max_health", oldValue); + } + vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); ++ vindicatorScale = Mth.clamp(getDouble("mobs.vindicator.attributes.scale", vindicatorScale), 0.0625D, 16.0D); + vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); + vindicatorTakeDamageFromWater = getBoolean("mobs.vindicator.takes-damage-from-water", vindicatorTakeDamageFromWater); + vindicatorAlwaysDropExp = getBoolean("mobs.vindicator.always-drop-exp", vindicatorAlwaysDropExp); @@ -21352,6 +21552,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean wanderingTraderRidableInWater = true; + public boolean wanderingTraderControllable = true; + public double wanderingTraderMaxHealth = 20.0D; ++ public double wanderingTraderScale = 1.0D; + public boolean wanderingTraderFollowEmeraldBlock = false; + public boolean wanderingTraderCanBeLeashed = false; + public boolean wanderingTraderTakeDamageFromWater = false; @@ -21367,6 +21568,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.wandering_trader.attributes.max_health", oldValue); + } + wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); ++ wanderingTraderScale = Mth.clamp(getDouble("mobs.wandering_trader.attributes.scale", wanderingTraderScale), 0.0625D, 16.0D); + wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); + wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); + wanderingTraderTakeDamageFromWater = getBoolean("mobs.wandering_trader.takes-damage-from-water", wanderingTraderTakeDamageFromWater); @@ -21387,6 +21589,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean witchRidableInWater = true; + public boolean witchControllable = true; + public double witchMaxHealth = 26.0D; ++ public double witchScale = 1.0D; + public boolean witchTakeDamageFromWater = false; + public boolean witchAlwaysDropExp = false; + private void witchSettings() { @@ -21399,6 +21602,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.witch.attributes.max_health", oldValue); + } + witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); ++ witchScale = Mth.clamp(getDouble("mobs.witch.attributes.scale", witchScale), 0.0625D, 16.0D); + witchTakeDamageFromWater = getBoolean("mobs.witch.takes-damage-from-water", witchTakeDamageFromWater); + witchAlwaysDropExp = getBoolean("mobs.witch.always-drop-exp", witchAlwaysDropExp); + } @@ -21408,6 +21612,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean witherControllable = true; + public double witherMaxY = 320D; + public double witherMaxHealth = 300.0D; ++ public double witherScale = 1.0D; + public float witherHealthRegenAmount = 1.0f; + public int witherHealthRegenDelay = 20; + public boolean witherBypassMobGriefing = false; @@ -21431,6 +21636,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.wither.attributes.max_health", oldValue); + } + witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); ++ witherScale = Mth.clamp(getDouble("mobs.wither.attributes.scale", witherScale), 0.0625D, 16.0D); + witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); + witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); + witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); @@ -21445,6 +21651,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean witherSkeletonRidableInWater = true; + public boolean witherSkeletonControllable = true; + public double witherSkeletonMaxHealth = 20.0D; ++ public double witherSkeletonScale = 1.0D; + public boolean witherSkeletonTakeDamageFromWater = false; + public boolean witherSkeletonAlwaysDropExp = false; + private void witherSkeletonSettings() { @@ -21457,6 +21664,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.wither_skeleton.attributes.max_health", oldValue); + } + witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); ++ witherSkeletonScale = Mth.clamp(getDouble("mobs.wither_skeleton.attributes.scale", witherSkeletonScale), 0.0625D, 16.0D); + witherSkeletonTakeDamageFromWater = getBoolean("mobs.wither_skeleton.takes-damage-from-water", witherSkeletonTakeDamageFromWater); + witherSkeletonAlwaysDropExp = getBoolean("mobs.wither_skeleton.always-drop-exp", witherSkeletonAlwaysDropExp); + } @@ -21465,6 +21673,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean wolfRidableInWater = true; + public boolean wolfControllable = true; + public double wolfMaxHealth = 8.0D; ++ public double wolfScale = 1.0D; + public DyeColor wolfDefaultCollarColor = DyeColor.RED; + public boolean wolfMilkCuresRabies = true; + public double wolfNaturalRabid = 0.0D; @@ -21481,6 +21690,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.wolf.attributes.max_health", oldValue); + } + wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); ++ wolfScale = Mth.clamp(getDouble("mobs.wolf.attributes.scale", wolfScale), 0.0625D, 16.0D); + try { + wolfDefaultCollarColor = DyeColor.valueOf(getString("mobs.wolf.default-collar-color", wolfDefaultCollarColor.name())); + } catch (IllegalArgumentException ignore) { @@ -21497,6 +21707,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean zoglinRidableInWater = true; + public boolean zoglinControllable = true; + public double zoglinMaxHealth = 40.0D; ++ public double zoglinScale = 1.0D; + public boolean zoglinTakeDamageFromWater = false; + public boolean zoglinAlwaysDropExp = false; + private void zoglinSettings() { @@ -21509,6 +21720,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.zoglin.attributes.max_health", oldValue); + } + zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); ++ zoglinScale = Mth.clamp(getDouble("mobs.zoglin.attributes.scale", zoglinScale), 0.0625D, 16.0D); + zoglinTakeDamageFromWater = getBoolean("mobs.zoglin.takes-damage-from-water", zoglinTakeDamageFromWater); + zoglinAlwaysDropExp = getBoolean("mobs.zoglin.always-drop-exp", zoglinAlwaysDropExp); + } @@ -21517,6 +21729,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean zombieRidableInWater = true; + public boolean zombieControllable = true; + public double zombieMaxHealth = 20.0D; ++ public double zombieScale = 1.0D; + public double zombieSpawnReinforcements = 0.1D; + public boolean zombieJockeyOnlyBaby = true; + public double zombieJockeyChance = 0.05D; @@ -21536,6 +21749,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.zombie.attributes.max_health", oldValue); + } + zombieMaxHealth = getDouble("mobs.zombie.attributes.max_health", zombieMaxHealth); ++ zombieScale = Mth.clamp(getDouble("mobs.zombie.attributes.scale", zombieScale), 0.0625D, 16.0D); + zombieSpawnReinforcements = getDouble("mobs.zombie.attributes.spawn_reinforcements", zombieSpawnReinforcements); + zombieJockeyOnlyBaby = getBoolean("mobs.zombie.jockey.only-babies", zombieJockeyOnlyBaby); + zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); @@ -21584,6 +21798,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean zombieVillagerRidableInWater = true; + public boolean zombieVillagerControllable = true; + public double zombieVillagerMaxHealth = 20.0D; ++ public double zombieVillagerScale = 1.0D; + public double zombieVillagerSpawnReinforcements = 0.1D; + public boolean zombieVillagerJockeyOnlyBaby = true; + public double zombieVillagerJockeyChance = 0.05D; @@ -21603,6 +21818,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.zombie_villager.attributes.max_health", oldValue); + } + zombieVillagerMaxHealth = getDouble("mobs.zombie_villager.attributes.max_health", zombieVillagerMaxHealth); ++ zombieVillagerScale = Mth.clamp(getDouble("mobs.zombie_villager.attributes.scale", zombieVillagerScale), 0.0625D, 16.0D); + zombieVillagerSpawnReinforcements = getDouble("mobs.zombie_villager.attributes.spawn_reinforcements", zombieVillagerSpawnReinforcements); + zombieVillagerJockeyOnlyBaby = getBoolean("mobs.zombie_villager.jockey.only-babies", zombieVillagerJockeyOnlyBaby); + zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); @@ -21618,6 +21834,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + public boolean zombifiedPiglinRidableInWater = true; + public boolean zombifiedPiglinControllable = true; + public double zombifiedPiglinMaxHealth = 20.0D; ++ public double zombifiedPiglinScale = 1.0D; + public double zombifiedPiglinSpawnReinforcements = 0.0D; + public boolean zombifiedPiglinJockeyOnlyBaby = true; + public double zombifiedPiglinJockeyChance = 0.05D; @@ -21635,6 +21852,7 @@ index 0000000000000000000000000000000000000000..015bab487cf8a1905285a7bf7fcc2b35 + set("mobs.zombified_piglin.attributes.max_health", oldValue); + } + zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); ++ zombifiedPiglinScale = Mth.clamp(getDouble("mobs.zombified_piglin.attributes.scale", zombifiedPiglinScale), 0.0625D, 16.0D); + zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); + zombifiedPiglinJockeyOnlyBaby = getBoolean("mobs.zombified_piglin.jockey.only-babies", zombifiedPiglinJockeyOnlyBaby); + zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); diff --git a/patches/server/0011-Fix-Pufferfish-and-Purpur-patches.patch b/patches/server/0011-Fix-Pufferfish-and-Purpur-patches.patch index da60e1d8..f55eb39a 100644 --- a/patches/server/0011-Fix-Pufferfish-and-Purpur-patches.patch +++ b/patches/server/0011-Fix-Pufferfish-and-Purpur-patches.patch @@ -274,7 +274,7 @@ index ad1ec2578fa428baa6b172c44b6c17e52daa5792..e2ac7e911eb2f46479a9666135894aca if (!this.canTick) { if (this.noTickPoseDirty) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Blaze.java b/src/main/java/net/minecraft/world/entity/monster/Blaze.java -index 1e1824eb80696452951cdbbdacad952ae0a7482b..b38110d4f01cae6746ccd38b5ae047cff8763d65 100644 +index 6c68c1df84e006f9992435f4c8e328c17e88c51c..f86f42863227494f7f71a7813fd49049d04aa081 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Blaze.java +++ b/src/main/java/net/minecraft/world/entity/monster/Blaze.java @@ -72,7 +72,6 @@ public class Blaze extends Monster { @@ -285,7 +285,7 @@ index 1e1824eb80696452951cdbbdacad952ae0a7482b..b38110d4f01cae6746ccd38b5ae047cf @Override public void initAttributes() { -@@ -83,6 +82,7 @@ public class Blaze extends Monster { +@@ -84,6 +83,7 @@ public class Blaze extends Monster { protected boolean isAlwaysExperienceDropper() { return this.level().purpurConfig.blazeAlwaysDropExp; } diff --git a/patches/server/0037-Petal-Async-Pathfinding.patch b/patches/server/0037-Petal-Async-Pathfinding.patch index 9dd1079d..dd4fc97e 100644 --- a/patches/server/0037-Petal-Async-Pathfinding.patch +++ b/patches/server/0037-Petal-Async-Pathfinding.patch @@ -506,10 +506,10 @@ index 222c87e80cb089867ce9a7d2dceebe21b4bfe0de..e57b60f1656d80d1307f0c9b000358a2 } } diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 0422c4184c4823b8572afd398ef96fc6054e8485..4308e6c43a57dd536834e636af82225cd012d274 100644 +index 9a6ec5e465684be7f0d54b1f7e66bdf52603e442..1022ba7c522cc72cdbd73f7f98657072affebc01 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -1146,7 +1146,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1147,7 +1147,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } else { Bee.this.pathfindRandomlyTowards(Bee.this.hivePos); } @@ -518,7 +518,7 @@ index 0422c4184c4823b8572afd398ef96fc6054e8485..4308e6c43a57dd536834e636af82225c boolean flag = this.pathfindDirectlyTowards(Bee.this.hivePos); if (!flag) { -@@ -1208,7 +1208,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1209,7 +1209,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } else { Path pathentity = Bee.this.navigation.getPath(); @@ -562,10 +562,10 @@ index 7c4e7d55874fa968d52eab683e9979ba38e91c2e..da026533b15a1981000e73bba6c5209c } } diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index d1197b313f16f43f60ed242081a6164026e3c6a7..53c205f6ba3d63140a7d9c1f6cea1729326b2558 100644 +index 94de51bf9acb32421838ffe54602310f0263b3c4..16b8cab067f35c89db34394c1203209ae1b91cbd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -295,7 +295,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -296,7 +296,7 @@ public class Drowned extends Zombie implements RangedAttackMob { protected boolean closeToNextPos() { Path pathentity = this.getNavigation().getPath(); @@ -575,10 +575,10 @@ index d1197b313f16f43f60ed242081a6164026e3c6a7..53c205f6ba3d63140a7d9c1f6cea1729 if (blockposition != null) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index 346237b266f3044101d45c69b857f57c701411b3..e56456d6a9e08024a71f0ef80749fb73403e8a55 100644 +index 70650cc6f76bed79a31a9e8c86205910994a920f..844267738769506dc58f30d0396a3b5bab93a42a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -609,10 +609,26 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -610,10 +610,26 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { super(entity, world); } diff --git a/patches/server/0043-Configurable-movement-speed-of-more-entities.patch b/patches/server/0043-Configurable-movement-speed-of-more-entities.patch index ed9c6acc..cbee916b 100644 --- a/patches/server/0043-Configurable-movement-speed-of-more-entities.patch +++ b/patches/server/0043-Configurable-movement-speed-of-more-entities.patch @@ -5,13 +5,13 @@ Subject: [PATCH] Configurable movement speed of more entities diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 53c205f6ba3d63140a7d9c1f6cea1729326b2558..c0840449288338c0baebae59c691188f29e3ee37 100644 +index 16b8cab067f35c89db34394c1203209ae1b91cbd..1a3ec4b39f504d2006fd132d3c0c3dff7f042af7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -91,6 +91,7 @@ public class Drowned extends Zombie implements RangedAttackMob { - @Override +@@ -92,6 +92,7 @@ public class Drowned extends Zombie implements RangedAttackMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.drownedMaxHealth); + this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.drownedScale); + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.drownedMovementSpeed); // Leaf - Configurable drowned movement speed } @@ -29,18 +29,22 @@ index a9285aac811067313c5609d2d5708783736e6cb5..53114ceb212ea341b227f59ebd302d7c @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index e8fb47996c804c1d273d5bada11c70ce924cab51..e01c8cf029e61358261c6ab5dae4d12b5b24d978 100644 +index 4578fc25456361b76c9821f066fd8a628cd4bd67..e528b4df9ce1c7461bd1d461932593c2b55b5786 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -129,6 +129,7 @@ public class Zombie extends Monster { +@@ -129,7 +129,11 @@ public class Zombie extends Monster { @Override public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieMaxHealth); ++<<<<<<< HEAD + this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombieScale); ++======= + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.zombieMovementSpeed); // Leaf - Configurable zombie movement speed ++>>>>>>> 2807e0848 (Configurable movement speed of more entities) } public boolean jockeyOnlyBaby() { -@@ -186,9 +187,15 @@ public class Zombie extends Monster { +@@ -187,9 +191,15 @@ public class Zombie extends Monster { this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); } @@ -70,18 +74,18 @@ index 5ead916772c21d8db98e389984d531aae7f59700..7ac5f6fc44fd5f901c30fe93856ed6b0 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 727ee00adf344e17118d8d61161202664afa4dc2..a1f9087614127fe9d9ad253dc830cd02da95d4dc 100644 +index 1c04fbea0dce4167a0902b92b95d470f562825c2..4f1f816496f8f8564c1dc53ceae5cfb36ff7c880 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -83,6 +83,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - @Override +@@ -84,6 +84,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombifiedPiglinMaxHealth); + this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombifiedPiglinScale); + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.zombifiedPiglinMovementSpeed); // Leaf - Configurable zombifiedPiglin movement speed } @Override -@@ -124,9 +125,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -125,9 +126,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); } @@ -97,10 +101,10 @@ index 727ee00adf344e17118d8d61161202664afa4dc2..a1f9087614127fe9d9ad253dc830cd02 @Override public EntityDimensions getDefaultDimensions(Pose pose) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774fba9febe3 100644 +index 7cf54e37e1c70ebb7b1606074c3c7fe73f31a3ef..a0fa8b10cf53e5cb75385f40acdb0ba9d44b536f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1541,6 +1541,7 @@ public class PurpurWorldConfig { +@@ -1573,6 +1573,7 @@ public class PurpurWorldConfig { public boolean drownedTakeDamageFromWater = false; public boolean drownedBreakDoors = false; public boolean drownedAlwaysDropExp = false; @@ -108,7 +112,7 @@ index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774f private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -1558,6 +1559,7 @@ public class PurpurWorldConfig { +@@ -1591,6 +1592,7 @@ public class PurpurWorldConfig { drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); drownedBreakDoors = getBoolean("mobs.drowned.can-break-doors", drownedBreakDoors); drownedAlwaysDropExp = getBoolean("mobs.drowned.always-drop-exp", drownedAlwaysDropExp); @@ -116,7 +120,7 @@ index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774f } public boolean elderGuardianRidable = false; -@@ -1904,6 +1906,7 @@ public class PurpurWorldConfig { +@@ -1960,6 +1962,7 @@ public class PurpurWorldConfig { public boolean huskJockeyTryExistingChickens = true; public boolean huskTakeDamageFromWater = false; public boolean huskAlwaysDropExp = false; @@ -124,7 +128,7 @@ index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774f private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1920,6 +1923,7 @@ public class PurpurWorldConfig { +@@ -1977,6 +1980,7 @@ public class PurpurWorldConfig { huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); huskTakeDamageFromWater = getBoolean("mobs.husk.takes-damage-from-water", huskTakeDamageFromWater); huskAlwaysDropExp = getBoolean("mobs.husk.always-drop-exp", huskAlwaysDropExp); @@ -132,7 +136,7 @@ index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774f } public boolean illusionerRidable = false; -@@ -3136,6 +3140,7 @@ public class PurpurWorldConfig { +@@ -3270,6 +3274,7 @@ public class PurpurWorldConfig { public boolean zombieTakeDamageFromWater = false; public boolean zombieAlwaysDropExp = false; public double zombieHeadVisibilityPercent = 0.5D; @@ -140,7 +144,7 @@ index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774f private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -3155,6 +3160,7 @@ public class PurpurWorldConfig { +@@ -3290,6 +3295,7 @@ public class PurpurWorldConfig { zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); zombieHeadVisibilityPercent = getDouble("mobs.zombie.head-visibility-percent", zombieHeadVisibilityPercent); @@ -148,7 +152,7 @@ index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774f } public boolean zombieHorseRidable = false; -@@ -3203,6 +3209,7 @@ public class PurpurWorldConfig { +@@ -3339,6 +3345,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; public boolean zombieVillagerAlwaysDropExp = false; @@ -156,7 +160,7 @@ index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774f private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -3222,6 +3229,7 @@ public class PurpurWorldConfig { +@@ -3359,6 +3366,7 @@ public class PurpurWorldConfig { zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled); zombieVillagerAlwaysDropExp = getBoolean("mobs.zombie_villager.always-drop-exp", zombieVillagerAlwaysDropExp); @@ -164,7 +168,7 @@ index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774f } public boolean zombifiedPiglinRidable = false; -@@ -3235,6 +3243,7 @@ public class PurpurWorldConfig { +@@ -3373,6 +3381,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; public boolean zombifiedPiglinTakeDamageFromWater = false; public boolean zombifiedPiglinAlwaysDropExp = false; @@ -172,7 +176,7 @@ index 015bab487cf8a1905285a7bf7fcc2b3512549a87..d070fef32287e3926dd3b483de29774f private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -3252,6 +3261,7 @@ public class PurpurWorldConfig { +@@ -3391,6 +3400,7 @@ public class PurpurWorldConfig { zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp); diff --git a/patches/server/0046-Plazma-Add-some-missing-Pufferfish-configurations.patch b/patches/server/0046-Plazma-Add-some-missing-Pufferfish-configurations.patch index 0bff6bd9..32496b6b 100644 --- a/patches/server/0046-Plazma-Add-some-missing-Pufferfish-configurations.patch +++ b/patches/server/0046-Plazma-Add-some-missing-Pufferfish-configurations.patch @@ -10,10 +10,10 @@ Add Pufferfish DAB support for Camel, Sniffer https://github.com/pufferfish-gg/Pufferfish/issues/83 diff --git a/src/main/java/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/src/main/java/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index 7c7b063b0b563716757294792653a705fe7436f9..3d47ddcfd68e4499cf01ce766c72726c1d8a0c26 100644 +index 642a4ec954f74d37348c59b5f79d6be310ce1d3c..97e47ee7e44561641d6dc1722e0a7f519e75082d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/src/main/java/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -156,8 +156,10 @@ public class Armadillo extends Animal { +@@ -157,8 +157,10 @@ public class Armadillo extends Animal { return ArmadilloAi.makeBrain(this.brainProvider().makeBrain(dynamic)); } @@ -42,10 +42,10 @@ index 73d64006d8d655e1d4db179488f6ac0dce56cd05..0d79a57eaf2813fffd21c400e63e9b1f CamelAi.updateActivity(this); super.customServerAiStep(); diff --git a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index 678f1b437a2b04a7f2be90cc496ed960aa5e018e..5c126c8f8bf222a82ca8661c129929db52543c01 100644 +index bab2230f1cf8baa122595f4e48f58d405bedd09d..8c2038e154730b1f796ab34f2555dc88fd542173 100644 --- a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -502,8 +502,10 @@ public class Sniffer extends Animal { +@@ -503,8 +503,10 @@ public class Sniffer extends Animal { return Brain.provider(SnifferAi.MEMORY_TYPES, SnifferAi.SENSOR_TYPES); } diff --git a/patches/server/0047-Plazma-Add-missing-purpur-configuration-options.patch b/patches/server/0047-Plazma-Add-missing-purpur-configuration-options.patch index e73630f3..c6c909aa 100644 --- a/patches/server/0047-Plazma-Add-missing-purpur-configuration-options.patch +++ b/patches/server/0047-Plazma-Add-missing-purpur-configuration-options.patch @@ -9,10 +9,10 @@ Original project: https://github.com/PlazmaMC/PlazmaBukkit Add more Purpur configurable options for entities diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index b80531c3ecb11adc54001373fcde511c4d01ef20..a1dd361a6bfbdeea5ea4f06da90320e928e7fada 100644 +index 82a941117edcca155c04afc11a8e018574db9922..0f30a21820fa7bb7b481ef71bf4722652d2f7ece 100644 --- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -@@ -154,6 +154,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -160,6 +160,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS } // Purpur end @@ -125,10 +125,10 @@ index c51637514bf671c08dbe4e5ac55566b92b5876f9..736e5dbd1587693d33de72ce6a7f8a74 protected PathNavigation createNavigation(Level world) { return new WaterBoundPathNavigation(this, world); diff --git a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index 5c126c8f8bf222a82ca8661c129929db52543c01..71efadbc8e11fe52c6469b6b227a1c29b5eb8626 100644 +index 8c2038e154730b1f796ab34f2555dc88fd542173..f5a7d8b161a896876eccbd4d7e3025f325337042 100644 --- a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -121,6 +121,18 @@ public class Sniffer extends Animal { +@@ -122,6 +122,18 @@ public class Sniffer extends Animal { } // Purpur end @@ -147,7 +147,7 @@ index 5c126c8f8bf222a82ca8661c129929db52543c01..71efadbc8e11fe52c6469b6b227a1c29 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -@@ -505,7 +517,7 @@ public class Sniffer extends Animal { +@@ -506,7 +518,7 @@ public class Sniffer extends Animal { private int behaviorTick; // Leaf - Plazma - Add missing Pufferfish configurations @Override protected void customServerAiStep() { @@ -236,15 +236,14 @@ index 71787e9efaa8a711f4c41849793f01f3087add1a..d0c62588d80414d83326192d30500257 org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d070fef32287e3926dd3b483de29774fba9febe3..7d6433aa42b3f089f536f0e23723c0dca5abe409 100644 +index a0fa8b10cf53e5cb75385f40acdb0ba9d44b536f..53689e7b2f49d482414377cabe2c5497f22b37ba 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1157,10 +1157,20 @@ public class PurpurWorldConfig { - public boolean allayRidable = false; - public boolean allayRidableInWater = true; +@@ -1160,12 +1160,20 @@ public class PurpurWorldConfig { public boolean allayControllable = true; + public double allayMaxHealth = 20.0D; + public double allayScale = 1.0D; + // Leaf start - Plazma - Add missing purpur config options -+ public double allayMaxHealth = 20.0D; + public boolean allayTakeDamageFromWater = false; + public boolean allayAlwaysDropExp = false; + // Leaf end - Plazma - Add missing purpur config options @@ -252,15 +251,16 @@ index d070fef32287e3926dd3b483de29774fba9febe3..7d6433aa42b3f089f536f0e23723c0dc allayRidable = getBoolean("mobs.allay.ridable", allayRidable); allayRidableInWater = getBoolean("mobs.allay.ridable-in-water", allayRidableInWater); allayControllable = getBoolean("mobs.allay.controllable", allayControllable); + allayMaxHealth = getDouble("mobs.allay.attributes.max_health", allayMaxHealth); + allayScale = Mth.clamp(getDouble("mobs.allay.attributes.scale", allayScale), 0.0625D, 16.0D); + // Leaf start - Plazma - Add missing purpur config options -+ allayMaxHealth = getDouble("mobs.allay.max-health", allayMaxHealth); + allayTakeDamageFromWater = getBoolean("mobs.allay.take-damage-from-water", allayTakeDamageFromWater); + allayAlwaysDropExp = getBoolean("mobs.allay.always-drop-exp", allayAlwaysDropExp); + // Leaf end - Plazma - Add missing purpur config options } public boolean armadilloRidable = false; -@@ -1298,6 +1308,10 @@ public class PurpurWorldConfig { +@@ -1315,6 +1323,10 @@ public class PurpurWorldConfig { public double camelMovementSpeedMin = 0.09D; public double camelMovementSpeedMax = 0.09D; public int camelBreedingTicks = 6000; @@ -271,7 +271,7 @@ index d070fef32287e3926dd3b483de29774fba9febe3..7d6433aa42b3f089f536f0e23723c0dc private void camelSettings() { camelRidableInWater = getBoolean("mobs.camel.ridable-in-water", camelRidableInWater); camelMaxHealthMin = getDouble("mobs.camel.attributes.max_health.min", camelMaxHealthMin); -@@ -1307,6 +1321,10 @@ public class PurpurWorldConfig { +@@ -1324,6 +1336,10 @@ public class PurpurWorldConfig { camelMovementSpeedMin = getDouble("mobs.camel.attributes.movement_speed.min", camelMovementSpeedMin); camelMovementSpeedMax = getDouble("mobs.camel.attributes.movement_speed.max", camelMovementSpeedMax); camelBreedingTicks = getInt("mobs.camel.breeding-delay-ticks", camelBreedingTicks); @@ -282,7 +282,7 @@ index d070fef32287e3926dd3b483de29774fba9febe3..7d6433aa42b3f089f536f0e23723c0dc } public boolean catRidable = false; -@@ -1728,12 +1746,22 @@ public class PurpurWorldConfig { +@@ -1771,12 +1787,22 @@ public class PurpurWorldConfig { public boolean frogControllable = true; public float frogRidableJumpHeight = 0.65F; public int frogBreedingTicks = 6000; @@ -305,9 +305,9 @@ index d070fef32287e3926dd3b483de29774fba9febe3..7d6433aa42b3f089f536f0e23723c0dc } public boolean ghastRidable = false; -@@ -2676,12 +2704,20 @@ public class PurpurWorldConfig { - public boolean snifferControllable = true; +@@ -2778,6 +2804,10 @@ public class PurpurWorldConfig { public double snifferMaxHealth = 14.0D; + public double snifferScale = 1.0D; public int snifferBreedingTicks = 6000; + // Leaf start - Plazma - Add missing purpur config options + public boolean snifferTakeDamageFromWater = false; @@ -316,8 +316,9 @@ index d070fef32287e3926dd3b483de29774fba9febe3..7d6433aa42b3f089f536f0e23723c0dc private void snifferSettings() { snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); - snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable); +@@ -2785,6 +2815,10 @@ public class PurpurWorldConfig { snifferMaxHealth = getDouble("mobs.sniffer.attributes.max_health", snifferMaxHealth); + snifferScale = Mth.clamp(getDouble("mobs.sniffer.attributes.scale", snifferScale), 0.0625D, 16.0D); snifferBreedingTicks = getInt("mobs.sniffer.breeding-delay-ticks", snifferBreedingTicks); + // Leaf start - Plazma - Add missing purpur config options + snifferTakeDamageFromWater = getBoolean("mobs.sniffer.takes-damage-from-water", snifferTakeDamageFromWater); @@ -326,7 +327,7 @@ index d070fef32287e3926dd3b483de29774fba9febe3..7d6433aa42b3f089f536f0e23723c0dc } public boolean squidRidable = false; -@@ -2775,10 +2811,20 @@ public class PurpurWorldConfig { +@@ -2886,10 +2920,20 @@ public class PurpurWorldConfig { public boolean tadpoleRidable = false; public boolean tadpoleRidableInWater = true; public boolean tadpoleControllable = true; @@ -347,7 +348,7 @@ index d070fef32287e3926dd3b483de29774fba9febe3..7d6433aa42b3f089f536f0e23723c0dc } public boolean traderLlamaRidable = false; -@@ -2991,10 +3037,20 @@ public class PurpurWorldConfig { +@@ -3114,10 +3158,20 @@ public class PurpurWorldConfig { public boolean wardenRidable = false; public boolean wardenRidableInWater = true; public boolean wardenControllable = true;