From bd0a85a17c9a9ffcb3ec244ebd1eacd517ae2956 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Tue, 18 Jan 2022 09:10:04 -0600 Subject: [PATCH] Separate ridable and controllable configs --- patches/api/0007-Ridables.patch | 5 +- ...ed-to-crystals-and-crystals-shoot-ph.patch | 6 +- ...sable-zombie-aggressiveness-towards-.patch | 6 +- patches/api/0028-Rabid-Wolf-API.patch | 4 +- .../0035-Iron-golem-poppy-calms-anger.patch | 4 +- patches/server/0006-Ridables.patch | 1147 ++++++++++++----- ...-Configurable-entity-base-attributes.patch | 617 +++++---- patches/server/0010-Llama-API.patch | 12 +- ...20-Configurable-villager-brain-ticks.patch | 14 +- patches/server/0027-Giants-AI-settings.patch | 14 +- .../0028-Zombie-horse-naturally-spawn.patch | 6 +- ...0029-Charged-creeper-naturally-spawn.patch | 12 +- ...bit-naturally-spawn-toast-and-killer.patch | 14 +- .../server/0032-Tulips-change-fox-type.patch | 16 +- .../server/0033-Breedable-Polar-Bears.patch | 16 +- .../server/0034-Chickens-can-retaliate.patch | 16 +- .../server/0036-Cat-spawning-options.patch | 8 +- patches/server/0038-Cows-eat-mushrooms.patch | 14 +- ...cow-rotation-when-shearing-mooshroom.patch | 4 +- .../server/0040-Pigs-give-saddle-back.patch | 12 +- ...41-Snowman-drop-and-put-back-pumpkin.patch | 14 +- ...42-Ender-dragon-always-drop-full-exp.patch | 14 +- ...derman-and-creeper-griefing-controls.patch | 24 +- ...0055-Villagers-follow-emerald-blocks.patch | 20 +- .../0056-Allow-leashing-villagers.patch | 24 +- ...urable-search-radius-for-villagers-t.patch | 10 +- .../0062-Add-canSaveToDisk-to-Entity.patch | 8 +- ...ispenser-curse-of-binding-protection.patch | 6 +- .../0072-Configurable-jockey-options.patch | 55 +- ...ed-to-crystals-and-crystals-shoot-ph.patch | 14 +- .../0074-Add-phantom-spawning-options.patch | 6 +- patches/server/0079-Entity-lifespan.patch | 14 +- patches/server/0081-Squid-EAR-immunity.patch | 10 +- .../server/0082-Phantoms-burn-in-light.patch | 18 +- .../0083-Configurable-villager-breeding.patch | 10 +- ...6-Add-vindicator-johnny-spawn-chance.patch | 12 +- ...o-disable-dolphin-treasure-searching.patch | 12 +- .../server/0091-Short-enderman-height.patch | 6 +- ...Stop-squids-floating-on-top-of-water.patch | 16 +- ...stomizable-wither-health-and-healing.patch | 14 +- ...sable-zombie-aggressiveness-towards-.patch | 14 +- patches/server/0102-Flying-squids-Oh-my.patch | 25 +- ...e-entity-breeding-times-configurable.patch | 208 +-- ...llowing-Endermen-to-despawn-even-whi.patch | 12 +- ...16-Changeable-Mob-Left-Handed-Chance.patch | 6 +- .../0118-Snow-Golem-rate-of-fire-config.patch | 10 +- ...Villager-Clerics-to-farm-Nether-Wart.patch | 12 +- ...fied-Piglin-death-always-counting-as.patch | 12 +- ...ble-chance-for-wolves-to-spawn-rabid.patch | 24 +- ...24-Configurable-default-collar-color.patch | 44 +- .../server/0125-Phantom-flames-on-swoop.patch | 10 +- .../0128-Striders-give-saddle-back.patch | 12 +- ...iefing-bypass-to-everything-affected.patch | 127 +- ...oggle-for-water-sensitive-mob-damage.patch | 600 +++++---- ...39-Config-to-always-tame-in-Creative.patch | 14 +- ...ither-Ender-Dragon-can-ride-vehicles.patch | 18 +- ...dd-back-player-spawned-endermite-API.patch | 6 +- ...an-aggressiveness-towards-Endermites.patch | 10 +- ...-Dragon-Head-wearers-and-stare-aggro.patch | 10 +- ...151-Config-to-disable-Llama-caravans.patch | 10 +- ...ig-to-make-Creepers-explode-on-death.patch | 14 +- ...urable-ravager-griefable-blocks-list.patch | 10 +- ...0156-Add-config-for-villager-trading.patch | 18 +- .../0167-Piglin-portal-spawn-modifier.patch | 6 +- ...0-Config-for-wither-explosion-radius.patch | 6 +- ...h-to-impact-Creeper-explosion-radius.patch | 10 +- .../0178-Iron-golem-poppy-calms-anger.patch | 10 +- patches/server/0179-Breedable-parrots.patch | 18 +- ...ee-can-work-when-raining-or-at-night.patch | 10 +- ...187-API-for-any-mob-to-burn-daylight.patch | 36 +- ...97-Shulker-spawn-from-bullet-options.patch | 12 +- ...9-Option-to-make-drowned-break-doors.patch | 12 +- ...onfigurable-hunger-starvation-damage.patch | 4 +- patches/server/0207-Summoner-API.patch | 24 +- ...0210-Silk-touchable-budding-amethyst.patch | 4 +- ...e-Enderman-teleport-on-projectile-hi.patch | 12 +- ...ent-horses-from-standing-with-riders.patch | 6 +- ...izeable-Zombie-Villager-curing-times.patch | 10 +- ...0220-Toggle-for-Wither-s-spawn-sound.patch | 10 +- .../0223-Conduit-behavior-configuration.patch | 4 +- .../server/0224-Cauldron-fill-chances.patch | 4 +- .../0226-Shulker-change-color-with-dye.patch | 10 +- ...turally-aggressive-to-players-chance.patch | 14 +- ...turally-aggressive-to-players-chance.patch | 18 +- ...or-beds-to-explode-on-villager-sleep.patch | 6 +- ...-Halloween-options-and-optimizations.patch | 16 +- ...ion-to-disable-zombie-villagers-cure.patch | 10 +- .../0244-Mobs-always-drop-experience.patch | 587 +++++---- ...t-spiders-from-climbing-world-border.patch | 12 +- ...aring-jeb-produces-random-color-wool.patch | 10 +- .../0251-Mob-head-visibility-percent.patch | 14 +- ...-Shears-can-have-looting-enchantment.patch | 20 +- ...-Stop-bees-from-dying-after-stinging.patch | 10 +- .../0260-Configurable-phantom-size.patch | 10 +- 94 files changed, 2558 insertions(+), 1857 deletions(-) diff --git a/patches/api/0007-Ridables.patch b/patches/api/0007-Ridables.patch index 2d1d8caf60..1f4df6e670 100644 --- a/patches/api/0007-Ridables.patch +++ b/patches/api/0007-Ridables.patch @@ -5,16 +5,17 @@ Subject: [PATCH] Ridables diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 2405254739a83b2fb517da7fa4ea0721c68f9f6d..825c02793e3aaff45a8a0a9da01d72daf9421bee 100644 +index 2405254739a83b2fb517da7fa4ea0721c68f9f6d..dc0535d5ea5b2f4002a428ec64ea52fefbace7c4 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -197,6 +197,11 @@ public interface VanillaGoal extends Goal { +@@ -197,6 +197,12 @@ public interface VanillaGoal extends Goal { GoalKey RAIDER_MOVE_THROUGH_VILLAGE = GoalKey.of(Raider.class, NamespacedKey.minecraft("raider_move_through_village")); GoalKey PARROT_WANDER = GoalKey.of(Creature.class, NamespacedKey.minecraft("parrot_wander")); + // Purpur start + GoalKey MOB_HAS_RIDER = GoalKey.of(Mob.class, NamespacedKey.minecraft("has_rider")); + GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); ++ GoalKey LLAMA_HAS_RIDER = GoalKey.of(Llama.class, NamespacedKey.minecraft("llama_has_rider")); + // Purpur end + /** diff --git a/patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index d5657b9e11..2b6f3a7e30 100644 --- a/patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -5,13 +5,13 @@ Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 825c02793e3aaff45a8a0a9da01d72daf9421bee..fff199d014f93c6655b3d756bcc6fe986c97a81c 100644 +index dc0535d5ea5b2f4002a428ec64ea52fefbace7c4..25a45c8462e3b3accca81ed8d92c1072e3589368 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -200,6 +200,8 @@ public interface VanillaGoal extends Goal { - // Purpur start +@@ -201,6 +201,8 @@ public interface VanillaGoal extends Goal { GoalKey MOB_HAS_RIDER = GoalKey.of(Mob.class, NamespacedKey.minecraft("has_rider")); GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); + GoalKey LLAMA_HAS_RIDER = GoalKey.of(Llama.class, NamespacedKey.minecraft("llama_has_rider")); + GoalKey FIND_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("find_crystal")); + GoalKey ORBIT_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal")); // Purpur end diff --git a/patches/api/0025-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/api/0025-Add-option-to-disable-zombie-aggressiveness-towards-.patch index 916ccb8d54..c7c10d888c 100644 --- a/patches/api/0025-Add-option-to-disable-zombie-aggressiveness-towards-.patch +++ b/patches/api/0025-Add-option-to-disable-zombie-aggressiveness-towards-.patch @@ -6,11 +6,11 @@ Subject: [PATCH] Add option to disable zombie aggressiveness towards villagers diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index fff199d014f93c6655b3d756bcc6fe986c97a81c..48605ace47735eb425bff0cd044455b6893d7ecb 100644 +index 25a45c8462e3b3accca81ed8d92c1072e3589368..246e89e2d23cb049254611db223f34bde970d84b 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -202,6 +202,8 @@ public interface VanillaGoal extends Goal { - GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); +@@ -203,6 +203,8 @@ public interface VanillaGoal extends Goal { + GoalKey LLAMA_HAS_RIDER = GoalKey.of(Llama.class, NamespacedKey.minecraft("llama_has_rider")); GoalKey FIND_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("find_crystal")); GoalKey ORBIT_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal")); + GoalKey DROWNED_ATTACK_VILLAGER = GoalKey.of(Drowned.class, NamespacedKey.minecraft("drowned_attack_villager")); diff --git a/patches/api/0028-Rabid-Wolf-API.patch b/patches/api/0028-Rabid-Wolf-API.patch index 85ee945432..1b9d89c095 100644 --- a/patches/api/0028-Rabid-Wolf-API.patch +++ b/patches/api/0028-Rabid-Wolf-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Rabid Wolf API diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 48605ace47735eb425bff0cd044455b6893d7ecb..6c0ac9c262a3f4469d2eba7f7af6a6fafb2ada1a 100644 +index 246e89e2d23cb049254611db223f34bde970d84b..06dfb076431aff4d87dd4f587d42087e54b2382b 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -204,6 +204,7 @@ public interface VanillaGoal extends Goal { +@@ -205,6 +205,7 @@ public interface VanillaGoal extends Goal { GoalKey ORBIT_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal")); GoalKey DROWNED_ATTACK_VILLAGER = GoalKey.of(Drowned.class, NamespacedKey.minecraft("drowned_attack_villager")); GoalKey ZOMBIE_ATTACK_VILLAGER = GoalKey.of(Zombie.class, NamespacedKey.minecraft("zombie_attack_villager")); diff --git a/patches/api/0035-Iron-golem-poppy-calms-anger.patch b/patches/api/0035-Iron-golem-poppy-calms-anger.patch index ecf1347c5a..1af8b0d9eb 100644 --- a/patches/api/0035-Iron-golem-poppy-calms-anger.patch +++ b/patches/api/0035-Iron-golem-poppy-calms-anger.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Iron golem poppy calms anger diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -index 6c0ac9c262a3f4469d2eba7f7af6a6fafb2ada1a..2b2fd0da10b84a2a93629a8fbd60f1258d45b3ee 100644 +index 06dfb076431aff4d87dd4f587d42087e54b2382b..b3e4d10e54952be23ba3f4bcc374c24cff8b0ce2 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -205,6 +205,7 @@ public interface VanillaGoal extends Goal { +@@ -206,6 +206,7 @@ public interface VanillaGoal extends Goal { GoalKey DROWNED_ATTACK_VILLAGER = GoalKey.of(Drowned.class, NamespacedKey.minecraft("drowned_attack_villager")); GoalKey ZOMBIE_ATTACK_VILLAGER = GoalKey.of(Zombie.class, NamespacedKey.minecraft("zombie_attack_villager")); GoalKey AVOID_RABID_WOLF = GoalKey.of(Wolf.class, NamespacedKey.minecraft("avoid_rabid_wolf")); diff --git a/patches/server/0006-Ridables.patch b/patches/server/0006-Ridables.patch index 7b876f8d8f..fd880ff8ee 100644 --- a/patches/server/0006-Ridables.patch +++ b/patches/server/0006-Ridables.patch @@ -86,7 +86,7 @@ index 38de81f8696ed658d002427d002f22b28e3a6122..39bf75a7ba276f25e39573f084786dd5 if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) { ServerGamePacketListenerImpl.this.send(new ClientboundAddMobPacket((LivingEntity) entity)); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 6beb31d68b5d1fc84e396a510a68a488771fcac3..b119a3ce2a0907617c5e1f1071d640c8d4262f5f 100644 +index 6beb31d68b5d1fc84e396a510a68a488771fcac3..998bc2ef37de8cbebde0f6bca4ad8c9bea88aed7 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -292,7 +292,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i @@ -126,7 +126,7 @@ index 6beb31d68b5d1fc84e396a510a68a488771fcac3..b119a3ce2a0907617c5e1f1071d640c8 if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); } else { -@@ -4367,4 +4381,41 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i +@@ -4367,4 +4381,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i return ((ServerChunkCache) level.getChunkSource()).isPositionTicking(this); } // Paper end @@ -144,6 +144,10 @@ index 6beb31d68b5d1fc84e396a510a68a488771fcac3..b119a3ce2a0907617c5e1f1071d640c8 + return false; + } + ++ public boolean isControllable() { ++ return true; ++ } ++ + public void onMount(Player rider) { + if (this instanceof Mob) { + ((Mob) this).setTarget(null, null, false); @@ -169,10 +173,10 @@ index 6beb31d68b5d1fc84e396a510a68a488771fcac3..b119a3ce2a0907617c5e1f1071d640c8 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 645c1dc9bd09b135a641759c76ce8d957b9bd488..03adc3b746e05bb4b0514ba4a66c101b9742ceed 100644 +index 645c1dc9bd09b135a641759c76ce8d957b9bd488..912767ed261e44c0192c5a07e2c2026110988816 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -23,6 +23,18 @@ public class GlowSquid extends Squid { +@@ -23,6 +23,23 @@ public class GlowSquid extends Squid { super(type, world); } @@ -186,6 +190,11 @@ index 645c1dc9bd09b135a641759c76ce8d957b9bd488..03adc3b746e05bb4b0514ba4a66c101b + public boolean rideableUnderWater() { + return true; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.glowSquidControllable; ++ } + // Purpur end + @Override @@ -270,19 +279,21 @@ index d4da096f22bd3c118304fb00c7b9763562b9c889..1a5587e25356a239ae6a8c219747fcd9 // Paper end if (!this.level.isClientSide && this.isSensitiveToWater() && this.isInWaterRainOrBubble()) { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 35ff7abd8251b0af6c23fbb63804db632ec5b85d..cbb2f643c619c80d3bebcf1a8f066a87fc52d274 100644 +index 35ff7abd8251b0af6c23fbb63804db632ec5b85d..dcf788de63b819abc668cc6deba974af26a41f2e 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -143,6 +143,8 @@ public abstract class Mob extends LivingEntity { +@@ -141,8 +141,8 @@ public abstract class Mob extends LivingEntity { + this.restrictRadius = -1.0F; + this.goalSelector = new GoalSelector(world.getProfilerSupplier()); this.targetSelector = new GoalSelector(world.getProfilerSupplier()); - this.lookControl = new LookControl(this); - this.moveControl = new MoveControl(this); +- this.lookControl = new LookControl(this); +- this.moveControl = new MoveControl(this); + this.lookControl = new org.purpurmc.purpur.controller.LookControllerWASD(this); // Purpur + this.moveControl = new org.purpurmc.purpur.controller.MoveControllerWASD(this); // Purpur this.jumpControl = new JumpControl(this); this.bodyRotationControl = this.createBodyControl(); this.navigation = this.createNavigation(world); -@@ -1306,7 +1308,7 @@ public abstract class Mob extends LivingEntity { +@@ -1306,7 +1306,7 @@ public abstract class Mob extends LivingEntity { protected void onOffspringSpawnedFromEgg(Player player, Mob child) {} protected InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -291,7 +302,7 @@ index 35ff7abd8251b0af6c23fbb63804db632ec5b85d..cbb2f643c619c80d3bebcf1a8f066a87 } public boolean isWithinRestriction() { -@@ -1667,4 +1669,52 @@ public abstract class Mob extends LivingEntity { +@@ -1667,4 +1667,52 @@ public abstract class Mob extends LivingEntity { return itemmonsteregg == null ? null : new ItemStack(itemmonsteregg); } @@ -532,7 +543,7 @@ index 7df56705a4a0de2dc4ff7ab133fc26612c219162..60d21d6171b9af20a4c6fcc0d564a31a } 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 a76b754305036bf9c6387e27b86ec1559b290774..76de99e019c784609dfcafb35b9c4c9d21f8d6cf 100644 +index a76b754305036bf9c6387e27b86ec1559b290774..7814f9825ef1956c9f327bee8a0c268cda6eef21 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -19,6 +19,7 @@ import net.minecraft.world.entity.EntityDimensions; @@ -543,7 +554,7 @@ index a76b754305036bf9c6387e27b86ec1559b290774..76de99e019c784609dfcafb35b9c4c9d import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; -@@ -42,9 +43,51 @@ public class Bat extends AmbientCreature { +@@ -42,9 +43,56 @@ public class Bat extends AmbientCreature { public Bat(EntityType type, Level world) { super(type, world); @@ -566,6 +577,11 @@ index a76b754305036bf9c6387e27b86ec1559b290774..76de99e019c784609dfcafb35b9c4c9d + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.batControllable; ++ } ++ ++ @Override + public double getMaxY() { + return level.purpurConfig.batMaxY; + } @@ -582,7 +598,7 @@ index a76b754305036bf9c6387e27b86ec1559b290774..76de99e019c784609dfcafb35b9c4c9d + @Override + public void travel(Vec3 vec3) { + super.travel(vec3); -+ if (getRider() != null && !onGround) { ++ if (getRider() != null && this.isControllable() && !onGround) { + float speed = (float) getAttributeValue(Attributes.FLYING_SPEED) * 2; + setSpeed(speed); + Vec3 mot = getDeltaMovement(); @@ -595,7 +611,7 @@ index a76b754305036bf9c6387e27b86ec1559b290774..76de99e019c784609dfcafb35b9c4c9d @Override public boolean isFlapping() { return !this.isResting() && this.tickCount % Bat.TICKS_PER_FLAP == 0; -@@ -94,7 +137,7 @@ public class Bat extends AmbientCreature { +@@ -94,7 +142,7 @@ public class Bat extends AmbientCreature { protected void pushEntities() {} public static AttributeSupplier.Builder createAttributes() { @@ -604,12 +620,12 @@ index a76b754305036bf9c6387e27b86ec1559b290774..76de99e019c784609dfcafb35b9c4c9d } public boolean isResting() { -@@ -126,6 +169,14 @@ public class Bat extends AmbientCreature { +@@ -126,6 +174,14 @@ public class Bat extends AmbientCreature { @Override protected void customServerAiStep() { + // Purpur start -+ if (getRider() != null) { ++ if (getRider() != null && this.isControllable()) { + Vec3 mot = getDeltaMovement(); + setDeltaMovement(mot.x(), mot.y() + (getVerticalMot() > 0 ? 0.07D : 0.0D), mot.z()); + return; @@ -682,7 +698,7 @@ index 3484defdfd5a487b11917310d7b1d1543291eee1..2ae0296b0a2e9585caf81b819742a0a8 this.fish.setSpeed(Mth.lerp(0.125F, this.fish.getSpeed(), f)); double d0 = this.wantedX - this.fish.getX(); 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 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..0d47db2163ef01365513af2ccec8ea74bfc838c9 100644 +index 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..fea80e6ed278bff6cd8773abe1a7def96b3a7c97 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -44,6 +44,7 @@ import net.minecraft.world.entity.EntityType; @@ -706,7 +722,7 @@ index 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..0d47db2163ef01365513af2ccec8ea74 @Override public void tick() { + // Purpur start -+ if (mob.getRider() != null) { ++ if (mob.getRider() != null && mob.isControllable()) { + flyingController.purpurTick(mob.getRider()); + return; + } @@ -720,13 +736,13 @@ index 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..0d47db2163ef01365513af2ccec8ea74 + // Purpur start + @Override + public boolean hasWanted() { -+ return mob.getRider() != null || super.hasWanted(); ++ return mob.getRider() != null || !mob.isControllable() || super.hasWanted(); + } + // Purpur end } this.moveControl = new BeeFlyingMoveControl(this, 20, true); // Paper end -@@ -168,6 +183,35 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -168,6 +183,40 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.setPathfindingMalus(BlockPathTypes.FENCE, -1.0F); } @@ -742,6 +758,11 @@ index 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..0d47db2163ef01365513af2ccec8ea74 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.beeControllable; ++ } ++ ++ @Override + public double getMaxY() { + return level.purpurConfig.beeMaxY; + } @@ -749,7 +770,7 @@ index 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..0d47db2163ef01365513af2ccec8ea74 + @Override + public void travel(Vec3 vec3) { + super.travel(vec3); -+ if (getRider() != null && !onGround) { ++ if (getRider() != null && this.isControllable() && !onGround) { + float speed = (float) getAttributeValue(Attributes.FLYING_SPEED) * 2; + setSpeed(speed); + Vec3 mot = getDeltaMovement(); @@ -762,7 +783,7 @@ index 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..0d47db2163ef01365513af2ccec8ea74 @Override protected void defineSynchedData() { super.defineSynchedData(); -@@ -182,6 +226,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -182,6 +231,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @Override protected void registerGoals() { @@ -770,7 +791,7 @@ index 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..0d47db2163ef01365513af2ccec8ea74 this.goalSelector.addGoal(0, new Bee.BeeAttackGoal(this, 1.399999976158142D, true)); this.goalSelector.addGoal(1, new Bee.BeeEnterHiveGoal()); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); -@@ -197,6 +242,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -197,6 +247,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.goalSelector.addGoal(7, new Bee.BeeGrowCropGoal()); this.goalSelector.addGoal(8, new Bee.BeeWanderGoal()); this.goalSelector.addGoal(9, new FloatGoal(this)); @@ -778,7 +799,7 @@ index 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..0d47db2163ef01365513af2ccec8ea74 this.targetSelector.addGoal(1, (new Bee.BeeHurtByOtherGoal(this)).setAlertOthers(new Class[0])); this.targetSelector.addGoal(2, new Bee.BeeBecomeAngryTargetGoal(this)); this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -879,16 +925,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -879,16 +930,16 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } @@ -799,10 +820,10 @@ index 5a9d9926fb6fc356ee250d4e38f3bc303e280d45..0d47db2163ef01365513af2ccec8ea74 } 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 b0d3444c721765e10217474ca57f703531e69260..a63a18eb2c87d01b2fca460f40bc2848f9a4b9cb 100644 +index b0d3444c721765e10217474ca57f703531e69260..495e3b17cc1c5b5d502a172a9b6bd8c95a7b2064 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -122,6 +122,26 @@ public class Cat extends TamableAnimal { +@@ -122,6 +122,31 @@ public class Cat extends TamableAnimal { super(type, world); } @@ -818,6 +839,11 @@ index b0d3444c721765e10217474ca57f703531e69260..a63a18eb2c87d01b2fca460f40bc2848 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.catControllable; ++ } ++ ++ @Override + public void onMount(Player rider) { + super.onMount(rider); + setInSittingPose(false); @@ -829,7 +855,7 @@ index b0d3444c721765e10217474ca57f703531e69260..a63a18eb2c87d01b2fca460f40bc2848 public ResourceLocation getResourceLocation() { return (ResourceLocation) Cat.TEXTURE_BY_TYPE.getOrDefault(this.getCatType(), (ResourceLocation) Cat.TEXTURE_BY_TYPE.get(0)); } -@@ -130,6 +150,7 @@ public class Cat extends TamableAnimal { +@@ -130,6 +155,7 @@ public class Cat extends TamableAnimal { protected void registerGoals() { this.temptGoal = new Cat.CatTemptGoal(this, 0.6D, Cat.TEMPT_INGREDIENT, true); this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -837,7 +863,7 @@ index b0d3444c721765e10217474ca57f703531e69260..a63a18eb2c87d01b2fca460f40bc2848 this.goalSelector.addGoal(1, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(2, new Cat.CatRelaxOnOwnerGoal(this)); this.goalSelector.addGoal(3, this.temptGoal); -@@ -141,6 +162,7 @@ public class Cat extends TamableAnimal { +@@ -141,6 +167,7 @@ public class Cat extends TamableAnimal { this.goalSelector.addGoal(10, new BreedGoal(this, 0.8D)); this.goalSelector.addGoal(11, new WaterAvoidingRandomStrollGoal(this, 0.8D, 1.0000001E-5F)); this.goalSelector.addGoal(12, new LookAtPlayerGoal(this, Player.class, 10.0F)); @@ -845,7 +871,7 @@ index b0d3444c721765e10217474ca57f703531e69260..a63a18eb2c87d01b2fca460f40bc2848 this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Rabbit.class, false, (Predicate) null)); this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); } -@@ -395,6 +417,7 @@ public class Cat extends TamableAnimal { +@@ -395,6 +422,7 @@ public class Cat extends TamableAnimal { @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -854,10 +880,10 @@ index b0d3444c721765e10217474ca57f703531e69260..a63a18eb2c87d01b2fca460f40bc2848 Item item = itemstack.getItem(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index aa373560120684a037ac02d8df196b97b791bd85..a64b7bd9b8a3cf0d79689b71b84ca1cad7bde2f1 100644 +index aa373560120684a037ac02d8df196b97b791bd85..46ac6d4559be25914ebb24684fbeb33f471e226d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -52,9 +52,22 @@ public class Chicken extends Animal { +@@ -52,9 +52,27 @@ public class Chicken extends Animal { this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); } @@ -871,6 +897,11 @@ index aa373560120684a037ac02d8df196b97b791bd85..a64b7bd9b8a3cf0d79689b71b84ca1ca + public boolean rideableUnderWater() { + return level.purpurConfig.chickenRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.chickenControllable; ++ } + // Purpur end + @Override @@ -881,10 +912,10 @@ index aa373560120684a037ac02d8df196b97b791bd85..a64b7bd9b8a3cf0d79689b71b84ca1ca this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.0D, Chicken.FOOD_ITEMS, false)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cod.java b/src/main/java/net/minecraft/world/entity/animal/Cod.java -index 824e5e4fe7619ae46061c3c978c9a044db8c84ab..ea7227ade90a713242290cadb13692f33effa5c0 100644 +index 824e5e4fe7619ae46061c3c978c9a044db8c84ab..545ef4ab037b3173cc7377ad8147a44a2050d56f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cod.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cod.java -@@ -13,6 +13,18 @@ public class Cod extends AbstractSchoolingFish { +@@ -13,6 +13,23 @@ public class Cod extends AbstractSchoolingFish { super(type, world); } @@ -898,16 +929,21 @@ index 824e5e4fe7619ae46061c3c978c9a044db8c84ab..ea7227ade90a713242290cadb13692f3 + public boolean rideableUnderWater() { + return true; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.codControllable; ++ } + // Purpur end + @Override 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 425c6da0de40983b0870c9fd1b53f16b6a11c34c..f1f333892fa539ad96b7ecb5b7c4be03c8720f47 100644 +index 425c6da0de40983b0870c9fd1b53f16b6a11c34c..8f046fb76b6967e72abde523ffb790e0f46b80e0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -40,9 +40,22 @@ public class Cow extends Animal { +@@ -40,9 +40,27 @@ public class Cow extends Animal { super(type, world); } @@ -921,6 +957,11 @@ index 425c6da0de40983b0870c9fd1b53f16b6a11c34c..f1f333892fa539ad96b7ecb5b7c4be03 + public boolean rideableUnderWater() { + return level.purpurConfig.cowRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.cowControllable; ++ } + // Purpur end + @Override @@ -930,7 +971,7 @@ index 425c6da0de40983b0870c9fd1b53f16b6a11c34c..f1f333892fa539ad96b7ecb5b7c4be03 this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); -@@ -83,6 +96,7 @@ public class Cow extends Animal { +@@ -83,6 +101,7 @@ public class Cow extends Animal { @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -938,7 +979,7 @@ index 425c6da0de40983b0870c9fd1b53f16b6a11c34c..f1f333892fa539ad96b7ecb5b7c4be03 ItemStack itemstack = player.getItemInHand(hand); if (itemstack.is(Items.BUCKET) && !this.isBaby()) { -@@ -90,7 +104,7 @@ public class Cow extends Animal { +@@ -90,7 +109,7 @@ public class Cow extends Animal { org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((ServerLevel) player.level, player, this.blockPosition(), this.blockPosition(), null, itemstack, Items.MILK_BUCKET, hand); // Paper - add enumHand if (event.isCancelled()) { @@ -948,10 +989,10 @@ index 425c6da0de40983b0870c9fd1b53f16b6a11c34c..f1f333892fa539ad96b7ecb5b7c4be03 // CraftBukkit 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 7283a4f216d5d915f21c481bbe43f2598915ca6d..9e12331583db172cf54798656bd6a4c0d38fa66c 100644 +index 7283a4f216d5d915f21c481bbe43f2598915ca6d..4eca8dbdf0ce52588483a599b8b10e9c239821b7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -74,14 +74,82 @@ public class Dolphin extends WaterAnimal { +@@ -74,14 +74,87 @@ public class Dolphin extends WaterAnimal { public static final Predicate ALLOWED_ITEMS = (entityitem) -> { return !entityitem.hasPickUpDelay() && entityitem.isAlive() && entityitem.isInWater(); }; @@ -973,7 +1014,7 @@ index 7283a4f216d5d915f21c481bbe43f2598915ca6d..9e12331583db172cf54798656bd6a4c0 + + @Override + public void tick() { -+ if (dolphin.getRider() != null) { ++ if (dolphin.getRider() != null && dolphin.isControllable()) { + purpurTick(dolphin.getRider()); + } else { + super.tick(); @@ -1008,6 +1049,11 @@ index 7283a4f216d5d915f21c481bbe43f2598915ca6d..9e12331583db172cf54798656bd6a4c0 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.dolphinControllable; ++ } ++ ++ @Override + public boolean onSpacebar() { + if (spitCooldown == 0 && getRider() != null) { + spitCooldown = level.purpurConfig.dolphinSpitCooldown; @@ -1035,7 +1081,7 @@ index 7283a4f216d5d915f21c481bbe43f2598915ca6d..9e12331583db172cf54798656bd6a4c0 @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { -@@ -156,6 +224,7 @@ public class Dolphin extends WaterAnimal { +@@ -156,6 +229,7 @@ public class Dolphin extends WaterAnimal { protected void registerGoals() { this.goalSelector.addGoal(0, new BreathAirGoal(this)); this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); @@ -1043,7 +1089,7 @@ index 7283a4f216d5d915f21c481bbe43f2598915ca6d..9e12331583db172cf54798656bd6a4c0 this.goalSelector.addGoal(1, new Dolphin.DolphinSwimToTreasureGoal(this)); this.goalSelector.addGoal(2, new Dolphin.DolphinSwimWithPlayerGoal(this, 4.0D)); this.goalSelector.addGoal(4, new RandomSwimmingGoal(this, 1.0D, 10)); -@@ -166,6 +235,7 @@ public class Dolphin extends WaterAnimal { +@@ -166,6 +240,7 @@ public class Dolphin extends WaterAnimal { this.goalSelector.addGoal(8, new Dolphin.PlayWithItemsGoal()); this.goalSelector.addGoal(8, new FollowBoatGoal(this)); this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, Guardian.class, 8.0F, 1.0D, 1.0D)); @@ -1051,7 +1097,7 @@ index 7283a4f216d5d915f21c481bbe43f2598915ca6d..9e12331583db172cf54798656bd6a4c0 this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Guardian.class})).setAlertOthers()); } -@@ -217,7 +287,7 @@ public class Dolphin extends WaterAnimal { +@@ -217,7 +292,7 @@ public class Dolphin extends WaterAnimal { @Override protected boolean canRide(Entity entity) { @@ -1060,7 +1106,7 @@ index 7283a4f216d5d915f21c481bbe43f2598915ca6d..9e12331583db172cf54798656bd6a4c0 } @Override -@@ -252,6 +322,11 @@ public class Dolphin extends WaterAnimal { +@@ -252,6 +327,11 @@ public class Dolphin extends WaterAnimal { @Override public void tick() { super.tick(); @@ -1073,10 +1119,10 @@ index 7283a4f216d5d915f21c481bbe43f2598915ca6d..9e12331583db172cf54798656bd6a4c0 this.setAirSupply(this.getMaxAirSupply()); } else { 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 63f0ed4c80b7afa091c4a835eefd6d709428f984..49ffee9ce88d2f871b7f179835c7520d1c188070 100644 +index 63f0ed4c80b7afa091c4a835eefd6d709428f984..7ce5908d439afd49bdb5e7ea629e7544e7a7ed18 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -139,6 +139,39 @@ public class Fox extends Animal { +@@ -139,6 +139,44 @@ public class Fox extends Animal { this.setCanPickUpLoot(true); } @@ -1092,8 +1138,13 @@ index 63f0ed4c80b7afa091c4a835eefd6d709428f984..49ffee9ce88d2f871b7f179835c7520d + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.foxControllable; ++ } ++ ++ @Override + public float getJumpPower() { -+ return getRider() != null ? 0.5F : super.getJumpPower(); ++ return getRider() != null && this.isControllable() ? 0.5F : super.getJumpPower(); + } + + @Override @@ -1116,7 +1167,7 @@ index 63f0ed4c80b7afa091c4a835eefd6d709428f984..49ffee9ce88d2f871b7f179835c7520d @Override protected void defineSynchedData() { super.defineSynchedData(); -@@ -158,6 +191,7 @@ public class Fox extends Animal { +@@ -158,6 +196,7 @@ public class Fox extends Animal { return entityliving instanceof AbstractSchoolingFish; }); this.goalSelector.addGoal(0, new Fox.FoxFloatGoal()); @@ -1124,7 +1175,7 @@ index 63f0ed4c80b7afa091c4a835eefd6d709428f984..49ffee9ce88d2f871b7f179835c7520d this.goalSelector.addGoal(1, new Fox.FaceplantGoal()); this.goalSelector.addGoal(2, new Fox.FoxPanicGoal(2.2D)); this.goalSelector.addGoal(3, new Fox.FoxBreedGoal(1.0D)); -@@ -183,6 +217,7 @@ public class Fox extends Animal { +@@ -183,6 +222,7 @@ public class Fox extends Animal { 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()); @@ -1132,7 +1183,7 @@ index 63f0ed4c80b7afa091c4a835eefd6d709428f984..49ffee9ce88d2f871b7f179835c7520d this.targetSelector.addGoal(3, new Fox.DefendTrustedTargetGoal(LivingEntity.class, false, false, (entityliving) -> { return Fox.TRUSTED_TARGET_SELECTOR.test(entityliving) && !this.trusts(entityliving.getUUID()); })); -@@ -742,16 +777,16 @@ public class Fox extends Animal { +@@ -742,16 +782,16 @@ public class Fox extends Animal { return new Vec3(0.0D, (double) (0.55F * this.getEyeHeight()), (double) (this.getBbWidth() * 0.4F)); } @@ -1152,7 +1203,7 @@ index 63f0ed4c80b7afa091c4a835eefd6d709428f984..49ffee9ce88d2f871b7f179835c7520d } } -@@ -762,16 +797,16 @@ public class Fox extends Animal { +@@ -762,16 +802,16 @@ public class Fox extends Animal { } } @@ -1173,10 +1224,10 @@ index 63f0ed4c80b7afa091c4a835eefd6d709428f984..49ffee9ce88d2f871b7f179835c7520d } 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 d6bff18a60e1b0b507a3797742bfafff2fad10d2..78387bc4020ce06dfbdb0cc4af978b5a4f2645b3 100644 +index d6bff18a60e1b0b507a3797742bfafff2fad10d2..ff3f3a1a1e5ac741e00fee71d213feea885b44d6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -70,8 +70,22 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -70,8 +70,27 @@ public class IronGolem extends AbstractGolem implements NeutralMob { this.maxUpStep = 1.0F; } @@ -1190,6 +1241,11 @@ index d6bff18a60e1b0b507a3797742bfafff2fad10d2..78387bc4020ce06dfbdb0cc4af978b5a + public boolean rideableUnderWater() { + return level.purpurConfig.ironGolemRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.ironGolemControllable; ++ } + // Purpur end + @Override @@ -1199,7 +1255,7 @@ index d6bff18a60e1b0b507a3797742bfafff2fad10d2..78387bc4020ce06dfbdb0cc4af978b5a 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)); -@@ -79,6 +93,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -79,6 +98,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)); @@ -1207,7 +1263,7 @@ index d6bff18a60e1b0b507a3797742bfafff2fad10d2..78387bc4020ce06dfbdb0cc4af978b5a 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)); -@@ -267,13 +282,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -267,13 +287,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { ItemStack itemstack = player.getItemInHand(hand); if (!itemstack.is(Items.IRON_INGOT)) { @@ -1224,10 +1280,10 @@ index d6bff18a60e1b0b507a3797742bfafff2fad10d2..78387bc4020ce06dfbdb0cc4af978b5a float f1 = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index a91c8d37b818161fb7e2dc0def82a56d7db04fc1..66e146b92348b48fd53cc2aabd5335da66f50edc 100644 +index a91c8d37b818161fb7e2dc0def82a56d7db04fc1..355bb96e6395749ea94afe39d66b9f93fee1bbfb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -65,6 +65,18 @@ public class MushroomCow extends Cow implements Shearable { +@@ -65,6 +65,23 @@ public class MushroomCow extends Cow implements Shearable { super(type, world); } @@ -1241,12 +1297,17 @@ index a91c8d37b818161fb7e2dc0def82a56d7db04fc1..66e146b92348b48fd53cc2aabd5335da + public boolean rideableUnderWater() { + return level.purpurConfig.mooshroomRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.mooshroomControllable; ++ } + // Purpur end + @Override public float getWalkTargetValue(BlockPos pos, LevelReader world) { return world.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : world.getBrightness(pos) - 0.5F; -@@ -126,7 +138,7 @@ public class MushroomCow extends Cow implements Shearable { +@@ -126,7 +143,7 @@ public class MushroomCow extends Cow implements Shearable { } else if (itemstack.is(Items.SHEARS) && this.readyForShearing()) { // CraftBukkit start if (!CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand)) { @@ -1255,7 +1316,7 @@ index a91c8d37b818161fb7e2dc0def82a56d7db04fc1..66e146b92348b48fd53cc2aabd5335da } // CraftBukkit end this.shear(SoundSource.PLAYERS); -@@ -147,7 +159,7 @@ public class MushroomCow extends Cow implements Shearable { +@@ -147,7 +164,7 @@ public class MushroomCow extends Cow implements Shearable { Optional> optional = this.getEffectFromItemStack(itemstack); if (!optional.isPresent()) { @@ -1265,10 +1326,10 @@ index a91c8d37b818161fb7e2dc0def82a56d7db04fc1..66e146b92348b48fd53cc2aabd5335da Pair pair = (Pair) optional.get(); 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 a781048b0c43e63e441e6afecec125d7f838c342..d3311df20c37517e7c4ae1b8fbee6add6d32332e 100644 +index a781048b0c43e63e441e6afecec125d7f838c342..2afcac92a3c5a57cc3b87ffe28dc867030adbe80 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -@@ -69,6 +69,18 @@ public class Ocelot extends Animal { +@@ -69,6 +69,23 @@ public class Ocelot extends Animal { this.reassessTrustingGoals(); } @@ -1282,12 +1343,17 @@ index a781048b0c43e63e441e6afecec125d7f838c342..d3311df20c37517e7c4ae1b8fbee6add + public boolean rideableUnderWater() { + return level.purpurConfig.ocelotRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.ocelotControllable; ++ } + // Purpur end + public boolean isTrusting() { return (Boolean) this.entityData.get(Ocelot.DATA_TRUSTING); } -@@ -100,12 +112,14 @@ public class Ocelot extends Animal { +@@ -100,12 +117,14 @@ public class Ocelot extends Animal { protected void registerGoals() { this.temptGoal = new Ocelot.OcelotTemptGoal(this, 0.6D, Ocelot.TEMPT_INGREDIENT, true); this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -1303,10 +1369,10 @@ index a781048b0c43e63e441e6afecec125d7f838c342..d3311df20c37517e7c4ae1b8fbee6add this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, false, false, Turtle.BABY_ON_LAND_SELECTOR)); } 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 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcfc2c6d8a8 100644 +index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..92a3c99711f7e590563e278e575914e0bd65da93 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -107,6 +107,27 @@ public class Panda extends Animal { +@@ -107,6 +107,32 @@ public class Panda extends Animal { } @@ -1322,6 +1388,11 @@ index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcf + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.pandaControllable; ++ } ++ ++ @Override + public void onMount(Player rider) { + super.onMount(rider); + setForwardMot(0.0F); @@ -1334,7 +1405,7 @@ index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcf @Override public boolean canTakeItem(ItemStack stack) { EquipmentSlot enumitemslot = Mob.getEquipmentSlotForItem(stack); -@@ -262,6 +283,7 @@ public class Panda extends Animal { +@@ -262,6 +288,7 @@ public class Panda extends Animal { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -1342,7 +1413,7 @@ index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcf 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)); -@@ -277,6 +299,7 @@ public class Panda extends Animal { +@@ -277,6 +304,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)); @@ -1350,7 +1421,7 @@ index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcf this.targetSelector.addGoal(1, (new Panda.PandaHurtByTargetGoal(this, new Class[0])).setAlertOthers(new Class[0])); } -@@ -618,7 +641,7 @@ public class Panda extends Animal { +@@ -618,7 +646,7 @@ public class Panda extends Animal { ItemStack itemstack = player.getItemInHand(hand); if (this.isScared()) { @@ -1359,7 +1430,7 @@ index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcf } else if (this.isOnBack()) { this.setOnBack(false); return InteractionResult.sidedSuccess(this.level.isClientSide); -@@ -637,7 +660,7 @@ public class Panda extends Animal { +@@ -637,7 +665,7 @@ public class Panda extends Animal { this.gameEvent(GameEvent.MOB_INTERACT, this.eyeBlockPosition()); } else { if (this.level.isClientSide || this.isSitting() || this.isInWater()) { @@ -1368,7 +1439,7 @@ index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcf } this.tryToSit(); -@@ -654,7 +677,7 @@ public class Panda extends Animal { +@@ -654,7 +682,7 @@ public class Panda extends Animal { return InteractionResult.SUCCESS; } else { @@ -1377,7 +1448,7 @@ index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcf } } -@@ -694,7 +717,7 @@ public class Panda extends Animal { +@@ -694,7 +722,7 @@ public class Panda extends Animal { return !this.isOnBack() && !this.isScared() && !this.isEating() && !this.isRolling() && !this.isSitting(); } @@ -1386,7 +1457,7 @@ index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcf private final Panda panda; -@@ -704,9 +727,9 @@ public class Panda extends Animal { +@@ -704,9 +732,9 @@ public class Panda extends Animal { } @Override @@ -1399,10 +1470,10 @@ index 26e1898f6c9d716f8efa7b0cc4b9ad947e36ebd6..906b0f0b7907f84f9a4344d8a06e5dcf } } 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 dd80d9e0614445ba088c295784dc30584dedaa2b..ae436398af6d9b86518d21fca27d2acb6e37dc77 100644 +index dd80d9e0614445ba088c295784dc30584dedaa2b..d3b5b37347f1a52ccf58f6cb61aab454b1d8cb35 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -126,12 +126,63 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -126,12 +126,68 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { public Parrot(EntityType type, Level world) { super(type, world); @@ -1416,7 +1487,7 @@ index dd80d9e0614445ba088c295784dc30584dedaa2b..ae436398af6d9b86518d21fca27d2acb + + @Override + public void tick() { -+ if (mob.getRider() != null) { ++ if (mob.getRider() != null && mob.isControllable()) { + flyingController.purpurTick(mob.getRider()); + } else { + super.tick(); @@ -1425,7 +1496,7 @@ index dd80d9e0614445ba088c295784dc30584dedaa2b..ae436398af6d9b86518d21fca27d2acb + + @Override + public boolean hasWanted() { -+ return mob.getRider() != null ? getForwardMot() != 0 || getStrafeMot() != 0 : super.hasWanted(); ++ return mob.getRider() != null && mob.isControllable() ? getForwardMot() != 0 || getStrafeMot() != 0 : super.hasWanted(); + } + } + this.moveControl = new ParrotMoveControl(this, 10, false); @@ -1447,6 +1518,11 @@ index dd80d9e0614445ba088c295784dc30584dedaa2b..ae436398af6d9b86518d21fca27d2acb + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.parrotControllable; ++ } ++ ++ @Override + public double getMaxY() { + return level.purpurConfig.parrotMaxY; + } @@ -1454,7 +1530,7 @@ index dd80d9e0614445ba088c295784dc30584dedaa2b..ae436398af6d9b86518d21fca27d2acb + @Override + public void travel(Vec3 vec3) { + super.travel(vec3); -+ if (getRider() != null && !onGround) { ++ if (getRider() != null && this.isControllable() && !onGround) { + float speed = (float) getAttributeValue(Attributes.FLYING_SPEED) * 2; + setSpeed(speed); + Vec3 mot = getDeltaMovement(); @@ -1467,7 +1543,7 @@ index dd80d9e0614445ba088c295784dc30584dedaa2b..ae436398af6d9b86518d21fca27d2acb @Nullable @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { -@@ -150,8 +201,10 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -150,8 +206,10 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { @Override protected void registerGoals() { @@ -1480,10 +1556,10 @@ index dd80d9e0614445ba088c295784dc30584dedaa2b..ae436398af6d9b86518d21fca27d2acb this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(2, new FollowOwnerGoal(this, 1.0D, 5.0F, 1.0F, true)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Pig.java b/src/main/java/net/minecraft/world/entity/animal/Pig.java -index f24b87ff18d4255289c8130f32fd205014ee2747..32139ede373d72fd8745827052daf5c9a51cdcb9 100644 +index f24b87ff18d4255289c8130f32fd205014ee2747..c4c0d7958156b0d587999032c8f9fac9fd689c72 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pig.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pig.java -@@ -64,9 +64,22 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { +@@ -64,9 +64,27 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { this.steering = new ItemBasedSteering(this.entityData, Pig.DATA_BOOST_TIME, Pig.DATA_SADDLE_ID); } @@ -1497,6 +1573,11 @@ index f24b87ff18d4255289c8130f32fd205014ee2747..32139ede373d72fd8745827052daf5c9 + public boolean rideableUnderWater() { + return level.purpurConfig.pigRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.pigControllable; ++ } + // Purpur end + @Override @@ -1507,10 +1588,10 @@ index f24b87ff18d4255289c8130f32fd205014ee2747..32139ede373d72fd8745827052daf5c9 this.goalSelector.addGoal(3, new BreedGoal(this, 1.0D)); this.goalSelector.addGoal(4, new TemptGoal(this, 1.2D, Ingredient.of(Items.CARROT_ON_A_STICK), false)); 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 75b8c36f8616cf9f4c751c4a5285cad06be1631d..11714497f323350d8244962517d8bb887d35dd0a 100644 +index 75b8c36f8616cf9f4c751c4a5285cad06be1631d..590a8358846fc89a3c33ca52c70a8471f4999a01 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -@@ -62,11 +62,35 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -62,11 +62,40 @@ public class PolarBear extends Animal implements NeutralMob { private int remainingPersistentAngerTime; @Nullable private UUID persistentAngerTarget; @@ -1532,6 +1613,11 @@ index 75b8c36f8616cf9f4c751c4a5285cad06be1631d..11714497f323350d8244962517d8bb88 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.polarBearControllable; ++ } ++ ++ @Override + public boolean onSpacebar() { + if (!isStanding()) { + if (getRider() != null && getRider().getForwardMot() == 0 && getRider().getStrafeMot() == 0) { @@ -1546,7 +1632,7 @@ index 75b8c36f8616cf9f4c751c4a5285cad06be1631d..11714497f323350d8244962517d8bb88 @Override public AgeableMob getBreedOffspring(ServerLevel world, AgeableMob entity) { return EntityType.POLAR_BEAR.create(world); -@@ -81,12 +105,14 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -81,12 +110,14 @@ public class PolarBear extends Animal implements NeutralMob { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -1561,7 +1647,7 @@ index 75b8c36f8616cf9f4c751c4a5285cad06be1631d..11714497f323350d8244962517d8bb88 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)); -@@ -203,6 +229,11 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -203,6 +234,11 @@ public class PolarBear extends Animal implements NeutralMob { this.updatePersistentAnger((ServerLevel)this.level, true); } @@ -1573,7 +1659,7 @@ index 75b8c36f8616cf9f4c751c4a5285cad06be1631d..11714497f323350d8244962517d8bb88 } @Override -@@ -232,6 +263,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -232,6 +268,7 @@ public class PolarBear extends Animal implements NeutralMob { public void setStanding(boolean warning) { this.entityData.set(DATA_STANDING_ID, warning); @@ -1582,10 +1668,10 @@ index 75b8c36f8616cf9f4c751c4a5285cad06be1631d..11714497f323350d8244962517d8bb88 public float getStandingAnimationScale(float tickDelta) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -index f576e602f2fce87cdebc194b474dced64952178b..bc1cf0e63c9a1df534017246687f6a13cf976ff8 100644 +index f576e602f2fce87cdebc194b474dced64952178b..6f27a07b62f69350b1cee5f0170a7af1a3b99b9d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -@@ -45,6 +45,18 @@ public class Pufferfish extends AbstractFish { +@@ -45,6 +45,23 @@ public class Pufferfish extends AbstractFish { this.refreshDimensions(); } @@ -1599,13 +1685,18 @@ index f576e602f2fce87cdebc194b474dced64952178b..bc1cf0e63c9a1df534017246687f6a13 + public boolean rideableUnderWater() { + return true; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.pufferfishControllable; ++ } + // Purpur end + @Override protected void defineSynchedData() { super.defineSynchedData(); 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 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefeeea05b6d6 100644 +index 518f48bdd35d1b351c49771b1c98717fb2696685..f155cf36c59979464a0edcfd31d5e8433df60607 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java @@ -83,6 +83,7 @@ public class Rabbit extends Animal { @@ -1616,7 +1707,7 @@ index 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefee public Rabbit(EntityType type, Level world) { super(type, world); -@@ -91,6 +92,46 @@ public class Rabbit extends Animal { +@@ -91,6 +92,51 @@ public class Rabbit extends Animal { this.initializePathFinderGoals(); // CraftBukkit - moved code } @@ -1632,6 +1723,11 @@ index 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefee + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.rabbitControllable; ++ } ++ ++ @Override + public boolean onSpacebar() { + if (onGround) { + actualJump = true; @@ -1663,7 +1759,7 @@ index 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefee // CraftBukkit start - code from constructor public void initializePathFinderGoals(){ this.setSpeedModifier(0.0D); -@@ -100,6 +141,7 @@ public class Rabbit extends Animal { +@@ -100,6 +146,7 @@ public class Rabbit extends Animal { @Override public void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); @@ -1671,11 +1767,11 @@ index 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefee this.goalSelector.addGoal(1, new Rabbit.RabbitPanicGoal(this, 2.2D)); this.goalSelector.addGoal(2, new BreedGoal(this, 0.8D)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.0D, Ingredient.of(Items.CARROT, Items.GOLDEN_CARROT, Blocks.DANDELION), false)); -@@ -113,6 +155,13 @@ public class Rabbit extends Animal { +@@ -113,6 +160,13 @@ public class Rabbit extends Animal { @Override protected float getJumpPower() { -+ if (getRider() != null) { ++ if (getRider() != null && this.isControllable()) { + if (getForwardMot() < 0) { + setSpeed(getForwardMot() * 2F); + } @@ -1685,7 +1781,7 @@ index 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefee if (!this.horizontalCollision && (!this.moveControl.hasWanted() || this.moveControl.getWantedY() <= this.getY() + 0.5D)) { Path pathentity = this.navigation.getPath(); -@@ -131,7 +180,7 @@ public class Rabbit extends Animal { +@@ -131,7 +185,7 @@ public class Rabbit extends Animal { } @Override @@ -1694,12 +1790,12 @@ index 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefee super.jumpFromGround(); double d0 = this.moveControl.getSpeedModifier(); -@@ -181,6 +230,13 @@ public class Rabbit extends Animal { +@@ -181,6 +235,13 @@ public class Rabbit extends Animal { @Override public void customServerAiStep() { + // Purpur start -+ if (getRider() != null) { ++ if (getRider() != null && this.isControllable()) { + handleJumping(); + return; + } @@ -1708,7 +1804,7 @@ index 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefee if (this.jumpDelayTicks > 0) { --this.jumpDelayTicks; } -@@ -451,7 +507,7 @@ public class Rabbit extends Animal { +@@ -451,7 +512,7 @@ public class Rabbit extends Animal { } } @@ -1717,7 +1813,7 @@ index 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefee private final Rabbit rabbit; private double nextJumpSpeed; -@@ -462,14 +518,14 @@ public class Rabbit extends Animal { +@@ -462,14 +523,14 @@ public class Rabbit extends Animal { } @Override @@ -1735,10 +1831,10 @@ index 518f48bdd35d1b351c49771b1c98717fb2696685..373bf90cc838fe7317ef8458552eefee @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index 0af79daa357f53a8871e293b57e16c099e5d3f64..cf88c1d95a866853568d4fa5f67850bc54127d11 100644 +index 0af79daa357f53a8871e293b57e16c099e5d3f64..59cb21bc3166f4cc77b962c253ed786fd04090de 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -@@ -13,6 +13,18 @@ public class Salmon extends AbstractSchoolingFish { +@@ -13,6 +13,23 @@ public class Salmon extends AbstractSchoolingFish { super(type, world); } @@ -1752,16 +1848,21 @@ index 0af79daa357f53a8871e293b57e16c099e5d3f64..cf88c1d95a866853568d4fa5f67850bc + public boolean rideableUnderWater() { + return true; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.salmonControllable; ++ } + // Purpur end + @Override 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 1d4e504434ba9730101588c0bb0aab8f1ef6a7db..b0fb05dcb63d132071274ae2de0c105dc55420d0 100644 +index 1d4e504434ba9730101588c0bb0aab8f1ef6a7db..e267e7b3b4ba96f5423327a336088942dcb4e14c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -116,10 +116,23 @@ public class Sheep extends Animal implements Shearable { +@@ -116,10 +116,28 @@ public class Sheep extends Animal implements Shearable { super(type, world); } @@ -1775,6 +1876,11 @@ index 1d4e504434ba9730101588c0bb0aab8f1ef6a7db..b0fb05dcb63d132071274ae2de0c105d + public boolean rideableUnderWater() { + return level.purpurConfig.sheepRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.sheepControllable; ++ } + // Purpur end + @Override @@ -1786,10 +1892,10 @@ index 1d4e504434ba9730101588c0bb0aab8f1ef6a7db..b0fb05dcb63d132071274ae2de0c105d this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.1D, Ingredient.of(Items.WHEAT), false)); 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 dbc0ebf7e1d7ae7c89bafad19b0d9f209674b2c9..e091170d1ed24ab1bee4fc17337643ddc2bf5685 100644 +index dbc0ebf7e1d7ae7c89bafad19b0d9f209674b2c9..4fc9b738d6e33fb804276c5897aed3ab2b0040c9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -54,12 +54,26 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -54,12 +54,31 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM super(type, world); } @@ -1803,6 +1909,11 @@ index dbc0ebf7e1d7ae7c89bafad19b0d9f209674b2c9..e091170d1ed24ab1bee4fc17337643dd + public boolean rideableUnderWater() { + return level.purpurConfig.snowGolemRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.snowGolemControllable; ++ } + // Purpur end + @Override @@ -1816,15 +1927,15 @@ index dbc0ebf7e1d7ae7c89bafad19b0d9f209674b2c9..e091170d1ed24ab1bee4fc17337643dd this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Mob.class, 10, true, false, (entityliving) -> { return entityliving instanceof Enemy; })); -@@ -113,6 +127,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -113,6 +132,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM return; } -+ if (getRider() != null && !level.purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden ++ if (getRider() != null && this.isControllable() && !level.purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden BlockState iblockdata = Blocks.SNOW.defaultBlockState(); for (int l = 0; l < 4; ++l) { -@@ -155,7 +170,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -155,7 +175,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM if (itemstack.is(Items.SHEARS) && this.readyForShearing()) { // CraftBukkit start if (!CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemstack, hand)) { @@ -1833,7 +1944,7 @@ index dbc0ebf7e1d7ae7c89bafad19b0d9f209674b2c9..e091170d1ed24ab1bee4fc17337643dd } // CraftBukkit end this.shear(SoundSource.PLAYERS); -@@ -168,7 +183,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -168,7 +188,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM return InteractionResult.sidedSuccess(this.level.isClientSide); } else { @@ -1843,10 +1954,10 @@ index dbc0ebf7e1d7ae7c89bafad19b0d9f209674b2c9..e091170d1ed24ab1bee4fc17337643dd } 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 370513fbc39f178f903ce140ced1a97029dd39db..6045c6e6388a0ad2aceabe6586abc85326807524 100644 +index 370513fbc39f178f903ce140ced1a97029dd39db..d1ec00edb1782993b47a0837171fa80b8d1cb0b7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -51,9 +51,32 @@ public class Squid extends WaterAnimal { +@@ -51,9 +51,37 @@ public class Squid extends WaterAnimal { this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; } @@ -1861,6 +1972,11 @@ index 370513fbc39f178f903ce140ced1a97029dd39db..6045c6e6388a0ad2aceabe6586abc853 + return true; + } + ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.squidControllable; ++ } ++ + protected void rotateVectorAroundY(org.bukkit.util.Vector vector, double degrees) { + double rad = Math.toRadians(degrees); + double cos = Math.cos(rad); @@ -1879,13 +1995,13 @@ index 370513fbc39f178f903ce140ced1a97029dd39db..6045c6e6388a0ad2aceabe6586abc853 this.goalSelector.addGoal(1, new Squid.SquidFleeGoal()); } -@@ -242,6 +265,38 @@ public class Squid extends WaterAnimal { +@@ -242,6 +270,38 @@ public class Squid extends WaterAnimal { @Override public void tick() { + // Purpur start + Player rider = squid.getRider(); -+ if (rider != null) { ++ if (rider != null && squid.isControllable()) { + if (rider.jumping) { + squid.onSpacebar(); + } @@ -1919,10 +2035,10 @@ index 370513fbc39f178f903ce140ced1a97029dd39db..6045c6e6388a0ad2aceabe6586abc853 if (i > 100) { diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index 4745086ccacfb9863df1979c2d098cb5d81f1535..d78947aa30e4eebca67b94614ec0e2ac9afca36d 100644 +index 4745086ccacfb9863df1979c2d098cb5d81f1535..3bb43fac9b3405433b9d416b5154a5d49f673fc7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -50,6 +50,18 @@ public class TropicalFish extends AbstractSchoolingFish { +@@ -50,6 +50,23 @@ public class TropicalFish extends AbstractSchoolingFish { super(type, world); } @@ -1936,16 +2052,21 @@ index 4745086ccacfb9863df1979c2d098cb5d81f1535..d78947aa30e4eebca67b94614ec0e2ac + public boolean rideableUnderWater() { + return true; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.tropicalFishControllable; ++ } + // Purpur end + public static String getPredefinedName(int variant) { 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 56e9c0d15249562ebea8eb451d4bcc9ff5e7d594..43dea015a6a9093c98e8ff5a18e6a8360c30d59a 100644 +index 56e9c0d15249562ebea8eb451d4bcc9ff5e7d594..0148a83cbd1e60be227f500e3f3bf3a89632b556 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -86,6 +86,18 @@ public class Turtle extends Animal { +@@ -86,6 +86,23 @@ public class Turtle extends Animal { this.maxUpStep = 1.0F; } @@ -1959,12 +2080,17 @@ index 56e9c0d15249562ebea8eb451d4bcc9ff5e7d594..43dea015a6a9093c98e8ff5a18e6a836 + public boolean rideableUnderWater() { + return level.purpurConfig.turtleRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.turtleControllable; ++ } + // Purpur end + public void setHomePos(BlockPos pos) { this.entityData.set(Turtle.HOME_POS, pos.immutable()); // Paper - called with mutablepos... } -@@ -188,6 +200,7 @@ public class Turtle extends Animal { +@@ -188,6 +205,7 @@ public class Turtle extends Animal { @Override protected void registerGoals() { @@ -1972,7 +2098,7 @@ index 56e9c0d15249562ebea8eb451d4bcc9ff5e7d594..43dea015a6a9093c98e8ff5a18e6a836 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)); -@@ -345,13 +358,15 @@ public class Turtle extends Animal { +@@ -345,13 +363,15 @@ public class Turtle extends Animal { org.bukkit.craftbukkit.event.CraftEventFactory.entityDamage = null; // CraftBukkit } @@ -1989,7 +2115,7 @@ index 56e9c0d15249562ebea8eb451d4bcc9ff5e7d594..43dea015a6a9093c98e8ff5a18e6a836 } private void updateSpeed() { -@@ -370,8 +385,18 @@ public class Turtle extends Animal { +@@ -370,8 +390,18 @@ public class Turtle extends Animal { } @@ -2009,7 +2135,7 @@ index 56e9c0d15249562ebea8eb451d4bcc9ff5e7d594..43dea015a6a9093c98e8ff5a18e6a836 this.updateSpeed(); if (this.operation == MoveControl.Operation.MOVE_TO && !this.turtle.getNavigation().isDone()) { double d0 = this.wantedX - this.turtle.getX(); -@@ -384,7 +409,7 @@ public class Turtle extends Animal { +@@ -384,7 +414,7 @@ public class Turtle extends Animal { this.turtle.setYRot(this.rotlerp(this.turtle.getYRot(), f, 90.0F)); this.turtle.yBodyRot = this.turtle.getYRot(); @@ -2019,10 +2145,10 @@ index 56e9c0d15249562ebea8eb451d4bcc9ff5e7d594..43dea015a6a9093c98e8ff5a18e6a836 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 4797c34872f8fa2fba00172357c4f45e45cfe27f..4187d8fdb950781de8b414ed6928a3df4a89ba67 100644 +index 4797c34872f8fa2fba00172357c4f45e45cfe27f..5a7a8e3b31f4598216ebeaef12cfb377cfbd771b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -99,9 +99,27 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -99,9 +99,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { this.setTame(false); } @@ -2041,6 +2167,11 @@ index 4797c34872f8fa2fba00172357c4f45e45cfe27f..4187d8fdb950781de8b414ed6928a3df + super.onMount(rider); + setInSittingPose(false); + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.wolfControllable; ++ } + // Purpur end + @Override @@ -2050,7 +2181,7 @@ index 4797c34872f8fa2fba00172357c4f45e45cfe27f..4187d8fdb950781de8b414ed6928a3df this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(3, new Wolf.WolfAvoidEntityGoal<>(this, Llama.class, 24.0F, 1.5D, 1.5D)); this.goalSelector.addGoal(4, new LeapAtTargetGoal(this, 0.4F)); -@@ -112,6 +130,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -112,6 +135,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { this.goalSelector.addGoal(9, new BegGoal(this, 8.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(10, new RandomLookAroundGoal(this)); @@ -2059,10 +2190,10 @@ index 4797c34872f8fa2fba00172357c4f45e45cfe27f..4187d8fdb950781de8b414ed6928a3df this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); this.targetSelector.addGoal(3, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); 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 0fe2d6190ebba24713a3da7ef5367ecb86814a66..7f535683dcc2ad9908400d98328174baf1ea5a91 100644 +index 0fe2d6190ebba24713a3da7ef5367ecb86814a66..807834e81b5ee18b6c8e897095161fe208b51168 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 -@@ -91,6 +91,23 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -91,6 +91,28 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { this.maxUpStep = 1.0F; } @@ -2078,6 +2209,11 @@ index 0fe2d6190ebba24713a3da7ef5367ecb86814a66..7f535683dcc2ad9908400d98328174ba + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.axolotlControllable; ++ } ++ ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur + } @@ -2086,7 +2222,7 @@ index 0fe2d6190ebba24713a3da7ef5367ecb86814a66..7f535683dcc2ad9908400d98328174ba @Override public Map getModelRotationValues() { return this.modelRotationValues; -@@ -516,14 +533,22 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -516,14 +538,22 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { private static class AxolotlMoveControl extends SmoothSwimmingMoveControl { private final Axolotl axolotl; @@ -2101,7 +2237,7 @@ index 0fe2d6190ebba24713a3da7ef5367ecb86814a66..7f535683dcc2ad9908400d98328174ba @Override public void tick() { + // Purpur start -+ if (axolotl.getRider() != null) { ++ if (axolotl.getRider() != null && axolotl.isControllable()) { + waterController.purpurTick(axolotl.getRider()); + return; + } @@ -2109,7 +2245,7 @@ index 0fe2d6190ebba24713a3da7ef5367ecb86814a66..7f535683dcc2ad9908400d98328174ba if (!this.axolotl.isPlayingDead()) { super.tick(); } -@@ -538,9 +563,9 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -538,9 +568,9 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { } @Override @@ -2122,10 +2258,10 @@ index 0fe2d6190ebba24713a3da7ef5367ecb86814a66..7f535683dcc2ad9908400d98328174ba } diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index d5cd18c478bedaeed83de31d442d1a5b0f0f54cf..898a82d5f6404b736e13c14d9c15ea27a4f938b4 100644 +index d5cd18c478bedaeed83de31d442d1a5b0f0f54cf..07e2a7839d8aaf2915c9b8ba74653870f11def88 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -74,6 +74,18 @@ public class Goat extends Animal { +@@ -74,6 +74,23 @@ public class Goat extends Animal { this.getNavigation().setCanFloat(true); } @@ -2139,17 +2275,22 @@ index d5cd18c478bedaeed83de31d442d1a5b0f0f54cf..898a82d5f6404b736e13c14d9c15ea27 + public boolean rideableUnderWater() { + return level.purpurConfig.goatRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.goatControllable; ++ } + // Purpur end + @Override protected Brain.Provider brainProvider() { return Brain.provider(Goat.MEMORY_TYPES, Goat.SENSOR_TYPES); -@@ -150,7 +162,7 @@ public class Goat extends Animal { +@@ -150,7 +167,7 @@ public class Goat extends Animal { @Override protected void customServerAiStep() { this.level.getProfiler().push("goatBrain"); - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if (getRider() == null && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); this.level.getProfiler().pop(); this.level.getProfiler().push("goatActivityUpdate"); @@ -2225,10 +2366,10 @@ index 7af7ff4accbcc1b28d96c94e9c3301142541f4f0..a91152df3d443d70b1aa9aff97b3746e protected void randomizeAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)this.generateRandomMaxHealth()); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 9a401b3e8db61d0b92ca273db2eb84efc4dfa8fc..3dfab1062824eee91280d8de4cd50be519bf6176 100644 +index 9a401b3e8db61d0b92ca273db2eb84efc4dfa8fc..7059b66fe81ffd3f757b595ae107ec69222db8e7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -72,7 +72,46 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -72,7 +72,51 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { public Llama(EntityType type, Level world) { super(type, world); @@ -2236,7 +2377,7 @@ index 9a401b3e8db61d0b92ca273db2eb84efc4dfa8fc..3dfab1062824eee91280d8de4cd50be5 + this.moveControl = new org.purpurmc.purpur.controller.MoveControllerWASD(this) { + @Override + public void tick() { -+ if (entity.getRider() != null && isSaddled()) { ++ if (entity.getRider() != null && entity.isControllable() && isSaddled()) { + purpurTick(entity.getRider()); + } else { + vanillaTick(); @@ -2246,7 +2387,7 @@ index 9a401b3e8db61d0b92ca273db2eb84efc4dfa8fc..3dfab1062824eee91280d8de4cd50be5 + this.lookControl = new org.purpurmc.purpur.controller.LookControllerWASD(this) { + @Override + public void tick() { -+ if (entity.getRider() != null && isSaddled()) { ++ if (entity.getRider() != null && entity.isControllable() && isSaddled()) { + purpurTick(entity.getRider()); + } else { + vanillaTick(); @@ -2268,6 +2409,11 @@ index 9a401b3e8db61d0b92ca273db2eb84efc4dfa8fc..3dfab1062824eee91280d8de4cd50be5 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.llamaControllable; ++ } ++ ++ @Override + public boolean isSaddled() { + return super.isSaddled() || (isTamed() && getSwag() != null); } @@ -2275,19 +2421,19 @@ index 9a401b3e8db61d0b92ca273db2eb84efc4dfa8fc..3dfab1062824eee91280d8de4cd50be5 public boolean isTraderLlama() { return false; -@@ -124,6 +163,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -124,6 +168,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.LlamaHasRider(this)); // Purpur this.goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2D)); this.goalSelector.addGoal(2, new LlamaFollowCaravanGoal(this, 2.0999999046325684D)); this.goalSelector.addGoal(3, new RangedAttackGoal(this, 1.25D, 40, 20.0F)); -@@ -134,6 +174,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -134,6 +179,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 0.7D)); this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.LlamaHasRider(this)); // Purpur this.targetSelector.addGoal(1, new Llama.LlamaHurtByTargetGoal(this)); this.targetSelector.addGoal(2, new Llama.LlamaAttackWolfGoal(this)); } @@ -2346,10 +2492,10 @@ index 80340a7543ff8287621c90b99b85886a5483810a..235dae1b47641fb69e6b34e419797a1a @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -index 7dbdb6529350b34c0260ca50dfff2b4583fd9c2a..4bad9092aa5381aa82676671482aa7ec3c091772 100644 +index 7dbdb6529350b34c0260ca50dfff2b4583fd9c2a..a4a88be0cbf94b633f486ce57d4fccd38002ac9f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -27,6 +27,23 @@ public class TraderLlama extends Llama { +@@ -27,6 +27,28 @@ public class TraderLlama extends Llama { super(type, world); } @@ -2365,6 +2511,11 @@ index 7dbdb6529350b34c0260ca50dfff2b4583fd9c2a..4bad9092aa5381aa82676671482aa7ec + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.traderLlamaControllable; ++ } ++ ++ @Override + public boolean isSaddled() { + return super.isSaddled() || isTamed(); + } @@ -2422,7 +2573,7 @@ index 305a891e4b51d1031d9e9238ff00e2ea7de8d954..84625d09df800fcfd477fc493fb5f824 protected void defineSynchedData() { } diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee9f73290c 100644 +index e17a3afa41fd628d2c4a3637ae19418e258a99b8..9846b882ae67131f3602845419c52c1350a214ce 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -102,6 +102,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -2433,7 +2584,7 @@ index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee public EnderDragon(EntityType entitytypes, Level world) { super(EntityType.ENDER_DRAGON, world); -@@ -116,8 +117,45 @@ public class EnderDragon extends Mob implements Enemy { +@@ -116,8 +117,50 @@ public class EnderDragon extends Mob implements Enemy { } this.phaseManager = new EnderDragonPhaseManager(this); @@ -2470,6 +2621,11 @@ index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee + return level.purpurConfig.enderDragonRidableInWater; } ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.enderDragonControllable; ++ } ++ + @Override + public double getMaxY() { + return level.purpurConfig.enderDragonMaxY; @@ -2479,12 +2635,12 @@ index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 200.0D); } -@@ -166,6 +204,37 @@ public class EnderDragon extends Mob implements Enemy { +@@ -166,6 +209,37 @@ public class EnderDragon extends Mob implements Enemy { @Override public void aiStep() { + // Purpur start -+ boolean hasRider = getRider() != null; ++ boolean hasRider = getRider() != null && this.isControllable(); + if (hasRider) { + if (!hadRider) { + hadRider = true; @@ -2517,7 +2673,7 @@ index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee this.processFlappingMovement(); if (this.level.isClientSide) { this.setHealth(this.getHealth()); -@@ -179,6 +248,8 @@ public class EnderDragon extends Mob implements Enemy { +@@ -179,6 +253,8 @@ public class EnderDragon extends Mob implements Enemy { float f; if (this.isDeadOrDying()) { @@ -2526,7 +2682,7 @@ index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee float f1 = (this.random.nextFloat() - 0.5F) * 8.0F; f = (this.random.nextFloat() - 0.5F) * 4.0F; -@@ -191,9 +262,9 @@ public class EnderDragon extends Mob implements Enemy { +@@ -191,9 +267,9 @@ public class EnderDragon extends Mob implements Enemy { f = 0.2F / ((float) vec3d.horizontalDistance() * 10.0F + 1.0F); f *= (float) Math.pow(2.0D, vec3d.y); @@ -2538,7 +2694,7 @@ index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee this.flapTime += f * 0.5F; } else { this.flapTime += f; -@@ -238,7 +309,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -238,7 +314,7 @@ public class EnderDragon extends Mob implements Enemy { } this.phaseManager.getCurrentPhase().doClientTick(); @@ -2547,7 +2703,7 @@ index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee DragonPhaseInstance idragoncontroller = this.phaseManager.getCurrentPhase(); idragoncontroller.doServerTick(); -@@ -308,7 +379,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -308,7 +384,7 @@ public class EnderDragon extends Mob implements Enemy { this.tickPart(this.body, (double) (f11 * 0.5F), 0.0D, (double) (-f12 * 0.5F)); this.tickPart(this.wing1, (double) (f12 * 4.5F), 2.0D, (double) (f11 * 4.5F)); this.tickPart(this.wing2, (double) (f12 * -4.5F), 2.0D, (double) (f11 * -4.5F)); @@ -2556,7 +2712,7 @@ index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee this.knockBack(this.level.getEntities((Entity) this, this.wing1.getBoundingBox().inflate(4.0D, 2.0D, 4.0D).move(0.0D, -2.0D, 0.0D), EntitySelector.NO_CREATIVE_OR_SPECTATOR)); this.knockBack(this.level.getEntities((Entity) this, this.wing2.getBoundingBox().inflate(4.0D, 2.0D, 4.0D).move(0.0D, -2.0D, 0.0D), EntitySelector.NO_CREATIVE_OR_SPECTATOR)); this.hurt(this.level.getEntities((Entity) this, this.head.getBoundingBox().inflate(1.0D), EntitySelector.NO_CREATIVE_OR_SPECTATOR)); -@@ -352,7 +423,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -352,7 +428,7 @@ public class EnderDragon extends Mob implements Enemy { } if (!this.level.isClientSide) { @@ -2566,7 +2722,7 @@ index e17a3afa41fd628d2c4a3637ae19418e258a99b8..5e81df114108fa3f8ad8dc5e211737ee this.dragonFight.updateDragon(this); } diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index ede0ced64d74d71547d1b8bb6853c5aacc1b486a..5d7623a5ef12ec3151cbc4ac0a59959d8976b9ea 100644 +index ede0ced64d74d71547d1b8bb6853c5aacc1b486a..4b541ebd4e9d0ef178aacd3006393ff114a30e79 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -85,6 +85,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -2577,7 +2733,7 @@ index ede0ced64d74d71547d1b8bb6853c5aacc1b486a..5d7623a5ef12ec3151cbc4ac0a59959d // Paper start private boolean canPortal = false; -@@ -106,16 +107,118 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -106,16 +107,123 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob navigationflying.setCanOpenDoors(false); navigationflying.setCanFloat(true); navigationflying.setCanPassDoors(true); @@ -2597,6 +2753,11 @@ index ede0ced64d74d71547d1b8bb6853c5aacc1b486a..5d7623a5ef12ec3151cbc4ac0a59959d + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.witherControllable; ++ } ++ ++ @Override + public double getMaxY() { + return level.purpurConfig.witherMaxY; + } @@ -2604,7 +2765,7 @@ index ede0ced64d74d71547d1b8bb6853c5aacc1b486a..5d7623a5ef12ec3151cbc4ac0a59959d + @Override + public void travel(Vec3 vec3) { + super.travel(vec3); -+ if (getRider() != null && !onGround) { ++ if (getRider() != null && this.isControllable() && !onGround) { + float speed = (float) getAttributeValue(Attributes.FLYING_SPEED) * 5F; + setSpeed(speed); + Vec3 mot = getDeltaMovement(); @@ -2696,12 +2857,12 @@ index ede0ced64d74d71547d1b8bb6853c5aacc1b486a..5d7623a5ef12ec3151cbc4ac0a59959d this.targetSelector.addGoal(1, new HurtByTargetGoal(this, new Class[0])); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 0, false, false, WitherBoss.LIVING_ENTITY_SELECTOR)); } -@@ -257,6 +360,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -257,6 +365,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @Override protected void customServerAiStep() { + // Purpur start -+ if (getRider() != null) { ++ if (getRider() != null && this.isControllable()) { + Vec3 mot = getDeltaMovement(); + setDeltaMovement(mot.x(), mot.y() + (getVerticalMot() > 0 ? 0.07D : 0.0D), mot.z()); + } @@ -2713,17 +2874,17 @@ index ede0ced64d74d71547d1b8bb6853c5aacc1b486a..5d7623a5ef12ec3151cbc4ac0a59959d int i; if (this.getInvulnerableTicks() > 0) { -@@ -584,11 +697,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -584,11 +702,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } public int getAlternativeTarget(int headIndex) { - return (Integer) this.entityData.get((EntityDataAccessor) WitherBoss.DATA_TARGETS.get(headIndex)); -+ return getRider() != null ? 0 : this.entityData.get(WitherBoss.DATA_TARGETS.get(headIndex)); // Purpur ++ return getRider() != null && this.isControllable() ? 0 : this.entityData.get(WitherBoss.DATA_TARGETS.get(headIndex)); // Purpur } public void setAlternativeTarget(int headIndex, int id) { - this.entityData.set((EntityDataAccessor) WitherBoss.DATA_TARGETS.get(headIndex), id); -+ if (getRider() == null) this.entityData.set(WitherBoss.DATA_TARGETS.get(headIndex), id); // Purpur ++ if (getRider() == null || !this.isControllable()) this.entityData.set(WitherBoss.DATA_TARGETS.get(headIndex), id); // Purpur } @Override @@ -2747,7 +2908,7 @@ index e23fe546291e670f89447398507d08a0a07efa85..a60ca5d69a9734c7979f953bd56c05c7 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); 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 40b387bfa1dbdb8dd2b4d23e9c130645469e1af0..96912be8e98abf7b09b85a0830cd3e10c9225a0e 100644 +index 40b387bfa1dbdb8dd2b4d23e9c130645469e1af0..6454992aa70e1476eaea67a8d9a1c27ab66f088d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Blaze.java +++ b/src/main/java/net/minecraft/world/entity/monster/Blaze.java @@ -32,6 +32,7 @@ public class Blaze extends Monster { @@ -2758,7 +2919,7 @@ index 40b387bfa1dbdb8dd2b4d23e9c130645469e1af0..96912be8e98abf7b09b85a0830cd3e10 this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); this.setPathfindingMalus(BlockPathTypes.DANGER_FIRE, 0.0F); -@@ -39,19 +40,50 @@ public class Blaze extends Monster { +@@ -39,19 +40,55 @@ public class Blaze extends Monster { this.xpReward = 10; } @@ -2774,6 +2935,11 @@ index 40b387bfa1dbdb8dd2b4d23e9c130645469e1af0..96912be8e98abf7b09b85a0830cd3e10 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.blazeControllable; ++ } ++ ++ @Override + public double getMaxY() { + return level.purpurConfig.blazeMaxY; + } @@ -2781,7 +2947,7 @@ index 40b387bfa1dbdb8dd2b4d23e9c130645469e1af0..96912be8e98abf7b09b85a0830cd3e10 + @Override + public void travel(Vec3 vec3) { + super.travel(vec3); -+ if (getRider() != null && !onGround) { ++ if (getRider() != null && this.isControllable() && !onGround) { + float speed = (float) getAttributeValue(Attributes.FLYING_SPEED); + setSpeed(speed); + Vec3 mot = getDeltaMovement(); @@ -2810,12 +2976,12 @@ index 40b387bfa1dbdb8dd2b4d23e9c130645469e1af0..96912be8e98abf7b09b85a0830cd3e10 } @Override -@@ -106,6 +138,14 @@ public class Blaze extends Monster { +@@ -106,6 +143,14 @@ public class Blaze extends Monster { @Override protected void customServerAiStep() { + // Purpur start -+ if (getRider() != null) { ++ if (getRider() != null && this.isControllable()) { + Vec3 mot = getDeltaMovement(); + setDeltaMovement(mot.x(), getVerticalMot() > 0 ? 0.07D : -0.07D, mot.z()); + return; @@ -2826,10 +2992,10 @@ index 40b387bfa1dbdb8dd2b4d23e9c130645469e1af0..96912be8e98abf7b09b85a0830cd3e10 if (this.nextHeightOffsetChangeTick <= 0) { this.nextHeightOffsetChangeTick = 100; 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 d980b906d9206560741576fa4153c57212f307a0..dd05c5f35d78d1385f793f4e34333ff242d136e1 100644 +index d980b906d9206560741576fa4153c57212f307a0..790d4abbc8e0b288e20e72e63f8190e938e2fecb 100644 --- a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java +++ b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -@@ -28,6 +28,18 @@ public class CaveSpider extends Spider { +@@ -28,6 +28,23 @@ public class CaveSpider extends Spider { return Spider.createAttributes().add(Attributes.MAX_HEALTH, 12.0D); } @@ -2843,16 +3009,21 @@ index d980b906d9206560741576fa4153c57212f307a0..dd05c5f35d78d1385f793f4e34333ff2 + public boolean rideableUnderWater() { + return level.purpurConfig.caveSpiderRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.caveSpiderControllable; ++ } + // Purpur end + @Override 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 c2dbe53f504327f153efe195c74ad28c1b89791f..aa92e5a46078b10da6d51d65434d6163428583bb 100644 +index c2dbe53f504327f153efe195c74ad28c1b89791f..3451d4b2427978c8ff2893fad9f2c0cfc8c5f472 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -60,21 +60,93 @@ public class Creeper extends Monster implements PowerableMob { +@@ -60,21 +60,98 @@ public class Creeper extends Monster implements PowerableMob { public int maxSwell = 30; public int explosionRadius = 3; private int droppedSkulls; @@ -2878,11 +3049,16 @@ index c2dbe53f504327f153efe195c74ad28c1b89791f..aa92e5a46078b10da6d51d65434d6163 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.creeperControllable; ++ } ++ ++ @Override + protected void customServerAiStep() { + if (powerToggleDelay > 0) { + powerToggleDelay--; + } -+ if (getRider() != null) { ++ if (getRider() != null && this.isControllable()) { + if (getRider().getForwardMot() != 0 || getRider().getStrafeMot() != 0) { + spacebarCharge = 0; + setIgnited(false); @@ -2946,7 +3122,7 @@ index c2dbe53f504327f153efe195c74ad28c1b89791f..aa92e5a46078b10da6d51d65434d6163 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); } -@@ -318,6 +390,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -318,6 +395,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()); @@ -2955,10 +3131,10 @@ index c2dbe53f504327f153efe195c74ad28c1b89791f..aa92e5a46078b10da6d51d65434d6163 } // Paper end 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 ccaa50d1ba9151bd94333b6b8fc0e77bc4324990..6f8a1b1ec0de5c61a9fcadf4b6eb47a1bb2846c2 100644 +index ccaa50d1ba9151bd94333b6b8fc0e77bc4324990..6c89aa825b51fd1054bb04d4a6a23778e90bd7c6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -69,6 +69,18 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -69,6 +69,23 @@ public class Drowned extends Zombie implements RangedAttackMob { this.groundNavigation = new GroundPathNavigation(this, world); } @@ -2972,12 +3148,17 @@ index ccaa50d1ba9151bd94333b6b8fc0e77bc4324990..6f8a1b1ec0de5c61a9fcadf4b6eb47a1 + public boolean rideableUnderWater() { + return level.purpurConfig.drownedRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.drownedControllable; ++ } + // Purpur end + @Override protected void addBehaviourGoals() { this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0D)); -@@ -382,7 +394,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -382,7 +399,7 @@ public class Drowned extends Zombie implements RangedAttackMob { } } @@ -2986,7 +3167,7 @@ index ccaa50d1ba9151bd94333b6b8fc0e77bc4324990..6f8a1b1ec0de5c61a9fcadf4b6eb47a1 private final Drowned drowned; public DrownedMoveControl(Drowned drowned) { -@@ -391,7 +403,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -391,7 +408,7 @@ public class Drowned extends Zombie implements RangedAttackMob { } @Override @@ -2995,7 +3176,7 @@ index ccaa50d1ba9151bd94333b6b8fc0e77bc4324990..6f8a1b1ec0de5c61a9fcadf4b6eb47a1 LivingEntity livingEntity = this.drowned.getTarget(); if (this.drowned.wantsToSwim() && this.drowned.isInWater()) { if (livingEntity != null && livingEntity.getY() > this.drowned.getY() || this.drowned.searchingForLand) { -@@ -411,7 +423,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -411,7 +428,7 @@ public class Drowned extends Zombie implements RangedAttackMob { float h = (float)(Mth.atan2(f, d) * (double)(180F / (float)Math.PI)) - 90.0F; this.drowned.setYRot(this.rotlerp(this.drowned.getYRot(), h, 90.0F)); this.drowned.yBodyRot = this.drowned.getYRot(); @@ -3004,7 +3185,7 @@ index ccaa50d1ba9151bd94333b6b8fc0e77bc4324990..6f8a1b1ec0de5c61a9fcadf4b6eb47a1 float j = Mth.lerp(0.125F, this.drowned.getSpeed(), i); this.drowned.setSpeed(j); this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add((double)j * d * 0.005D, (double)j * e * 0.1D, (double)j * f * 0.005D)); -@@ -420,7 +432,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -420,7 +437,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(0.0D, -0.008D, 0.0D)); } @@ -3014,10 +3195,10 @@ index ccaa50d1ba9151bd94333b6b8fc0e77bc4324990..6f8a1b1ec0de5c61a9fcadf4b6eb47a1 } 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 ee9194ffb3cc6d660d4f99a3914ede7e4a3643fe..1f789b1d481234cafaa6e75c36a272bbd064482e 100644 +index ee9194ffb3cc6d660d4f99a3914ede7e4a3643fe..7e79fe61e4fd0d26f62a0515c437370ccb0abf58 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -@@ -30,6 +30,18 @@ public class ElderGuardian extends Guardian { +@@ -30,6 +30,23 @@ public class ElderGuardian extends Guardian { } @@ -3031,16 +3212,21 @@ index ee9194ffb3cc6d660d4f99a3914ede7e4a3643fe..1f789b1d481234cafaa6e75c36a272bb + public boolean rideableUnderWater() { + return true; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.elderGuardianControllable; ++ } + // Purpur end + public static AttributeSupplier.Builder createAttributes() { 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 5e207a3ea30ead2749c1121e2df8da53c8ebfdd7..753a6cee043ecb9c8af10ed0a1dfc9040bdf47b7 100644 +index 5e207a3ea30ead2749c1121e2df8da53c8ebfdd7..1af2aa7d2a3e6a21cd95b6c6f9a32d155c159f05 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -88,9 +88,22 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -88,9 +88,27 @@ public class EnderMan extends Monster implements NeutralMob { this.setPathfindingMalus(BlockPathTypes.WATER, -1.0F); } @@ -3054,6 +3240,11 @@ index 5e207a3ea30ead2749c1121e2df8da53c8ebfdd7..753a6cee043ecb9c8af10ed0a1dfc904 + public boolean rideableUnderWater() { + return level.purpurConfig.endermanRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.endermanControllable; ++ } + // Purpur end + @Override @@ -3063,7 +3254,7 @@ index 5e207a3ea30ead2749c1121e2df8da53c8ebfdd7..753a6cee043ecb9c8af10ed0a1dfc904 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)); -@@ -98,6 +111,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -98,6 +116,7 @@ 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)); @@ -3071,28 +3262,28 @@ index 5e207a3ea30ead2749c1121e2df8da53c8ebfdd7..753a6cee043ecb9c8af10ed0a1dfc904 this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, true, false)); -@@ -279,7 +293,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -279,7 +298,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override protected void customServerAiStep() { - if (this.level.isDay() && this.tickCount >= this.targetChangeTime + 600) { -+ if (getRider() == null && this.level.isDay() && this.tickCount >= this.targetChangeTime + 600) { // Purpur - no random teleporting ++ if ((getRider() == null || !this.isControllable()) && this.level.isDay() && this.tickCount >= this.targetChangeTime + 600) { // Purpur - no random teleporting float f = this.getBrightness(); 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 -@@ -385,6 +399,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -385,6 +404,7 @@ public class EnderMan extends Monster implements NeutralMob { public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { return false; -+ } else if (getRider() != null) { return super.hurt(source, amount); // Purpur - no teleporting on damage ++ } else if (getRider() != null && this.isControllable()) { return super.hurt(source, amount); // Purpur - no teleporting on damage } else if (source instanceof IndirectEntityDamageSource) { Entity entity = source.getDirectEntity(); boolean flag; 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 56d313c2c4a98eac7f4f594d2c29dcd82a4753ac..1cb9d71c89f36b0c01d3e44388794d9ff745ba2c 100644 +index 56d313c2c4a98eac7f4f594d2c29dcd82a4753ac..59ccb6ff28d888874ffb380bda9dbb3ded1d76ed 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java +++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -@@ -36,13 +36,27 @@ public class Endermite extends Monster { +@@ -36,13 +36,32 @@ public class Endermite extends Monster { this.xpReward = 3; } @@ -3106,6 +3297,11 @@ index 56d313c2c4a98eac7f4f594d2c29dcd82a4753ac..1cb9d71c89f36b0c01d3e44388794d9f + public boolean rideableUnderWater() { + return level.purpurConfig.endermiteRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.endermiteControllable; ++ } + // Purpur end + @Override @@ -3121,10 +3317,10 @@ index 56d313c2c4a98eac7f4f594d2c29dcd82a4753ac..1cb9d71c89f36b0c01d3e44388794d9f this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } 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 74e6216366afcc4d3e751b911042fcb5a05a283f..42da0e32be040bce2fd712b31aff1fe74d7de8e9 100644 +index 74e6216366afcc4d3e751b911042fcb5a05a283f..66a36712d57feaf6e7df73daeeb303e8565de452 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -47,10 +47,23 @@ public class Evoker extends SpellcasterIllager { +@@ -47,10 +47,28 @@ public class Evoker extends SpellcasterIllager { this.xpReward = 10; } @@ -3138,6 +3334,11 @@ index 74e6216366afcc4d3e751b911042fcb5a05a283f..42da0e32be040bce2fd712b31aff1fe7 + public boolean rideableUnderWater() { + return level.purpurConfig.evokerRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.evokerControllable; ++ } + // Purpur end + @Override @@ -3148,7 +3349,7 @@ index 74e6216366afcc4d3e751b911042fcb5a05a283f..42da0e32be040bce2fd712b31aff1fe7 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()); -@@ -59,6 +72,7 @@ public class Evoker extends SpellcasterIllager { +@@ -59,6 +77,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)); @@ -3157,10 +3358,10 @@ index 74e6216366afcc4d3e751b911042fcb5a05a283f..42da0e32be040bce2fd712b31aff1fe7 this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300)); this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300)); 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 f834e96c48cce6af65a65dafcdeb2cf0ea12763a..3429e259f7bd25a3032822b52bf2c4d9d3342f22 100644 +index f834e96c48cce6af65a65dafcdeb2cf0ea12763a..e58a819baee8a8836eef5de5bc4914893e07c7f6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java -@@ -44,11 +44,42 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -44,11 +44,47 @@ public class Ghast extends FlyingMob implements Enemy { this.moveControl = new Ghast.GhastMoveControl(this); } @@ -3176,6 +3377,11 @@ index f834e96c48cce6af65a65dafcdeb2cf0ea12763a..3429e259f7bd25a3032822b52bf2c4d9 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.ghastControllable; ++ } ++ ++ @Override + public double getMaxY() { + return level.purpurConfig.ghastMaxY; + } @@ -3183,7 +3389,7 @@ index f834e96c48cce6af65a65dafcdeb2cf0ea12763a..3429e259f7bd25a3032822b52bf2c4d9 + @Override + public void travel(Vec3 vec3) { + super.travel(vec3); -+ if (getRider() != null && !onGround) { ++ if (getRider() != null && this.isControllable() && !onGround) { + float speed = (float) getAttributeValue(Attributes.FLYING_SPEED); + setSpeed(speed); + Vec3 mot = getDeltaMovement(); @@ -3203,7 +3409,7 @@ index f834e96c48cce6af65a65dafcdeb2cf0ea12763a..3429e259f7bd25a3032822b52bf2c4d9 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entityliving) -> { return Math.abs(entityliving.getY() - this.getY()) <= 4.0D; })); -@@ -90,7 +121,7 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -90,7 +126,7 @@ public class Ghast extends FlyingMob implements Enemy { } public static AttributeSupplier.Builder createAttributes() { @@ -3212,7 +3418,7 @@ index f834e96c48cce6af65a65dafcdeb2cf0ea12763a..3429e259f7bd25a3032822b52bf2c4d9 } @Override -@@ -147,7 +178,7 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -147,7 +183,7 @@ public class Ghast extends FlyingMob implements Enemy { return 2.6F; } @@ -3221,7 +3427,7 @@ index f834e96c48cce6af65a65dafcdeb2cf0ea12763a..3429e259f7bd25a3032822b52bf2c4d9 private final Ghast ghast; private int floatDuration; -@@ -158,7 +189,7 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -158,7 +194,7 @@ public class Ghast extends FlyingMob implements Enemy { } @Override @@ -3231,10 +3437,10 @@ index f834e96c48cce6af65a65dafcdeb2cf0ea12763a..3429e259f7bd25a3032822b52bf2c4d9 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 0d578ab12c874bd2daccc4322a3fe1abafa4bc18..6350749549298df1f4abf5a4ac62f254729c5917 100644 +index 0d578ab12c874bd2daccc4322a3fe1abafa4bc18..8730d6be52a2edeccceb2ac3e6af12cdb20be5c2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java -@@ -14,6 +14,24 @@ public class Giant extends Monster { +@@ -14,6 +14,29 @@ public class Giant extends Monster { super(type, world); } @@ -3250,6 +3456,11 @@ index 0d578ab12c874bd2daccc4322a3fe1abafa4bc18..6350749549298df1f4abf5a4ac62f254 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.giantControllable; ++ } ++ ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); @@ -3260,10 +3471,10 @@ index 0d578ab12c874bd2daccc4322a3fe1abafa4bc18..6350749549298df1f4abf5a4ac62f254 protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { return 10.440001F; 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 8377fa2f583e88082ac5e908951e1ffc1ff973d3..8571da53ae382d418608d1beb722a0d1b5606ed6 100644 +index 8377fa2f583e88082ac5e908951e1ffc1ff973d3..a11e0a181323f1c409f583a8c647f433ad611d79 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -@@ -65,14 +65,35 @@ public class Guardian extends Monster { +@@ -65,14 +65,40 @@ public class Guardian extends Monster { this.xpReward = 10; this.setPathfindingMalus(BlockPathTypes.WATER, 0.0F); this.moveControl = new Guardian.GuardianMoveControl(this); @@ -3289,6 +3500,11 @@ index 8377fa2f583e88082ac5e908951e1ffc1ff973d3..8571da53ae382d418608d1beb722a0d1 + public boolean rideableUnderWater() { + return true; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.guardianControllable; ++ } + // Purpur end + @Override @@ -3299,7 +3515,7 @@ index 8377fa2f583e88082ac5e908951e1ffc1ff973d3..8571da53ae382d418608d1beb722a0d1 this.goalSelector.addGoal(4, new Guardian.GuardianAttackGoal(this)); this.goalSelector.addGoal(5, moveTowardsRestrictionGoal); this.goalSelector.addGoal(7, this.randomStrollGoal); -@@ -81,6 +102,7 @@ public class Guardian extends Monster { +@@ -81,6 +107,7 @@ public class Guardian extends Monster { this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); this.randomStrollGoal.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); moveTowardsRestrictionGoal.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); @@ -3307,16 +3523,16 @@ index 8377fa2f583e88082ac5e908951e1ffc1ff973d3..8571da53ae382d418608d1beb722a0d1 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new Guardian.GuardianAttackSelector(this))); } -@@ -330,7 +352,7 @@ public class Guardian extends Monster { +@@ -330,7 +357,7 @@ public class Guardian extends Monster { @Override public void travel(Vec3 movementInput) { if (this.isEffectiveAi() && this.isInWater()) { - this.moveRelative(0.1F, movementInput); -+ this.moveRelative(getRider() != null ? getSpeed() : 0.1F, movementInput); // Purpur ++ this.moveRelative(getRider() != null && this.isControllable() ? getSpeed() : 0.1F, movementInput); // Purpur this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.9D)); if (!this.isMoving() && this.getTarget() == null) { -@@ -437,7 +459,7 @@ public class Guardian extends Monster { +@@ -437,7 +464,7 @@ public class Guardian extends Monster { } } @@ -3325,7 +3541,7 @@ index 8377fa2f583e88082ac5e908951e1ffc1ff973d3..8571da53ae382d418608d1beb722a0d1 private final Guardian guardian; public GuardianMoveControl(Guardian guardian) { -@@ -445,8 +467,17 @@ public class Guardian extends Monster { +@@ -445,8 +472,17 @@ public class Guardian extends Monster { this.guardian = guardian; } @@ -3344,7 +3560,7 @@ index 8377fa2f583e88082ac5e908951e1ffc1ff973d3..8571da53ae382d418608d1beb722a0d1 if (this.operation == MoveControl.Operation.MOVE_TO && !this.guardian.getNavigation().isDone()) { Vec3 vec3 = new Vec3(this.wantedX - this.guardian.getX(), this.wantedY - this.guardian.getY(), this.wantedZ - this.guardian.getZ()); double d = vec3.length(); -@@ -456,7 +487,7 @@ public class Guardian extends Monster { +@@ -456,7 +492,7 @@ public class Guardian extends Monster { float h = (float)(Mth.atan2(vec3.z, vec3.x) * (double)(180F / (float)Math.PI)) - 90.0F; this.guardian.setYRot(this.rotlerp(this.guardian.getYRot(), h, 90.0F)); this.guardian.yBodyRot = this.guardian.getYRot(); @@ -3354,10 +3570,10 @@ index 8377fa2f583e88082ac5e908951e1ffc1ff973d3..8571da53ae382d418608d1beb722a0d1 this.guardian.setSpeed(j); double k = Math.sin((double)(this.guardian.tickCount + this.guardian.getId()) * 0.5D) * 0.05D; diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 4f683b4d35b5b07fffe344fab6ae15f5ccb6baf2..82a14d717e8f2ee005c2c410625b811cd016cdc3 100644 +index 4f683b4d35b5b07fffe344fab6ae15f5ccb6baf2..80b0d8145e0901af15a7b5e423e3d605a2803dd1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java -@@ -22,6 +22,18 @@ public class Husk extends Zombie { +@@ -22,6 +22,23 @@ public class Husk extends Zombie { super(type, world); } @@ -3371,16 +3587,21 @@ index 4f683b4d35b5b07fffe344fab6ae15f5ccb6baf2..82a14d717e8f2ee005c2c410625b811c + public boolean rideableUnderWater() { + return level.purpurConfig.huskRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.huskControllable; ++ } + // Purpur end + public static boolean checkHuskSpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (spawnReason == MobSpawnType.SPAWNER || world.canSeeSky(pos)); } 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 86f7fdd42461db151221d2c0d5cff6953392fa80..647796e6f3352582c49c780a860a617ce7b44ddd 100644 +index 86f7fdd42461db151221d2c0d5cff6953392fa80..98c85e31a2238cbfa31c12214ade49c4ba181702 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -59,10 +59,23 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -59,10 +59,28 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } @@ -3394,6 +3615,11 @@ index 86f7fdd42461db151221d2c0d5cff6953392fa80..647796e6f3352582c49c780a860a617c + public boolean rideableUnderWater() { + return level.purpurConfig.illusionerRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.illusionerControllable; ++ } + // Purpur end + @Override @@ -3404,7 +3630,7 @@ index 86f7fdd42461db151221d2c0d5cff6953392fa80..647796e6f3352582c49c780a860a617c this.goalSelector.addGoal(1, new SpellcasterIllager.SpellcasterCastingSpellGoal()); this.goalSelector.addGoal(4, new Illusioner.IllusionerMirrorSpellGoal()); this.goalSelector.addGoal(5, new Illusioner.IllusionerBlindnessSpellGoal()); -@@ -70,6 +83,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -70,6 +88,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)); @@ -3413,10 +3639,10 @@ index 86f7fdd42461db151221d2c0d5cff6953392fa80..647796e6f3352582c49c780a860a617c this.targetSelector.addGoal(2, (new NearestAttackableTargetGoal<>(this, Player.class, true)).setUnseenMemoryTicks(300)); this.targetSelector.addGoal(3, (new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)).setUnseenMemoryTicks(300)); diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index 2ffe85ee5565bcae56b8a64567c34eeed71e4e4b..95741b63d68bdf815212d718c3cc0fc689c0e4de 100644 +index 2ffe85ee5565bcae56b8a64567c34eeed71e4e4b..d111d6afb7c0937e48f7d212dec5f2d4a1c0a673 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -@@ -27,6 +27,23 @@ public class MagmaCube extends Slime { +@@ -27,6 +27,28 @@ public class MagmaCube extends Slime { super(type, world); } @@ -3432,6 +3658,11 @@ index 2ffe85ee5565bcae56b8a64567c34eeed71e4e4b..95741b63d68bdf815212d718c3cc0fc6 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.magmaCubeControllable; ++ } ++ ++ @Override + public float getJumpPower() { + return 0.42F * this.getBlockJumpFactor(); // from EntityLiving + } @@ -3440,7 +3671,7 @@ index 2ffe85ee5565bcae56b8a64567c34eeed71e4e4b..95741b63d68bdf815212d718c3cc0fc6 public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, (double)0.2F); } -@@ -57,7 +74,7 @@ public class MagmaCube extends Slime { +@@ -57,7 +79,7 @@ public class MagmaCube extends Slime { } @Override @@ -3449,7 +3680,7 @@ index 2ffe85ee5565bcae56b8a64567c34eeed71e4e4b..95741b63d68bdf815212d718c3cc0fc6 return this.isTiny() ? BuiltInLootTables.EMPTY : this.getType().getDefaultLootTable(); } -@@ -77,10 +94,11 @@ public class MagmaCube extends Slime { +@@ -77,10 +99,11 @@ public class MagmaCube extends Slime { } @Override @@ -3463,10 +3694,10 @@ index 2ffe85ee5565bcae56b8a64567c34eeed71e4e4b..95741b63d68bdf815212d718c3cc0fc6 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 5c35b73c13c3826be9705e05154076810a78d147..e4401125da58e0a82a30f9b4a137f5804ae2a8dc 100644 +index 5c35b73c13c3826be9705e05154076810a78d147..60aab3964ebd180b52b57fba0705a63445a349bc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -60,6 +60,59 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -60,6 +60,64 @@ public class Phantom extends FlyingMob implements Enemy { this.lookControl = new Phantom.PhantomLookControl(this); } @@ -3482,6 +3713,11 @@ index 5c35b73c13c3826be9705e05154076810a78d147..e4401125da58e0a82a30f9b4a137f580 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.phantomControllable; ++ } ++ ++ @Override + public double getMaxY() { + return level.purpurConfig.phantomMaxY; + } @@ -3489,7 +3725,7 @@ index 5c35b73c13c3826be9705e05154076810a78d147..e4401125da58e0a82a30f9b4a137f580 + @Override + public void travel(Vec3 vec3) { + super.travel(vec3); -+ if (getRider() != null && !onGround) { ++ if (getRider() != null && this.isControllable() && !onGround) { + float speed = (float) getAttributeValue(Attributes.FLYING_SPEED); + setSpeed(speed); + Vec3 mot = getDeltaMovement(); @@ -3526,7 +3762,7 @@ index 5c35b73c13c3826be9705e05154076810a78d147..e4401125da58e0a82a30f9b4a137f580 @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % Phantom.TICKS_PER_FLAP == 0; -@@ -72,9 +125,11 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -72,9 +130,11 @@ public class Phantom extends FlyingMob implements Enemy { @Override protected void registerGoals() { @@ -3538,16 +3774,16 @@ index 5c35b73c13c3826be9705e05154076810a78d147..e4401125da58e0a82a30f9b4a137f580 this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -144,7 +199,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -144,7 +204,7 @@ public class Phantom extends FlyingMob implements Enemy { @Override public void aiStep() { - if (this.isAlive() && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning -+ if (this.isAlive() && getRider() == null && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning // Purpur ++ if (this.isAlive() && (getRider() == null || !this.isControllable()) && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning // Purpur this.setSecondsOnFire(8); } -@@ -264,7 +319,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -264,7 +324,7 @@ public class Phantom extends FlyingMob implements Enemy { private AttackPhase() {} } @@ -3556,7 +3792,7 @@ index 5c35b73c13c3826be9705e05154076810a78d147..e4401125da58e0a82a30f9b4a137f580 private float speed = 0.1F; -@@ -272,8 +327,19 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -272,8 +332,19 @@ public class Phantom extends FlyingMob implements Enemy { super(entity); } @@ -3577,7 +3813,7 @@ index 5c35b73c13c3826be9705e05154076810a78d147..e4401125da58e0a82a30f9b4a137f580 if (Phantom.this.horizontalCollision) { Phantom.this.setYRot(Phantom.this.getYRot() + 180.0F); this.speed = 0.1F; -@@ -319,14 +385,20 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -319,14 +390,20 @@ public class Phantom extends FlyingMob implements Enemy { } } @@ -3601,10 +3837,10 @@ index 5c35b73c13c3826be9705e05154076810a78d147..e4401125da58e0a82a30f9b4a137f580 private class PhantomBodyRotationControl extends BodyRotationControl { 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 d77e6d1722bbaeaa921d56fbcb2fdf9757fe74fe..1457c0eda11000a0513e601ea60b6ca4a5b463b6 100644 +index d77e6d1722bbaeaa921d56fbcb2fdf9757fe74fe..9223c5cc4d5a1755020eb91ec7fea4943ffe499e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -63,15 +63,29 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve +@@ -63,15 +63,34 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve super(type, world); } @@ -3618,6 +3854,11 @@ index d77e6d1722bbaeaa921d56fbcb2fdf9757fe74fe..1457c0eda11000a0513e601ea60b6ca4 + public boolean rideableUnderWater() { + return level.purpurConfig.pillagerRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.pillagerControllable; ++ } + // Purpur end + @Override @@ -3635,10 +3876,10 @@ index d77e6d1722bbaeaa921d56fbcb2fdf9757fe74fe..1457c0eda11000a0513e601ea60b6ca4 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 4a7c6277301aacf83ee1ff5678c97d001e0cb2b9..ef09b5c6f52f342801213c701d8dbe68063129b9 100644 +index 4a7c6277301aacf83ee1ff5678c97d001e0cb2b9..aa33c5c709babb88d017d47e43de7a06954b940a 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,34 @@ public class Ravager extends Raider { +@@ -69,14 +69,39 @@ public class Ravager extends Raider { this.xpReward = 20; } @@ -3654,6 +3895,11 @@ index 4a7c6277301aacf83ee1ff5678c97d001e0cb2b9..ef09b5c6f52f342801213c701d8dbe68 + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.ravagerControllable; ++ } ++ ++ @Override + public void onMount(Player rider) { + super.onMount(rider); + getNavigation().stop(); @@ -3673,20 +3919,20 @@ index 4a7c6277301aacf83ee1ff5678c97d001e0cb2b9..ef09b5c6f52f342801213c701d8dbe68 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) -> { -@@ -150,7 +170,7 @@ public class Ravager extends Raider { +@@ -150,7 +175,7 @@ public class Ravager extends Raider { @Override public void aiStep() { super.aiStep(); - if (this.isAlive()) { -+ if (this.isAlive() && getRider() == null) { // Purpur ++ if (this.isAlive() && (getRider() == null || !this.isControllable())) { // Purpur if (this.isImmobile()) { this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.0D); } else { 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 a9dfe190f46230077e2e1bf9aacbf5375651f216..d61488d80c10c75698424698c8c6a08315e948bc 100644 +index a9dfe190f46230077e2e1bf9aacbf5375651f216..9507e4817e62c749726e4cf9914f51da0aeaba71 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -92,12 +92,26 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -92,12 +92,31 @@ public class Shulker extends AbstractGolem implements Enemy { this.lookControl = new Shulker.ShulkerLookControl(this); } @@ -3700,6 +3946,11 @@ index a9dfe190f46230077e2e1bf9aacbf5375651f216..d61488d80c10c75698424698c8c6a083 + public boolean rideableUnderWater() { + return level.purpurConfig.shulkerRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.shulkerControllable; ++ } + // Purpur end + @Override @@ -3713,7 +3964,7 @@ index a9dfe190f46230077e2e1bf9aacbf5375651f216..d61488d80c10c75698424698c8c6a083 this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{this.getClass()})).setAlertOthers()); this.targetSelector.addGoal(2, new Shulker.ShulkerNearestAttackGoal(this)); this.targetSelector.addGoal(3, new Shulker.ShulkerDefenseAttackGoal(this)); -@@ -598,7 +612,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -598,7 +617,7 @@ public class Shulker extends AbstractGolem implements Enemy { return b0 != 16 && b0 <= 15 ? DyeColor.byId(b0) : null; } @@ -3723,10 +3974,10 @@ index a9dfe190f46230077e2e1bf9aacbf5375651f216..d61488d80c10c75698424698c8c6a083 public ShulkerLookControl(Mob entity) { super(entity); diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -index 195cdae3f3a9fe8ecab2895a6000f6f855e9a9b8..b72866283e92433e95f0140037a1fd3182b0577a 100644 +index 195cdae3f3a9fe8ecab2895a6000f6f855e9a9b8..0073cfb4b68f4a5938336c063c382ad4c14536d9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -@@ -41,13 +41,27 @@ public class Silverfish extends Monster { +@@ -41,13 +41,32 @@ public class Silverfish extends Monster { super(type, world); } @@ -3740,6 +3991,11 @@ index 195cdae3f3a9fe8ecab2895a6000f6f855e9a9b8..b72866283e92433e95f0140037a1fd31 + public boolean rideableUnderWater() { + return level.purpurConfig.silverfishRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.silverfishControllable; ++ } + // Purpur end + @Override @@ -3755,10 +4011,10 @@ index 195cdae3f3a9fe8ecab2895a6000f6f855e9a9b8..b72866283e92433e95f0140037a1fd31 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -index 3a3f3358c4bbd16bdcadc56c6a865ecfb942ad54..a8c6971cc7d004bdc61a2b49e4542a8af46e8539 100644 +index 3a3f3358c4bbd16bdcadc56c6a865ecfb942ad54..e73644f453bed8523bfad47764018362a416b5ea 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -@@ -25,6 +25,18 @@ public class Skeleton extends AbstractSkeleton { +@@ -25,6 +25,23 @@ public class Skeleton extends AbstractSkeleton { super(type, world); } @@ -3772,16 +4028,21 @@ index 3a3f3358c4bbd16bdcadc56c6a865ecfb942ad54..a8c6971cc7d004bdc61a2b49e4542a8a + public boolean rideableUnderWater() { + return level.purpurConfig.skeletonRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.skeletonControllable; ++ } + // Purpur end + @Override protected void defineSynchedData() { super.defineSynchedData(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java -index 9c440625ce89686b2c250e6aaa62ed83b7015412..08935565ca3d1ee779abc491aa1e9eec13342bb5 100644 +index 9c440625ce89686b2c250e6aaa62ed83b7015412..4ded6fed9a5f3fbe8721bebc4f1fdb33d282e6bc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java -@@ -67,18 +67,50 @@ public class Slime extends Mob implements Enemy { +@@ -67,18 +67,55 @@ public class Slime extends Mob implements Enemy { public float squish; public float oSquish; private boolean wasOnGround; @@ -3804,14 +4065,19 @@ index 9c440625ce89686b2c250e6aaa62ed83b7015412..08935565ca3d1ee779abc491aa1e9eec + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.slimeControllable; ++ } ++ ++ @Override + public float getJumpPower() { + float height = super.getJumpPower(); -+ return getRider() != null && actualJump ? height * 1.5F : height; ++ return getRider() != null && this.isControllable() && actualJump ? height * 1.5F : height; + } + + @Override + public boolean onSpacebar() { -+ if (onGround && getRider() != null) { ++ if (onGround && getRider() != null && this.isControllable()) { + actualJump = true; + if (getRider().getForwardMot() == 0 || getRider().getStrafeMot() == 0) { + jumpFromGround(); // jump() here if not moving @@ -3832,7 +4098,7 @@ index 9c440625ce89686b2c250e6aaa62ed83b7015412..08935565ca3d1ee779abc491aa1e9eec this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entityliving) -> { return Math.abs(entityliving.getY() - this.getY()) <= 4.0D; })); -@@ -368,11 +400,12 @@ public class Slime extends Mob implements Enemy { +@@ -368,11 +405,12 @@ public class Slime extends Mob implements Enemy { } @Override @@ -3846,7 +4112,7 @@ index 9c440625ce89686b2c250e6aaa62ed83b7015412..08935565ca3d1ee779abc491aa1e9eec } @Nullable -@@ -405,7 +438,7 @@ public class Slime extends Mob implements Enemy { +@@ -405,7 +443,7 @@ public class Slime extends Mob implements Enemy { return super.getDimensions(pose).scale(0.255F * (float) this.getSize()); } @@ -3855,7 +4121,7 @@ index 9c440625ce89686b2c250e6aaa62ed83b7015412..08935565ca3d1ee779abc491aa1e9eec private float yRot; private int jumpDelay; -@@ -424,21 +457,33 @@ public class Slime extends Mob implements Enemy { +@@ -424,21 +462,33 @@ public class Slime extends Mob implements Enemy { } public void setWantedMovement(double speed) { @@ -3867,7 +4133,7 @@ index 9c440625ce89686b2c250e6aaa62ed83b7015412..08935565ca3d1ee779abc491aa1e9eec @Override public void tick() { + // Purpur start -+ if (slime.getRider() != null) { ++ if (slime.getRider() != null && slime.isControllable()) { + purpurTick(slime.getRider()); + if (slime.getForwardMot() != 0 || slime.getStrafeMot() != 0) { + if (jumpDelay > 10) { @@ -3882,30 +4148,30 @@ index 9c440625ce89686b2c250e6aaa62ed83b7015412..08935565ca3d1ee779abc491aa1e9eec this.mob.yHeadRot = this.mob.getYRot(); this.mob.yBodyRot = this.mob.getYRot(); - if (this.operation != MoveControl.Operation.MOVE_TO) { -+ } if (entity.getRider() == null && this.operation != MoveControl.Operation.MOVE_TO) { // Purpur ++ } if ((slime.getRider() == null || !slime.isControllable()) && this.operation != MoveControl.Operation.MOVE_TO) { // Purpur this.mob.setZza(0.0F); } else { this.operation = MoveControl.Operation.WAIT; if (this.mob.isOnGround()) { - this.mob.setSpeed((float) (this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED))); -+ this.mob.setSpeed((float) (this.getSpeedModifier() * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED) * (entity.getRider() != null && (entity.getRider().getForwardMot() != 0 || entity.getRider().getStrafeMot() != 0) ? 2.0D : 1.0D))); // Purpur ++ this.mob.setSpeed((float) (this.getSpeedModifier() * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED) * (slime.getRider() != null && slime.isControllable() && (slime.getRider().getForwardMot() != 0 || slime.getRider().getStrafeMot() != 0) ? 2.0D : 1.0D))); // Purpur if (this.jumpDelay-- <= 0) { this.jumpDelay = this.slime.getJumpDelay(); if (this.isAggressive) { -@@ -455,7 +500,7 @@ public class Slime extends Mob implements Enemy { +@@ -455,7 +505,7 @@ public class Slime extends Mob implements Enemy { this.mob.setSpeed(0.0F); } } else { - this.mob.setSpeed((float) (this.speedModifier * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED))); -+ this.mob.setSpeed((float) (this.getSpeedModifier() * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED) * (entity.getRider() != null && (entity.getRider().getForwardMot() != 0 || entity.getRider().getStrafeMot() != 0) ? 2.0D : 1.0D))); // Purpur ++ this.mob.setSpeed((float) (this.getSpeedModifier() * this.mob.getAttributeValue(Attributes.MOVEMENT_SPEED) * (slime.getRider() != null && slime.isControllable() && (slime.getRider().getForwardMot() != 0 || slime.getRider().getStrafeMot() != 0) ? 2.0D : 1.0D))); // Purpur } } 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 05b6c07c0705c7d8741c77baa87982e8e278dc97..a31a5186a48e6ba90c2a87bec104d10bdc3c50d5 100644 +index 05b6c07c0705c7d8741c77baa87982e8e278dc97..a1870354e1ea5d4ef4248c04f9fe8a3dc93b9d8b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java -@@ -51,14 +51,28 @@ public class Spider extends Monster { +@@ -51,14 +51,33 @@ public class Spider extends Monster { super(type, world); } @@ -3919,6 +4185,11 @@ index 05b6c07c0705c7d8741c77baa87982e8e278dc97..a31a5186a48e6ba90c2a87bec104d10b + public boolean rideableUnderWater() { + return level.purpurConfig.spiderRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.spiderControllable; ++ } + // Purpur end + @Override @@ -3935,10 +4206,10 @@ index 05b6c07c0705c7d8741c77baa87982e8e278dc97..a31a5186a48e6ba90c2a87bec104d10b this.targetSelector.addGoal(2, new Spider.SpiderTargetGoal<>(this, Player.class)); this.targetSelector.addGoal(3, new Spider.SpiderTargetGoal<>(this, IronGolem.class)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Stray.java b/src/main/java/net/minecraft/world/entity/monster/Stray.java -index baf614d2dbfb54d25fe06b28709ba2b7176c5213..8480687e452b7cad0d3e434cebe17e15c59bdc40 100644 +index baf614d2dbfb54d25fe06b28709ba2b7176c5213..b97862f653fe0aca93335fdd1ef0cf871626a58c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Stray.java +++ b/src/main/java/net/minecraft/world/entity/monster/Stray.java -@@ -21,6 +21,18 @@ public class Stray extends AbstractSkeleton { +@@ -21,6 +21,23 @@ public class Stray extends AbstractSkeleton { super(type, world); } @@ -3952,16 +4223,21 @@ index baf614d2dbfb54d25fe06b28709ba2b7176c5213..8480687e452b7cad0d3e434cebe17e15 + public boolean rideableUnderWater() { + return level.purpurConfig.strayRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.strayControllable; ++ } + // Purpur end + public static boolean checkStraySpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 0380f8800f87afa3f8ee2b4be508b5f08e35a6ac..07c3191f72520086dcf7ed7a00005003b773e08d 100644 +index 0380f8800f87afa3f8ee2b4be508b5f08e35a6ac..fc43b53e8a0c7674ec523536e615a4ee62ada61c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -97,6 +97,18 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -97,6 +97,23 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { this.setPathfindingMalus(BlockPathTypes.DAMAGE_FIRE, 0.0F); } @@ -3975,12 +4251,17 @@ index 0380f8800f87afa3f8ee2b4be508b5f08e35a6ac..07c3191f72520086dcf7ed7a00005003 + public boolean rideableUnderWater() { + return level.purpurConfig.striderRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.striderControllable; ++ } + // Purpur end + public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable(); -@@ -158,6 +170,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -158,6 +175,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @Override protected void registerGoals() { this.panicGoal = new PanicGoal(this, 1.65D); @@ -3988,7 +4269,7 @@ index 0380f8800f87afa3f8ee2b4be508b5f08e35a6ac..07c3191f72520086dcf7ed7a00005003 this.goalSelector.addGoal(1, this.panicGoal); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); this.temptGoal = new TemptGoal(this, 1.4D, Strider.TEMPT_ITEMS, false); -@@ -438,7 +451,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -438,7 +456,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { if (!enuminteractionresult.consumesAction()) { ItemStack itemstack = player.getItemInHand(hand); @@ -3998,10 +4279,10 @@ index 0380f8800f87afa3f8ee2b4be508b5f08e35a6ac..07c3191f72520086dcf7ed7a00005003 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 8ff606567297296e30e7e543890d9971d6c165b0..660b12722adbad6d80ed447b23e4718a1a21d706 100644 +index 8ff606567297296e30e7e543890d9971d6c165b0..66311fc3cf8f0ed50174bb834067d4365c393fef 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -58,6 +58,45 @@ public class Vex extends Monster { +@@ -58,6 +58,50 @@ public class Vex extends Monster { this.xpReward = 3; } @@ -4017,6 +4298,11 @@ index 8ff606567297296e30e7e543890d9971d6c165b0..660b12722adbad6d80ed447b23e4718a + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.vexControllable; ++ } ++ ++ @Override + public double getMaxY() { + return level.purpurConfig.vexMaxY; + } @@ -4024,7 +4310,7 @@ index 8ff606567297296e30e7e543890d9971d6c165b0..660b12722adbad6d80ed447b23e4718a + @Override + public void travel(Vec3 vec3) { + super.travel(vec3); -+ if (getRider() != null) { ++ if (getRider() != null && this.isControllable()) { + float speed; + if (onGround) { + speed = (float) getAttributeValue(Attributes.MOVEMENT_SPEED) * 0.1F; @@ -4047,16 +4333,16 @@ index 8ff606567297296e30e7e543890d9971d6c165b0..660b12722adbad6d80ed447b23e4718a @Override public boolean isFlapping() { return this.tickCount % Vex.TICKS_PER_FLAP == 0; -@@ -71,7 +110,7 @@ public class Vex extends Monster { +@@ -71,7 +115,7 @@ public class Vex extends Monster { @Override public void tick() { - this.noPhysics = true; -+ this.noPhysics = getRider() == null; // Purpur ++ this.noPhysics = getRider() == null || !this.isControllable(); // Purpur super.tick(); this.noPhysics = false; this.setNoGravity(true); -@@ -86,17 +125,19 @@ public class Vex extends Monster { +@@ -86,17 +130,19 @@ public class Vex extends Monster { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -4077,7 +4363,7 @@ index 8ff606567297296e30e7e543890d9971d6c165b0..660b12722adbad6d80ed447b23e4718a } @Override -@@ -217,14 +258,14 @@ public class Vex extends Monster { +@@ -217,14 +263,14 @@ public class Vex extends Monster { this.setDropChance(EquipmentSlot.MAINHAND, 0.0F); } @@ -4094,7 +4380,7 @@ index 8ff606567297296e30e7e543890d9971d6c165b0..660b12722adbad6d80ed447b23e4718a 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(); -@@ -233,7 +274,7 @@ public class Vex extends Monster { +@@ -233,7 +279,7 @@ public class Vex extends Monster { this.operation = MoveControl.Operation.WAIT; Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().scale(0.5D)); } else { @@ -4104,10 +4390,10 @@ index 8ff606567297296e30e7e543890d9971d6c165b0..660b12722adbad6d80ed447b23e4718a 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 b3a00bff85ade49b476c883350ff3563e1a4b842..489f604fda644f6cb576f1377fa31d23b1d83c48 100644 +index b3a00bff85ade49b476c883350ff3563e1a4b842..ddb0b32821aa6f61370ce8d262ce3d846c7ee9d0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -58,15 +58,29 @@ public class Vindicator extends AbstractIllager { +@@ -58,15 +58,34 @@ public class Vindicator extends AbstractIllager { super(type, world); } @@ -4121,6 +4407,11 @@ index b3a00bff85ade49b476c883350ff3563e1a4b842..489f604fda644f6cb576f1377fa31d23 + public boolean rideableUnderWater() { + return level.purpurConfig.vindicatorRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.vindicatorControllable; ++ } + // Purpur end + @Override @@ -4139,10 +4430,10 @@ index b3a00bff85ade49b476c883350ff3563e1a4b842..489f604fda644f6cb576f1377fa31d23 this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); 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 43e4562dcb0de8db42ff556134f649b5e0aa4284..75bc4ade487e92aa939b7a04bf3d22170bc6ea9e 100644 +index 43e4562dcb0de8db42ff556134f649b5e0aa4284..8e643b22a2af74acfe2b6710586a40c19ddcc085 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java -@@ -59,6 +59,18 @@ public class Witch extends Raider implements RangedAttackMob { +@@ -59,6 +59,23 @@ public class Witch extends Raider implements RangedAttackMob { super(type, world); } @@ -4156,12 +4447,17 @@ index 43e4562dcb0de8db42ff556134f649b5e0aa4284..75bc4ade487e92aa939b7a04bf3d2217 + public boolean rideableUnderWater() { + return level.purpurConfig.witchRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.witchControllable; ++ } + // Purpur end + @Override protected void registerGoals() { super.registerGoals(); -@@ -67,10 +79,12 @@ public class Witch extends Raider implements RangedAttackMob { +@@ -67,10 +84,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)); @@ -4175,10 +4471,10 @@ index 43e4562dcb0de8db42ff556134f649b5e0aa4284..75bc4ade487e92aa939b7a04bf3d2217 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 6acc46c3a6fe7648d2cc4d0aaef063633c74c20d..570a7f7c63cae90563129dc04aeb76a0d97ffcc3 100644 +index 6acc46c3a6fe7648d2cc4d0aaef063633c74c20d..54020eefe310f7cf653e97dfb525713d098e85ed 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -34,6 +34,18 @@ public class WitherSkeleton extends AbstractSkeleton { +@@ -34,6 +34,23 @@ public class WitherSkeleton extends AbstractSkeleton { this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); } @@ -4192,16 +4488,21 @@ index 6acc46c3a6fe7648d2cc4d0aaef063633c74c20d..570a7f7c63cae90563129dc04aeb76a0 + public boolean rideableUnderWater() { + return level.purpurConfig.witherSkeletonRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.witherSkeletonControllable; ++ } + // Purpur end + @Override 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 056e4c2f7f632dadc0015710c032a0b718d46ff9..54a545836f3c318e7f90d43aca7fea8a6a56851d 100644 +index 056e4c2f7f632dadc0015710c032a0b718d46ff9..a6aaffc41a39be4ae1da44d54a27d324927e47d0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -68,6 +68,18 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -68,6 +68,23 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { this.xpReward = 5; } @@ -4215,12 +4516,17 @@ index 056e4c2f7f632dadc0015710c032a0b718d46ff9..54a545836f3c318e7f90d43aca7fea8a + public boolean rideableUnderWater() { + return level.purpurConfig.zoglinRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.zoglinControllable; ++ } + // Purpur end + @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -90,11 +102,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -90,11 +107,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { } private static void initIdleActivity(Brain brain) { @@ -4234,7 +4540,7 @@ index 056e4c2f7f632dadc0015710c032a0b718d46ff9..54a545836f3c318e7f90d43aca7fea8a } private Optional findNearestValidAttackTarget() { -@@ -183,7 +195,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -183,7 +200,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { @Override public Brain getBrain() { @@ -4243,19 +4549,19 @@ index 056e4c2f7f632dadc0015710c032a0b718d46ff9..54a545836f3c318e7f90d43aca7fea8a } protected void updateActivity() { -@@ -200,6 +212,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -200,6 +217,7 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { @Override protected void customServerAiStep() { this.level.getProfiler().push("zoglinBrain"); -+ if (getRider() == null) // Purpur - only use brain if no rider ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel)this.level, this); this.level.getProfiler().pop(); 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 35f0203d260c11b729c30e6241316fda4b70bfd7..ceb15697d28799064b3fab56b5f53b6249e81789 100644 +index 35f0203d260c11b729c30e6241316fda4b70bfd7..cd70d228a690485c7f379d0744262907d19fa080 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -104,11 +104,25 @@ public class Zombie extends Monster { +@@ -104,11 +104,30 @@ public class Zombie extends Monster { this(EntityType.ZOMBIE, world); } @@ -4269,6 +4575,11 @@ index 35f0203d260c11b729c30e6241316fda4b70bfd7..ceb15697d28799064b3fab56b5f53b62 + public boolean rideableUnderWater() { + return level.purpurConfig.zombieRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.zombieControllable; ++ } + // Purpur end + @Override @@ -4282,10 +4593,10 @@ index 35f0203d260c11b729c30e6241316fda4b70bfd7..ceb15697d28799064b3fab56b5f53b62 } diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index 415c8a8142867974dfc4722bac933257a28efc1b..a069a923f071991f8215bb5cf0d1c2bb4de3f344 100644 +index 415c8a8142867974dfc4722bac933257a28efc1b..b74a2dd32481dd2135b4aa4b860cf9e1b743af66 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -75,6 +75,18 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -75,6 +75,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { this.setVillagerData(this.getVillagerData().setProfession((VillagerProfession) Registry.VILLAGER_PROFESSION.getRandom(this.random))); } @@ -4299,16 +4610,21 @@ index 415c8a8142867974dfc4722bac933257a28efc1b..a069a923f071991f8215bb5cf0d1c2bb + public boolean rideableUnderWater() { + return level.purpurConfig.zombieVillagerRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.zombieVillagerControllable; ++ } + // Purpur end + @Override protected void defineSynchedData() { super.defineSynchedData(); 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 c1e0cf7d86d7b45cc4ca342d80f0dc3fe43b0bfd..2dec8be9b199e9bcf0970774afbd19a4861d802f 100644 +index c1e0cf7d86d7b45cc4ca342d80f0dc3fe43b0bfd..af60b2666529fbf83578672e9a4a03d4783602fe 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -59,6 +59,18 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -59,6 +59,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.setPathfindingMalus(BlockPathTypes.LAVA, 8.0F); } @@ -4322,16 +4638,21 @@ index c1e0cf7d86d7b45cc4ca342d80f0dc3fe43b0bfd..2dec8be9b199e9bcf0970774afbd19a4 + public boolean rideableUnderWater() { + return level.purpurConfig.zombifiedPiglinRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.zombifiedPiglinControllable; ++ } + // Purpur end + @Override public void setPersistentAngerTarget(@Nullable UUID uuid) { this.persistentAngerTarget = uuid; 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 fc43b1d5dcb53456bb24ae46ea08b97b14403c86..9e65970033249315b534441c80725683ce23ff0b 100644 +index fc43b1d5dcb53456bb24ae46ea08b97b14403c86..1d3227a216b7daea6555f1c859c9a571050ff18b 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 -@@ -67,6 +67,18 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -67,6 +67,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { this.xpReward = 5; } @@ -4345,25 +4666,30 @@ index fc43b1d5dcb53456bb24ae46ea08b97b14403c86..9e65970033249315b534441c80725683 + public boolean rideableUnderWater() { + return level.purpurConfig.hoglinRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.hoglinControllable; ++ } + // Purpur end + @Override public boolean canBeLeashed(Player player) { return !this.isLeashed(); -@@ -130,7 +142,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -130,7 +147,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @Override protected void customServerAiStep() { this.level.getProfiler().push("hoglinBrain"); - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if (getRider() == null && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel)this.level, this); this.level.getProfiler().pop(); HoglinAi.updateActivity(this); 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 16116a4f907ff691646a3e98dd8e25e0f26c3c49..347244dcdea7ed3bb15dad4c0c5019ae9a1de9d1 100644 +index 16116a4f907ff691646a3e98dd8e25e0f26c3c49..7ac0a9ee569043dcfaa2e19141060c5358e03f9f 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 -@@ -96,6 +96,18 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -96,6 +96,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento this.xpReward = 5; } @@ -4377,25 +4703,30 @@ index 16116a4f907ff691646a3e98dd8e25e0f26c3c49..347244dcdea7ed3bb15dad4c0c5019ae + public boolean rideableUnderWater() { + return level.purpurConfig.piglinRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.piglinControllable; ++ } + // Purpur end + @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); -@@ -292,7 +304,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -292,7 +309,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override protected void customServerAiStep() { this.level.getProfiler().push("piglinBrain"); - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if (getRider() == null && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); this.level.getProfiler().pop(); PiglinAi.updateActivity(this); 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 ea0040a3494709efb4819c7530dbcc37aa62e86a..5025d4571a34fe9e0e58ada6b81b064716b8f672 100644 +index ea0040a3494709efb4819c7530dbcc37aa62e86a..8ad63ae82a8b6a26c03e53b6d043128a8e038863 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 -@@ -40,6 +40,18 @@ public class PiglinBrute extends AbstractPiglin { +@@ -40,6 +40,23 @@ public class PiglinBrute extends AbstractPiglin { this.xpReward = 20; } @@ -4409,12 +4740,17 @@ index ea0040a3494709efb4819c7530dbcc37aa62e86a..5025d4571a34fe9e0e58ada6b81b0647 + public boolean rideableUnderWater() { + return level.purpurConfig.piglinBruteRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.piglinBruteControllable; ++ } + // Purpur end + public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0D).add(Attributes.MOVEMENT_SPEED, (double)0.35F).add(Attributes.ATTACK_DAMAGE, 7.0D); } -@@ -69,7 +81,7 @@ public class PiglinBrute extends AbstractPiglin { +@@ -69,7 +86,7 @@ public class PiglinBrute extends AbstractPiglin { @Override public Brain getBrain() { @@ -4423,19 +4759,19 @@ index ea0040a3494709efb4819c7530dbcc37aa62e86a..5025d4571a34fe9e0e58ada6b81b0647 } @Override -@@ -85,6 +97,7 @@ public class PiglinBrute extends AbstractPiglin { +@@ -85,6 +102,7 @@ public class PiglinBrute extends AbstractPiglin { @Override protected void customServerAiStep() { this.level.getProfiler().push("piglinBruteBrain"); -+ if (getRider() == null) // Purpur - only use brain if no rider ++ if (getRider() == null || this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel)this.level, this); this.level.getProfiler().pop(); PiglinBruteAi.updateActivity(this); 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 7d6bc3c253a77adfc7c35383caadb37154dc5c0f..d951bc1d709f64871a01edc81f091c8f4c032d34 100644 +index 7d6bc3c253a77adfc7c35383caadb37154dc5c0f..dd37faff29a8c8199fd0c6730d9bdc79ad97e254 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -153,6 +153,23 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -153,6 +153,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); } @@ -4451,6 +4787,11 @@ index 7d6bc3c253a77adfc7c35383caadb37154dc5c0f..d951bc1d709f64871a01edc81f091c8f + } + + @Override ++ public boolean isControllable() { ++ return level.purpurConfig.villagerControllable; ++ } ++ ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); + } @@ -4459,16 +4800,16 @@ index 7d6bc3c253a77adfc7c35383caadb37154dc5c0f..d951bc1d709f64871a01edc81f091c8f @Override public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error -@@ -250,7 +267,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -250,7 +272,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.level.getProfiler().push("villagerBrain"); // Pufferfish start if (!inactive) { - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if (getRider() == null && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); // Paper } // Pufferfish end -@@ -310,7 +327,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -310,7 +332,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(); @@ -4477,7 +4818,7 @@ index 7d6bc3c253a77adfc7c35383caadb37154dc5c0f..d951bc1d709f64871a01edc81f091c8f } else { boolean flag = this.getOffers().isEmpty(); -@@ -323,8 +340,9 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -323,8 +345,9 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (flag) { @@ -4489,10 +4830,10 @@ index 7d6bc3c253a77adfc7c35383caadb37154dc5c0f..d951bc1d709f64871a01edc81f091c8f this.startTrading(player); } diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 642279bb7e15db9f662094ffd6ded2e3c7af3fd6..ab648e7dafd78f414646cef96b422e87da5c1982 100644 +index 642279bb7e15db9f662094ffd6ded2e3c7af3fd6..ac17d5e9fa110c5de297be2a762631ce03e081eb 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -67,6 +67,18 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -67,6 +67,23 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill //this.setDespawnDelay(48000); // CraftBukkit - set default from MobSpawnerTrader // Paper - move back to MobSpawnerTrader - Vanilla behavior is that only traders spawned by it have this value set. } @@ -4506,12 +4847,17 @@ index 642279bb7e15db9f662094ffd6ded2e3c7af3fd6..ab648e7dafd78f414646cef96b422e87 + public boolean rideableUnderWater() { + return level.purpurConfig.wanderingTraderRidableInWater; + } ++ ++ @Override ++ public boolean isControllable() { ++ return level.purpurConfig.wanderingTraderControllable; ++ } + // Purpur end + @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -@@ -114,8 +126,9 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -114,8 +131,9 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill } if (this.getOffers().isEmpty()) { @@ -4667,10 +5013,10 @@ index 720233b1dce48d23c5852765c8614ee86dc14695..85208c8d1058d46f3b2500efa7526471 + } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0ce93836629522c2ff2a57226583009302271daf..aec3628645d75ae0b4bf7207a4c80af465561151 100644 +index 0ce93836629522c2ff2a57226583009302271daf..969c78aef40aae497a76dd7f3e9c230577a8d31f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -88,4 +88,532 @@ public class PurpurWorldConfig { +@@ -88,4 +88,668 @@ public class PurpurWorldConfig { final Map value = PurpurConfig.getMap("world-settings." + worldName + "." + path, null); return value.isEmpty() ? fallback : value; } @@ -4685,83 +5031,105 @@ index 0ce93836629522c2ff2a57226583009302271daf..aec3628645d75ae0b4bf7207a4c80af4 + } + + public boolean axolotlRidable = false; ++ public boolean axolotlControllable = true; + private void axolotlSettings() { + axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); ++ axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); + } + + public boolean batRidable = false; + public boolean batRidableInWater = false; -+ public double batMaxY = 256D; ++ public boolean batControllable = true; ++ public double batMaxY = 320D; + private void batSettings() { + batRidable = getBoolean("mobs.bat.ridable", batRidable); + batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); ++ batControllable = getBoolean("mobs.bat.controllable", batControllable); + batMaxY = getDouble("mobs.bat.ridable-max-y", batMaxY); + } + + public boolean beeRidable = false; + public boolean beeRidableInWater = false; -+ public double beeMaxY = 256D; ++ public boolean beeControllable = true; ++ public double beeMaxY = 320D; + private void beeSettings() { + beeRidable = getBoolean("mobs.bee.ridable", beeRidable); + beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); ++ beeControllable = getBoolean("mobs.bee.controllable", beeControllable); + beeMaxY = getDouble("mobs.bee.ridable-max-y", beeMaxY); + } + + public boolean blazeRidable = false; + public boolean blazeRidableInWater = false; -+ public double blazeMaxY = 256D; ++ public boolean blazeControllable = true; ++ public double blazeMaxY = 320D; + private void blazeSettings() { + blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); + blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); ++ blazeControllable = getBoolean("mobs.blaze.controllable", blazeControllable); + blazeMaxY = getDouble("mobs.blaze.ridable-max-y", blazeMaxY); + } + + public boolean catRidable = false; + public boolean catRidableInWater = false; ++ public boolean catControllable = true; + private void catSettings() { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); ++ catControllable = getBoolean("mobs.cat.controllable", catControllable); + } + + public boolean caveSpiderRidable = false; + public boolean caveSpiderRidableInWater = false; ++ public boolean caveSpiderControllable = true; + private void caveSpiderSettings() { + caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); + caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); ++ caveSpiderControllable = getBoolean("mobs.cave_spider.controllable", caveSpiderControllable); + } + + public boolean chickenRidable = false; + public boolean chickenRidableInWater = false; ++ public boolean chickenControllable = true; + private void chickenSettings() { + chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); + chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); ++ chickenControllable = getBoolean("mobs.chicken.controllable", chickenControllable); + } + + public boolean codRidable = false; ++ public boolean codControllable = true; + private void codSettings() { + codRidable = getBoolean("mobs.cod.ridable", codRidable); ++ codControllable = getBoolean("mobs.cod.controllable", codControllable); + } + + public boolean cowRidable = false; + public boolean cowRidableInWater = false; ++ public boolean cowControllable = true; + private void cowSettings() { + cowRidable = getBoolean("mobs.cow.ridable", cowRidable); + cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); ++ cowControllable = getBoolean("mobs.cow.controllable", cowControllable); + } + + public boolean creeperRidable = false; + public boolean creeperRidableInWater = false; ++ public boolean creeperControllable = true; + private void creeperSettings() { + creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); + creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); ++ creeperControllable = getBoolean("mobs.creeper.controllable", creeperControllable); + } + + public boolean dolphinRidable = false; ++ public boolean dolphinControllable = true; + public int dolphinSpitCooldown = 20; + public float dolphinSpitSpeed = 1.0F; + public float dolphinSpitDamage = 2.0F; + private void dolphinSettings() { + dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); ++ dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); + dolphinSpitCooldown = getInt("mobs.dolphin.spit.cooldown", dolphinSpitCooldown); + dolphinSpitSpeed = (float) getDouble("mobs.dolphin.spit.speed", dolphinSpitSpeed); + dolphinSpitDamage = (float) getDouble("mobs.dolphin.spit.damage", dolphinSpitDamage); @@ -4774,91 +5142,117 @@ index 0ce93836629522c2ff2a57226583009302271daf..aec3628645d75ae0b4bf7207a4c80af4 + + public boolean drownedRidable = false; + public boolean drownedRidableInWater = false; ++ public boolean drownedControllable = true; + private void drownedSettings() { + drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); + drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); ++ drownedControllable = getBoolean("mobs.drowned.controllable", drownedControllable); + } + + public boolean elderGuardianRidable = false; ++ public boolean elderGuardianControllable = true; + private void elderGuardianSettings() { + elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); ++ elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); + } + + public boolean enderDragonRidable = false; + public boolean enderDragonRidableInWater = false; -+ public double enderDragonMaxY = 256D; ++ public boolean enderDragonControllable = true; ++ public double enderDragonMaxY = 320D; + private void enderDragonSettings() { + enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); + enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); ++ enderDragonControllable = getBoolean("mobs.ender_dragon.controllable", enderDragonControllable); + enderDragonMaxY = getDouble("mobs.ender_dragon.ridable-max-y", enderDragonMaxY); + } + + public boolean endermanRidable = false; + public boolean endermanRidableInWater = false; ++ public boolean endermanControllable = true; + private void endermanSettings() { + endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); + endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); ++ endermanControllable = getBoolean("mobs.enderman.controllable", endermanControllable); + } + + public boolean endermiteRidable = false; + public boolean endermiteRidableInWater = false; ++ public boolean endermiteControllable = true; + private void endermiteSettings() { + endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); + endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); ++ endermiteControllable = getBoolean("mobs.endermite.controllable", endermiteControllable); + } + + public boolean evokerRidable = false; + public boolean evokerRidableInWater = false; ++ public boolean evokerControllable = true; + private void evokerSettings() { + evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); + evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); ++ evokerControllable = getBoolean("mobs.evoker.controllable", evokerControllable); + } + + public boolean foxRidable = false; + public boolean foxRidableInWater = false; ++ public boolean foxControllable = true; + private void foxSettings() { + foxRidable = getBoolean("mobs.fox.ridable", foxRidable); + foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); ++ foxControllable = getBoolean("mobs.fox.controllable", foxControllable); + } + + public boolean ghastRidable = false; + public boolean ghastRidableInWater = false; -+ public double ghastMaxY = 256D; ++ public boolean ghastControllable = true; ++ public double ghastMaxY = 320D; + private void ghastSettings() { + ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); + ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); ++ ghastControllable = getBoolean("mobs.ghast.controllable", ghastControllable); + ghastMaxY = getDouble("mobs.ghast.ridable-max-y", ghastMaxY); + } + + public boolean giantRidable = false; + public boolean giantRidableInWater = false; ++ public boolean giantControllable = true; + private void giantSettings() { + giantRidable = getBoolean("mobs.giant.ridable", giantRidable); + giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); ++ giantControllable = getBoolean("mobs.giant.controllable", giantControllable); + } + + public boolean glowSquidRidable = false; ++ public boolean glowSquidControllable = true; + private void glowSquidSettings() { + glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); ++ glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); + } + + public boolean goatRidable = false; + public boolean goatRidableInWater = false; ++ public boolean goatControllable = true; + private void goatSettings() { + goatRidable = getBoolean("mobs.goat.ridable", goatRidable); + goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); ++ goatControllable = getBoolean("mobs.goat.controllable", goatControllable); + } + + public boolean guardianRidable = false; ++ public boolean guardianControllable = true; + private void guardianSettings() { + guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); ++ guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); + } + + public boolean hoglinRidable = false; + public boolean hoglinRidableInWater = false; ++ public boolean hoglinControllable = true; + private void hoglinSettings() { + hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); + hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); ++ hoglinControllable = getBoolean("mobs.hoglin.controllable", hoglinControllable); + } + + public boolean horseRidableInWater = false; @@ -4868,46 +5262,58 @@ index 0ce93836629522c2ff2a57226583009302271daf..aec3628645d75ae0b4bf7207a4c80af4 + + public boolean huskRidable = false; + public boolean huskRidableInWater = false; ++ public boolean huskControllable = true; + private void huskSettings() { + huskRidable = getBoolean("mobs.husk.ridable", huskRidable); + huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); ++ huskControllable = getBoolean("mobs.husk.controllable", huskControllable); + } + + public boolean illusionerRidable = false; + public boolean illusionerRidableInWater = false; ++ public boolean illusionerControllable = true; + private void illusionerSettings() { + illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); + illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); ++ illusionerControllable = getBoolean("mobs.illusioner.controllable", illusionerControllable); + } + + public boolean ironGolemRidable = false; + public boolean ironGolemRidableInWater = false; ++ public boolean ironGolemControllable = true; + public boolean ironGolemCanSwim = false; + private void ironGolemSettings() { + ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); + ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); ++ ironGolemControllable = getBoolean("mobs.iron_golem.controllable", ironGolemControllable); + ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); + } + + public boolean llamaRidable = false; + public boolean llamaRidableInWater = false; ++ public boolean llamaControllable = true; + private void llamaSettings() { + llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); + llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); ++ llamaControllable = getBoolean("mobs.llama.controllable", llamaControllable); + } + + public boolean magmaCubeRidable = false; + public boolean magmaCubeRidableInWater = false; ++ public boolean magmaCubeControllable = true; + private void magmaCubeSettings() { + magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); + magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); ++ magmaCubeControllable = getBoolean("mobs.magma_cube.controllable", magmaCubeControllable); + } + + public boolean mooshroomRidable = false; + public boolean mooshroomRidableInWater = false; ++ public boolean mooshroomControllable = true; + private void mooshroomSettings() { + mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); + mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); ++ mooshroomControllable = getBoolean("mobs.mooshroom.controllable", mooshroomControllable); + } + + public boolean muleRidableInWater = false; @@ -4917,36 +5323,44 @@ index 0ce93836629522c2ff2a57226583009302271daf..aec3628645d75ae0b4bf7207a4c80af4 + + public boolean ocelotRidable = false; + public boolean ocelotRidableInWater = false; ++ public boolean ocelotControllable = true; + private void ocelotSettings() { + ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); + ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); ++ ocelotControllable = getBoolean("mobs.ocelot.controllable", ocelotControllable); + } + + public boolean pandaRidable = false; + public boolean pandaRidableInWater = false; ++ public boolean pandaControllable = true; + private void pandaSettings() { + pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); + pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); ++ pandaControllable = getBoolean("mobs.panda.controllable", pandaControllable); + } + + public boolean parrotRidable = false; + public boolean parrotRidableInWater = false; -+ public double parrotMaxY = 256D; ++ public boolean parrotControllable = true; ++ public double parrotMaxY = 320D; + private void parrotSettings() { + parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); + parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); ++ parrotControllable = getBoolean("mobs.parrot.controllable", parrotControllable); + parrotMaxY = getDouble("mobs.parrot.ridable-max-y", parrotMaxY); + } + + public boolean phantomRidable = false; + public boolean phantomRidableInWater = false; -+ public double phantomMaxY = 256D; ++ public boolean phantomControllable = true; ++ public double phantomMaxY = 320D; + public float phantomFlameDamage = 1.0F; + public int phantomFlameFireTime = 8; + public boolean phantomAllowGriefing = false; + private void phantomSettings() { + phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); + phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); ++ phantomControllable = getBoolean("mobs.phantom.controllable", phantomControllable); + phantomMaxY = getDouble("mobs.phantom.ridable-max-y", phantomMaxY); + phantomFlameDamage = (float) getDouble("mobs.phantom.flames.damage", phantomFlameDamage); + phantomFlameFireTime = getInt("mobs.phantom.flames.fire-time", phantomFlameFireTime); @@ -4955,89 +5369,115 @@ index 0ce93836629522c2ff2a57226583009302271daf..aec3628645d75ae0b4bf7207a4c80af4 + + public boolean pigRidable = false; + public boolean pigRidableInWater = false; ++ public boolean pigControllable = true; + private void pigSettings() { + pigRidable = getBoolean("mobs.pig.ridable", pigRidable); + pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); ++ pigControllable = getBoolean("mobs.pig.controllable", pigControllable); + } + + public boolean piglinRidable = false; + public boolean piglinRidableInWater = false; ++ public boolean piglinControllable = true; + private void piglinSettings() { + piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); + piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); ++ piglinControllable = getBoolean("mobs.piglin.controllable", piglinControllable); + } + + public boolean piglinBruteRidable = false; + public boolean piglinBruteRidableInWater = false; ++ public boolean piglinBruteControllable = true; + private void piglinBruteSettings() { + piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); + piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); ++ piglinBruteControllable = getBoolean("mobs.piglin_brute.controllable", piglinBruteControllable); + } + + public boolean pillagerRidable = false; + public boolean pillagerRidableInWater = false; ++ public boolean pillagerControllable = true; + private void pillagerSettings() { + pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); + pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); ++ pillagerControllable = getBoolean("mobs.pillager.controllable", pillagerControllable); + } + + public boolean polarBearRidable = false; + public boolean polarBearRidableInWater = false; ++ public boolean polarBearControllable = true; + private void polarBearSettings() { + polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); + polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); ++ polarBearControllable = getBoolean("mobs.polar_bear.controllable", polarBearControllable); + } + + public boolean pufferfishRidable = false; ++ public boolean pufferfishControllable = true; + private void pufferfishSettings() { + pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); ++ pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); + } + + public boolean rabbitRidable = false; + public boolean rabbitRidableInWater = false; ++ public boolean rabbitControllable = true; + private void rabbitSettings() { + rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); + rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); ++ rabbitControllable = getBoolean("mobs.rabbit.controllable", rabbitControllable); + } + + public boolean ravagerRidable = false; + public boolean ravagerRidableInWater = false; ++ public boolean ravagerControllable = true; + private void ravagerSettings() { + ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); + ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); ++ ravagerControllable = getBoolean("mobs.ravager.controllable", ravagerControllable); + } + + public boolean salmonRidable = false; ++ public boolean salmonControllable = true; + private void salmonSettings() { + salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); ++ salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); + } + + public boolean sheepRidable = false; + public boolean sheepRidableInWater = false; ++ public boolean sheepControllable = true; + private void sheepSettings() { + sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); + sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); ++ sheepControllable = getBoolean("mobs.sheep.controllable", sheepControllable); + } + + public boolean shulkerRidable = false; + public boolean shulkerRidableInWater = false; ++ public boolean shulkerControllable = true; + private void shulkerSettings() { + shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); + shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); ++ shulkerControllable = getBoolean("mobs.shulker.controllable", shulkerControllable); + } + + public boolean silverfishRidable = false; + public boolean silverfishRidableInWater = false; ++ public boolean silverfishControllable = true; + private void silverfishSettings() { + silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); + silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); ++ silverfishControllable = getBoolean("mobs.silverfish.controllable", silverfishControllable); + } + + public boolean skeletonRidable = false; + public boolean skeletonRidableInWater = false; ++ public boolean skeletonControllable = true; + private void skeletonSettings() { + skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); + skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); ++ skeletonControllable = getBoolean("mobs.skeleton.controllable", skeletonControllable); + } + + public boolean skeletonHorseRidableInWater = true; @@ -5049,137 +5489,175 @@ index 0ce93836629522c2ff2a57226583009302271daf..aec3628645d75ae0b4bf7207a4c80af4 + + public boolean slimeRidable = false; + public boolean slimeRidableInWater = false; ++ public boolean slimeControllable = true; + private void slimeSettings() { + slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); + slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); ++ slimeControllable = getBoolean("mobs.slime.controllable", slimeControllable); + } + + public boolean snowGolemRidable = false; + public boolean snowGolemRidableInWater = false; ++ public boolean snowGolemControllable = true; + public boolean snowGolemLeaveTrailWhenRidden = false; + private void snowGolemSettings() { + snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); + snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); ++ snowGolemControllable = getBoolean("mobs.snow_golem.controllable", snowGolemControllable); + snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); + } + + public boolean squidRidable = false; ++ public boolean squidControllable = true; + private void squidSettings() { + squidRidable = getBoolean("mobs.squid.ridable", squidRidable); ++ squidControllable = getBoolean("mobs.squid.controllable", squidControllable); + } + + public boolean spiderRidable = false; + public boolean spiderRidableInWater = false; ++ public boolean spiderControllable = true; + private void spiderSettings() { + spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); + spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); ++ spiderControllable = getBoolean("mobs.spider.controllable", spiderControllable); + } + + public boolean strayRidable = false; + public boolean strayRidableInWater = false; ++ public boolean strayControllable = true; + private void straySettings() { + strayRidable = getBoolean("mobs.stray.ridable", strayRidable); + strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); ++ strayControllable = getBoolean("mobs.stray.controllable", strayControllable); + } + + public boolean striderRidable = false; + public boolean striderRidableInWater = false; ++ public boolean striderControllable = true; + private void striderSettings() { + striderRidable = getBoolean("mobs.strider.ridable", striderRidable); + striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); ++ striderControllable = getBoolean("mobs.strider.controllable", striderControllable); + } + + public boolean traderLlamaRidable = false; + public boolean traderLlamaRidableInWater = false; ++ public boolean traderLlamaControllable = true; + private void traderLlamaSettings() { + traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); + traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); ++ traderLlamaControllable = getBoolean("mobs.trader_llama.controllable", traderLlamaControllable); + } + + public boolean tropicalFishRidable = false; ++ public boolean tropicalFishControllable = true; + private void tropicalFishSettings() { + tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); ++ tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); + } + + public boolean turtleRidable = false; + public boolean turtleRidableInWater = false; ++ public boolean turtleControllable = true; + private void turtleSettings() { + turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); + turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); ++ turtleControllable = getBoolean("mobs.turtle.controllable", turtleControllable); + } + + public boolean vexRidable = false; + public boolean vexRidableInWater = false; -+ public double vexMaxY = 256D; ++ public boolean vexControllable = true; ++ public double vexMaxY = 320D; + private void vexSettings() { + vexRidable = getBoolean("mobs.vex.ridable", vexRidable); + vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); ++ vexControllable = getBoolean("mobs.vex.controllable", vexControllable); + vexMaxY = getDouble("mobs.vex.ridable-max-y", vexMaxY); + } + + public boolean villagerRidable = false; + public boolean villagerRidableInWater = false; ++ public boolean villagerControllable = true; + private void villagerSettings() { + villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); + villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); ++ villagerControllable = getBoolean("mobs.villager.controllable", villagerControllable); + } + + public boolean vindicatorRidable = false; + public boolean vindicatorRidableInWater = false; ++ public boolean vindicatorControllable = true; + private void vindicatorSettings() { + vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); + vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); ++ vindicatorControllable = getBoolean("mobs.vindicator.controllable", vindicatorControllable); + } + + public boolean wanderingTraderRidable = false; + public boolean wanderingTraderRidableInWater = false; ++ public boolean wanderingTraderControllable = true; + private void wanderingTraderSettings() { + wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); + wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); ++ wanderingTraderControllable = getBoolean("mobs.wandering_trader.controllable", wanderingTraderControllable); + } + + public boolean witchRidable = false; + public boolean witchRidableInWater = false; ++ public boolean witchControllable = true; + private void witchSettings() { + witchRidable = getBoolean("mobs.witch.ridable", witchRidable); + witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); ++ witchControllable = getBoolean("mobs.witch.controllable", witchControllable); + } + + public boolean witherRidable = false; + public boolean witherRidableInWater = false; -+ public double witherMaxY = 256D; ++ public boolean witherControllable = true; ++ public double witherMaxY = 320D; + private void witherSettings() { + witherRidable = getBoolean("mobs.wither.ridable", witherRidable); + witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); ++ witherControllable = getBoolean("mobs.wither.controllable", witherControllable); + witherMaxY = getDouble("mobs.wither.ridable-max-y", witherMaxY); + } + + public boolean witherSkeletonRidable = false; + public boolean witherSkeletonRidableInWater = false; ++ public boolean witherSkeletonControllable = true; + private void witherSkeletonSettings() { + witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); + witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); ++ witherSkeletonControllable = getBoolean("mobs.wither_skeleton.controllable", witherSkeletonControllable); + } + + public boolean wolfRidable = false; + public boolean wolfRidableInWater = false; ++ public boolean wolfControllable = true; + private void wolfSettings() { + wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); + wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); ++ wolfControllable = getBoolean("mobs.wolf.controllable", wolfControllable); + } + + public boolean zoglinRidable = false; + public boolean zoglinRidableInWater = false; ++ public boolean zoglinControllable = true; + private void zoglinSettings() { + zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); + zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); ++ zoglinControllable = getBoolean("mobs.zoglin.controllable", zoglinControllable); + } + + public boolean zombieRidable = false; + public boolean zombieRidableInWater = false; ++ public boolean zombieControllable = true; + private void zombieSettings() { + zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); + zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); ++ zombieControllable = getBoolean("mobs.zombie.controllable", zombieControllable); + } + + public boolean zombieHorseRidableInWater = false; @@ -5191,16 +5669,20 @@ index 0ce93836629522c2ff2a57226583009302271daf..aec3628645d75ae0b4bf7207a4c80af4 + + public boolean zombieVillagerRidable = false; + public boolean zombieVillagerRidableInWater = false; ++ public boolean zombieVillagerControllable = true; + private void zombieVillagerSettings() { + zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); + zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); ++ zombieVillagerControllable = getBoolean("mobs.zombie_villager.controllable", zombieVillagerControllable); + } + + public boolean zombifiedPiglinRidable = false; + public boolean zombifiedPiglinRidableInWater = false; ++ public boolean zombifiedPiglinControllable = true; + private void zombifiedPiglinSettings() { + zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); + zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); ++ zombifiedPiglinControllable = getBoolean("mobs.zombified_piglin.controllable", zombifiedPiglinControllable); + } } diff --git a/src/main/java/org/purpurmc/purpur/controller/FlyingMoveControllerWASD.java b/src/main/java/org/purpurmc/purpur/controller/FlyingMoveControllerWASD.java @@ -5339,7 +5821,7 @@ index 0000000000000000000000000000000000000000..96e928f2941d605a09ab1a7ecb8436ed +} diff --git a/src/main/java/org/purpurmc/purpur/controller/LookControllerWASD.java b/src/main/java/org/purpurmc/purpur/controller/LookControllerWASD.java new file mode 100644 -index 0000000000000000000000000000000000000000..9e280caf99737497e0fa1523146faae5cf1868b2 +index 0000000000000000000000000000000000000000..b8c25c96e95dd5ec3ad9fa4c41bd6c08e144832d --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/controller/LookControllerWASD.java @@ -0,0 +1,76 @@ @@ -5365,7 +5847,7 @@ index 0000000000000000000000000000000000000000..9e280caf99737497e0fa1523146faae5 + // tick + @Override + public void tick() { -+ if (entity.getRider() != null) { ++ if (entity.getRider() != null && entity.isControllable()) { + purpurTick(entity.getRider()); + } else { + vanillaTick(); @@ -5421,7 +5903,7 @@ index 0000000000000000000000000000000000000000..9e280caf99737497e0fa1523146faae5 +} diff --git a/src/main/java/org/purpurmc/purpur/controller/MoveControllerWASD.java b/src/main/java/org/purpurmc/purpur/controller/MoveControllerWASD.java new file mode 100644 -index 0000000000000000000000000000000000000000..6719c246dbd4c3b2af925f37967976c2b1db2f3c +index 0000000000000000000000000000000000000000..21fd6ea2a482758a3016e3bc2cdebe2d89267481 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/controller/MoveControllerWASD.java @@ -0,0 +1,89 @@ @@ -5454,7 +5936,7 @@ index 0000000000000000000000000000000000000000..6719c246dbd4c3b2af925f37967976c2 + + @Override + public void tick() { -+ if (entity.getRider() != null) { ++ if (entity.getRider() != null && entity.isControllable()) { + purpurTick(entity.getRider()); + } else { + vanillaTick(); @@ -5797,7 +6279,7 @@ index 0000000000000000000000000000000000000000..2eca8317e991ec46cc88a4c7d6d8b501 +} diff --git a/src/main/java/org/purpurmc/purpur/entity/ai/HasRider.java b/src/main/java/org/purpurmc/purpur/entity/ai/HasRider.java new file mode 100644 -index 0000000000000000000000000000000000000000..780aaaedb79892d5721b6409a5939e028612e270 +index 0000000000000000000000000000000000000000..8babdaddd8b33278aea0369dbbeeb445abe45016 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/entity/ai/HasRider.java @@ -0,0 +1,20 @@ @@ -5818,7 +6300,7 @@ index 0000000000000000000000000000000000000000..780aaaedb79892d5721b6409a5939e02 + + @Override + public boolean canUse() { -+ return entity.getRider() != null; ++ return entity.getRider() != null && entity.isControllable(); + } +} diff --git a/src/main/java/org/purpurmc/purpur/entity/ai/HorseHasRider.java b/src/main/java/org/purpurmc/purpur/entity/ai/HorseHasRider.java @@ -5844,6 +6326,29 @@ index 0000000000000000000000000000000000000000..432f4f3d82af2f19820890b68d33189a + return super.canUse() && horse.isSaddled(); + } +} +diff --git a/src/main/java/org/purpurmc/purpur/entity/ai/LlamaHasRider.java b/src/main/java/org/purpurmc/purpur/entity/ai/LlamaHasRider.java +new file mode 100644 +index 0000000000000000000000000000000000000000..18a95e043cbffa65eeaaf65ff7695e5dc939820c +--- /dev/null ++++ b/src/main/java/org/purpurmc/purpur/entity/ai/LlamaHasRider.java +@@ -0,0 +1,17 @@ ++package org.purpurmc.purpur.entity.ai; ++ ++import net.minecraft.world.entity.animal.horse.Llama; ++ ++public class LlamaHasRider extends HasRider { ++ public final Llama llama; ++ ++ public LlamaHasRider(Llama entity) { ++ super(entity); ++ this.llama = entity; ++ } ++ ++ @Override ++ public boolean canUse() { ++ return super.canUse() && llama.isSaddled() && llama.isControllable(); ++ } ++} diff --git a/src/test/java/com/destroystokyo/paper/entity/ai/VanillaMobGoalTest.java b/src/test/java/com/destroystokyo/paper/entity/ai/VanillaMobGoalTest.java index b2d510459bcf90a3611f3d91dae4ccc3d29b4079..7a052f6deaa30f8a177a2aaf172f9da6c308a22b 100644 --- a/src/test/java/com/destroystokyo/paper/entity/ai/VanillaMobGoalTest.java diff --git a/patches/server/0007-Configurable-entity-base-attributes.patch b/patches/server/0007-Configurable-entity-base-attributes.patch index a6772aa1e1..a3f11283ca 100644 --- a/patches/server/0007-Configurable-entity-base-attributes.patch +++ b/patches/server/0007-Configurable-entity-base-attributes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable entity base attributes diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index b119a3ce2a0907617c5e1f1071d640c8d4262f5f..3c8119aa55aa1fcd59e8b0d545d474bd100c674e 100644 +index 998bc2ef37de8cbebde0f6bca4ad8c9bea88aed7..793afed6e539d69a1b7936b9562ecc43703cf9f9 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -149,7 +149,7 @@ import org.bukkit.plugin.PluginManager; @@ -18,12 +18,12 @@ index b119a3ce2a0907617c5e1f1071d640c8d4262f5f..3c8119aa55aa1fcd59e8b0d545d474bd private static final int CURRENT_LEVEL = 2; public boolean preserveMotion = true; // Paper - keep initial motion on first setPositionRotation diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 03adc3b746e05bb4b0514ba4a66c101b9742ceed..ec261673ac444fd5de9c8556cde5d7887098aee0 100644 +index 912767ed261e44c0192c5a07e2c2026110988816..da00dcb474bec9ac8b8fc3ecf530fca154348059 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -33,6 +33,11 @@ public class GlowSquid extends Squid { - public boolean rideableUnderWater() { - return true; +@@ -38,6 +38,11 @@ public class GlowSquid extends Squid { + public boolean isControllable() { + return level.purpurConfig.glowSquidControllable; } + + @Override @@ -55,10 +55,10 @@ index 1a5587e25356a239ae6a8c219747fcd93491e741..85a6003ecadfabf47c06405f5b85bb71 return this.brain; } 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 76de99e019c784609dfcafb35b9c4c9d21f8d6cf..e82592e3e43f38a0f09803c7b111d73a90361f88 100644 +index 7814f9825ef1956c9f327bee8a0c268cda6eef21..1fbe37705556e62752be4719994e1cde96f3434d 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -86,6 +86,18 @@ public class Bat extends AmbientCreature { +@@ -91,6 +91,18 @@ public class Bat extends AmbientCreature { setDeltaMovement(mot.scale(0.9D)); } } @@ -78,10 +78,10 @@ index 76de99e019c784609dfcafb35b9c4c9d21f8d6cf..e82592e3e43f38a0f09803c7b111d73a @Override 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 0d47db2163ef01365513af2ccec8ea74bfc838c9..64ad501a6bce58f06b38ea2d758664c19b4d7996 100644 +index fea80e6ed278bff6cd8773abe1a7def96b3a7c97..4fc7c9c2fd2b9c083bd08fb4da9355279a94d287 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -210,6 +210,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -215,6 +215,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { setDeltaMovement(mot.scale(0.9D)); } } @@ -94,10 +94,10 @@ index 0d47db2163ef01365513af2ccec8ea74bfc838c9..64ad501a6bce58f06b38ea2d758664c1 @Override 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 a63a18eb2c87d01b2fca460f40bc2848f9a4b9cb..da496f1c3728cbe8aa009d2533f166cb6736d1b9 100644 +index 495e3b17cc1c5b5d502a172a9b6bd8c95a7b2064..3a8130f7bbf67a0426c8a2f4785c9865dc0159ce 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -140,6 +140,11 @@ public class Cat extends TamableAnimal { +@@ -145,6 +145,11 @@ public class Cat extends TamableAnimal { setLying(false); setRelaxStateOne(false); } @@ -110,12 +110,12 @@ index a63a18eb2c87d01b2fca460f40bc2848f9a4b9cb..da496f1c3728cbe8aa009d2533f166cb public ResourceLocation getResourceLocation() { diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index a64b7bd9b8a3cf0d79689b71b84ca1cad7bde2f1..419a774733ac3d562e636f2615005c953bbd87df 100644 +index 46ac6d4559be25914ebb24684fbeb33f471e226d..6f0a3e303d7b4d95302f477eef0d2590b89bef42 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -62,6 +62,11 @@ public class Chicken extends Animal { - public boolean rideableUnderWater() { - return level.purpurConfig.chickenRidableInWater; +@@ -67,6 +67,11 @@ public class Chicken extends Animal { + public boolean isControllable() { + return level.purpurConfig.chickenControllable; } + + @Override @@ -126,12 +126,12 @@ index a64b7bd9b8a3cf0d79689b71b84ca1cad7bde2f1..419a774733ac3d562e636f2615005c95 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cod.java b/src/main/java/net/minecraft/world/entity/animal/Cod.java -index ea7227ade90a713242290cadb13692f33effa5c0..f772c60ab5b4ac5468483d9765386b9b72ad8d0f 100644 +index 545ef4ab037b3173cc7377ad8147a44a2050d56f..861727f150f28a508d3b1c7067d410f0d696aa89 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cod.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cod.java -@@ -23,6 +23,11 @@ public class Cod extends AbstractSchoolingFish { - public boolean rideableUnderWater() { - return true; +@@ -28,6 +28,11 @@ public class Cod extends AbstractSchoolingFish { + public boolean isControllable() { + return level.purpurConfig.codControllable; } + + @Override @@ -142,12 +142,12 @@ index ea7227ade90a713242290cadb13692f33effa5c0..f772c60ab5b4ac5468483d9765386b9b @Override 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 f1f333892fa539ad96b7ecb5b7c4be03c8720f47..d602597132b69c51c6da9115d0a2c9a8a1f39405 100644 +index 8f046fb76b6967e72abde523ffb790e0f46b80e0..dd4d5e2e7cbfed18cf3b4664dbe08eaf9d95f61e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -50,6 +50,11 @@ public class Cow extends Animal { - public boolean rideableUnderWater() { - return level.purpurConfig.cowRidableInWater; +@@ -55,6 +55,11 @@ public class Cow extends Animal { + public boolean isControllable() { + return level.purpurConfig.cowControllable; } + + @Override @@ -158,10 +158,10 @@ index f1f333892fa539ad96b7ecb5b7c4be03c8720f47..d602597132b69c51c6da9115d0a2c9a8 @Override 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 9e12331583db172cf54798656bd6a4c0d38fa66c..16f32f0a58b090174f3d8b38c583adbcca58c9e4 100644 +index 4eca8dbdf0ce52588483a599b8b10e9c239821b7..da30c9b0f49e714ff7c84c32f62ffeacaedb6aff 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -148,6 +148,11 @@ public class Dolphin extends WaterAnimal { +@@ -153,6 +153,11 @@ public class Dolphin extends WaterAnimal { } return false; } @@ -174,10 +174,10 @@ index 9e12331583db172cf54798656bd6a4c0d38fa66c..16f32f0a58b090174f3d8b38c583adbc @Nullable 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 49ffee9ce88d2f871b7f179835c7520d1c188070..b07b1302978b2a1212e094652e46ad2754fb1d6c 100644 +index 7ce5908d439afd49bdb5e7ea629e7544e7a7ed18..4754ea923d3bbee130ec8eecf8e51b99e561c3e6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -170,6 +170,11 @@ public class Fox extends Animal { +@@ -175,6 +175,11 @@ public class Fox extends Animal { super.onDismount(rider); setCanPickUpLoot(true); } @@ -190,12 +190,12 @@ index 49ffee9ce88d2f871b7f179835c7520d1c188070..b07b1302978b2a1212e094652e46ad27 @Override 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 78387bc4020ce06dfbdb0cc4af978b5a4f2645b3..945a07babd8860c912c8aca1555c09922d5feaf3 100644 +index ff3f3a1a1e5ac741e00fee71d213feea885b44d6..4c9ef9c044fbc427ad1ffb2b0f3b1ceda379ae00 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -80,6 +80,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - public boolean rideableUnderWater() { - return level.purpurConfig.ironGolemRidableInWater; +@@ -85,6 +85,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { + public boolean isControllable() { + return level.purpurConfig.ironGolemControllable; } + + @Override @@ -206,12 +206,12 @@ index 78387bc4020ce06dfbdb0cc4af978b5a4f2645b3..945a07babd8860c912c8aca1555c0992 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 66e146b92348b48fd53cc2aabd5335da66f50edc..66f628a699e82d2c632dde4185a92f29b5c16312 100644 +index 355bb96e6395749ea94afe39d66b9f93fee1bbfb..94550588f4e40da3f43ecd227e044fcfafec6084 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -75,6 +75,11 @@ public class MushroomCow extends Cow implements Shearable { - public boolean rideableUnderWater() { - return level.purpurConfig.mooshroomRidableInWater; +@@ -80,6 +80,11 @@ public class MushroomCow extends Cow implements Shearable { + public boolean isControllable() { + return level.purpurConfig.mooshroomControllable; } + + @Override @@ -222,12 +222,12 @@ index 66e146b92348b48fd53cc2aabd5335da66f50edc..66f628a699e82d2c632dde4185a92f29 @Override 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 d3311df20c37517e7c4ae1b8fbee6add6d32332e..ccb18fea0e03d08405b0fff5e9df5025f02cebf7 100644 +index 2afcac92a3c5a57cc3b87ffe28dc867030adbe80..14897eea8446a257bbcb48cbcfd1828ab9ad0bec 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -@@ -79,6 +79,11 @@ public class Ocelot extends Animal { - public boolean rideableUnderWater() { - return level.purpurConfig.ocelotRidableInWater; +@@ -84,6 +84,11 @@ public class Ocelot extends Animal { + public boolean isControllable() { + return level.purpurConfig.ocelotControllable; } + + @Override @@ -238,10 +238,10 @@ index d3311df20c37517e7c4ae1b8fbee6add6d32332e..ccb18fea0e03d08405b0fff5e9df5025 public boolean isTrusting() { 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 906b0f0b7907f84f9a4344d8a06e5dcfc2c6d8a8..45a92265ac626ae401342e6a21b0ba271ba5b371 100644 +index 92a3c99711f7e590563e278e575914e0bd65da93..880093a2c547c49fe29aacef87320082dbd38168 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -126,6 +126,12 @@ public class Panda extends Animal { +@@ -131,6 +131,12 @@ public class Panda extends Animal { eat(false); setOnBack(false); } @@ -254,7 +254,7 @@ index 906b0f0b7907f84f9a4344d8a06e5dcfc2c6d8a8..45a92265ac626ae401342e6a21b0ba27 // Purpur end @Override -@@ -618,7 +624,10 @@ public class Panda extends Animal { +@@ -623,7 +629,10 @@ public class Panda extends Animal { public void setAttributes() { if (this.isWeak()) { @@ -267,10 +267,10 @@ index 906b0f0b7907f84f9a4344d8a06e5dcfc2c6d8a8..45a92265ac626ae401342e6a21b0ba27 if (this.isLazy()) { 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 ae436398af6d9b86518d21fca27d2acb6e37dc77..1c3d1ce288d3446291fb729b0c6caeab4202fcb7 100644 +index d3b5b37347f1a52ccf58f6cb61aab454b1d8cb35..b2963b0064c6f01adc1d8a54b7c5687c79ba6a73 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -181,6 +181,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -186,6 +186,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { setDeltaMovement(mot.scale(0.9D)); } } @@ -283,12 +283,12 @@ index ae436398af6d9b86518d21fca27d2acb6e37dc77..1c3d1ce288d3446291fb729b0c6caeab @Nullable diff --git a/src/main/java/net/minecraft/world/entity/animal/Pig.java b/src/main/java/net/minecraft/world/entity/animal/Pig.java -index 32139ede373d72fd8745827052daf5c9a51cdcb9..7313d6bd41a312a8f9352240f181543d7cccb378 100644 +index c4c0d7958156b0d587999032c8f9fac9fd689c72..62a1e63fb6ca80e165db46c4d03e28815196aaff 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pig.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pig.java -@@ -74,6 +74,11 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { - public boolean rideableUnderWater() { - return level.purpurConfig.pigRidableInWater; +@@ -79,6 +79,11 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { + public boolean isControllable() { + return level.purpurConfig.pigControllable; } + + @Override @@ -299,10 +299,10 @@ index 32139ede373d72fd8745827052daf5c9a51cdcb9..7313d6bd41a312a8f9352240f181543d @Override 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 11714497f323350d8244962517d8bb887d35dd0a..69e495a93cd1519297dcd8ef4971cca61b80f201 100644 +index 590a8358846fc89a3c33ca52c70a8471f4999a01..b49ea0516488e203cae91f91a084ba6eb3eba9ea 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -@@ -89,6 +89,11 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -94,6 +94,11 @@ public class PolarBear extends Animal implements NeutralMob { } return false; } @@ -315,12 +315,12 @@ index 11714497f323350d8244962517d8bb887d35dd0a..69e495a93cd1519297dcd8ef4971cca6 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -index bc1cf0e63c9a1df534017246687f6a13cf976ff8..654ad8cd11bc11432811ed7408c0ce9b473a3245 100644 +index 6f27a07b62f69350b1cee5f0170a7af1a3b99b9d..e42a7552d17f883b7116a180e408880c5fdb29d0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -@@ -55,6 +55,11 @@ public class Pufferfish extends AbstractFish { - public boolean rideableUnderWater() { - return true; +@@ -60,6 +60,11 @@ public class Pufferfish extends AbstractFish { + public boolean isControllable() { + return level.purpurConfig.pufferfishControllable; } + + @Override @@ -331,10 +331,10 @@ index bc1cf0e63c9a1df534017246687f6a13cf976ff8..654ad8cd11bc11432811ed7408c0ce9b @Override 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 373bf90cc838fe7317ef8458552eefeeea05b6d6..562262f4811d5748dd04a284f243024c059c8756 100644 +index f155cf36c59979464a0edcfd31d5e8433df60607..16f5c4425cc6ff3044c1d076030775e88a3e0a2c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -130,6 +130,11 @@ public class Rabbit extends Animal { +@@ -135,6 +135,11 @@ public class Rabbit extends Animal { } wasOnGround = onGround; } @@ -347,12 +347,12 @@ index 373bf90cc838fe7317ef8458552eefeeea05b6d6..562262f4811d5748dd04a284f243024c // CraftBukkit start - code from constructor diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index cf88c1d95a866853568d4fa5f67850bc54127d11..e42bdde7947e532a3a5517c874411a39132bb73e 100644 +index 59cb21bc3166f4cc77b962c253ed786fd04090de..3873fb0e2d95973397f9a23dc363f7a65a1edfe6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -@@ -23,6 +23,11 @@ public class Salmon extends AbstractSchoolingFish { - public boolean rideableUnderWater() { - return true; +@@ -28,6 +28,11 @@ public class Salmon extends AbstractSchoolingFish { + public boolean isControllable() { + return level.purpurConfig.salmonControllable; } + + @Override @@ -363,12 +363,12 @@ index cf88c1d95a866853568d4fa5f67850bc54127d11..e42bdde7947e532a3a5517c874411a39 @Override 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 b0fb05dcb63d132071274ae2de0c105dc55420d0..fbab9473e4ccce29ed55ebf707a5aacd128820cb 100644 +index e267e7b3b4ba96f5423327a336088942dcb4e14c..9d6765e2bd6bfdd39728bdd14cabbe4bf33d96ac 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -126,6 +126,11 @@ public class Sheep extends Animal implements Shearable { - public boolean rideableUnderWater() { - return level.purpurConfig.sheepRidableInWater; +@@ -131,6 +131,11 @@ public class Sheep extends Animal implements Shearable { + public boolean isControllable() { + return level.purpurConfig.sheepControllable; } + + @Override @@ -379,12 +379,12 @@ index b0fb05dcb63d132071274ae2de0c105dc55420d0..fbab9473e4ccce29ed55ebf707a5aacd @Override 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 e091170d1ed24ab1bee4fc17337643ddc2bf5685..e194774b2ba7976565642534ceeca2079e23945e 100644 +index 4fc9b738d6e33fb804276c5897aed3ab2b0040c9..d3e8058e2fc45368e816482df178aa533c6edc0c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -64,6 +64,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - public boolean rideableUnderWater() { - return level.purpurConfig.snowGolemRidableInWater; +@@ -69,6 +69,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM + public boolean isControllable() { + return level.purpurConfig.snowGolemControllable; } + + @Override @@ -395,10 +395,10 @@ index e091170d1ed24ab1bee4fc17337643ddc2bf5685..e194774b2ba7976565642534ceeca207 @Override 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 6045c6e6388a0ad2aceabe6586abc85326807524..501b082e36b30140eef9540b8b217b9d45309dff 100644 +index d1ec00edb1782993b47a0837171fa80b8d1cb0b7..565276f556e2c7cf465b6bed53bdeac5ce4c4312 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -71,6 +71,11 @@ public class Squid extends WaterAnimal { +@@ -76,6 +76,11 @@ public class Squid extends WaterAnimal { vector.setX(cos * x - sine * z); vector.setZ(sine * x + cos * z); } @@ -411,12 +411,12 @@ index 6045c6e6388a0ad2aceabe6586abc85326807524..501b082e36b30140eef9540b8b217b9d @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index d78947aa30e4eebca67b94614ec0e2ac9afca36d..2de2dc96b7f5960d4cef3184c14409e0868158cd 100644 +index 3bb43fac9b3405433b9d416b5154a5d49f673fc7..9979a1c75ad6d420575b80413a7b49c51c5ae5c1 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -60,6 +60,11 @@ public class TropicalFish extends AbstractSchoolingFish { - public boolean rideableUnderWater() { - return true; +@@ -65,6 +65,11 @@ public class TropicalFish extends AbstractSchoolingFish { + public boolean isControllable() { + return level.purpurConfig.tropicalFishControllable; } + + @Override @@ -427,12 +427,12 @@ index d78947aa30e4eebca67b94614ec0e2ac9afca36d..2de2dc96b7f5960d4cef3184c14409e0 public static String getPredefinedName(int 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 43dea015a6a9093c98e8ff5a18e6a8360c30d59a..3d30ea6f2392e6ed2c7294a9194daee31dadc7d8 100644 +index 0148a83cbd1e60be227f500e3f3bf3a89632b556..89a95622465a203efcecaf4c46e5b5e0419f84d3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -96,6 +96,11 @@ public class Turtle extends Animal { - public boolean rideableUnderWater() { - return level.purpurConfig.turtleRidableInWater; +@@ -101,6 +101,11 @@ public class Turtle extends Animal { + public boolean isControllable() { + return level.purpurConfig.turtleControllable; } + + @Override @@ -443,12 +443,12 @@ index 43dea015a6a9093c98e8ff5a18e6a8360c30d59a..3d30ea6f2392e6ed2c7294a9194daee3 public void setHomePos(BlockPos pos) { 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 4187d8fdb950781de8b414ed6928a3df4a89ba67..277637692e504cca04bfca7683c052295c2c5a86 100644 +index 5a7a8e3b31f4598216ebeaef12cfb377cfbd771b..0336bc717b22a2747cb233268dc5ececab56cee2 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -114,6 +114,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { - super.onMount(rider); - setInSittingPose(false); +@@ -119,6 +119,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { + public boolean isControllable() { + return level.purpurConfig.wolfControllable; } + + @Override @@ -459,10 +459,10 @@ index 4187d8fdb950781de8b414ed6928a3df4a89ba67..277637692e504cca04bfca7683c05229 @Override 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 7f535683dcc2ad9908400d98328174baf1ea5a91..1b66aea5871ccf83ea39d3f52f0f6da72cd785b6 100644 +index 807834e81b5ee18b6c8e897095161fe208b51168..8dea317e201c34034d03fd755cd8d30d892e6f13 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 -@@ -106,6 +106,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -111,6 +111,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur } @@ -475,12 +475,12 @@ index 7f535683dcc2ad9908400d98328174baf1ea5a91..1b66aea5871ccf83ea39d3f52f0f6da7 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 898a82d5f6404b736e13c14d9c15ea27a4f938b4..39a7ea2854090d8505a9bc888313d84645595e23 100644 +index 07e2a7839d8aaf2915c9b8ba74653870f11def88..0dca918e98182faf90f09d2ecf8985796d7b2fb5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -84,6 +84,11 @@ public class Goat extends Animal { - public boolean rideableUnderWater() { - return level.purpurConfig.goatRidableInWater; +@@ -89,6 +89,11 @@ public class Goat extends Animal { + public boolean isControllable() { + return level.purpurConfig.goatControllable; } + + @Override @@ -589,10 +589,10 @@ index a91152df3d443d70b1aa9aff97b3746e0331c0a6..9f7203608e15fdce1bfbaf4198387687 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 3dfab1062824eee91280d8de4cd50be519bf6176..6e09dbeb6478fa32d8c46da30e45f8c64f214e30 100644 +index 7059b66fe81ffd3f757b595ae107ec69222db8e7..98119cf72e7d808d9f3b0ac808c0f286990d2279 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -111,6 +111,21 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -116,6 +116,21 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { public boolean isSaddled() { return super.isSaddled() || (isTamed() && getSwag() != null); } @@ -667,10 +667,10 @@ index 235dae1b47641fb69e6b34e419797a1a8bf499f2..3c3be1a40f04def3f2ffb6567fa5be05 public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -index 4bad9092aa5381aa82676671482aa7ec3c091772..f651cb7a89388f23cef33d8f817cffd3c6ecea2b 100644 +index a4a88be0cbf94b633f486ce57d4fccd38002ac9f..89f3c480d2e8cc28bb26fcd65a5a51a652e7365a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -42,6 +42,21 @@ public class TraderLlama extends Llama { +@@ -47,6 +47,21 @@ public class TraderLlama extends Llama { public boolean isSaddled() { return super.isSaddled() || isTamed(); } @@ -719,10 +719,10 @@ index 77d05979331af91a1fbe619d1c26fa883146add8..48b72eb4051d612648a1978b38299c0c public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 5e81df114108fa3f8ad8dc5e211737ee9f73290c..73506ce90426bdfb8fbc08687c6e21de637fbd77 100644 +index 9846b882ae67131f3602845419c52c1350a214ce..4e44be78614107932af183dae144a21b0b260c97 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -154,6 +154,11 @@ public class EnderDragon extends Mob implements Enemy { +@@ -159,6 +159,11 @@ public class EnderDragon extends Mob implements Enemy { public double getMaxY() { return level.purpurConfig.enderDragonMaxY; } @@ -735,10 +735,10 @@ index 5e81df114108fa3f8ad8dc5e211737ee9f73290c..73506ce90426bdfb8fbc08687c6e21de public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 5d7623a5ef12ec3151cbc4ac0a59959d8976b9ea..19f48278c5c8f9640683d61b9555074e140fa2ab 100644 +index 4b541ebd4e9d0ef178aacd3006393ff114a30e79..8480ebae938abd4f11ad82fd11e3a5ad405aa180 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -208,6 +208,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -213,6 +213,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob skull.setPosRaw(headX, headY, headZ); level.addFreshEntity(skull); } @@ -750,7 +750,7 @@ index 5d7623a5ef12ec3151cbc4ac0a59959d8976b9ea..19f48278c5c8f9640683d61b9555074e // Purpur end @Override -@@ -412,7 +417,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -417,7 +422,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob this.setInvulnerableTicks(i); if (this.tickCount % 10 == 0) { @@ -760,10 +760,10 @@ index 5d7623a5ef12ec3151cbc4ac0a59959d8976b9ea..19f48278c5c8f9640683d61b9555074e } else { 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 96912be8e98abf7b09b85a0830cd3e10c9225a0e..0075e2dd67c58bed30bfec1707291a1d92b13537 100644 +index 6454992aa70e1476eaea67a8d9a1c27ab66f088d..1fc653194718eb4698450af5d1865a6da090c76d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Blaze.java +++ b/src/main/java/net/minecraft/world/entity/monster/Blaze.java -@@ -67,6 +67,11 @@ public class Blaze extends Monster { +@@ -72,6 +72,11 @@ public class Blaze extends Monster { setDeltaMovement(mot.scale(0.9D)); } } @@ -776,12 +776,12 @@ index 96912be8e98abf7b09b85a0830cd3e10c9225a0e..0075e2dd67c58bed30bfec1707291a1d @Override 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 dd05c5f35d78d1385f793f4e34333ff242d136e1..45b53f11b52cc161775fcaa18567e4a74c5e71b8 100644 +index 790d4abbc8e0b288e20e72e63f8190e938e2fecb..b9ee6fdaad09c92fdeea2e5be606818278a77c21 100644 --- a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java +++ b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -@@ -38,6 +38,11 @@ public class CaveSpider extends Spider { - public boolean rideableUnderWater() { - return level.purpurConfig.caveSpiderRidableInWater; +@@ -43,6 +43,11 @@ public class CaveSpider extends Spider { + public boolean isControllable() { + return level.purpurConfig.caveSpiderControllable; } + + @Override @@ -792,10 +792,10 @@ index dd05c5f35d78d1385f793f4e34333ff242d136e1..45b53f11b52cc161775fcaa18567e4a7 @Override 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 aa92e5a46078b10da6d51d65434d6163428583bb..cee9afa518547afab1f2772b0352dcf05752df44 100644 +index 3451d4b2427978c8ff2893fad9f2c0cfc8c5f472..415df99f90ce63f13a89cfd02ee594d280f01785 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -133,6 +133,11 @@ public class Creeper extends Monster implements PowerableMob { +@@ -138,6 +138,11 @@ public class Creeper extends Monster implements PowerableMob { } return getForwardMot() == 0 && getStrafeMot() == 0; // do not jump if standing still } @@ -808,12 +808,12 @@ index aa92e5a46078b10da6d51d65434d6163428583bb..cee9afa518547afab1f2772b0352dcf0 @Override 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 6f8a1b1ec0de5c61a9fcadf4b6eb47a1bb2846c2..42ce331da58b749c17ece22c2ca9986a96c59438 100644 +index 6c89aa825b51fd1054bb04d4a6a23778e90bd7c6..0217fb932379e5789dce932b6af90f1e97fb95de 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -79,6 +79,16 @@ public class Drowned extends Zombie implements RangedAttackMob { - public boolean rideableUnderWater() { - return level.purpurConfig.drownedRidableInWater; +@@ -84,6 +84,16 @@ public class Drowned extends Zombie implements RangedAttackMob { + public boolean isControllable() { + return level.purpurConfig.drownedControllable; } + + @Override @@ -829,12 +829,12 @@ index 6f8a1b1ec0de5c61a9fcadf4b6eb47a1bb2846c2..42ce331da58b749c17ece22c2ca9986a @Override 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 1f789b1d481234cafaa6e75c36a272bbd064482e..e25374b06e3babd93cd5bbdd58ea401a92dbb001 100644 +index 7e79fe61e4fd0d26f62a0515c437370ccb0abf58..25fab7497a80a8fa65bd9cd9bdb0cd498f240bd1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -@@ -40,6 +40,11 @@ public class ElderGuardian extends Guardian { - public boolean rideableUnderWater() { - return true; +@@ -45,6 +45,11 @@ public class ElderGuardian extends Guardian { + public boolean isControllable() { + return level.purpurConfig.elderGuardianControllable; } + + @Override @@ -845,12 +845,12 @@ index 1f789b1d481234cafaa6e75c36a272bbd064482e..e25374b06e3babd93cd5bbdd58ea401a public static AttributeSupplier.Builder createAttributes() { 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 753a6cee043ecb9c8af10ed0a1dfc9040bdf47b7..1cec7bb3efa1e3377f72489c090d3234123d3e26 100644 +index 1af2aa7d2a3e6a21cd95b6c6f9a32d155c159f05..732fb89ab0405373a782eec9807507f0f3f08238 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -98,6 +98,11 @@ public class EnderMan extends Monster implements NeutralMob { - public boolean rideableUnderWater() { - return level.purpurConfig.endermanRidableInWater; +@@ -103,6 +103,11 @@ public class EnderMan extends Monster implements NeutralMob { + public boolean isControllable() { + return level.purpurConfig.endermanControllable; } + + @Override @@ -861,12 +861,12 @@ index 753a6cee043ecb9c8af10ed0a1dfc9040bdf47b7..1cec7bb3efa1e3377f72489c090d3234 @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 1cb9d71c89f36b0c01d3e44388794d9ff745ba2c..16755569f1f2ea7cf6bfe52c279d8e192b9d0098 100644 +index 59ccb6ff28d888874ffb380bda9dbb3ded1d76ed..6d47413b56b9d8b195b6087e39048b6ad5ce477f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java +++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -@@ -46,6 +46,11 @@ public class Endermite extends Monster { - public boolean rideableUnderWater() { - return level.purpurConfig.endermiteRidableInWater; +@@ -51,6 +51,11 @@ public class Endermite extends Monster { + public boolean isControllable() { + return level.purpurConfig.endermiteControllable; } + + @Override @@ -877,12 +877,12 @@ index 1cb9d71c89f36b0c01d3e44388794d9ff745ba2c..16755569f1f2ea7cf6bfe52c279d8e19 @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 42da0e32be040bce2fd712b31aff1fe74d7de8e9..eb794368625d96aef6883f2c45c6a21e06e33d0b 100644 +index 66a36712d57feaf6e7df73daeeb303e8565de452..a22ce4c5b5a5a4b138339a645d445e5725a271e5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -57,6 +57,11 @@ public class Evoker extends SpellcasterIllager { - public boolean rideableUnderWater() { - return level.purpurConfig.evokerRidableInWater; +@@ -62,6 +62,11 @@ public class Evoker extends SpellcasterIllager { + public boolean isControllable() { + return level.purpurConfig.evokerControllable; } + + @Override @@ -893,10 +893,10 @@ index 42da0e32be040bce2fd712b31aff1fe74d7de8e9..eb794368625d96aef6883f2c45c6a21e @Override 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 3429e259f7bd25a3032822b52bf2c4d9d3342f22..bfb413af45d30d99c762f9b0c52f60c3ef000106 100644 +index e58a819baee8a8836eef5de5bc4914893e07c7f6..b5b47050c192f61f14aba01671160f6d51361d10 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java -@@ -71,6 +71,11 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -76,6 +76,11 @@ public class Ghast extends FlyingMob implements Enemy { setDeltaMovement(mot.scale(0.9D)); } } @@ -909,10 +909,10 @@ index 3429e259f7bd25a3032822b52bf2c4d9d3342f22..bfb413af45d30d99c762f9b0c52f60c3 @Override 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 6350749549298df1f4abf5a4ac62f254729c5917..a6f3cac3c6ee6129f61ab43e9afd82cc7b83e058 100644 +index 8730d6be52a2edeccceb2ac3e6af12cdb20be5c2..fe4eb55cdfa62c169f2b7ac76d086b41c5b08892 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java -@@ -30,6 +30,13 @@ public class Giant extends Monster { +@@ -35,6 +35,13 @@ public class Giant extends Monster { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); } @@ -927,12 +927,12 @@ index 6350749549298df1f4abf5a4ac62f254729c5917..a6f3cac3c6ee6129f61ab43e9afd82cc @Override 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 8571da53ae382d418608d1beb722a0d1b5606ed6..7747493846e7d9c5c65d5976519144a6db9bd3e0 100644 +index a11e0a181323f1c409f583a8c647f433ad611d79..07f7cddb1faac701ae05e6a29c3427e7f8557cb1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -@@ -87,6 +87,11 @@ public class Guardian extends Monster { - public boolean rideableUnderWater() { - return true; +@@ -92,6 +92,11 @@ public class Guardian extends Monster { + public boolean isControllable() { + return level.purpurConfig.guardianControllable; } + + @Override @@ -943,12 +943,12 @@ index 8571da53ae382d418608d1beb722a0d1b5606ed6..7747493846e7d9c5c65d5976519144a6 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 82a14d717e8f2ee005c2c410625b811cd016cdc3..81a3f6c1774b187be96b412dae44be623ce7f6cb 100644 +index 80b0d8145e0901af15a7b5e423e3d605a2803dd1..ff84c706d42bc6859faaa9302ba688f43ddcb537 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java -@@ -32,6 +32,16 @@ public class Husk extends Zombie { - public boolean rideableUnderWater() { - return level.purpurConfig.huskRidableInWater; +@@ -37,6 +37,16 @@ public class Husk extends Zombie { + public boolean isControllable() { + return level.purpurConfig.huskControllable; } + + @Override @@ -964,12 +964,12 @@ index 82a14d717e8f2ee005c2c410625b811cd016cdc3..81a3f6c1774b187be96b412dae44be62 public static boolean checkHuskSpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 647796e6f3352582c49c780a860a617ce7b44ddd..4ed0fb155dfae60cee24dc0752fa525c90f2f442 100644 +index 98c85e31a2238cbfa31c12214ade49c4ba181702..171e2fef10ac75dd4585a82057edb4452a6f0d22 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -69,6 +69,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - public boolean rideableUnderWater() { - return level.purpurConfig.illusionerRidableInWater; +@@ -74,6 +74,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + public boolean isControllable() { + return level.purpurConfig.illusionerControllable; } + + @Override @@ -982,10 +982,10 @@ index 647796e6f3352582c49c780a860a617ce7b44ddd..4ed0fb155dfae60cee24dc0752fa525c @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index 95741b63d68bdf815212d718c3cc0fc689c0e4de..cf69ac8710df2f01fed76389d53fb121a2319273 100644 +index d111d6afb7c0937e48f7d212dec5f2d4a1c0a673..d4ce48a99fad5e9a26f8e057d91c712b8d8623b0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -@@ -42,6 +42,26 @@ public class MagmaCube extends Slime { +@@ -47,6 +47,26 @@ public class MagmaCube extends Slime { public float getJumpPower() { return 0.42F * this.getBlockJumpFactor(); // from EntityLiving } @@ -1013,10 +1013,10 @@ index 95741b63d68bdf815212d718c3cc0fc689c0e4de..cf69ac8710df2f01fed76389d53fb121 public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index e4401125da58e0a82a30f9b4a137f5804ae2a8dc..59289140f51ea63e81ebebc97d5a54fc2b0e1914 100644 +index 60aab3964ebd180b52b57fba0705a63445a349bc..c6fc7042386c98debf9b6e4614aca99d391d7e38 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -111,6 +111,21 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -116,6 +116,21 @@ public class Phantom extends FlyingMob implements Enemy { level.addFreshEntity(flames); return true; } @@ -1038,7 +1038,7 @@ index e4401125da58e0a82a30f9b4a137f5804ae2a8dc..59289140f51ea63e81ebebc97d5a54fc // Purpur end @Override -@@ -145,7 +160,10 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -150,7 +165,10 @@ public class Phantom extends FlyingMob implements Enemy { private void updatePhantomSizeInfo() { this.refreshDimensions(); @@ -1051,12 +1051,12 @@ index e4401125da58e0a82a30f9b4a137f5804ae2a8dc..59289140f51ea63e81ebebc97d5a54fc public int getPhantomSize() { 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 1457c0eda11000a0513e601ea60b6ca4a5b463b6..2c7155f2b3c29ff1f777ff6b6d0b19ef922614ae 100644 +index 9223c5cc4d5a1755020eb91ec7fea4943ffe499e..efb80248d3c7318aaf58861b21d497ce57fcecdc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -73,6 +73,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - public boolean rideableUnderWater() { - return level.purpurConfig.pillagerRidableInWater; +@@ -78,6 +78,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve + public boolean isControllable() { + return level.purpurConfig.pillagerControllable; } + + @Override @@ -1067,10 +1067,10 @@ index 1457c0eda11000a0513e601ea60b6ca4a5b463b6..2c7155f2b3c29ff1f777ff6b6d0b19ef @Override 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 ef09b5c6f52f342801213c701d8dbe68063129b9..b289e0fa4324f012464c655d82ccf59469ae6466 100644 +index aa33c5c709babb88d017d47e43de7a06954b940a..0b916be0e0ed6fcf4263759da368732f4e16542a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -85,6 +85,11 @@ public class Ravager extends Raider { +@@ -90,6 +90,11 @@ public class Ravager extends Raider { super.onMount(rider); getNavigation().stop(); } @@ -1083,12 +1083,12 @@ index ef09b5c6f52f342801213c701d8dbe68063129b9..b289e0fa4324f012464c655d82ccf594 @Override 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 d61488d80c10c75698424698c8c6a08315e948bc..db381e7fd6f4fb8d4b30800821a8fdf9c6dba63c 100644 +index 9507e4817e62c749726e4cf9914f51da0aeaba71..545ca8ada7ef9cff3619d2a556ddbd01742703f1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -102,6 +102,11 @@ public class Shulker extends AbstractGolem implements Enemy { - public boolean rideableUnderWater() { - return level.purpurConfig.shulkerRidableInWater; +@@ -107,6 +107,11 @@ public class Shulker extends AbstractGolem implements Enemy { + public boolean isControllable() { + return level.purpurConfig.shulkerControllable; } + + @Override @@ -1099,12 +1099,12 @@ index d61488d80c10c75698424698c8c6a08315e948bc..db381e7fd6f4fb8d4b30800821a8fdf9 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -index b72866283e92433e95f0140037a1fd3182b0577a..cd26c22664fb23457f99fe04607146c8c6545307 100644 +index 0073cfb4b68f4a5938336c063c382ad4c14536d9..dd473dcd310e6af808bf3e90dc48bd19faf75fe1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -@@ -51,6 +51,11 @@ public class Silverfish extends Monster { - public boolean rideableUnderWater() { - return level.purpurConfig.silverfishRidableInWater; +@@ -56,6 +56,11 @@ public class Silverfish extends Monster { + public boolean isControllable() { + return level.purpurConfig.silverfishControllable; } + + @Override @@ -1115,12 +1115,12 @@ index b72866283e92433e95f0140037a1fd3182b0577a..cd26c22664fb23457f99fe04607146c8 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -index a8c6971cc7d004bdc61a2b49e4542a8af46e8539..9448bdd5026f35bba805dee19ceead5d76bda951 100644 +index e73644f453bed8523bfad47764018362a416b5ea..e239bcc4d4afe48e9fc204ad38d8bc76833994f4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -@@ -35,6 +35,11 @@ public class Skeleton extends AbstractSkeleton { - public boolean rideableUnderWater() { - return level.purpurConfig.skeletonRidableInWater; +@@ -40,6 +40,11 @@ public class Skeleton extends AbstractSkeleton { + public boolean isControllable() { + return level.purpurConfig.skeletonControllable; } + + @Override @@ -1131,10 +1131,10 @@ index a8c6971cc7d004bdc61a2b49e4542a8af46e8539..9448bdd5026f35bba805dee19ceead5d @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java -index 08935565ca3d1ee779abc491aa1e9eec13342bb5..296165ff7b1ac5c6690fb3cc195a3ae3e6115611 100644 +index 4ded6fed9a5f3fbe8721bebc4f1fdb33d282e6bc..d7779ad6b6ce502468f104e35a715bf8fc013cff 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java -@@ -101,6 +101,37 @@ public class Slime extends Mob implements Enemy { +@@ -106,6 +106,37 @@ public class Slime extends Mob implements Enemy { } return true; // do not jump() in wasd controller, let vanilla controller handle } @@ -1172,7 +1172,7 @@ index 08935565ca3d1ee779abc491aa1e9eec13342bb5..296165ff7b1ac5c6690fb3cc195a3ae3 // Purpur end @Override -@@ -129,9 +160,9 @@ public class Slime extends Mob implements Enemy { +@@ -134,9 +165,9 @@ public class Slime extends Mob implements Enemy { this.entityData.set(Slime.ID_SIZE, j); this.reapplyPosition(); this.refreshDimensions(); @@ -1185,12 +1185,12 @@ index 08935565ca3d1ee779abc491aa1e9eec13342bb5..296165ff7b1ac5c6690fb3cc195a3ae3 this.setHealth(this.getMaxHealth()); } 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 a31a5186a48e6ba90c2a87bec104d10bdc3c50d5..d095df11ffc34dd641bc2795365a4d1dda8cbc88 100644 +index a1870354e1ea5d4ef4248c04f9fe8a3dc93b9d8b..219aeced44c99e64267cff8df39e4f4e8aa55da7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java -@@ -61,6 +61,11 @@ public class Spider extends Monster { - public boolean rideableUnderWater() { - return level.purpurConfig.spiderRidableInWater; +@@ -66,6 +66,11 @@ public class Spider extends Monster { + public boolean isControllable() { + return level.purpurConfig.spiderControllable; } + + @Override @@ -1201,12 +1201,12 @@ index a31a5186a48e6ba90c2a87bec104d10bdc3c50d5..d095df11ffc34dd641bc2795365a4d1d @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Stray.java b/src/main/java/net/minecraft/world/entity/monster/Stray.java -index 8480687e452b7cad0d3e434cebe17e15c59bdc40..86b1c7a1ddd33249ce3d1ff25030d4218058af2c 100644 +index b97862f653fe0aca93335fdd1ef0cf871626a58c..b54368f53d3cf87f35132f811f8a917999968c1e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Stray.java +++ b/src/main/java/net/minecraft/world/entity/monster/Stray.java -@@ -31,6 +31,11 @@ public class Stray extends AbstractSkeleton { - public boolean rideableUnderWater() { - return level.purpurConfig.strayRidableInWater; +@@ -36,6 +36,11 @@ public class Stray extends AbstractSkeleton { + public boolean isControllable() { + return level.purpurConfig.strayControllable; } + + @Override @@ -1217,12 +1217,12 @@ index 8480687e452b7cad0d3e434cebe17e15c59bdc40..86b1c7a1ddd33249ce3d1ff25030d421 public static boolean checkStraySpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 07c3191f72520086dcf7ed7a00005003b773e08d..e65eaf393b118e38fde8f525ac9b1d6e6f98e729 100644 +index fc43b53e8a0c7674ec523536e615a4ee62ada61c..0ceeca25fddea15ba5860f2745dc37a29845cb3e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -107,6 +107,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { - public boolean rideableUnderWater() { - return level.purpurConfig.striderRidableInWater; +@@ -112,6 +112,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { + public boolean isControllable() { + return level.purpurConfig.striderControllable; } + + @Override @@ -1233,10 +1233,10 @@ index 07c3191f72520086dcf7ed7a00005003b773e08d..e65eaf393b118e38fde8f525ac9b1d6e public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 660b12722adbad6d80ed447b23e4718a1a21d706..8747ebbc637ceb1c61a38baf063a3352aa093a1f 100644 +index 66311fc3cf8f0ed50174bb834067d4365c393fef..b223b48215adcd57ea9656194df3b5673a82586b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -95,6 +95,11 @@ public class Vex extends Monster { +@@ -100,6 +100,11 @@ public class Vex extends Monster { public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { return false; // no fall damage please } @@ -1249,12 +1249,12 @@ index 660b12722adbad6d80ed447b23e4718a1a21d706..8747ebbc637ceb1c61a38baf063a3352 @Override 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 489f604fda644f6cb576f1377fa31d23b1d83c48..c92c948989543248b22db0830a3cb1b6f7940d60 100644 +index ddb0b32821aa6f61370ce8d262ce3d846c7ee9d0..ff62f5ed29a826c4dd53eb6fe04f5aa27de62619 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -68,6 +68,11 @@ public class Vindicator extends AbstractIllager { - public boolean rideableUnderWater() { - return level.purpurConfig.vindicatorRidableInWater; +@@ -73,6 +73,11 @@ public class Vindicator extends AbstractIllager { + public boolean isControllable() { + return level.purpurConfig.vindicatorControllable; } + + @Override @@ -1265,12 +1265,12 @@ index 489f604fda644f6cb576f1377fa31d23b1d83c48..c92c948989543248b22db0830a3cb1b6 @Override 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 75bc4ade487e92aa939b7a04bf3d22170bc6ea9e..3bc25acc139b5d2b9fb20a491649ff613d5adc82 100644 +index 8e643b22a2af74acfe2b6710586a40c19ddcc085..33d6aba40c6523cb271946bac98c6e84593a2c6b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java -@@ -69,6 +69,11 @@ public class Witch extends Raider implements RangedAttackMob { - public boolean rideableUnderWater() { - return level.purpurConfig.witchRidableInWater; +@@ -74,6 +74,11 @@ public class Witch extends Raider implements RangedAttackMob { + public boolean isControllable() { + return level.purpurConfig.witchControllable; } + + @Override @@ -1281,12 +1281,12 @@ index 75bc4ade487e92aa939b7a04bf3d22170bc6ea9e..3bc25acc139b5d2b9fb20a491649ff61 @Override 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 570a7f7c63cae90563129dc04aeb76a0d97ffcc3..5f01beb931546a8bfc714754a65c1c9dbd2ebf8b 100644 +index 54020eefe310f7cf653e97dfb525713d098e85ed..d7d15eaaed3d184c0a4f81b09f7d2b564742ecd1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -44,6 +44,11 @@ public class WitherSkeleton extends AbstractSkeleton { - public boolean rideableUnderWater() { - return level.purpurConfig.witherSkeletonRidableInWater; +@@ -49,6 +49,11 @@ public class WitherSkeleton extends AbstractSkeleton { + public boolean isControllable() { + return level.purpurConfig.witherSkeletonControllable; } + + @Override @@ -1297,12 +1297,12 @@ index 570a7f7c63cae90563129dc04aeb76a0d97ffcc3..5f01beb931546a8bfc714754a65c1c9d @Override 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 54a545836f3c318e7f90d43aca7fea8a6a56851d..fe315ebb69773d243feb2fbda369fc6ff23d93c8 100644 +index a6aaffc41a39be4ae1da44d54a27d324927e47d0..a91ec2e385940b12bc41d9c09819c9081edc5c44 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -78,6 +78,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { - public boolean rideableUnderWater() { - return level.purpurConfig.zoglinRidableInWater; +@@ -83,6 +83,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { + public boolean isControllable() { + return level.purpurConfig.zoglinControllable; } + + @Override @@ -1313,12 +1313,12 @@ index 54a545836f3c318e7f90d43aca7fea8a6a56851d..fe315ebb69773d243feb2fbda369fc6f @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 ceb15697d28799064b3fab56b5f53b6249e81789..589ebb2f962c957903c12fc1a5304604f0433441 100644 +index cd70d228a690485c7f379d0744262907d19fa080..6943933ef0e97f31fbbcedee4ff469bc6e7e49c0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -114,6 +114,11 @@ public class Zombie extends Monster { - public boolean rideableUnderWater() { - return level.purpurConfig.zombieRidableInWater; +@@ -119,6 +119,11 @@ public class Zombie extends Monster { + public boolean isControllable() { + return level.purpurConfig.zombieControllable; } + + @Override @@ -1328,7 +1328,7 @@ index ceb15697d28799064b3fab56b5f53b6249e81789..589ebb2f962c957903c12fc1a5304604 // Purpur end @Override -@@ -591,7 +596,7 @@ public class Zombie extends Monster { +@@ -596,7 +601,7 @@ public class Zombie extends Monster { } protected void randomizeReinforcementsChance() { @@ -1338,12 +1338,12 @@ index ceb15697d28799064b3fab56b5f53b6249e81789..589ebb2f962c957903c12fc1a5304604 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index a069a923f071991f8215bb5cf0d1c2bb4de3f344..2c93f08b0bb07b90512c317b5583d25c6ea05d82 100644 +index b74a2dd32481dd2135b4aa4b860cf9e1b743af66..6309a40ce0d349a6e278d6584b056dc644a358ba 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -85,6 +85,16 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - public boolean rideableUnderWater() { - return level.purpurConfig.zombieVillagerRidableInWater; +@@ -90,6 +90,16 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + public boolean isControllable() { + return level.purpurConfig.zombieVillagerControllable; } + + @Override @@ -1359,12 +1359,12 @@ index a069a923f071991f8215bb5cf0d1c2bb4de3f344..2c93f08b0bb07b90512c317b5583d25c @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 2dec8be9b199e9bcf0970774afbd19a4861d802f..f30b36b3f1153e1cbd9b8242909d9ba8c995df1d 100644 +index af60b2666529fbf83578672e9a4a03d4783602fe..e743fb4de0647088d06ec53291496e0d2f44fe44 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -69,6 +69,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - public boolean rideableUnderWater() { - return level.purpurConfig.zombifiedPiglinRidableInWater; +@@ -74,6 +74,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + public boolean isControllable() { + return level.purpurConfig.zombifiedPiglinControllable; } + + @Override @@ -1374,7 +1374,7 @@ index 2dec8be9b199e9bcf0970774afbd19a4861d802f..f30b36b3f1153e1cbd9b8242909d9ba8 // Purpur end @Override -@@ -253,7 +258,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -258,7 +263,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @Override protected void randomizeReinforcementsChance() { @@ -1384,12 +1384,12 @@ index 2dec8be9b199e9bcf0970774afbd19a4861d802f..f30b36b3f1153e1cbd9b8242909d9ba8 @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 9e65970033249315b534441c80725683ce23ff0b..32836a16b18f4bb168d5a3d292765be33b998280 100644 +index 1d3227a216b7daea6555f1c859c9a571050ff18b..fc08f6ec195abcb1950d6924905740d59689a543 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 -@@ -77,6 +77,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - public boolean rideableUnderWater() { - return level.purpurConfig.hoglinRidableInWater; +@@ -82,6 +82,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + public boolean isControllable() { + return level.purpurConfig.hoglinControllable; } + + @Override @@ -1400,12 +1400,12 @@ index 9e65970033249315b534441c80725683ce23ff0b..32836a16b18f4bb168d5a3d292765be3 @Override 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 347244dcdea7ed3bb15dad4c0c5019ae9a1de9d1..70be752683291c34248ba7bafa42034f22fec9a9 100644 +index 7ac0a9ee569043dcfaa2e19141060c5358e03f9f..76b7e5ed4e50dcbb9e8ac5a142884b764e27c8ed 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 -@@ -106,6 +106,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - public boolean rideableUnderWater() { - return level.purpurConfig.piglinRidableInWater; +@@ -111,6 +111,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + public boolean isControllable() { + return level.purpurConfig.piglinControllable; } + + @Override @@ -1416,12 +1416,12 @@ index 347244dcdea7ed3bb15dad4c0c5019ae9a1de9d1..70be752683291c34248ba7bafa42034f @Override 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 5025d4571a34fe9e0e58ada6b81b064716b8f672..f6734f2eb44af7b2389de5079831e0e4f8a1c742 100644 +index 8ad63ae82a8b6a26c03e53b6d043128a8e038863..ec532ba1ccb0dbe50b91ba698a4f30d5bc89ca82 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 -@@ -50,6 +50,11 @@ public class PiglinBrute extends AbstractPiglin { - public boolean rideableUnderWater() { - return level.purpurConfig.piglinBruteRidableInWater; +@@ -55,6 +55,11 @@ public class PiglinBrute extends AbstractPiglin { + public boolean isControllable() { + return level.purpurConfig.piglinBruteControllable; } + + @Override @@ -1432,10 +1432,10 @@ index 5025d4571a34fe9e0e58ada6b81b064716b8f672..f6734f2eb44af7b2389de5079831e0e4 public static AttributeSupplier.Builder createAttributes() { 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 d951bc1d709f64871a01edc81f091c8f4c032d34..0f466c9301c38e3747a22f116b98d47d1d912601 100644 +index dd37faff29a8c8199fd0c6730d9bdc79ad97e254..e413888ee04d6b236d2f7b8323e36d02dfe6b854 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -168,6 +168,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -173,6 +173,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); } @@ -1448,12 +1448,12 @@ index d951bc1d709f64871a01edc81f091c8f4c032d34..0f466c9301c38e3747a22f116b98d47d @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index ab648e7dafd78f414646cef96b422e87da5c1982..0bcfece84ac11f04671ed38a99b31da9f8b03858 100644 +index ac17d5e9fa110c5de297be2a762631ce03e081eb..ab7beb6ddccf9e392aa791fee9280af814695259 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -77,6 +77,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - public boolean rideableUnderWater() { - return level.purpurConfig.wanderingTraderRidableInWater; +@@ -82,6 +82,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill + public boolean isControllable() { + return level.purpurConfig.wanderingTraderControllable; } + + @Override @@ -1464,22 +1464,24 @@ index ab648e7dafd78f414646cef96b422e87da5c1982..0bcfece84ac11f04671ed38a99b31da9 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097bebb48aea4 100644 +index 969c78aef40aae497a76dd7f3e9c230577a8d31f..c38d9583d8ce50670d78b60d92c90d1d5eb4bbfc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -99,257 +99,579 @@ public class PurpurWorldConfig { - } +@@ -100,94 +100,166 @@ public class PurpurWorldConfig { public boolean axolotlRidable = false; + public boolean axolotlControllable = true; + public double axolotlMaxHealth = 14.0D; private void axolotlSettings() { axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); + axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); + axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); } public boolean batRidable = false; public boolean batRidableInWater = false; - public double batMaxY = 256D; + public boolean batControllable = true; + public double batMaxY = 320D; + public double batMaxHealth = 6.0D; + public double batFollowRange = 16.0D; + public double batKnockbackResistance = 0.0D; @@ -1491,6 +1493,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be private void batSettings() { batRidable = getBoolean("mobs.bat.ridable", batRidable); batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); + batControllable = getBoolean("mobs.bat.controllable", batControllable); batMaxY = getDouble("mobs.bat.ridable-max-y", batMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.bat.attributes.max-health", batMaxHealth); @@ -1502,11 +1505,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean beeRidable = false; public boolean beeRidableInWater = false; - public double beeMaxY = 256D; + public boolean beeControllable = true; + public double beeMaxY = 320D; + public double beeMaxHealth = 10.0D; private void beeSettings() { beeRidable = getBoolean("mobs.bee.ridable", beeRidable); beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); + beeControllable = getBoolean("mobs.bee.controllable", beeControllable); beeMaxY = getDouble("mobs.bee.ridable-max-y", beeMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.bee.attributes.max-health", beeMaxHealth); @@ -1518,11 +1523,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean blazeRidable = false; public boolean blazeRidableInWater = false; - public double blazeMaxY = 256D; + public boolean blazeControllable = true; + public double blazeMaxY = 320D; + public double blazeMaxHealth = 20.0D; private void blazeSettings() { blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); + blazeControllable = getBoolean("mobs.blaze.controllable", blazeControllable); blazeMaxY = getDouble("mobs.blaze.ridable-max-y", blazeMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.blaze.attributes.max-health", blazeMaxHealth); @@ -1534,10 +1541,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean catRidable = false; public boolean catRidableInWater = false; + public boolean catControllable = true; + public double catMaxHealth = 10.0D; private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); + catControllable = getBoolean("mobs.cat.controllable", catControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); + set("mobs.cat.attributes.max-health", null); @@ -1548,10 +1557,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean caveSpiderRidable = false; public boolean caveSpiderRidableInWater = false; + public boolean caveSpiderControllable = true; + public double caveSpiderMaxHealth = 12.0D; private void caveSpiderSettings() { caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); + caveSpiderControllable = getBoolean("mobs.cave_spider.controllable", caveSpiderControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cave_spider.attributes.max-health", caveSpiderMaxHealth); + set("mobs.cave_spider.attributes.max-health", null); @@ -1562,10 +1573,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean chickenRidable = false; public boolean chickenRidableInWater = false; + public boolean chickenControllable = true; + public double chickenMaxHealth = 4.0D; private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); + chickenControllable = getBoolean("mobs.chicken.controllable", chickenControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); + set("mobs.chicken.attributes.max-health", null); @@ -1575,9 +1588,11 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be } public boolean codRidable = false; + public boolean codControllable = true; + public double codMaxHealth = 3.0D; private void codSettings() { codRidable = getBoolean("mobs.cod.ridable", codRidable); + codControllable = getBoolean("mobs.cod.controllable", codControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cod.attributes.max-health", codMaxHealth); + set("mobs.cod.attributes.max-health", null); @@ -1588,10 +1603,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean cowRidable = false; public boolean cowRidableInWater = false; + public boolean cowControllable = true; + public double cowMaxHealth = 10.0D; private void cowSettings() { cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); + cowControllable = getBoolean("mobs.cow.controllable", cowControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); + set("mobs.cow.attributes.max-health", null); @@ -1602,10 +1619,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean creeperRidable = false; public boolean creeperRidableInWater = false; + public boolean creeperControllable = true; + public double creeperMaxHealth = 20.0D; private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); + creeperControllable = getBoolean("mobs.creeper.controllable", creeperControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); + set("mobs.creeper.attributes.max-health", null); @@ -1615,12 +1634,14 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be } public boolean dolphinRidable = false; +@@ -195,227 +267,477 @@ public class PurpurWorldConfig { public int dolphinSpitCooldown = 20; public float dolphinSpitSpeed = 1.0F; public float dolphinSpitDamage = 2.0F; + public double dolphinMaxHealth = 10.0D; private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); dolphinSpitCooldown = getInt("mobs.dolphin.spit.cooldown", dolphinSpitCooldown); dolphinSpitSpeed = (float) getDouble("mobs.dolphin.spit.speed", dolphinSpitSpeed); dolphinSpitDamage = (float) getDouble("mobs.dolphin.spit.damage", dolphinSpitDamage); @@ -1658,11 +1679,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean drownedRidable = false; public boolean drownedRidableInWater = false; + public boolean drownedControllable = true; + public double drownedMaxHealth = 20.0D; + public double drownedSpawnReinforcements = 0.1D; private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); + drownedControllable = getBoolean("mobs.drowned.controllable", drownedControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.drowned.attributes.max-health", drownedMaxHealth); + set("mobs.drowned.attributes.max-health", null); @@ -1673,9 +1696,11 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be } public boolean elderGuardianRidable = false; + public boolean elderGuardianControllable = true; + public double elderGuardianMaxHealth = 80.0D; private void elderGuardianSettings() { elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); + elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.elder_guardian.attributes.max-health", elderGuardianMaxHealth); + set("mobs.elder_guardian.attributes.max-health", null); @@ -1686,11 +1711,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean enderDragonRidable = false; public boolean enderDragonRidableInWater = false; - public double enderDragonMaxY = 256D; + public boolean enderDragonControllable = true; + public double enderDragonMaxY = 320D; + public double enderDragonMaxHealth = 200.0D; private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); + enderDragonControllable = getBoolean("mobs.ender_dragon.controllable", enderDragonControllable); enderDragonMaxY = getDouble("mobs.ender_dragon.ridable-max-y", enderDragonMaxY); + if (PurpurConfig.version < 8) { + double oldValue = getDouble("mobs.ender_dragon.max-health", enderDragonMaxHealth); @@ -1706,10 +1733,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean endermanRidable = false; public boolean endermanRidableInWater = false; + public boolean endermanControllable = true; + public double endermanMaxHealth = 40.0D; private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); + endermanControllable = getBoolean("mobs.enderman.controllable", endermanControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); + set("mobs.enderman.attributes.max-health", null); @@ -1720,10 +1749,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean endermiteRidable = false; public boolean endermiteRidableInWater = false; + public boolean endermiteControllable = true; + public double endermiteMaxHealth = 8.0D; private void endermiteSettings() { endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); + endermiteControllable = getBoolean("mobs.endermite.controllable", endermiteControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.endermite.attributes.max-health", endermiteMaxHealth); + set("mobs.endermite.attributes.max-health", null); @@ -1734,10 +1765,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean evokerRidable = false; public boolean evokerRidableInWater = false; + public boolean evokerControllable = true; + public double evokerMaxHealth = 24.0D; private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); + evokerControllable = getBoolean("mobs.evoker.controllable", evokerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.evoker.attributes.max-health", evokerMaxHealth); + set("mobs.evoker.attributes.max-health", null); @@ -1748,10 +1781,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean foxRidable = false; public boolean foxRidableInWater = false; + public boolean foxControllable = true; + public double foxMaxHealth = 10.0D; private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); + foxControllable = getBoolean("mobs.fox.controllable", foxControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); + set("mobs.fox.attributes.max-health", null); @@ -1762,11 +1797,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean ghastRidable = false; public boolean ghastRidableInWater = false; - public double ghastMaxY = 256D; + public boolean ghastControllable = true; + public double ghastMaxY = 320D; + public double ghastMaxHealth = 10.0D; private void ghastSettings() { ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); + ghastControllable = getBoolean("mobs.ghast.controllable", ghastControllable); ghastMaxY = getDouble("mobs.ghast.ridable-max-y", ghastMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ghast.attributes.max-health", ghastMaxHealth); @@ -1778,12 +1815,14 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean giantRidable = false; public boolean giantRidableInWater = false; + public boolean giantControllable = true; + public double giantMovementSpeed = 0.5D; + public double giantAttackDamage = 50.0D; + public double giantMaxHealth = 100.0D; private void giantSettings() { giantRidable = getBoolean("mobs.giant.ridable", giantRidable); giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); + giantControllable = getBoolean("mobs.giant.controllable", giantControllable); + giantMovementSpeed = getDouble("mobs.giant.movement-speed", giantMovementSpeed); + giantAttackDamage = getDouble("mobs.giant.attack-damage", giantAttackDamage); + if (PurpurConfig.version < 8) { @@ -1799,25 +1838,31 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be } public boolean glowSquidRidable = false; + public boolean glowSquidControllable = true; + public double glowSquidMaxHealth = 10.0D; private void glowSquidSettings() { glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); + glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); } public boolean goatRidable = false; public boolean goatRidableInWater = false; + public boolean goatControllable = true; + public double goatMaxHealth = 10.0D; private void goatSettings() { goatRidable = getBoolean("mobs.goat.ridable", goatRidable); goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); + goatControllable = getBoolean("mobs.goat.controllable", goatControllable); + goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); } public boolean guardianRidable = false; + public boolean guardianControllable = true; + public double guardianMaxHealth = 30.0D; private void guardianSettings() { guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); + guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.guardian.attributes.max-health", guardianMaxHealth); + set("mobs.guardian.attributes.max-health", null); @@ -1828,10 +1873,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean hoglinRidable = false; public boolean hoglinRidableInWater = false; + public boolean hoglinControllable = true; + public double hoglinMaxHealth = 40.0D; private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); + hoglinControllable = getBoolean("mobs.hoglin.controllable", hoglinControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.hoglin.attributes.max-health", hoglinMaxHealth); + set("mobs.hoglin.attributes.max-health", null); @@ -1866,11 +1913,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean huskRidable = false; public boolean huskRidableInWater = false; + public boolean huskControllable = true; + public double huskMaxHealth = 20.0D; + public double huskSpawnReinforcements = 0.1D; private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); + huskControllable = getBoolean("mobs.husk.controllable", huskControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.husk.attributes.max-health", huskMaxHealth); + set("mobs.husk.attributes.max-health", null); @@ -1882,12 +1931,14 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean illusionerRidable = false; public boolean illusionerRidableInWater = false; + public boolean illusionerControllable = true; + public double illusionerMovementSpeed = 0.5D; + public double illusionerFollowRange = 18.0D; + public double illusionerMaxHealth = 32.0D; private void illusionerSettings() { illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); + illusionerControllable = getBoolean("mobs.illusioner.controllable", illusionerControllable); + illusionerMovementSpeed = getDouble("mobs.illusioner.movement-speed", illusionerMovementSpeed); + illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange); + if (PurpurConfig.version < 8) { @@ -1904,11 +1955,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean ironGolemRidable = false; public boolean ironGolemRidableInWater = false; + public boolean ironGolemControllable = true; public boolean ironGolemCanSwim = false; + public double ironGolemMaxHealth = 100.0D; private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); + ironGolemControllable = getBoolean("mobs.iron_golem.controllable", ironGolemControllable); ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.iron_golem.attributes.max-health", ironGolemMaxHealth); @@ -1920,6 +1973,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean llamaRidable = false; public boolean llamaRidableInWater = false; + public boolean llamaControllable = true; + public double llamaMaxHealthMin = 15.0D; + public double llamaMaxHealthMax = 30.0D; + public double llamaJumpStrengthMin = 0.5D; @@ -1929,6 +1983,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); + llamaControllable = getBoolean("mobs.llama.controllable", llamaControllable); + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.llama.attributes.max-health.min", llamaMaxHealthMin); + double oldMax = getDouble("mobs.llama.attributes.max-health.max", llamaMaxHealthMax); @@ -1946,6 +2001,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean magmaCubeRidable = false; public boolean magmaCubeRidableInWater = false; + public boolean magmaCubeControllable = true; + public String magmaCubeMaxHealth = "size * size"; + public String magmaCubeAttackDamage = "size"; + public Map magmaCubeMaxHealthCache = new HashMap<>(); @@ -1953,6 +2009,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be private void magmaCubeSettings() { magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); + magmaCubeControllable = getBoolean("mobs.magma_cube.controllable", magmaCubeControllable); + if (PurpurConfig.version < 10) { + String oldValue = getString("mobs.magma_cube.attributes.max-health", magmaCubeMaxHealth); + set("mobs.magma_cube.attributes.max-health", null); @@ -1966,10 +2023,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean mooshroomRidable = false; public boolean mooshroomRidableInWater = false; + public boolean mooshroomControllable = true; + public double mooshroomMaxHealth = 10.0D; private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); + mooshroomControllable = getBoolean("mobs.mooshroom.controllable", mooshroomControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.mooshroom.attributes.max-health", mooshroomMaxHealth); + set("mobs.mooshroom.attributes.max-health", null); @@ -2004,10 +2063,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean ocelotRidable = false; public boolean ocelotRidableInWater = false; + public boolean ocelotControllable = true; + public double ocelotMaxHealth = 10.0D; private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); + ocelotControllable = getBoolean("mobs.ocelot.controllable", ocelotControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ocelot.attributes.max-health", ocelotMaxHealth); + set("mobs.ocelot.attributes.max-health", null); @@ -2018,10 +2079,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean pandaRidable = false; public boolean pandaRidableInWater = false; + public boolean pandaControllable = true; + public double pandaMaxHealth = 20.0D; private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); + pandaControllable = getBoolean("mobs.panda.controllable", pandaControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.panda.attributes.max-health", pandaMaxHealth); + set("mobs.panda.attributes.max-health", null); @@ -2032,11 +2095,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean parrotRidable = false; public boolean parrotRidableInWater = false; - public double parrotMaxY = 256D; + public boolean parrotControllable = true; + public double parrotMaxY = 320D; + public double parrotMaxHealth = 6.0D; private void parrotSettings() { parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); + parrotControllable = getBoolean("mobs.parrot.controllable", parrotControllable); parrotMaxY = getDouble("mobs.parrot.ridable-max-y", parrotMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.parrot.attributes.max-health", parrotMaxHealth); @@ -2047,7 +2112,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be } public boolean phantomRidable = false; -@@ -358,6 +680,10 @@ public class PurpurWorldConfig { +@@ -425,6 +747,10 @@ public class PurpurWorldConfig { public float phantomFlameDamage = 1.0F; public int phantomFlameFireTime = 8; public boolean phantomAllowGriefing = false; @@ -2058,7 +2123,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -365,255 +691,570 @@ public class PurpurWorldConfig { +@@ -433,323 +759,638 @@ public class PurpurWorldConfig { phantomFlameDamage = (float) getDouble("mobs.phantom.flames.damage", phantomFlameDamage); phantomFlameFireTime = getInt("mobs.phantom.flames.fire-time", phantomFlameFireTime); phantomAllowGriefing = getBoolean("mobs.phantom.allow-griefing", phantomAllowGriefing); @@ -2079,10 +2144,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean pigRidable = false; public boolean pigRidableInWater = false; + public boolean pigControllable = true; + public double pigMaxHealth = 10.0D; private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); + pigControllable = getBoolean("mobs.pig.controllable", pigControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pig.attributes.max-health", pigMaxHealth); + set("mobs.pig.attributes.max-health", null); @@ -2093,10 +2160,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean piglinRidable = false; public boolean piglinRidableInWater = false; + public boolean piglinControllable = true; + public double piglinMaxHealth = 16.0D; private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); + piglinControllable = getBoolean("mobs.piglin.controllable", piglinControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.piglin.attributes.max-health", piglinMaxHealth); + set("mobs.piglin.attributes.max-health", null); @@ -2107,10 +2176,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean piglinBruteRidable = false; public boolean piglinBruteRidableInWater = false; + public boolean piglinBruteControllable = true; + public double piglinBruteMaxHealth = 50.0D; private void piglinBruteSettings() { piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); + piglinBruteControllable = getBoolean("mobs.piglin_brute.controllable", piglinBruteControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.piglin_brute.attributes.max-health", piglinBruteMaxHealth); + set("mobs.piglin_brute.attributes.max-health", null); @@ -2121,10 +2192,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean pillagerRidable = false; public boolean pillagerRidableInWater = false; + public boolean pillagerControllable = true; + public double pillagerMaxHealth = 24.0D; private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); + pillagerControllable = getBoolean("mobs.pillager.controllable", pillagerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pillager.attributes.max-health", pillagerMaxHealth); + set("mobs.pillager.attributes.max-health", null); @@ -2135,10 +2208,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean polarBearRidable = false; public boolean polarBearRidableInWater = false; + public boolean polarBearControllable = true; + public double polarBearMaxHealth = 30.0D; private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); + polarBearControllable = getBoolean("mobs.polar_bear.controllable", polarBearControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.polar_bear.attributes.max-health", polarBearMaxHealth); + set("mobs.polar_bear.attributes.max-health", null); @@ -2148,9 +2223,11 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be } public boolean pufferfishRidable = false; + public boolean pufferfishControllable = true; + public double pufferfishMaxHealth = 3.0D; private void pufferfishSettings() { pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); + pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pufferfish.attributes.max-health", pufferfishMaxHealth); + set("mobs.pufferfish.attributes.max-health", null); @@ -2161,10 +2238,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean rabbitRidable = false; public boolean rabbitRidableInWater = false; + public boolean rabbitControllable = true; + public double rabbitMaxHealth = 3.0D; private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); + rabbitControllable = getBoolean("mobs.rabbit.controllable", rabbitControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); + set("mobs.rabbit.attributes.max-health", null); @@ -2175,10 +2254,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean ravagerRidable = false; public boolean ravagerRidableInWater = false; + public boolean ravagerControllable = true; + public double ravagerMaxHealth = 100.0D; private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); + ravagerControllable = getBoolean("mobs.ravager.controllable", ravagerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ravager.attributes.max-health", ravagerMaxHealth); + set("mobs.ravager.attributes.max-health", null); @@ -2188,9 +2269,11 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be } public boolean salmonRidable = false; + public boolean salmonControllable = true; + public double salmonMaxHealth = 3.0D; private void salmonSettings() { salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); + salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.salmon.attributes.max-health", salmonMaxHealth); + set("mobs.salmon.attributes.max-health", null); @@ -2201,10 +2284,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean sheepRidable = false; public boolean sheepRidableInWater = false; + public boolean sheepControllable = true; + public double sheepMaxHealth = 8.0D; private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); + sheepControllable = getBoolean("mobs.sheep.controllable", sheepControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); + set("mobs.sheep.attributes.max-health", null); @@ -2215,10 +2300,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean shulkerRidable = false; public boolean shulkerRidableInWater = false; + public boolean shulkerControllable = true; + public double shulkerMaxHealth = 30.0D; private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); + shulkerControllable = getBoolean("mobs.shulker.controllable", shulkerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.shulker.attributes.max-health", shulkerMaxHealth); + set("mobs.shulker.attributes.max-health", null); @@ -2229,10 +2316,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean silverfishRidable = false; public boolean silverfishRidableInWater = false; + public boolean silverfishControllable = true; + public double silverfishMaxHealth = 8.0D; private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); + silverfishControllable = getBoolean("mobs.silverfish.controllable", silverfishControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.silverfish.attributes.max-health", silverfishMaxHealth); + set("mobs.silverfish.attributes.max-health", null); @@ -2243,10 +2332,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean skeletonRidable = false; public boolean skeletonRidableInWater = false; + public boolean skeletonControllable = true; + public double skeletonMaxHealth = 20.0D; private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); + skeletonControllable = getBoolean("mobs.skeleton.controllable", skeletonControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.skeleton.attributes.max-health", skeletonMaxHealth); + set("mobs.skeleton.attributes.max-health", null); @@ -2282,6 +2373,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean slimeRidable = false; public boolean slimeRidableInWater = false; + public boolean slimeControllable = true; + public String slimeMaxHealth = "size * size"; + public String slimeAttackDamage = "size"; + public Map slimeMaxHealthCache = new HashMap<>(); @@ -2289,6 +2381,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be private void slimeSettings() { slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); + slimeControllable = getBoolean("mobs.slime.controllable", slimeControllable); + if (PurpurConfig.version < 10) { + String oldValue = getString("mobs.slime.attributes.max-health", slimeMaxHealth); + set("mobs.slime.attributes.max-health", null); @@ -2302,11 +2395,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean snowGolemRidable = false; public boolean snowGolemRidableInWater = false; + public boolean snowGolemControllable = true; public boolean snowGolemLeaveTrailWhenRidden = false; + public double snowGolemMaxHealth = 4.0D; private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); + snowGolemControllable = getBoolean("mobs.snow_golem.controllable", snowGolemControllable); snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.snow_golem.attributes.max-health", snowGolemMaxHealth); @@ -2317,9 +2412,11 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be } public boolean squidRidable = false; + public boolean squidControllable = true; + public double squidMaxHealth = 10.0D; private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.squid.attributes.max-health", squidMaxHealth); + set("mobs.squid.attributes.max-health", null); @@ -2330,10 +2427,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean spiderRidable = false; public boolean spiderRidableInWater = false; + public boolean spiderControllable = true; + public double spiderMaxHealth = 16.0D; private void spiderSettings() { spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); + spiderControllable = getBoolean("mobs.spider.controllable", spiderControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.spider.attributes.max-health", spiderMaxHealth); + set("mobs.spider.attributes.max-health", null); @@ -2344,10 +2443,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean strayRidable = false; public boolean strayRidableInWater = false; + public boolean strayControllable = true; + public double strayMaxHealth = 20.0D; private void straySettings() { strayRidable = getBoolean("mobs.stray.ridable", strayRidable); strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); + strayControllable = getBoolean("mobs.stray.controllable", strayControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.stray.attributes.max-health", strayMaxHealth); + set("mobs.stray.attributes.max-health", null); @@ -2358,10 +2459,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean striderRidable = false; public boolean striderRidableInWater = false; + public boolean striderControllable = true; + public double striderMaxHealth = 20.0D; private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); + striderControllable = getBoolean("mobs.strider.controllable", striderControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.strider.attributes.max-health", striderMaxHealth); + set("mobs.strider.attributes.max-health", null); @@ -2372,6 +2475,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean traderLlamaRidable = false; public boolean traderLlamaRidableInWater = false; + public boolean traderLlamaControllable = true; + public double traderLlamaMaxHealthMin = 15.0D; + public double traderLlamaMaxHealthMax = 30.0D; + public double traderLlamaJumpStrengthMin = 0.5D; @@ -2381,6 +2485,7 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); + traderLlamaControllable = getBoolean("mobs.trader_llama.controllable", traderLlamaControllable); + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.trader_llama.attributes.max-health.min", traderLlamaMaxHealthMin); + double oldMax = getDouble("mobs.trader_llama.attributes.max-health.max", traderLlamaMaxHealthMax); @@ -2397,9 +2502,11 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be } public boolean tropicalFishRidable = false; + public boolean tropicalFishControllable = true; + public double tropicalFishMaxHealth = 3.0D; private void tropicalFishSettings() { tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); + tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.tropical_fish.attributes.max-health", tropicalFishMaxHealth); + set("mobs.tropical_fish.attributes.max-health", null); @@ -2410,10 +2517,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean turtleRidable = false; public boolean turtleRidableInWater = false; + public boolean turtleControllable = true; + public double turtleMaxHealth = 30.0D; private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); + turtleControllable = getBoolean("mobs.turtle.controllable", turtleControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.turtle.attributes.max-health", turtleMaxHealth); + set("mobs.turtle.attributes.max-health", null); @@ -2424,11 +2533,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean vexRidable = false; public boolean vexRidableInWater = false; - public double vexMaxY = 256D; + public boolean vexControllable = true; + public double vexMaxY = 320D; + public double vexMaxHealth = 14.0D; private void vexSettings() { vexRidable = getBoolean("mobs.vex.ridable", vexRidable); vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); + vexControllable = getBoolean("mobs.vex.controllable", vexControllable); vexMaxY = getDouble("mobs.vex.ridable-max-y", vexMaxY); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.vex.attributes.max-health", vexMaxHealth); @@ -2440,10 +2551,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean villagerRidable = false; public boolean villagerRidableInWater = false; + public boolean villagerControllable = true; + public double villagerMaxHealth = 20.0D; private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); + villagerControllable = getBoolean("mobs.villager.controllable", villagerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); + set("mobs.villager.attributes.max-health", null); @@ -2454,10 +2567,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean vindicatorRidable = false; public boolean vindicatorRidableInWater = false; + public boolean vindicatorControllable = true; + public double vindicatorMaxHealth = 24.0D; private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); + vindicatorControllable = getBoolean("mobs.vindicator.controllable", vindicatorControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.vindicator.attributes.max-health", vindicatorMaxHealth); + set("mobs.vindicator.attributes.max-health", null); @@ -2468,10 +2583,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean wanderingTraderRidable = false; public boolean wanderingTraderRidableInWater = false; + public boolean wanderingTraderControllable = true; + public double wanderingTraderMaxHealth = 20.0D; private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); + wanderingTraderControllable = getBoolean("mobs.wandering_trader.controllable", wanderingTraderControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wandering_trader.attributes.max-health", wanderingTraderMaxHealth); + set("mobs.wandering_trader.attributes.max-health", null); @@ -2482,10 +2599,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean witchRidable = false; public boolean witchRidableInWater = false; + public boolean witchControllable = true; + public double witchMaxHealth = 26.0D; private void witchSettings() { witchRidable = getBoolean("mobs.witch.ridable", witchRidable); witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); + witchControllable = getBoolean("mobs.witch.controllable", witchControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.witch.attributes.max-health", witchMaxHealth); + set("mobs.witch.attributes.max-health", null); @@ -2496,11 +2615,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean witherRidable = false; public boolean witherRidableInWater = false; - public double witherMaxY = 256D; + public boolean witherControllable = true; + public double witherMaxY = 320D; + public double witherMaxHealth = 300.0D; private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); + witherControllable = getBoolean("mobs.wither.controllable", witherControllable); witherMaxY = getDouble("mobs.wither.ridable-max-y", witherMaxY); + if (PurpurConfig.version < 8) { + double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); @@ -2516,10 +2637,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean witherSkeletonRidable = false; public boolean witherSkeletonRidableInWater = false; + public boolean witherSkeletonControllable = true; + public double witherSkeletonMaxHealth = 20.0D; private void witherSkeletonSettings() { witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); + witherSkeletonControllable = getBoolean("mobs.wither_skeleton.controllable", witherSkeletonControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wither_skeleton.attributes.max-health", witherSkeletonMaxHealth); + set("mobs.wither_skeleton.attributes.max-health", null); @@ -2530,10 +2653,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean wolfRidable = false; public boolean wolfRidableInWater = false; + public boolean wolfControllable = true; + public double wolfMaxHealth = 8.0D; private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); + wolfControllable = getBoolean("mobs.wolf.controllable", wolfControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wolf.attributes.max-health", wolfMaxHealth); + set("mobs.wolf.attributes.max-health", null); @@ -2544,10 +2669,12 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean zoglinRidable = false; public boolean zoglinRidableInWater = false; + public boolean zoglinControllable = true; + public double zoglinMaxHealth = 40.0D; private void zoglinSettings() { zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); + zoglinControllable = getBoolean("mobs.zoglin.controllable", zoglinControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zoglin.attributes.max-health", zoglinMaxHealth); + set("mobs.zoglin.attributes.max-health", null); @@ -2558,11 +2685,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean zombieRidable = false; public boolean zombieRidableInWater = false; + public boolean zombieControllable = true; + public double zombieMaxHealth = 20.0D; + public double zombieSpawnReinforcements = 0.1D; private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); + zombieControllable = getBoolean("mobs.zombie.controllable", zombieControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); + set("mobs.zombie.attributes.max-health", null); @@ -2599,11 +2728,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean zombieVillagerRidable = false; public boolean zombieVillagerRidableInWater = false; + public boolean zombieVillagerControllable = true; + public double zombieVillagerMaxHealth = 20.0D; + public double zombieVillagerSpawnReinforcements = 0.1D; private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); + zombieVillagerControllable = getBoolean("mobs.zombie_villager.controllable", zombieVillagerControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie_villager.attributes.max-health", zombieVillagerMaxHealth); + set("mobs.zombie_villager.attributes.max-health", null); @@ -2615,11 +2746,13 @@ index aec3628645d75ae0b4bf7207a4c80af465561151..a524f120c7ba18cc0f89fa365a6097be public boolean zombifiedPiglinRidable = false; public boolean zombifiedPiglinRidableInWater = false; + public boolean zombifiedPiglinControllable = true; + public double zombifiedPiglinMaxHealth = 20.0D; + public double zombifiedPiglinSpawnReinforcements = 0.0D; private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); + zombifiedPiglinControllable = getBoolean("mobs.zombified_piglin.controllable", zombifiedPiglinControllable); + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); + set("mobs.zombified_piglin.attributes.max-health", null); diff --git a/patches/server/0010-Llama-API.patch b/patches/server/0010-Llama-API.patch index 265b86b6be..21916ecd93 100644 --- a/patches/server/0010-Llama-API.patch +++ b/patches/server/0010-Llama-API.patch @@ -25,7 +25,7 @@ index 721971f7618751a2e95f1c49fdc48a9c0c672cab..7b141c495095afcd9c8b04c059d692e8 double d = this.llama.distanceToSqr(this.llama.getCaravanHead()); if (d > 676.0D) { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 6e09dbeb6478fa32d8c46da30e45f8c64f214e30..1195f307ec827c206480fed63deb3775ba3eb22b 100644 +index 98119cf72e7d808d9f3b0ac808c0f286990d2279..f6bd1eff78b3c879ecc439bab3b5aa7674e74044 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java @@ -69,6 +69,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { @@ -36,7 +36,7 @@ index 6e09dbeb6478fa32d8c46da30e45f8c64f214e30..1195f307ec827c206480fed63deb3775 public Llama(EntityType type, Level world) { super(type, world); -@@ -160,7 +161,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -165,7 +166,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { if (!this.inventory.getItem(1).isEmpty()) { nbt.put("DecorItem", this.inventory.getItem(1).save(new CompoundTag())); } @@ -45,7 +45,7 @@ index 6e09dbeb6478fa32d8c46da30e45f8c64f214e30..1195f307ec827c206480fed63deb3775 } @Override -@@ -172,6 +173,12 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -177,6 +178,12 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { this.inventory.setItem(1, ItemStack.of(nbt.getCompound("DecorItem"))); } @@ -58,7 +58,7 @@ index 6e09dbeb6478fa32d8c46da30e45f8c64f214e30..1195f307ec827c206480fed63deb3775 this.updateContainerEquipment(); } -@@ -511,6 +518,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -516,6 +523,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { public void leaveCaravan() { if (this.caravanHead != null) { @@ -66,7 +66,7 @@ index 6e09dbeb6478fa32d8c46da30e45f8c64f214e30..1195f307ec827c206480fed63deb3775 this.caravanHead.caravanTail = null; } -@@ -518,6 +526,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -523,6 +531,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { } public void joinCaravan(Llama llama) { @@ -74,7 +74,7 @@ index 6e09dbeb6478fa32d8c46da30e45f8c64f214e30..1195f307ec827c206480fed63deb3775 this.caravanHead = llama; this.caravanHead.caravanTail = this; } -@@ -535,6 +544,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -540,6 +549,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { return this.caravanHead; } diff --git a/patches/server/0020-Configurable-villager-brain-ticks.patch b/patches/server/0020-Configurable-villager-brain-ticks.patch index fe9835e249..9c479e02a3 100644 --- a/patches/server/0020-Configurable-villager-brain-ticks.patch +++ b/patches/server/0020-Configurable-villager-brain-ticks.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable villager brain ticks 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 0f466c9301c38e3747a22f116b98d47d1d912601..783cdc4949549725c884cdc0edff485936c77de3 100644 +index e413888ee04d6b236d2f7b8323e36d02dfe6b854..3ec933905f247e23c4c13b21dbf6fe4018583c5d 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -137,6 +137,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -24,7 +24,7 @@ index 0f466c9301c38e3747a22f116b98d47d1d912601..783cdc4949549725c884cdc0edff4859 } // Purpur start -@@ -272,6 +274,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -277,6 +279,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.level.getProfiler().push("villagerBrain"); // Pufferfish start if (!inactive) { @@ -32,23 +32,23 @@ index 0f466c9301c38e3747a22f116b98d47d1d912601..783cdc4949549725c884cdc0edff4859 + boolean tick = (level.getGameTime() + brainTickOffset) % level.purpurConfig.villagerBrainTicks == 0; + if (((ServerLevel) level).getServer().lagging ? tick : level.purpurConfig.villagerUseBrainTicksOnlyWhenLagging || tick) + // Purpur end - if (getRider() == null && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider + if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); // Paper } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 83f2729035d42674d480bb508737497a7bffb4c7..a4111896ba007d252cb6fed8824cb99d78727991 100644 +index 81524c4f676766c09125187876b46e0704294880..93d89fb27044e5e97574122b0e7863694d245bf0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1092,6 +1092,8 @@ public class PurpurWorldConfig { - public boolean villagerRidable = false; +@@ -1207,6 +1207,8 @@ public class PurpurWorldConfig { public boolean villagerRidableInWater = false; + public boolean villagerControllable = true; public double villagerMaxHealth = 20.0D; + public int villagerBrainTicks = 1; + public boolean villagerUseBrainTicksOnlyWhenLagging = true; private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1101,6 +1103,8 @@ public class PurpurWorldConfig { +@@ -1217,6 +1219,8 @@ public class PurpurWorldConfig { set("mobs.villager.attributes.max_health", oldValue); } villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); diff --git a/patches/server/0027-Giants-AI-settings.patch b/patches/server/0027-Giants-AI-settings.patch index f7ae779ddb..0de283a047 100644 --- a/patches/server/0027-Giants-AI-settings.patch +++ b/patches/server/0027-Giants-AI-settings.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Giants AI settings 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 d1756353b9fc22f6e9b957a708073545ab3c941a..de7c2064b2c3876eebdee01908b39b1beb9701b6 100644 +index 61d39062021ca23aa94d9fcf584f14599fd7411c..0d26d2388cc1963df9bc361b31a572c12e2f8709 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java @@ -1,13 +1,36 @@ @@ -45,8 +45,8 @@ index d1756353b9fc22f6e9b957a708073545ab3c941a..de7c2064b2c3876eebdee01908b39b1b public class Giant extends Monster { public Giant(EntityType type, Level world) { -@@ -26,18 +49,59 @@ public class Giant extends Monster { - return level.purpurConfig.giantRidableInWater; +@@ -31,18 +54,59 @@ public class Giant extends Monster { + return level.purpurConfig.giantControllable; } - @Override @@ -111,7 +111,7 @@ index d1756353b9fc22f6e9b957a708073545ab3c941a..de7c2064b2c3876eebdee01908b39b1b // Purpur end @Override -@@ -51,6 +115,6 @@ public class Giant extends Monster { +@@ -56,6 +120,6 @@ public class Giant extends Monster { @Override public float getWalkTargetValue(BlockPos pos, LevelReader world) { @@ -120,10 +120,10 @@ index d1756353b9fc22f6e9b957a708073545ab3c941a..de7c2064b2c3876eebdee01908b39b1b } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a56f00a40b6db80f0164260914219afaed8f0cce..d2db6d8199f6c799bca1855d0405b0aa6ff8074a 100644 +index 4d9f7a90928fd4a3dd514799df3661f4ceb2ca36..336b214230600b8b1d223c65470820e388f676d9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -472,6 +472,10 @@ public class PurpurWorldConfig { +@@ -511,6 +511,10 @@ public class PurpurWorldConfig { public double giantMovementSpeed = 0.5D; public double giantAttackDamage = 50.0D; public double giantMaxHealth = 100.0D; @@ -134,7 +134,7 @@ index a56f00a40b6db80f0164260914219afaed8f0cce..d2db6d8199f6c799bca1855d0405b0aa private void giantSettings() { giantRidable = getBoolean("mobs.giant.ridable", giantRidable); giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); -@@ -487,6 +491,10 @@ public class PurpurWorldConfig { +@@ -527,6 +531,10 @@ public class PurpurWorldConfig { set("mobs.giant.attributes.max_health", oldValue); } giantMaxHealth = getDouble("mobs.giant.attributes.max_health", giantMaxHealth); diff --git a/patches/server/0028-Zombie-horse-naturally-spawn.patch b/patches/server/0028-Zombie-horse-naturally-spawn.patch index d902c5d248..80354aaf00 100644 --- a/patches/server/0028-Zombie-horse-naturally-spawn.patch +++ b/patches/server/0028-Zombie-horse-naturally-spawn.patch @@ -28,10 +28,10 @@ index cd01b2f06b0dd34c3261d84beead96bba76cf825..2f8efdd72ee3ef12ce8223b73281f417 entityhorseskeleton.setPos((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); this.addFreshEntity(entityhorseskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d2db6d8199f6c799bca1855d0405b0aa6ff8074a..3c114e679811c0b3221665fdd1a26313f539191d 100644 +index 336b214230600b8b1d223c65470820e388f676d9..6a5507be0f9a78855225437676865e15f06bcd9a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1284,6 +1284,7 @@ public class PurpurWorldConfig { +@@ -1416,6 +1416,7 @@ public class PurpurWorldConfig { public double zombieHorseJumpStrengthMax = 1.0D; public double zombieHorseMovementSpeedMin = 0.2D; public double zombieHorseMovementSpeedMax = 0.2D; @@ -39,7 +39,7 @@ index d2db6d8199f6c799bca1855d0405b0aa6ff8074a..3c114e679811c0b3221665fdd1a26313 private void zombieHorseSettings() { zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); -@@ -1299,6 +1300,7 @@ public class PurpurWorldConfig { +@@ -1431,6 +1432,7 @@ public class PurpurWorldConfig { zombieHorseJumpStrengthMax = getDouble("mobs.zombie_horse.attributes.jump_strength.max", zombieHorseJumpStrengthMax); zombieHorseMovementSpeedMin = getDouble("mobs.zombie_horse.attributes.movement_speed.min", zombieHorseMovementSpeedMin); zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); diff --git a/patches/server/0029-Charged-creeper-naturally-spawn.patch b/patches/server/0029-Charged-creeper-naturally-spawn.patch index cdca90843f..8460322c63 100644 --- a/patches/server/0029-Charged-creeper-naturally-spawn.patch +++ b/patches/server/0029-Charged-creeper-naturally-spawn.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Charged creeper naturally spawn 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 cee9afa518547afab1f2772b0352dcf05752df44..624b736f11341816c91f422cf6098ac0d19855b3 100644 +index 415df99f90ce63f13a89cfd02ee594d280f01785..c2839fea7a3ed7365825b3886c1b9091b61b001e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -138,6 +138,14 @@ public class Creeper extends Monster implements PowerableMob { +@@ -143,6 +143,14 @@ public class Creeper extends Monster implements PowerableMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.creeperMaxHealth); } @@ -24,18 +24,18 @@ index cee9afa518547afab1f2772b0352dcf05752df44..624b736f11341816c91f422cf6098ac0 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3c114e679811c0b3221665fdd1a26313f539191d..425541175639632a3af9226b338dcce40320e2d6 100644 +index 6a5507be0f9a78855225437676865e15f06bcd9a..a1d8065ef1ac0f065cf6bc030a8746e9418690aa 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -294,6 +294,7 @@ public class PurpurWorldConfig { - public boolean creeperRidable = false; +@@ -313,6 +313,7 @@ public class PurpurWorldConfig { public boolean creeperRidableInWater = false; + public boolean creeperControllable = true; public double creeperMaxHealth = 20.0D; + public double creeperChargedChance = 0.0D; private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -303,6 +304,7 @@ public class PurpurWorldConfig { +@@ -323,6 +324,7 @@ public class PurpurWorldConfig { set("mobs.creeper.attributes.max_health", oldValue); } creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); diff --git a/patches/server/0030-Rabbit-naturally-spawn-toast-and-killer.patch b/patches/server/0030-Rabbit-naturally-spawn-toast-and-killer.patch index 862a4627ec..f3ff73afa8 100644 --- a/patches/server/0030-Rabbit-naturally-spawn-toast-and-killer.patch +++ b/patches/server/0030-Rabbit-naturally-spawn-toast-and-killer.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Rabbit naturally spawn toast and killer 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 562262f4811d5748dd04a284f243024c059c8756..c1c2909728197dcb9137fb380ed210e7ee13e5d9 100644 +index 16f5c4425cc6ff3044c1d076030775e88a3e0a2c..a34fcda0ef72689d014ca8fd0a9131a66f25fb61 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -428,7 +428,11 @@ public class Rabbit extends Animal { +@@ -433,7 +433,11 @@ public class Rabbit extends Animal { if (!this.hasCustomName()) { this.setCustomName(new TranslatableComponent(Util.makeDescriptionId("entity", Rabbit.KILLER_BUNNY))); } @@ -20,7 +20,7 @@ index 562262f4811d5748dd04a284f243024c059c8756..c1c2909728197dcb9137fb380ed210e7 this.entityData.set(Rabbit.DATA_TYPE_ID, rabbitType); } -@@ -449,6 +453,16 @@ public class Rabbit extends Animal { +@@ -454,6 +458,16 @@ public class Rabbit extends Animal { } private int getRandomRabbitType(LevelAccessor world) { @@ -38,19 +38,19 @@ index 562262f4811d5748dd04a284f243024c059c8756..c1c2909728197dcb9137fb380ed210e7 int i = this.random.nextInt(100); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 425541175639632a3af9226b338dcce40320e2d6..108548eac8f473e5dddce54268a2a10abb0e0c06 100644 +index a1d8065ef1ac0f065cf6bc030a8746e9418690aa..91f892e411b9f6ce2a64138ed3d3576b43e482ea 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -864,6 +864,8 @@ public class PurpurWorldConfig { - public boolean rabbitRidable = false; +@@ -945,6 +945,8 @@ public class PurpurWorldConfig { public boolean rabbitRidableInWater = false; + public boolean rabbitControllable = true; public double rabbitMaxHealth = 3.0D; + public double rabbitNaturalToast = 0.0D; + public double rabbitNaturalKiller = 0.0D; private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -873,6 +875,8 @@ public class PurpurWorldConfig { +@@ -955,6 +957,8 @@ public class PurpurWorldConfig { set("mobs.rabbit.attributes.max_health", oldValue); } rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); diff --git a/patches/server/0032-Tulips-change-fox-type.patch b/patches/server/0032-Tulips-change-fox-type.patch index 008b2f0b58..8ddc95a03e 100644 --- a/patches/server/0032-Tulips-change-fox-type.patch +++ b/patches/server/0032-Tulips-change-fox-type.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Tulips change fox type 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 b07b1302978b2a1212e094652e46ad2754fb1d6c..a2e56aadf75918d3b2c30b54ec53ba4dc332a004 100644 +index 4754ea923d3bbee130ec8eecf8e51b99e561c3e6..12e2e84e6d4d4975ee2240e6255eb5cc2c17a733 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java @@ -35,6 +35,7 @@ import net.minecraft.tags.Tag; @@ -24,7 +24,7 @@ index b07b1302978b2a1212e094652e46ad2754fb1d6c..a2e56aadf75918d3b2c30b54ec53ba4d import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.Vec3; -@@ -373,6 +375,11 @@ public class Fox extends Animal { +@@ -378,6 +380,11 @@ public class Fox extends Animal { } private void setTargetGoals() { @@ -36,7 +36,7 @@ index b07b1302978b2a1212e094652e46ad2754fb1d6c..a2e56aadf75918d3b2c30b54ec53ba4d if (this.getFoxType() == Fox.Type.RED) { this.targetSelector.addGoal(4, this.landTargetGoal); this.targetSelector.addGoal(4, this.turtleEggTargetGoal); -@@ -405,6 +412,7 @@ public class Fox extends Animal { +@@ -410,6 +417,7 @@ public class Fox extends Animal { public void setFoxType(Fox.Type type) { this.entityData.set(Fox.DATA_TYPE_ID, type.getId()); @@ -44,7 +44,7 @@ index b07b1302978b2a1212e094652e46ad2754fb1d6c..a2e56aadf75918d3b2c30b54ec53ba4d } List getTrustedUUIDs() { -@@ -735,6 +743,29 @@ public class Fox extends Animal { +@@ -740,6 +748,29 @@ public class Fox extends Animal { return this.getTrustedUUIDs().contains(uuid); } @@ -75,18 +75,18 @@ index b07b1302978b2a1212e094652e46ad2754fb1d6c..a2e56aadf75918d3b2c30b54ec53ba4d // Paper start - Cancellable death event protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(DamageSource source) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 108548eac8f473e5dddce54268a2a10abb0e0c06..ca90e421b6f020eb92949ea3cbf4a8e5c31b3096 100644 +index 91f892e411b9f6ce2a64138ed3d3576b43e482ea..53a6c64338a77f22ee2293fbb85522ad51a97276 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -442,6 +442,7 @@ public class PurpurWorldConfig { - public boolean foxRidable = false; +@@ -477,6 +477,7 @@ public class PurpurWorldConfig { public boolean foxRidableInWater = false; + public boolean foxControllable = true; public double foxMaxHealth = 10.0D; + public boolean foxTypeChangesWithTulips = false; private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -451,6 +452,7 @@ public class PurpurWorldConfig { +@@ -487,6 +488,7 @@ public class PurpurWorldConfig { set("mobs.fox.attributes.max_health", oldValue); } foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); diff --git a/patches/server/0033-Breedable-Polar-Bears.patch b/patches/server/0033-Breedable-Polar-Bears.patch index b242785384..45f380cdf7 100644 --- a/patches/server/0033-Breedable-Polar-Bears.patch +++ b/patches/server/0033-Breedable-Polar-Bears.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Breedable Polar Bears 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 69e495a93cd1519297dcd8ef4971cca61b80f201..0b5d4416ad4dc0a90cbd1826c45c47412d2e85ed 100644 +index b49ea0516488e203cae91f91a084ba6eb3eba9ea..1215d26bc383573e84f674c8d67768bfbe89da59 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -@@ -94,6 +94,27 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -99,6 +99,27 @@ public class PolarBear extends Animal implements NeutralMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.polarBearMaxHealth); } @@ -36,7 +36,7 @@ index 69e495a93cd1519297dcd8ef4971cca61b80f201..0b5d4416ad4dc0a90cbd1826c45c4741 // Purpur end @Override -@@ -103,7 +124,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -108,7 +129,7 @@ public class PolarBear extends Animal implements NeutralMob { @Override public boolean isFood(ItemStack stack) { @@ -45,7 +45,7 @@ index 69e495a93cd1519297dcd8ef4971cca61b80f201..0b5d4416ad4dc0a90cbd1826c45c4741 } @Override -@@ -113,6 +134,12 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -118,6 +139,12 @@ public class PolarBear extends Animal implements NeutralMob { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal()); this.goalSelector.addGoal(1, new PolarBear.PolarBearPanicGoal()); @@ -59,19 +59,19 @@ index 69e495a93cd1519297dcd8ef4971cca61b80f201..0b5d4416ad4dc0a90cbd1826c45c4741 this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0D)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ca90e421b6f020eb92949ea3cbf4a8e5c31b3096..d87f38f214b5f737e96ef6ab6b9298a3412f48b3 100644 +index 53a6c64338a77f22ee2293fbb85522ad51a97276..ad0474ca08510f55cb20b2b5d11f7c4a7223b40e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -840,6 +840,8 @@ public class PurpurWorldConfig { - public boolean polarBearRidable = false; +@@ -917,6 +917,8 @@ public class PurpurWorldConfig { public boolean polarBearRidableInWater = false; + public boolean polarBearControllable = true; public double polarBearMaxHealth = 30.0D; + public String polarBearBreedableItemString = ""; + public Item polarBearBreedableItem = null; private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -849,6 +851,9 @@ public class PurpurWorldConfig { +@@ -927,6 +929,9 @@ public class PurpurWorldConfig { set("mobs.polar_bear.attributes.max_health", oldValue); } polarBearMaxHealth = getDouble("mobs.polar_bear.attributes.max_health", polarBearMaxHealth); diff --git a/patches/server/0034-Chickens-can-retaliate.patch b/patches/server/0034-Chickens-can-retaliate.patch index 00eadfca25..d4899c2e39 100644 --- a/patches/server/0034-Chickens-can-retaliate.patch +++ b/patches/server/0034-Chickens-can-retaliate.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Chickens can retaliate diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index 419a774733ac3d562e636f2615005c953bbd87df..ca584a5a801d0909f4bdbaa8a635608ee49d096e 100644 +index 6f0a3e303d7b4d95302f477eef0d2590b89bef42..826ffd0bec67d1239edeaddc64e2805ac884311c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -66,6 +66,9 @@ public class Chicken extends Animal { +@@ -71,6 +71,9 @@ public class Chicken extends Animal { @Override public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.chickenMaxHealth); @@ -18,7 +18,7 @@ index 419a774733ac3d562e636f2615005c953bbd87df..ca584a5a801d0909f4bdbaa8a635608e } // Purpur end -@@ -73,13 +76,21 @@ public class Chicken extends Animal { +@@ -78,13 +81,21 @@ public class Chicken extends Animal { protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -41,7 +41,7 @@ index 419a774733ac3d562e636f2615005c953bbd87df..ca584a5a801d0909f4bdbaa8a635608e } @Override -@@ -88,7 +99,7 @@ public class Chicken extends Animal { +@@ -93,7 +104,7 @@ public class Chicken extends Animal { } public static AttributeSupplier.Builder createAttributes() { @@ -51,18 +51,18 @@ index 419a774733ac3d562e636f2615005c953bbd87df..ca584a5a801d0909f4bdbaa8a635608e @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d87f38f214b5f737e96ef6ab6b9298a3412f48b3..7ce2825871386d63301f90179408e52a2e101275 100644 +index ad0474ca08510f55cb20b2b5d11f7c4a7223b40e..62bb7fafb686170f8ae6d2f7c7b10d04365e433c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -254,6 +254,7 @@ public class PurpurWorldConfig { - public boolean chickenRidable = false; +@@ -267,6 +267,7 @@ public class PurpurWorldConfig { public boolean chickenRidableInWater = false; + public boolean chickenControllable = true; public double chickenMaxHealth = 4.0D; + public boolean chickenRetaliate = false; private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -263,6 +264,7 @@ public class PurpurWorldConfig { +@@ -277,6 +278,7 @@ public class PurpurWorldConfig { set("mobs.chicken.attributes.max_health", oldValue); } chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); diff --git a/patches/server/0036-Cat-spawning-options.patch b/patches/server/0036-Cat-spawning-options.patch index 71a55ba6cd..fcee0088c5 100644 --- a/patches/server/0036-Cat-spawning-options.patch +++ b/patches/server/0036-Cat-spawning-options.patch @@ -49,12 +49,12 @@ index 436f9cb45ff5b83f55b12f291bed355fa12a0655..0784f6a0aa39c8e49b009f53d91432ff } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cdb0cae8af965f57d6c5d128d2190f9c496ea9b7..9b3c77424a9c43d3e980ddc0d1c7bc5fc4c31020 100644 +index 7ab9864662b1a3de509e43b2177272078a7f3882..38f4ac177823bd6317d778163ae924c4869e8a91 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -231,6 +231,9 @@ public class PurpurWorldConfig { - public boolean catRidable = false; +@@ -240,6 +240,9 @@ public class PurpurWorldConfig { public boolean catRidableInWater = false; + public boolean catControllable = true; public double catMaxHealth = 10.0D; + public int catSpawnDelay = 1200; + public int catSpawnSwampHutScanRange = 16; @@ -62,7 +62,7 @@ index cdb0cae8af965f57d6c5d128d2190f9c496ea9b7..9b3c77424a9c43d3e980ddc0d1c7bc5f private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -240,6 +243,9 @@ public class PurpurWorldConfig { +@@ -250,6 +253,9 @@ public class PurpurWorldConfig { set("mobs.cat.attributes.max_health", oldValue); } catMaxHealth = getDouble("mobs.cat.attributes.max_health", catMaxHealth); diff --git a/patches/server/0038-Cows-eat-mushrooms.patch b/patches/server/0038-Cows-eat-mushrooms.patch index 7c26a99e57..4253c73ec1 100644 --- a/patches/server/0038-Cows-eat-mushrooms.patch +++ b/patches/server/0038-Cows-eat-mushrooms.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cows eat mushrooms 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 d602597132b69c51c6da9115d0a2c9a8a1f39405..0db4dd5423508acb5214ed3205bb5632cd337e05 100644 +index dd4d5e2e7cbfed18cf3b4664dbe08eaf9d95f61e..732c560383da3b8a270139758f29734d73b775be 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java @@ -1,6 +1,7 @@ @@ -24,7 +24,7 @@ index d602597132b69c51c6da9115d0a2c9a8a1f39405..0db4dd5423508acb5214ed3205bb5632 import net.minecraft.world.level.block.state.BlockState; // CraftBukkit start import org.bukkit.craftbukkit.event.CraftEventFactory; -@@ -63,6 +65,7 @@ public class Cow extends Animal { +@@ -68,6 +70,7 @@ public class Cow extends Animal { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); @@ -32,7 +32,7 @@ index d602597132b69c51c6da9115d0a2c9a8a1f39405..0db4dd5423508acb5214ed3205bb5632 this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0D)); -@@ -118,11 +121,80 @@ public class Cow extends Animal { +@@ -123,11 +126,80 @@ public class Cow extends Animal { player.setItemInHand(hand, itemstack1); return InteractionResult.sidedSuccess(this.level.isClientSide); @@ -114,18 +114,18 @@ index d602597132b69c51c6da9115d0a2c9a8a1f39405..0db4dd5423508acb5214ed3205bb5632 public Cow getBreedOffspring(ServerLevel world, AgeableMob entity) { return (Cow) EntityType.COW.create(world); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9b3c77424a9c43d3e980ddc0d1c7bc5fc4c31020..8314452a8739b32264e3793616d2f50f25d1c2a8 100644 +index 38f4ac177823bd6317d778163ae924c4869e8a91..2108615ad64bac1e7b9d4950b9dd62407d16504a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -293,6 +293,7 @@ public class PurpurWorldConfig { - public boolean cowRidable = false; +@@ -310,6 +310,7 @@ public class PurpurWorldConfig { public boolean cowRidableInWater = false; + public boolean cowControllable = true; public double cowMaxHealth = 10.0D; + public int cowFeedMushrooms = 0; private void cowSettings() { cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); -@@ -302,6 +303,7 @@ public class PurpurWorldConfig { +@@ -320,6 +321,7 @@ public class PurpurWorldConfig { set("mobs.cow.attributes.max_health", oldValue); } cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); diff --git a/patches/server/0039-Fix-cow-rotation-when-shearing-mooshroom.patch b/patches/server/0039-Fix-cow-rotation-when-shearing-mooshroom.patch index 2e07f7b1df..3be43bdfcf 100644 --- a/patches/server/0039-Fix-cow-rotation-when-shearing-mooshroom.patch +++ b/patches/server/0039-Fix-cow-rotation-when-shearing-mooshroom.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix cow rotation when shearing mooshroom diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 66f628a699e82d2c632dde4185a92f29b5c16312..ffe2f135c6e9396ff106ca7f889ca31290c4d30d 100644 +index 94550588f4e40da3f43ecd227e044fcfafec6084..6784f73bf2c2dd9a71461c66199572a5af29aede 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -198,7 +198,13 @@ public class MushroomCow extends Cow implements Shearable { +@@ -203,7 +203,13 @@ public class MushroomCow extends Cow implements Shearable { entitycow.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); entitycow.setHealth(this.getHealth()); diff --git a/patches/server/0040-Pigs-give-saddle-back.patch b/patches/server/0040-Pigs-give-saddle-back.patch index d730df33e1..1401adf292 100644 --- a/patches/server/0040-Pigs-give-saddle-back.patch +++ b/patches/server/0040-Pigs-give-saddle-back.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Pigs give saddle back diff --git a/src/main/java/net/minecraft/world/entity/animal/Pig.java b/src/main/java/net/minecraft/world/entity/animal/Pig.java -index 7313d6bd41a312a8f9352240f181543d7cccb378..f4ae6de32bc1d854c54da829e45ca2cd15090433 100644 +index 62a1e63fb6ca80e165db46c4d03e28815196aaff..284f632fcce31f180742a131cc358288aba54807 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pig.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pig.java -@@ -172,6 +172,18 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { +@@ -177,6 +177,18 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { if (!flag && this.isSaddled() && !this.isVehicle() && !player.isSecondaryUseActive()) { if (!this.level.isClientSide) { @@ -28,18 +28,18 @@ index 7313d6bd41a312a8f9352240f181543d7cccb378..f4ae6de32bc1d854c54da829e45ca2cd } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8314452a8739b32264e3793616d2f50f25d1c2a8..341ea0d8d67e5028a8b9e6083119b8538d531c03 100644 +index 2108615ad64bac1e7b9d4950b9dd62407d16504a..0d042476484fd6fd2e7ad98cb695e80be2e0a1d4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -799,6 +799,7 @@ public class PurpurWorldConfig { - public boolean pigRidable = false; +@@ -868,6 +868,7 @@ public class PurpurWorldConfig { public boolean pigRidableInWater = false; + public boolean pigControllable = true; public double pigMaxHealth = 10.0D; + public boolean pigGiveSaddleBack = false; private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -808,6 +809,7 @@ public class PurpurWorldConfig { +@@ -878,6 +879,7 @@ public class PurpurWorldConfig { set("mobs.pig.attributes.max_health", oldValue); } pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); diff --git a/patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch b/patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch index 111ad167d2..60859de8fb 100644 --- a/patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch +++ b/patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Snowman drop and put back pumpkin 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 e194774b2ba7976565642534ceeca2079e23945e..a9c1b07f23c604d9364ccdee9478baf137af0816 100644 +index d3e8058e2fc45368e816482df178aa533c6edc0c..921215712cba59273da4387b5b4b2f3f5c9da6e2 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -187,6 +187,14 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -192,6 +192,14 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM } return InteractionResult.sidedSuccess(this.level.isClientSide); @@ -23,7 +23,7 @@ index e194774b2ba7976565642534ceeca2079e23945e..a9c1b07f23c604d9364ccdee9478baf1 } else { return tryRide(player, hand); // Purpur } -@@ -198,6 +206,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -203,6 +211,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM if (!this.level.isClientSide()) { this.setPumpkin(false); this.forceDrops = true; // CraftBukkit @@ -32,11 +32,11 @@ index e194774b2ba7976565642534ceeca2079e23945e..a9c1b07f23c604d9364ccdee9478baf1 this.forceDrops = false; // CraftBukkit } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 341ea0d8d67e5028a8b9e6083119b8538d531c03..8a50904dead7fb0c15d97b2424493a1f3ce35ccf 100644 +index 0d042476484fd6fd2e7ad98cb695e80be2e0a1d4..54c0fe906604b14314125ff35322f75c84c1ee7d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1034,6 +1034,8 @@ public class PurpurWorldConfig { - public boolean snowGolemRidableInWater = false; +@@ -1131,6 +1131,8 @@ public class PurpurWorldConfig { + public boolean snowGolemControllable = true; public boolean snowGolemLeaveTrailWhenRidden = false; public double snowGolemMaxHealth = 4.0D; + public boolean snowGolemDropsPumpkin = true; @@ -44,7 +44,7 @@ index 341ea0d8d67e5028a8b9e6083119b8538d531c03..8a50904dead7fb0c15d97b2424493a1f private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1044,6 +1046,8 @@ public class PurpurWorldConfig { +@@ -1142,6 +1144,8 @@ public class PurpurWorldConfig { set("mobs.snow_golem.attributes.max_health", oldValue); } snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); diff --git a/patches/server/0042-Ender-dragon-always-drop-full-exp.patch b/patches/server/0042-Ender-dragon-always-drop-full-exp.patch index c64dd02a0f..25d91e2239 100644 --- a/patches/server/0042-Ender-dragon-always-drop-full-exp.patch +++ b/patches/server/0042-Ender-dragon-always-drop-full-exp.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Ender dragon always drop full exp diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 73506ce90426bdfb8fbc08687c6e21de637fbd77..9d4dd8c460d1d69ab56e166e10fd7137ddc47603 100644 +index 4e44be78614107932af183dae144a21b0b260c97..e6772a3c4cda03824ed6a34936e1639979e73a0e 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -709,7 +709,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -714,7 +714,7 @@ public class EnderDragon extends Mob implements Enemy { boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT); short short0 = 500; @@ -18,18 +18,18 @@ index 73506ce90426bdfb8fbc08687c6e21de637fbd77..9d4dd8c460d1d69ab56e166e10fd7137 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8a50904dead7fb0c15d97b2424493a1f3ce35ccf..149b3cf94e6e60007a91cb1653419aed7b88b388 100644 +index 54c0fe906604b14314125ff35322f75c84c1ee7d..fa3ae133ed06e4b57a4bc3ea2a32b5f1aef2636b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -396,6 +396,7 @@ public class PurpurWorldConfig { - public boolean enderDragonRidableInWater = false; - public double enderDragonMaxY = 256D; +@@ -423,6 +423,7 @@ public class PurpurWorldConfig { + public boolean enderDragonControllable = true; + public double enderDragonMaxY = 320D; public double enderDragonMaxHealth = 200.0D; + public boolean enderDragonAlwaysDropsFullExp = false; private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -410,6 +411,7 @@ public class PurpurWorldConfig { +@@ -438,6 +439,7 @@ public class PurpurWorldConfig { set("mobs.ender_dragon.attributes.max_health", oldValue); } enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); diff --git a/patches/server/0054-Add-enderman-and-creeper-griefing-controls.patch b/patches/server/0054-Add-enderman-and-creeper-griefing-controls.patch index e8a9356024..74c354199b 100644 --- a/patches/server/0054-Add-enderman-and-creeper-griefing-controls.patch +++ b/patches/server/0054-Add-enderman-and-creeper-griefing-controls.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add enderman and creeper griefing controls 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 624b736f11341816c91f422cf6098ac0d19855b3..bb32bc0989ebbdd7522fe5f70ae3e6414f909388 100644 +index c2839fea7a3ed7365825b3886c1b9091b61b001e..956ec09ac0bc86608af1618be197e56e9055f82f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -344,7 +344,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -349,7 +349,7 @@ public class Creeper extends Monster implements PowerableMob { public void explodeCreeper() { if (!this.level.isClientSide) { @@ -18,10 +18,10 @@ index 624b736f11341816c91f422cf6098ac0d19855b3..bb32bc0989ebbdd7522fe5f70ae3e641 // CraftBukkit start 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 1cec7bb3efa1e3377f72489c090d3234123d3e26..434e51325cbfe4539470f9ec5164e8ebdd482748 100644 +index 732fb89ab0405373a782eec9807507f0f3f08238..c7917051c7303ab5ffc38c2cab6fc1b2b39c9642 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -505,6 +505,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -510,6 +510,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { @@ -29,7 +29,7 @@ index 1cec7bb3efa1e3377f72489c090d3234123d3e26..434e51325cbfe4539470f9ec5164e8eb return this.enderman.getCarriedBlock() == null ? false : (!this.enderman.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0); } -@@ -552,6 +553,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -557,6 +558,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { @@ -38,18 +38,18 @@ index 1cec7bb3efa1e3377f72489c090d3234123d3e26..434e51325cbfe4539470f9ec5164e8eb } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4b81cc5d43182fa117c2a5d720a89f17ddf7f39b..7952a21e91ab87da057e69eae260f1d892fa38e5 100644 +index 725d29b3e79e45d95635b73c9ea783ff2a04ad39..ce46f2530aad6f2fb96618b101f5dfdec974908e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -391,6 +391,7 @@ public class PurpurWorldConfig { - public boolean creeperRidableInWater = false; +@@ -410,6 +410,7 @@ public class PurpurWorldConfig { + public boolean creeperControllable = true; public double creeperMaxHealth = 20.0D; public double creeperChargedChance = 0.0D; + public boolean creeperAllowGriefing = true; private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -401,6 +402,7 @@ public class PurpurWorldConfig { +@@ -421,6 +422,7 @@ public class PurpurWorldConfig { } creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); @@ -57,15 +57,15 @@ index 4b81cc5d43182fa117c2a5d720a89f17ddf7f39b..7952a21e91ab87da057e69eae260f1d8 } public boolean dolphinRidable = false; -@@ -498,6 +500,7 @@ public class PurpurWorldConfig { - public boolean endermanRidable = false; +@@ -527,6 +529,7 @@ public class PurpurWorldConfig { public boolean endermanRidableInWater = false; + public boolean endermanControllable = true; public double endermanMaxHealth = 40.0D; + public boolean endermanAllowGriefing = true; private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -507,6 +510,7 @@ public class PurpurWorldConfig { +@@ -537,6 +540,7 @@ public class PurpurWorldConfig { set("mobs.enderman.attributes.max_health", oldValue); } endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); diff --git a/patches/server/0055-Villagers-follow-emerald-blocks.patch b/patches/server/0055-Villagers-follow-emerald-blocks.patch index b53170f06d..59f7ae0b6c 100644 --- a/patches/server/0055-Villagers-follow-emerald-blocks.patch +++ b/patches/server/0055-Villagers-follow-emerald-blocks.patch @@ -30,10 +30,10 @@ index bd283f71cb05ffbe1fed39afb41ae54dc52ec297..d7ebbd785d89fc5c1fec1a020a259a94 // CraftBukkit start private CraftMerchant craftMerchant; 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 783cdc4949549725c884cdc0edff485936c77de3..5264f4dea9901fa702bdd6fb7855385bcfe53b64 100644 +index 3ec933905f247e23c4c13b21dbf6fe4018583c5d..a245a795b6161ffb249adcad1e5bdd7ed619e539 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -169,6 +169,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -174,6 +174,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); @@ -42,10 +42,10 @@ index 783cdc4949549725c884cdc0edff485936c77de3..5264f4dea9901fa702bdd6fb7855385b @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 0bcfece84ac11f04671ed38a99b31da9f8b03858..2f0bcf917af26fb7628bda134b650a8b296091ea 100644 +index ab7beb6ddccf9e392aa791fee9280af814695259..24ebba702842de390c026a7a5172dbcfae16fb91 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -104,6 +104,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -109,6 +109,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill this.goalSelector.addGoal(1, new PanicGoal(this, 0.5D)); this.goalSelector.addGoal(1, new LookAtTradingPlayerGoal(this)); this.goalSelector.addGoal(2, new WanderingTrader.WanderToPositionGoal(this, 2.0D, 0.35D)); @@ -54,10 +54,10 @@ index 0bcfece84ac11f04671ed38a99b31da9f8b03858..2f0bcf917af26fb7628bda134b650a8b this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 0.35D)); this.goalSelector.addGoal(9, new InteractGoal(this, Player.class, 3.0F, 1.0F)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7952a21e91ab87da057e69eae260f1d892fa38e5..627a655c4d988c7634817ed08a3b92b08fc6fd2a 100644 +index ce46f2530aad6f2fb96618b101f5dfdec974908e..11e9eeeb1ef515ea65701629f61b2a74c5986412 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1264,6 +1264,7 @@ public class PurpurWorldConfig { +@@ -1379,6 +1379,7 @@ public class PurpurWorldConfig { public double villagerMaxHealth = 20.0D; public int villagerBrainTicks = 1; public boolean villagerUseBrainTicksOnlyWhenLagging = true; @@ -65,7 +65,7 @@ index 7952a21e91ab87da057e69eae260f1d892fa38e5..627a655c4d988c7634817ed08a3b92b0 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1275,6 +1276,7 @@ public class PurpurWorldConfig { +@@ -1391,6 +1392,7 @@ public class PurpurWorldConfig { villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth); villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks); villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); @@ -73,15 +73,15 @@ index 7952a21e91ab87da057e69eae260f1d892fa38e5..627a655c4d988c7634817ed08a3b92b0 } public boolean vindicatorRidable = false; -@@ -1294,6 +1296,7 @@ public class PurpurWorldConfig { - public boolean wanderingTraderRidable = false; +@@ -1413,6 +1415,7 @@ public class PurpurWorldConfig { public boolean wanderingTraderRidableInWater = false; + public boolean wanderingTraderControllable = true; public double wanderingTraderMaxHealth = 20.0D; + public boolean wanderingTraderFollowEmeraldBlock = false; private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -1303,6 +1306,7 @@ public class PurpurWorldConfig { +@@ -1423,6 +1426,7 @@ public class PurpurWorldConfig { set("mobs.wandering_trader.attributes.max_health", oldValue); } wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); diff --git a/patches/server/0056-Allow-leashing-villagers.patch b/patches/server/0056-Allow-leashing-villagers.patch index b41a3ebae8..dbc140b4a9 100644 --- a/patches/server/0056-Allow-leashing-villagers.patch +++ b/patches/server/0056-Allow-leashing-villagers.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Allow leashing villagers diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index cbb2f643c619c80d3bebcf1a8f066a87fc52d274..1b1323ef9aaaede71a73a5a817ef57f14756991c 100644 +index dcf788de63b819abc668cc6deba974af26a41f2e..0b7e937b821b4e357cd2e726f5c5e542335cdee0 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1242,6 +1242,7 @@ public abstract class Mob extends LivingEntity { +@@ -1240,6 +1240,7 @@ public abstract class Mob extends LivingEntity { if (!this.isAlive()) { return InteractionResult.PASS; } else if (this.getLeashHolder() == player) { @@ -17,10 +17,10 @@ index cbb2f643c619c80d3bebcf1a8f066a87fc52d274..1b1323ef9aaaede71a73a5a817ef57f1 // Paper start - drop leash variable org.bukkit.event.player.PlayerUnleashEntityEvent event = CraftEventFactory.callPlayerUnleashEntityEvent(this, player, !player.getAbilities().instabuild); 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 5264f4dea9901fa702bdd6fb7855385bcfe53b64..c6596547c23365b2f7028f3764dbd0b5571f898c 100644 +index a245a795b6161ffb249adcad1e5bdd7ed619e539..f4d79bd45ad262c92648cebbf3a5cfcd0b826c3e 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -176,6 +176,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -181,6 +181,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.villagerMaxHealth); } @@ -33,10 +33,10 @@ index 5264f4dea9901fa702bdd6fb7855385bcfe53b64..c6596547c23365b2f7028f3764dbd0b5 @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 2f0bcf917af26fb7628bda134b650a8b296091ea..c5dbb1c8210b71f7d9d91089cb139f65605573a8 100644 +index 24ebba702842de390c026a7a5172dbcfae16fb91..00a19fc46b4ffecfcfb591a17c7c3608f014d7c8 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -82,6 +82,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -87,6 +87,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wanderingTraderMaxHealth); } @@ -49,10 +49,10 @@ index 2f0bcf917af26fb7628bda134b650a8b296091ea..c5dbb1c8210b71f7d9d91089cb139f65 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 627a655c4d988c7634817ed08a3b92b08fc6fd2a..bfffa9db556a3518b600052c2f42b922f760cea2 100644 +index 11e9eeeb1ef515ea65701629f61b2a74c5986412..9cab405a67c76e920754d0ba10978cf5476f1b82 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1265,6 +1265,7 @@ public class PurpurWorldConfig { +@@ -1380,6 +1380,7 @@ public class PurpurWorldConfig { public int villagerBrainTicks = 1; public boolean villagerUseBrainTicksOnlyWhenLagging = true; public boolean villagerFollowEmeraldBlock = false; @@ -60,7 +60,7 @@ index 627a655c4d988c7634817ed08a3b92b08fc6fd2a..bfffa9db556a3518b600052c2f42b922 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1277,6 +1278,7 @@ public class PurpurWorldConfig { +@@ -1393,6 +1394,7 @@ public class PurpurWorldConfig { villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks); villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); @@ -68,15 +68,15 @@ index 627a655c4d988c7634817ed08a3b92b08fc6fd2a..bfffa9db556a3518b600052c2f42b922 } public boolean vindicatorRidable = false; -@@ -1297,6 +1299,7 @@ public class PurpurWorldConfig { - public boolean wanderingTraderRidableInWater = false; +@@ -1416,6 +1418,7 @@ public class PurpurWorldConfig { + public boolean wanderingTraderControllable = true; public double wanderingTraderMaxHealth = 20.0D; public boolean wanderingTraderFollowEmeraldBlock = false; + public boolean wanderingTraderCanBeLeashed = false; private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -1307,6 +1310,7 @@ public class PurpurWorldConfig { +@@ -1427,6 +1430,7 @@ public class PurpurWorldConfig { } wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); diff --git a/patches/server/0057-Implement-configurable-search-radius-for-villagers-t.patch b/patches/server/0057-Implement-configurable-search-radius-for-villagers-t.patch index 2267f0d231..ee05c973b5 100644 --- a/patches/server/0057-Implement-configurable-search-radius-for-villagers-t.patch +++ b/patches/server/0057-Implement-configurable-search-radius-for-villagers-t.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Implement configurable search radius for villagers to spawn 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 c6596547c23365b2f7028f3764dbd0b5571f898c..fbed51cacb1963b10946056a42fa6878e88a31a9 100644 +index f4d79bd45ad262c92648cebbf3a5cfcd0b826c3e..fedf1a178b27da8e38af9b2e741b76de5d96ed89 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -1045,6 +1045,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1050,6 +1050,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Nullable private IronGolem trySpawnGolem(ServerLevel world) { @@ -18,10 +18,10 @@ index c6596547c23365b2f7028f3764dbd0b5571f898c..fbed51cacb1963b10946056a42fa6878 for (int i = 0; i < 10; ++i) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bfffa9db556a3518b600052c2f42b922f760cea2..72a8eed3b7debcd3f87308579aee58c0ca4b3070 100644 +index 9cab405a67c76e920754d0ba10978cf5476f1b82..39b47c37523950e9282b8db9e028795ee48f1155 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1266,6 +1266,8 @@ public class PurpurWorldConfig { +@@ -1381,6 +1381,8 @@ public class PurpurWorldConfig { public boolean villagerUseBrainTicksOnlyWhenLagging = true; public boolean villagerFollowEmeraldBlock = false; public boolean villagerCanBeLeashed = false; @@ -30,7 +30,7 @@ index bfffa9db556a3518b600052c2f42b922f760cea2..72a8eed3b7debcd3f87308579aee58c0 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1279,6 +1281,8 @@ public class PurpurWorldConfig { +@@ -1395,6 +1397,8 @@ public class PurpurWorldConfig { villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging); villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); diff --git a/patches/server/0062-Add-canSaveToDisk-to-Entity.patch b/patches/server/0062-Add-canSaveToDisk-to-Entity.patch index a04e88f63d..b01be08b25 100644 --- a/patches/server/0062-Add-canSaveToDisk-to-Entity.patch +++ b/patches/server/0062-Add-canSaveToDisk-to-Entity.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add canSaveToDisk to Entity diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 347a30897d82b6b6c789e8f207ed1a98c09f5ed3..0ff2b5c23c904826098af23f17e95aba790ef3de 100644 +index b7008875e7a105ed9011425fe0c2f64817f5d0a8..0c274d82f9ddcfa7ddadf63fdc1324430b8ee040 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4418,5 +4418,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i +@@ -4422,5 +4422,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i public boolean processClick(InteractionHand hand) { return false; } @@ -19,10 +19,10 @@ index 347a30897d82b6b6c789e8f207ed1a98c09f5ed3..0ff2b5c23c904826098af23f17e95aba // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 19f48278c5c8f9640683d61b9555074e140fa2ab..9a0a5da86e0502382cb538d6abea8e425e40dddc 100644 +index 8480ebae938abd4f11ad82fd11e3a5ad405aa180..9e6b44da2098b11b204d45a0f44287d842b5f792 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -204,6 +204,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -209,6 +209,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob // do not hit rider return target != rider && super.canHitEntity(target); } diff --git a/patches/server/0063-Dispenser-curse-of-binding-protection.patch b/patches/server/0063-Dispenser-curse-of-binding-protection.patch index 8176f3195c..d1c3822cc1 100644 --- a/patches/server/0063-Dispenser-curse-of-binding-protection.patch +++ b/patches/server/0063-Dispenser-curse-of-binding-protection.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dispenser curse of binding protection diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 1b1323ef9aaaede71a73a5a817ef57f14756991c..79d258458f5ad997a7e88af6c616d1b677d84581 100644 +index 0b7e937b821b4e357cd2e726f5c5e542335cdee0..68858cb7376c8c030a1e4039e76c296894168ce3 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -63,6 +63,7 @@ import net.minecraft.world.item.ProjectileWeaponItem; @@ -16,7 +16,7 @@ index 1b1323ef9aaaede71a73a5a817ef57f14756991c..79d258458f5ad997a7e88af6c616d1b6 import net.minecraft.world.level.GameRules; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -@@ -1098,6 +1099,12 @@ public abstract class Mob extends LivingEntity { +@@ -1096,6 +1097,12 @@ public abstract class Mob extends LivingEntity { } @@ -43,7 +43,7 @@ index baa7e055d8ee4a153842128b07984b9f6deac6ca..014dd3aa8a7313d978d4781a1b7c6f53 // CraftBukkit start Level world = pointer.getLevel(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0e08661ece83d8d3ab4cc26a9da30aa94dce1eb2..ffd4ebfb93266f18a456d691eb7c7428706fadaa 100644 +index 6c0f9f8f83cc5bbdad319ab608faf1320e1a7081..7d5e570b5537960532e7b6babfd1f7ac421a3854 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -227,6 +227,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0072-Configurable-jockey-options.patch b/patches/server/0072-Configurable-jockey-options.patch index 28e110a05f..c21b0d9f6f 100644 --- a/patches/server/0072-Configurable-jockey-options.patch +++ b/patches/server/0072-Configurable-jockey-options.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable jockey options 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 42ce331da58b749c17ece22c2ca9986a96c59438..54028f6c708e78e71b6db84898b9a6b30759023c 100644 +index 0217fb932379e5789dce932b6af90f1e97fb95de..dac2407cc170ed59d09e3969e432e3b5aaa48a66 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -89,6 +89,21 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -94,6 +94,21 @@ public class Drowned extends Zombie implements RangedAttackMob { protected void randomizeReinforcementsChance() { this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.drownedSpawnReinforcements); } @@ -31,10 +31,10 @@ index 42ce331da58b749c17ece22c2ca9986a96c59438..54028f6c708e78e71b6db84898b9a6b3 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 81a3f6c1774b187be96b412dae44be623ce7f6cb..7bb8ef0bb2de9a0b0d5048f8a4089835c41de568 100644 +index ff84c706d42bc6859faaa9302ba688f43ddcb537..640c75c2cf7ec1f1bc514d29ac1f929c526e0caa 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java -@@ -42,6 +42,21 @@ public class Husk extends Zombie { +@@ -47,6 +47,21 @@ public class Husk extends Zombie { protected void randomizeReinforcementsChance() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.huskSpawnReinforcements); } @@ -57,10 +57,10 @@ index 81a3f6c1774b187be96b412dae44be623ce7f6cb..7bb8ef0bb2de9a0b0d5048f8a4089835 public static boolean checkHuskSpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 589ebb2f962c957903c12fc1a5304604f0433441..c6ecf05dedeef70fb4aad55c6c8455fb7b69ab46 100644 +index 6943933ef0e97f31fbbcedee4ff469bc6e7e49c0..f1056d9174e19266990e54a04b3f99f2ea46beb1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -119,6 +119,18 @@ public class Zombie extends Monster { +@@ -124,6 +124,18 @@ public class Zombie extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.drownedMaxHealth); } @@ -79,7 +79,7 @@ index 589ebb2f962c957903c12fc1a5304604f0433441..c6ecf05dedeef70fb4aad55c6c8455fb // Purpur end @Override -@@ -530,19 +542,20 @@ public class Zombie extends Monster { +@@ -535,19 +547,20 @@ public class Zombie extends Monster { if (object instanceof Zombie.ZombieGroupData) { Zombie.ZombieGroupData entityzombie_groupdatazombie = (Zombie.ZombieGroupData) object; @@ -106,7 +106,7 @@ index 589ebb2f962c957903c12fc1a5304604f0433441..c6ecf05dedeef70fb4aad55c6c8455fb Chicken entitychicken1 = (Chicken) EntityType.CHICKEN.create(this.level); entitychicken1.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); -@@ -550,6 +563,7 @@ public class Zombie extends Monster { +@@ -555,6 +568,7 @@ public class Zombie extends Monster { entitychicken1.setChickenJockey(true); this.startRiding(entitychicken1); world.addFreshEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit @@ -115,10 +115,10 @@ index 589ebb2f962c957903c12fc1a5304604f0433441..c6ecf05dedeef70fb4aad55c6c8455fb } } diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index 2c93f08b0bb07b90512c317b5583d25c6ea05d82..eb8dc173468f205c7b47915942890fe711e10650 100644 +index 6309a40ce0d349a6e278d6584b056dc644a358ba..cad1a9be238aa62b4eb0ec02d4155d15c0cc5378 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -95,6 +95,21 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -100,6 +100,21 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { protected void randomizeReinforcementsChance() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level.purpurConfig.zombieVillagerSpawnReinforcements); } @@ -141,10 +141,10 @@ index 2c93f08b0bb07b90512c317b5583d25c6ea05d82..eb8dc173468f205c7b47915942890fe7 @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 f30b36b3f1153e1cbd9b8242909d9ba8c995df1d..76f1bbec2b8ebe037de65ee5ec718e17a6081c13 100644 +index e743fb4de0647088d06ec53291496e0d2f44fe44..e2192c45eba111a62dded3731dcdeacc6168710c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -74,6 +74,21 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -79,6 +79,21 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zombifiedPiglinMaxHealth); } @@ -167,11 +167,11 @@ index f30b36b3f1153e1cbd9b8242909d9ba8c995df1d..76f1bbec2b8ebe037de65ee5ec718e17 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a16775d93 100644 +index 7dd9e436b50019bb16a61314cf6798b6a5b2580b..9b87f29de86fe2b312622082705709479433f357 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -542,6 +542,9 @@ public class PurpurWorldConfig { - public boolean drownedRidableInWater = false; +@@ -565,6 +565,9 @@ public class PurpurWorldConfig { + public boolean drownedControllable = true; public double drownedMaxHealth = 20.0D; public double drownedSpawnReinforcements = 0.1D; + public boolean drownedJockeyOnlyBaby = true; @@ -180,7 +180,7 @@ index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -552,6 +555,9 @@ public class PurpurWorldConfig { +@@ -576,6 +579,9 @@ public class PurpurWorldConfig { } drownedMaxHealth = getDouble("mobs.drowned.attributes.max_health", drownedMaxHealth); drownedSpawnReinforcements = getDouble("mobs.drowned.attributes.spawn_reinforcements", drownedSpawnReinforcements); @@ -190,8 +190,8 @@ index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a } public boolean elderGuardianRidable = false; -@@ -764,6 +770,9 @@ public class PurpurWorldConfig { - public boolean huskRidableInWater = false; +@@ -813,6 +819,9 @@ public class PurpurWorldConfig { + public boolean huskControllable = true; public double huskMaxHealth = 20.0D; public double huskSpawnReinforcements = 0.1D; + public boolean huskJockeyOnlyBaby = true; @@ -200,7 +200,7 @@ index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -774,6 +783,9 @@ public class PurpurWorldConfig { +@@ -824,6 +833,9 @@ public class PurpurWorldConfig { } huskMaxHealth = getDouble("mobs.husk.attributes.max_health", huskMaxHealth); huskSpawnReinforcements = getDouble("mobs.husk.attributes.spawn_reinforcements", huskSpawnReinforcements); @@ -210,8 +210,8 @@ index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a } public boolean illusionerRidable = false; -@@ -1488,6 +1500,9 @@ public class PurpurWorldConfig { - public boolean zombieRidableInWater = false; +@@ -1619,6 +1631,9 @@ public class PurpurWorldConfig { + public boolean zombieControllable = true; public double zombieMaxHealth = 20.0D; public double zombieSpawnReinforcements = 0.1D; + public boolean zombieJockeyOnlyBaby = true; @@ -220,7 +220,7 @@ index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -1498,6 +1513,9 @@ public class PurpurWorldConfig { +@@ -1630,6 +1645,9 @@ public class PurpurWorldConfig { } zombieMaxHealth = getDouble("mobs.zombie.attributes.max_health", zombieMaxHealth); zombieSpawnReinforcements = getDouble("mobs.zombie.attributes.spawn_reinforcements", zombieSpawnReinforcements); @@ -230,8 +230,8 @@ index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a } public boolean zombieHorseRidableInWater = false; -@@ -1531,6 +1549,9 @@ public class PurpurWorldConfig { - public boolean zombieVillagerRidableInWater = false; +@@ -1664,6 +1682,9 @@ public class PurpurWorldConfig { + public boolean zombieVillagerControllable = true; public double zombieVillagerMaxHealth = 20.0D; public double zombieVillagerSpawnReinforcements = 0.1D; + public boolean zombieVillagerJockeyOnlyBaby = true; @@ -240,7 +240,7 @@ index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -1541,12 +1562,18 @@ public class PurpurWorldConfig { +@@ -1675,6 +1696,9 @@ public class PurpurWorldConfig { } zombieVillagerMaxHealth = getDouble("mobs.zombie_villager.attributes.max_health", zombieVillagerMaxHealth); zombieVillagerSpawnReinforcements = getDouble("mobs.zombie_villager.attributes.spawn_reinforcements", zombieVillagerSpawnReinforcements); @@ -250,7 +250,8 @@ index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a } public boolean zombifiedPiglinRidable = false; - public boolean zombifiedPiglinRidableInWater = false; +@@ -1682,6 +1706,9 @@ public class PurpurWorldConfig { + public boolean zombifiedPiglinControllable = true; public double zombifiedPiglinMaxHealth = 20.0D; public double zombifiedPiglinSpawnReinforcements = 0.0D; + public boolean zombifiedPiglinJockeyOnlyBaby = true; @@ -259,7 +260,7 @@ index 703a41c7c90124d8b8aa925a3f494ca61a268a92..982646423785bfb98be99044a8f4c59a private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -1557,5 +1584,8 @@ public class PurpurWorldConfig { +@@ -1693,5 +1720,8 @@ public class PurpurWorldConfig { } zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); diff --git a/patches/server/0073-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/server/0073-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index 5b85ebd942..d86cfdd3e1 100644 --- a/patches/server/0073-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/patches/server/0073-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -73,7 +73,7 @@ index d8c4f36ae0e65c6d0398fac80c93b78646bdf6a4..f8863cabad1bd0c3c2c62b8e17612d95 @Override protected void addAdditionalSaveData(CompoundTag nbt) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 59289140f51ea63e81ebebc97d5a54fc2b0e1914..61b40d0b7dbb956fa25271c6f6768ac147afc563 100644 +index c6fc7042386c98debf9b6e4614aca99d391d7e38..7361634f6eb65be5f04c00686be30e3e12d1bc0e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -49,6 +49,7 @@ public class Phantom extends FlyingMob implements Enemy { @@ -84,7 +84,7 @@ index 59289140f51ea63e81ebebc97d5a54fc2b0e1914..61b40d0b7dbb956fa25271c6f6768ac1 public Phantom(EntityType type, Level world) { super(type, world); -@@ -126,6 +127,24 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -131,6 +132,24 @@ public class Phantom extends FlyingMob implements Enemy { } return value; } @@ -109,7 +109,7 @@ index 59289140f51ea63e81ebebc97d5a54fc2b0e1914..61b40d0b7dbb956fa25271c6f6768ac1 // Purpur end @Override -@@ -140,11 +159,17 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -145,11 +164,17 @@ public class Phantom extends FlyingMob implements Enemy { @Override protected void registerGoals() { @@ -132,7 +132,7 @@ index 59289140f51ea63e81ebebc97d5a54fc2b0e1914..61b40d0b7dbb956fa25271c6f6768ac1 this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -337,6 +362,124 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -342,6 +367,124 @@ public class Phantom extends FlyingMob implements Enemy { private AttackPhase() {} } @@ -258,10 +258,10 @@ index 59289140f51ea63e81ebebc97d5a54fc2b0e1914..61b40d0b7dbb956fa25271c6f6768ac1 private float speed = 0.1F; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 982646423785bfb98be99044a8f4c59a16775d93..9627fc7c186da877be610d0d8464b3f557eb400d 100644 +index 9b87f29de86fe2b312622082705709479433f357..d1057f80a7816dc553ddb9b825e65f35764514a0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -964,6 +964,9 @@ public class PurpurWorldConfig { +@@ -1031,6 +1031,9 @@ public class PurpurWorldConfig { public String phantomAttackDamage = "6 + size"; public Map phantomMaxHealthCache = new HashMap<>(); public Map phantomAttackDamageCache = new HashMap<>(); @@ -271,7 +271,7 @@ index 982646423785bfb98be99044a8f4c59a16775d93..9627fc7c186da877be610d0d8464b3f5 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -984,6 +987,9 @@ public class PurpurWorldConfig { +@@ -1052,6 +1055,9 @@ public class PurpurWorldConfig { phantomAttackDamage = getString("mobs.phantom.attributes.attack_damage", phantomAttackDamage); phantomMaxHealthCache.clear(); phantomAttackDamageCache.clear(); diff --git a/patches/server/0074-Add-phantom-spawning-options.patch b/patches/server/0074-Add-phantom-spawning-options.patch index 705c3912c3..fefb6a8dcf 100644 --- a/patches/server/0074-Add-phantom-spawning-options.patch +++ b/patches/server/0074-Add-phantom-spawning-options.patch @@ -48,10 +48,10 @@ index 1e21d6cf2f03219fb2b7217c9a72bdd83c2146f7..dad5d3c754395b39e96be1e35a99c8bf for (int l = 0; l < k; ++l) { // Paper start diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9627fc7c186da877be610d0d8464b3f557eb400d..d6744436fbac28e3e6486a6d36f20e20a7d99d3e 100644 +index d1057f80a7816dc553ddb9b825e65f35764514a0..47c6d378380ff9345be4bd6dd06fe52e3e23162d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -967,6 +967,18 @@ public class PurpurWorldConfig { +@@ -1034,6 +1034,18 @@ public class PurpurWorldConfig { public double phantomAttackedByCrystalRadius = 0.0D; public float phantomAttackedByCrystalDamage = 1.0F; public double phantomOrbitCrystalRadius = 0.0D; @@ -70,7 +70,7 @@ index 9627fc7c186da877be610d0d8464b3f557eb400d..d6744436fbac28e3e6486a6d36f20e20 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -990,6 +1002,18 @@ public class PurpurWorldConfig { +@@ -1058,6 +1070,18 @@ public class PurpurWorldConfig { phantomAttackedByCrystalRadius = getDouble("mobs.phantom.attacked-by-crystal-range", phantomAttackedByCrystalRadius); phantomAttackedByCrystalDamage = (float) getDouble("mobs.phantom.attacked-by-crystal-damage", phantomAttackedByCrystalDamage); phantomOrbitCrystalRadius = getDouble("mobs.phantom.orbit-crystal-radius", phantomOrbitCrystalRadius); diff --git a/patches/server/0079-Entity-lifespan.patch b/patches/server/0079-Entity-lifespan.patch index 63e5ff9427..a5dd441fc0 100644 --- a/patches/server/0079-Entity-lifespan.patch +++ b/patches/server/0079-Entity-lifespan.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Entity lifespan diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 79d258458f5ad997a7e88af6c616d1b677d84581..1ef0de7544f26faf69dc0395da8e09f9514a4aff 100644 +index 68858cb7376c8c030a1e4039e76c296894168ce3..83fb51ad723f06d002f31bd1caefb778f057a5ad 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -129,6 +129,7 @@ public abstract class Mob extends LivingEntity { @@ -16,7 +16,7 @@ index 79d258458f5ad997a7e88af6c616d1b677d84581..1ef0de7544f26faf69dc0395da8e09f9 public boolean aware = true; // CraftBukkit protected Mob(EntityType type, Level world) { -@@ -288,6 +289,7 @@ public abstract class Mob extends LivingEntity { +@@ -286,6 +287,7 @@ public abstract class Mob extends LivingEntity { entityliving = null; } } @@ -24,7 +24,7 @@ index 79d258458f5ad997a7e88af6c616d1b677d84581..1ef0de7544f26faf69dc0395da8e09f9 this.target = entityliving; return true; // CraftBukkit end -@@ -332,9 +334,35 @@ public abstract class Mob extends LivingEntity { +@@ -330,9 +332,35 @@ public abstract class Mob extends LivingEntity { this.playAmbientSound(); } @@ -60,7 +60,7 @@ index 79d258458f5ad997a7e88af6c616d1b677d84581..1ef0de7544f26faf69dc0395da8e09f9 @Override protected void playHurtSound(DamageSource source) { this.resetAmbientSoundTime(); -@@ -518,6 +546,7 @@ public abstract class Mob extends LivingEntity { +@@ -516,6 +544,7 @@ public abstract class Mob extends LivingEntity { } nbt.putBoolean("Bukkit.Aware", this.aware); // CraftBukkit @@ -68,7 +68,7 @@ index 79d258458f5ad997a7e88af6c616d1b677d84581..1ef0de7544f26faf69dc0395da8e09f9 } @Override -@@ -588,6 +617,11 @@ public abstract class Mob extends LivingEntity { +@@ -586,6 +615,11 @@ public abstract class Mob extends LivingEntity { this.aware = nbt.getBoolean("Bukkit.Aware"); } // CraftBukkit end @@ -80,7 +80,7 @@ index 79d258458f5ad997a7e88af6c616d1b677d84581..1ef0de7544f26faf69dc0395da8e09f9 } @Override -@@ -1613,6 +1647,7 @@ public abstract class Mob extends LivingEntity { +@@ -1611,6 +1645,7 @@ public abstract class Mob extends LivingEntity { this.setLastHurtMob(target); } @@ -89,7 +89,7 @@ index 79d258458f5ad997a7e88af6c616d1b677d84581..1ef0de7544f26faf69dc0395da8e09f9 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a38a4bdba8c87bfce09487714b58082f74432b9d..9a7cbf1473c00af0681865f14455f6531036f4cd 100644 +index d6f6cf7e17d9cd5b1398aab8e2b9b6df75fea02e..d25af1733601d26b6d2173837a0a5948ae01a6d4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -124,6 +124,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0081-Squid-EAR-immunity.patch b/patches/server/0081-Squid-EAR-immunity.patch index 42a26731b4..a0e280de09 100644 --- a/patches/server/0081-Squid-EAR-immunity.patch +++ b/patches/server/0081-Squid-EAR-immunity.patch @@ -5,18 +5,18 @@ Subject: [PATCH] Squid EAR immunity diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 337e6f2515591c690a2a18055c6dbdb006f0aea2..e31ed42038f800125f2129b1dbfafa86eacbf1b9 100644 +index a9a3f13a64cd7d9152f65285a5f5f48f5a31b7a3..e480e61419a9b83e98fcd0ba8a949c20a241c949 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1311,6 +1311,7 @@ public class PurpurWorldConfig { - +@@ -1410,6 +1410,7 @@ public class PurpurWorldConfig { public boolean squidRidable = false; + public boolean squidControllable = true; public double squidMaxHealth = 10.0D; + public boolean squidImmuneToEAR = true; private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); - if (PurpurConfig.version < 10) { -@@ -1319,6 +1320,7 @@ public class PurpurWorldConfig { + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -1419,6 +1420,7 @@ public class PurpurWorldConfig { set("mobs.squid.attributes.max_health", oldValue); } squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); diff --git a/patches/server/0082-Phantoms-burn-in-light.patch b/patches/server/0082-Phantoms-burn-in-light.patch index b43854a17f..00c9745151 100644 --- a/patches/server/0082-Phantoms-burn-in-light.patch +++ b/patches/server/0082-Phantoms-burn-in-light.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Phantoms burn in light diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 61b40d0b7dbb956fa25271c6f6768ac147afc563..72a790e6aba656e8817a84d2c729ce722e9a43ef 100644 +index 7361634f6eb65be5f04c00686be30e3e12d1bc0e..20ff9c65f89635a4b91d334775b3ac380b5ccbac 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -50,6 +50,7 @@ public class Phantom extends FlyingMob implements Enemy { @@ -16,16 +16,16 @@ index 61b40d0b7dbb956fa25271c6f6768ac147afc563..72a790e6aba656e8817a84d2c729ce72 public Phantom(EntityType type, Level world) { super(type, world); -@@ -242,7 +243,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -247,7 +248,7 @@ public class Phantom extends FlyingMob implements Enemy { @Override public void aiStep() { -- if (this.isAlive() && getRider() == null && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning // Purpur -+ if (this.isAlive() && getRider() == null && (((shouldBurnInDay && level.purpurConfig.phantomBurnInDaylight) && this.isSunBurnTick()) || (level.purpurConfig.phantomBurnInLight > 0 && level.getMaxLocalRawBrightness(blockPosition()) >= level.purpurConfig.phantomBurnInLight))) { // Paper - Configurable Burning // Purpur +- if (this.isAlive() && (getRider() == null || !this.isControllable()) && shouldBurnInDay && this.isSunBurnTick()) { // Paper - Configurable Burning // Purpur ++ if (this.isAlive() && (getRider() == null || !this.isControllable()) && (((shouldBurnInDay && level.purpurConfig.phantomBurnInDaylight) && this.isSunBurnTick()) || (level.purpurConfig.phantomBurnInLight > 0 && level.getMaxLocalRawBrightness(blockPosition()) >= level.purpurConfig.phantomBurnInLight))) { // Paper - Configurable Burning // Purpur this.setSecondsOnFire(8); } -@@ -646,6 +647,12 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -651,6 +652,12 @@ public class Phantom extends FlyingMob implements Enemy { return false; } else if (!entityliving.isAlive()) { return false; @@ -38,7 +38,7 @@ index 61b40d0b7dbb956fa25271c6f6768ac147afc563..72a790e6aba656e8817a84d2c729ce72 } else { if (entityliving instanceof Player) { Player entityhuman = (Player) entityliving; -@@ -791,6 +798,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -796,6 +803,7 @@ public class Phantom extends FlyingMob implements Enemy { this.nextScanTick = reducedTickDelay(60); List list = Phantom.this.level.getNearbyPlayers(this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0D, 64.0D, 16.0D)); @@ -47,10 +47,10 @@ index 61b40d0b7dbb956fa25271c6f6768ac147afc563..72a790e6aba656e8817a84d2c729ce72 list.sort(Comparator.comparing((Entity e) -> { return e.getY(); }).reversed()); // CraftBukkit - decompile error Iterator iterator = list.iterator(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e31ed42038f800125f2129b1dbfafa86eacbf1b9..e2aa7524253adecd6536530d93f68e75482af97f 100644 +index e480e61419a9b83e98fcd0ba8a949c20a241c949..249368f0808871eafa8b3dfd48f631a8d55a74f0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1018,6 +1018,9 @@ public class PurpurWorldConfig { +@@ -1085,6 +1085,9 @@ public class PurpurWorldConfig { public int phantomSpawnOverheadRadius = 10; public int phantomSpawnMinPerAttempt = 1; public int phantomSpawnMaxPerAttempt = -1; @@ -60,7 +60,7 @@ index e31ed42038f800125f2129b1dbfafa86eacbf1b9..e2aa7524253adecd6536530d93f68e75 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1053,6 +1056,9 @@ public class PurpurWorldConfig { +@@ -1121,6 +1124,9 @@ public class PurpurWorldConfig { phantomSpawnOverheadRadius = getInt("mobs.phantom.spawn.overhead.radius", phantomSpawnOverheadRadius); phantomSpawnMinPerAttempt = getInt("mobs.phantom.spawn.per-attempt.min", phantomSpawnMinPerAttempt); phantomSpawnMaxPerAttempt = getInt("mobs.phantom.spawn.per-attempt.max", phantomSpawnMaxPerAttempt); diff --git a/patches/server/0083-Configurable-villager-breeding.patch b/patches/server/0083-Configurable-villager-breeding.patch index 50eee27139..45f943f4d7 100644 --- a/patches/server/0083-Configurable-villager-breeding.patch +++ b/patches/server/0083-Configurable-villager-breeding.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable villager breeding 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 fbed51cacb1963b10946056a42fa6878e88a31a9..3d755f2c6253e83d0d9fb1348f066f4f7fe1d4be 100644 +index fedf1a178b27da8e38af9b2e741b76de5d96ed89..14ba8dcf9392e3bfdb92663f98455cb9c0f44c10 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -767,7 +767,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -772,7 +772,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { @@ -18,10 +18,10 @@ index fbed51cacb1963b10946056a42fa6878e88a31a9..3d755f2c6253e83d0d9fb1348f066f4f private boolean hungry() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e2aa7524253adecd6536530d93f68e75482af97f..ce4d44d130ee3ed5b6925090ffa2b2d8da9c221b 100644 +index 249368f0808871eafa8b3dfd48f631a8d55a74f0..2784edf4fb34f90e46ca693427e8861e15fb97bc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1448,6 +1448,7 @@ public class PurpurWorldConfig { +@@ -1563,6 +1563,7 @@ public class PurpurWorldConfig { public boolean villagerCanBeLeashed = false; public int villagerSpawnIronGolemRadius = 0; public int villagerSpawnIronGolemLimit = 0; @@ -29,7 +29,7 @@ index e2aa7524253adecd6536530d93f68e75482af97f..ce4d44d130ee3ed5b6925090ffa2b2d8 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1463,6 +1464,7 @@ public class PurpurWorldConfig { +@@ -1579,6 +1580,7 @@ public class PurpurWorldConfig { villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius); villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); diff --git a/patches/server/0086-Add-vindicator-johnny-spawn-chance.patch b/patches/server/0086-Add-vindicator-johnny-spawn-chance.patch index 94688e4550..62bae6982e 100644 --- a/patches/server/0086-Add-vindicator-johnny-spawn-chance.patch +++ b/patches/server/0086-Add-vindicator-johnny-spawn-chance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add vindicator johnny spawn chance 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 c92c948989543248b22db0830a3cb1b6f7940d60..9db267a9a52aa1bde4423711bd0ac6b9949de61b 100644 +index ff62f5ed29a826c4dd53eb6fe04f5aa27de62619..acd4e282841708d7ef0145757899e355a6410a4a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java @@ -7,6 +7,7 @@ import java.util.function.Predicate; @@ -16,7 +16,7 @@ index c92c948989543248b22db0830a3cb1b6f7940d60..9db267a9a52aa1bde4423711bd0ac6b9 import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvents; -@@ -146,6 +147,12 @@ public class Vindicator extends AbstractIllager { +@@ -151,6 +152,12 @@ public class Vindicator extends AbstractIllager { ((GroundPathNavigation) this.getNavigation()).setCanOpenDoors(true); this.populateDefaultEquipmentSlots(difficulty); this.populateDefaultEquipmentEnchantments(difficulty); @@ -30,18 +30,18 @@ index c92c948989543248b22db0830a3cb1b6f7940d60..9db267a9a52aa1bde4423711bd0ac6b9 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c28ed3ae75695d5f4052726a2acf526dde7cd261..ccdbeca6fa964fc2d1b4b25bdd4a218ea13a92df 100644 +index 7159461ec4b4563d3fd15c12f7900b70f643592f..48f8f0447d4612c15b3a9c53b74c593a608bc352 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1477,6 +1477,7 @@ public class PurpurWorldConfig { - public boolean vindicatorRidable = false; +@@ -1594,6 +1594,7 @@ public class PurpurWorldConfig { public boolean vindicatorRidableInWater = false; + public boolean vindicatorControllable = true; public double vindicatorMaxHealth = 24.0D; + public double vindicatorJohnnySpawnChance = 0D; private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -1486,6 +1487,7 @@ public class PurpurWorldConfig { +@@ -1604,6 +1605,7 @@ public class PurpurWorldConfig { set("mobs.vindicator.attributes.max_health", oldValue); } vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); diff --git a/patches/server/0090-Add-option-to-disable-dolphin-treasure-searching.patch b/patches/server/0090-Add-option-to-disable-dolphin-treasure-searching.patch index 8863fdde25..80f113582f 100644 --- a/patches/server/0090-Add-option-to-disable-dolphin-treasure-searching.patch +++ b/patches/server/0090-Add-option-to-disable-dolphin-treasure-searching.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add option to disable dolphin treasure searching 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 16f32f0a58b090174f3d8b38c583adbcca58c9e4..ea0fb3b032a86223bfdee05a56baa15abfbe5d38 100644 +index da30c9b0f49e714ff7c84c32f62ffeacaedb6aff..3b198ad456f666fa1819ac39bcdfc8c85a256708 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -477,6 +477,7 @@ public class Dolphin extends WaterAnimal { +@@ -482,6 +482,7 @@ public class Dolphin extends WaterAnimal { @Override public boolean canUse() { @@ -17,18 +17,18 @@ index 16f32f0a58b090174f3d8b38c583adbcca58c9e4..ea0fb3b032a86223bfdee05a56baa15a } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e636499f07581429e0bc42f6b9c1c80fb48cc71a..06c50a42e2acd17b6c89ac8428b25c5866e6127e 100644 +index 6319654f2560a1d035d13b2a1ada30c91c4d9cdb..8d31e240e3d275e228c6d8c1107a609c3bf04729 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -554,6 +554,7 @@ public class PurpurWorldConfig { +@@ -575,6 +575,7 @@ public class PurpurWorldConfig { public float dolphinSpitSpeed = 1.0F; public float dolphinSpitDamage = 2.0F; public double dolphinMaxHealth = 10.0D; + public boolean dolphinDisableTreasureSearching = false; private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); - dolphinSpitCooldown = getInt("mobs.dolphin.spit.cooldown", dolphinSpitCooldown); -@@ -565,6 +566,7 @@ public class PurpurWorldConfig { + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); +@@ -587,6 +588,7 @@ public class PurpurWorldConfig { set("mobs.dolphin.attributes.max_health", oldValue); } dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); diff --git a/patches/server/0091-Short-enderman-height.patch b/patches/server/0091-Short-enderman-height.patch index afa6bc0019..ca5c90e5bd 100644 --- a/patches/server/0091-Short-enderman-height.patch +++ b/patches/server/0091-Short-enderman-height.patch @@ -19,13 +19,13 @@ index 4833e545545d9114a15f0bcc0d0a2a214183000f..fce7a9c1c1477d1b02a4adbe0bc5a5c9 private static EntityType register(String id, EntityType.Builder type) { // CraftBukkit - decompile error return (EntityType) Registry.register(Registry.ENTITY_TYPE, id, (EntityType) type.build(id)); // CraftBukkit - decompile error 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 434e51325cbfe4539470f9ec5164e8ebdd482748..37fe7d448ae40e67cc8c7c1856df3c8ac276f0be 100644 +index c7917051c7303ab5ffc38c2cab6fc1b2b39c9642..83341eaa1162c311d6e1649fe9b6743597077e35 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -405,6 +405,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -410,6 +410,7 @@ public class EnderMan extends Monster implements NeutralMob { if (this.isInvulnerableTo(source)) { return false; - } else if (getRider() != null) { return super.hurt(source, amount); // Purpur - no teleporting on damage + } else if (getRider() != null && this.isControllable()) { return super.hurt(source, amount); // Purpur - no teleporting on damage + } else if (org.purpurmc.purpur.PurpurConfig.endermanShortHeight && source == DamageSource.IN_WALL) { return false; // Purpur - no suffocation damage if short height } else if (source instanceof IndirectEntityDamageSource) { Entity entity = source.getDirectEntity(); diff --git a/patches/server/0092-Stop-squids-floating-on-top-of-water.patch b/patches/server/0092-Stop-squids-floating-on-top-of-water.patch index 0bd753f2b9..8af79a0f09 100644 --- a/patches/server/0092-Stop-squids-floating-on-top-of-water.patch +++ b/patches/server/0092-Stop-squids-floating-on-top-of-water.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Stop squids floating on top of water diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index fda1d7f9b4bdfd12a531104ca8b571bd39e758f4..851edf3d77ccc887943a68ea6835d4c9bd4c16a9 100644 +index 0c274d82f9ddcfa7ddadf63fdc1324430b8ee040..bf8cd06cc9d84930460d055b7f82de1bc7912803 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -3914,6 +3914,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i @@ -22,10 +22,10 @@ index fda1d7f9b4bdfd12a531104ca8b571bd39e758f4..851edf3d77ccc887943a68ea6835d4c9 if (false && this.touchingUnloadedChunk()) { // Pufferfish - cost of a lookup here is the same cost as below, so skip return false; 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 501b082e36b30140eef9540b8b217b9d45309dff..55f94d28a536f5ceda00831e1b22c8db31c07c2f 100644 +index 565276f556e2c7cf465b6bed53bdeac5ce4c4312..45533523c5eee0431e96c01de4a64f9f0b887a2e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -76,6 +76,12 @@ public class Squid extends WaterAnimal { +@@ -81,6 +81,12 @@ public class Squid extends WaterAnimal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.squidMaxHealth); } @@ -54,18 +54,18 @@ index 68cc6f2a78a06293a29317fda72ab3ee79b3533a..cfb2e46b34b2982d6724f18214557fc8 + // Purpur } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 06c50a42e2acd17b6c89ac8428b25c5866e6127e..bce10b6b23b563a95a16400d9ee80300fbb67939 100644 +index 8d31e240e3d275e228c6d8c1107a609c3bf04729..b631a21ee4eb646d86532dd11784bd7c705eb3ee 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1334,6 +1334,7 @@ public class PurpurWorldConfig { - public boolean squidRidable = false; +@@ -1433,6 +1433,7 @@ public class PurpurWorldConfig { + public boolean squidControllable = true; public double squidMaxHealth = 10.0D; public boolean squidImmuneToEAR = true; + public double squidOffsetWaterCheck = 0.0D; private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); - if (PurpurConfig.version < 10) { -@@ -1343,6 +1344,7 @@ public class PurpurWorldConfig { + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -1443,6 +1444,7 @@ public class PurpurWorldConfig { } squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); diff --git a/patches/server/0096-Customizable-wither-health-and-healing.patch b/patches/server/0096-Customizable-wither-health-and-healing.patch index 8d8a797bf6..829a1f0237 100644 --- a/patches/server/0096-Customizable-wither-health-and-healing.patch +++ b/patches/server/0096-Customizable-wither-health-and-healing.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Customizable wither health and healing Adds the ability to customize the health of the wither, as well as the amount that it heals, and how often. diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 9a0a5da86e0502382cb538d6abea8e425e40dddc..93cc8dbf2ff435777a5edc11a834ca1b190638ab 100644 +index 9e6b44da2098b11b204d45a0f44287d842b5f792..5bb5390ccec6826ead2198b413254dd1bd10f4b8 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -515,8 +515,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -520,8 +520,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } } @@ -23,19 +23,19 @@ index 9a0a5da86e0502382cb538d6abea8e425e40dddc..93cc8dbf2ff435777a5edc11a834ca1b this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth()); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e92a269a9340cd6b76cb7e13738ca46906675b2f..8ff90ee18ed8a6d6c5be991a5a0841383dd93f6c 100644 +index f6d4be9b81b82e7ae46f7694b824a06b3f6272ed..2a226f91d7afe0489adb4dbe94d69e6fc8e6e4e4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1539,6 +1539,8 @@ public class PurpurWorldConfig { - public boolean witherRidableInWater = false; - public double witherMaxY = 256D; +@@ -1662,6 +1662,8 @@ public class PurpurWorldConfig { + public boolean witherControllable = true; + public double witherMaxY = 320D; public double witherMaxHealth = 300.0D; + public float witherHealthRegenAmount = 1.0f; + public int witherHealthRegenDelay = 20; private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1553,6 +1555,8 @@ public class PurpurWorldConfig { +@@ -1677,6 +1679,8 @@ public class PurpurWorldConfig { set("mobs.wither.attributes.max_health", oldValue); } witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); diff --git a/patches/server/0100-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/server/0100-Add-option-to-disable-zombie-aggressiveness-towards-.patch index c26da115c9..17d343ca92 100644 --- a/patches/server/0100-Add-option-to-disable-zombie-aggressiveness-towards-.patch +++ b/patches/server/0100-Add-option-to-disable-zombie-aggressiveness-towards-.patch @@ -21,10 +21,10 @@ index 181abe014baba9ac51064c003381281a8fa43fe4..cfd1dcec3efcd4caf2431cbda99bc9f1 ignored.add("goal_selector_1"); ignored.add("goal_selector_2"); 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 54028f6c708e78e71b6db84898b9a6b30759023c..02c8fd96d11e3a27b5fddb27d65fddffd157fb52 100644 +index dac2407cc170ed59d09e3969e432e3b5aaa48a66..d49e0f8e7842e4f5fb9f97fc8ea760910a1edd52 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -116,7 +116,19 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -121,7 +121,19 @@ public class Drowned extends Zombie implements RangedAttackMob { this.goalSelector.addGoal(7, new RandomStrollGoal(this, 1.0D)); this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, Drowned.class)).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::okTarget)); @@ -46,10 +46,10 @@ index 54028f6c708e78e71b6db84898b9a6b30759023c..02c8fd96d11e3a27b5fddb27d65fddff 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)); 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 c6ecf05dedeef70fb4aad55c6c8455fb7b69ab46..f2ff721fd7d1124e72f8cea4141769fb37f97b16 100644 +index f1056d9174e19266990e54a04b3f99f2ea46beb1..b59894aaa9553bf78b98a6fce7fb624088389011 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -149,7 +149,19 @@ public class Zombie extends Monster { +@@ -154,7 +154,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)); @@ -71,10 +71,10 @@ index c6ecf05dedeef70fb4aad55c6c8455fb7b69ab46..f2ff721fd7d1124e72f8cea4141769fb this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 88fae3bed78da308a047aec1347d13017ebfd933..04a9739ef2339cc0f886162401b90a0ed337e431 100644 +index 8847f78505aa4a9646a3d48a6c8b013bfff9c71f..f3a4634ccd0a92dfbd2991da0695f4cfb5259d1d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1660,6 +1660,7 @@ public class PurpurWorldConfig { +@@ -1791,6 +1791,7 @@ public class PurpurWorldConfig { public boolean zombieJockeyOnlyBaby = true; public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; @@ -82,7 +82,7 @@ index 88fae3bed78da308a047aec1347d13017ebfd933..04a9739ef2339cc0f886162401b90a0e private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -1673,6 +1674,7 @@ public class PurpurWorldConfig { +@@ -1805,6 +1806,7 @@ public class PurpurWorldConfig { zombieJockeyOnlyBaby = getBoolean("mobs.zombie.jockey.only-babies", zombieJockeyOnlyBaby); zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); diff --git a/patches/server/0102-Flying-squids-Oh-my.patch b/patches/server/0102-Flying-squids-Oh-my.patch index 094a94b776..a39c1d4da0 100644 --- a/patches/server/0102-Flying-squids-Oh-my.patch +++ b/patches/server/0102-Flying-squids-Oh-my.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Flying squids! Oh my! diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index ec261673ac444fd5de9c8556cde5d7887098aee0..ca2bf36120ba09ed27ad7b1064431f9feffa3420 100644 +index da00dcb474bec9ac8b8fc3ecf530fca154348059..60737807fd2861db6c4ffb215e23f724407c069a 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -38,6 +38,11 @@ public class GlowSquid extends Squid { +@@ -43,6 +43,11 @@ public class GlowSquid extends Squid { public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.glowSquidMaxHealth); } @@ -21,10 +21,10 @@ index ec261673ac444fd5de9c8556cde5d7887098aee0..ca2bf36120ba09ed27ad7b1064431f9f @Override 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 55f94d28a536f5ceda00831e1b22c8db31c07c2f..d4e1e0117ce9105452679d64779086b8408fb83c 100644 +index 45533523c5eee0431e96c01de4a64f9f0b887a2e..8381937f208a30ca492a69470cf89b1b2621657f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -82,6 +82,15 @@ public class Squid extends WaterAnimal { +@@ -87,6 +87,15 @@ public class Squid extends WaterAnimal { // Stops squids from floating just over the water return super.getAxisForFluidCheck().offsetY(level.purpurConfig.squidOffsetWaterCheck); } @@ -40,7 +40,7 @@ index 55f94d28a536f5ceda00831e1b22c8db31c07c2f..d4e1e0117ce9105452679d64779086b8 // Purpur end @Override -@@ -156,6 +165,7 @@ public class Squid extends WaterAnimal { +@@ -161,6 +170,7 @@ public class Squid extends WaterAnimal { } if (this.isInWaterOrBubble()) { @@ -48,7 +48,7 @@ index 55f94d28a536f5ceda00831e1b22c8db31c07c2f..d4e1e0117ce9105452679d64779086b8 if (this.tentacleMovement < 3.1415927F) { float f = this.tentacleMovement / 3.1415927F; -@@ -312,7 +322,7 @@ public class Squid extends WaterAnimal { +@@ -317,7 +327,7 @@ public class Squid extends WaterAnimal { if (i > 100) { this.squid.setMovementVector(0.0F, 0.0F, 0.0F); @@ -58,30 +58,31 @@ index 55f94d28a536f5ceda00831e1b22c8db31c07c2f..d4e1e0117ce9105452679d64779086b8 float f1 = Mth.cos(f) * 0.2F; float f2 = -0.1F + this.squid.getRandom().nextFloat() * 0.2F; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 04a9739ef2339cc0f886162401b90a0ed337e431..99f99096c773ddc14f4abe5a17ebe4c88d298c8d 100644 +index f3a4634ccd0a92dfbd2991da0695f4cfb5259d1d..8e7a6bba0da7c9d9376ed4a0510255e58a07ed64 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -811,9 +811,11 @@ public class PurpurWorldConfig { - +@@ -852,10 +852,12 @@ public class PurpurWorldConfig { public boolean glowSquidRidable = false; + public boolean glowSquidControllable = true; public double glowSquidMaxHealth = 10.0D; + public boolean glowSquidsCanFly = false; private void glowSquidSettings() { glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); + glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); } public boolean goatRidable = false; -@@ -1389,6 +1391,7 @@ public class PurpurWorldConfig { +@@ -1488,6 +1490,7 @@ public class PurpurWorldConfig { public double squidMaxHealth = 10.0D; public boolean squidImmuneToEAR = true; public double squidOffsetWaterCheck = 0.0D; + public boolean squidsCanFly = false; private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); - if (PurpurConfig.version < 10) { -@@ -1399,6 +1402,7 @@ public class PurpurWorldConfig { + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -1499,6 +1502,7 @@ public class PurpurWorldConfig { squidMaxHealth = getDouble("mobs.squid.attributes.max_health", squidMaxHealth); squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); diff --git a/patches/server/0111-Make-entity-breeding-times-configurable.patch b/patches/server/0111-Make-entity-breeding-times-configurable.patch index a76b8c3e3f..71478b8bd0 100644 --- a/patches/server/0111-Make-entity-breeding-times-configurable.patch +++ b/patches/server/0111-Make-entity-breeding-times-configurable.patch @@ -47,10 +47,10 @@ index b26d5482d89e28897bcc9dc8a15042a557727037..400db4ff64701e229ec208666a7acb1b other.resetLove(); world.addFreshEntityWithPassengers(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason 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 64ad501a6bce58f06b38ea2d758664c19b4d7996..b7d6d88aa9f60090b88ac35084b9810b6fef0cfa 100644 +index 4fc7c9c2fd2b9c083bd08fb4da9355279a94d287..a7dce3d3a0266bacd1883bfe8b47af79defcd95b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -215,6 +215,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -220,6 +220,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.beeMaxHealth); } @@ -63,10 +63,10 @@ index 64ad501a6bce58f06b38ea2d758664c19b4d7996..b7d6d88aa9f60090b88ac35084b9810b @Override 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 da496f1c3728cbe8aa009d2533f166cb6736d1b9..e9a165b7bb66dd4ae1c1befc67c671f45ec8271b 100644 +index 3a8130f7bbf67a0426c8a2f4785c9865dc0159ce..dadea789949e65c79260f32de7d6e42ee679555e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -145,6 +145,11 @@ public class Cat extends TamableAnimal { +@@ -150,6 +150,11 @@ public class Cat extends TamableAnimal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.catMaxHealth); } @@ -79,10 +79,10 @@ index da496f1c3728cbe8aa009d2533f166cb6736d1b9..e9a165b7bb66dd4ae1c1befc67c671f4 public ResourceLocation getResourceLocation() { diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index ca584a5a801d0909f4bdbaa8a635608ee49d096e..0b1ba6f25d13296fbcd6a2aee3b7ab5edbf4b22a 100644 +index 826ffd0bec67d1239edeaddc64e2805ac884311c..1c05400d8638ca14060de1ce26f7cb151487f818 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -70,6 +70,11 @@ public class Chicken extends Animal { +@@ -75,6 +75,11 @@ public class Chicken extends Animal { this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(2.0D); } } @@ -95,10 +95,10 @@ index ca584a5a801d0909f4bdbaa8a635608ee49d096e..0b1ba6f25d13296fbcd6a2aee3b7ab5e @Override 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 0db4dd5423508acb5214ed3205bb5632cd337e05..2c838d71105d2b88934efd154c7ec69a7ba47681 100644 +index 732c560383da3b8a270139758f29734d73b775be..b063a74327e51b3cd27427426b92ef687c59c94b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -57,6 +57,11 @@ public class Cow extends Animal { +@@ -62,6 +62,11 @@ public class Cow extends Animal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); } @@ -111,10 +111,10 @@ index 0db4dd5423508acb5214ed3205bb5632cd337e05..2c838d71105d2b88934efd154c7ec69a @Override 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 a2e56aadf75918d3b2c30b54ec53ba4dc332a004..f7f5a75f29a5092a7d8ee689cd3679d8eaac7c7d 100644 +index 12e2e84e6d4d4975ee2240e6255eb5cc2c17a733..5fdea5a1e49f457a5094568854a50c3fb1059f81 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -177,6 +177,11 @@ public class Fox extends Animal { +@@ -182,6 +182,11 @@ public class Fox extends Animal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.foxMaxHealth); } @@ -126,7 +126,7 @@ index a2e56aadf75918d3b2c30b54ec53ba4dc332a004..f7f5a75f29a5092a7d8ee689cd3679d8 // Purpur end @Override -@@ -960,8 +965,10 @@ public class Fox extends Animal { +@@ -965,8 +970,10 @@ public class Fox extends Animal { CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer2, this.animal, this.partner, entityfox); } @@ -140,10 +140,10 @@ index a2e56aadf75918d3b2c30b54ec53ba4dc332a004..f7f5a75f29a5092a7d8ee689cd3679d8 this.partner.resetLove(); worldserver.addFreshEntityWithPassengers(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index ffe2f135c6e9396ff106ca7f889ca31290c4d30d..8fb2f77571370c80dbafdf5c9a3c57c83a9fbd42 100644 +index 6784f73bf2c2dd9a71461c66199572a5af29aede..ecc5a0c2331609954411c8239392ede20649ec2f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -80,6 +80,11 @@ public class MushroomCow extends Cow implements Shearable { +@@ -85,6 +85,11 @@ public class MushroomCow extends Cow implements Shearable { public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.mooshroomMaxHealth); } @@ -156,10 +156,10 @@ index ffe2f135c6e9396ff106ca7f889ca31290c4d30d..8fb2f77571370c80dbafdf5c9a3c57c8 @Override 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 ccb18fea0e03d08405b0fff5e9df5025f02cebf7..4bf4403cb65b8e1fee9c253c7932ad839a99c92e 100644 +index 14897eea8446a257bbcb48cbcfd1828ab9ad0bec..d07b0a4a8cf532dd8066e111fab1a64d4b9fd739 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -@@ -84,6 +84,11 @@ public class Ocelot extends Animal { +@@ -89,6 +89,11 @@ public class Ocelot extends Animal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ocelotMaxHealth); } @@ -172,10 +172,10 @@ index ccb18fea0e03d08405b0fff5e9df5025f02cebf7..4bf4403cb65b8e1fee9c253c7932ad83 public boolean isTrusting() { 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 45a92265ac626ae401342e6a21b0ba271ba5b371..615784e3b53d43e2167d91bb41c26079998d7f47 100644 +index 880093a2c547c49fe29aacef87320082dbd38168..67fa41c69756f234778127dd5a2ff159122da8d5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -132,6 +132,11 @@ public class Panda extends Animal { +@@ -137,6 +137,11 @@ public class Panda extends Animal { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pandaMaxHealth); setAttributes(); } @@ -188,10 +188,10 @@ index 45a92265ac626ae401342e6a21b0ba271ba5b371..615784e3b53d43e2167d91bb41c26079 @Override 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 1c3d1ce288d3446291fb729b0c6caeab4202fcb7..a5e6a6271b88ff16914c5d1d067552b36af0772a 100644 +index b2963b0064c6f01adc1d8a54b7c5687c79ba6a73..ac36bd31cc81b48e14f0bb4fc683726b669673be 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -186,6 +186,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -191,6 +191,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.parrotMaxHealth); } @@ -204,10 +204,10 @@ index 1c3d1ce288d3446291fb729b0c6caeab4202fcb7..a5e6a6271b88ff16914c5d1d067552b3 @Nullable diff --git a/src/main/java/net/minecraft/world/entity/animal/Pig.java b/src/main/java/net/minecraft/world/entity/animal/Pig.java -index f4ae6de32bc1d854c54da829e45ca2cd15090433..998cfee2bb20ed4536843a7bb56d9e346665f612 100644 +index 284f632fcce31f180742a131cc358288aba54807..3b4ad2199f40fbf902948545908247c805a3f1fa 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pig.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pig.java -@@ -79,6 +79,11 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { +@@ -84,6 +84,11 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pigMaxHealth); } @@ -220,10 +220,10 @@ index f4ae6de32bc1d854c54da829e45ca2cd15090433..998cfee2bb20ed4536843a7bb56d9e34 @Override 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 0b5d4416ad4dc0a90cbd1826c45c47412d2e85ed..9b3870ad371e2c7df1587479291fd821c3e9ee4a 100644 +index 1215d26bc383573e84f674c8d67768bfbe89da59..de109bea3e132e08743f0a26f18262ee9a4982bd 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -@@ -115,6 +115,11 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -120,6 +120,11 @@ public class PolarBear extends Animal implements NeutralMob { return this.isInLove() && bear.isInLove(); } } @@ -236,10 +236,10 @@ index 0b5d4416ad4dc0a90cbd1826c45c47412d2e85ed..9b3870ad371e2c7df1587479291fd821 @Override 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 c1c2909728197dcb9137fb380ed210e7ee13e5d9..dd6e51be94189679d169f55805c9252107560be2 100644 +index a34fcda0ef72689d014ca8fd0a9131a66f25fb61..48f8c2aaa27756d649a17dcbae78b1d579c3274f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -135,6 +135,11 @@ public class Rabbit extends Animal { +@@ -140,6 +140,11 @@ public class Rabbit extends Animal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.rabbitMaxHealth); } @@ -252,10 +252,10 @@ index c1c2909728197dcb9137fb380ed210e7ee13e5d9..dd6e51be94189679d169f55805c92521 // CraftBukkit start - code from constructor 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 fbab9473e4ccce29ed55ebf707a5aacd128820cb..efd416c472815cc0fea0bebc3db2588a4012036b 100644 +index 9d6765e2bd6bfdd39728bdd14cabbe4bf33d96ac..86f398fc79dcc5dd24a61483d292e228dd6ab83b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -131,6 +131,11 @@ public class Sheep extends Animal implements Shearable { +@@ -136,6 +136,11 @@ public class Sheep extends Animal implements Shearable { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.sheepMaxHealth); } @@ -268,10 +268,10 @@ index fbab9473e4ccce29ed55ebf707a5aacd128820cb..efd416c472815cc0fea0bebc3db2588a @Override 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 3d30ea6f2392e6ed2c7294a9194daee31dadc7d8..0aec4ed51072948b9257e9d4b07eed92d95d902f 100644 +index 89a95622465a203efcecaf4c46e5b5e0419f84d3..69cdf5540c654d730f4fc45e418c4c2ae532d2bc 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -101,6 +101,11 @@ public class Turtle extends Animal { +@@ -106,6 +106,11 @@ public class Turtle extends Animal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.turtleMaxHealth); } @@ -284,10 +284,10 @@ index 3d30ea6f2392e6ed2c7294a9194daee31dadc7d8..0aec4ed51072948b9257e9d4b07eed92 public void setHomePos(BlockPos pos) { 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 277637692e504cca04bfca7683c052295c2c5a86..9f23279f7e3aedb758082c672656d5e4b160c074 100644 +index 0336bc717b22a2747cb233268dc5ececab56cee2..749e007fc0a703ca9baa58490b3b7641611d2aa4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -119,6 +119,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -124,6 +124,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wolfMaxHealth); } @@ -300,10 +300,10 @@ index 277637692e504cca04bfca7683c052295c2c5a86..9f23279f7e3aedb758082c672656d5e4 @Override 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 1b66aea5871ccf83ea39d3f52f0f6da72cd785b6..1ac7aa1f49a9740b5e20a5452410a6557ce98eda 100644 +index 8dea317e201c34034d03fd755cd8d30d892e6f13..a83139c75968abe7c62d6aec7e18cd010f9d447c 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 -@@ -111,6 +111,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -116,6 +116,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.axolotlMaxHealth); } @@ -316,10 +316,10 @@ index 1b66aea5871ccf83ea39d3f52f0f6da72cd785b6..1ac7aa1f49a9740b5e20a5452410a655 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 39a7ea2854090d8505a9bc888313d84645595e23..33e7abf0b02695d191a9b827dc82f432c3381167 100644 +index 0dca918e98182faf90f09d2ecf8985796d7b2fb5..ca545e7337ff58654f136d1edd8588bf92ca4977 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -89,6 +89,11 @@ public class Goat extends Animal { +@@ -94,6 +94,11 @@ public class Goat extends Animal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.goatMaxHealth); } @@ -364,10 +364,10 @@ index 9f7203608e15fdce1bfbaf419838768763d61378..2c5cb1b759a0b6e0233345da5a968288 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 1195f307ec827c206480fed63deb3775ba3eb22b..20f778fbcd393baa769c005dfe4163bb4e92a655 100644 +index f6bd1eff78b3c879ecc439bab3b5aa7674e74044..fe6ce743b51c1ff74e8a1233cf0217c048b8577c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -127,6 +127,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -132,6 +132,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { public double generateRandomSpeed() { return generateRandomSpeed(this.level.purpurConfig.llamaMovementSpeedMin, this.level.purpurConfig.llamaMovementSpeedMax); } @@ -412,10 +412,10 @@ index 3c3be1a40f04def3f2ffb6567fa5be0581b5608d..e7910b0bbb061f524909757dab4c7e59 public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -index f651cb7a89388f23cef33d8f817cffd3c6ecea2b..a58153ad203a91c6ebb014febdaab167b8e694c4 100644 +index 89f3c480d2e8cc28bb26fcd65a5a51a652e7365a..bdb71283d402656a3da6dd699d4cd6a5c935e541 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -57,6 +57,11 @@ public class TraderLlama extends Llama { +@@ -62,6 +62,11 @@ public class TraderLlama extends Llama { public double generateRandomSpeed() { return generateRandomSpeed(this.level.purpurConfig.traderLlamaMovementSpeedMin, this.level.purpurConfig.traderLlamaMovementSpeedMax); } @@ -444,10 +444,10 @@ index 48b72eb4051d612648a1978b38299c0c37a3a289..b6d9ba8dd5694952ca2eba54726ac5e5 public static AttributeSupplier.Builder createAttributes() { 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 e65eaf393b118e38fde8f525ac9b1d6e6f98e729..74d11bf608ff26093d7995a09a463cac24304fa1 100644 +index 0ceeca25fddea15ba5860f2745dc37a29845cb3e..003eced9d2dcc9cba200a12fe43035f125df8be3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -112,6 +112,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -117,6 +117,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.striderMaxHealth); } @@ -460,10 +460,10 @@ index e65eaf393b118e38fde8f525ac9b1d6e6f98e729..74d11bf608ff26093d7995a09a463cac public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 32836a16b18f4bb168d5a3d292765be33b998280..7013ae9b2649b98471902e37747b80812e0a09e0 100644 +index fc08f6ec195abcb1950d6924905740d59689a543..35e758e7630cbba6ff80307261cf1f84b278829e 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 -@@ -82,6 +82,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -87,6 +87,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.hoglinMaxHealth); } @@ -476,30 +476,31 @@ index 32836a16b18f4bb168d5a3d292765be33b998280..7013ae9b2649b98471902e37747b8081 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30fc98b318 100644 +index 54ae2e855d2572a788d852d17a998311691687a0..662167abae0bfd964fb08741b4660ba3db068eca 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -485,9 +485,11 @@ public class PurpurWorldConfig { - +@@ -486,10 +486,12 @@ public class PurpurWorldConfig { public boolean axolotlRidable = false; + public boolean axolotlControllable = true; public double axolotlMaxHealth = 14.0D; + public int axolotlBreedingTicks = 6000; private void axolotlSettings() { axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); + axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); + axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); } public boolean batRidable = false; -@@ -517,6 +519,7 @@ public class PurpurWorldConfig { - public boolean beeRidableInWater = false; - public double beeMaxY = 256D; +@@ -522,6 +524,7 @@ public class PurpurWorldConfig { + public boolean beeControllable = true; + public double beeMaxY = 320D; public double beeMaxHealth = 10.0D; + public int beeBreedingTicks = 6000; private void beeSettings() { beeRidable = getBoolean("mobs.bee.ridable", beeRidable); beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); -@@ -527,6 +530,7 @@ public class PurpurWorldConfig { +@@ -533,6 +536,7 @@ public class PurpurWorldConfig { set("mobs.bee.attributes.max_health", oldValue); } beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); @@ -507,7 +508,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean blazeRidable = false; -@@ -551,6 +555,7 @@ public class PurpurWorldConfig { +@@ -560,6 +564,7 @@ public class PurpurWorldConfig { public int catSpawnDelay = 1200; public int catSpawnSwampHutScanRange = 16; public int catSpawnVillageScanRange = 48; @@ -515,7 +516,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -563,6 +568,7 @@ public class PurpurWorldConfig { +@@ -573,6 +578,7 @@ public class PurpurWorldConfig { 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); @@ -523,15 +524,15 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean caveSpiderRidable = false; -@@ -583,6 +589,7 @@ public class PurpurWorldConfig { - public boolean chickenRidableInWater = false; +@@ -596,6 +602,7 @@ public class PurpurWorldConfig { + public boolean chickenControllable = true; public double chickenMaxHealth = 4.0D; public boolean chickenRetaliate = false; + public int chickenBreedingTicks = 6000; private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -593,6 +600,7 @@ public class PurpurWorldConfig { +@@ -607,6 +614,7 @@ public class PurpurWorldConfig { } chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); @@ -539,15 +540,15 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean codRidable = false; -@@ -611,6 +619,7 @@ public class PurpurWorldConfig { - public boolean cowRidableInWater = false; +@@ -628,6 +636,7 @@ public class PurpurWorldConfig { + public boolean cowControllable = true; public double cowMaxHealth = 10.0D; public int cowFeedMushrooms = 0; + public int cowBreedingTicks = 6000; private void cowSettings() { cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); -@@ -621,6 +630,7 @@ public class PurpurWorldConfig { +@@ -639,6 +648,7 @@ public class PurpurWorldConfig { } cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); @@ -555,7 +556,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean creeperRidable = false; -@@ -668,6 +678,7 @@ public class PurpurWorldConfig { +@@ -690,6 +700,7 @@ public class PurpurWorldConfig { public double donkeyJumpStrengthMax = 0.5D; public double donkeyMovementSpeedMin = 0.175D; public double donkeyMovementSpeedMax = 0.175D; @@ -563,7 +564,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 private void donkeySettings() { donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { -@@ -683,6 +694,7 @@ public class PurpurWorldConfig { +@@ -705,6 +716,7 @@ public class PurpurWorldConfig { donkeyJumpStrengthMax = getDouble("mobs.donkey.attributes.jump_strength.max", donkeyJumpStrengthMax); donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); @@ -571,15 +572,15 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean drownedRidable = false; -@@ -789,6 +801,7 @@ public class PurpurWorldConfig { - public boolean foxRidableInWater = false; +@@ -824,6 +836,7 @@ public class PurpurWorldConfig { + public boolean foxControllable = true; public double foxMaxHealth = 10.0D; public boolean foxTypeChangesWithTulips = false; + public int foxBreedingTicks = 6000; private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -799,6 +812,7 @@ public class PurpurWorldConfig { +@@ -835,6 +848,7 @@ public class PurpurWorldConfig { } foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); @@ -587,28 +588,29 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean ghastRidable = false; -@@ -859,10 +873,12 @@ public class PurpurWorldConfig { - public boolean goatRidable = false; +@@ -902,11 +916,13 @@ public class PurpurWorldConfig { public boolean goatRidableInWater = false; + public boolean goatControllable = true; public double goatMaxHealth = 10.0D; + public int goatBreedingTicks = 6000; private void goatSettings() { goatRidable = getBoolean("mobs.goat.ridable", goatRidable); goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); + goatControllable = getBoolean("mobs.goat.controllable", goatControllable); goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); + goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); } public boolean guardianRidable = false; -@@ -880,6 +896,7 @@ public class PurpurWorldConfig { - public boolean hoglinRidable = false; +@@ -927,6 +943,7 @@ public class PurpurWorldConfig { public boolean hoglinRidableInWater = false; + public boolean hoglinControllable = true; public double hoglinMaxHealth = 40.0D; + public int hoglinBreedingTicks = 6000; private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -889,6 +906,7 @@ public class PurpurWorldConfig { +@@ -937,6 +954,7 @@ public class PurpurWorldConfig { set("mobs.hoglin.attributes.max_health", oldValue); } hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); @@ -616,7 +618,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean horseRidableInWater = false; -@@ -898,6 +916,7 @@ public class PurpurWorldConfig { +@@ -946,6 +964,7 @@ public class PurpurWorldConfig { public double horseJumpStrengthMax = 1.0D; public double horseMovementSpeedMin = 0.1125D; public double horseMovementSpeedMax = 0.3375D; @@ -624,7 +626,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -913,6 +932,7 @@ public class PurpurWorldConfig { +@@ -961,6 +980,7 @@ public class PurpurWorldConfig { horseJumpStrengthMax = getDouble("mobs.horse.attributes.jump_strength.max", horseJumpStrengthMax); horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); @@ -632,7 +634,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean huskRidable = false; -@@ -983,6 +1003,7 @@ public class PurpurWorldConfig { +@@ -1038,6 +1058,7 @@ public class PurpurWorldConfig { public double llamaJumpStrengthMax = 0.5D; public double llamaMovementSpeedMin = 0.175D; public double llamaMovementSpeedMax = 0.175D; @@ -640,7 +642,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -999,6 +1020,7 @@ public class PurpurWorldConfig { +@@ -1055,6 +1076,7 @@ public class PurpurWorldConfig { llamaJumpStrengthMax = getDouble("mobs.llama.attributes.jump_strength.max", llamaJumpStrengthMax); llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); @@ -648,15 +650,15 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean magmaCubeRidable = false; -@@ -1024,6 +1046,7 @@ public class PurpurWorldConfig { - public boolean mooshroomRidable = false; +@@ -1083,6 +1105,7 @@ public class PurpurWorldConfig { public boolean mooshroomRidableInWater = false; + public boolean mooshroomControllable = true; public double mooshroomMaxHealth = 10.0D; + public int mooshroomBreedingTicks = 6000; private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1033,6 +1056,7 @@ public class PurpurWorldConfig { +@@ -1093,6 +1116,7 @@ public class PurpurWorldConfig { set("mobs.mooshroom.attributes.max_health", oldValue); } mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); @@ -664,7 +666,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean muleRidableInWater = false; -@@ -1042,6 +1066,7 @@ public class PurpurWorldConfig { +@@ -1102,6 +1126,7 @@ public class PurpurWorldConfig { public double muleJumpStrengthMax = 0.5D; public double muleMovementSpeedMin = 0.175D; public double muleMovementSpeedMax = 0.175D; @@ -672,7 +674,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 private void muleSettings() { muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { -@@ -1057,11 +1082,13 @@ public class PurpurWorldConfig { +@@ -1117,12 +1142,14 @@ public class PurpurWorldConfig { muleJumpStrengthMax = getDouble("mobs.mule.attributes.jump_strength.max", muleJumpStrengthMax); muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); @@ -681,12 +683,13 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 public boolean ocelotRidable = false; public boolean ocelotRidableInWater = false; + public boolean ocelotControllable = true; public double ocelotMaxHealth = 10.0D; + public int ocelotBreedingTicks = 6000; private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -1071,11 +1098,13 @@ public class PurpurWorldConfig { +@@ -1133,12 +1160,14 @@ public class PurpurWorldConfig { set("mobs.ocelot.attributes.max_health", oldValue); } ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); @@ -695,12 +698,13 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 public boolean pandaRidable = false; public boolean pandaRidableInWater = false; + public boolean pandaControllable = true; public double pandaMaxHealth = 20.0D; + public int pandaBreedingTicks = 6000; private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -1085,6 +1114,7 @@ public class PurpurWorldConfig { +@@ -1149,6 +1178,7 @@ public class PurpurWorldConfig { set("mobs.panda.attributes.max_health", oldValue); } pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); @@ -708,15 +712,15 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean parrotRidable = false; -@@ -1175,6 +1205,7 @@ public class PurpurWorldConfig { - public boolean pigRidableInWater = false; +@@ -1244,6 +1274,7 @@ public class PurpurWorldConfig { + public boolean pigControllable = true; public double pigMaxHealth = 10.0D; public boolean pigGiveSaddleBack = false; + public int pigBreedingTicks = 6000; private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -1185,6 +1216,7 @@ public class PurpurWorldConfig { +@@ -1255,6 +1286,7 @@ public class PurpurWorldConfig { } pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); @@ -724,7 +728,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean piglinRidable = false; -@@ -1234,6 +1266,7 @@ public class PurpurWorldConfig { +@@ -1311,6 +1343,7 @@ public class PurpurWorldConfig { public double polarBearMaxHealth = 30.0D; public String polarBearBreedableItemString = ""; public Item polarBearBreedableItem = null; @@ -732,7 +736,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -1246,6 +1279,7 @@ public class PurpurWorldConfig { +@@ -1324,6 +1357,7 @@ public class PurpurWorldConfig { polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); Item item = Registry.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); if (item != Items.AIR) polarBearBreedableItem = item; @@ -740,7 +744,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean pufferfishRidable = false; -@@ -1265,6 +1299,7 @@ public class PurpurWorldConfig { +@@ -1346,6 +1380,7 @@ public class PurpurWorldConfig { public double rabbitMaxHealth = 3.0D; public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; @@ -748,7 +752,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1276,6 +1311,7 @@ public class PurpurWorldConfig { +@@ -1358,6 +1393,7 @@ public class PurpurWorldConfig { rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); @@ -756,15 +760,15 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean ravagerRidable = false; -@@ -1307,6 +1343,7 @@ public class PurpurWorldConfig { - public boolean sheepRidable = false; +@@ -1394,6 +1430,7 @@ public class PurpurWorldConfig { public boolean sheepRidableInWater = false; + public boolean sheepControllable = true; public double sheepMaxHealth = 8.0D; + public int sheepBreedingTicks = 6000; private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1316,6 +1353,7 @@ public class PurpurWorldConfig { +@@ -1404,6 +1441,7 @@ public class PurpurWorldConfig { set("mobs.sheep.attributes.max_health", oldValue); } sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); @@ -772,15 +776,15 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean shulkerRidable = false; -@@ -1474,6 +1512,7 @@ public class PurpurWorldConfig { - public boolean striderRidable = false; +@@ -1579,6 +1617,7 @@ public class PurpurWorldConfig { public boolean striderRidableInWater = false; + public boolean striderControllable = true; public double striderMaxHealth = 20.0D; + public int striderBreedingTicks = 6000; private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1483,6 +1522,7 @@ public class PurpurWorldConfig { +@@ -1589,6 +1628,7 @@ public class PurpurWorldConfig { set("mobs.strider.attributes.max_health", oldValue); } striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); @@ -788,7 +792,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean traderLlamaRidable = false; -@@ -1493,6 +1533,7 @@ public class PurpurWorldConfig { +@@ -1600,6 +1640,7 @@ public class PurpurWorldConfig { public double traderLlamaJumpStrengthMax = 0.5D; public double traderLlamaMovementSpeedMin = 0.175D; public double traderLlamaMovementSpeedMax = 0.175D; @@ -796,7 +800,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -1509,6 +1550,7 @@ public class PurpurWorldConfig { +@@ -1617,6 +1658,7 @@ public class PurpurWorldConfig { traderLlamaJumpStrengthMax = getDouble("mobs.trader_llama.attributes.jump_strength.max", traderLlamaJumpStrengthMax); traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); @@ -804,15 +808,15 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean tropicalFishRidable = false; -@@ -1526,6 +1568,7 @@ public class PurpurWorldConfig { - public boolean turtleRidable = false; +@@ -1637,6 +1679,7 @@ public class PurpurWorldConfig { public boolean turtleRidableInWater = false; + public boolean turtleControllable = true; public double turtleMaxHealth = 30.0D; + public int turtleBreedingTicks = 6000; private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -1535,6 +1578,7 @@ public class PurpurWorldConfig { +@@ -1647,6 +1690,7 @@ public class PurpurWorldConfig { set("mobs.turtle.attributes.max_health", oldValue); } turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); @@ -820,7 +824,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean vexRidable = false; -@@ -1563,6 +1607,7 @@ public class PurpurWorldConfig { +@@ -1678,6 +1722,7 @@ public class PurpurWorldConfig { public int villagerSpawnIronGolemRadius = 0; public int villagerSpawnIronGolemLimit = 0; public boolean villagerCanBreed = true; @@ -828,7 +832,7 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1579,6 +1624,7 @@ public class PurpurWorldConfig { +@@ -1695,6 +1740,7 @@ public class PurpurWorldConfig { villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius); villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); @@ -836,15 +840,15 @@ index 4a3acf6e9159ee6ef095a93c1f67c028c7ae8356..5188492e3cedd85aa891911fd30b0a30 } public boolean vindicatorRidable = false; -@@ -1670,6 +1716,7 @@ public class PurpurWorldConfig { - public boolean wolfRidable = false; +@@ -1797,6 +1843,7 @@ public class PurpurWorldConfig { public boolean wolfRidableInWater = false; + public boolean wolfControllable = true; public double wolfMaxHealth = 8.0D; + public int wolfBreedingTicks = 6000; private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -1679,6 +1726,7 @@ public class PurpurWorldConfig { +@@ -1807,6 +1854,7 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/server/0114-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch b/patches/server/0114-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch index 7423cf6bdb..107384e8ac 100644 --- a/patches/server/0114-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch +++ b/patches/server/0114-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch @@ -8,10 +8,10 @@ This should help to reduce the amount of dirt, gravel, grass, and etc. that Endermen like to randomly place all over the world. 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 37fe7d448ae40e67cc8c7c1856df3c8ac276f0be..3945038b07393cd4692b340f32a988404117fe6f 100644 +index 83341eaa1162c311d6e1649fe9b6743597077e35..6a4f1e85b2d19dee943cd63ccce05fda2a5fb1eb 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -459,7 +459,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -464,7 +464,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { @@ -21,18 +21,18 @@ index 37fe7d448ae40e67cc8c7c1856df3c8ac276f0be..3945038b07393cd4692b340f32a98840 private static class EndermanFreezeWhenLookedAt extends Goal { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1dfd19712d883935dc59123d1b2468ed42453152..b2c3bc12d5d0f4342a684bc14d5b00bcd309716d 100644 +index b087f61d16656df5050691ee194d94063e0de054..c5051a9d495853c6abe025c34f6a08f0a55b110c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -763,6 +763,7 @@ public class PurpurWorldConfig { - public boolean endermanRidableInWater = false; +@@ -792,6 +792,7 @@ public class PurpurWorldConfig { + public boolean endermanControllable = true; public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; + public boolean endermanDespawnEvenWithBlock = false; private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -773,6 +774,7 @@ public class PurpurWorldConfig { +@@ -803,6 +804,7 @@ public class PurpurWorldConfig { } endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); diff --git a/patches/server/0116-Changeable-Mob-Left-Handed-Chance.patch b/patches/server/0116-Changeable-Mob-Left-Handed-Chance.patch index 1e78e097fb..99225ee7a7 100644 --- a/patches/server/0116-Changeable-Mob-Left-Handed-Chance.patch +++ b/patches/server/0116-Changeable-Mob-Left-Handed-Chance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Changeable Mob Left Handed Chance diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 1ef0de7544f26faf69dc0395da8e09f9514a4aff..0e7fcda7cd4d9008ba3aeb15a50301b8dcb8ba24 100644 +index 83fb51ad723f06d002f31bd1caefb778f057a5ad..48fbb4344587be603e921ebf3f0f0e8b0dc44972 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1231,7 +1231,7 @@ public abstract class Mob extends LivingEntity { +@@ -1229,7 +1229,7 @@ public abstract class Mob extends LivingEntity { @Nullable public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { this.getAttribute(Attributes.FOLLOW_RANGE).addPermanentModifier(new AttributeModifier("Random spawn bonus", this.random.nextGaussian() * 0.05D, AttributeModifier.Operation.MULTIPLY_BASE)); @@ -18,7 +18,7 @@ index 1ef0de7544f26faf69dc0395da8e09f9514a4aff..0e7fcda7cd4d9008ba3aeb15a50301b8 } else { this.setLeftHanded(false); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cafa9168b688ba141b96ba0a243048b5a00841cd..2e177ec703bda4375d4c8d59b410fb1842b679d9 100644 +index 63212c3d00a4aabb9f14b50016f43aa9e1f10249..367ce7f6003be23ffe2228e26365cb894089d4b4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -150,8 +150,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0118-Snow-Golem-rate-of-fire-config.patch b/patches/server/0118-Snow-Golem-rate-of-fire-config.patch index 00141d8cbf..831c9a5dd5 100644 --- a/patches/server/0118-Snow-Golem-rate-of-fire-config.patch +++ b/patches/server/0118-Snow-Golem-rate-of-fire-config.patch @@ -10,10 +10,10 @@ If min-shoot-interval-ticks and max-shoot-interval-ticks are both set to 0, snow golems won't shoot any snowballs. 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 a9c1b07f23c604d9364ccdee9478baf137af0816..10d68856c98b705158fe90623ef2b9ad41bef2f2 100644 +index 921215712cba59273da4387b5b4b2f3f5c9da6e2..d5f4166e3148d1a15ed1f04069ac0b4f5d09ebdc 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -74,7 +74,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -79,7 +79,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -23,10 +23,10 @@ index a9c1b07f23c604d9364ccdee9478baf137af0816..10d68856c98b705158fe90623ef2b9ad this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 16b8fa1509f542c715ba18d2966b36afd0ce4b25..066f7f6d51141d60e399d18cfc00a0693c577f7d 100644 +index 2c0ac3fa1ce94c3b09dd55aa901e9e986ffb4338..50f4fe8b85a7e7fbb536f93b1c10132711aa5ded 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1466,6 +1466,10 @@ public class PurpurWorldConfig { +@@ -1563,6 +1563,10 @@ public class PurpurWorldConfig { public double snowGolemMaxHealth = 4.0D; public boolean snowGolemDropsPumpkin = true; public boolean snowGolemPutPumpkinBack = false; @@ -37,7 +37,7 @@ index 16b8fa1509f542c715ba18d2966b36afd0ce4b25..066f7f6d51141d60e399d18cfc00a069 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1478,6 +1482,10 @@ public class PurpurWorldConfig { +@@ -1576,6 +1580,10 @@ public class PurpurWorldConfig { snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); snowGolemDropsPumpkin = getBoolean("mobs.snow_golem.drop-pumpkin-when-sheared", snowGolemDropsPumpkin); snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); diff --git a/patches/server/0120-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/patches/server/0120-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch index 877017841a..6b94d63541 100644 --- a/patches/server/0120-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch +++ b/patches/server/0120-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch @@ -145,10 +145,10 @@ index b615dc2a2127f0874775d1707e96edfb4d95b987..72ae6b3282aac806ae11b87024ee940e brain.setMemory(MemoryModuleType.SECONDARY_JOB_SITE, list); } else { 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 3d755f2c6253e83d0d9fb1348f066f4f7fe1d4be..1d711f67709b8af89d4ada3191fdce716e92047c 100644 +index 14ba8dcf9392e3bfdb92663f98455cb9c0f44c10..72f067f1d88a77b9ad571bac84cecf10cc63c975 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -217,7 +217,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -222,7 +222,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler brain.addActivity(Activity.PLAY, VillagerGoalPackages.getPlayPackage(0.5F)); } else { brain.setSchedule(Schedule.VILLAGER_DEFAULT); @@ -157,7 +157,7 @@ index 3d755f2c6253e83d0d9fb1348f066f4f7fe1d4be..1d711f67709b8af89d4ada3191fdce71 } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -982,6 +982,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -987,6 +987,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public boolean hasFarmSeeds() { @@ -183,10 +183,10 @@ index 901fc6520d58a5fa5f2cf1b4fa78fec6008aa409..9050cd25663c71197c597aac0ab2e612 public static final VillagerProfession FISHERMAN = register("fisherman", PoiType.FISHERMAN, SoundEvents.VILLAGER_WORK_FISHERMAN); public static final VillagerProfession FLETCHER = register("fletcher", PoiType.FLETCHER, SoundEvents.VILLAGER_WORK_FLETCHER); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 066f7f6d51141d60e399d18cfc00a0693c577f7d..0678c7a779114dbac0036d55f179bca7de4e470a 100644 +index 50f4fe8b85a7e7fbb536f93b1c10132711aa5ded..0b7125bf5abf54b4d87de846a583ca3f20f9774f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1633,6 +1633,8 @@ public class PurpurWorldConfig { +@@ -1748,6 +1748,8 @@ public class PurpurWorldConfig { public int villagerSpawnIronGolemLimit = 0; public boolean villagerCanBreed = true; public int villagerBreedingTicks = 6000; @@ -195,7 +195,7 @@ index 066f7f6d51141d60e399d18cfc00a0693c577f7d..0678c7a779114dbac0036d55f179bca7 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1650,6 +1652,8 @@ public class PurpurWorldConfig { +@@ -1766,6 +1768,8 @@ public class PurpurWorldConfig { villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit); villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); diff --git a/patches/server/0121-Toggle-for-Zombified-Piglin-death-always-counting-as.patch b/patches/server/0121-Toggle-for-Zombified-Piglin-death-always-counting-as.patch index f32285db9d..ed6f002235 100644 --- a/patches/server/0121-Toggle-for-Zombified-Piglin-death-always-counting-as.patch +++ b/patches/server/0121-Toggle-for-Zombified-Piglin-death-always-counting-as.patch @@ -13,10 +13,10 @@ to the Piglin being angry, even though the player never hit them. This patch adds a toggle to disable this behavior. 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 76f1bbec2b8ebe037de65ee5ec718e17a6081c13..f8b742ee8e637edd8e8b05aff2fcc7a75afe959a 100644 +index e2192c45eba111a62dded3731dcdeacc6168710c..ecf0b5def569f6c37d0a27ceb51e7158e57cbe6b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -138,7 +138,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -143,7 +143,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.maybeAlertOthers(); } @@ -25,7 +25,7 @@ index 76f1bbec2b8ebe037de65ee5ec718e17a6081c13..f8b742ee8e637edd8e8b05aff2fcc7a7 this.lastHurtByPlayerTime = this.tickCount; } -@@ -193,7 +193,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -198,7 +198,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.ticksUntilNextAlert = ZombifiedPiglin.ALERT_INTERVAL.sample(this.random); } @@ -35,10 +35,10 @@ index 76f1bbec2b8ebe037de65ee5ec718e17a6081c13..f8b742ee8e637edd8e8b05aff2fcc7a7 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0678c7a779114dbac0036d55f179bca7de4e470a..f43bcc77b36bcb1af5fff7f96bceac06599b0f4e 100644 +index 0b7125bf5abf54b4d87de846a583ca3f20f9774f..ca40f12a245d57f1887adc599eef2fbf4f85c209 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1852,6 +1852,7 @@ public class PurpurWorldConfig { +@@ -1987,6 +1987,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyOnlyBaby = true; public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; @@ -46,7 +46,7 @@ index 0678c7a779114dbac0036d55f179bca7de4e470a..f43bcc77b36bcb1af5fff7f96bceac06 private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -1865,5 +1866,6 @@ public class PurpurWorldConfig { +@@ -2001,5 +2002,6 @@ public class PurpurWorldConfig { zombifiedPiglinJockeyOnlyBaby = getBoolean("mobs.zombified_piglin.jockey.only-babies", zombifiedPiglinJockeyOnlyBaby); zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); diff --git a/patches/server/0123-Configurable-chance-for-wolves-to-spawn-rabid.patch b/patches/server/0123-Configurable-chance-for-wolves-to-spawn-rabid.patch index fcfd0f6079..95e07a8d9d 100644 --- a/patches/server/0123-Configurable-chance-for-wolves-to-spawn-rabid.patch +++ b/patches/server/0123-Configurable-chance-for-wolves-to-spawn-rabid.patch @@ -7,7 +7,7 @@ Configurable chance to spawn a wolf that is rabid. Rabid wolves attack all players, mobs, and animals. 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 9f23279f7e3aedb758082c672656d5e4b160c074..38c69ddde8a54482a1de60387bace297869c47f3 100644 +index 749e007fc0a703ca9baa58490b3b7641611d2aa4..6be2d2c2b3eb33cb8657a2cdfb49c49cb83964c2 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -11,6 +11,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; @@ -93,7 +93,7 @@ index 9f23279f7e3aedb758082c672656d5e4b160c074..38c69ddde8a54482a1de60387bace297 private static final float START_HEALTH = 8.0F; private static final float TAME_HEALTH = 20.0F; private float interestedAngle; -@@ -124,6 +162,37 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -129,6 +167,37 @@ public class Wolf extends TamableAnimal implements NeutralMob { public int getPurpurBreedTime() { return this.level.purpurConfig.wolfBreedingTicks; } @@ -131,7 +131,7 @@ index 9f23279f7e3aedb758082c672656d5e4b160c074..38c69ddde8a54482a1de60387bace297 // Purpur end @Override -@@ -132,6 +201,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -137,6 +206,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { this.goalSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(3, new Wolf.WolfAvoidEntityGoal<>(this, Llama.class, 24.0F, 1.5D, 1.5D)); @@ -139,7 +139,7 @@ index 9f23279f7e3aedb758082c672656d5e4b160c074..38c69ddde8a54482a1de60387bace297 this.goalSelector.addGoal(4, new LeapAtTargetGoal(this, 0.4F)); this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0D, true)); this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F, false)); -@@ -145,7 +215,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -150,7 +220,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); this.targetSelector.addGoal(3, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); @@ -148,7 +148,7 @@ index 9f23279f7e3aedb758082c672656d5e4b160c074..38c69ddde8a54482a1de60387bace297 this.targetSelector.addGoal(6, new NonTameRandomTargetGoal<>(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)); -@@ -190,6 +260,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -195,6 +265,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); nbt.putByte("CollarColor", (byte) this.getCollarColor().getId()); @@ -156,7 +156,7 @@ index 9f23279f7e3aedb758082c672656d5e4b160c074..38c69ddde8a54482a1de60387bace297 this.addPersistentAngerSaveData(nbt); } -@@ -199,6 +270,10 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -204,6 +275,10 @@ public class Wolf extends TamableAnimal implements NeutralMob { if (nbt.contains("CollarColor", 99)) { this.setCollarColor(DyeColor.byId(nbt.getInt("CollarColor"))); } @@ -167,7 +167,7 @@ index 9f23279f7e3aedb758082c672656d5e4b160c074..38c69ddde8a54482a1de60387bace297 this.readPersistentAngerSaveData(this.level, nbt); } -@@ -243,6 +318,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -248,6 +323,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { public void tick() { super.tick(); if (this.isAlive()) { @@ -179,7 +179,7 @@ index 9f23279f7e3aedb758082c672656d5e4b160c074..38c69ddde8a54482a1de60387bace297 this.interestedAngleO = this.interestedAngle; if (this.isInterested()) { this.interestedAngle += (1.0F - this.interestedAngle) * 0.4F; -@@ -440,6 +520,20 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -445,6 +525,20 @@ public class Wolf extends TamableAnimal implements NeutralMob { return InteractionResult.SUCCESS; } @@ -222,19 +222,19 @@ index f856b42201c17f8da21251e54fcf052336916e70..ac0803d42be2f36a2f40487ee31413d0 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f43bcc77b36bcb1af5fff7f96bceac06599b0f4e..371aa602dc35eab9e09816130e5e0a24bf899a82 100644 +index ca40f12a245d57f1887adc599eef2fbf4f85c209..dd874c0576d0f5986717c28a9d267b7590ff18ff 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1745,6 +1745,8 @@ public class PurpurWorldConfig { - public boolean wolfRidable = false; +@@ -1872,6 +1872,8 @@ public class PurpurWorldConfig { public boolean wolfRidableInWater = false; + public boolean wolfControllable = true; public double wolfMaxHealth = 8.0D; + public boolean wolfMilkCuresRabies = true; + public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); -@@ -1755,6 +1757,8 @@ public class PurpurWorldConfig { +@@ -1883,6 +1885,8 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/server/0124-Configurable-default-collar-color.patch b/patches/server/0124-Configurable-default-collar-color.patch index 537efba981..cb5dd3df2c 100644 --- a/patches/server/0124-Configurable-default-collar-color.patch +++ b/patches/server/0124-Configurable-default-collar-color.patch @@ -7,10 +7,10 @@ This allows for the server to set a default collar color when a wolf or cat is t Resets to RED when the value is invalid. 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 e9a165b7bb66dd4ae1c1befc67c671f45ec8271b..7d1e22f3c6eb5462d07027b3a2890b07667ddc46 100644 +index dadea789949e65c79260f32de7d6e42ee679555e..0cddd8e8ccd7d7d5c38802116f9aaadb927224c1 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -367,6 +367,14 @@ public class Cat extends TamableAnimal { +@@ -372,6 +372,14 @@ public class Cat extends TamableAnimal { return Mth.lerp(tickDelta, this.relaxStateOneAmountO, this.relaxStateOneAmount); } @@ -26,10 +26,10 @@ index e9a165b7bb66dd4ae1c1befc67c671f45ec8271b..7d1e22f3c6eb5462d07027b3a2890b07 public Cat getBreedOffspring(ServerLevel world, AgeableMob entity) { Cat entitycat = (Cat) EntityType.CAT.create(world); 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 38c69ddde8a54482a1de60387bace297869c47f3..20e0e74d7e43f436172ca7b4cb8b613ba116f9ec 100644 +index 6be2d2c2b3eb33cb8657a2cdfb49c49cb83964c2..0ded0de33fb53d827f2cdbfa5472c3469ee5a329 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -193,6 +193,12 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -198,6 +198,12 @@ public class Wolf extends TamableAnimal implements NeutralMob { this.updatePathfinders(false); return super.finalizeSpawn(world, difficulty, type, data, nbt); } @@ -43,38 +43,38 @@ index 38c69ddde8a54482a1de60387bace297869c47f3..20e0e74d7e43f436172ca7b4cb8b613b @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 371aa602dc35eab9e09816130e5e0a24bf899a82..1bf798e4fb771cb1dfe0c001ebf618bd28d55df2 100644 +index dd874c0576d0f5986717c28a9d267b7590ff18ff..9e9d1c7be240a58d2e0c1fe6ac91c234f286c826 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -566,6 +566,7 @@ public class PurpurWorldConfig { - - public boolean catRidable = false; - public boolean catRidableInWater = false; -+ public DyeColor catDefaultCollarColor = DyeColor.RED; - public double catMaxHealth = 10.0D; - public int catSpawnDelay = 1200; +@@ -580,6 +580,7 @@ public class PurpurWorldConfig { public int catSpawnSwampHutScanRange = 16; -@@ -579,6 +580,11 @@ public class PurpurWorldConfig { - set("mobs.cat.attributes.max-health", null); - set("mobs.cat.attributes.max_health", oldValue); - } + public int catSpawnVillageScanRange = 48; + public int catBreedingTicks = 6000; ++ public DyeColor catDefaultCollarColor = DyeColor.RED; + private void catSettings() { + catRidable = getBoolean("mobs.cat.ridable", catRidable); + catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); +@@ -594,6 +595,11 @@ public class PurpurWorldConfig { + catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); + catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); + catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); + try { + catDefaultCollarColor = DyeColor.valueOf(getString("mobs.cat.default-collar-color", wolfDefaultCollarColor.name())); + } catch (IllegalArgumentException ignore) { + catDefaultCollarColor = DyeColor.RED; + } - catMaxHealth = getDouble("mobs.cat.attributes.max_health", catMaxHealth); - catSpawnDelay = getInt("mobs.cat.spawn-delay", catSpawnDelay); - catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); -@@ -1745,6 +1751,7 @@ public class PurpurWorldConfig { - public boolean wolfRidable = false; + } + + public boolean caveSpiderRidable = false; +@@ -1872,6 +1878,7 @@ public class PurpurWorldConfig { public boolean wolfRidableInWater = false; + public boolean wolfControllable = true; public double wolfMaxHealth = 8.0D; + public DyeColor wolfDefaultCollarColor = DyeColor.RED; public boolean wolfMilkCuresRabies = true; public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; -@@ -1757,6 +1764,11 @@ public class PurpurWorldConfig { +@@ -1885,6 +1892,11 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/server/0125-Phantom-flames-on-swoop.patch b/patches/server/0125-Phantom-flames-on-swoop.patch index a5bd5885bf..79812f8e3c 100644 --- a/patches/server/0125-Phantom-flames-on-swoop.patch +++ b/patches/server/0125-Phantom-flames-on-swoop.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Phantom flames on swoop diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 72a790e6aba656e8817a84d2c729ce722e9a43ef..130b7e356b5aba604eaaaac2d2898e13359fd6fc 100644 +index 20ff9c65f89635a4b91d334775b3ac380b5ccbac..c01820307fa6d476402632d44b65ada164a5aded 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -239,6 +239,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -244,6 +244,7 @@ public class Phantom extends FlyingMob implements Enemy { this.level.addParticle(ParticleTypes.MYCELIUM, this.getX() - (double) f2, this.getY() + (double) f4, this.getZ() - (double) f3, 0.0D, 0.0D, 0.0D); } @@ -17,10 +17,10 @@ index 72a790e6aba656e8817a84d2c729ce722e9a43ef..130b7e356b5aba604eaaaac2d2898e13 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1bf798e4fb771cb1dfe0c001ebf618bd28d55df2..9d879101a072c5c02ff874ad18483f810c42e353 100644 +index 9e9d1c7be240a58d2e0c1fe6ac91c234f286c826..f324176dcee9b3111cc69c66e7ba07d721c8af35 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1184,6 +1184,7 @@ public class PurpurWorldConfig { +@@ -1251,6 +1251,7 @@ public class PurpurWorldConfig { public int phantomBurnInLight = 0; public boolean phantomIgnorePlayersWithTorch = false; public boolean phantomBurnInDaylight = true; @@ -28,7 +28,7 @@ index 1bf798e4fb771cb1dfe0c001ebf618bd28d55df2..9d879101a072c5c02ff874ad18483f81 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1222,6 +1223,7 @@ public class PurpurWorldConfig { +@@ -1290,6 +1291,7 @@ public class PurpurWorldConfig { phantomBurnInLight = getInt("mobs.phantom.burn-in-light", phantomBurnInLight); phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight); phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); diff --git a/patches/server/0128-Striders-give-saddle-back.patch b/patches/server/0128-Striders-give-saddle-back.patch index dfecee5e18..19a5f1a09e 100644 --- a/patches/server/0128-Striders-give-saddle-back.patch +++ b/patches/server/0128-Striders-give-saddle-back.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Striders give saddle back 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 74d11bf608ff26093d7995a09a463cac24304fa1..5902f0883ca0ad706801dc693bb3ac79b3eae91c 100644 +index 003eced9d2dcc9cba200a12fe43035f125df8be3..cfa355d99d5f8aaefe4cf0c10805ef7b51a0224a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -451,6 +451,18 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -456,6 +456,18 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { if (!flag && this.isSaddled() && !this.isVehicle() && !player.isSecondaryUseActive()) { if (!this.level.isClientSide) { @@ -28,18 +28,18 @@ index 74d11bf608ff26093d7995a09a463cac24304fa1..5902f0883ca0ad706801dc693bb3ac79 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8adefc693683c5870abb5d0f2f63b5391d7efb6d..332025053dd547e46c9d1f59114bea989e54bb3b 100644 +index c2847155d1af14dd2b069328d671ed58363b4fdb..80485a8cb979ffc4ff698127574350ec78cc57e7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1551,6 +1551,7 @@ public class PurpurWorldConfig { - public boolean striderRidableInWater = false; +@@ -1656,6 +1656,7 @@ public class PurpurWorldConfig { + public boolean striderControllable = true; public double striderMaxHealth = 20.0D; public int striderBreedingTicks = 6000; + public boolean striderGiveSaddleBack = false; private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1561,6 +1562,7 @@ public class PurpurWorldConfig { +@@ -1667,6 +1668,7 @@ public class PurpurWorldConfig { } striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); diff --git a/patches/server/0132-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0132-Add-mobGriefing-bypass-to-everything-affected.patch index 1b6bb2ff0d..4bf8a41ad6 100644 --- a/patches/server/0132-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/patches/server/0132-Add-mobGriefing-bypass-to-everything-affected.patch @@ -18,10 +18,10 @@ index 66628b9c301da2fee3afe42ed321a2c31fc63d2b..cb825b7edfcee31ba431e5f166ec9008 BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 0e7fcda7cd4d9008ba3aeb15a50301b8dcb8ba24..fa23e24708f4d9e1f50e54cda76113a9a7695c0a 100644 +index 48fbb4344587be603e921ebf3f0f0e8b0dc44972..1060f3f27eb5cb205629e939c2a106dfa69d5626 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -666,7 +666,7 @@ public abstract class Mob extends LivingEntity { +@@ -664,7 +664,7 @@ public abstract class Mob extends LivingEntity { public void aiStep() { super.aiStep(); this.level.getProfiler().push("looting"); @@ -92,10 +92,10 @@ index 027ef44d46cb1dda19c5c239f6970c90285fb961..fd0ed33487305093bbdf6c9bf23313a5 } else if (this.nextStartTick > 0) { --this.nextStartTick; 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 f7f5a75f29a5092a7d8ee689cd3679d8eaac7c7d..d667159664c05e4e45fe3c22a52f5e228a91409a 100644 +index 5fdea5a1e49f457a5094568854a50c3fb1059f81..cd462190ba900d4cf817967e52a83b68e31722a0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -1356,7 +1356,7 @@ public class Fox extends Animal { +@@ -1361,7 +1361,7 @@ public class Fox extends Animal { } protected void onReachedTarget() { @@ -105,10 +105,10 @@ index f7f5a75f29a5092a7d8ee689cd3679d8eaac7c7d..d667159664c05e4e45fe3c22a52f5e22 if (iblockdata.is(Blocks.SWEET_BERRY_BUSH)) { 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 dd6e51be94189679d169f55805c9252107560be2..a65e2addade6b7e5ad47d0f7d25ebc1790b7329f 100644 +index 48f8c2aaa27756d649a17dcbae78b1d579c3274f..2beb1421a2dc11c35f83ccff80e8f87e7bafe54a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -611,7 +611,7 @@ public class Rabbit extends Animal { +@@ -616,7 +616,7 @@ public class Rabbit extends Animal { @Override public boolean canUse() { if (this.nextStartTick <= 0) { @@ -118,10 +118,10 @@ index dd6e51be94189679d169f55805c9252107560be2..a65e2addade6b7e5ad47d0f7d25ebc17 } 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 10d68856c98b705158fe90623ef2b9ad41bef2f2..0c22b4502be1bf886307ad9b35c49ca617c28dbb 100644 +index d5f4166e3148d1a15ed1f04069ac0b4f5d09ebdc..bf9256fb8d50259fe099d6f4a2b945bee81b0d03 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -128,7 +128,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -133,7 +133,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM this.hurt(CraftEventFactory.MELTING, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING } @@ -131,10 +131,10 @@ index 10d68856c98b705158fe90623ef2b9ad41bef2f2..0c22b4502be1bf886307ad9b35c49ca6 } diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 9d4dd8c460d1d69ab56e166e10fd7137ddc47603..f237bcff01e4102f68663bbaa1254bbd5b98ee0c 100644 +index e6772a3c4cda03824ed6a34936e1639979e73a0e..ee9cdd91a969e94b36ddb4cf06b15118d5d7204b 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -560,7 +560,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -565,7 +565,7 @@ public class EnderDragon extends Mob implements Enemy { BlockState iblockdata = this.level.getBlockState(blockposition); if (!iblockdata.isAir() && iblockdata.getMaterial() != Material.FIRE) { @@ -144,10 +144,10 @@ index 9d4dd8c460d1d69ab56e166e10fd7137ddc47603..f237bcff01e4102f68663bbaa1254bbd // flag1 = this.level.removeBlock(blockposition, false) || flag1; flag1 = true; diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 93cc8dbf2ff435777a5edc11a834ca1b190638ab..cf36bf3067f86572ffb75c2a155dbfc8e3750a12 100644 +index 5bb5390ccec6826ead2198b413254dd1bd10f4b8..99b901f1ee202213dae3ab1930342920bbfe3d7a 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -386,7 +386,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -391,7 +391,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob i = this.getInvulnerableTicks() - 1; this.bossEvent.setProgress(1.0F - (float) i / 220.0F); if (i <= 0) { @@ -156,7 +156,7 @@ index 93cc8dbf2ff435777a5edc11a834ca1b190638ab..cf36bf3067f86572ffb75c2a155dbfc8 // CraftBukkit start // this.level.explode(this, this.getX(), this.getEyeY(), this.getZ(), 7.0F, false, explosion_effect); ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false); -@@ -482,7 +482,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -487,7 +487,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob if (this.destroyBlocksTick > 0) { --this.destroyBlocksTick; @@ -166,10 +166,10 @@ index 93cc8dbf2ff435777a5edc11a834ca1b190638ab..cf36bf3067f86572ffb75c2a155dbfc8 j = Mth.floor(this.getX()); int i1 = Mth.floor(this.getZ()); 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 bb32bc0989ebbdd7522fe5f70ae3e6414f909388..8ac278f8e55ad7a090ad332db2da1e1eaef0db4d 100644 +index 956ec09ac0bc86608af1618be197e56e9055f82f..dee1c40e557c9103fd90e92ee891f266db8700c1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -344,7 +344,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -349,7 +349,7 @@ public class Creeper extends Monster implements PowerableMob { public void explodeCreeper() { if (!this.level.isClientSide) { @@ -179,10 +179,10 @@ index bb32bc0989ebbdd7522fe5f70ae3e6414f909388..8ac278f8e55ad7a090ad332db2da1e1e // CraftBukkit start 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 3945038b07393cd4692b340f32a988404117fe6f..8486b37d37fda4cc380a81edb1675e469e1a4e91 100644 +index 6a4f1e85b2d19dee943cd63ccce05fda2a5fb1eb..8f8a5db7231c1ec69ac8b94b16447321fc89618a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -507,7 +507,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -512,7 +512,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -191,7 +191,7 @@ index 3945038b07393cd4692b340f32a988404117fe6f..8486b37d37fda4cc380a81edb1675e46 } @Override -@@ -555,7 +555,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -560,7 +560,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -201,10 +201,10 @@ index 3945038b07393cd4692b340f32a988404117fe6f..8486b37d37fda4cc380a81edb1675e46 @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 eb794368625d96aef6883f2c45c6a21e06e33d0b..f0f8d81539ce6a5d0b84488b6dc15fe53e0b1083 100644 +index a22ce4c5b5a5a4b138339a645d445e5725a271e5..29efe3092338dfbd6712ddf47fc34595eb0c9552 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -317,7 +317,7 @@ public class Evoker extends SpellcasterIllager { +@@ -322,7 +322,7 @@ public class Evoker extends SpellcasterIllager { return false; } else if (Evoker.this.tickCount < this.nextAttackTickCount) { return false; @@ -214,10 +214,10 @@ index eb794368625d96aef6883f2c45c6a21e06e33d0b..f0f8d81539ce6a5d0b84488b6dc15fe5 } 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/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index b289e0fa4324f012464c655d82ccf59469ae6466..a9681016023be8586268a366914273334e3e7f9e 100644 +index 0b916be0e0ed6fcf4263759da368732f4e16542a..99125fe401c561cbd65cadf74d749392677acb24 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -185,7 +185,7 @@ public class Ravager extends Raider { +@@ -190,7 +190,7 @@ public class Ravager extends Raider { this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1D, d1, d0)); } @@ -227,10 +227,10 @@ index b289e0fa4324f012464c655d82ccf59469ae6466..a9681016023be8586268a36691427333 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(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -index cd26c22664fb23457f99fe04607146c8c6545307..5057b9b6ad2c47a11ca11b281393ccf6a6e8dd6f 100644 +index dd473dcd310e6af808bf3e90dc48bd19faf75fe1..25946b0171fd4c9bde91ecf0cb664861e71af4f8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -@@ -197,7 +197,7 @@ public class Silverfish extends Monster { +@@ -202,7 +202,7 @@ public class Silverfish extends Monster { continue; } // CraftBukkit end @@ -239,7 +239,7 @@ index cd26c22664fb23457f99fe04607146c8c6545307..5057b9b6ad2c47a11ca11b281393ccf6 world.destroyBlock(blockposition1, true, this.silverfish); } else { world.setBlock(blockposition1, ((InfestedBlock) block).hostStateByInfested(world.getBlockState(blockposition1)), 3); -@@ -235,7 +235,7 @@ public class Silverfish extends Monster { +@@ -240,7 +240,7 @@ public class Silverfish extends Monster { } else { Random random = this.mob.getRandom(); @@ -249,10 +249,10 @@ index cd26c22664fb23457f99fe04607146c8c6545307..5057b9b6ad2c47a11ca11b281393ccf6 BlockPos blockposition = (new BlockPos(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ())).relative(this.selectedDirection); BlockState iblockdata = this.mob.level.getBlockState(blockposition); 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 70be752683291c34248ba7bafa42034f22fec9a9..107afea31c75f11e82672def7300d277dec7af1d 100644 +index 76b7e5ed4e50dcbb9e8ac5a142884b764e27c8ed..7c231904032021201126243fd52dc0296f7b8f89 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 -@@ -407,7 +407,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -412,7 +412,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override public boolean wantsToPickUp(ItemStack stack) { @@ -393,7 +393,7 @@ index b942e7c85e6c8f9a7664d9e5bf93bcd79e0651f1..5b29f3fced5435e172dd69f6f4eb265e return true; // Purpur end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c10796fff4 100644 +index edd79e3e05652b7fa5bbeefb85e391db3ccd6137..0a44f20e99bc3ba2ed3e2e78e476a33b595c8bea 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -109,8 +109,11 @@ public class PurpurWorldConfig { @@ -457,7 +457,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean waterInfinite = true; -@@ -677,6 +692,7 @@ public class PurpurWorldConfig { +@@ -696,6 +711,7 @@ public class PurpurWorldConfig { public double creeperMaxHealth = 20.0D; public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; @@ -465,7 +465,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -688,6 +704,7 @@ public class PurpurWorldConfig { +@@ -708,6 +724,7 @@ public class PurpurWorldConfig { creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); @@ -473,15 +473,15 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean dolphinRidable = false; -@@ -775,6 +792,7 @@ public class PurpurWorldConfig { - public double enderDragonMaxY = 256D; +@@ -802,6 +819,7 @@ public class PurpurWorldConfig { + public double enderDragonMaxY = 320D; public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; + public boolean enderDragonBypassMobGriefing = false; private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -790,6 +808,7 @@ public class PurpurWorldConfig { +@@ -818,6 +836,7 @@ public class PurpurWorldConfig { } enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); @@ -489,7 +489,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean endermanRidable = false; -@@ -797,6 +816,7 @@ public class PurpurWorldConfig { +@@ -826,6 +845,7 @@ public class PurpurWorldConfig { public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; @@ -497,7 +497,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -808,6 +828,7 @@ public class PurpurWorldConfig { +@@ -838,6 +858,7 @@ public class PurpurWorldConfig { endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); @@ -505,15 +505,15 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean endermiteRidable = false; -@@ -827,6 +848,7 @@ public class PurpurWorldConfig { - public boolean evokerRidable = false; +@@ -860,6 +881,7 @@ public class PurpurWorldConfig { public boolean evokerRidableInWater = false; + public boolean evokerControllable = true; public double evokerMaxHealth = 24.0D; + public boolean evokerBypassMobGriefing = false; private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -836,6 +858,7 @@ public class PurpurWorldConfig { +@@ -870,6 +892,7 @@ public class PurpurWorldConfig { set("mobs.evoker.attributes.max_health", oldValue); } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); @@ -521,7 +521,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean foxRidable = false; -@@ -843,6 +866,7 @@ public class PurpurWorldConfig { +@@ -878,6 +901,7 @@ public class PurpurWorldConfig { public double foxMaxHealth = 10.0D; public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; @@ -529,7 +529,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -854,6 +878,7 @@ public class PurpurWorldConfig { +@@ -890,6 +914,7 @@ public class PurpurWorldConfig { foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); @@ -537,15 +537,15 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean ghastRidable = false; -@@ -1265,6 +1290,7 @@ public class PurpurWorldConfig { - public boolean piglinRidable = false; +@@ -1336,6 +1361,7 @@ public class PurpurWorldConfig { public boolean piglinRidableInWater = false; + public boolean piglinControllable = true; public double piglinMaxHealth = 16.0D; + public boolean piglinBypassMobGriefing = false; private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1274,6 +1300,7 @@ public class PurpurWorldConfig { +@@ -1346,6 +1372,7 @@ public class PurpurWorldConfig { set("mobs.piglin.attributes.max_health", oldValue); } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); @@ -553,15 +553,15 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean piglinBruteRidable = false; -@@ -1293,6 +1320,7 @@ public class PurpurWorldConfig { - public boolean pillagerRidable = false; +@@ -1368,6 +1395,7 @@ public class PurpurWorldConfig { public boolean pillagerRidableInWater = false; + public boolean pillagerControllable = true; public double pillagerMaxHealth = 24.0D; + public boolean pillagerBypassMobGriefing = false; private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1302,6 +1330,7 @@ public class PurpurWorldConfig { +@@ -1378,6 +1406,7 @@ public class PurpurWorldConfig { set("mobs.pillager.attributes.max_health", oldValue); } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); @@ -569,7 +569,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean polarBearRidable = false; -@@ -1343,6 +1372,7 @@ public class PurpurWorldConfig { +@@ -1424,6 +1453,7 @@ public class PurpurWorldConfig { public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; @@ -577,7 +577,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1355,11 +1385,13 @@ public class PurpurWorldConfig { +@@ -1437,12 +1467,14 @@ public class PurpurWorldConfig { 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); @@ -586,12 +586,13 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 public boolean ravagerRidable = false; public boolean ravagerRidableInWater = false; + public boolean ravagerControllable = true; public double ravagerMaxHealth = 100.0D; + public boolean ravagerBypassMobGriefing = false; private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1369,6 +1401,7 @@ public class PurpurWorldConfig { +@@ -1453,6 +1485,7 @@ public class PurpurWorldConfig { set("mobs.ravager.attributes.max_health", oldValue); } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); @@ -599,15 +600,15 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean salmonRidable = false; -@@ -1387,6 +1420,7 @@ public class PurpurWorldConfig { - public boolean sheepRidableInWater = false; +@@ -1474,6 +1507,7 @@ public class PurpurWorldConfig { + public boolean sheepControllable = true; public double sheepMaxHealth = 8.0D; public int sheepBreedingTicks = 6000; + public boolean sheepBypassMobGriefing = false; private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1397,6 +1431,7 @@ public class PurpurWorldConfig { +@@ -1485,6 +1519,7 @@ public class PurpurWorldConfig { } sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); @@ -615,15 +616,15 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean shulkerRidable = false; -@@ -1416,6 +1451,7 @@ public class PurpurWorldConfig { - public boolean silverfishRidable = false; +@@ -1507,6 +1542,7 @@ public class PurpurWorldConfig { public boolean silverfishRidableInWater = false; + public boolean silverfishControllable = true; public double silverfishMaxHealth = 8.0D; + public boolean silverfishBypassMobGriefing = false; private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -1425,6 +1461,7 @@ public class PurpurWorldConfig { +@@ -1517,6 +1553,7 @@ public class PurpurWorldConfig { set("mobs.silverfish.attributes.max_health", oldValue); } silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); @@ -631,7 +632,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean skeletonRidable = false; -@@ -1496,6 +1533,7 @@ public class PurpurWorldConfig { +@@ -1593,6 +1630,7 @@ public class PurpurWorldConfig { public int snowGolemSnowBallMax = 20; public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; @@ -639,7 +640,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1512,6 +1550,7 @@ public class PurpurWorldConfig { +@@ -1610,6 +1648,7 @@ public class PurpurWorldConfig { snowGolemSnowBallMax = getInt("mobs.snow_golem.max-shoot-interval-ticks", snowGolemSnowBallMax); snowGolemSnowBallModifier = (float) getDouble("mobs.snow_golem.snow-ball-modifier", snowGolemSnowBallModifier); snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); @@ -647,7 +648,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean squidRidable = false; -@@ -1663,6 +1702,7 @@ public class PurpurWorldConfig { +@@ -1778,6 +1817,7 @@ public class PurpurWorldConfig { public int villagerBreedingTicks = 6000; public boolean villagerClericsFarmWarts = false; public boolean villagerClericFarmersThrowWarts = true; @@ -655,7 +656,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1682,6 +1722,7 @@ public class PurpurWorldConfig { +@@ -1798,6 +1838,7 @@ public class PurpurWorldConfig { villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); villagerClericsFarmWarts = getBoolean("mobs.villager.clerics-farm-warts", villagerClericsFarmWarts); villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts); @@ -663,7 +664,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean vindicatorRidable = false; -@@ -1738,6 +1779,7 @@ public class PurpurWorldConfig { +@@ -1861,6 +1902,7 @@ public class PurpurWorldConfig { public double witherMaxHealth = 300.0D; public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; @@ -671,7 +672,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1754,6 +1796,7 @@ public class PurpurWorldConfig { +@@ -1878,6 +1920,7 @@ public class PurpurWorldConfig { witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); @@ -679,7 +680,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 } public boolean witherSkeletonRidable = false; -@@ -1818,6 +1861,7 @@ public class PurpurWorldConfig { +@@ -1949,6 +1992,7 @@ public class PurpurWorldConfig { public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; @@ -687,7 +688,7 @@ index b644eda947883d1f6d6be427d234a9e534f0061e..53ae26c6713af64b1a04d2bd0ee5c0c1 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -1832,6 +1876,7 @@ public class PurpurWorldConfig { +@@ -1964,6 +2008,7 @@ public class PurpurWorldConfig { zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); diff --git a/patches/server/0138-Toggle-for-water-sensitive-mob-damage.patch b/patches/server/0138-Toggle-for-water-sensitive-mob-damage.patch index 0fee98467b..c1a9696dc8 100644 --- a/patches/server/0138-Toggle-for-water-sensitive-mob-damage.patch +++ b/patches/server/0138-Toggle-for-water-sensitive-mob-damage.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Toggle for water sensitive mob damage diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index ca2bf36120ba09ed27ad7b1064431f9feffa3420..2feec97ffe62cfe063085e3767937e8af122ee95 100644 +index 60737807fd2861db6c4ffb215e23f724407c069a..32211dfd76c03d1eb59929b93eb69cc6adde81ac 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -43,6 +43,11 @@ public class GlowSquid extends Squid { +@@ -48,6 +48,11 @@ public class GlowSquid extends Squid { public boolean canFly() { return this.level.purpurConfig.glowSquidsCanFly; } @@ -21,10 +21,10 @@ index ca2bf36120ba09ed27ad7b1064431f9feffa3420..2feec97ffe62cfe063085e3767937e8a @Override 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 e82592e3e43f38a0f09803c7b111d73a90361f88..c1a2bfb521ba72e4d1b29aa3e0c72e0c28a652be 100644 +index 1fbe37705556e62752be4719994e1cde96f3434d..f6b289cea5962ef56e5c9daa1122989bbabde00e 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -98,6 +98,11 @@ public class Bat extends AmbientCreature { +@@ -103,6 +103,11 @@ public class Bat extends AmbientCreature { this.getAttribute(Attributes.ARMOR_TOUGHNESS).setBaseValue(this.level.purpurConfig.batArmorToughness); this.getAttribute(Attributes.ATTACK_KNOCKBACK).setBaseValue(this.level.purpurConfig.batAttackKnockback); } @@ -37,10 +37,10 @@ index e82592e3e43f38a0f09803c7b111d73a90361f88..c1a2bfb521ba72e4d1b29aa3e0c72e0c @Override 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 b7d6d88aa9f60090b88ac35084b9810b6fef0cfa..0f3848287798dcaa57a99b531202e23fe8d05744 100644 +index a7dce3d3a0266bacd1883bfe8b47af79defcd95b..0c0c900d07d2869baa5fdd669ceecf4ad3477807 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -220,6 +220,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -225,6 +225,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { public int getPurpurBreedTime() { return this.level.purpurConfig.beeBreedingTicks; } @@ -53,10 +53,10 @@ index b7d6d88aa9f60090b88ac35084b9810b6fef0cfa..0f3848287798dcaa57a99b531202e23f @Override 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 7d1e22f3c6eb5462d07027b3a2890b07667ddc46..bbada6ca16146eae026ae5ca63372970799815b8 100644 +index 0cddd8e8ccd7d7d5c38802116f9aaadb927224c1..66e054e71e0d3cd936c77b212567462e5c6268f2 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -150,6 +150,11 @@ public class Cat extends TamableAnimal { +@@ -155,6 +155,11 @@ public class Cat extends TamableAnimal { public int getPurpurBreedTime() { return this.level.purpurConfig.catBreedingTicks; } @@ -69,10 +69,10 @@ index 7d1e22f3c6eb5462d07027b3a2890b07667ddc46..bbada6ca16146eae026ae5ca63372970 public ResourceLocation getResourceLocation() { diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index 0b1ba6f25d13296fbcd6a2aee3b7ab5edbf4b22a..eb3678d3a23d1eddc09b8032564235e101d56166 100644 +index 1c05400d8638ca14060de1ce26f7cb151487f818..e00f65973622b476e27ae7de5fa8dc8c42ef4af7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -75,6 +75,11 @@ public class Chicken extends Animal { +@@ -80,6 +80,11 @@ public class Chicken extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.chickenBreedingTicks; } @@ -85,10 +85,10 @@ index 0b1ba6f25d13296fbcd6a2aee3b7ab5edbf4b22a..eb3678d3a23d1eddc09b8032564235e1 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cod.java b/src/main/java/net/minecraft/world/entity/animal/Cod.java -index f772c60ab5b4ac5468483d9765386b9b72ad8d0f..82fdce04fe3867016d1b5e24df52a550e08dfa39 100644 +index 861727f150f28a508d3b1c7067d410f0d696aa89..5b79d821e8b55c8876eadcbe811a2c0584e7e02b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cod.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cod.java -@@ -28,6 +28,11 @@ public class Cod extends AbstractSchoolingFish { +@@ -33,6 +33,11 @@ public class Cod extends AbstractSchoolingFish { public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.codMaxHealth); } @@ -101,10 +101,10 @@ index f772c60ab5b4ac5468483d9765386b9b72ad8d0f..82fdce04fe3867016d1b5e24df52a550 @Override 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 2c838d71105d2b88934efd154c7ec69a7ba47681..7042b95e92520c5e152af0fa71a553122ec814df 100644 +index b063a74327e51b3cd27427426b92ef687c59c94b..00eec3f51e62858e7b85b3340e76bf66bfd4370f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -62,6 +62,11 @@ public class Cow extends Animal { +@@ -67,6 +67,11 @@ public class Cow extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.cowBreedingTicks; } @@ -117,10 +117,10 @@ index 2c838d71105d2b88934efd154c7ec69a7ba47681..7042b95e92520c5e152af0fa71a55312 @Override 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 ea0fb3b032a86223bfdee05a56baa15abfbe5d38..49e5a753aae7d72102ee700f3d8309f2f488cc12 100644 +index 3b198ad456f666fa1819ac39bcdfc8c85a256708..2dba75b221022b1f6d0d68813c992bc796d499c5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -153,6 +153,11 @@ public class Dolphin extends WaterAnimal { +@@ -158,6 +158,11 @@ public class Dolphin extends WaterAnimal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.dolphinMaxHealth); } @@ -133,10 +133,10 @@ index ea0fb3b032a86223bfdee05a56baa15abfbe5d38..49e5a753aae7d72102ee700f3d8309f2 @Nullable 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 d667159664c05e4e45fe3c22a52f5e228a91409a..f409215a99d6d0d2eda35173d1be762b11e96441 100644 +index cd462190ba900d4cf817967e52a83b68e31722a0..8cdae4fb31b517015e6b154a68b2c37fe76fa127 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -182,6 +182,11 @@ public class Fox extends Animal { +@@ -187,6 +187,11 @@ public class Fox extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.foxBreedingTicks; } @@ -149,10 +149,10 @@ index d667159664c05e4e45fe3c22a52f5e228a91409a..f409215a99d6d0d2eda35173d1be762b @Override 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 945a07babd8860c912c8aca1555c09922d5feaf3..52cc0df083d5a4685fd00f7db0d92b277fb0c994 100644 +index 4c9ef9c044fbc427ad1ffb2b0f3b1ceda379ae00..13cdc3a97c7707c9cb41e3da6395b0022fd661aa 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -85,6 +85,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -90,6 +90,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ironGolemMaxHealth); } @@ -165,10 +165,10 @@ index 945a07babd8860c912c8aca1555c09922d5feaf3..52cc0df083d5a4685fd00f7db0d92b27 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 8fb2f77571370c80dbafdf5c9a3c57c83a9fbd42..467e5bc4e9262fc331bb88f02e3b26f9f6bec72d 100644 +index ecc5a0c2331609954411c8239392ede20649ec2f..4cfba039e940d8354a04a5ba761a5c0e10e695a3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -85,6 +85,11 @@ public class MushroomCow extends Cow implements Shearable { +@@ -90,6 +90,11 @@ public class MushroomCow extends Cow implements Shearable { public int getPurpurBreedTime() { return this.level.purpurConfig.mooshroomBreedingTicks; } @@ -181,10 +181,10 @@ index 8fb2f77571370c80dbafdf5c9a3c57c83a9fbd42..467e5bc4e9262fc331bb88f02e3b26f9 @Override 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 4bf4403cb65b8e1fee9c253c7932ad839a99c92e..97d4caad92a2b54daff12e4909bc7b041ba99094 100644 +index d07b0a4a8cf532dd8066e111fab1a64d4b9fd739..23a7b7c259f00ca44616af2e97a360a63cb55120 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -@@ -89,6 +89,11 @@ public class Ocelot extends Animal { +@@ -94,6 +94,11 @@ public class Ocelot extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.ocelotBreedingTicks; } @@ -197,10 +197,10 @@ index 4bf4403cb65b8e1fee9c253c7932ad839a99c92e..97d4caad92a2b54daff12e4909bc7b04 public boolean isTrusting() { 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 615784e3b53d43e2167d91bb41c26079998d7f47..3ac330e769689b55063c6b5e3ccc2e362f2a4c49 100644 +index 67fa41c69756f234778127dd5a2ff159122da8d5..44302e7f86c45fb10dd9770e214e66512328d821 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -137,6 +137,11 @@ public class Panda extends Animal { +@@ -142,6 +142,11 @@ public class Panda extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.pandaBreedingTicks; } @@ -213,10 +213,10 @@ index 615784e3b53d43e2167d91bb41c26079998d7f47..3ac330e769689b55063c6b5e3ccc2e36 @Override 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 a5e6a6271b88ff16914c5d1d067552b36af0772a..cb25e36052934c2442fed8e32578915aef3b8074 100644 +index ac36bd31cc81b48e14f0bb4fc683726b669673be..fcf1b1168b29622ab2b1dc87a947cb66ef8bedfc 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -191,6 +191,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -196,6 +196,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { public int getPurpurBreedTime() { return 6000; } @@ -229,10 +229,10 @@ index a5e6a6271b88ff16914c5d1d067552b36af0772a..cb25e36052934c2442fed8e32578915a @Nullable diff --git a/src/main/java/net/minecraft/world/entity/animal/Pig.java b/src/main/java/net/minecraft/world/entity/animal/Pig.java -index 998cfee2bb20ed4536843a7bb56d9e346665f612..5aa57ce71c401e47c361dc8b74ac241a1732aede 100644 +index 3b4ad2199f40fbf902948545908247c805a3f1fa..479570e9f98404ac01ef08ce81ef200340cea602 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pig.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pig.java -@@ -84,6 +84,11 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { +@@ -89,6 +89,11 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { public int getPurpurBreedTime() { return this.level.purpurConfig.pigBreedingTicks; } @@ -245,10 +245,10 @@ index 998cfee2bb20ed4536843a7bb56d9e346665f612..5aa57ce71c401e47c361dc8b74ac241a @Override 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 9b3870ad371e2c7df1587479291fd821c3e9ee4a..288de9480635f0df718596ff73e69101e164fc61 100644 +index de109bea3e132e08743f0a26f18262ee9a4982bd..753642045e2594d67887a766a8b6c477767a6edb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -@@ -120,6 +120,11 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -125,6 +125,11 @@ public class PolarBear extends Animal implements NeutralMob { public int getPurpurBreedTime() { return this.level.purpurConfig.polarBearBreedingTicks; } @@ -261,10 +261,10 @@ index 9b3870ad371e2c7df1587479291fd821c3e9ee4a..288de9480635f0df718596ff73e69101 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -index 654ad8cd11bc11432811ed7408c0ce9b473a3245..5d8a01df7b86f1a23b30ed67b27ebde7d800c08c 100644 +index e42a7552d17f883b7116a180e408880c5fdb29d0..413f2491aad79409f4ac0759f7b649f1367376a5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -@@ -60,6 +60,11 @@ public class Pufferfish extends AbstractFish { +@@ -65,6 +65,11 @@ public class Pufferfish extends AbstractFish { public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pufferfishMaxHealth); } @@ -277,10 +277,10 @@ index 654ad8cd11bc11432811ed7408c0ce9b473a3245..5d8a01df7b86f1a23b30ed67b27ebde7 @Override 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 a65e2addade6b7e5ad47d0f7d25ebc1790b7329f..59286f143f7ffcaf4da5bad4a0990cf437d53fdb 100644 +index 2beb1421a2dc11c35f83ccff80e8f87e7bafe54a..b3c258b2e46433645b706b5a43012094f584abe0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -140,6 +140,11 @@ public class Rabbit extends Animal { +@@ -145,6 +145,11 @@ public class Rabbit extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.rabbitBreedingTicks; } @@ -293,10 +293,10 @@ index a65e2addade6b7e5ad47d0f7d25ebc1790b7329f..59286f143f7ffcaf4da5bad4a0990cf4 // CraftBukkit start - code from constructor diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index e42bdde7947e532a3a5517c874411a39132bb73e..04bf6f321e39821bae2d1871c54e304c9dcaf179 100644 +index 3873fb0e2d95973397f9a23dc363f7a65a1edfe6..16171814bab7fbc0c177323cc5f8b026c8ebbcd4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -@@ -28,6 +28,11 @@ public class Salmon extends AbstractSchoolingFish { +@@ -33,6 +33,11 @@ public class Salmon extends AbstractSchoolingFish { public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.salmonMaxHealth); } @@ -309,10 +309,10 @@ index e42bdde7947e532a3a5517c874411a39132bb73e..04bf6f321e39821bae2d1871c54e304c @Override 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 efd416c472815cc0fea0bebc3db2588a4012036b..1d80303243da8a945c3866291e3a1a196245a0db 100644 +index 86f398fc79dcc5dd24a61483d292e228dd6ab83b..4fa8e4a298a98b2a41ef7572d21ed50aa06e2c7e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -136,6 +136,11 @@ public class Sheep extends Animal implements Shearable { +@@ -141,6 +141,11 @@ public class Sheep extends Animal implements Shearable { public int getPurpurBreedTime() { return this.level.purpurConfig.sheepBreedingTicks; } @@ -325,10 +325,10 @@ index efd416c472815cc0fea0bebc3db2588a4012036b..1d80303243da8a945c3866291e3a1a19 @Override 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 0c22b4502be1bf886307ad9b35c49ca617c28dbb..9581dccfd671d89d296d3b07fb45a0234d110395 100644 +index bf9256fb8d50259fe099d6f4a2b945bee81b0d03..5695cdb6a621d24a3795220a66ea94dfa1dbba52 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -111,7 +111,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -116,7 +116,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @Override public boolean isSensitiveToWater() { @@ -338,10 +338,10 @@ index 0c22b4502be1bf886307ad9b35c49ca617c28dbb..9581dccfd671d89d296d3b07fb45a023 @Override 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 d4e1e0117ce9105452679d64779086b8408fb83c..7397d04b3fabca1f6d32adc571f56d2ad8fed751 100644 +index 8381937f208a30ca492a69470cf89b1b2621657f..49c043efc3f88ea9c5339e5011de80d2d42906c5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -91,6 +91,11 @@ public class Squid extends WaterAnimal { +@@ -96,6 +96,11 @@ public class Squid extends WaterAnimal { public boolean isInWater() { return this.wasTouchingWater || canFly(); } @@ -354,10 +354,10 @@ index d4e1e0117ce9105452679d64779086b8408fb83c..7397d04b3fabca1f6d32adc571f56d2a @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index 2de2dc96b7f5960d4cef3184c14409e0868158cd..cbe50aacc9279d147d25775b3855c3a8caff2b9c 100644 +index 9979a1c75ad6d420575b80413a7b49c51c5ae5c1..5b8a6b2705c6f317e4e48e7a9183b140489c355a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -65,6 +65,11 @@ public class TropicalFish extends AbstractSchoolingFish { +@@ -70,6 +70,11 @@ public class TropicalFish extends AbstractSchoolingFish { public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.tropicalFishMaxHealth); } @@ -370,10 +370,10 @@ index 2de2dc96b7f5960d4cef3184c14409e0868158cd..cbe50aacc9279d147d25775b3855c3a8 public static String getPredefinedName(int 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 0aec4ed51072948b9257e9d4b07eed92d95d902f..29749815ef26c7e956d6e773037554893e82284d 100644 +index 69cdf5540c654d730f4fc45e418c4c2ae532d2bc..e8e317c822a73b98545f3cf6e36aa284937e8c5b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -106,6 +106,11 @@ public class Turtle extends Animal { +@@ -111,6 +111,11 @@ public class Turtle extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.turtleBreedingTicks; } @@ -386,10 +386,10 @@ index 0aec4ed51072948b9257e9d4b07eed92d95d902f..29749815ef26c7e956d6e77303755489 public void setHomePos(BlockPos pos) { 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 20e0e74d7e43f436172ca7b4cb8b613ba116f9ec..663683a50f7a1125f406b6ec8bf7a0419be5f36a 100644 +index 0ded0de33fb53d827f2cdbfa5472c3469ee5a329..8c4ef7de3dfa2888ea175342a8df308a0a1fa66d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -199,6 +199,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -204,6 +204,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { setCollarColor(level.purpurConfig.wolfDefaultCollarColor); super.tame(player); } @@ -402,10 +402,10 @@ index 20e0e74d7e43f436172ca7b4cb8b613ba116f9ec..663683a50f7a1125f406b6ec8bf7a041 @Override 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 1ac7aa1f49a9740b5e20a5452410a6557ce98eda..8e6c2aadd7f69dc6bd585242bf4e23540e75ceeb 100644 +index a83139c75968abe7c62d6aec7e18cd010f9d447c..ad5d46c85c64e03b89a7fff452fa276ad9dcd255 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 -@@ -116,6 +116,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -121,6 +121,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { public int getPurpurBreedTime() { return this.level.purpurConfig.axolotlBreedingTicks; } @@ -418,10 +418,10 @@ index 1ac7aa1f49a9740b5e20a5452410a6557ce98eda..8e6c2aadd7f69dc6bd585242bf4e2354 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 33e7abf0b02695d191a9b827dc82f432c3381167..7b5782c3a7026b24aea2bc8be5d23b5d16b86fd4 100644 +index ca545e7337ff58654f136d1edd8588bf92ca4977..dbfb6aa819d7bb86c60268daf9cf0b5a5200c5b1 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -94,6 +94,11 @@ public class Goat extends Animal { +@@ -99,6 +99,11 @@ public class Goat extends Animal { public int getPurpurBreedTime() { return this.level.purpurConfig.goatBreedingTicks; } @@ -466,10 +466,10 @@ index 2c5cb1b759a0b6e0233345da5a968288ec338837..16755249c4700fa59f704b7c88e3490d @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 20f778fbcd393baa769c005dfe4163bb4e92a655..fde47de12ffa43bff9cfd1500a35e49325223291 100644 +index fe6ce743b51c1ff74e8a1233cf0217c048b8577c..a5463330e6b20dcbf8a82bfb0821412f7c409b1d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -132,6 +132,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -137,6 +137,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { public int getPurpurBreedTime() { return this.level.purpurConfig.llamaBreedingTicks; } @@ -514,10 +514,10 @@ index e7910b0bbb061f524909757dab4c7e59c0dc40c9..5683136ec1ebf6671092a635f026decf public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -index a58153ad203a91c6ebb014febdaab167b8e694c4..201944f01609ad4e386504cab4b36bd57d298aac 100644 +index bdb71283d402656a3da6dd699d4cd6a5c935e541..b3d9ab9c40fff58cdcb64e1499ee70d5442d121d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -62,6 +62,11 @@ public class TraderLlama extends Llama { +@@ -67,6 +67,11 @@ public class TraderLlama extends Llama { public int getPurpurBreedTime() { return this.level.purpurConfig.traderLlamaBreedingTicks; } @@ -546,10 +546,10 @@ index b6d9ba8dd5694952ca2eba54726ac5e587175250..88da7a365c28e2d097d0a7bff30ea1ac public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index f237bcff01e4102f68663bbaa1254bbd5b98ee0c..618b8fe6fcf71c58c297b7d918e6c74de6077331 100644 +index ee9cdd91a969e94b36ddb4cf06b15118d5d7204b..613a847d939349d0b5db34f058865a16d772fadc 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -159,6 +159,11 @@ public class EnderDragon extends Mob implements Enemy { +@@ -164,6 +164,11 @@ public class EnderDragon extends Mob implements Enemy { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.enderDragonMaxHealth); } @@ -562,10 +562,10 @@ index f237bcff01e4102f68663bbaa1254bbd5b98ee0c..618b8fe6fcf71c58c297b7d918e6c74d public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index cf36bf3067f86572ffb75c2a155dbfc8e3750a12..3b752f97f75c78657f37215ecd92b7460a71f090 100644 +index 99b901f1ee202213dae3ab1930342920bbfe3d7a..93a431247b28bcb8cc974f2dfafe1daba440bc48 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -218,6 +218,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -223,6 +223,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.witherMaxHealth); } @@ -578,10 +578,10 @@ index cf36bf3067f86572ffb75c2a155dbfc8e3750a12..3b752f97f75c78657f37215ecd92b746 @Override 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 0075e2dd67c58bed30bfec1707291a1d92b13537..e9d540984b9bb7fab563b81f6d28aa85c90402e9 100644 +index 1fc653194718eb4698450af5d1865a6da090c76d..8cebcc68839a510fee3ff085e9308f6d351f51e8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Blaze.java +++ b/src/main/java/net/minecraft/world/entity/monster/Blaze.java -@@ -138,7 +138,7 @@ public class Blaze extends Monster { +@@ -143,7 +143,7 @@ public class Blaze extends Monster { @Override public boolean isSensitiveToWater() { @@ -591,10 +591,10 @@ index 0075e2dd67c58bed30bfec1707291a1d92b13537..e9d540984b9bb7fab563b81f6d28aa85 @Override 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 45b53f11b52cc161775fcaa18567e4a74c5e71b8..58d11054bd62338a8b6959663420d286abcfd499 100644 +index b9ee6fdaad09c92fdeea2e5be606818278a77c21..5347ba12f2a07601c9f044081e5e6ce6472c4a2a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java +++ b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -@@ -43,6 +43,11 @@ public class CaveSpider extends Spider { +@@ -48,6 +48,11 @@ public class CaveSpider extends Spider { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.caveSpiderMaxHealth); } @@ -607,10 +607,10 @@ index 45b53f11b52cc161775fcaa18567e4a74c5e71b8..58d11054bd62338a8b6959663420d286 @Override 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 8ac278f8e55ad7a090ad332db2da1e1eaef0db4d..cf8b4f538ee2df715162adc460c6e8e58b50ba52 100644 +index dee1c40e557c9103fd90e92ee891f266db8700c1..7c683693a806142c098dd31e6bc88a0b0a33ec66 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -146,6 +146,11 @@ public class Creeper extends Monster implements PowerableMob { +@@ -151,6 +151,11 @@ public class Creeper extends Monster implements PowerableMob { } return super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityNbt); } @@ -623,10 +623,10 @@ index 8ac278f8e55ad7a090ad332db2da1e1eaef0db4d..cf8b4f538ee2df715162adc460c6e8e5 @Override 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 02c8fd96d11e3a27b5fddb27d65fddffd157fb52..4d2bb12b8168fceae71622a9f8bd5102d0024208 100644 +index d49e0f8e7842e4f5fb9f97fc8ea760910a1edd52..a2f71b1ba0df62910df528103e8695a2762fe1df 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -104,6 +104,11 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -109,6 +109,11 @@ public class Drowned extends Zombie implements RangedAttackMob { public boolean jockeyTryExistingChickens() { return level.purpurConfig.drownedJockeyTryExistingChickens; } @@ -639,10 +639,10 @@ index 02c8fd96d11e3a27b5fddb27d65fddffd157fb52..4d2bb12b8168fceae71622a9f8bd5102 @Override 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 e25374b06e3babd93cd5bbdd58ea401a92dbb001..0aa4d8e506462cfe6fb69414a30cc5eb441d7ad1 100644 +index 25fab7497a80a8fa65bd9cd9bdb0cd498f240bd1..2800594fea055d75268531d8ad3fef99721e5ca1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -@@ -45,6 +45,11 @@ public class ElderGuardian extends Guardian { +@@ -50,6 +50,11 @@ public class ElderGuardian extends Guardian { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.elderGuardianMaxHealth); } @@ -655,10 +655,10 @@ index e25374b06e3babd93cd5bbdd58ea401a92dbb001..0aa4d8e506462cfe6fb69414a30cc5eb public static AttributeSupplier.Builder createAttributes() { 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 8486b37d37fda4cc380a81edb1675e469e1a4e91..5932a5f4f641846637f0afe4c3496910bfdd5570 100644 +index 8f8a5db7231c1ec69ac8b94b16447321fc89618a..a02e04ed34de9d87066b202cf747f927b55cfb76 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -293,7 +293,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -298,7 +298,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean isSensitiveToWater() { @@ -668,10 +668,10 @@ index 8486b37d37fda4cc380a81edb1675e469e1a4e91..5932a5f4f641846637f0afe4c3496910 @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 16755569f1f2ea7cf6bfe52c279d8e192b9d0098..de422b384f5bd5ddc09229a3fc846aeb7176c07c 100644 +index 6d47413b56b9d8b195b6087e39048b6ad5ce477f..35108f25aac196b2c8ba2cf91a6744831e93a0b3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java +++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -@@ -51,6 +51,11 @@ public class Endermite extends Monster { +@@ -56,6 +56,11 @@ public class Endermite extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.endermiteMaxHealth); } @@ -684,10 +684,10 @@ index 16755569f1f2ea7cf6bfe52c279d8e192b9d0098..de422b384f5bd5ddc09229a3fc846aeb @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 f0f8d81539ce6a5d0b84488b6dc15fe53e0b1083..1f5aa1980b49b36900d515dc57696a4bc22267d0 100644 +index 29efe3092338dfbd6712ddf47fc34595eb0c9552..1cc0ea14210c35392a722b05dcf1a5c25e7b5cf0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -62,6 +62,11 @@ public class Evoker extends SpellcasterIllager { +@@ -67,6 +67,11 @@ public class Evoker extends SpellcasterIllager { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.evokerMaxHealth); } @@ -700,10 +700,10 @@ index f0f8d81539ce6a5d0b84488b6dc15fe53e0b1083..1f5aa1980b49b36900d515dc57696a4b @Override 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 bfb413af45d30d99c762f9b0c52f60c3ef000106..753227f5eb9c944e708aafb5247202aa5e4e729f 100644 +index b5b47050c192f61f14aba01671160f6d51361d10..a8a1ae1689f03d9fb78395e3786d1bd7f5fcd569 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java -@@ -76,6 +76,11 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -81,6 +81,11 @@ public class Ghast extends FlyingMob implements Enemy { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ghastMaxHealth); } @@ -716,10 +716,10 @@ index bfb413af45d30d99c762f9b0c52f60c3ef000106..753227f5eb9c944e708aafb5247202aa @Override 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 de7c2064b2c3876eebdee01908b39b1beb9701b6..c2d39a4a4d0bddc38accd31772a2fd7926b6e08c 100644 +index 0d26d2388cc1963df9bc361b31a572c12e2f8709..dd7ad09e8b154347290126fe8f7e195c1b348ec9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java -@@ -102,6 +102,11 @@ public class Giant extends Monster { +@@ -107,6 +107,11 @@ public class Giant extends Monster { // 1.0 makes bottom of feet about as high as their waist when they jump return level.purpurConfig.giantJumpHeight; } @@ -732,10 +732,10 @@ index de7c2064b2c3876eebdee01908b39b1beb9701b6..c2d39a4a4d0bddc38accd31772a2fd79 @Override 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 7747493846e7d9c5c65d5976519144a6db9bd3e0..0675c018bbf4eb0947350737b41de4e56410520e 100644 +index 07f7cddb1faac701ae05e6a29c3427e7f8557cb1..070c707132929c2a68acca44e7c7f3ae3eb1f984 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -@@ -92,6 +92,11 @@ public class Guardian extends Monster { +@@ -97,6 +97,11 @@ public class Guardian extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.guardianMaxHealth); } @@ -748,10 +748,10 @@ index 7747493846e7d9c5c65d5976519144a6db9bd3e0..0675c018bbf4eb0947350737b41de4e5 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 7bb8ef0bb2de9a0b0d5048f8a4089835c41de568..5458ac83fa555e22ca858f4f596ebb8f37926dd5 100644 +index 640c75c2cf7ec1f1bc514d29ac1f929c526e0caa..065005c13c2bff341402fc962d19148da27bc3c2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java -@@ -57,6 +57,11 @@ public class Husk extends Zombie { +@@ -62,6 +62,11 @@ public class Husk extends Zombie { public boolean jockeyTryExistingChickens() { return level.purpurConfig.huskJockeyTryExistingChickens; } @@ -764,10 +764,10 @@ index 7bb8ef0bb2de9a0b0d5048f8a4089835c41de568..5458ac83fa555e22ca858f4f596ebb8f public static boolean checkHuskSpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 4ed0fb155dfae60cee24dc0752fa525c90f2f442..322058dbb82888c70bf770bed58356dc07839188 100644 +index 171e2fef10ac75dd4585a82057edb4452a6f0d22..5b6a61fb2b44ea4dec4767958a2abe57d758646e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -76,6 +76,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -81,6 +81,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level.purpurConfig.illusionerFollowRange); this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.illusionerMaxHealth); } @@ -780,10 +780,10 @@ index 4ed0fb155dfae60cee24dc0752fa525c90f2f442..322058dbb82888c70bf770bed58356dc @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index cf69ac8710df2f01fed76389d53fb121a2319273..87a316e4ae92990800bc1b91ed44ce184b4cd933 100644 +index d4ce48a99fad5e9a26f8e057d91c712b8d8623b0..d5039d0a5e8a35cb7ce43792c909b21d1b0986f2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -@@ -62,6 +62,11 @@ public class MagmaCube extends Slime { +@@ -67,6 +67,11 @@ public class MagmaCube extends Slime { protected java.util.Map getAttackDamageCache() { return level.purpurConfig.magmaCubeAttackDamageCache; } @@ -796,10 +796,10 @@ index cf69ac8710df2f01fed76389d53fb121a2319273..87a316e4ae92990800bc1b91ed44ce18 public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 130b7e356b5aba604eaaaac2d2898e13359fd6fc..843335bcbdfef0c705dd95beeef8b4f61063f028 100644 +index c01820307fa6d476402632d44b65ada164a5aded..18b0a62a7ae7cf2413c319f402672ef2a6ee415f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -146,6 +146,11 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -151,6 +151,11 @@ public class Phantom extends FlyingMob implements Enemy { public boolean isCirclingCrystal() { return crystalPosition != null; } @@ -812,10 +812,10 @@ index 130b7e356b5aba604eaaaac2d2898e13359fd6fc..843335bcbdfef0c705dd95beeef8b4f6 @Override 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 2c7155f2b3c29ff1f777ff6b6d0b19ef922614ae..4c98060c8edcd58bcd957dee54ebba5d03b62546 100644 +index efb80248d3c7318aaf58861b21d497ce57fcecdc..37c88972668a4102701c868cc9f7b18b89f5db14 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -78,6 +78,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve +@@ -83,6 +83,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.pillagerMaxHealth); } @@ -828,10 +828,10 @@ index 2c7155f2b3c29ff1f777ff6b6d0b19ef922614ae..4c98060c8edcd58bcd957dee54ebba5d @Override 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 a9681016023be8586268a366914273334e3e7f9e..bb4b50e64908f54d84182208f5d605db20d1456d 100644 +index 99125fe401c561cbd65cadf74d749392677acb24..f8ceb90e468203d995f9f3d9d041a9a43e94fa68 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -90,6 +90,11 @@ public class Ravager extends Raider { +@@ -95,6 +95,11 @@ public class Ravager extends Raider { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.ravagerMaxHealth); } @@ -844,10 +844,10 @@ index a9681016023be8586268a366914273334e3e7f9e..bb4b50e64908f54d84182208f5d605db @Override 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 db381e7fd6f4fb8d4b30800821a8fdf9c6dba63c..0cef642b6b13347b953f59e1bca909aa7451b851 100644 +index 545ca8ada7ef9cff3619d2a556ddbd01742703f1..ae22748c9cefd000986d50e12fa9cb2a545ad63c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -107,6 +107,11 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -112,6 +112,11 @@ public class Shulker extends AbstractGolem implements Enemy { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.shulkerMaxHealth); } @@ -860,10 +860,10 @@ index db381e7fd6f4fb8d4b30800821a8fdf9c6dba63c..0cef642b6b13347b953f59e1bca909aa @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -index 5057b9b6ad2c47a11ca11b281393ccf6a6e8dd6f..2b77a73c0042a40fcc464dd878a3b9114138b3ff 100644 +index 25946b0171fd4c9bde91ecf0cb664861e71af4f8..e1407131ceab66bee552e1e2bc8f4ccef668ef62 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -@@ -56,6 +56,11 @@ public class Silverfish extends Monster { +@@ -61,6 +61,11 @@ public class Silverfish extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.silverfishMaxHealth); } @@ -876,10 +876,10 @@ index 5057b9b6ad2c47a11ca11b281393ccf6a6e8dd6f..2b77a73c0042a40fcc464dd878a3b911 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -index 9448bdd5026f35bba805dee19ceead5d76bda951..9350d4dd73db4227ab65452083d1cec73fda9501 100644 +index e239bcc4d4afe48e9fc204ad38d8bc76833994f4..8ce46cc00a01a678270e906078097aa717abdc41 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -@@ -40,6 +40,11 @@ public class Skeleton extends AbstractSkeleton { +@@ -45,6 +45,11 @@ public class Skeleton extends AbstractSkeleton { public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.skeletonMaxHealth); } @@ -892,10 +892,10 @@ index 9448bdd5026f35bba805dee19ceead5d76bda951..9350d4dd73db4227ab65452083d1cec7 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java -index 296165ff7b1ac5c6690fb3cc195a3ae3e6115611..b81cc912b036d1da491bf685139d169cd6055067 100644 +index d7779ad6b6ce502468f104e35a715bf8fc013cff..f8e39e7b4c5ab3a864a516a8937992874ff2d10a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java -@@ -132,6 +132,11 @@ public class Slime extends Mob implements Enemy { +@@ -137,6 +137,11 @@ public class Slime extends Mob implements Enemy { } return value; } @@ -908,10 +908,10 @@ index 296165ff7b1ac5c6690fb3cc195a3ae3e6115611..b81cc912b036d1da491bf685139d169c @Override 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 d095df11ffc34dd641bc2795365a4d1dda8cbc88..be6b7c91990c133f8ca1c9747f64119829888bbb 100644 +index 219aeced44c99e64267cff8df39e4f4e8aa55da7..c66e85d865d0bd1018529636f0ef41d8a5aad890 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java -@@ -66,6 +66,11 @@ public class Spider extends Monster { +@@ -71,6 +71,11 @@ public class Spider extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.spiderMaxHealth); } @@ -924,10 +924,10 @@ index d095df11ffc34dd641bc2795365a4d1dda8cbc88..be6b7c91990c133f8ca1c9747f641198 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Stray.java b/src/main/java/net/minecraft/world/entity/monster/Stray.java -index 86b1c7a1ddd33249ce3d1ff25030d4218058af2c..9c556ee62a0eb09629d80dc5fc70347696dacd66 100644 +index b54368f53d3cf87f35132f811f8a917999968c1e..4888502f99e0a9db246f9714a4d7534839bc5487 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Stray.java +++ b/src/main/java/net/minecraft/world/entity/monster/Stray.java -@@ -36,6 +36,11 @@ public class Stray extends AbstractSkeleton { +@@ -41,6 +41,11 @@ public class Stray extends AbstractSkeleton { public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.strayMaxHealth); } @@ -940,10 +940,10 @@ index 86b1c7a1ddd33249ce3d1ff25030d4218058af2c..9c556ee62a0eb09629d80dc5fc703476 public static boolean checkStraySpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 5902f0883ca0ad706801dc693bb3ac79b3eae91c..400afd587c6f9f52adf8d575d54b8dbe515b3144 100644 +index cfa355d99d5f8aaefe4cf0c10805ef7b51a0224a..ead0c2c900fbfabef478b200e954d7388860249d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -408,7 +408,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -413,7 +413,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @Override public boolean isSensitiveToWater() { @@ -953,10 +953,10 @@ index 5902f0883ca0ad706801dc693bb3ac79b3eae91c..400afd587c6f9f52adf8d575d54b8dbe @Override 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 8747ebbc637ceb1c61a38baf063a3352aa093a1f..1606f15ee56383533b3e2bfca9cf00b63c7c474a 100644 +index b223b48215adcd57ea9656194df3b5673a82586b..441357d9a74126a145293193eb02f24e26db3561 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -100,6 +100,11 @@ public class Vex extends Monster { +@@ -105,6 +105,11 @@ public class Vex extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.vexMaxHealth); } @@ -969,10 +969,10 @@ index 8747ebbc637ceb1c61a38baf063a3352aa093a1f..1606f15ee56383533b3e2bfca9cf00b6 @Override 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 9db267a9a52aa1bde4423711bd0ac6b9949de61b..9ce98a7682d648cf8ba9cb4892b67d764477fbc2 100644 +index acd4e282841708d7ef0145757899e355a6410a4a..729eb8a30b35ef5c70be30b3141b9da5c74388f6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -74,6 +74,11 @@ public class Vindicator extends AbstractIllager { +@@ -79,6 +79,11 @@ public class Vindicator extends AbstractIllager { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.vindicatorMaxHealth); } @@ -985,10 +985,10 @@ index 9db267a9a52aa1bde4423711bd0ac6b9949de61b..9ce98a7682d648cf8ba9cb4892b67d76 @Override 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 3bc25acc139b5d2b9fb20a491649ff613d5adc82..263009d0d69e26b7eab6d387c67590511c9b8ff6 100644 +index 33d6aba40c6523cb271946bac98c6e84593a2c6b..d6ad32e3622164a35bea1237ec62745588f7f031 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java -@@ -74,6 +74,11 @@ public class Witch extends Raider implements RangedAttackMob { +@@ -79,6 +79,11 @@ public class Witch extends Raider implements RangedAttackMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.witchMaxHealth); } @@ -1001,10 +1001,10 @@ index 3bc25acc139b5d2b9fb20a491649ff613d5adc82..263009d0d69e26b7eab6d387c6759051 @Override 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 5f01beb931546a8bfc714754a65c1c9dbd2ebf8b..2aa2d0cd277be59a99c3cd52f5265409913f359e 100644 +index d7d15eaaed3d184c0a4f81b09f7d2b564742ecd1..b2f1784e8a1b6afe4ba2a67f6d567869e96d4c3e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -49,6 +49,11 @@ public class WitherSkeleton extends AbstractSkeleton { +@@ -54,6 +54,11 @@ public class WitherSkeleton extends AbstractSkeleton { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.witherSkeletonMaxHealth); } @@ -1017,10 +1017,10 @@ index 5f01beb931546a8bfc714754a65c1c9dbd2ebf8b..2aa2d0cd277be59a99c3cd52f5265409 @Override 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 fe315ebb69773d243feb2fbda369fc6ff23d93c8..f96d891eeae384a210a7399a605d5d9cb0e3e591 100644 +index a91ec2e385940b12bc41d9c09819c9081edc5c44..9928af5318c1cc4676c5cf215840ce0f8baf9024 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -83,6 +83,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -88,6 +88,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.zoglinMaxHealth); } @@ -1033,10 +1033,10 @@ index fe315ebb69773d243feb2fbda369fc6ff23d93c8..f96d891eeae384a210a7399a605d5d9c @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 f2ff721fd7d1124e72f8cea4141769fb37f97b16..e4ead1ced18f16715440c8562a89d7d359add98e 100644 +index b59894aaa9553bf78b98a6fce7fb624088389011..4b288fe8923bb4beefb88e8196bfb4d5d2b10b8b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -131,6 +131,11 @@ public class Zombie extends Monster { +@@ -136,6 +136,11 @@ public class Zombie extends Monster { public boolean jockeyTryExistingChickens() { return level.purpurConfig.zombieJockeyTryExistingChickens; } @@ -1049,10 +1049,10 @@ index f2ff721fd7d1124e72f8cea4141769fb37f97b16..e4ead1ced18f16715440c8562a89d7d3 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index eb8dc173468f205c7b47915942890fe711e10650..96e5d1210e27b0bca7a354366e5c805709ae4fec 100644 +index cad1a9be238aa62b4eb0ec02d4155d15c0cc5378..92d527081abd35acc646f66a0714f2dc01706dfe 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -110,6 +110,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -115,6 +115,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { public boolean jockeyTryExistingChickens() { return level.purpurConfig.zombieVillagerJockeyTryExistingChickens; } @@ -1065,10 +1065,10 @@ index eb8dc173468f205c7b47915942890fe711e10650..96e5d1210e27b0bca7a354366e5c8057 @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 f8b742ee8e637edd8e8b05aff2fcc7a75afe959a..fd2828469badbc7936ea68c0bdd8d689c86146b6 100644 +index ecf0b5def569f6c37d0a27ceb51e7158e57cbe6b..ae53d716c25c1cf328231384595049536a50d1bd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -89,6 +89,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -94,6 +94,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { public boolean jockeyTryExistingChickens() { return level.purpurConfig.zombifiedPiglinJockeyTryExistingChickens; } @@ -1081,10 +1081,10 @@ index f8b742ee8e637edd8e8b05aff2fcc7a75afe959a..fd2828469badbc7936ea68c0bdd8d689 @Override 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 7013ae9b2649b98471902e37747b80812e0a09e0..1e2dc76ace2e283a4ba7b81e299c7506e4b684d1 100644 +index 35e758e7630cbba6ff80307261cf1f84b278829e..5ac9a41daee27b305a68a91b13a20a1a3f5264ab 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 -@@ -87,6 +87,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -92,6 +92,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { public int getPurpurBreedTime() { return this.level.purpurConfig.hoglinBreedingTicks; } @@ -1097,10 +1097,10 @@ index 7013ae9b2649b98471902e37747b80812e0a09e0..1e2dc76ace2e283a4ba7b81e299c7506 @Override 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 107afea31c75f11e82672def7300d277dec7af1d..8d85157acefb588091d96eaa0124049a7cfbe19c 100644 +index 7c231904032021201126243fd52dc0296f7b8f89..a28fad8627e5b95afe2b1ddb320e99f0b57ff158 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 -@@ -111,6 +111,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -116,6 +116,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.piglinMaxHealth); } @@ -1113,10 +1113,10 @@ index 107afea31c75f11e82672def7300d277dec7af1d..8d85157acefb588091d96eaa0124049a @Override 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 f6734f2eb44af7b2389de5079831e0e4f8a1c742..d3a298734e4434d29b66e94fc6c299d34e0ad432 100644 +index ec532ba1ccb0dbe50b91ba698a4f30d5bc89ca82..e0be095bdff6a9316812715f26772ef4e6e77495 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 -@@ -55,6 +55,11 @@ public class PiglinBrute extends AbstractPiglin { +@@ -60,6 +60,11 @@ public class PiglinBrute extends AbstractPiglin { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.piglinBruteMaxHealth); } @@ -1129,10 +1129,10 @@ index f6734f2eb44af7b2389de5079831e0e4f8a1c742..d3a298734e4434d29b66e94fc6c299d3 public static AttributeSupplier.Builder createAttributes() { 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 1d711f67709b8af89d4ada3191fdce716e92047c..56df45d9ff5d4ea608c970f26486795f9776d714 100644 +index 72f067f1d88a77b9ad571bac84cecf10cc63c975..6fe8ebc19470425dd5e44b67b0c6b369a1e21365 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -181,6 +181,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -186,6 +186,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean canBeLeashed(Player player) { return level.purpurConfig.villagerCanBeLeashed && !this.isLeashed(); } @@ -1145,10 +1145,10 @@ index 1d711f67709b8af89d4ada3191fdce716e92047c..56df45d9ff5d4ea608c970f26486795f @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index c5dbb1c8210b71f7d9d91089cb139f65605573a8..e5b78c9d6fb326771d65ea9afd9da38c204922f0 100644 +index 00a19fc46b4ffecfcfb591a17c7c3608f014d7c8..d99e97d5a7291df541a939c0f21297d8c3976138 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -87,6 +87,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -92,6 +92,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill public boolean canBeLeashed(Player player) { return level.purpurConfig.wanderingTraderCanBeLeashed && !this.isLeashed(); } @@ -1161,7 +1161,7 @@ index c5dbb1c8210b71f7d9d91089cb139f65605573a8..e5b78c9d6fb326771d65ea9afd9da38c @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942eea17c9bba 100644 +index 3fdcd6f04bd03fb65637b261e390ced9914c4bb1..75907514dde64d6eb35bd318b63decb1c11d178d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -549,6 +549,7 @@ public class PurpurWorldConfig { @@ -1170,17 +1170,17 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee + public boolean axolotlTakeDamageFromWater = false; public boolean axolotlRidable = false; + public boolean axolotlControllable = true; public double axolotlMaxHealth = 14.0D; - public int axolotlBreedingTicks = 6000; -@@ -556,6 +557,7 @@ public class PurpurWorldConfig { - axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); +@@ -558,6 +559,7 @@ public class PurpurWorldConfig { + axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); + axolotlTakeDamageFromWater = getBoolean("mobs.axolotl.takes-damage-from-water", axolotlTakeDamageFromWater); } public boolean batRidable = false; -@@ -569,6 +571,7 @@ public class PurpurWorldConfig { +@@ -572,6 +574,7 @@ public class PurpurWorldConfig { public double batArmor = 0.0D; public double batArmorToughness = 0.0D; public double batAttackKnockback = 0.0D; @@ -1188,7 +1188,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void batSettings() { batRidable = getBoolean("mobs.bat.ridable", batRidable); batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); -@@ -579,6 +582,7 @@ public class PurpurWorldConfig { +@@ -583,6 +586,7 @@ public class PurpurWorldConfig { set("mobs.bat.attributes.max_health", oldValue); } batMaxHealth = getDouble("mobs.bat.attributes.max_health", batMaxHealth); @@ -1196,15 +1196,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean beeRidable = false; -@@ -586,6 +590,7 @@ public class PurpurWorldConfig { - public double beeMaxY = 256D; +@@ -591,6 +595,7 @@ public class PurpurWorldConfig { + public double beeMaxY = 320D; public double beeMaxHealth = 10.0D; public int beeBreedingTicks = 6000; + public boolean beeTakeDamageFromWater = false; private void beeSettings() { beeRidable = getBoolean("mobs.bee.ridable", beeRidable); beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); -@@ -597,12 +602,14 @@ public class PurpurWorldConfig { +@@ -603,6 +608,7 @@ public class PurpurWorldConfig { } beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); @@ -1212,14 +1212,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean blazeRidable = false; - public boolean blazeRidableInWater = false; - public double blazeMaxY = 256D; +@@ -610,6 +616,7 @@ public class PurpurWorldConfig { + public boolean blazeControllable = true; + public double blazeMaxY = 320D; public double blazeMaxHealth = 20.0D; + public boolean blazeTakeDamageFromWater = true; private void blazeSettings() { blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); -@@ -613,6 +620,7 @@ public class PurpurWorldConfig { +@@ -621,6 +628,7 @@ public class PurpurWorldConfig { set("mobs.blaze.attributes.max_health", oldValue); } blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); @@ -1227,29 +1228,30 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean catRidable = false; -@@ -623,6 +631,7 @@ public class PurpurWorldConfig { - public int catSpawnSwampHutScanRange = 16; +@@ -632,6 +640,7 @@ public class PurpurWorldConfig { public int catSpawnVillageScanRange = 48; public int catBreedingTicks = 6000; + public DyeColor catDefaultCollarColor = DyeColor.RED; + public boolean catTakeDamageFromWater = false; private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -641,11 +650,13 @@ public class PurpurWorldConfig { - catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); - catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); - catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); +@@ -651,12 +660,14 @@ public class PurpurWorldConfig { + } catch (IllegalArgumentException ignore) { + catDefaultCollarColor = DyeColor.RED; + } + catTakeDamageFromWater = getBoolean("mobs.cat.takes-damage-from-water", catTakeDamageFromWater); } public boolean caveSpiderRidable = false; public boolean caveSpiderRidableInWater = false; + public boolean caveSpiderControllable = true; public double caveSpiderMaxHealth = 12.0D; + public boolean caveSpiderTakeDamageFromWater = false; private void caveSpiderSettings() { caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); -@@ -655,6 +666,7 @@ public class PurpurWorldConfig { +@@ -667,6 +678,7 @@ public class PurpurWorldConfig { set("mobs.cave_spider.attributes.max_health", oldValue); } caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); @@ -1257,7 +1259,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean chickenRidable = false; -@@ -662,6 +674,7 @@ public class PurpurWorldConfig { +@@ -675,6 +687,7 @@ public class PurpurWorldConfig { public double chickenMaxHealth = 4.0D; public boolean chickenRetaliate = false; public int chickenBreedingTicks = 6000; @@ -1265,7 +1267,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -673,10 +686,12 @@ public class PurpurWorldConfig { +@@ -687,11 +700,13 @@ public class PurpurWorldConfig { chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); @@ -1273,12 +1275,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean codRidable = false; + public boolean codControllable = true; public double codMaxHealth = 3.0D; + public boolean codTakeDamageFromWater = false; private void codSettings() { codRidable = getBoolean("mobs.cod.ridable", codRidable); - if (PurpurConfig.version < 10) { -@@ -685,6 +700,7 @@ public class PurpurWorldConfig { + codControllable = getBoolean("mobs.cod.controllable", codControllable); +@@ -701,6 +716,7 @@ public class PurpurWorldConfig { set("mobs.cod.attributes.max_health", oldValue); } codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); @@ -1286,7 +1289,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean cowRidable = false; -@@ -692,6 +708,7 @@ public class PurpurWorldConfig { +@@ -709,6 +725,7 @@ public class PurpurWorldConfig { public double cowMaxHealth = 10.0D; public int cowFeedMushrooms = 0; public int cowBreedingTicks = 6000; @@ -1294,7 +1297,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void cowSettings() { cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); -@@ -703,6 +720,7 @@ public class PurpurWorldConfig { +@@ -721,6 +738,7 @@ public class PurpurWorldConfig { cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); @@ -1302,7 +1305,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean creeperRidable = false; -@@ -711,6 +729,7 @@ public class PurpurWorldConfig { +@@ -730,6 +748,7 @@ public class PurpurWorldConfig { public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; public boolean creeperBypassMobGriefing = false; @@ -1310,7 +1313,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -723,6 +742,7 @@ public class PurpurWorldConfig { +@@ -743,6 +762,7 @@ public class PurpurWorldConfig { creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); @@ -1318,15 +1321,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean dolphinRidable = false; -@@ -731,6 +751,7 @@ public class PurpurWorldConfig { +@@ -752,6 +772,7 @@ public class PurpurWorldConfig { public float dolphinSpitDamage = 2.0F; public double dolphinMaxHealth = 10.0D; public boolean dolphinDisableTreasureSearching = false; + public boolean dolphinTakeDamageFromWater = false; private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); - dolphinSpitCooldown = getInt("mobs.dolphin.spit.cooldown", dolphinSpitCooldown); -@@ -743,6 +764,7 @@ public class PurpurWorldConfig { + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); +@@ -765,6 +786,7 @@ public class PurpurWorldConfig { } dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); @@ -1334,7 +1337,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean donkeyRidableInWater = false; -@@ -753,6 +775,7 @@ public class PurpurWorldConfig { +@@ -775,6 +797,7 @@ public class PurpurWorldConfig { public double donkeyMovementSpeedMin = 0.175D; public double donkeyMovementSpeedMax = 0.175D; public int donkeyBreedingTicks = 6000; @@ -1342,7 +1345,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void donkeySettings() { donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { -@@ -769,6 +792,7 @@ public class PurpurWorldConfig { +@@ -791,6 +814,7 @@ public class PurpurWorldConfig { donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); @@ -1350,7 +1353,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean drownedRidable = false; -@@ -778,6 +802,7 @@ public class PurpurWorldConfig { +@@ -801,6 +825,7 @@ public class PurpurWorldConfig { public boolean drownedJockeyOnlyBaby = true; public double drownedJockeyChance = 0.05D; public boolean drownedJockeyTryExistingChickens = true; @@ -1358,7 +1361,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -791,10 +816,12 @@ public class PurpurWorldConfig { +@@ -815,11 +840,13 @@ public class PurpurWorldConfig { drownedJockeyOnlyBaby = getBoolean("mobs.drowned.jockey.only-babies", drownedJockeyOnlyBaby); drownedJockeyChance = getDouble("mobs.drowned.jockey.chance", drownedJockeyChance); drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); @@ -1366,12 +1369,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean elderGuardianRidable = false; + public boolean elderGuardianControllable = true; public double elderGuardianMaxHealth = 80.0D; + public boolean elderGuardianTakeDamageFromWater = false; private void elderGuardianSettings() { elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); - if (PurpurConfig.version < 10) { -@@ -803,6 +830,7 @@ public class PurpurWorldConfig { + elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); +@@ -829,6 +856,7 @@ public class PurpurWorldConfig { set("mobs.elder_guardian.attributes.max_health", oldValue); } elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); @@ -1379,7 +1383,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean enderDragonRidable = false; -@@ -811,6 +839,7 @@ public class PurpurWorldConfig { +@@ -838,6 +866,7 @@ public class PurpurWorldConfig { public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; public boolean enderDragonBypassMobGriefing = false; @@ -1387,7 +1391,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -827,6 +856,7 @@ public class PurpurWorldConfig { +@@ -855,6 +884,7 @@ public class PurpurWorldConfig { enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); enderDragonBypassMobGriefing = getBoolean("mobs.ender_dragon.bypass-mob-griefing", enderDragonBypassMobGriefing); @@ -1395,7 +1399,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean endermanRidable = false; -@@ -835,6 +865,7 @@ public class PurpurWorldConfig { +@@ -864,6 +894,7 @@ public class PurpurWorldConfig { public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; @@ -1403,7 +1407,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -847,11 +878,13 @@ public class PurpurWorldConfig { +@@ -877,12 +908,14 @@ public class PurpurWorldConfig { 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); @@ -1412,12 +1416,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee public boolean endermiteRidable = false; public boolean endermiteRidableInWater = false; + public boolean endermiteControllable = true; public double endermiteMaxHealth = 8.0D; + public boolean endermiteTakeDamageFromWater = false; private void endermiteSettings() { endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); -@@ -861,12 +894,14 @@ public class PurpurWorldConfig { +@@ -893,6 +926,7 @@ public class PurpurWorldConfig { set("mobs.endermite.attributes.max_health", oldValue); } endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); @@ -1425,14 +1430,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean evokerRidable = false; - public boolean evokerRidableInWater = false; +@@ -900,6 +934,7 @@ public class PurpurWorldConfig { + public boolean evokerControllable = true; public double evokerMaxHealth = 24.0D; public boolean evokerBypassMobGriefing = false; + public boolean evokerTakeDamageFromWater = false; private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -877,6 +912,7 @@ public class PurpurWorldConfig { +@@ -911,6 +946,7 @@ public class PurpurWorldConfig { } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); @@ -1440,7 +1446,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean foxRidable = false; -@@ -885,6 +921,7 @@ public class PurpurWorldConfig { +@@ -920,6 +956,7 @@ public class PurpurWorldConfig { public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; public boolean foxBypassMobGriefing = false; @@ -1448,7 +1454,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -897,12 +934,14 @@ public class PurpurWorldConfig { +@@ -933,6 +970,7 @@ public class PurpurWorldConfig { foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); @@ -1456,14 +1462,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean ghastRidable = false; - public boolean ghastRidableInWater = false; - public double ghastMaxY = 256D; +@@ -940,6 +978,7 @@ public class PurpurWorldConfig { + public boolean ghastControllable = true; + public double ghastMaxY = 320D; public double ghastMaxHealth = 10.0D; + public boolean ghastTakeDamageFromWater = false; private void ghastSettings() { ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); -@@ -913,6 +952,7 @@ public class PurpurWorldConfig { +@@ -951,6 +990,7 @@ public class PurpurWorldConfig { set("mobs.ghast.attributes.max_health", oldValue); } ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); @@ -1471,7 +1478,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean giantRidable = false; -@@ -924,6 +964,7 @@ public class PurpurWorldConfig { +@@ -963,6 +1003,7 @@ public class PurpurWorldConfig { public float giantJumpHeight = 1.0F; public boolean giantHaveAI = false; public boolean giantHaveHostileAI = false; @@ -1479,7 +1486,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void giantSettings() { giantRidable = getBoolean("mobs.giant.ridable", giantRidable); giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); -@@ -943,30 +984,36 @@ public class PurpurWorldConfig { +@@ -983,17 +1024,20 @@ public class PurpurWorldConfig { giantJumpHeight = (float) getDouble("mobs.giant.jump-height", giantJumpHeight); giantHaveAI = getBoolean("mobs.giant.have-ai", giantHaveAI); giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); @@ -1487,36 +1494,41 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean glowSquidRidable = false; + public boolean glowSquidControllable = true; public double glowSquidMaxHealth = 10.0D; public boolean glowSquidsCanFly = false; + public boolean glowSquidTakeDamageFromWater = false; private void glowSquidSettings() { glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); + glowSquidTakeDamageFromWater = getBoolean("mobs.glow_squid.takes-damage-from-water", glowSquidTakeDamageFromWater); } public boolean goatRidable = false; - public boolean goatRidableInWater = false; +@@ -1001,17 +1045,20 @@ public class PurpurWorldConfig { + public boolean goatControllable = true; public double goatMaxHealth = 10.0D; public int goatBreedingTicks = 6000; + public boolean goatTakeDamageFromWater = false; private void goatSettings() { goatRidable = getBoolean("mobs.goat.ridable", goatRidable); goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); + goatControllable = getBoolean("mobs.goat.controllable", goatControllable); goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); + goatTakeDamageFromWater = getBoolean("mobs.goat.takes-damage-from-water", goatTakeDamageFromWater); } public boolean guardianRidable = false; + public boolean guardianControllable = true; public double guardianMaxHealth = 30.0D; + public boolean guardianTakeDamageFromWater = false; private void guardianSettings() { guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); - if (PurpurConfig.version < 10) { -@@ -975,12 +1022,14 @@ public class PurpurWorldConfig { + guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); +@@ -1021,6 +1068,7 @@ public class PurpurWorldConfig { set("mobs.guardian.attributes.max_health", oldValue); } guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); @@ -1524,14 +1536,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean hoglinRidable = false; - public boolean hoglinRidableInWater = false; +@@ -1028,6 +1076,7 @@ public class PurpurWorldConfig { + public boolean hoglinControllable = true; public double hoglinMaxHealth = 40.0D; public int hoglinBreedingTicks = 6000; + public boolean hoglinTakeDamageFromWater = false; private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -991,6 +1040,7 @@ public class PurpurWorldConfig { +@@ -1039,6 +1088,7 @@ public class PurpurWorldConfig { } hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); @@ -1539,7 +1552,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean horseRidableInWater = false; -@@ -1001,6 +1051,7 @@ public class PurpurWorldConfig { +@@ -1049,6 +1099,7 @@ public class PurpurWorldConfig { public double horseMovementSpeedMin = 0.1125D; public double horseMovementSpeedMax = 0.3375D; public int horseBreedingTicks = 6000; @@ -1547,7 +1560,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -1017,6 +1068,7 @@ public class PurpurWorldConfig { +@@ -1065,6 +1116,7 @@ public class PurpurWorldConfig { horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); @@ -1555,7 +1568,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean huskRidable = false; -@@ -1026,6 +1078,7 @@ public class PurpurWorldConfig { +@@ -1075,6 +1127,7 @@ public class PurpurWorldConfig { public boolean huskJockeyOnlyBaby = true; public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; @@ -1563,7 +1576,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1039,6 +1092,7 @@ public class PurpurWorldConfig { +@@ -1089,6 +1142,7 @@ public class PurpurWorldConfig { huskJockeyOnlyBaby = getBoolean("mobs.husk.jockey.only-babies", huskJockeyOnlyBaby); huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); @@ -1571,7 +1584,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean illusionerRidable = false; -@@ -1046,6 +1100,7 @@ public class PurpurWorldConfig { +@@ -1097,6 +1151,7 @@ public class PurpurWorldConfig { public double illusionerMovementSpeed = 0.5D; public double illusionerFollowRange = 18.0D; public double illusionerMaxHealth = 32.0D; @@ -1579,7 +1592,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void illusionerSettings() { illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); -@@ -1061,12 +1116,14 @@ public class PurpurWorldConfig { +@@ -1113,6 +1168,7 @@ public class PurpurWorldConfig { set("mobs.illusioner.attributes.max_health", oldValue); } illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); @@ -1587,14 +1600,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean ironGolemRidable = false; - public boolean ironGolemRidableInWater = false; +@@ -1120,6 +1176,7 @@ public class PurpurWorldConfig { + public boolean ironGolemControllable = true; public boolean ironGolemCanSwim = false; public double ironGolemMaxHealth = 100.0D; + public boolean ironGolemTakeDamageFromWater = false; private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); -@@ -1077,6 +1134,7 @@ public class PurpurWorldConfig { +@@ -1131,6 +1188,7 @@ public class PurpurWorldConfig { set("mobs.iron_golem.attributes.max_health", oldValue); } ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); @@ -1602,7 +1616,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean llamaRidable = false; -@@ -1088,6 +1146,7 @@ public class PurpurWorldConfig { +@@ -1143,6 +1201,7 @@ public class PurpurWorldConfig { public double llamaMovementSpeedMin = 0.175D; public double llamaMovementSpeedMax = 0.175D; public int llamaBreedingTicks = 6000; @@ -1610,7 +1624,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1105,6 +1164,7 @@ public class PurpurWorldConfig { +@@ -1161,6 +1220,7 @@ public class PurpurWorldConfig { llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); @@ -1618,7 +1632,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean magmaCubeRidable = false; -@@ -1113,6 +1173,7 @@ public class PurpurWorldConfig { +@@ -1170,6 +1230,7 @@ public class PurpurWorldConfig { public String magmaCubeAttackDamage = "size"; public Map magmaCubeMaxHealthCache = new HashMap<>(); public Map magmaCubeAttackDamageCache = new HashMap<>(); @@ -1626,7 +1640,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void magmaCubeSettings() { magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); -@@ -1125,12 +1186,14 @@ public class PurpurWorldConfig { +@@ -1183,6 +1244,7 @@ public class PurpurWorldConfig { magmaCubeAttackDamage = getString("mobs.magma_cube.attributes.attack_damage", magmaCubeAttackDamage); magmaCubeMaxHealthCache.clear(); magmaCubeAttackDamageCache.clear(); @@ -1634,14 +1648,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean mooshroomRidable = false; - public boolean mooshroomRidableInWater = false; +@@ -1190,6 +1252,7 @@ public class PurpurWorldConfig { + public boolean mooshroomControllable = true; public double mooshroomMaxHealth = 10.0D; public int mooshroomBreedingTicks = 6000; + public boolean mooshroomTakeDamageFromWater = false; private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1141,6 +1204,7 @@ public class PurpurWorldConfig { +@@ -1201,6 +1264,7 @@ public class PurpurWorldConfig { } mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); @@ -1649,7 +1664,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean muleRidableInWater = false; -@@ -1151,6 +1215,7 @@ public class PurpurWorldConfig { +@@ -1211,6 +1275,7 @@ public class PurpurWorldConfig { public double muleMovementSpeedMin = 0.175D; public double muleMovementSpeedMax = 0.175D; public int muleBreedingTicks = 6000; @@ -1657,7 +1672,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void muleSettings() { muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { -@@ -1167,12 +1232,14 @@ public class PurpurWorldConfig { +@@ -1227,6 +1292,7 @@ public class PurpurWorldConfig { muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); @@ -1665,14 +1680,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean ocelotRidable = false; - public boolean ocelotRidableInWater = false; +@@ -1234,6 +1300,7 @@ public class PurpurWorldConfig { + public boolean ocelotControllable = true; public double ocelotMaxHealth = 10.0D; public int ocelotBreedingTicks = 6000; + public boolean ocelotTakeDamageFromWater = false; private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -1183,12 +1250,14 @@ public class PurpurWorldConfig { +@@ -1245,6 +1312,7 @@ public class PurpurWorldConfig { } ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); @@ -1680,14 +1696,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean pandaRidable = false; - public boolean pandaRidableInWater = false; +@@ -1252,6 +1320,7 @@ public class PurpurWorldConfig { + public boolean pandaControllable = true; public double pandaMaxHealth = 20.0D; public int pandaBreedingTicks = 6000; + public boolean pandaTakeDamageFromWater = false; private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -1199,12 +1268,14 @@ public class PurpurWorldConfig { +@@ -1263,6 +1332,7 @@ public class PurpurWorldConfig { } pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); @@ -1695,14 +1712,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean parrotRidable = false; - public boolean parrotRidableInWater = false; - public double parrotMaxY = 256D; +@@ -1270,6 +1340,7 @@ public class PurpurWorldConfig { + public boolean parrotControllable = true; + public double parrotMaxY = 320D; public double parrotMaxHealth = 6.0D; + public boolean parrotTakeDamageFromWater = false; private void parrotSettings() { parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); -@@ -1215,6 +1286,7 @@ public class PurpurWorldConfig { +@@ -1281,6 +1352,7 @@ public class PurpurWorldConfig { set("mobs.parrot.attributes.max_health", oldValue); } parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); @@ -1710,7 +1728,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean phantomRidable = false; -@@ -1246,6 +1318,7 @@ public class PurpurWorldConfig { +@@ -1313,6 +1385,7 @@ public class PurpurWorldConfig { public boolean phantomIgnorePlayersWithTorch = false; public boolean phantomBurnInDaylight = true; public boolean phantomFlamesOnSwoop = false; @@ -1718,7 +1736,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1285,6 +1358,7 @@ public class PurpurWorldConfig { +@@ -1353,6 +1426,7 @@ public class PurpurWorldConfig { phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight); phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); @@ -1726,7 +1744,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean pigRidable = false; -@@ -1292,6 +1366,7 @@ public class PurpurWorldConfig { +@@ -1361,6 +1435,7 @@ public class PurpurWorldConfig { public double pigMaxHealth = 10.0D; public boolean pigGiveSaddleBack = false; public int pigBreedingTicks = 6000; @@ -1734,7 +1752,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -1303,12 +1378,14 @@ public class PurpurWorldConfig { +@@ -1373,6 +1448,7 @@ public class PurpurWorldConfig { pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); @@ -1742,14 +1760,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean piglinRidable = false; - public boolean piglinRidableInWater = false; +@@ -1380,6 +1456,7 @@ public class PurpurWorldConfig { + public boolean piglinControllable = true; public double piglinMaxHealth = 16.0D; public boolean piglinBypassMobGriefing = false; + public boolean piglinTakeDamageFromWater = false; private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1319,11 +1396,13 @@ public class PurpurWorldConfig { +@@ -1391,12 +1468,14 @@ public class PurpurWorldConfig { } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); @@ -1758,12 +1777,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee public boolean piglinBruteRidable = false; public boolean piglinBruteRidableInWater = false; + public boolean piglinBruteControllable = true; public double piglinBruteMaxHealth = 50.0D; + public boolean piglinBruteTakeDamageFromWater = false; private void piglinBruteSettings() { piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); -@@ -1333,12 +1412,14 @@ public class PurpurWorldConfig { +@@ -1407,6 +1486,7 @@ public class PurpurWorldConfig { set("mobs.piglin_brute.attributes.max_health", oldValue); } piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); @@ -1771,14 +1791,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean pillagerRidable = false; - public boolean pillagerRidableInWater = false; +@@ -1414,6 +1494,7 @@ public class PurpurWorldConfig { + public boolean pillagerControllable = true; public double pillagerMaxHealth = 24.0D; public boolean pillagerBypassMobGriefing = false; + public boolean pillagerTakeDamageFromWater = false; private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1349,6 +1430,7 @@ public class PurpurWorldConfig { +@@ -1425,6 +1506,7 @@ public class PurpurWorldConfig { } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); @@ -1786,7 +1807,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean polarBearRidable = false; -@@ -1357,6 +1439,7 @@ public class PurpurWorldConfig { +@@ -1434,6 +1516,7 @@ public class PurpurWorldConfig { public String polarBearBreedableItemString = ""; public Item polarBearBreedableItem = null; public int polarBearBreedingTicks = 6000; @@ -1794,7 +1815,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -1370,10 +1453,12 @@ public class PurpurWorldConfig { +@@ -1448,11 +1531,13 @@ public class PurpurWorldConfig { Item item = Registry.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); if (item != Items.AIR) polarBearBreedableItem = item; polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); @@ -1802,12 +1823,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean pufferfishRidable = false; + public boolean pufferfishControllable = true; public double pufferfishMaxHealth = 3.0D; + public boolean pufferfishTakeDamageFromWater = false; private void pufferfishSettings() { pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); - if (PurpurConfig.version < 10) { -@@ -1382,6 +1467,7 @@ public class PurpurWorldConfig { + pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); +@@ -1462,6 +1547,7 @@ public class PurpurWorldConfig { set("mobs.pufferfish.attributes.max_health", oldValue); } pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); @@ -1815,7 +1837,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean rabbitRidable = false; -@@ -1391,6 +1477,7 @@ public class PurpurWorldConfig { +@@ -1472,6 +1558,7 @@ public class PurpurWorldConfig { public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; public boolean rabbitBypassMobGriefing = false; @@ -1823,7 +1845,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1404,12 +1491,14 @@ public class PurpurWorldConfig { +@@ -1486,6 +1573,7 @@ public class PurpurWorldConfig { rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); rabbitBypassMobGriefing = getBoolean("mobs.rabbit.bypass-mob-griefing", rabbitBypassMobGriefing); @@ -1831,14 +1853,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean ravagerRidable = false; - public boolean ravagerRidableInWater = false; +@@ -1493,6 +1581,7 @@ public class PurpurWorldConfig { + public boolean ravagerControllable = true; public double ravagerMaxHealth = 100.0D; public boolean ravagerBypassMobGriefing = false; + public boolean ravagerTakeDamageFromWater = false; private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1420,10 +1509,12 @@ public class PurpurWorldConfig { +@@ -1504,11 +1593,13 @@ public class PurpurWorldConfig { } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); @@ -1846,12 +1869,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean salmonRidable = false; + public boolean salmonControllable = true; public double salmonMaxHealth = 3.0D; + public boolean salmonTakeDamageFromWater = false; private void salmonSettings() { salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); - if (PurpurConfig.version < 10) { -@@ -1432,6 +1523,7 @@ public class PurpurWorldConfig { + salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); +@@ -1518,6 +1609,7 @@ public class PurpurWorldConfig { set("mobs.salmon.attributes.max_health", oldValue); } salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); @@ -1859,7 +1883,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean sheepRidable = false; -@@ -1439,6 +1531,7 @@ public class PurpurWorldConfig { +@@ -1526,6 +1618,7 @@ public class PurpurWorldConfig { public double sheepMaxHealth = 8.0D; public int sheepBreedingTicks = 6000; public boolean sheepBypassMobGriefing = false; @@ -1867,7 +1891,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1450,11 +1543,13 @@ public class PurpurWorldConfig { +@@ -1538,12 +1631,14 @@ public class PurpurWorldConfig { sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); @@ -1876,12 +1900,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee public boolean shulkerRidable = false; public boolean shulkerRidableInWater = false; + public boolean shulkerControllable = true; public double shulkerMaxHealth = 30.0D; + public boolean shulkerTakeDamageFromWater = false; private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -1464,12 +1559,14 @@ public class PurpurWorldConfig { +@@ -1554,6 +1649,7 @@ public class PurpurWorldConfig { set("mobs.shulker.attributes.max_health", oldValue); } shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); @@ -1889,14 +1914,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean silverfishRidable = false; - public boolean silverfishRidableInWater = false; +@@ -1561,6 +1657,7 @@ public class PurpurWorldConfig { + public boolean silverfishControllable = true; public double silverfishMaxHealth = 8.0D; public boolean silverfishBypassMobGriefing = false; + public boolean silverfishTakeDamageFromWater = false; private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -1480,11 +1577,13 @@ public class PurpurWorldConfig { +@@ -1572,12 +1669,14 @@ public class PurpurWorldConfig { } silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); @@ -1905,12 +1931,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee public boolean skeletonRidable = false; public boolean skeletonRidableInWater = false; + public boolean skeletonControllable = true; public double skeletonMaxHealth = 20.0D; + public boolean skeletonTakeDamageFromWater = false; private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -1494,6 +1593,7 @@ public class PurpurWorldConfig { +@@ -1588,6 +1687,7 @@ public class PurpurWorldConfig { set("mobs.skeleton.attributes.max_health", oldValue); } skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); @@ -1918,7 +1945,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean skeletonHorseRidableInWater = true; -@@ -1504,6 +1604,7 @@ public class PurpurWorldConfig { +@@ -1598,6 +1698,7 @@ public class PurpurWorldConfig { public double skeletonHorseJumpStrengthMax = 1.0D; public double skeletonHorseMovementSpeedMin = 0.2D; public double skeletonHorseMovementSpeedMax = 0.2D; @@ -1926,7 +1953,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void skeletonHorseSettings() { skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); skeletonHorseCanSwim = getBoolean("mobs.skeleton_horse.can-swim", skeletonHorseCanSwim); -@@ -1519,6 +1620,7 @@ public class PurpurWorldConfig { +@@ -1613,6 +1714,7 @@ public class PurpurWorldConfig { skeletonHorseJumpStrengthMax = getDouble("mobs.skeleton_horse.attributes.jump_strength.max", skeletonHorseJumpStrengthMax); skeletonHorseMovementSpeedMin = getDouble("mobs.skeleton_horse.attributes.movement_speed.min", skeletonHorseMovementSpeedMin); skeletonHorseMovementSpeedMax = getDouble("mobs.skeleton_horse.attributes.movement_speed.max", skeletonHorseMovementSpeedMax); @@ -1934,7 +1961,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean slimeRidable = false; -@@ -1527,6 +1629,7 @@ public class PurpurWorldConfig { +@@ -1622,6 +1724,7 @@ public class PurpurWorldConfig { public String slimeAttackDamage = "size"; public Map slimeMaxHealthCache = new HashMap<>(); public Map slimeAttackDamageCache = new HashMap<>(); @@ -1942,7 +1969,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void slimeSettings() { slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); -@@ -1539,6 +1642,7 @@ public class PurpurWorldConfig { +@@ -1635,6 +1738,7 @@ public class PurpurWorldConfig { slimeAttackDamage = getString("mobs.slime.attributes.attack_damage", slimeAttackDamage); slimeMaxHealthCache.clear(); slimeAttackDamageCache.clear(); @@ -1950,7 +1977,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean snowGolemRidable = false; -@@ -1552,6 +1656,7 @@ public class PurpurWorldConfig { +@@ -1649,6 +1753,7 @@ public class PurpurWorldConfig { public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; public boolean snowGolemBypassMobGriefing = false; @@ -1958,7 +1985,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1569,6 +1674,7 @@ public class PurpurWorldConfig { +@@ -1667,6 +1772,7 @@ public class PurpurWorldConfig { snowGolemSnowBallModifier = (float) getDouble("mobs.snow_golem.snow-ball-modifier", snowGolemSnowBallModifier); snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); snowGolemBypassMobGriefing = getBoolean("mobs.snow_golem.bypass-mob-griefing", snowGolemBypassMobGriefing); @@ -1966,15 +1993,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean squidRidable = false; -@@ -1576,6 +1682,7 @@ public class PurpurWorldConfig { +@@ -1675,6 +1781,7 @@ public class PurpurWorldConfig { public boolean squidImmuneToEAR = true; public double squidOffsetWaterCheck = 0.0D; public boolean squidsCanFly = false; + public boolean squidTakeDamageFromWater = false; private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); - if (PurpurConfig.version < 10) { -@@ -1587,11 +1694,13 @@ public class PurpurWorldConfig { + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -1687,12 +1794,14 @@ public class PurpurWorldConfig { squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); @@ -1983,12 +2010,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee public boolean spiderRidable = false; public boolean spiderRidableInWater = false; + public boolean spiderControllable = true; public double spiderMaxHealth = 16.0D; + public boolean spiderTakeDamageFromWater = false; private void spiderSettings() { spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); -@@ -1601,11 +1710,13 @@ public class PurpurWorldConfig { +@@ -1703,12 +1812,14 @@ public class PurpurWorldConfig { set("mobs.spider.attributes.max_health", oldValue); } spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); @@ -1997,12 +2025,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee public boolean strayRidable = false; public boolean strayRidableInWater = false; + public boolean strayControllable = true; public double strayMaxHealth = 20.0D; + public boolean strayTakeDamageFromWater = false; private void straySettings() { strayRidable = getBoolean("mobs.stray.ridable", strayRidable); strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); -@@ -1615,6 +1726,7 @@ public class PurpurWorldConfig { +@@ -1719,6 +1830,7 @@ public class PurpurWorldConfig { set("mobs.stray.attributes.max_health", oldValue); } strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); @@ -2010,7 +2039,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean striderRidable = false; -@@ -1622,6 +1734,7 @@ public class PurpurWorldConfig { +@@ -1727,6 +1839,7 @@ public class PurpurWorldConfig { public double striderMaxHealth = 20.0D; public int striderBreedingTicks = 6000; public boolean striderGiveSaddleBack = false; @@ -2018,7 +2047,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1633,6 +1746,7 @@ public class PurpurWorldConfig { +@@ -1739,6 +1852,7 @@ public class PurpurWorldConfig { striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); @@ -2026,7 +2055,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean traderLlamaRidable = false; -@@ -1644,6 +1758,7 @@ public class PurpurWorldConfig { +@@ -1751,6 +1865,7 @@ public class PurpurWorldConfig { public double traderLlamaMovementSpeedMin = 0.175D; public double traderLlamaMovementSpeedMax = 0.175D; public int traderLlamaBreedingTicks = 6000; @@ -2034,7 +2063,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -1661,10 +1776,12 @@ public class PurpurWorldConfig { +@@ -1769,11 +1884,13 @@ public class PurpurWorldConfig { traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); @@ -2042,12 +2071,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean tropicalFishRidable = false; + public boolean tropicalFishControllable = true; public double tropicalFishMaxHealth = 3.0D; + public boolean tropicalFishTakeDamageFromWater = false; private void tropicalFishSettings() { tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); - if (PurpurConfig.version < 10) { -@@ -1673,12 +1790,14 @@ public class PurpurWorldConfig { + tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); +@@ -1783,6 +1900,7 @@ public class PurpurWorldConfig { set("mobs.tropical_fish.attributes.max_health", oldValue); } tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); @@ -2055,14 +2085,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean turtleRidable = false; - public boolean turtleRidableInWater = false; +@@ -1790,6 +1908,7 @@ public class PurpurWorldConfig { + public boolean turtleControllable = true; public double turtleMaxHealth = 30.0D; public int turtleBreedingTicks = 6000; + public boolean turtleTakeDamageFromWater = false; private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -1689,12 +1808,14 @@ public class PurpurWorldConfig { +@@ -1801,6 +1920,7 @@ public class PurpurWorldConfig { } turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); @@ -2070,14 +2101,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean vexRidable = false; - public boolean vexRidableInWater = false; - public double vexMaxY = 256D; +@@ -1808,6 +1928,7 @@ public class PurpurWorldConfig { + public boolean vexControllable = true; + public double vexMaxY = 320D; public double vexMaxHealth = 14.0D; + public boolean vexTakeDamageFromWater = false; private void vexSettings() { vexRidable = getBoolean("mobs.vex.ridable", vexRidable); vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); -@@ -1705,6 +1826,7 @@ public class PurpurWorldConfig { +@@ -1819,6 +1940,7 @@ public class PurpurWorldConfig { set("mobs.vex.attributes.max_health", oldValue); } vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); @@ -2085,7 +2117,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean villagerRidable = false; -@@ -1721,6 +1843,7 @@ public class PurpurWorldConfig { +@@ -1836,6 +1958,7 @@ public class PurpurWorldConfig { public boolean villagerClericsFarmWarts = false; public boolean villagerClericFarmersThrowWarts = true; public boolean villagerBypassMobGriefing = false; @@ -2093,7 +2125,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1741,12 +1864,14 @@ public class PurpurWorldConfig { +@@ -1857,6 +1980,7 @@ public class PurpurWorldConfig { villagerClericsFarmWarts = getBoolean("mobs.villager.clerics-farm-warts", villagerClericsFarmWarts); villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts); villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); @@ -2101,14 +2133,15 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean vindicatorRidable = false; - public boolean vindicatorRidableInWater = false; +@@ -1864,6 +1988,7 @@ public class PurpurWorldConfig { + public boolean vindicatorControllable = true; public double vindicatorMaxHealth = 24.0D; public double vindicatorJohnnySpawnChance = 0D; + public boolean vindicatorTakeDamageFromWater = false; private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -1757,6 +1882,7 @@ public class PurpurWorldConfig { +@@ -1875,6 +2000,7 @@ public class PurpurWorldConfig { } vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); @@ -2116,7 +2149,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean wanderingTraderRidable = false; -@@ -1764,6 +1890,7 @@ public class PurpurWorldConfig { +@@ -1883,6 +2009,7 @@ public class PurpurWorldConfig { public double wanderingTraderMaxHealth = 20.0D; public boolean wanderingTraderFollowEmeraldBlock = false; public boolean wanderingTraderCanBeLeashed = false; @@ -2124,7 +2157,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -1775,11 +1902,13 @@ public class PurpurWorldConfig { +@@ -1895,12 +2022,14 @@ public class PurpurWorldConfig { wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); @@ -2133,12 +2166,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee public boolean witchRidable = false; public boolean witchRidableInWater = false; + public boolean witchControllable = true; public double witchMaxHealth = 26.0D; + public boolean witchTakeDamageFromWater = false; private void witchSettings() { witchRidable = getBoolean("mobs.witch.ridable", witchRidable); witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); -@@ -1789,6 +1918,7 @@ public class PurpurWorldConfig { +@@ -1911,6 +2040,7 @@ public class PurpurWorldConfig { set("mobs.witch.attributes.max_health", oldValue); } witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); @@ -2146,7 +2180,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean witherRidable = false; -@@ -1798,6 +1928,7 @@ public class PurpurWorldConfig { +@@ -1921,6 +2051,7 @@ public class PurpurWorldConfig { public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; public boolean witherBypassMobGriefing = false; @@ -2154,7 +2188,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1815,11 +1946,13 @@ public class PurpurWorldConfig { +@@ -1939,12 +2070,14 @@ public class PurpurWorldConfig { 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); @@ -2163,12 +2197,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee public boolean witherSkeletonRidable = false; public boolean witherSkeletonRidableInWater = false; + public boolean witherSkeletonControllable = true; public double witherSkeletonMaxHealth = 20.0D; + public boolean witherSkeletonTakeDamageFromWater = false; private void witherSkeletonSettings() { witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); -@@ -1829,6 +1962,7 @@ public class PurpurWorldConfig { +@@ -1955,6 +2088,7 @@ public class PurpurWorldConfig { set("mobs.wither_skeleton.attributes.max_health", oldValue); } witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); @@ -2176,7 +2211,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean wolfRidable = false; -@@ -1838,6 +1972,7 @@ public class PurpurWorldConfig { +@@ -1965,6 +2099,7 @@ public class PurpurWorldConfig { public boolean wolfMilkCuresRabies = true; public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; @@ -2184,7 +2219,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -1855,11 +1990,13 @@ public class PurpurWorldConfig { +@@ -1983,12 +2118,14 @@ public class PurpurWorldConfig { wolfMilkCuresRabies = getBoolean("mobs.wolf.milk-cures-rabid-wolves", wolfMilkCuresRabies); wolfNaturalRabid = getDouble("mobs.wolf.spawn-rabid-chance", wolfNaturalRabid); wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); @@ -2193,12 +2228,13 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee public boolean zoglinRidable = false; public boolean zoglinRidableInWater = false; + public boolean zoglinControllable = true; public double zoglinMaxHealth = 40.0D; + public boolean zoglinTakeDamageFromWater = false; private void zoglinSettings() { zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); -@@ -1869,6 +2006,7 @@ public class PurpurWorldConfig { +@@ -1999,6 +2136,7 @@ public class PurpurWorldConfig { set("mobs.zoglin.attributes.max_health", oldValue); } zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); @@ -2206,7 +2242,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean zombieRidable = false; -@@ -1880,6 +2018,7 @@ public class PurpurWorldConfig { +@@ -2011,6 +2149,7 @@ public class PurpurWorldConfig { public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; public boolean zombieBypassMobGriefing = false; @@ -2214,7 +2250,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -1895,6 +2034,7 @@ public class PurpurWorldConfig { +@@ -2027,6 +2166,7 @@ public class PurpurWorldConfig { zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); @@ -2222,7 +2258,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean zombieHorseRidableInWater = false; -@@ -1906,6 +2046,7 @@ public class PurpurWorldConfig { +@@ -2038,6 +2178,7 @@ public class PurpurWorldConfig { public double zombieHorseMovementSpeedMin = 0.2D; public double zombieHorseMovementSpeedMax = 0.2D; public double zombieHorseSpawnChance = 0.0D; @@ -2230,7 +2266,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void zombieHorseSettings() { zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); -@@ -1922,6 +2063,7 @@ public class PurpurWorldConfig { +@@ -2054,6 +2195,7 @@ public class PurpurWorldConfig { zombieHorseMovementSpeedMin = getDouble("mobs.zombie_horse.attributes.movement_speed.min", zombieHorseMovementSpeedMin); zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); @@ -2238,7 +2274,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean zombieVillagerRidable = false; -@@ -1931,6 +2073,7 @@ public class PurpurWorldConfig { +@@ -2064,6 +2206,7 @@ public class PurpurWorldConfig { public boolean zombieVillagerJockeyOnlyBaby = true; public double zombieVillagerJockeyChance = 0.05D; public boolean zombieVillagerJockeyTryExistingChickens = true; @@ -2246,7 +2282,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -1944,6 +2087,7 @@ public class PurpurWorldConfig { +@@ -2078,6 +2221,7 @@ public class PurpurWorldConfig { zombieVillagerJockeyOnlyBaby = getBoolean("mobs.zombie_villager.jockey.only-babies", zombieVillagerJockeyOnlyBaby); zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); @@ -2254,7 +2290,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee } public boolean zombifiedPiglinRidable = false; -@@ -1954,6 +2098,7 @@ public class PurpurWorldConfig { +@@ -2089,6 +2233,7 @@ public class PurpurWorldConfig { public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; @@ -2262,7 +2298,7 @@ index 067a8d3bc2a1190f9f9c83b4a2b99400c1e63ac5..f70f0407b1f43b9f21dfd9053da942ee private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -1968,5 +2113,6 @@ public class PurpurWorldConfig { +@@ -2104,5 +2249,6 @@ public class PurpurWorldConfig { zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); diff --git a/patches/server/0139-Config-to-always-tame-in-Creative.patch b/patches/server/0139-Config-to-always-tame-in-Creative.patch index de03042ead..5be5d40e68 100644 --- a/patches/server/0139-Config-to-always-tame-in-Creative.patch +++ b/patches/server/0139-Config-to-always-tame-in-Creative.patch @@ -20,10 +20,10 @@ index 5c64905e90ccca6e0b347241ddf9cc3f71058b8e..3bd7521b131b2b40f807bdc7ab95e64c return; } 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 bbada6ca16146eae026ae5ca63372970799815b8..c4ffe4517d7b8c521b5a11555eeffbe3c7a1801d 100644 +index 66e054e71e0d3cd936c77b212567462e5c6268f2..5759ff40254ff7238e7b874822f743fbf0d33e81 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -480,7 +480,7 @@ public class Cat extends TamableAnimal { +@@ -485,7 +485,7 @@ public class Cat extends TamableAnimal { } } else if (this.isFood(itemstack)) { this.usePlayerItem(player, hand, itemstack); @@ -33,10 +33,10 @@ index bbada6ca16146eae026ae5ca63372970799815b8..c4ffe4517d7b8c521b5a11555eeffbe3 this.setOrderedToSit(true); this.level.broadcastEntityEvent(this, (byte) 7); 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 cb25e36052934c2442fed8e32578915aef3b8074..de702ce3e2dffc44e380b8470aa540a3226a54cb 100644 +index fcf1b1168b29622ab2b1dc87a947cb66ef8bedfc..ee52e83375521fa41369161356802c305deb605d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -326,7 +326,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -331,7 +331,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { } if (!this.level.isClientSide) { @@ -46,10 +46,10 @@ index cb25e36052934c2442fed8e32578915aef3b8074..de702ce3e2dffc44e380b8470aa540a3 this.level.broadcastEntityEvent(this, (byte) 7); } else { 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 663683a50f7a1125f406b6ec8bf7a0419be5f36a..713fe8ac2293fe2e60c5834b3d6fd2f12f3bc391 100644 +index 8c4ef7de3dfa2888ea175342a8df308a0a1fa66d..63d3f68326386532b027c077c35629c75508bfc4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -519,7 +519,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -524,7 +524,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // CraftBukkit - added event call and isCancelled check. @@ -59,7 +59,7 @@ index 663683a50f7a1125f406b6ec8bf7a0419be5f36a..713fe8ac2293fe2e60c5834b3d6fd2f1 this.navigation.stop(); this.setTarget((LivingEntity) null); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f70f0407b1f43b9f21dfd9053da942eea17c9bba..e7299341d4890d6354564be47e30814300858f74 100644 +index 75907514dde64d6eb35bd318b63decb1c11d178d..5e7d226a3510e453d4a0b52467ca0f07364ec2a9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -111,6 +111,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0141-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch b/patches/server/0141-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch index d1ac61a36e..9f5e11ec4e 100644 --- a/patches/server/0141-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch +++ b/patches/server/0141-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configs for if Wither/Ender Dragon can ride vehicles diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 618b8fe6fcf71c58c297b7d918e6c74de6077331..fc071603d760a2e34033bd6341a156cd9ac1e3f3 100644 +index 613a847d939349d0b5db34f058865a16d772fadc..c28c2a2a888ddd6c0e6e4feed952fe99bc2a0cfe 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -1114,6 +1114,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -1119,6 +1119,7 @@ public class EnderDragon extends Mob implements Enemy { @Override protected boolean canRide(Entity entity) { @@ -17,10 +17,10 @@ index 618b8fe6fcf71c58c297b7d918e6c74de6077331..fc071603d760a2e34033bd6341a156cd } diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 3b752f97f75c78657f37215ecd92b7460a71f090..5ef45fe1dac1df779727f9c441f7e6515185e507 100644 +index 93a431247b28bcb8cc974f2dfafe1daba440bc48..d7d9500b0c10b5091910610651bcf85524b67a47 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -733,6 +733,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -738,6 +738,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @Override protected boolean canRide(Entity entity) { @@ -29,10 +29,10 @@ index 3b752f97f75c78657f37215ecd92b7460a71f090..5ef45fe1dac1df779727f9c441f7e651 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index da979391d05fbfae76db66e02ead184b7aa606ad..0a305bd8ec0f27ab46c98dc3eb44b5f022919cf0 100644 +index 451ace3507e54a6a38dc4f154ef0b5471f50f7b4..cdff9baf10df1f572de881f8cb79f9ebe7261903 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -871,6 +871,7 @@ public class PurpurWorldConfig { +@@ -898,6 +898,7 @@ public class PurpurWorldConfig { public boolean enderDragonAlwaysDropsFullExp = false; public boolean enderDragonBypassMobGriefing = false; public boolean enderDragonTakeDamageFromWater = false; @@ -40,7 +40,7 @@ index da979391d05fbfae76db66e02ead184b7aa606ad..0a305bd8ec0f27ab46c98dc3eb44b5f0 private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -888,6 +889,7 @@ public class PurpurWorldConfig { +@@ -916,6 +917,7 @@ public class PurpurWorldConfig { enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); enderDragonBypassMobGriefing = getBoolean("mobs.ender_dragon.bypass-mob-griefing", enderDragonBypassMobGriefing); enderDragonTakeDamageFromWater = getBoolean("mobs.ender_dragon.takes-damage-from-water", enderDragonTakeDamageFromWater); @@ -48,7 +48,7 @@ index da979391d05fbfae76db66e02ead184b7aa606ad..0a305bd8ec0f27ab46c98dc3eb44b5f0 } public boolean endermanRidable = false; -@@ -1960,6 +1962,7 @@ public class PurpurWorldConfig { +@@ -2083,6 +2085,7 @@ public class PurpurWorldConfig { public int witherHealthRegenDelay = 20; public boolean witherBypassMobGriefing = false; public boolean witherTakeDamageFromWater = false; @@ -56,7 +56,7 @@ index da979391d05fbfae76db66e02ead184b7aa606ad..0a305bd8ec0f27ab46c98dc3eb44b5f0 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1978,6 +1981,7 @@ public class PurpurWorldConfig { +@@ -2102,6 +2105,7 @@ public class PurpurWorldConfig { witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); witherTakeDamageFromWater = getBoolean("mobs.wither.takes-damage-from-water", witherTakeDamageFromWater); diff --git a/patches/server/0147-Add-back-player-spawned-endermite-API.patch b/patches/server/0147-Add-back-player-spawned-endermite-API.patch index b7e6b2311d..77775ff5bb 100644 --- a/patches/server/0147-Add-back-player-spawned-endermite-API.patch +++ b/patches/server/0147-Add-back-player-spawned-endermite-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add back player spawned endermite API 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 de422b384f5bd5ddc09229a3fc846aeb7176c07c..fce4cf14f5275d7e996db60dab83d4351cc08796 100644 +index 35108f25aac196b2c8ba2cf91a6744831e93a0b3..3e0f287695fd3def8ed9967d921e141b7ff8bc47 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java +++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java @@ -30,6 +30,7 @@ import net.minecraft.world.level.block.state.BlockState; @@ -16,7 +16,7 @@ index de422b384f5bd5ddc09229a3fc846aeb7176c07c..fce4cf14f5275d7e996db60dab83d435 public Endermite(EntityType type, Level world) { super(type, world); -@@ -56,6 +57,14 @@ public class Endermite extends Monster { +@@ -61,6 +62,14 @@ public class Endermite extends Monster { public boolean isSensitiveToWater() { return this.level.purpurConfig.endermiteTakeDamageFromWater; } @@ -31,7 +31,7 @@ index de422b384f5bd5ddc09229a3fc846aeb7176c07c..fce4cf14f5275d7e996db60dab83d435 // Purpur end @Override -@@ -109,12 +118,14 @@ public class Endermite extends Monster { +@@ -114,12 +123,14 @@ public class Endermite extends Monster { public void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); this.life = nbt.getInt("Lifetime"); diff --git a/patches/server/0148-Config-Enderman-aggressiveness-towards-Endermites.patch b/patches/server/0148-Config-Enderman-aggressiveness-towards-Endermites.patch index 7b38eac02d..a27244fa7e 100644 --- a/patches/server/0148-Config-Enderman-aggressiveness-towards-Endermites.patch +++ b/patches/server/0148-Config-Enderman-aggressiveness-towards-Endermites.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config Enderman aggressiveness towards Endermites 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 5932a5f4f641846637f0afe4c3496910bfdd5570..cccab211d950b82bc213fa17da25ad792fdcd8e5 100644 +index a02e04ed34de9d87066b202cf747f927b55cfb76..330d3d6dd1a959830479b2d1846378b0cd7f9151 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -119,7 +119,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -124,7 +124,7 @@ public class EnderMan extends Monster implements NeutralMob { this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); @@ -18,10 +18,10 @@ index 5932a5f4f641846637f0afe4c3496910bfdd5570..cccab211d950b82bc213fa17da25ad79 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d3c2f19aef25c543885388625a479b3a41da3033..33101d329f035e814ecfca0cd6ffff4976d32333 100644 +index 9993677b92324bda36a01c673d1d47ce5b4f730d..b99f3b2414594640ad5d88cc461ae62b463c1e2a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -920,6 +920,8 @@ public class PurpurWorldConfig { +@@ -949,6 +949,8 @@ public class PurpurWorldConfig { public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; public boolean endermanTakeDamageFromWater = true; @@ -30,7 +30,7 @@ index d3c2f19aef25c543885388625a479b3a41da3033..33101d329f035e814ecfca0cd6ffff49 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -928,11 +930,17 @@ public class PurpurWorldConfig { +@@ -958,11 +960,17 @@ public class PurpurWorldConfig { set("mobs.enderman.attributes.max-health", null); set("mobs.enderman.attributes.max_health", oldValue); } diff --git a/patches/server/0149-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch b/patches/server/0149-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch index 6c0f46bae0..a88dec31aa 100644 --- a/patches/server/0149-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch +++ b/patches/server/0149-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch @@ -7,10 +7,10 @@ Prevents Enderman from becoming aggresive towards players that are wearing a Dra Adds functionality to a useless item! 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 cccab211d950b82bc213fa17da25ad792fdcd8e5..fa2d6b478ed420e36622a0bde48131661d483d8b 100644 +index 330d3d6dd1a959830479b2d1846378b0cd7f9151..eb1f02840ae230f9195d72d0ece9553bf72bba3f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -256,7 +256,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -261,7 +261,7 @@ public class EnderMan extends Monster implements NeutralMob { // Paper end ItemStack itemstack = (ItemStack) player.getInventory().armor.get(3); @@ -20,10 +20,10 @@ index cccab211d950b82bc213fa17da25ad792fdcd8e5..fa2d6b478ed420e36622a0bde4813166 } else { Vec3 vec3d = player.getViewVector(1.0F).normalize(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 33101d329f035e814ecfca0cd6ffff4976d32333..1fb43400052a3206c752dd83e721790c858091ba 100644 +index b99f3b2414594640ad5d88cc461ae62b463c1e2a..13ddf5fbec4c20af82be03f814004e99fcdb67d9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -922,6 +922,8 @@ public class PurpurWorldConfig { +@@ -951,6 +951,8 @@ public class PurpurWorldConfig { public boolean endermanTakeDamageFromWater = true; public boolean endermanAggroEndermites = true; public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; @@ -32,7 +32,7 @@ index 33101d329f035e814ecfca0cd6ffff4976d32333..1fb43400052a3206c752dd83e721790c private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -941,6 +943,8 @@ public class PurpurWorldConfig { +@@ -971,6 +973,8 @@ public class PurpurWorldConfig { endermanTakeDamageFromWater = getBoolean("mobs.enderman.takes-damage-from-water", endermanTakeDamageFromWater); endermanAggroEndermites = getBoolean("mobs.enderman.aggressive-towards-endermites", endermanAggroEndermites); endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); diff --git a/patches/server/0151-Config-to-disable-Llama-caravans.patch b/patches/server/0151-Config-to-disable-Llama-caravans.patch index c7014cacc1..fd9894feea 100644 --- a/patches/server/0151-Config-to-disable-Llama-caravans.patch +++ b/patches/server/0151-Config-to-disable-Llama-caravans.patch @@ -19,10 +19,10 @@ index 7b141c495095afcd9c8b04c059d692e829259e7a..ad30f2d678cfc4b0d693e84e6e152c63 List list = this.llama.level.getEntities(this.llama, this.llama.getBoundingBox().inflate(9.0D, 4.0D, 9.0D), (entity) -> { EntityType entityType = entity.getType(); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index fde47de12ffa43bff9cfd1500a35e49325223291..7656c933a835f15c40e75851e7a2348bdef4010e 100644 +index a5463330e6b20dcbf8a82bfb0821412f7c409b1d..6fffb293e1ca06a9f07fe30928e4dd8fff1b0a15 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -536,7 +536,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -541,7 +541,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { } public void joinCaravan(Llama llama) { @@ -32,10 +32,10 @@ index fde47de12ffa43bff9cfd1500a35e49325223291..7656c933a835f15c40e75851e7a2348b this.caravanHead.caravanTail = this; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ce2aee67f46beb7dd184fc52e53b7f8824501f56..dc76ba9ec061d9146a3915cfe3fcc215397d2f82 100644 +index ad950cbf50332004b03f9a19ac2d5739d60e1672..0d6bab1005b93b683ea19ec9b249da1802c4bc51 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1215,6 +1215,7 @@ public class PurpurWorldConfig { +@@ -1270,6 +1270,7 @@ public class PurpurWorldConfig { public double llamaMovementSpeedMax = 0.175D; public int llamaBreedingTicks = 6000; public boolean llamaTakeDamageFromWater = false; @@ -43,7 +43,7 @@ index ce2aee67f46beb7dd184fc52e53b7f8824501f56..dc76ba9ec061d9146a3915cfe3fcc215 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1233,6 +1234,7 @@ public class PurpurWorldConfig { +@@ -1289,6 +1290,7 @@ public class PurpurWorldConfig { llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); llamaTakeDamageFromWater = getBoolean("mobs.llama.takes-damage-from-water", llamaTakeDamageFromWater); diff --git a/patches/server/0152-Config-to-make-Creepers-explode-on-death.patch b/patches/server/0152-Config-to-make-Creepers-explode-on-death.patch index 0edded727e..68b73cce28 100644 --- a/patches/server/0152-Config-to-make-Creepers-explode-on-death.patch +++ b/patches/server/0152-Config-to-make-Creepers-explode-on-death.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Config to make Creepers explode on death Creepers exploded after being killed in the alpha days. This brings that back. 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 cf8b4f538ee2df715162adc460c6e8e58b50ba52..525b94c61693cfd7d68305cbf4eb08a87f3ca66a 100644 +index 7c683693a806142c098dd31e6bc88a0b0a33ec66..cf585d2eaf743d38e06084609ff4c220e096cf71 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -64,6 +64,7 @@ public class Creeper extends Monster implements PowerableMob { @@ -17,7 +17,7 @@ index cf8b4f538ee2df715162adc460c6e8e58b50ba52..525b94c61693cfd7d68305cbf4eb08a8 // Purpur end public Creeper(EntityType type, Level world) { -@@ -151,6 +152,14 @@ public class Creeper extends Monster implements PowerableMob { +@@ -156,6 +157,14 @@ public class Creeper extends Monster implements PowerableMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.creeperTakeDamageFromWater; } @@ -32,7 +32,7 @@ index cf8b4f538ee2df715162adc460c6e8e58b50ba52..525b94c61693cfd7d68305cbf4eb08a8 // Purpur end @Override -@@ -348,6 +357,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -353,6 +362,7 @@ public class Creeper extends Monster implements PowerableMob { } public void explodeCreeper() { @@ -40,7 +40,7 @@ index cf8b4f538ee2df715162adc460c6e8e58b50ba52..525b94c61693cfd7d68305cbf4eb08a8 if (!this.level.isClientSide) { Explosion.BlockInteraction explosion_effect = (this.level.purpurConfig.creeperBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && level.purpurConfig.creeperAllowGriefing ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; // Purpur float f = this.isPowered() ? 2.0F : 1.0F; -@@ -366,7 +376,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -371,7 +381,7 @@ public class Creeper extends Monster implements PowerableMob { } // CraftBukkit end } @@ -50,10 +50,10 @@ index cf8b4f538ee2df715162adc460c6e8e58b50ba52..525b94c61693cfd7d68305cbf4eb08a8 private void spawnLingeringCloud() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index dc76ba9ec061d9146a3915cfe3fcc215397d2f82..2562830e1530eece0b2480b18d5dc1fae34a0274 100644 +index 0d6bab1005b93b683ea19ec9b249da1802c4bc51..cfc14462c566096fb6eb2e037da11967c80334f0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -784,6 +784,7 @@ public class PurpurWorldConfig { +@@ -803,6 +803,7 @@ public class PurpurWorldConfig { public boolean creeperAllowGriefing = true; public boolean creeperBypassMobGriefing = false; public boolean creeperTakeDamageFromWater = false; @@ -61,7 +61,7 @@ index dc76ba9ec061d9146a3915cfe3fcc215397d2f82..2562830e1530eece0b2480b18d5dc1fa private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -797,6 +798,7 @@ public class PurpurWorldConfig { +@@ -817,6 +818,7 @@ public class PurpurWorldConfig { creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); diff --git a/patches/server/0153-Configurable-ravager-griefable-blocks-list.patch b/patches/server/0153-Configurable-ravager-griefable-blocks-list.patch index a32a8b9c2d..dd3d11639a 100644 --- a/patches/server/0153-Configurable-ravager-griefable-blocks-list.patch +++ b/patches/server/0153-Configurable-ravager-griefable-blocks-list.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable ravager griefable blocks list 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 bb4b50e64908f54d84182208f5d605db20d1456d..83e835a63bc0a211b75db82f4f4eb28874eea9ec 100644 +index f8ceb90e468203d995f9f3d9d041a9a43e94fa68..a2893e4a64c339af31641e9d8150b163fb79962c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -200,7 +200,7 @@ public class Ravager extends Raider { +@@ -205,7 +205,7 @@ public class Ravager extends Raider { BlockState iblockdata = this.level.getBlockState(blockposition); Block block = iblockdata.getBlock(); @@ -31,10 +31,10 @@ index e9087a46e401bc99b73c2cf2731fdac3e68719f8..e054edf9e7c4eef231e155516433c6fa } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2562830e1530eece0b2480b18d5dc1fae34a0274..007ebed0fcffb1dc4c06d4f9585c6ba88c8c9c0c 100644 +index cfc14462c566096fb6eb2e037da11967c80334f0..fb16a3541c86f73ea4922baa4e34788ee3c9112d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1571,6 +1571,7 @@ public class PurpurWorldConfig { +@@ -1654,6 +1654,7 @@ public class PurpurWorldConfig { public double ravagerMaxHealth = 100.0D; public boolean ravagerBypassMobGriefing = false; public boolean ravagerTakeDamageFromWater = false; @@ -42,7 +42,7 @@ index 2562830e1530eece0b2480b18d5dc1fae34a0274..007ebed0fcffb1dc4c06d4f9585c6ba8 private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1582,6 +1583,23 @@ public class PurpurWorldConfig { +@@ -1666,6 +1667,23 @@ public class PurpurWorldConfig { ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); ravagerTakeDamageFromWater = getBoolean("mobs.ravager.takes-damage-from-water", ravagerTakeDamageFromWater); diff --git a/patches/server/0156-Add-config-for-villager-trading.patch b/patches/server/0156-Add-config-for-villager-trading.patch index 31947737e4..4e44ef85c2 100644 --- a/patches/server/0156-Add-config-for-villager-trading.patch +++ b/patches/server/0156-Add-config-for-villager-trading.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add config for villager trading 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 56df45d9ff5d4ea608c970f26486795f9776d714..31ca5ddf748313f7d6cdee906d13e8dcb616875d 100644 +index 6fe8ebc19470425dd5e44b67b0c6b369a1e21365..21f9384b647264c72675889fdda2613031a57c5d 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -365,7 +365,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -370,7 +370,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler return tryRide(player, hand); // Purpur } else { if (level.purpurConfig.villagerRidable && itemstack.isEmpty()) return tryRide(player, hand); // Purpur @@ -18,10 +18,10 @@ index 56df45d9ff5d4ea608c970f26486795f9776d714..31ca5ddf748313f7d6cdee906d13e8dc } diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index e5b78c9d6fb326771d65ea9afd9da38c204922f0..1a8df13b06b1ac5e5a7d63033b4a53261c779eda 100644 +index d99e97d5a7291df541a939c0f21297d8c3976138..f3994e53af79a4c3bb327e43cf133a12c20662bf 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -145,7 +145,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -150,7 +150,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill return tryRide(player, hand); // Purpur } else { if (level.purpurConfig.wanderingTraderRidable && itemstack.isEmpty()) return tryRide(player, hand); // Purpur @@ -31,10 +31,10 @@ index e5b78c9d6fb326771d65ea9afd9da38c204922f0..1a8df13b06b1ac5e5a7d63033b4a5326 this.openTradingScreen(player, this.getDisplayName(), 1); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 257609405527a2f3256dbdebd8681fe436f5fdc3..dffb0fc28eca9a75f4e4bd30dee33f03f5cb2c86 100644 +index 2ef12f92c5f002294bc3bf81e429b60378bbd75f..a1969d56e5c3088812737c591d6a59fd8875e6b9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1941,6 +1941,7 @@ public class PurpurWorldConfig { +@@ -2056,6 +2056,7 @@ public class PurpurWorldConfig { public boolean villagerClericFarmersThrowWarts = true; public boolean villagerBypassMobGriefing = false; public boolean villagerTakeDamageFromWater = false; @@ -42,7 +42,7 @@ index 257609405527a2f3256dbdebd8681fe436f5fdc3..dffb0fc28eca9a75f4e4bd30dee33f03 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1962,6 +1963,7 @@ public class PurpurWorldConfig { +@@ -2078,6 +2079,7 @@ public class PurpurWorldConfig { villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts); villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); @@ -50,7 +50,7 @@ index 257609405527a2f3256dbdebd8681fe436f5fdc3..dffb0fc28eca9a75f4e4bd30dee33f03 } public boolean vindicatorRidable = false; -@@ -1988,6 +1990,7 @@ public class PurpurWorldConfig { +@@ -2107,6 +2109,7 @@ public class PurpurWorldConfig { public boolean wanderingTraderFollowEmeraldBlock = false; public boolean wanderingTraderCanBeLeashed = false; public boolean wanderingTraderTakeDamageFromWater = false; @@ -58,7 +58,7 @@ index 257609405527a2f3256dbdebd8681fe436f5fdc3..dffb0fc28eca9a75f4e4bd30dee33f03 private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -2000,6 +2003,7 @@ public class PurpurWorldConfig { +@@ -2120,6 +2123,7 @@ public class PurpurWorldConfig { 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); diff --git a/patches/server/0167-Piglin-portal-spawn-modifier.patch b/patches/server/0167-Piglin-portal-spawn-modifier.patch index b6843ad6d4..8f05152e92 100644 --- a/patches/server/0167-Piglin-portal-spawn-modifier.patch +++ b/patches/server/0167-Piglin-portal-spawn-modifier.patch @@ -31,10 +31,10 @@ index 13a367d2b5f245f4dd92df03288dc40b81e19603..bd593ec55fcccc1e02cf5683891c5586 pos = pos.below(); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b0439ccc8094637cb041370c5a37024f4f24d2d4..423f3c82e0ad1ee56b84fed9f919773386203a89 100644 +index e53dc52d78f8aa4bd36c156f4e3f7caed77b1758..eb7faf2a5cf909f0570435bf8656421a44a50ff9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1524,6 +1524,7 @@ public class PurpurWorldConfig { +@@ -1595,6 +1595,7 @@ public class PurpurWorldConfig { public double piglinMaxHealth = 16.0D; public boolean piglinBypassMobGriefing = false; public boolean piglinTakeDamageFromWater = false; @@ -42,7 +42,7 @@ index b0439ccc8094637cb041370c5a37024f4f24d2d4..423f3c82e0ad1ee56b84fed9f9197733 private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1535,6 +1536,7 @@ public class PurpurWorldConfig { +@@ -1607,6 +1608,7 @@ public class PurpurWorldConfig { piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); piglinTakeDamageFromWater = getBoolean("mobs.piglin.takes-damage-from-water", piglinTakeDamageFromWater); diff --git a/patches/server/0170-Config-for-wither-explosion-radius.patch b/patches/server/0170-Config-for-wither-explosion-radius.patch index 7e1d0e7bc6..ce7d5b2959 100644 --- a/patches/server/0170-Config-for-wither-explosion-radius.patch +++ b/patches/server/0170-Config-for-wither-explosion-radius.patch @@ -18,10 +18,10 @@ index a66e9826b8283366cec5adb54f79efee47d9df22..6cf8b12e94c17a8111eef5cc0157e4df if (!event.isCancelled()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0367d18261ae85f6f38b92e29d38037835ab385f..d282948eac093a3a6bfebe9416c76339f629bc25 100644 +index d3e9b9c680a71b4e9cb3d1cb3a91a195cad336ba..894f9d48c54ca251e872ec514b6568a420a0b4f9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2099,6 +2099,7 @@ public class PurpurWorldConfig { +@@ -2222,6 +2222,7 @@ public class PurpurWorldConfig { public boolean witherBypassMobGriefing = false; public boolean witherTakeDamageFromWater = false; public boolean witherCanRideVehicles = false; @@ -29,7 +29,7 @@ index 0367d18261ae85f6f38b92e29d38037835ab385f..d282948eac093a3a6bfebe9416c76339 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2118,6 +2119,7 @@ public class PurpurWorldConfig { +@@ -2242,6 +2243,7 @@ public class PurpurWorldConfig { witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); witherTakeDamageFromWater = getBoolean("mobs.wither.takes-damage-from-water", witherTakeDamageFromWater); witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); diff --git a/patches/server/0177-Config-for-health-to-impact-Creeper-explosion-radius.patch b/patches/server/0177-Config-for-health-to-impact-Creeper-explosion-radius.patch index d18436add3..b4cb88551e 100644 --- a/patches/server/0177-Config-for-health-to-impact-Creeper-explosion-radius.patch +++ b/patches/server/0177-Config-for-health-to-impact-Creeper-explosion-radius.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config for health to impact Creeper explosion radius 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 525b94c61693cfd7d68305cbf4eb08a87f3ca66a..35cbd013b1d58bb5fd1480922c2bd4307edfb6c3 100644 +index cf585d2eaf743d38e06084609ff4c220e096cf71..b0e5146f0cf33f8fbc97c4c51edee252ad06e6a9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -361,9 +361,10 @@ public class Creeper extends Monster implements PowerableMob { +@@ -366,9 +366,10 @@ public class Creeper extends Monster implements PowerableMob { if (!this.level.isClientSide) { Explosion.BlockInteraction explosion_effect = (this.level.purpurConfig.creeperBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && level.purpurConfig.creeperAllowGriefing ? Explosion.BlockInteraction.DESTROY : Explosion.BlockInteraction.NONE; // Purpur float f = this.isPowered() ? 2.0F : 1.0F; @@ -21,10 +21,10 @@ index 525b94c61693cfd7d68305cbf4eb08a87f3ca66a..35cbd013b1d58bb5fd1480922c2bd430 if (!event.isCancelled()) { this.dead = true; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a93c89efff74f206e3ebad6c2dae85cf5169c1e8..f05341a46e7e6efbbef0943f957d1898066da475 100644 +index fb33eb38503d9eb74ad65edfc2b75d0e2e558422..6dfba9bbc2c25044e8c5a676259f439a2a5348ef 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -880,6 +880,7 @@ public class PurpurWorldConfig { +@@ -899,6 +899,7 @@ public class PurpurWorldConfig { public boolean creeperBypassMobGriefing = false; public boolean creeperTakeDamageFromWater = false; public boolean creeperExplodeWhenKilled = false; @@ -32,7 +32,7 @@ index a93c89efff74f206e3ebad6c2dae85cf5169c1e8..f05341a46e7e6efbbef0943f957d1898 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -894,6 +895,7 @@ public class PurpurWorldConfig { +@@ -914,6 +915,7 @@ public class PurpurWorldConfig { creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); creeperExplodeWhenKilled = getBoolean("mobs.creeper.explode-when-killed", creeperExplodeWhenKilled); diff --git a/patches/server/0178-Iron-golem-poppy-calms-anger.patch b/patches/server/0178-Iron-golem-poppy-calms-anger.patch index 3f62391b26..59cdd6d475 100644 --- a/patches/server/0178-Iron-golem-poppy-calms-anger.patch +++ b/patches/server/0178-Iron-golem-poppy-calms-anger.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Iron golem poppy calms anger 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 52cc0df083d5a4685fd00f7db0d92b277fb0c994..ff5d6f437b880ab0aa5897089694a620be7eacca 100644 +index 13cdc3a97c7707c9cb41e3da6395b0022fd661aa..7d181c78b22b7ad03674df6ab7288a2215aa3708 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -96,6 +96,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -101,6 +101,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { protected void registerGoals() { if (level.purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -17,10 +17,10 @@ index 52cc0df083d5a4685fd00f7db0d92b277fb0c994..ff5d6f437b880ab0aa5897089694a620 this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9D, 32.0F)); this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6D, false)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f05341a46e7e6efbbef0943f957d1898066da475..e40a9c01607bf1b85bb6ff0e9f23d38b48743b98 100644 +index 6dfba9bbc2c25044e8c5a676259f439a2a5348ef..de6fbcff60def3596a29352b0324d04af9630819 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1291,6 +1291,7 @@ public class PurpurWorldConfig { +@@ -1344,6 +1344,7 @@ public class PurpurWorldConfig { public boolean ironGolemCanSwim = false; public double ironGolemMaxHealth = 100.0D; public boolean ironGolemTakeDamageFromWater = false; @@ -28,7 +28,7 @@ index f05341a46e7e6efbbef0943f957d1898066da475..e40a9c01607bf1b85bb6ff0e9f23d38b private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); -@@ -1302,6 +1303,7 @@ public class PurpurWorldConfig { +@@ -1356,6 +1357,7 @@ public class PurpurWorldConfig { } ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater); diff --git a/patches/server/0179-Breedable-parrots.patch b/patches/server/0179-Breedable-parrots.patch index 9c8e4ac043..82be845cdf 100644 --- a/patches/server/0179-Breedable-parrots.patch +++ b/patches/server/0179-Breedable-parrots.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Breedable parrots 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 de702ce3e2dffc44e380b8470aa540a3226a54cb..bb9717d1b2039469aae26e0eb9a4304bff4ae7af 100644 +index ee52e83375521fa41369161356802c305deb605d..d68bb48cf703a3ed0bf843d5c0ab9caad4727214 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -220,6 +220,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -225,6 +225,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new PanicGoal(this, 1.25D)); // Purpur @@ -16,7 +16,7 @@ index de702ce3e2dffc44e380b8470aa540a3226a54cb..bb9717d1b2039469aae26e0eb9a4304b this.goalSelector.addGoal(1, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(2, new FollowOwnerGoal(this, 1.0D, 5.0F, 1.0F, true)); -@@ -334,6 +335,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -339,6 +340,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { } } @@ -24,7 +24,7 @@ index de702ce3e2dffc44e380b8470aa540a3226a54cb..bb9717d1b2039469aae26e0eb9a4304b return InteractionResult.sidedSuccess(this.level.isClientSide); } else if (itemstack.is(Parrot.POISONOUS_FOOD)) { if (!player.getAbilities().instabuild) { -@@ -359,7 +361,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -364,7 +366,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { @Override public boolean isFood(ItemStack stack) { @@ -33,7 +33,7 @@ index de702ce3e2dffc44e380b8470aa540a3226a54cb..bb9717d1b2039469aae26e0eb9a4304b } public static boolean checkParrotSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { -@@ -376,13 +378,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -381,13 +383,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { @Override public boolean canMate(Animal other) { @@ -50,18 +50,18 @@ index de702ce3e2dffc44e380b8470aa540a3226a54cb..bb9717d1b2039469aae26e0eb9a4304b @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e40a9c01607bf1b85bb6ff0e9f23d38b48743b98..438bc081a07e33fa250b4daee9894e8cf74edfe4 100644 +index de6fbcff60def3596a29352b0324d04af9630819..b398535d5b84c2c17d66296dff4b311f3ea110f4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1447,6 +1447,7 @@ public class PurpurWorldConfig { - public double parrotMaxY = 256D; +@@ -1512,6 +1512,7 @@ public class PurpurWorldConfig { + public double parrotMaxY = 320D; public double parrotMaxHealth = 6.0D; public boolean parrotTakeDamageFromWater = false; + public boolean parrotBreedable = false; private void parrotSettings() { parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); -@@ -1458,6 +1459,7 @@ public class PurpurWorldConfig { +@@ -1524,6 +1525,7 @@ public class PurpurWorldConfig { } parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); parrotTakeDamageFromWater = getBoolean("mobs.parrot.takes-damage-from-water", parrotTakeDamageFromWater); diff --git a/patches/server/0186-Bee-can-work-when-raining-or-at-night.patch b/patches/server/0186-Bee-can-work-when-raining-or-at-night.patch index 991c8f7e41..f4ca328be0 100644 --- a/patches/server/0186-Bee-can-work-when-raining-or-at-night.patch +++ b/patches/server/0186-Bee-can-work-when-raining-or-at-night.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Bee can work when raining or at night 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 0f3848287798dcaa57a99b531202e23fe8d05744..9fa2359662079f406ca6204fa06d5dbfefec49d5 100644 +index 0c0c900d07d2869baa5fdd669ceecf4ad3477807..c69d0cc9ed74e4e06465aebff07b6b50c227fb28 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -406,7 +406,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -411,7 +411,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { boolean wantsToEnterHive() { if (this.stayOutOfHiveCountdown <= 0 && !this.beePollinateGoal.isPollinating() && !this.hasStung() && this.getTarget() == null) { @@ -31,10 +31,10 @@ index 375f25807ca0f35784653d8fbe4e5086d7033e99..096308b577c68502fed1f4c10c0dfc2a return false; } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2a7b4120502d72f4f5ce0cdccc084c0a5bc6bf83..8c41f8e4c88596ad225cfa48e69fa0ecf6d10766 100644 +index 16de2736966c52994836377418d7f642789f91b0..1e0d78ae199e7d3a240b94e44128e254c4762f7f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -754,6 +754,8 @@ public class PurpurWorldConfig { +@@ -759,6 +759,8 @@ public class PurpurWorldConfig { public double beeMaxHealth = 10.0D; public int beeBreedingTicks = 6000; public boolean beeTakeDamageFromWater = false; @@ -43,7 +43,7 @@ index 2a7b4120502d72f4f5ce0cdccc084c0a5bc6bf83..8c41f8e4c88596ad225cfa48e69fa0ec private void beeSettings() { beeRidable = getBoolean("mobs.bee.ridable", beeRidable); beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); -@@ -766,6 +768,8 @@ public class PurpurWorldConfig { +@@ -772,6 +774,8 @@ public class PurpurWorldConfig { beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); beeTakeDamageFromWater = getBoolean("mobs.bee.takes-damage-from-water", beeTakeDamageFromWater); diff --git a/patches/server/0187-API-for-any-mob-to-burn-daylight.patch b/patches/server/0187-API-for-any-mob-to-burn-daylight.patch index a1a0c00843..c2f2ffb2f2 100644 --- a/patches/server/0187-API-for-any-mob-to-burn-daylight.patch +++ b/patches/server/0187-API-for-any-mob-to-burn-daylight.patch @@ -6,10 +6,10 @@ Subject: [PATCH] API for any mob to burn daylight Co-authored by: Encode42 diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c709099a06f6cb9313c7e99f3b66b463b31e751a..ffccf99ae6eb4a20104ce897cb9f1a9356dd23c7 100644 +index 66788c374deb9a499841e0b28fcf34999e55c742..542d502ad0080e20971e1fddff54504dd23b0bf1 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4431,5 +4431,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i +@@ -4435,5 +4435,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i public boolean canSaveToDisk() { return true; } @@ -89,10 +89,10 @@ index 26717a4172ef299a3b4ab4384f8c23dc853bb485..12517438b8b8366a37165cb057dfc040 public boolean isSensitiveToWater() { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index fa23e24708f4d9e1f50e54cda76113a9a7695c0a..e9aa614a7a93286e5077ffa43a8aebbaab6f4ac2 100644 +index 1060f3f27eb5cb205629e939c2a106dfa69d5626..487ceabadd9a38b89de64ccdfbd97ba6304c9ced 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1664,17 +1664,7 @@ public abstract class Mob extends LivingEntity { +@@ -1662,17 +1662,7 @@ public abstract class Mob extends LivingEntity { } public boolean isSunBurnTick() { @@ -188,7 +188,7 @@ index a60ca5d69a9734c7979f953bd56c05c7016356d2..193622015c6d3dbff787061e13fa098a // Paper end diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 5458ac83fa555e22ca858f4f596ebb8f37926dd5..ca5683e9b0b4aad3827fe6d00198da8e5b6a69ec 100644 +index 065005c13c2bff341402fc962d19148da27bc3c2..e394b6427329f48a85a277eeb8336b12499525ee 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java @@ -20,6 +20,7 @@ public class Husk extends Zombie { @@ -199,7 +199,7 @@ index 5458ac83fa555e22ca858f4f596ebb8f37926dd5..ca5683e9b0b4aad3827fe6d00198da8e } // Purpur start -@@ -70,7 +71,7 @@ public class Husk extends Zombie { +@@ -75,7 +76,7 @@ public class Husk extends Zombie { @Override public boolean isSunSensitive() { @@ -209,7 +209,7 @@ index 5458ac83fa555e22ca858f4f596ebb8f37926dd5..ca5683e9b0b4aad3827fe6d00198da8e @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 843335bcbdfef0c705dd95beeef8b4f61063f028..5979d8446ae71e365aa65871808af00fae316016 100644 +index 18b0a62a7ae7cf2413c319f402672ef2a6ee415f..2ae234b2e3f7949fe852d341a5feca9a6738075a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -60,6 +60,7 @@ public class Phantom extends FlyingMob implements Enemy { @@ -220,16 +220,16 @@ index 843335bcbdfef0c705dd95beeef8b4f61063f028..5979d8446ae71e365aa65871808af00f } // Purpur start -@@ -249,7 +250,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -254,7 +255,7 @@ public class Phantom extends FlyingMob implements Enemy { @Override public void aiStep() { -- if (this.isAlive() && getRider() == null && (((shouldBurnInDay && level.purpurConfig.phantomBurnInDaylight) && this.isSunBurnTick()) || (level.purpurConfig.phantomBurnInLight > 0 && level.getMaxLocalRawBrightness(blockPosition()) >= level.purpurConfig.phantomBurnInLight))) { // Paper - Configurable Burning // Purpur -+ if (this.isAlive() && getRider() == null && (((shouldBurnInDay() && level.purpurConfig.phantomBurnInDaylight) && this.isSunBurnTick()) || (level.purpurConfig.phantomBurnInLight > 0 && level.getMaxLocalRawBrightness(blockPosition()) >= level.purpurConfig.phantomBurnInLight))) { // Paper - Configurable Burning // Purpur +- if (this.isAlive() && (getRider() == null || !this.isControllable()) && (((shouldBurnInDay && level.purpurConfig.phantomBurnInDaylight) && this.isSunBurnTick()) || (level.purpurConfig.phantomBurnInLight > 0 && level.getMaxLocalRawBrightness(blockPosition()) >= level.purpurConfig.phantomBurnInLight))) { // Paper - Configurable Burning // Purpur ++ if (this.isAlive() && (getRider() == null || !this.isControllable()) && (((shouldBurnInDay() && level.purpurConfig.phantomBurnInDaylight) && this.isSunBurnTick()) || (level.purpurConfig.phantomBurnInLight > 0 && level.getMaxLocalRawBrightness(blockPosition()) >= level.purpurConfig.phantomBurnInLight))) { // Paper - Configurable Burning // Purpur this.setSecondsOnFire(8); } -@@ -281,7 +282,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -286,7 +287,7 @@ public class Phantom extends FlyingMob implements Enemy { this.spawningEntity = nbt.getUUID("Paper.SpawningEntity"); } if (nbt.contains("Paper.ShouldBurnInDay")) { @@ -238,7 +238,7 @@ index 843335bcbdfef0c705dd95beeef8b4f61063f028..5979d8446ae71e365aa65871808af00f } // Paper end } -@@ -297,7 +298,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -302,7 +303,7 @@ public class Phantom extends FlyingMob implements Enemy { if (this.spawningEntity != null) { nbt.putUUID("Paper.SpawningEntity", this.spawningEntity); } @@ -247,7 +247,7 @@ index 843335bcbdfef0c705dd95beeef8b4f61063f028..5979d8446ae71e365aa65871808af00f // Paper end } -@@ -358,7 +359,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -363,7 +364,7 @@ public class Phantom extends FlyingMob implements Enemy { } public void setSpawningEntity(java.util.UUID entity) { this.spawningEntity = entity; } @@ -257,7 +257,7 @@ index 843335bcbdfef0c705dd95beeef8b4f61063f028..5979d8446ae71e365aa65871808af00f public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; } // Paper end 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 e4ead1ced18f16715440c8562a89d7d359add98e..9a4806baab135128f30ad9be4369bbe1e543c6df 100644 +index 4b288fe8923bb4beefb88e8196bfb4d5d2b10b8b..e4e357af439c9a02b8013ce3349ff582495ee80e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -93,11 +93,12 @@ public class Zombie extends Monster { @@ -274,7 +274,7 @@ index e4ead1ced18f16715440c8562a89d7d359add98e..9a4806baab135128f30ad9be4369bbe1 } public Zombie(Level world) { -@@ -289,30 +290,7 @@ public class Zombie extends Monster { +@@ -294,30 +295,7 @@ public class Zombie extends Monster { @Override public void aiStep() { @@ -306,7 +306,7 @@ index e4ead1ced18f16715440c8562a89d7d359add98e..9a4806baab135128f30ad9be4369bbe1 super.aiStep(); } -@@ -350,6 +328,7 @@ public class Zombie extends Monster { +@@ -355,6 +333,7 @@ public class Zombie extends Monster { } @@ -314,7 +314,7 @@ index e4ead1ced18f16715440c8562a89d7d359add98e..9a4806baab135128f30ad9be4369bbe1 public boolean isSunSensitive() { return this.shouldBurnInDay; // Paper - use api value instead } -@@ -479,7 +458,7 @@ public class Zombie extends Monster { +@@ -484,7 +463,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); @@ -323,7 +323,7 @@ index e4ead1ced18f16715440c8562a89d7d359add98e..9a4806baab135128f30ad9be4369bbe1 } @Override -@@ -493,7 +472,7 @@ public class Zombie extends Monster { +@@ -498,7 +477,7 @@ public class Zombie extends Monster { } // Paper start if (nbt.contains("Paper.ShouldBurnInDay")) { diff --git a/patches/server/0197-Shulker-spawn-from-bullet-options.patch b/patches/server/0197-Shulker-spawn-from-bullet-options.patch index 0bb93742ff..4e51ebc9a3 100644 --- a/patches/server/0197-Shulker-spawn-from-bullet-options.patch +++ b/patches/server/0197-Shulker-spawn-from-bullet-options.patch @@ -13,10 +13,10 @@ Subject: [PATCH] Shulker spawn from bullet options (7 - 1) / 5.0 = 1.2 1.0 - 1.2 = -0.2 0% (6 other shulkers) 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 0cef642b6b13347b953f59e1bca909aa7451b851..ec7c5f638573ee331112d91cdfaa8511801c6891 100644 +index ae22748c9cefd000986d50e12fa9cb2a545ad63c..edaa34c6c2c65df77c696b4654e64bcf37a3ff20 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -501,13 +501,22 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -506,13 +506,22 @@ public class Shulker extends AbstractGolem implements Enemy { Vec3 vec3d = this.position(); AABB axisalignedbb = this.getBoundingBox(); @@ -61,11 +61,11 @@ index f812a75985d26785639491c9a980387a3f261f2d..b11fb39b69f5225ca7da72ca1a2200c7 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 13d14c46e801ea76a4aa8a15d8531b4eb5dfa549..743ef4d887577b8fba8b43137650ae8e5d300a7f 100644 +index a970b7721dc0ff0303a80fe83c8342ed762153b1..bc4939abd4b3c2fe5c9866759963b79a4318ce92 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1799,6 +1799,11 @@ public class PurpurWorldConfig { - public boolean shulkerRidableInWater = false; +@@ -1888,6 +1888,11 @@ public class PurpurWorldConfig { + public boolean shulkerControllable = true; public double shulkerMaxHealth = 30.0D; public boolean shulkerTakeDamageFromWater = false; + public float shulkerSpawnFromBulletBaseChance = 1.0F; @@ -76,7 +76,7 @@ index 13d14c46e801ea76a4aa8a15d8531b4eb5dfa549..743ef4d887577b8fba8b43137650ae8e private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -1809,6 +1814,11 @@ public class PurpurWorldConfig { +@@ -1899,6 +1904,11 @@ public class PurpurWorldConfig { } shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); shulkerTakeDamageFromWater = getBoolean("mobs.shulker.takes-damage-from-water", shulkerTakeDamageFromWater); diff --git a/patches/server/0199-Option-to-make-drowned-break-doors.patch b/patches/server/0199-Option-to-make-drowned-break-doors.patch index fb7c94fb2b..26dd2148c7 100644 --- a/patches/server/0199-Option-to-make-drowned-break-doors.patch +++ b/patches/server/0199-Option-to-make-drowned-break-doors.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Option to make drowned break doors 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 4d2bb12b8168fceae71622a9f8bd5102d0024208..a592fb29097232d5d9c6e6d946fb326fd901f27b 100644 +index a2f71b1ba0df62910df528103e8695a2762fe1df..699d4f1a60bb15a04dddbce6486ce10abd417a87 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java @@ -30,6 +30,7 @@ import net.minecraft.world.entity.ai.goal.MoveToBlockGoal; @@ -16,7 +16,7 @@ index 4d2bb12b8168fceae71622a9f8bd5102d0024208..a592fb29097232d5d9c6e6d946fb326f import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; -@@ -118,6 +119,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -123,6 +124,7 @@ 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())); @@ -24,7 +24,7 @@ index 4d2bb12b8168fceae71622a9f8bd5102d0024208..a592fb29097232d5d9c6e6d946fb326f this.goalSelector.addGoal(7, new RandomStrollGoal(this, 1.0D)); this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, Drowned.class)).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::okTarget)); -@@ -170,7 +172,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -175,7 +177,7 @@ public class Drowned extends Zombie implements RangedAttackMob { @Override public boolean supportsBreakDoorGoal() { @@ -34,10 +34,10 @@ index 4d2bb12b8168fceae71622a9f8bd5102d0024208..a592fb29097232d5d9c6e6d946fb326f @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 15a586bc5249bc32d3bdfb0c973e07229b9d8c34..18f06ee01a3d20d51eac9d96a20af523a04a1c08 100644 +index af024fb85a500b6c73e099f2e69535da4e693629..d3f73582dc2d732710ce6f6a2ca6a7f2353afe8e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1014,6 +1014,7 @@ public class PurpurWorldConfig { +@@ -1037,6 +1037,7 @@ public class PurpurWorldConfig { public double drownedJockeyChance = 0.05D; public boolean drownedJockeyTryExistingChickens = true; public boolean drownedTakeDamageFromWater = false; @@ -45,7 +45,7 @@ index 15a586bc5249bc32d3bdfb0c973e07229b9d8c34..18f06ee01a3d20d51eac9d96a20af523 private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -1028,6 +1029,7 @@ public class PurpurWorldConfig { +@@ -1052,6 +1053,7 @@ public class PurpurWorldConfig { drownedJockeyChance = getDouble("mobs.drowned.jockey.chance", drownedJockeyChance); drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); diff --git a/patches/server/0200-Configurable-hunger-starvation-damage.patch b/patches/server/0200-Configurable-hunger-starvation-damage.patch index bdfd849a62..0bc2dc8d16 100644 --- a/patches/server/0200-Configurable-hunger-starvation-damage.patch +++ b/patches/server/0200-Configurable-hunger-starvation-damage.patch @@ -18,10 +18,10 @@ index 65421cfff05c0493f5fef1bdff03172c9e33f33e..63584faeec4e5013be7a377e3203ec16 this.tickTimer = 0; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 18f06ee01a3d20d51eac9d96a20af523a04a1c08..59cee8f525b3158d1c69c10b8e1460ccb254c7f5 100644 +index d3f73582dc2d732710ce6f6a2ca6a7f2353afe8e..cfda7bc71e1dc74636fdf57aa897c50bb0382535 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2386,4 +2386,9 @@ public class PurpurWorldConfig { +@@ -2522,4 +2522,9 @@ 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); } diff --git a/patches/server/0207-Summoner-API.patch b/patches/server/0207-Summoner-API.patch index 8727599b2b..0bdd5dc593 100644 --- a/patches/server/0207-Summoner-API.patch +++ b/patches/server/0207-Summoner-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Summoner API 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 ff5d6f437b880ab0aa5897089694a620be7eacca..dd328a4514ef3638a44442797cbc616dbaef1f72 100644 +index 7d181c78b22b7ad03674df6ab7288a2215aa3708..849a2aec719c8755409668fd6a7c4899eff4f882 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java @@ -64,6 +64,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { @@ -16,7 +16,7 @@ index ff5d6f437b880ab0aa5897089694a620be7eacca..dd328a4514ef3638a44442797cbc616d public IronGolem(EntityType type, Level world) { super(type, world); -@@ -90,6 +91,15 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -95,6 +96,15 @@ public class IronGolem extends AbstractGolem implements NeutralMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.ironGolemTakeDamageFromWater; } @@ -32,7 +32,7 @@ index ff5d6f437b880ab0aa5897089694a620be7eacca..dd328a4514ef3638a44442797cbc616d // Purpur end @Override -@@ -175,6 +185,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -180,6 +190,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); nbt.putBoolean("PlayerCreated", this.isPlayerCreated()); @@ -40,7 +40,7 @@ index ff5d6f437b880ab0aa5897089694a620be7eacca..dd328a4514ef3638a44442797cbc616d this.addPersistentAngerSaveData(nbt); } -@@ -182,6 +193,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -187,6 +198,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { public void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); this.setPlayerCreated(nbt.getBoolean("PlayerCreated")); @@ -49,7 +49,7 @@ index ff5d6f437b880ab0aa5897089694a620be7eacca..dd328a4514ef3638a44442797cbc616d } 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 9581dccfd671d89d296d3b07fb45a0234d110395..1e646078c4522aaad4e298172af6972a940cdf5c 100644 +index 5695cdb6a621d24a3795220a66ea94dfa1dbba52..4a33a9a439ca7f9bdb40ea15a721a30f6028f14a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java @@ -49,6 +49,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @@ -60,7 +60,7 @@ index 9581dccfd671d89d296d3b07fb45a0234d110395..1e646078c4522aaad4e298172af6972a public SnowGolem(EntityType type, Level world) { super(type, world); -@@ -69,6 +70,15 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -74,6 +75,15 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.snowGolemMaxHealth); } @@ -76,7 +76,7 @@ index 9581dccfd671d89d296d3b07fb45a0234d110395..1e646078c4522aaad4e298172af6972a // Purpur end @Override -@@ -98,6 +108,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -103,6 +113,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); nbt.putBoolean("Pumpkin", this.hasPumpkin()); @@ -84,7 +84,7 @@ index 9581dccfd671d89d296d3b07fb45a0234d110395..1e646078c4522aaad4e298172af6972a } @Override -@@ -106,6 +117,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -111,6 +122,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM if (nbt.contains("Pumpkin")) { this.setPumpkin(nbt.getBoolean("Pumpkin")); } @@ -93,7 +93,7 @@ index 9581dccfd671d89d296d3b07fb45a0234d110395..1e646078c4522aaad4e298172af6972a } diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 5ef45fe1dac1df779727f9c441f7e6515185e507..46b8886b6b17fa145db42aeb380f22ec0ae99ec0 100644 +index d7d9500b0c10b5091910610651bcf85524b67a47..4778a33cef472b959aa645e6cd495204d3c8975f 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -86,6 +86,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -104,7 +104,7 @@ index 5ef45fe1dac1df779727f9c441f7e6515185e507..46b8886b6b17fa145db42aeb380f22ec // Paper start private boolean canPortal = false; -@@ -223,6 +224,15 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -228,6 +229,15 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob public boolean isSensitiveToWater() { return this.level.purpurConfig.witherTakeDamageFromWater; } @@ -120,7 +120,7 @@ index 5ef45fe1dac1df779727f9c441f7e6515185e507..46b8886b6b17fa145db42aeb380f22ec // Purpur end @Override -@@ -251,6 +261,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -256,6 +266,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); nbt.putInt("Invul", this.getInvulnerableTicks()); @@ -128,7 +128,7 @@ index 5ef45fe1dac1df779727f9c441f7e6515185e507..46b8886b6b17fa145db42aeb380f22ec } @Override -@@ -260,6 +271,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -265,6 +276,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob if (this.hasCustomName()) { this.bossEvent.setName(this.getDisplayName()); } diff --git a/patches/server/0210-Silk-touchable-budding-amethyst.patch b/patches/server/0210-Silk-touchable-budding-amethyst.patch index 1ff10d2018..e1a87a80f5 100644 --- a/patches/server/0210-Silk-touchable-budding-amethyst.patch +++ b/patches/server/0210-Silk-touchable-budding-amethyst.patch @@ -24,7 +24,7 @@ index 02fc3ede12eadbf72e26e31b1c475c7f5b2ad73a..2288e727929ffb3a3bca138fb0289408 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0077e4e3f5dbf1a5a692f5cbeeb8e72b8a737070..301e2afd4ed73ebcf6996a2baec52d462d972d0f 100644 +index 5f8c3bb92cb1a43a2d74698c2801e8f79a0279f0..f31ea8c7e3354d890c593c2c1f10578d9b3748ed 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -691,6 +691,11 @@ public class PurpurWorldConfig { @@ -39,7 +39,7 @@ index 0077e4e3f5dbf1a5a692f5cbeeb8e72b8a737070..301e2afd4ed73ebcf6996a2baec52d46 public boolean chestOpenWithBlockOnTop = false; private void chestSettings() { chestOpenWithBlockOnTop = getBoolean("blocks.chest.open-with-solid-block-on-top", chestOpenWithBlockOnTop); -@@ -2545,3 +2550,4 @@ public class PurpurWorldConfig { +@@ -2681,3 +2686,4 @@ public class PurpurWorldConfig { hungerStarvationDamage = (float) getDouble("hunger.starvation-damage", hungerStarvationDamage); } } diff --git a/patches/server/0213-Config-to-disable-Enderman-teleport-on-projectile-hi.patch b/patches/server/0213-Config-to-disable-Enderman-teleport-on-projectile-hi.patch index d8e57e2a4b..4514ccf438 100644 --- a/patches/server/0213-Config-to-disable-Enderman-teleport-on-projectile-hi.patch +++ b/patches/server/0213-Config-to-disable-Enderman-teleport-on-projectile-hi.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Config to disable Enderman teleport on projectile hit 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 fa2d6b478ed420e36622a0bde48131661d483d8b..a20b888ba856b8c588af5cad5c2d72874f3aeaea 100644 +index eb1f02840ae230f9195d72d0ece9553bf72bba3f..1426d3ab3731f849cf88ed1b5e60b694c572ad71 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -406,7 +406,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -411,7 +411,7 @@ public class EnderMan extends Monster implements NeutralMob { return false; - } else if (getRider() != null) { return super.hurt(source, amount); // Purpur - no teleporting on damage + } else if (getRider() != null && this.isControllable()) { return super.hurt(source, amount); // Purpur - no teleporting on damage } else if (org.purpurmc.purpur.PurpurConfig.endermanShortHeight && source == DamageSource.IN_WALL) { return false; // Purpur - no suffocation damage if short height - } else if (source instanceof IndirectEntityDamageSource) { + } else if (source instanceof IndirectEntityDamageSource && !(this.level.purpurConfig.endermanIgnoreProjectiles && source.getDirectEntity() instanceof net.minecraft.world.entity.projectile.Projectile)) { // Purpur @@ -18,10 +18,10 @@ index fa2d6b478ed420e36622a0bde48131661d483d8b..a20b888ba856b8c588af5cad5c2d7287 boolean flag; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1075358dba79c3e4a7593ed4bb5506a41126a68f..a60b0799765cd2cb06cb958aad49f81c5c4b39e5 100644 +index 4d8cd5f5235b15627b10f3dabb9df65cb55a5834..00d62e7008a2faa65c11d6c8419f79c62224fd1d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1261,6 +1261,7 @@ public class PurpurWorldConfig { +@@ -1290,6 +1290,7 @@ public class PurpurWorldConfig { public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; public boolean endermanIgnorePlayerDragonHead = false; public boolean endermanDisableStareAggro = false; @@ -29,7 +29,7 @@ index 1075358dba79c3e4a7593ed4bb5506a41126a68f..a60b0799765cd2cb06cb958aad49f81c private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -1282,6 +1283,7 @@ public class PurpurWorldConfig { +@@ -1312,6 +1313,7 @@ public class PurpurWorldConfig { endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); endermanIgnorePlayerDragonHead = getBoolean("mobs.enderman.ignore-players-wearing-dragon-head", endermanIgnorePlayerDragonHead); endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); diff --git a/patches/server/0215-Config-to-prevent-horses-from-standing-with-riders.patch b/patches/server/0215-Config-to-prevent-horses-from-standing-with-riders.patch index d12d1d66a0..e4c93740b0 100644 --- a/patches/server/0215-Config-to-prevent-horses-from-standing-with-riders.patch +++ b/patches/server/0215-Config-to-prevent-horses-from-standing-with-riders.patch @@ -20,10 +20,10 @@ index 0be0c81f2b0a58eba75eb8559f78d8a58014d0ae..f7088aaf65ee5725e928845a63485211 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e61687112a49037c9b0c1677e09bb76ed24c02bb..c29c2eefb2dab541691f88f315fdea88343a0a96 100644 +index 55f4ff90bd2f9f8138a9a352dd40dfbd1ee98073..9694150ed4832169ed12f8e95cf2d87ada688978 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1459,6 +1459,7 @@ public class PurpurWorldConfig { +@@ -1507,6 +1507,7 @@ public class PurpurWorldConfig { public double horseMovementSpeedMax = 0.3375D; public int horseBreedingTicks = 6000; public boolean horseTakeDamageFromWater = false; @@ -31,7 +31,7 @@ index e61687112a49037c9b0c1677e09bb76ed24c02bb..c29c2eefb2dab541691f88f315fdea88 private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -1476,6 +1477,7 @@ public class PurpurWorldConfig { +@@ -1524,6 +1525,7 @@ public class PurpurWorldConfig { horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); horseTakeDamageFromWater = getBoolean("mobs.horse.takes-damage-from-water", horseTakeDamageFromWater); diff --git a/patches/server/0218-Customizeable-Zombie-Villager-curing-times.patch b/patches/server/0218-Customizeable-Zombie-Villager-curing-times.patch index 1dd5af9fc5..3e01ad25f9 100644 --- a/patches/server/0218-Customizeable-Zombie-Villager-curing-times.patch +++ b/patches/server/0218-Customizeable-Zombie-Villager-curing-times.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Customizeable Zombie Villager curing times diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index 96e5d1210e27b0bca7a354366e5c805709ae4fec..c6ba41c2b4cc96bc97ed2e2220c0f3fa4f31dbe3 100644 +index 92d527081abd35acc646f66a0714f2dc01706dfe..02763379210a45a83b34c6acd6cb37c536e5ba36 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -209,7 +209,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -214,7 +214,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { } if (!this.level.isClientSide) { @@ -18,10 +18,10 @@ index 96e5d1210e27b0bca7a354366e5c805709ae4fec..c6ba41c2b4cc96bc97ed2e2220c0f3fa this.gameEvent(GameEvent.MOB_INTERACT, this.eyeBlockPosition()); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8462308f580c6f9b07e5eb48f309fd912966c0d9..56e0b447409edf09bd495fa48f64ef0ff2b67ed6 100644 +index 51f82229af375f2cc9605fe33c912c2dec129ed7..f6657d08d19d8617b439097779b56c9f3c5c36c5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2534,6 +2534,8 @@ public class PurpurWorldConfig { +@@ -2667,6 +2667,8 @@ public class PurpurWorldConfig { public double zombieVillagerJockeyChance = 0.05D; public boolean zombieVillagerJockeyTryExistingChickens = true; public boolean zombieVillagerTakeDamageFromWater = false; @@ -30,7 +30,7 @@ index 8462308f580c6f9b07e5eb48f309fd912966c0d9..56e0b447409edf09bd495fa48f64ef0f private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -2548,6 +2550,8 @@ public class PurpurWorldConfig { +@@ -2682,6 +2684,8 @@ public class PurpurWorldConfig { zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); zombieVillagerTakeDamageFromWater = getBoolean("mobs.zombie_villager.takes-damage-from-water", zombieVillagerTakeDamageFromWater); diff --git a/patches/server/0220-Toggle-for-Wither-s-spawn-sound.patch b/patches/server/0220-Toggle-for-Wither-s-spawn-sound.patch index 20f3bf0c9f..c6b3b2b9c3 100644 --- a/patches/server/0220-Toggle-for-Wither-s-spawn-sound.patch +++ b/patches/server/0220-Toggle-for-Wither-s-spawn-sound.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Toggle for Wither's spawn sound diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 46b8886b6b17fa145db42aeb380f22ec0ae99ec0..1cab4c037c99babf4e35480de7ffc02be0c28583 100644 +index 4778a33cef472b959aa645e6cd495204d3c8975f..e30d8bfb4269e872c20a9bf91348dd3685a9332c 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -414,7 +414,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -419,7 +419,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } // CraftBukkit end @@ -18,10 +18,10 @@ index 46b8886b6b17fa145db42aeb380f22ec0ae99ec0..1cab4c037c99babf4e35480de7ffc02b // this.world.globalLevelEvent(1023, new BlockPosition(this), 0); //int viewDistance = ((ServerLevel) this.level).getCraftServer().getViewDistance() * 16; // Paper - updated to use worlds actual view distance incase we have to uncomment this due to removal of player view distance API diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7e94407fa58ae86f48b27a3bbe2c04e33eebecf9..09eda8b4da4e4a51277e71f53ae5db855b2d7f04 100644 +index a49e363d975ac3a239e984c16f6a06250a1c3d40..fb68e14c61ce224453ddbf9d59dc676f001739f6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2389,6 +2389,7 @@ public class PurpurWorldConfig { +@@ -2512,6 +2512,7 @@ public class PurpurWorldConfig { public boolean witherTakeDamageFromWater = false; public boolean witherCanRideVehicles = false; public float witherExplosionRadius = 1.0F; @@ -29,7 +29,7 @@ index 7e94407fa58ae86f48b27a3bbe2c04e33eebecf9..09eda8b4da4e4a51277e71f53ae5db85 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2409,6 +2410,7 @@ public class PurpurWorldConfig { +@@ -2533,6 +2534,7 @@ public class PurpurWorldConfig { witherTakeDamageFromWater = getBoolean("mobs.wither.takes-damage-from-water", witherTakeDamageFromWater); witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); witherExplosionRadius = (float) getDouble("mobs.wither.explosion-radius", witherExplosionRadius); diff --git a/patches/server/0223-Conduit-behavior-configuration.patch b/patches/server/0223-Conduit-behavior-configuration.patch index b650a18b78..0ff3800cc8 100644 --- a/patches/server/0223-Conduit-behavior-configuration.patch +++ b/patches/server/0223-Conduit-behavior-configuration.patch @@ -44,10 +44,10 @@ index 96b6e914441ee1faa059aa5ddcf77ffb74e76ae9..31af7d8111e73169d3e02aa52799a018 } CraftEventFactory.blockDamage = null; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8f8a8d00fe47a9dc0248c27122212de4e7b3fab3..3f281e92a63dc69b25e19d93757d652bef5df0c5 100644 +index 02d090b33eae57d6c0996f61626acd7438ded7cb..4eb2347ecc0e4ed730a114ce75df860b493313a5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2595,5 +2595,28 @@ public class PurpurWorldConfig { +@@ -2731,5 +2731,28 @@ public class PurpurWorldConfig { private void hungerSettings() { hungerStarvationDamage = (float) getDouble("hunger.starvation-damage", hungerStarvationDamage); } diff --git a/patches/server/0224-Cauldron-fill-chances.patch b/patches/server/0224-Cauldron-fill-chances.patch index c856dc041a..e69ea30ea6 100644 --- a/patches/server/0224-Cauldron-fill-chances.patch +++ b/patches/server/0224-Cauldron-fill-chances.patch @@ -18,10 +18,10 @@ index dbae4f3b56d0290c6d28b9beaaa3b459754d43e3..676184c48c3abd8e2fb9a04ae3e165dc @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3f281e92a63dc69b25e19d93757d652bef5df0c5..b8cf6e9037184d5945887748fb9fbfc8bcbc0f2a 100644 +index 4eb2347ecc0e4ed730a114ce75df860b493313a5..c71b53a9f9456f666c7ad73737a4adfd6da92da8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2618,5 +2618,12 @@ public class PurpurWorldConfig { +@@ -2754,5 +2754,12 @@ public class PurpurWorldConfig { }); conduitBlocks = conduitBlockList.toArray(Block[]::new); } diff --git a/patches/server/0226-Shulker-change-color-with-dye.patch b/patches/server/0226-Shulker-change-color-with-dye.patch index 403a478fcc..e8a0119b91 100644 --- a/patches/server/0226-Shulker-change-color-with-dye.patch +++ b/patches/server/0226-Shulker-change-color-with-dye.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Shulker change color with dye 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 ec7c5f638573ee331112d91cdfaa8511801c6891..e9f4a1de40ab4d7a82d4f222b4aba0aaaef05c88 100644 +index edaa34c6c2c65df77c696b4654e64bcf37a3ff20..e63a27abef4b9aab0c2afbb92da994e8a11ac14a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -22,6 +22,8 @@ import net.minecraft.sounds.SoundSource; @@ -26,7 +26,7 @@ index ec7c5f638573ee331112d91cdfaa8511801c6891..e9f4a1de40ab4d7a82d4f222b4aba0aa import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; -@@ -112,6 +116,19 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -117,6 +121,19 @@ public class Shulker extends AbstractGolem implements Enemy { public boolean isSensitiveToWater() { return this.level.purpurConfig.shulkerTakeDamageFromWater; } @@ -47,10 +47,10 @@ index ec7c5f638573ee331112d91cdfaa8511801c6891..e9f4a1de40ab4d7a82d4f222b4aba0aa @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a6909960d14de6c0ecea4f47902d73def5441ffa..8d63f5a8100792946d898a1caa715e34631d16d0 100644 +index 6c9fb5443821fd7f3ae7a8a4fc8352ab8d998f40..cc8d3cb84a0b5a852845b75467d64861721b7ae4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2008,6 +2008,7 @@ public class PurpurWorldConfig { +@@ -2097,6 +2097,7 @@ public class PurpurWorldConfig { public double shulkerSpawnFromBulletNearbyRange = 8.0D; public String shulkerSpawnFromBulletNearbyEquation = "(nearby - 1) / 5.0"; public boolean shulkerSpawnFromBulletRandomColor = false; @@ -58,7 +58,7 @@ index a6909960d14de6c0ecea4f47902d73def5441ffa..8d63f5a8100792946d898a1caa715e34 private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -2023,6 +2024,7 @@ public class PurpurWorldConfig { +@@ -2113,6 +2114,7 @@ public class PurpurWorldConfig { shulkerSpawnFromBulletNearbyRange = getDouble("mobs.shulker.spawn-from-bullet.nearby-range", shulkerSpawnFromBulletNearbyRange); shulkerSpawnFromBulletNearbyEquation = getString("mobs.shulker.spawn-from-bullet.nearby-equation", shulkerSpawnFromBulletNearbyEquation); shulkerSpawnFromBulletRandomColor = getBoolean("mobs.shulker.spawn-from-bullet.random-color", shulkerSpawnFromBulletRandomColor); diff --git a/patches/server/0232-Dolphins-naturally-aggressive-to-players-chance.patch b/patches/server/0232-Dolphins-naturally-aggressive-to-players-chance.patch index d956078c42..fe7556fa46 100644 --- a/patches/server/0232-Dolphins-naturally-aggressive-to-players-chance.patch +++ b/patches/server/0232-Dolphins-naturally-aggressive-to-players-chance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dolphins naturally aggressive to players chance 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 49e5a753aae7d72102ee700f3d8309f2f488cc12..022441af276cd9facba1ee4013d9d367db26711d 100644 +index 2dba75b221022b1f6d0d68813c992bc796d499c5..8a5230611e4a9835f1b8b21cf09a7054da76feb9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java @@ -75,6 +75,7 @@ public class Dolphin extends WaterAnimal { @@ -16,7 +16,7 @@ index 49e5a753aae7d72102ee700f3d8309f2f488cc12..022441af276cd9facba1ee4013d9d367 public Dolphin(EntityType type, Level world) { super(type, world); -@@ -165,6 +166,7 @@ public class Dolphin extends WaterAnimal { +@@ -170,6 +171,7 @@ public class Dolphin extends WaterAnimal { public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { this.setAirSupply(this.getMaxAirSupply()); this.setXRot(0.0F); @@ -24,7 +24,7 @@ index 49e5a753aae7d72102ee700f3d8309f2f488cc12..022441af276cd9facba1ee4013d9d367 return super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityNbt); } -@@ -235,18 +237,20 @@ public class Dolphin extends WaterAnimal { +@@ -240,18 +242,20 @@ public class Dolphin extends WaterAnimal { this.goalSelector.addGoal(0, new BreathAirGoal(this)); this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -47,18 +47,18 @@ index 49e5a753aae7d72102ee700f3d8309f2f488cc12..022441af276cd9facba1ee4013d9d367 public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e777d8fe1e503547763de30706655896767349ae..d0daf9143e941e9f658b5e14145adc1f3af91150 100644 +index 4a6f833c483cde70307417b54e6cf85d68703fee..aa4ea8ffd71f67c3e7c66cd3ce2f7ed37fc7b1e2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1175,6 +1175,7 @@ public class PurpurWorldConfig { +@@ -1196,6 +1196,7 @@ public class PurpurWorldConfig { public double dolphinMaxHealth = 10.0D; public boolean dolphinDisableTreasureSearching = false; public boolean dolphinTakeDamageFromWater = false; + public double dolphinNaturallyAggressiveToPlayersChance = 0.0D; private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); - dolphinSpitCooldown = getInt("mobs.dolphin.spit.cooldown", dolphinSpitCooldown); -@@ -1188,6 +1189,7 @@ public class PurpurWorldConfig { + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); +@@ -1210,6 +1211,7 @@ public class PurpurWorldConfig { dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); dolphinTakeDamageFromWater = getBoolean("mobs.dolphin.takes-damage-from-water", dolphinTakeDamageFromWater); diff --git a/patches/server/0233-Cows-naturally-aggressive-to-players-chance.patch b/patches/server/0233-Cows-naturally-aggressive-to-players-chance.patch index c44cb2cd96..26b1211270 100644 --- a/patches/server/0233-Cows-naturally-aggressive-to-players-chance.patch +++ b/patches/server/0233-Cows-naturally-aggressive-to-players-chance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cows naturally aggressive to players chance 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 7042b95e92520c5e152af0fa71a553122ec814df..bbd210f8779138b225ce886b3917ca9ccbcbcf60 100644 +index 00eec3f51e62858e7b85b3340e76bf66bfd4370f..90e48fed68fab8e5e9f43bbeffd3a42a2ee51807 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.craftbukkit.inventory.CraftItemStack; @@ -16,7 +16,7 @@ index 7042b95e92520c5e152af0fa71a553122ec814df..bbd210f8779138b225ce886b3917ca9c public Cow(EntityType type, Level world) { super(type, world); -@@ -56,6 +57,7 @@ public class Cow extends Animal { +@@ -61,6 +62,7 @@ public class Cow extends Animal { @Override public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); @@ -24,7 +24,7 @@ index 7042b95e92520c5e152af0fa71a553122ec814df..bbd210f8779138b225ce886b3917ca9c } @Override -@@ -67,6 +69,12 @@ public class Cow extends Animal { +@@ -72,6 +74,12 @@ public class Cow extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.cowTakeDamageFromWater; } @@ -37,7 +37,7 @@ index 7042b95e92520c5e152af0fa71a553122ec814df..bbd210f8779138b225ce886b3917ca9c // Purpur end @Override -@@ -74,6 +82,7 @@ public class Cow extends Animal { +@@ -79,6 +87,7 @@ public class Cow extends Animal { this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.goalSelector.addGoal(1, new PanicGoal(this, 2.0D)); @@ -45,7 +45,7 @@ index 7042b95e92520c5e152af0fa71a553122ec814df..bbd210f8779138b225ce886b3917ca9c this.goalSelector.addGoal(2, new BreedGoal(this, 1.0D)); if (level.purpurConfig.cowFeedMushrooms > 0) this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT, Blocks.RED_MUSHROOM.asItem(), Blocks.BROWN_MUSHROOM.asItem()), false)); else // Purpur this.goalSelector.addGoal(3, new TemptGoal(this, 1.25D, Ingredient.of(Items.WHEAT), false)); -@@ -81,10 +90,11 @@ public class Cow extends Animal { +@@ -86,10 +95,11 @@ public class Cow 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)); @@ -59,10 +59,10 @@ index 7042b95e92520c5e152af0fa71a553122ec814df..bbd210f8779138b225ce886b3917ca9c @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d0daf9143e941e9f658b5e14145adc1f3af91150..61cfb6a37139fc2a9ce11f4bd0d557f490afc6d9 100644 +index aa4ea8ffd71f67c3e7c66cd3ce2f7ed37fc7b1e2..f5a03a25b5e90c9f42795923da83841be27dc6ee 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1128,7 +1128,14 @@ public class PurpurWorldConfig { +@@ -1145,7 +1145,14 @@ public class PurpurWorldConfig { public int cowFeedMushrooms = 0; public int cowBreedingTicks = 6000; public boolean cowTakeDamageFromWater = false; @@ -76,8 +76,8 @@ index d0daf9143e941e9f658b5e14145adc1f3af91150..61cfb6a37139fc2a9ce11f4bd0d557f4 + } cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); - if (PurpurConfig.version < 10) { -@@ -1140,6 +1147,8 @@ public class PurpurWorldConfig { + cowControllable = getBoolean("mobs.cow.controllable", cowControllable); +@@ -1158,6 +1165,8 @@ public class PurpurWorldConfig { 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); diff --git a/patches/server/0234-Option-for-beds-to-explode-on-villager-sleep.patch b/patches/server/0234-Option-for-beds-to-explode-on-villager-sleep.patch index 3eacef107c..6a2689e096 100644 --- a/patches/server/0234-Option-for-beds-to-explode-on-villager-sleep.patch +++ b/patches/server/0234-Option-for-beds-to-explode-on-villager-sleep.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option for beds to explode on villager sleep 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 31ca5ddf748313f7d6cdee906d13e8dcb616875d..5e9d901d5fd545b94dd04267b90b3f32a3dd881c 100644 +index 21f9384b647264c72675889fdda2613031a57c5d..6930429c5ac77768d4ef7ad2dc38778b475a8bd4 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -1169,6 +1169,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1174,6 +1174,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public void startSleeping(BlockPos pos) { @@ -22,7 +22,7 @@ index 31ca5ddf748313f7d6cdee906d13e8dcb616875d..5e9d901d5fd545b94dd04267b90b3f32 this.brain.setMemory(MemoryModuleType.LAST_SLEPT, this.level.getGameTime()); // CraftBukkit - decompile error this.brain.eraseMemory(MemoryModuleType.WALK_TARGET); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 61cfb6a37139fc2a9ce11f4bd0d557f490afc6d9..873b0f9f300990b856d5e4d441053cf4f8d81dda 100644 +index f5a03a25b5e90c9f42795923da83841be27dc6ee..588c0beee5a48757f3d98774b06bddca4741855c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -702,11 +702,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0235-Halloween-options-and-optimizations.patch b/patches/server/0235-Halloween-options-and-optimizations.patch index 8ca4c0fc79..95601dbd7b 100644 --- a/patches/server/0235-Halloween-options-and-optimizations.patch +++ b/patches/server/0235-Halloween-options-and-optimizations.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Halloween options and optimizations 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 c1a2bfb521ba72e4d1b29aa3e0c72e0c28a652be..3babc327941ba56549fa0e44f020c932efbfc6bd 100644 +index f6b289cea5962ef56e5c9daa1122989bbabde00e..062b99e9586199454c3948d37aa66f866b8b644d 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -312,7 +312,7 @@ public class Bat extends AmbientCreature { +@@ -317,7 +317,7 @@ public class Bat extends AmbientCreature { int i = world.getMaxLocalRawBrightness(pos); byte b0 = 4; @@ -17,7 +17,7 @@ index c1a2bfb521ba72e4d1b29aa3e0c72e0c28a652be..3babc327941ba56549fa0e44f020c932 b0 = 7; } else if (random.nextBoolean()) { return false; -@@ -326,6 +326,7 @@ public class Bat extends AmbientCreature { +@@ -331,6 +331,7 @@ public class Bat extends AmbientCreature { private static boolean isSpookySeason = false; private static final int ONE_HOUR = 20 * 60 * 60; private static int lastSpookyCheck = -ONE_HOUR; @@ -43,10 +43,10 @@ index 193622015c6d3dbff787061e13fa098a287bce0c..1c48ac2f0b6cfee952ce5e76d7d88603 this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } 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 9a4806baab135128f30ad9be4369bbe1e543c6df..e4fd49d3c3f4be6d165dd1e1f6bb24a069bc634a 100644 +index e4e357af439c9a02b8013ce3349ff582495ee80e..dd879f7f879d42546e84cb2eebcea7c2f6acf8cd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -570,11 +570,7 @@ public class Zombie extends Monster { +@@ -575,11 +575,7 @@ public class Zombie extends Monster { } if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { @@ -60,10 +60,10 @@ index 9a4806baab135128f30ad9be4369bbe1e543c6df..e4fd49d3c3f4be6d165dd1e1f6bb24a0 this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 873b0f9f300990b856d5e4d441053cf4f8d81dda..30fbcf65e7d31bccce1e86a32df527557de05496 100644 +index 588c0beee5a48757f3d98774b06bddca4741855c..d8bb4d769f5e8ef8fa7d7a38a7cf07c1bf319faf 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1479,6 +1479,13 @@ public class PurpurWorldConfig { +@@ -1525,6 +1525,13 @@ public class PurpurWorldConfig { guardianTakeDamageFromWater = getBoolean("mobs.guardian.takes-damage-from-water", guardianTakeDamageFromWater); } @@ -76,4 +76,4 @@ index 873b0f9f300990b856d5e4d441053cf4f8d81dda..30fbcf65e7d31bccce1e86a32df52755 + public boolean hoglinRidable = false; public boolean hoglinRidableInWater = false; - public double hoglinMaxHealth = 40.0D; + public boolean hoglinControllable = true; diff --git a/patches/server/0240-Add-option-to-disable-zombie-villagers-cure.patch b/patches/server/0240-Add-option-to-disable-zombie-villagers-cure.patch index 021d90bc75..b247345f03 100644 --- a/patches/server/0240-Add-option-to-disable-zombie-villagers-cure.patch +++ b/patches/server/0240-Add-option-to-disable-zombie-villagers-cure.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add option to disable zombie villagers cure diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index c6ba41c2b4cc96bc97ed2e2220c0f3fa4f31dbe3..22a5d2f0de4bdd4432d1beff840f448a30985188 100644 +index 02763379210a45a83b34c6acd6cb37c536e5ba36..1e3969d0a462e5e8270128dbc22a4d09683f3da9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -203,7 +203,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -208,7 +208,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.is(Items.GOLDEN_APPLE)) { @@ -18,10 +18,10 @@ index c6ba41c2b4cc96bc97ed2e2220c0f3fa4f31dbe3..22a5d2f0de4bdd4432d1beff840f448a itemstack.shrink(1); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f8d5d37afe4ce8f884b927447b0875f3b6e08171..410f15b1aa575cba890ec1ed66476cc4fa03797e 100644 +index b1a823bb8c6740d9a37c42eb49dc618c62414505..4cf4e592436ffb8b2f984ea5d3908056261b063e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2598,6 +2598,7 @@ public class PurpurWorldConfig { +@@ -2731,6 +2731,7 @@ public class PurpurWorldConfig { public boolean zombieVillagerTakeDamageFromWater = false; public int zombieVillagerCuringTimeMin = 3600; public int zombieVillagerCuringTimeMax = 6000; @@ -29,7 +29,7 @@ index f8d5d37afe4ce8f884b927447b0875f3b6e08171..410f15b1aa575cba890ec1ed66476cc4 private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -2614,6 +2615,7 @@ public class PurpurWorldConfig { +@@ -2748,6 +2749,7 @@ public class PurpurWorldConfig { zombieVillagerTakeDamageFromWater = getBoolean("mobs.zombie_villager.takes-damage-from-water", zombieVillagerTakeDamageFromWater); zombieVillagerCuringTimeMin = getInt("mobs.zombie_villager.curing_time.min", zombieVillagerCuringTimeMin); zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); diff --git a/patches/server/0244-Mobs-always-drop-experience.patch b/patches/server/0244-Mobs-always-drop-experience.patch index 68efb5ad40..bc60a4ee19 100644 --- a/patches/server/0244-Mobs-always-drop-experience.patch +++ b/patches/server/0244-Mobs-always-drop-experience.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Mobs always drop experience diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 2feec97ffe62cfe063085e3767937e8af122ee95..c2cf01d43d6550b8231d85a55bed861497bcded2 100644 +index 32211dfd76c03d1eb59929b93eb69cc6adde81ac..7b0afbfaaddf19997d5282473e8c1c60339dd201 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -48,6 +48,11 @@ public class GlowSquid extends Squid { +@@ -53,6 +53,11 @@ public class GlowSquid extends Squid { public boolean isSensitiveToWater() { return this.level.purpurConfig.glowSquidTakeDamageFromWater; } @@ -21,10 +21,10 @@ index 2feec97ffe62cfe063085e3767937e8af122ee95..c2cf01d43d6550b8231d85a55bed8614 @Override 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 3babc327941ba56549fa0e44f020c932efbfc6bd..a9500cd104ff3c948480eefa15508a75066bc01a 100644 +index 062b99e9586199454c3948d37aa66f866b8b644d..9f8153496f173de6b8ee26ae765255a1ba2b3073 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -103,6 +103,11 @@ public class Bat extends AmbientCreature { +@@ -108,6 +108,11 @@ public class Bat extends AmbientCreature { public boolean isSensitiveToWater() { return this.level.purpurConfig.batTakeDamageFromWater; } @@ -37,10 +37,10 @@ index 3babc327941ba56549fa0e44f020c932efbfc6bd..a9500cd104ff3c948480eefa15508a75 @Override 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 9fa2359662079f406ca6204fa06d5dbfefec49d5..350863ed11b62600dc88324283637a01162acd21 100644 +index c69d0cc9ed74e4e06465aebff07b6b50c227fb28..e2a3a3e2722c7c5fae232ce30538ccb5fa663b7d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -225,6 +225,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -230,6 +230,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { public boolean isSensitiveToWater() { return this.level.purpurConfig.beeTakeDamageFromWater; } @@ -53,10 +53,10 @@ index 9fa2359662079f406ca6204fa06d5dbfefec49d5..350863ed11b62600dc88324283637a01 @Override 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 c4ffe4517d7b8c521b5a11555eeffbe3c7a1801d..a66c307a2eb7b7d854cb57907fa2a6ff36cf2254 100644 +index 5759ff40254ff7238e7b874822f743fbf0d33e81..94d5c14b777d8fd822b501b297acedf58cc56937 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -155,6 +155,11 @@ public class Cat extends TamableAnimal { +@@ -160,6 +160,11 @@ public class Cat extends TamableAnimal { public boolean isSensitiveToWater() { return this.level.purpurConfig.catTakeDamageFromWater; } @@ -69,10 +69,10 @@ index c4ffe4517d7b8c521b5a11555eeffbe3c7a1801d..a66c307a2eb7b7d854cb57907fa2a6ff public ResourceLocation getResourceLocation() { diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index eb3678d3a23d1eddc09b8032564235e101d56166..4470805d41ae81edda708ecc022ab8700b20b3b3 100644 +index e00f65973622b476e27ae7de5fa8dc8c42ef4af7..01b2c874f209969a15acbe617260395f3df1dd0b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -80,6 +80,11 @@ public class Chicken extends Animal { +@@ -85,6 +85,11 @@ public class Chicken extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.chickenTakeDamageFromWater; } @@ -85,10 +85,10 @@ index eb3678d3a23d1eddc09b8032564235e101d56166..4470805d41ae81edda708ecc022ab870 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Cod.java b/src/main/java/net/minecraft/world/entity/animal/Cod.java -index 82fdce04fe3867016d1b5e24df52a550e08dfa39..1383b6ef25bea8c6215d5c6253bebeb30c4c383a 100644 +index 5b79d821e8b55c8876eadcbe811a2c0584e7e02b..de70208403ef6c6c9c82ca4c1fd3b641a40bb45c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cod.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cod.java -@@ -33,6 +33,11 @@ public class Cod extends AbstractSchoolingFish { +@@ -38,6 +38,11 @@ public class Cod extends AbstractSchoolingFish { public boolean isSensitiveToWater() { return this.level.purpurConfig.codTakeDamageFromWater; } @@ -101,10 +101,10 @@ index 82fdce04fe3867016d1b5e24df52a550e08dfa39..1383b6ef25bea8c6215d5c6253bebeb3 @Override 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 bbd210f8779138b225ce886b3917ca9ccbcbcf60..c3c1f7b66b9c4a7373fe73cfa4cf5d12eb3c3f45 100644 +index 90e48fed68fab8e5e9f43bbeffd3a42a2ee51807..1c112e79a97648219022dc4586bfa5202fdcecab 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -75,6 +75,11 @@ public class Cow extends Animal { +@@ -80,6 +80,11 @@ public class Cow extends Animal { this.isNaturallyAggressiveToPlayers = level.purpurConfig.cowNaturallyAggressiveToPlayersChance > 0.0D && random.nextDouble() <= level.purpurConfig.cowNaturallyAggressiveToPlayersChance; return super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityNbt); } @@ -117,10 +117,10 @@ index bbd210f8779138b225ce886b3917ca9ccbcbcf60..c3c1f7b66b9c4a7373fe73cfa4cf5d12 @Override 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 022441af276cd9facba1ee4013d9d367db26711d..d94cac06a53bd36145cb025fdddc2ce94d9dd297 100644 +index 8a5230611e4a9835f1b8b21cf09a7054da76feb9..57cbdf3c0493f11f7f13d0bcb74b3b30252d81a8 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java +++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java -@@ -159,6 +159,11 @@ public class Dolphin extends WaterAnimal { +@@ -164,6 +164,11 @@ public class Dolphin extends WaterAnimal { public boolean isSensitiveToWater() { return this.level.purpurConfig.dolphinTakeDamageFromWater; } @@ -133,10 +133,10 @@ index 022441af276cd9facba1ee4013d9d367db26711d..d94cac06a53bd36145cb025fdddc2ce9 @Nullable 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 f409215a99d6d0d2eda35173d1be762b11e96441..6e2c4e833a02f854fe0809a8168722576b680ab1 100644 +index 8cdae4fb31b517015e6b154a68b2c37fe76fa127..0d3528f24b4184f7553bd1b91279f3a014a47601 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -187,6 +187,11 @@ public class Fox extends Animal { +@@ -192,6 +192,11 @@ public class Fox extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.foxTakeDamageFromWater; } @@ -149,10 +149,10 @@ index f409215a99d6d0d2eda35173d1be762b11e96441..6e2c4e833a02f854fe0809a816872257 @Override 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 dd328a4514ef3638a44442797cbc616dbaef1f72..6c3edf731d5a74c7b16cf9d2caea8b9fa80b6457 100644 +index 849a2aec719c8755409668fd6a7c4899eff4f882..2deccf88c56fc9cccc9abaabe1a516cc8f4eb2eb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -100,6 +100,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -105,6 +105,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { public void setSummoner(@Nullable UUID summoner) { this.summoner = summoner; } @@ -165,10 +165,10 @@ index dd328a4514ef3638a44442797cbc616dbaef1f72..6c3edf731d5a74c7b16cf9d2caea8b9f @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 467e5bc4e9262fc331bb88f02e3b26f9f6bec72d..16b4b6a382db7c81eb19771a4fa0cc3ae73c3645 100644 +index 4cfba039e940d8354a04a5ba761a5c0e10e695a3..00cfd89f175206b3bb29d3a954f8564077a7115b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -90,6 +90,11 @@ public class MushroomCow extends Cow implements Shearable { +@@ -95,6 +95,11 @@ public class MushroomCow extends Cow implements Shearable { public boolean isSensitiveToWater() { return this.level.purpurConfig.mooshroomTakeDamageFromWater; } @@ -181,10 +181,10 @@ index 467e5bc4e9262fc331bb88f02e3b26f9f6bec72d..16b4b6a382db7c81eb19771a4fa0cc3a @Override 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 97d4caad92a2b54daff12e4909bc7b041ba99094..cbbfcfa93af935ec07986f85948f416d53494085 100644 +index 23a7b7c259f00ca44616af2e97a360a63cb55120..7e32d81e451442b3e90817ef402446dcd2c706dd 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -@@ -94,6 +94,11 @@ public class Ocelot extends Animal { +@@ -99,6 +99,11 @@ public class Ocelot extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.ocelotTakeDamageFromWater; } @@ -197,10 +197,10 @@ index 97d4caad92a2b54daff12e4909bc7b041ba99094..cbbfcfa93af935ec07986f85948f416d public boolean isTrusting() { 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 3ac330e769689b55063c6b5e3ccc2e362f2a4c49..5a5af987d23dcccd81c04d57d701f4cc7bc2df80 100644 +index 44302e7f86c45fb10dd9770e214e66512328d821..821f6bd8a672f375ae14b9117e7b4ba96e2591dd 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -142,6 +142,11 @@ public class Panda extends Animal { +@@ -147,6 +147,11 @@ public class Panda extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.pandaTakeDamageFromWater; } @@ -213,10 +213,10 @@ index 3ac330e769689b55063c6b5e3ccc2e362f2a4c49..5a5af987d23dcccd81c04d57d701f4cc @Override 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 bb9717d1b2039469aae26e0eb9a4304bff4ae7af..59037dc3a888b763c4fb6e5b06d0e5a0e1f3c935 100644 +index d68bb48cf703a3ed0bf843d5c0ab9caad4727214..8f2a2a4af0725d1436514108c7200c92effa12a9 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -@@ -196,6 +196,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { +@@ -201,6 +201,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { public boolean isSensitiveToWater() { return this.level.purpurConfig.parrotTakeDamageFromWater; } @@ -229,10 +229,10 @@ index bb9717d1b2039469aae26e0eb9a4304bff4ae7af..59037dc3a888b763c4fb6e5b06d0e5a0 @Nullable diff --git a/src/main/java/net/minecraft/world/entity/animal/Pig.java b/src/main/java/net/minecraft/world/entity/animal/Pig.java -index 5aa57ce71c401e47c361dc8b74ac241a1732aede..77228b09f64c4d8eec4333316272f00284e12c5c 100644 +index 479570e9f98404ac01ef08ce81ef200340cea602..333989ee2a52bd4f1a55ecebce4f657905d3d767 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pig.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pig.java -@@ -89,6 +89,11 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { +@@ -94,6 +94,11 @@ public class Pig extends Animal implements ItemSteerable, Saddleable { public boolean isSensitiveToWater() { return this.level.purpurConfig.pigTakeDamageFromWater; } @@ -245,10 +245,10 @@ index 5aa57ce71c401e47c361dc8b74ac241a1732aede..77228b09f64c4d8eec4333316272f002 @Override 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 288de9480635f0df718596ff73e69101e164fc61..a4b8a4ef043be8961ea35c3fb8a9512d9ac286c3 100644 +index 753642045e2594d67887a766a8b6c477767a6edb..2632adf6c6a7eac0387d0838b7e5f04a8971f7aa 100644 --- a/src/main/java/net/minecraft/world/entity/animal/PolarBear.java +++ b/src/main/java/net/minecraft/world/entity/animal/PolarBear.java -@@ -125,6 +125,11 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -130,6 +130,11 @@ public class PolarBear extends Animal implements NeutralMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.polarBearTakeDamageFromWater; } @@ -261,10 +261,10 @@ index 288de9480635f0df718596ff73e69101e164fc61..a4b8a4ef043be8961ea35c3fb8a9512d @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -index 5d8a01df7b86f1a23b30ed67b27ebde7d800c08c..c3ca62ab107cc7b8f7ac6f7d8ad88d33f13cceaa 100644 +index 413f2491aad79409f4ac0759f7b649f1367376a5..59186e53cabefba3da4ed7356f8bf6e390da8e36 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java +++ b/src/main/java/net/minecraft/world/entity/animal/Pufferfish.java -@@ -65,6 +65,11 @@ public class Pufferfish extends AbstractFish { +@@ -70,6 +70,11 @@ public class Pufferfish extends AbstractFish { public boolean isSensitiveToWater() { return this.level.purpurConfig.pufferfishTakeDamageFromWater; } @@ -277,10 +277,10 @@ index 5d8a01df7b86f1a23b30ed67b27ebde7d800c08c..c3ca62ab107cc7b8f7ac6f7d8ad88d33 @Override 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 59286f143f7ffcaf4da5bad4a0990cf437d53fdb..4f040854399cdd6c91f824e06f98a56eb65313d4 100644 +index b3c258b2e46433645b706b5a43012094f584abe0..a1e19e1acdecbab1b1c955617b800cdf493fd507 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -145,6 +145,11 @@ public class Rabbit extends Animal { +@@ -150,6 +150,11 @@ public class Rabbit extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.rabbitTakeDamageFromWater; } @@ -293,10 +293,10 @@ index 59286f143f7ffcaf4da5bad4a0990cf437d53fdb..4f040854399cdd6c91f824e06f98a56e // CraftBukkit start - code from constructor diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index 04bf6f321e39821bae2d1871c54e304c9dcaf179..9f77369189b1a528806e6b4d6eff897a39b8b78f 100644 +index 16171814bab7fbc0c177323cc5f8b026c8ebbcd4..bd1e964c7899a54a2c39afe0691a7573cfe35fc1 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -@@ -33,6 +33,11 @@ public class Salmon extends AbstractSchoolingFish { +@@ -38,6 +38,11 @@ public class Salmon extends AbstractSchoolingFish { public boolean isSensitiveToWater() { return this.level.purpurConfig.salmonTakeDamageFromWater; } @@ -309,10 +309,10 @@ index 04bf6f321e39821bae2d1871c54e304c9dcaf179..9f77369189b1a528806e6b4d6eff897a @Override 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 1d80303243da8a945c3866291e3a1a196245a0db..860e03111b29f9178a1cd361357985308a39d254 100644 +index 4fa8e4a298a98b2a41ef7572d21ed50aa06e2c7e..17d1a0b43b2d155535cf2483af4ba9dd09700c83 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -141,6 +141,11 @@ public class Sheep extends Animal implements Shearable { +@@ -146,6 +146,11 @@ public class Sheep extends Animal implements Shearable { public boolean isSensitiveToWater() { return this.level.purpurConfig.sheepTakeDamageFromWater; } @@ -325,10 +325,10 @@ index 1d80303243da8a945c3866291e3a1a196245a0db..860e03111b29f9178a1cd36135798530 @Override 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 1e646078c4522aaad4e298172af6972a940cdf5c..d60cb629586e6eccfcd79b1b2e4da119550497f3 100644 +index 4a33a9a439ca7f9bdb40ea15a721a30f6028f14a..2396c175433fdfe23b0db0e3303d82c34309a540 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -79,6 +79,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -84,6 +84,11 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM public void setSummoner(@Nullable java.util.UUID summoner) { this.summoner = summoner; } @@ -341,10 +341,10 @@ index 1e646078c4522aaad4e298172af6972a940cdf5c..d60cb629586e6eccfcd79b1b2e4da119 @Override 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 7397d04b3fabca1f6d32adc571f56d2ad8fed751..764513425732d177d7c5a42b8d6aafe58061a88c 100644 +index 49c043efc3f88ea9c5339e5011de80d2d42906c5..5c68c5992a2f52eef71fff4018f70fe4d74fa8fb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -96,6 +96,11 @@ public class Squid extends WaterAnimal { +@@ -101,6 +101,11 @@ public class Squid extends WaterAnimal { public boolean isSensitiveToWater() { return this.level.purpurConfig.squidTakeDamageFromWater; } @@ -357,10 +357,10 @@ index 7397d04b3fabca1f6d32adc571f56d2ad8fed751..764513425732d177d7c5a42b8d6aafe5 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -index cbe50aacc9279d147d25775b3855c3a8caff2b9c..c2bb2fbb07d5bf6b3ad3d74baf594705d0c7170d 100644 +index 5b8a6b2705c6f317e4e48e7a9183b140489c355a..9585b8a3d6d0777df3fb4debfd9d7a776b035bad 100644 --- a/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java +++ b/src/main/java/net/minecraft/world/entity/animal/TropicalFish.java -@@ -70,6 +70,11 @@ public class TropicalFish extends AbstractSchoolingFish { +@@ -75,6 +75,11 @@ public class TropicalFish extends AbstractSchoolingFish { public boolean isSensitiveToWater() { return this.level.purpurConfig.tropicalFishTakeDamageFromWater; } @@ -373,10 +373,10 @@ index cbe50aacc9279d147d25775b3855c3a8caff2b9c..c2bb2fbb07d5bf6b3ad3d74baf594705 public static String getPredefinedName(int 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 29749815ef26c7e956d6e773037554893e82284d..b39d942c874dac91833e860ea4f6980f2c23d9f9 100644 +index e8e317c822a73b98545f3cf6e36aa284937e8c5b..1b14e6fed7669651741344a18c81da6207c9e924 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -111,6 +111,11 @@ public class Turtle extends Animal { +@@ -116,6 +116,11 @@ public class Turtle extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.turtleTakeDamageFromWater; } @@ -389,10 +389,10 @@ index 29749815ef26c7e956d6e773037554893e82284d..b39d942c874dac91833e860ea4f6980f public void setHomePos(BlockPos pos) { 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 713fe8ac2293fe2e60c5834b3d6fd2f12f3bc391..3dba3f0bd9c2264a2ea703745f90fbaa5f64a0c2 100644 +index 63d3f68326386532b027c077c35629c75508bfc4..f3ff018e61eb89d581744d5dfae00f4d5bcd4949 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -204,6 +204,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -209,6 +209,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.wolfTakeDamageFromWater; } @@ -405,10 +405,10 @@ index 713fe8ac2293fe2e60c5834b3d6fd2f12f3bc391..3dba3f0bd9c2264a2ea703745f90fbaa @Override 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 8e6c2aadd7f69dc6bd585242bf4e23540e75ceeb..a41e32fb0c2545c2ddb6651881ff05fea0b6c3a3 100644 +index ad5d46c85c64e03b89a7fff452fa276ad9dcd255..23574a0ff9015c4a95b02e5ca83a4395abca3be0 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 -@@ -121,6 +121,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -126,6 +126,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { public boolean isSensitiveToWater() { return this.level.purpurConfig.axolotlTakeDamageFromWater; } @@ -421,10 +421,10 @@ index 8e6c2aadd7f69dc6bd585242bf4e23540e75ceeb..a41e32fb0c2545c2ddb6651881ff05fe @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 7b5782c3a7026b24aea2bc8be5d23b5d16b86fd4..5b9f3a53a521b71eeb1bf8a49aece57347a8b226 100644 +index dbfb6aa819d7bb86c60268daf9cf0b5a5200c5b1..3c4a53e569257a6f73fec9af2be25a422cc9e8b6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -99,6 +99,11 @@ public class Goat extends Animal { +@@ -104,6 +104,11 @@ public class Goat extends Animal { public boolean isSensitiveToWater() { return this.level.purpurConfig.goatTakeDamageFromWater; } @@ -469,10 +469,10 @@ index 16755249c4700fa59f704b7c88e3490d2ce3fc48..17a6ddaaa474ee4ac9dd77c19a471bfb @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 7656c933a835f15c40e75851e7a2348bdef4010e..6010683137f3ca1fb2cc3893608402ecfef57676 100644 +index 6fffb293e1ca06a9f07fe30928e4dd8fff1b0a15..b0b8239ef3d9124343c8351320801d8f427773fd 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -137,6 +137,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -142,6 +142,11 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.llamaTakeDamageFromWater; } @@ -517,10 +517,10 @@ index 5683136ec1ebf6671092a635f026decfc6d7733d..2b8c7458775363813eb6f996a008284f public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -index 201944f01609ad4e386504cab4b36bd57d298aac..95b99f4d46b18cbb8142e11fbfb4189172c2e7a0 100644 +index b3d9ab9c40fff58cdcb64e1499ee70d5442d121d..4e2fa045449783824adeeeca260c83ae81abd9f4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -67,6 +67,11 @@ public class TraderLlama extends Llama { +@@ -72,6 +72,11 @@ public class TraderLlama extends Llama { public boolean isSensitiveToWater() { return this.level.purpurConfig.traderLlamaTakeDamageFromWater; } @@ -549,10 +549,10 @@ index 88da7a365c28e2d097d0a7bff30ea1acd4c7d5dc..74de599bfe2ee696848b3f74392b696f public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 1cab4c037c99babf4e35480de7ffc02be0c28583..f4ff9b299eef9029069ee0af6ae290b9a4d65465 100644 +index e30d8bfb4269e872c20a9bf91348dd3685a9332c..ce09b56dc4681eef7fb7f6563125889da016fc07 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -233,6 +233,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -238,6 +238,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob public void setSummoner(@Nullable java.util.UUID summoner) { this.summoner = summoner; } @@ -565,10 +565,10 @@ index 1cab4c037c99babf4e35480de7ffc02be0c28583..f4ff9b299eef9029069ee0af6ae290b9 @Override 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 e9d540984b9bb7fab563b81f6d28aa85c90402e9..c253066d6c77e22b90605296ad1ca78235945c05 100644 +index 8cebcc68839a510fee3ff085e9308f6d351f51e8..e5652d9348c866027768418f2fd401c40a4e6df0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Blaze.java +++ b/src/main/java/net/minecraft/world/entity/monster/Blaze.java -@@ -72,6 +72,11 @@ public class Blaze extends Monster { +@@ -77,6 +77,11 @@ public class Blaze extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.blazeMaxHealth); } @@ -581,10 +581,10 @@ index e9d540984b9bb7fab563b81f6d28aa85c90402e9..c253066d6c77e22b90605296ad1ca782 @Override 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 58d11054bd62338a8b6959663420d286abcfd499..1ec0363cfb69df8ad19c9d37b7e5b3771b87c4e6 100644 +index 5347ba12f2a07601c9f044081e5e6ce6472c4a2a..0ac5264a16c9121c0f6233e83c426199784fe4c9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java +++ b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -@@ -48,6 +48,11 @@ public class CaveSpider extends Spider { +@@ -53,6 +53,11 @@ public class CaveSpider extends Spider { public boolean isSensitiveToWater() { return this.level.purpurConfig.caveSpiderTakeDamageFromWater; } @@ -597,10 +597,10 @@ index 58d11054bd62338a8b6959663420d286abcfd499..1ec0363cfb69df8ad19c9d37b7e5b377 @Override 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 35cbd013b1d58bb5fd1480922c2bd4307edfb6c3..2cfac37e9fdd4600da63071931f82110c9570e30 100644 +index b0e5146f0cf33f8fbc97c4c51edee252ad06e6a9..7a8726f69c2e5b4447793770e69118c9174ce3f0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -160,6 +160,11 @@ public class Creeper extends Monster implements PowerableMob { +@@ -165,6 +165,11 @@ public class Creeper extends Monster implements PowerableMob { } return super.dropAllDeathLoot(damagesource); } @@ -613,10 +613,10 @@ index 35cbd013b1d58bb5fd1480922c2bd4307edfb6c3..2cfac37e9fdd4600da63071931f82110 @Override 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 a592fb29097232d5d9c6e6d946fb326fd901f27b..8c9ef5113e66d07c62e66a54c5a87b07793f5e3d 100644 +index 699d4f1a60bb15a04dddbce6486ce10abd417a87..a8f13ac43b45a53ccd15fb222cd60ff6f59f0fed 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -110,6 +110,11 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -115,6 +115,11 @@ public class Drowned extends Zombie implements RangedAttackMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.drownedTakeDamageFromWater; } @@ -629,10 +629,10 @@ index a592fb29097232d5d9c6e6d946fb326fd901f27b..8c9ef5113e66d07c62e66a54c5a87b07 @Override 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 0aa4d8e506462cfe6fb69414a30cc5eb441d7ad1..00dee17c95479ca93d8bfcc861ae1808ba189379 100644 +index 2800594fea055d75268531d8ad3fef99721e5ca1..fc2b6dc1818d439905e90dc6d738c3cf19f632cd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -@@ -50,6 +50,11 @@ public class ElderGuardian extends Guardian { +@@ -55,6 +55,11 @@ public class ElderGuardian extends Guardian { public boolean isSensitiveToWater() { return this.level.purpurConfig.elderGuardianTakeDamageFromWater; } @@ -645,10 +645,10 @@ index 0aa4d8e506462cfe6fb69414a30cc5eb441d7ad1..00dee17c95479ca93d8bfcc861ae1808 public static AttributeSupplier.Builder createAttributes() { 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 a20b888ba856b8c588af5cad5c2d72874f3aeaea..8d795d1bc125973caf0818224ea359c3cd3388a8 100644 +index 1426d3ab3731f849cf88ed1b5e60b694c572ad71..e99751a15f0fef67525b8b392c3893561d240b2b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -103,6 +103,11 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -108,6 +108,11 @@ public class EnderMan extends Monster implements NeutralMob { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.endermanMaxHealth); } @@ -661,10 +661,10 @@ index a20b888ba856b8c588af5cad5c2d72874f3aeaea..8d795d1bc125973caf0818224ea359c3 @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 fce4cf14f5275d7e996db60dab83d4351cc08796..9187ad4c8647dba1c6bdddfbcd9a403314e8e612 100644 +index 3e0f287695fd3def8ed9967d921e141b7ff8bc47..faf16f91cfa689f2bb56fd9ac91aae76056c623b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java +++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -@@ -65,6 +65,11 @@ public class Endermite extends Monster { +@@ -70,6 +70,11 @@ public class Endermite extends Monster { public void setPlayerSpawned(boolean playerSpawned) { this.isPlayerSpawned = playerSpawned; } @@ -677,10 +677,10 @@ index fce4cf14f5275d7e996db60dab83d4351cc08796..9187ad4c8647dba1c6bdddfbcd9a4033 @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 1f5aa1980b49b36900d515dc57696a4bc22267d0..35739fb765aa5663f984727980c03d3621bfd7f9 100644 +index 1cc0ea14210c35392a722b05dcf1a5c25e7b5cf0..2302690385bd72e9b03fa878b83023731666adf8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -67,6 +67,11 @@ public class Evoker extends SpellcasterIllager { +@@ -72,6 +72,11 @@ public class Evoker extends SpellcasterIllager { public boolean isSensitiveToWater() { return this.level.purpurConfig.evokerTakeDamageFromWater; } @@ -693,10 +693,10 @@ index 1f5aa1980b49b36900d515dc57696a4bc22267d0..35739fb765aa5663f984727980c03d36 @Override 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 753227f5eb9c944e708aafb5247202aa5e4e729f..cad77f2fb10c5bb6840654d4d4a9c04bec7a69e7 100644 +index a8a1ae1689f03d9fb78395e3786d1bd7f5fcd569..130c83e7161a555ba34270a45be38cad5e8e4e5d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java -@@ -81,6 +81,11 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -86,6 +86,11 @@ public class Ghast extends FlyingMob implements Enemy { public boolean isSensitiveToWater() { return this.level.purpurConfig.ghastTakeDamageFromWater; } @@ -709,10 +709,10 @@ index 753227f5eb9c944e708aafb5247202aa5e4e729f..cad77f2fb10c5bb6840654d4d4a9c04b @Override 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 c2d39a4a4d0bddc38accd31772a2fd7926b6e08c..bd4595344cbe83e47d0373b0b060e80226630908 100644 +index dd7ad09e8b154347290126fe8f7e195c1b348ec9..5cd408392e8afbbb58a4b808af92631c59ab9339 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Giant.java +++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java -@@ -107,6 +107,11 @@ public class Giant extends Monster { +@@ -112,6 +112,11 @@ public class Giant extends Monster { public boolean isSensitiveToWater() { return this.level.purpurConfig.giantTakeDamageFromWater; } @@ -725,10 +725,10 @@ index c2d39a4a4d0bddc38accd31772a2fd7926b6e08c..bd4595344cbe83e47d0373b0b060e802 @Override 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 0675c018bbf4eb0947350737b41de4e56410520e..af22b186a8a8fc5713e59e07d84c3a69900c57d6 100644 +index 070c707132929c2a68acca44e7c7f3ae3eb1f984..69ce21cae8e097a6028eba7b842d325784f457af 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -@@ -97,6 +97,11 @@ public class Guardian extends Monster { +@@ -102,6 +102,11 @@ public class Guardian extends Monster { public boolean isSensitiveToWater() { return this.level.purpurConfig.guardianTakeDamageFromWater; } @@ -741,10 +741,10 @@ index 0675c018bbf4eb0947350737b41de4e56410520e..af22b186a8a8fc5713e59e07d84c3a69 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index ca5683e9b0b4aad3827fe6d00198da8e5b6a69ec..dd7723ce39d3ec4178bf7ce25e5dcd2c487131ab 100644 +index e394b6427329f48a85a277eeb8336b12499525ee..ec9f8d5d4b1a7f1aa995cb69ac6169935e6b95e0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java -@@ -63,6 +63,11 @@ public class Husk extends Zombie { +@@ -68,6 +68,11 @@ public class Husk extends Zombie { public boolean isSensitiveToWater() { return this.level.purpurConfig.huskTakeDamageFromWater; } @@ -757,10 +757,10 @@ index ca5683e9b0b4aad3827fe6d00198da8e5b6a69ec..dd7723ce39d3ec4178bf7ce25e5dcd2c public static boolean checkHuskSpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 322058dbb82888c70bf770bed58356dc07839188..e8cb4bd5081d1435ab1eeffe559f224dda23a560 100644 +index 5b6a61fb2b44ea4dec4767958a2abe57d758646e..4d50e9d2b9b06cae0fe135cc91a90919e82a26cb 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -81,6 +81,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -86,6 +86,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.illusionerTakeDamageFromWater; } @@ -773,10 +773,10 @@ index 322058dbb82888c70bf770bed58356dc07839188..e8cb4bd5081d1435ab1eeffe559f224d @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index 87a316e4ae92990800bc1b91ed44ce184b4cd933..e086b048ff4aec4220d95a42688691a58986ac0e 100644 +index d5039d0a5e8a35cb7ce43792c909b21d1b0986f2..23e702df207e931e3f41e6094495aea397f32321 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -@@ -67,6 +67,11 @@ public class MagmaCube extends Slime { +@@ -72,6 +72,11 @@ public class MagmaCube extends Slime { public boolean isSensitiveToWater() { return this.level.purpurConfig.magmaCubeTakeDamageFromWater; } @@ -789,10 +789,10 @@ index 87a316e4ae92990800bc1b91ed44ce184b4cd933..e086b048ff4aec4220d95a42688691a5 public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index 5979d8446ae71e365aa65871808af00fae316016..bf6adaa28142019182b984b3b6aa244af970d6f5 100644 +index 2ae234b2e3f7949fe852d341a5feca9a6738075a..9d83b50d43edc7bfd857daab7be90558d86ca334 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -152,6 +152,11 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -157,6 +157,11 @@ public class Phantom extends FlyingMob implements Enemy { public boolean isSensitiveToWater() { return this.level.purpurConfig.phantomTakeDamageFromWater; } @@ -805,10 +805,10 @@ index 5979d8446ae71e365aa65871808af00fae316016..bf6adaa28142019182b984b3b6aa244a @Override 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 4c98060c8edcd58bcd957dee54ebba5d03b62546..fcbf94d9670f7572078a98c7fe122dd4f6301eeb 100644 +index 37c88972668a4102701c868cc9f7b18b89f5db14..0d2e4e1a459d350ac2ee377206c163d8f46cebf7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -83,6 +83,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve +@@ -88,6 +88,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve public boolean isSensitiveToWater() { return this.level.purpurConfig.pillagerTakeDamageFromWater; } @@ -821,10 +821,10 @@ index 4c98060c8edcd58bcd957dee54ebba5d03b62546..fcbf94d9670f7572078a98c7fe122dd4 @Override 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 83e835a63bc0a211b75db82f4f4eb28874eea9ec..5f093bb263f6a4d761f4c922b6a2b0f10e9c1ce4 100644 +index a2893e4a64c339af31641e9d8150b163fb79962c..c306852f78c6e8fdda54e63d6e6d8bc79a70760a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -95,6 +95,11 @@ public class Ravager extends Raider { +@@ -100,6 +100,11 @@ public class Ravager extends Raider { public boolean isSensitiveToWater() { return this.level.purpurConfig.ravagerTakeDamageFromWater; } @@ -837,10 +837,10 @@ index 83e835a63bc0a211b75db82f4f4eb28874eea9ec..5f093bb263f6a4d761f4c922b6a2b0f1 @Override 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 e9f4a1de40ab4d7a82d4f222b4aba0aaaef05c88..1494420fb86d78b7e8accf16354003f85506b2ff 100644 +index e63a27abef4b9aab0c2afbb92da994e8a11ac14a..f4cbe31de73fbc3828e0b57cefd969e200d600cb 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -129,6 +129,11 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -134,6 +134,11 @@ public class Shulker extends AbstractGolem implements Enemy { } return super.mobInteract(player, hand); } @@ -853,10 +853,10 @@ index e9f4a1de40ab4d7a82d4f222b4aba0aaaef05c88..1494420fb86d78b7e8accf16354003f8 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -index 2b77a73c0042a40fcc464dd878a3b9114138b3ff..bb23b232d6b9a950adaf87f83448059d845bf72e 100644 +index e1407131ceab66bee552e1e2bc8f4ccef668ef62..cd6926096d8daeed159479e06436d9bebfb80026 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -@@ -61,6 +61,11 @@ public class Silverfish extends Monster { +@@ -66,6 +66,11 @@ public class Silverfish extends Monster { public boolean isSensitiveToWater() { return this.level.purpurConfig.silverfishTakeDamageFromWater; } @@ -869,10 +869,10 @@ index 2b77a73c0042a40fcc464dd878a3b9114138b3ff..bb23b232d6b9a950adaf87f83448059d @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -index 9350d4dd73db4227ab65452083d1cec73fda9501..6a2340dd54d4a8b688444eb4621c58e0606e5283 100644 +index 8ce46cc00a01a678270e906078097aa717abdc41..51c548cd84bd83624fbff3f853a8050dc1e71ecd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java -@@ -45,6 +45,11 @@ public class Skeleton extends AbstractSkeleton { +@@ -50,6 +50,11 @@ public class Skeleton extends AbstractSkeleton { public boolean isSensitiveToWater() { return this.level.purpurConfig.skeletonTakeDamageFromWater; } @@ -885,10 +885,10 @@ index 9350d4dd73db4227ab65452083d1cec73fda9501..6a2340dd54d4a8b688444eb4621c58e0 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java -index b81cc912b036d1da491bf685139d169cd6055067..538479c14c064d51ccd6e10f021ffc8c5ca9c75f 100644 +index f8e39e7b4c5ab3a864a516a8937992874ff2d10a..b7c8ddc09a1761260919dbd3e49389104ce994e7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java -@@ -137,6 +137,11 @@ public class Slime extends Mob implements Enemy { +@@ -142,6 +142,11 @@ public class Slime extends Mob implements Enemy { public boolean isSensitiveToWater() { return this.level.purpurConfig.slimeTakeDamageFromWater; } @@ -901,10 +901,10 @@ index b81cc912b036d1da491bf685139d169cd6055067..538479c14c064d51ccd6e10f021ffc8c @Override 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 be6b7c91990c133f8ca1c9747f64119829888bbb..f85daf21ae3d77d2d56c131c6df9aa0715a306ca 100644 +index c66e85d865d0bd1018529636f0ef41d8a5aad890..177f9fe0d0a10e5d3644805751f2050fe984fde7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java -@@ -71,6 +71,11 @@ public class Spider extends Monster { +@@ -76,6 +76,11 @@ public class Spider extends Monster { public boolean isSensitiveToWater() { return this.level.purpurConfig.spiderTakeDamageFromWater; } @@ -917,10 +917,10 @@ index be6b7c91990c133f8ca1c9747f64119829888bbb..f85daf21ae3d77d2d56c131c6df9aa07 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Stray.java b/src/main/java/net/minecraft/world/entity/monster/Stray.java -index 9c556ee62a0eb09629d80dc5fc70347696dacd66..011d5e46fdd88c10bfbc0d54cf8016805d300703 100644 +index 4888502f99e0a9db246f9714a4d7534839bc5487..6f497991cfbb60462a9499d2c43260c6073e99e5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Stray.java +++ b/src/main/java/net/minecraft/world/entity/monster/Stray.java -@@ -41,6 +41,11 @@ public class Stray extends AbstractSkeleton { +@@ -46,6 +46,11 @@ public class Stray extends AbstractSkeleton { public boolean isSensitiveToWater() { return this.level.purpurConfig.strayTakeDamageFromWater; } @@ -933,10 +933,10 @@ index 9c556ee62a0eb09629d80dc5fc70347696dacd66..011d5e46fdd88c10bfbc0d54cf801680 public static boolean checkStraySpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 400afd587c6f9f52adf8d575d54b8dbe515b3144..01fc2567898f2c0f3b662ce1abf4d3829e76954a 100644 +index ead0c2c900fbfabef478b200e954d7388860249d..6058679371ec4e4f3b557ea818b625a475b0220b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -117,6 +117,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -122,6 +122,11 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { public int getPurpurBreedTime() { return this.level.purpurConfig.striderBreedingTicks; } @@ -949,10 +949,10 @@ index 400afd587c6f9f52adf8d575d54b8dbe515b3144..01fc2567898f2c0f3b662ce1abf4d382 public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, Random random) { 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 1606f15ee56383533b3e2bfca9cf00b63c7c474a..6b450486e50d95a65b3ef8d0521d14e391e63046 100644 +index 441357d9a74126a145293193eb02f24e26db3561..c8934f1b0fbac164ce110d44f7697e06834ca275 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -105,6 +105,11 @@ public class Vex extends Monster { +@@ -110,6 +110,11 @@ public class Vex extends Monster { public boolean isSensitiveToWater() { return this.level.purpurConfig.vexTakeDamageFromWater; } @@ -965,10 +965,10 @@ index 1606f15ee56383533b3e2bfca9cf00b63c7c474a..6b450486e50d95a65b3ef8d0521d14e3 @Override 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 9ce98a7682d648cf8ba9cb4892b67d764477fbc2..9c0af17c7732216e4c2e9f62fe4523dac0aea8c2 100644 +index 729eb8a30b35ef5c70be30b3141b9da5c74388f6..876964a73109bba22584d120fdfd0089bbadc975 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -79,6 +79,11 @@ public class Vindicator extends AbstractIllager { +@@ -84,6 +84,11 @@ public class Vindicator extends AbstractIllager { public boolean isSensitiveToWater() { return this.level.purpurConfig.vindicatorTakeDamageFromWater; } @@ -981,10 +981,10 @@ index 9ce98a7682d648cf8ba9cb4892b67d764477fbc2..9c0af17c7732216e4c2e9f62fe4523da @Override 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 263009d0d69e26b7eab6d387c67590511c9b8ff6..2f99cf8b232ea7f6000cf2897826fc18987b85ac 100644 +index d6ad32e3622164a35bea1237ec62745588f7f031..723e3961bc72a416b72867c11536eed09f93c267 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java -@@ -79,6 +79,11 @@ public class Witch extends Raider implements RangedAttackMob { +@@ -84,6 +84,11 @@ public class Witch extends Raider implements RangedAttackMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.witchTakeDamageFromWater; } @@ -997,10 +997,10 @@ index 263009d0d69e26b7eab6d387c67590511c9b8ff6..2f99cf8b232ea7f6000cf2897826fc18 @Override 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 2aa2d0cd277be59a99c3cd52f5265409913f359e..4368d7f1fd2517c5308247b17eb1b7f4e1151b80 100644 +index b2f1784e8a1b6afe4ba2a67f6d567869e96d4c3e..e26a1954593cf8de44421e4d3a6cc5680e828766 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -54,6 +54,11 @@ public class WitherSkeleton extends AbstractSkeleton { +@@ -59,6 +59,11 @@ public class WitherSkeleton extends AbstractSkeleton { public boolean isSensitiveToWater() { return this.level.purpurConfig.witherSkeletonTakeDamageFromWater; } @@ -1013,10 +1013,10 @@ index 2aa2d0cd277be59a99c3cd52f5265409913f359e..4368d7f1fd2517c5308247b17eb1b7f4 @Override 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 f96d891eeae384a210a7399a605d5d9cb0e3e591..cee685bf0d842ae0600aab2e1e4e372de3e9316d 100644 +index 9928af5318c1cc4676c5cf215840ce0f8baf9024..b99419b712b9af385988f1a1271b28f41e5a05a0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -88,6 +88,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -93,6 +93,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { public boolean isSensitiveToWater() { return this.level.purpurConfig.zoglinTakeDamageFromWater; } @@ -1029,10 +1029,10 @@ index f96d891eeae384a210a7399a605d5d9cb0e3e591..cee685bf0d842ae0600aab2e1e4e372d @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 e4fd49d3c3f4be6d165dd1e1f6bb24a069bc634a..f3dee40fecac114f5cfffe939d812baad354f8d9 100644 +index dd879f7f879d42546e84cb2eebcea7c2f6acf8cd..f2ac17f5e4f3f229131f844c1097bb006cb8cf57 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -137,6 +137,11 @@ public class Zombie extends Monster { +@@ -142,6 +142,11 @@ public class Zombie extends Monster { public boolean isSensitiveToWater() { return this.level.purpurConfig.zombieTakeDamageFromWater; } @@ -1045,10 +1045,10 @@ index e4fd49d3c3f4be6d165dd1e1f6bb24a069bc634a..f3dee40fecac114f5cfffe939d812baa @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index 22a5d2f0de4bdd4432d1beff840f448a30985188..d40fc6b38ca9b58ed1b0d9a2ed61f9a4f2a8be63 100644 +index 1e3969d0a462e5e8270128dbc22a4d09683f3da9..d656fc034212822df8cec3645b02dcfe0f7b9325 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -115,6 +115,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -120,6 +120,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { public boolean isSensitiveToWater() { return this.level.purpurConfig.zombieVillagerTakeDamageFromWater; } @@ -1061,10 +1061,10 @@ index 22a5d2f0de4bdd4432d1beff840f448a30985188..d40fc6b38ca9b58ed1b0d9a2ed61f9a4 @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 fd2828469badbc7936ea68c0bdd8d689c86146b6..3288e9bd8e9758d9f5137614aedd0fc73f1a3ea0 100644 +index ae53d716c25c1cf328231384595049536a50d1bd..7eb4e1e4f6c856657d9a844479fdee0087a96a0c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -94,6 +94,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -99,6 +99,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { public boolean isSensitiveToWater() { return this.level.purpurConfig.zombifiedPiglinTakeDamageFromWater; } @@ -1077,10 +1077,10 @@ index fd2828469badbc7936ea68c0bdd8d689c86146b6..3288e9bd8e9758d9f5137614aedd0fc7 @Override 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 1e2dc76ace2e283a4ba7b81e299c7506e4b684d1..1e71f81479a23117b684e07d4c754524731bdd2b 100644 +index 5ac9a41daee27b305a68a91b13a20a1a3f5264ab..dd41783a84876840d8d545bf6b527165b3c5b5ee 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 -@@ -92,6 +92,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -97,6 +97,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { public boolean isSensitiveToWater() { return this.level.purpurConfig.hoglinTakeDamageFromWater; } @@ -1093,10 +1093,10 @@ index 1e2dc76ace2e283a4ba7b81e299c7506e4b684d1..1e71f81479a23117b684e07d4c754524 @Override 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 8d85157acefb588091d96eaa0124049a7cfbe19c..25f4ade47476706d04dc9c93e26c9439cbf4d57a 100644 +index a28fad8627e5b95afe2b1ddb320e99f0b57ff158..63b147826766dc12b093196f2f946a473dc24022 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 -@@ -116,6 +116,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -121,6 +121,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento public boolean isSensitiveToWater() { return this.level.purpurConfig.piglinTakeDamageFromWater; } @@ -1109,10 +1109,10 @@ index 8d85157acefb588091d96eaa0124049a7cfbe19c..25f4ade47476706d04dc9c93e26c9439 @Override 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 d3a298734e4434d29b66e94fc6c299d34e0ad432..eb194daac43571a5eb6282c1465a695d4a040e21 100644 +index e0be095bdff6a9316812715f26772ef4e6e77495..faef3d8204d5d421a55c5dc40677eb9c12dc6774 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 -@@ -60,6 +60,11 @@ public class PiglinBrute extends AbstractPiglin { +@@ -65,6 +65,11 @@ public class PiglinBrute extends AbstractPiglin { public boolean isSensitiveToWater() { return this.level.purpurConfig.piglinBruteTakeDamageFromWater; } @@ -1125,10 +1125,10 @@ index d3a298734e4434d29b66e94fc6c299d34e0ad432..eb194daac43571a5eb6282c1465a695d public static AttributeSupplier.Builder createAttributes() { 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 5e9d901d5fd545b94dd04267b90b3f32a3dd881c..0141d4d2dfaacfbce174e82e2d7c1a9419c64982 100644 +index 6930429c5ac77768d4ef7ad2dc38778b475a8bd4..9755517f0c1d66db5bfd00946114fab5db6776d6 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -186,6 +186,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -191,6 +191,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean isSensitiveToWater() { return this.level.purpurConfig.villagerTakeDamageFromWater; } @@ -1141,10 +1141,10 @@ index 5e9d901d5fd545b94dd04267b90b3f32a3dd881c..0141d4d2dfaacfbce174e82e2d7c1a94 @Override diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 1a8df13b06b1ac5e5a7d63033b4a53261c779eda..8be025b735cea47ab3ce6c6b2aef052ef3e5cab0 100644 +index f3994e53af79a4c3bb327e43cf133a12c20662bf..2acf9de429b75acfe5953628ca503260d6a62656 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -92,6 +92,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -97,6 +97,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill public boolean isSensitiveToWater() { return this.level.purpurConfig.wanderingTraderTakeDamageFromWater; } @@ -1157,16 +1157,17 @@ index 1a8df13b06b1ac5e5a7d63033b4a53261c779eda..8be025b735cea47ab3ce6c6b2aef052e @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9a96293bf 100644 +index 9e255728e5d8602db3600bf4759266d8de253380..b030105bea31453a4cfd978c16d228ff3795f871 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1020,11 +1020,13 @@ public class PurpurWorldConfig { - public boolean axolotlRidable = false; +@@ -1021,12 +1021,14 @@ public class PurpurWorldConfig { + public boolean axolotlControllable = true; public double axolotlMaxHealth = 14.0D; public int axolotlBreedingTicks = 6000; + public boolean axolotlAlwaysDropExp = false; private void axolotlSettings() { axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); + axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); axolotlTakeDamageFromWater = getBoolean("mobs.axolotl.takes-damage-from-water", axolotlTakeDamageFromWater); @@ -1174,7 +1175,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean batRidable = false; -@@ -1039,6 +1041,7 @@ public class PurpurWorldConfig { +@@ -1042,6 +1044,7 @@ public class PurpurWorldConfig { public double batArmorToughness = 0.0D; public double batAttackKnockback = 0.0D; public boolean batTakeDamageFromWater = false; @@ -1182,7 +1183,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void batSettings() { batRidable = getBoolean("mobs.bat.ridable", batRidable); batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); -@@ -1050,6 +1053,7 @@ public class PurpurWorldConfig { +@@ -1054,6 +1057,7 @@ public class PurpurWorldConfig { } batMaxHealth = getDouble("mobs.bat.attributes.max_health", batMaxHealth); batTakeDamageFromWater = getBoolean("mobs.bat.takes-damage-from-water", batTakeDamageFromWater); @@ -1190,7 +1191,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean beeRidable = false; -@@ -1060,6 +1064,7 @@ public class PurpurWorldConfig { +@@ -1065,6 +1069,7 @@ public class PurpurWorldConfig { public boolean beeTakeDamageFromWater = false; public boolean beeCanWorkAtNight = false; public boolean beeCanWorkInRain = false; @@ -1198,7 +1199,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void beeSettings() { beeRidable = getBoolean("mobs.bee.ridable", beeRidable); beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); -@@ -1074,6 +1079,7 @@ public class PurpurWorldConfig { +@@ -1080,6 +1085,7 @@ public class PurpurWorldConfig { beeTakeDamageFromWater = getBoolean("mobs.bee.takes-damage-from-water", beeTakeDamageFromWater); beeCanWorkAtNight = getBoolean("mobs.bee.can-work-at-night", beeCanWorkAtNight); beeCanWorkInRain = getBoolean("mobs.bee.can-work-in-rain", beeCanWorkInRain); @@ -1206,15 +1207,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean blazeRidable = false; -@@ -1081,6 +1087,7 @@ public class PurpurWorldConfig { - public double blazeMaxY = 256D; +@@ -1088,6 +1094,7 @@ public class PurpurWorldConfig { + public double blazeMaxY = 320D; public double blazeMaxHealth = 20.0D; public boolean blazeTakeDamageFromWater = true; + public boolean blazeAlwaysDropExp = false; private void blazeSettings() { blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); -@@ -1092,6 +1099,7 @@ public class PurpurWorldConfig { +@@ -1100,6 +1107,7 @@ public class PurpurWorldConfig { } blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); blazeTakeDamageFromWater = getBoolean("mobs.blaze.takes-damage-from-water", blazeTakeDamageFromWater); @@ -1222,30 +1223,31 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean catRidable = false; -@@ -1103,6 +1111,7 @@ public class PurpurWorldConfig { - public int catSpawnVillageScanRange = 48; +@@ -1112,6 +1120,7 @@ public class PurpurWorldConfig { public int catBreedingTicks = 6000; + public DyeColor catDefaultCollarColor = DyeColor.RED; public boolean catTakeDamageFromWater = false; + public boolean catAlwaysDropExp = false; private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -1122,12 +1131,14 @@ public class PurpurWorldConfig { - catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); - catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); +@@ -1132,6 +1141,7 @@ public class PurpurWorldConfig { + catDefaultCollarColor = DyeColor.RED; + } catTakeDamageFromWater = getBoolean("mobs.cat.takes-damage-from-water", catTakeDamageFromWater); + catAlwaysDropExp = getBoolean("mobs.cat.always-drop-exp", catAlwaysDropExp); } public boolean caveSpiderRidable = false; - public boolean caveSpiderRidableInWater = false; +@@ -1139,6 +1149,7 @@ public class PurpurWorldConfig { + public boolean caveSpiderControllable = true; public double caveSpiderMaxHealth = 12.0D; public boolean caveSpiderTakeDamageFromWater = false; + public boolean caveSpiderAlwaysDropExp = false; private void caveSpiderSettings() { caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); -@@ -1138,6 +1149,7 @@ public class PurpurWorldConfig { +@@ -1150,6 +1161,7 @@ public class PurpurWorldConfig { } caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); caveSpiderTakeDamageFromWater = getBoolean("mobs.cave_spider.takes-damage-from-water", caveSpiderTakeDamageFromWater); @@ -1253,7 +1255,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean chickenRidable = false; -@@ -1146,6 +1158,7 @@ public class PurpurWorldConfig { +@@ -1159,6 +1171,7 @@ public class PurpurWorldConfig { public boolean chickenRetaliate = false; public int chickenBreedingTicks = 6000; public boolean chickenTakeDamageFromWater = false; @@ -1261,7 +1263,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -1158,11 +1171,13 @@ public class PurpurWorldConfig { +@@ -1172,12 +1185,14 @@ public class PurpurWorldConfig { chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); chickenTakeDamageFromWater = getBoolean("mobs.chicken.takes-damage-from-water", chickenTakeDamageFromWater); @@ -1269,13 +1271,14 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean codRidable = false; + public boolean codControllable = true; public double codMaxHealth = 3.0D; public boolean codTakeDamageFromWater = false; + public boolean codAlwaysDropExp = false; private void codSettings() { codRidable = getBoolean("mobs.cod.ridable", codRidable); - if (PurpurConfig.version < 10) { -@@ -1172,6 +1187,7 @@ public class PurpurWorldConfig { + codControllable = getBoolean("mobs.cod.controllable", codControllable); +@@ -1188,6 +1203,7 @@ public class PurpurWorldConfig { } codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); codTakeDamageFromWater = getBoolean("mobs.cod.takes-damage-from-water", codTakeDamageFromWater); @@ -1283,7 +1286,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean cowRidable = false; -@@ -1182,6 +1198,7 @@ public class PurpurWorldConfig { +@@ -1199,6 +1215,7 @@ public class PurpurWorldConfig { public boolean cowTakeDamageFromWater = false; public double cowNaturallyAggressiveToPlayersChance = 0.0D; public double cowNaturallyAggressiveToPlayersDamage = 2.0D; @@ -1291,7 +1294,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void cowSettings() { if (PurpurConfig.version < 22) { double oldValue = getDouble("mobs.cow.naturally-aggressive-to-players-chance", cowNaturallyAggressiveToPlayersChance); -@@ -1201,6 +1218,7 @@ public class PurpurWorldConfig { +@@ -1219,6 +1236,7 @@ public class PurpurWorldConfig { cowTakeDamageFromWater = getBoolean("mobs.cow.takes-damage-from-water", cowTakeDamageFromWater); cowNaturallyAggressiveToPlayersChance = getDouble("mobs.cow.naturally-aggressive-to-players.chance", cowNaturallyAggressiveToPlayersChance); cowNaturallyAggressiveToPlayersDamage = getDouble("mobs.cow.naturally-aggressive-to-players.damage", cowNaturallyAggressiveToPlayersDamage); @@ -1299,7 +1302,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean creeperRidable = false; -@@ -1212,6 +1230,7 @@ public class PurpurWorldConfig { +@@ -1231,6 +1249,7 @@ public class PurpurWorldConfig { public boolean creeperTakeDamageFromWater = false; public boolean creeperExplodeWhenKilled = false; public boolean creeperHealthRadius = false; @@ -1307,7 +1310,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -1227,6 +1246,7 @@ public class PurpurWorldConfig { +@@ -1247,6 +1266,7 @@ public class PurpurWorldConfig { creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); creeperExplodeWhenKilled = getBoolean("mobs.creeper.explode-when-killed", creeperExplodeWhenKilled); creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius); @@ -1315,15 +1318,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean dolphinRidable = false; -@@ -1237,6 +1257,7 @@ public class PurpurWorldConfig { +@@ -1258,6 +1278,7 @@ public class PurpurWorldConfig { public boolean dolphinDisableTreasureSearching = false; public boolean dolphinTakeDamageFromWater = false; public double dolphinNaturallyAggressiveToPlayersChance = 0.0D; + public boolean dolphinAlwaysDropExp = false; private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); - dolphinSpitCooldown = getInt("mobs.dolphin.spit.cooldown", dolphinSpitCooldown); -@@ -1251,6 +1272,7 @@ public class PurpurWorldConfig { + dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); +@@ -1273,6 +1294,7 @@ public class PurpurWorldConfig { 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); @@ -1331,7 +1334,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean donkeyRidableInWater = false; -@@ -1262,6 +1284,7 @@ public class PurpurWorldConfig { +@@ -1284,6 +1306,7 @@ public class PurpurWorldConfig { public double donkeyMovementSpeedMax = 0.175D; public int donkeyBreedingTicks = 6000; public boolean donkeyTakeDamageFromWater = false; @@ -1339,7 +1342,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void donkeySettings() { donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { -@@ -1279,6 +1302,7 @@ public class PurpurWorldConfig { +@@ -1301,6 +1324,7 @@ public class PurpurWorldConfig { donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); donkeyTakeDamageFromWater = getBoolean("mobs.donkey.takes-damage-from-water", donkeyTakeDamageFromWater); @@ -1347,7 +1350,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean drownedRidable = false; -@@ -1290,6 +1314,7 @@ public class PurpurWorldConfig { +@@ -1313,6 +1337,7 @@ public class PurpurWorldConfig { public boolean drownedJockeyTryExistingChickens = true; public boolean drownedTakeDamageFromWater = false; public boolean drownedBreakDoors = false; @@ -1355,7 +1358,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -1305,11 +1330,13 @@ public class PurpurWorldConfig { +@@ -1329,12 +1354,14 @@ public class PurpurWorldConfig { drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); drownedBreakDoors = getBoolean("mobs.drowned.can-break-doors", drownedBreakDoors); @@ -1363,13 +1366,14 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean elderGuardianRidable = false; + public boolean elderGuardianControllable = true; public double elderGuardianMaxHealth = 80.0D; public boolean elderGuardianTakeDamageFromWater = false; + public boolean elderGuardianAlwaysDropExp = false; private void elderGuardianSettings() { elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); - if (PurpurConfig.version < 10) { -@@ -1319,6 +1346,7 @@ public class PurpurWorldConfig { + elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); +@@ -1345,6 +1372,7 @@ public class PurpurWorldConfig { } elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); elderGuardianTakeDamageFromWater = getBoolean("mobs.elder_guardian.takes-damage-from-water", elderGuardianTakeDamageFromWater); @@ -1377,7 +1381,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean enderDragonRidable = false; -@@ -1361,6 +1389,7 @@ public class PurpurWorldConfig { +@@ -1390,6 +1418,7 @@ public class PurpurWorldConfig { public boolean endermanIgnorePlayerDragonHead = false; public boolean endermanDisableStareAggro = false; public boolean endermanIgnoreProjectiles = false; @@ -1385,7 +1389,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -1383,12 +1412,14 @@ public class PurpurWorldConfig { +@@ -1413,6 +1442,7 @@ public class PurpurWorldConfig { endermanIgnorePlayerDragonHead = getBoolean("mobs.enderman.ignore-players-wearing-dragon-head", endermanIgnorePlayerDragonHead); endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); endermanIgnoreProjectiles = getBoolean("mobs.enderman.ignore-projectiles", endermanIgnoreProjectiles); @@ -1393,14 +1397,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean endermiteRidable = false; - public boolean endermiteRidableInWater = false; +@@ -1420,6 +1450,7 @@ public class PurpurWorldConfig { + public boolean endermiteControllable = true; public double endermiteMaxHealth = 8.0D; public boolean endermiteTakeDamageFromWater = false; + public boolean endermiteAlwaysDropExp = false; private void endermiteSettings() { endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); -@@ -1399,6 +1430,7 @@ public class PurpurWorldConfig { +@@ -1431,6 +1462,7 @@ public class PurpurWorldConfig { } endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); endermiteTakeDamageFromWater = getBoolean("mobs.endermite.takes-damage-from-water", endermiteTakeDamageFromWater); @@ -1408,7 +1413,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean evokerRidable = false; -@@ -1406,6 +1438,7 @@ public class PurpurWorldConfig { +@@ -1439,6 +1471,7 @@ public class PurpurWorldConfig { public double evokerMaxHealth = 24.0D; public boolean evokerBypassMobGriefing = false; public boolean evokerTakeDamageFromWater = false; @@ -1416,7 +1421,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -1417,6 +1450,7 @@ public class PurpurWorldConfig { +@@ -1451,6 +1484,7 @@ public class PurpurWorldConfig { evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); evokerTakeDamageFromWater = getBoolean("mobs.evoker.takes-damage-from-water", evokerTakeDamageFromWater); @@ -1424,7 +1429,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean foxRidable = false; -@@ -1426,6 +1460,7 @@ public class PurpurWorldConfig { +@@ -1461,6 +1495,7 @@ public class PurpurWorldConfig { public int foxBreedingTicks = 6000; public boolean foxBypassMobGriefing = false; public boolean foxTakeDamageFromWater = false; @@ -1432,7 +1437,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -1439,6 +1474,7 @@ public class PurpurWorldConfig { +@@ -1475,6 +1510,7 @@ public class PurpurWorldConfig { foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); foxTakeDamageFromWater = getBoolean("mobs.fox.takes-damage-from-water", foxTakeDamageFromWater); @@ -1440,15 +1445,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean ghastRidable = false; -@@ -1446,6 +1482,7 @@ public class PurpurWorldConfig { - public double ghastMaxY = 256D; +@@ -1483,6 +1519,7 @@ public class PurpurWorldConfig { + public double ghastMaxY = 320D; public double ghastMaxHealth = 10.0D; public boolean ghastTakeDamageFromWater = false; + public boolean ghastAlwaysDropExp = false; private void ghastSettings() { ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); -@@ -1457,6 +1494,7 @@ public class PurpurWorldConfig { +@@ -1495,6 +1532,7 @@ public class PurpurWorldConfig { } ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); ghastTakeDamageFromWater = getBoolean("mobs.ghast.takes-damage-from-water", ghastTakeDamageFromWater); @@ -1456,7 +1461,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean giantRidable = false; -@@ -1469,6 +1507,7 @@ public class PurpurWorldConfig { +@@ -1508,6 +1546,7 @@ public class PurpurWorldConfig { public boolean giantHaveAI = false; public boolean giantHaveHostileAI = false; public boolean giantTakeDamageFromWater = false; @@ -1464,7 +1469,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void giantSettings() { giantRidable = getBoolean("mobs.giant.ridable", giantRidable); giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); -@@ -1489,17 +1528,20 @@ public class PurpurWorldConfig { +@@ -1529,6 +1568,7 @@ public class PurpurWorldConfig { giantHaveAI = getBoolean("mobs.giant.have-ai", giantHaveAI); giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); giantTakeDamageFromWater = getBoolean("mobs.giant.takes-damage-from-water", giantTakeDamageFromWater); @@ -1472,12 +1477,14 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean glowSquidRidable = false; +@@ -1536,12 +1576,14 @@ public class PurpurWorldConfig { public double glowSquidMaxHealth = 10.0D; public boolean glowSquidsCanFly = false; public boolean glowSquidTakeDamageFromWater = false; + public boolean glowSquidAlwaysDropExp = false; private void glowSquidSettings() { glowSquidRidable = getBoolean("mobs.glow_squid.ridable", glowSquidRidable); + glowSquidControllable = getBoolean("mobs.glow_squid.controllable", glowSquidControllable); glowSquidMaxHealth = getDouble("mobs.glow_squid.attributes.max_health", glowSquidMaxHealth); glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); glowSquidTakeDamageFromWater = getBoolean("mobs.glow_squid.takes-damage-from-water", glowSquidTakeDamageFromWater); @@ -1485,7 +1492,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean goatRidable = false; -@@ -1507,17 +1549,20 @@ public class PurpurWorldConfig { +@@ -1550,6 +1592,7 @@ public class PurpurWorldConfig { public double goatMaxHealth = 10.0D; public int goatBreedingTicks = 6000; public boolean goatTakeDamageFromWater = false; @@ -1493,6 +1500,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void goatSettings() { goatRidable = getBoolean("mobs.goat.ridable", goatRidable); goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); +@@ -1557,12 +1600,14 @@ public class PurpurWorldConfig { goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); goatTakeDamageFromWater = getBoolean("mobs.goat.takes-damage-from-water", goatTakeDamageFromWater); @@ -1500,13 +1508,14 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean guardianRidable = false; + public boolean guardianControllable = true; public double guardianMaxHealth = 30.0D; public boolean guardianTakeDamageFromWater = false; + public boolean guardianAlwaysDropExp = false; private void guardianSettings() { guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); - if (PurpurConfig.version < 10) { -@@ -1527,6 +1572,7 @@ public class PurpurWorldConfig { + guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); +@@ -1573,6 +1618,7 @@ public class PurpurWorldConfig { } guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); guardianTakeDamageFromWater = getBoolean("mobs.guardian.takes-damage-from-water", guardianTakeDamageFromWater); @@ -1514,7 +1523,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean forceHalloweenSeason = false; -@@ -1541,6 +1587,7 @@ public class PurpurWorldConfig { +@@ -1588,6 +1634,7 @@ public class PurpurWorldConfig { public double hoglinMaxHealth = 40.0D; public int hoglinBreedingTicks = 6000; public boolean hoglinTakeDamageFromWater = false; @@ -1522,7 +1531,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -1552,6 +1599,7 @@ public class PurpurWorldConfig { +@@ -1600,6 +1647,7 @@ public class PurpurWorldConfig { hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); hoglinTakeDamageFromWater = getBoolean("mobs.hoglin.takes-damage-from-water", hoglinTakeDamageFromWater); @@ -1530,7 +1539,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean horseRidableInWater = false; -@@ -1564,6 +1612,7 @@ public class PurpurWorldConfig { +@@ -1612,6 +1660,7 @@ public class PurpurWorldConfig { public int horseBreedingTicks = 6000; public boolean horseTakeDamageFromWater = false; public boolean horseStandWithRider = true; @@ -1538,7 +1547,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -1582,6 +1631,7 @@ public class PurpurWorldConfig { +@@ -1630,6 +1679,7 @@ public class PurpurWorldConfig { horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); horseTakeDamageFromWater = getBoolean("mobs.horse.takes-damage-from-water", horseTakeDamageFromWater); horseStandWithRider = getBoolean("mobs.horse.stand-with-rider", horseStandWithRider); @@ -1546,7 +1555,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean huskRidable = false; -@@ -1592,6 +1642,7 @@ public class PurpurWorldConfig { +@@ -1641,6 +1691,7 @@ public class PurpurWorldConfig { public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; public boolean huskTakeDamageFromWater = false; @@ -1554,7 +1563,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1606,6 +1657,7 @@ public class PurpurWorldConfig { +@@ -1656,6 +1707,7 @@ public class PurpurWorldConfig { huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); huskTakeDamageFromWater = getBoolean("mobs.husk.takes-damage-from-water", huskTakeDamageFromWater); @@ -1562,7 +1571,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean illusionerRidable = false; -@@ -1614,6 +1666,7 @@ public class PurpurWorldConfig { +@@ -1665,6 +1717,7 @@ public class PurpurWorldConfig { public double illusionerFollowRange = 18.0D; public double illusionerMaxHealth = 32.0D; public boolean illusionerTakeDamageFromWater = false; @@ -1570,7 +1579,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void illusionerSettings() { illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); -@@ -1630,6 +1683,7 @@ public class PurpurWorldConfig { +@@ -1682,6 +1735,7 @@ public class PurpurWorldConfig { } illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); illusionerTakeDamageFromWater = getBoolean("mobs.illusioner.takes-damage-from-water", illusionerTakeDamageFromWater); @@ -1578,7 +1587,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean ironGolemRidable = false; -@@ -1638,6 +1692,7 @@ public class PurpurWorldConfig { +@@ -1691,6 +1745,7 @@ public class PurpurWorldConfig { public double ironGolemMaxHealth = 100.0D; public boolean ironGolemTakeDamageFromWater = false; public boolean ironGolemPoppyCalm = false; @@ -1586,7 +1595,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); -@@ -1650,6 +1705,7 @@ public class PurpurWorldConfig { +@@ -1704,6 +1759,7 @@ public class PurpurWorldConfig { ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater); ironGolemPoppyCalm = getBoolean("mobs.iron_golem.poppy-calms-anger", ironGolemPoppyCalm); @@ -1594,7 +1603,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean llamaRidable = false; -@@ -1663,6 +1719,7 @@ public class PurpurWorldConfig { +@@ -1718,6 +1774,7 @@ public class PurpurWorldConfig { public int llamaBreedingTicks = 6000; public boolean llamaTakeDamageFromWater = false; public boolean llamaJoinCaravans = true; @@ -1602,7 +1611,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1682,6 +1739,7 @@ public class PurpurWorldConfig { +@@ -1738,6 +1795,7 @@ public class PurpurWorldConfig { llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); llamaTakeDamageFromWater = getBoolean("mobs.llama.takes-damage-from-water", llamaTakeDamageFromWater); llamaJoinCaravans = getBoolean("mobs.llama.join-caravans", llamaJoinCaravans); @@ -1610,7 +1619,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean magmaCubeRidable = false; -@@ -1691,6 +1749,7 @@ public class PurpurWorldConfig { +@@ -1748,6 +1806,7 @@ public class PurpurWorldConfig { public Map magmaCubeMaxHealthCache = new HashMap<>(); public Map magmaCubeAttackDamageCache = new HashMap<>(); public boolean magmaCubeTakeDamageFromWater = false; @@ -1618,7 +1627,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void magmaCubeSettings() { magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); -@@ -1704,6 +1763,7 @@ public class PurpurWorldConfig { +@@ -1762,6 +1821,7 @@ public class PurpurWorldConfig { magmaCubeMaxHealthCache.clear(); magmaCubeAttackDamageCache.clear(); magmaCubeTakeDamageFromWater = getBoolean("mobs.magma_cube.takes-damage-from-water", magmaCubeTakeDamageFromWater); @@ -1626,7 +1635,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean mooshroomRidable = false; -@@ -1711,6 +1771,7 @@ public class PurpurWorldConfig { +@@ -1770,6 +1830,7 @@ public class PurpurWorldConfig { public double mooshroomMaxHealth = 10.0D; public int mooshroomBreedingTicks = 6000; public boolean mooshroomTakeDamageFromWater = false; @@ -1634,7 +1643,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1722,6 +1783,7 @@ public class PurpurWorldConfig { +@@ -1782,6 +1843,7 @@ public class PurpurWorldConfig { mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); mooshroomTakeDamageFromWater = getBoolean("mobs.mooshroom.takes-damage-from-water", mooshroomTakeDamageFromWater); @@ -1642,7 +1651,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean muleRidableInWater = false; -@@ -1733,6 +1795,7 @@ public class PurpurWorldConfig { +@@ -1793,6 +1855,7 @@ public class PurpurWorldConfig { public double muleMovementSpeedMax = 0.175D; public int muleBreedingTicks = 6000; public boolean muleTakeDamageFromWater = false; @@ -1650,7 +1659,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void muleSettings() { muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { -@@ -1750,6 +1813,7 @@ public class PurpurWorldConfig { +@@ -1810,6 +1873,7 @@ public class PurpurWorldConfig { muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); muleTakeDamageFromWater = getBoolean("mobs.mule.takes-damage-from-water", muleTakeDamageFromWater); @@ -1658,7 +1667,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean ocelotRidable = false; -@@ -1757,6 +1821,7 @@ public class PurpurWorldConfig { +@@ -1818,6 +1882,7 @@ public class PurpurWorldConfig { public double ocelotMaxHealth = 10.0D; public int ocelotBreedingTicks = 6000; public boolean ocelotTakeDamageFromWater = false; @@ -1666,7 +1675,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -1768,6 +1833,7 @@ public class PurpurWorldConfig { +@@ -1830,6 +1895,7 @@ public class PurpurWorldConfig { ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); ocelotTakeDamageFromWater = getBoolean("mobs.ocelot.takes-damage-from-water", ocelotTakeDamageFromWater); @@ -1674,7 +1683,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean pandaRidable = false; -@@ -1775,6 +1841,7 @@ public class PurpurWorldConfig { +@@ -1838,6 +1904,7 @@ public class PurpurWorldConfig { public double pandaMaxHealth = 20.0D; public int pandaBreedingTicks = 6000; public boolean pandaTakeDamageFromWater = false; @@ -1682,7 +1691,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -1786,6 +1853,7 @@ public class PurpurWorldConfig { +@@ -1850,6 +1917,7 @@ public class PurpurWorldConfig { pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); pandaTakeDamageFromWater = getBoolean("mobs.panda.takes-damage-from-water", pandaTakeDamageFromWater); @@ -1690,7 +1699,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean parrotRidable = false; -@@ -1794,6 +1862,7 @@ public class PurpurWorldConfig { +@@ -1859,6 +1927,7 @@ public class PurpurWorldConfig { public double parrotMaxHealth = 6.0D; public boolean parrotTakeDamageFromWater = false; public boolean parrotBreedable = false; @@ -1698,7 +1707,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void parrotSettings() { parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); -@@ -1806,6 +1875,7 @@ public class PurpurWorldConfig { +@@ -1872,6 +1941,7 @@ public class PurpurWorldConfig { parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); parrotTakeDamageFromWater = getBoolean("mobs.parrot.takes-damage-from-water", parrotTakeDamageFromWater); parrotBreedable = getBoolean("mobs.parrot.can-breed", parrotBreedable); @@ -1706,7 +1715,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean phantomRidable = false; -@@ -1838,6 +1908,7 @@ public class PurpurWorldConfig { +@@ -1905,6 +1975,7 @@ public class PurpurWorldConfig { public boolean phantomBurnInDaylight = true; public boolean phantomFlamesOnSwoop = false; public boolean phantomTakeDamageFromWater = false; @@ -1714,7 +1723,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1878,6 +1949,7 @@ public class PurpurWorldConfig { +@@ -1946,6 +2017,7 @@ public class PurpurWorldConfig { phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); phantomTakeDamageFromWater = getBoolean("mobs.phantom.takes-damage-from-water", phantomTakeDamageFromWater); @@ -1722,7 +1731,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean pigRidable = false; -@@ -1886,6 +1958,7 @@ public class PurpurWorldConfig { +@@ -1955,6 +2027,7 @@ public class PurpurWorldConfig { public boolean pigGiveSaddleBack = false; public int pigBreedingTicks = 6000; public boolean pigTakeDamageFromWater = false; @@ -1730,7 +1739,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -1898,6 +1971,7 @@ public class PurpurWorldConfig { +@@ -1968,6 +2041,7 @@ public class PurpurWorldConfig { 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); @@ -1738,7 +1747,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean piglinRidable = false; -@@ -1906,6 +1980,7 @@ public class PurpurWorldConfig { +@@ -1977,6 +2051,7 @@ public class PurpurWorldConfig { public boolean piglinBypassMobGriefing = false; public boolean piglinTakeDamageFromWater = false; public int piglinPortalSpawnModifier = 2000; @@ -1746,7 +1755,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1918,12 +1993,14 @@ public class PurpurWorldConfig { +@@ -1990,6 +2065,7 @@ public class PurpurWorldConfig { 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); @@ -1754,14 +1763,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean piglinBruteRidable = false; - public boolean piglinBruteRidableInWater = false; +@@ -1997,6 +2073,7 @@ public class PurpurWorldConfig { + public boolean piglinBruteControllable = true; public double piglinBruteMaxHealth = 50.0D; public boolean piglinBruteTakeDamageFromWater = false; + public boolean piglinBruteAlwaysDropExp = false; private void piglinBruteSettings() { piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); -@@ -1934,6 +2011,7 @@ public class PurpurWorldConfig { +@@ -2008,6 +2085,7 @@ public class PurpurWorldConfig { } piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); piglinBruteTakeDamageFromWater = getBoolean("mobs.piglin_brute.takes-damage-from-water", piglinBruteTakeDamageFromWater); @@ -1769,7 +1779,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean pillagerRidable = false; -@@ -1941,6 +2019,7 @@ public class PurpurWorldConfig { +@@ -2016,6 +2094,7 @@ public class PurpurWorldConfig { public double pillagerMaxHealth = 24.0D; public boolean pillagerBypassMobGriefing = false; public boolean pillagerTakeDamageFromWater = false; @@ -1777,7 +1787,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1952,6 +2031,7 @@ public class PurpurWorldConfig { +@@ -2028,6 +2107,7 @@ public class PurpurWorldConfig { pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); pillagerTakeDamageFromWater = getBoolean("mobs.pillager.takes-damage-from-water", pillagerTakeDamageFromWater); @@ -1785,7 +1795,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean polarBearRidable = false; -@@ -1961,6 +2041,7 @@ public class PurpurWorldConfig { +@@ -2038,6 +2118,7 @@ public class PurpurWorldConfig { public Item polarBearBreedableItem = null; public int polarBearBreedingTicks = 6000; public boolean polarBearTakeDamageFromWater = false; @@ -1793,7 +1803,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -1975,11 +2056,13 @@ public class PurpurWorldConfig { +@@ -2053,12 +2134,14 @@ public class PurpurWorldConfig { if (item != Items.AIR) polarBearBreedableItem = item; polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); polarBearTakeDamageFromWater = getBoolean("mobs.polar_bear.takes-damage-from-water", polarBearTakeDamageFromWater); @@ -1801,13 +1811,14 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean pufferfishRidable = false; + public boolean pufferfishControllable = true; public double pufferfishMaxHealth = 3.0D; public boolean pufferfishTakeDamageFromWater = false; + public boolean pufferfishAlwaysDropExp = false; private void pufferfishSettings() { pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); - if (PurpurConfig.version < 10) { -@@ -1989,6 +2072,7 @@ public class PurpurWorldConfig { + pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); +@@ -2069,6 +2152,7 @@ public class PurpurWorldConfig { } pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); pufferfishTakeDamageFromWater = getBoolean("mobs.pufferfish.takes-damage-from-water", pufferfishTakeDamageFromWater); @@ -1815,7 +1826,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean rabbitRidable = false; -@@ -1999,6 +2083,7 @@ public class PurpurWorldConfig { +@@ -2080,6 +2164,7 @@ public class PurpurWorldConfig { public int rabbitBreedingTicks = 6000; public boolean rabbitBypassMobGriefing = false; public boolean rabbitTakeDamageFromWater = false; @@ -1823,7 +1834,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -2013,6 +2098,7 @@ public class PurpurWorldConfig { +@@ -2095,6 +2180,7 @@ public class PurpurWorldConfig { rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); rabbitBypassMobGriefing = getBoolean("mobs.rabbit.bypass-mob-griefing", rabbitBypassMobGriefing); rabbitTakeDamageFromWater = getBoolean("mobs.rabbit.takes-damage-from-water", rabbitTakeDamageFromWater); @@ -1831,7 +1842,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean ravagerRidable = false; -@@ -2021,6 +2107,7 @@ public class PurpurWorldConfig { +@@ -2104,6 +2190,7 @@ public class PurpurWorldConfig { public boolean ravagerBypassMobGriefing = false; public boolean ravagerTakeDamageFromWater = false; public List ravagerGriefableBlocks = new ArrayList<>(); @@ -1839,7 +1850,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -2049,11 +2136,13 @@ public class PurpurWorldConfig { +@@ -2133,12 +2220,14 @@ public class PurpurWorldConfig { ravagerGriefableBlocks.add(block); } }); @@ -1847,13 +1858,14 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean salmonRidable = false; + public boolean salmonControllable = true; public double salmonMaxHealth = 3.0D; public boolean salmonTakeDamageFromWater = false; + public boolean salmonAlwaysDropExp = false; private void salmonSettings() { salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); - if (PurpurConfig.version < 10) { -@@ -2063,6 +2152,7 @@ public class PurpurWorldConfig { + salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); +@@ -2149,6 +2238,7 @@ public class PurpurWorldConfig { } salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); salmonTakeDamageFromWater = getBoolean("mobs.salmon.takes-damage-from-water", salmonTakeDamageFromWater); @@ -1861,7 +1873,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean sheepRidable = false; -@@ -2071,6 +2161,7 @@ public class PurpurWorldConfig { +@@ -2158,6 +2248,7 @@ public class PurpurWorldConfig { public int sheepBreedingTicks = 6000; public boolean sheepBypassMobGriefing = false; public boolean sheepTakeDamageFromWater = false; @@ -1869,7 +1881,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -2083,6 +2174,7 @@ public class PurpurWorldConfig { +@@ -2171,6 +2262,7 @@ public class PurpurWorldConfig { 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); @@ -1877,7 +1889,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean shulkerRidable = false; -@@ -2095,6 +2187,7 @@ public class PurpurWorldConfig { +@@ -2184,6 +2276,7 @@ public class PurpurWorldConfig { public String shulkerSpawnFromBulletNearbyEquation = "(nearby - 1) / 5.0"; public boolean shulkerSpawnFromBulletRandomColor = false; public boolean shulkerChangeColorWithDye = false; @@ -1885,7 +1897,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -2111,6 +2204,7 @@ public class PurpurWorldConfig { +@@ -2201,6 +2294,7 @@ public class PurpurWorldConfig { shulkerSpawnFromBulletNearbyEquation = getString("mobs.shulker.spawn-from-bullet.nearby-equation", shulkerSpawnFromBulletNearbyEquation); shulkerSpawnFromBulletRandomColor = getBoolean("mobs.shulker.spawn-from-bullet.random-color", shulkerSpawnFromBulletRandomColor); shulkerChangeColorWithDye = getBoolean("mobs.shulker.change-color-with-dye", shulkerChangeColorWithDye); @@ -1893,7 +1905,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean silverfishRidable = false; -@@ -2118,6 +2212,7 @@ public class PurpurWorldConfig { +@@ -2209,6 +2303,7 @@ public class PurpurWorldConfig { public double silverfishMaxHealth = 8.0D; public boolean silverfishBypassMobGriefing = false; public boolean silverfishTakeDamageFromWater = false; @@ -1901,7 +1913,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -2129,12 +2224,14 @@ public class PurpurWorldConfig { +@@ -2221,6 +2316,7 @@ public class PurpurWorldConfig { silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); silverfishTakeDamageFromWater = getBoolean("mobs.silverfish.takes-damage-from-water", silverfishTakeDamageFromWater); @@ -1909,14 +1921,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean skeletonRidable = false; - public boolean skeletonRidableInWater = false; +@@ -2228,6 +2324,7 @@ public class PurpurWorldConfig { + public boolean skeletonControllable = true; public double skeletonMaxHealth = 20.0D; public boolean skeletonTakeDamageFromWater = false; + public boolean skeletonAlwaysDropExp = false; private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -2145,6 +2242,7 @@ public class PurpurWorldConfig { +@@ -2239,6 +2336,7 @@ public class PurpurWorldConfig { } skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); @@ -1924,7 +1937,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean skeletonHorseRidableInWater = true; -@@ -2156,6 +2254,7 @@ public class PurpurWorldConfig { +@@ -2250,6 +2348,7 @@ public class PurpurWorldConfig { public double skeletonHorseMovementSpeedMin = 0.2D; public double skeletonHorseMovementSpeedMax = 0.2D; public boolean skeletonHorseTakeDamageFromWater = false; @@ -1932,7 +1945,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void skeletonHorseSettings() { skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); skeletonHorseCanSwim = getBoolean("mobs.skeleton_horse.can-swim", skeletonHorseCanSwim); -@@ -2172,6 +2271,7 @@ public class PurpurWorldConfig { +@@ -2266,6 +2365,7 @@ public class PurpurWorldConfig { skeletonHorseMovementSpeedMin = getDouble("mobs.skeleton_horse.attributes.movement_speed.min", skeletonHorseMovementSpeedMin); skeletonHorseMovementSpeedMax = getDouble("mobs.skeleton_horse.attributes.movement_speed.max", skeletonHorseMovementSpeedMax); skeletonHorseTakeDamageFromWater = getBoolean("mobs.skeleton_horse.takes-damage-from-water", skeletonHorseTakeDamageFromWater); @@ -1940,7 +1953,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean slimeRidable = false; -@@ -2181,6 +2281,7 @@ public class PurpurWorldConfig { +@@ -2276,6 +2376,7 @@ public class PurpurWorldConfig { public Map slimeMaxHealthCache = new HashMap<>(); public Map slimeAttackDamageCache = new HashMap<>(); public boolean slimeTakeDamageFromWater = false; @@ -1948,7 +1961,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void slimeSettings() { slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); -@@ -2194,6 +2295,7 @@ public class PurpurWorldConfig { +@@ -2290,6 +2391,7 @@ public class PurpurWorldConfig { slimeMaxHealthCache.clear(); slimeAttackDamageCache.clear(); slimeTakeDamageFromWater = getBoolean("mobs.slime.takes-damage-from-water", slimeTakeDamageFromWater); @@ -1956,7 +1969,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean snowGolemRidable = false; -@@ -2208,6 +2310,7 @@ public class PurpurWorldConfig { +@@ -2305,6 +2407,7 @@ public class PurpurWorldConfig { public double snowGolemAttackDistance = 1.25D; public boolean snowGolemBypassMobGriefing = false; public boolean snowGolemTakeDamageFromWater = true; @@ -1964,7 +1977,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -2226,6 +2329,7 @@ public class PurpurWorldConfig { +@@ -2324,6 +2427,7 @@ public class PurpurWorldConfig { snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); snowGolemBypassMobGriefing = getBoolean("mobs.snow_golem.bypass-mob-griefing", snowGolemBypassMobGriefing); snowGolemTakeDamageFromWater = getBoolean("mobs.snow_golem.takes-damage-from-water", snowGolemTakeDamageFromWater); @@ -1972,15 +1985,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean squidRidable = false; -@@ -2234,6 +2338,7 @@ public class PurpurWorldConfig { +@@ -2333,6 +2437,7 @@ public class PurpurWorldConfig { public double squidOffsetWaterCheck = 0.0D; public boolean squidsCanFly = false; public boolean squidTakeDamageFromWater = false; + public boolean squidAlwaysDropExp = false; private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); - if (PurpurConfig.version < 10) { -@@ -2246,12 +2351,14 @@ public class PurpurWorldConfig { + squidControllable = getBoolean("mobs.squid.controllable", squidControllable); +@@ -2346,6 +2451,7 @@ public class PurpurWorldConfig { squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); squidTakeDamageFromWater = getBoolean("mobs.squid.takes-damage-from-water", squidTakeDamageFromWater); @@ -1988,14 +2001,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean spiderRidable = false; - public boolean spiderRidableInWater = false; +@@ -2353,6 +2459,7 @@ public class PurpurWorldConfig { + public boolean spiderControllable = true; public double spiderMaxHealth = 16.0D; public boolean spiderTakeDamageFromWater = false; + public boolean spiderAlwaysDropExp = false; private void spiderSettings() { spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); -@@ -2262,12 +2369,14 @@ public class PurpurWorldConfig { +@@ -2364,6 +2471,7 @@ public class PurpurWorldConfig { } spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); spiderTakeDamageFromWater = getBoolean("mobs.spider.takes-damage-from-water", spiderTakeDamageFromWater); @@ -2003,14 +2017,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean strayRidable = false; - public boolean strayRidableInWater = false; +@@ -2371,6 +2479,7 @@ public class PurpurWorldConfig { + public boolean strayControllable = true; public double strayMaxHealth = 20.0D; public boolean strayTakeDamageFromWater = false; + public boolean strayAlwaysDropExp = false; private void straySettings() { strayRidable = getBoolean("mobs.stray.ridable", strayRidable); strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); -@@ -2278,6 +2387,7 @@ public class PurpurWorldConfig { +@@ -2382,6 +2491,7 @@ public class PurpurWorldConfig { } strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); strayTakeDamageFromWater = getBoolean("mobs.stray.takes-damage-from-water", strayTakeDamageFromWater); @@ -2018,7 +2033,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean striderRidable = false; -@@ -2286,6 +2396,7 @@ public class PurpurWorldConfig { +@@ -2391,6 +2501,7 @@ public class PurpurWorldConfig { public int striderBreedingTicks = 6000; public boolean striderGiveSaddleBack = false; public boolean striderTakeDamageFromWater = true; @@ -2026,7 +2041,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -2298,6 +2409,7 @@ public class PurpurWorldConfig { +@@ -2404,6 +2515,7 @@ public class PurpurWorldConfig { 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); @@ -2034,7 +2049,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean traderLlamaRidable = false; -@@ -2310,6 +2422,7 @@ public class PurpurWorldConfig { +@@ -2417,6 +2529,7 @@ public class PurpurWorldConfig { public double traderLlamaMovementSpeedMax = 0.175D; public int traderLlamaBreedingTicks = 6000; public boolean traderLlamaTakeDamageFromWater = false; @@ -2042,7 +2057,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -2328,11 +2441,13 @@ public class PurpurWorldConfig { +@@ -2436,12 +2549,14 @@ public class PurpurWorldConfig { traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); traderLlamaTakeDamageFromWater = getBoolean("mobs.trader_llama.takes-damage-from-water", traderLlamaTakeDamageFromWater); @@ -2050,13 +2065,14 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean tropicalFishRidable = false; + public boolean tropicalFishControllable = true; public double tropicalFishMaxHealth = 3.0D; public boolean tropicalFishTakeDamageFromWater = false; + public boolean tropicalFishAlwaysDropExp = false; private void tropicalFishSettings() { tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); - if (PurpurConfig.version < 10) { -@@ -2342,6 +2457,7 @@ public class PurpurWorldConfig { + tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); +@@ -2452,6 +2567,7 @@ public class PurpurWorldConfig { } tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); tropicalFishTakeDamageFromWater = getBoolean("mobs.tropical_fish.takes-damage-from-water", tropicalFishTakeDamageFromWater); @@ -2064,7 +2080,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean turtleRidable = false; -@@ -2349,6 +2465,7 @@ public class PurpurWorldConfig { +@@ -2460,6 +2576,7 @@ public class PurpurWorldConfig { public double turtleMaxHealth = 30.0D; public int turtleBreedingTicks = 6000; public boolean turtleTakeDamageFromWater = false; @@ -2072,7 +2088,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -2360,6 +2477,7 @@ public class PurpurWorldConfig { +@@ -2472,6 +2589,7 @@ public class PurpurWorldConfig { turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); turtleTakeDamageFromWater = getBoolean("mobs.turtle.takes-damage-from-water", turtleTakeDamageFromWater); @@ -2080,15 +2096,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean vexRidable = false; -@@ -2367,6 +2485,7 @@ public class PurpurWorldConfig { - public double vexMaxY = 256D; +@@ -2480,6 +2598,7 @@ public class PurpurWorldConfig { + public double vexMaxY = 320D; public double vexMaxHealth = 14.0D; public boolean vexTakeDamageFromWater = false; + public boolean vexAlwaysDropExp = false; private void vexSettings() { vexRidable = getBoolean("mobs.vex.ridable", vexRidable); vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); -@@ -2378,6 +2497,7 @@ public class PurpurWorldConfig { +@@ -2492,6 +2611,7 @@ public class PurpurWorldConfig { } vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); vexTakeDamageFromWater = getBoolean("mobs.vex.takes-damage-from-water", vexTakeDamageFromWater); @@ -2096,7 +2112,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean villagerRidable = false; -@@ -2396,6 +2516,7 @@ public class PurpurWorldConfig { +@@ -2511,6 +2631,7 @@ public class PurpurWorldConfig { public boolean villagerBypassMobGriefing = false; public boolean villagerTakeDamageFromWater = false; public boolean villagerAllowTrading = true; @@ -2104,7 +2120,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2418,6 +2539,7 @@ public class PurpurWorldConfig { +@@ -2534,6 +2655,7 @@ public class PurpurWorldConfig { villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); @@ -2112,7 +2128,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean vindicatorRidable = false; -@@ -2425,6 +2547,7 @@ public class PurpurWorldConfig { +@@ -2542,6 +2664,7 @@ public class PurpurWorldConfig { public double vindicatorMaxHealth = 24.0D; public double vindicatorJohnnySpawnChance = 0D; public boolean vindicatorTakeDamageFromWater = false; @@ -2120,7 +2136,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -2436,6 +2559,7 @@ public class PurpurWorldConfig { +@@ -2554,6 +2677,7 @@ public class PurpurWorldConfig { vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); vindicatorTakeDamageFromWater = getBoolean("mobs.vindicator.takes-damage-from-water", vindicatorTakeDamageFromWater); @@ -2128,7 +2144,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean wanderingTraderRidable = false; -@@ -2445,6 +2569,7 @@ public class PurpurWorldConfig { +@@ -2564,6 +2688,7 @@ public class PurpurWorldConfig { public boolean wanderingTraderCanBeLeashed = false; public boolean wanderingTraderTakeDamageFromWater = false; public boolean wanderingTraderAllowTrading = true; @@ -2136,7 +2152,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -2458,12 +2583,14 @@ public class PurpurWorldConfig { +@@ -2578,6 +2703,7 @@ public class PurpurWorldConfig { wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); wanderingTraderTakeDamageFromWater = getBoolean("mobs.wandering_trader.takes-damage-from-water", wanderingTraderTakeDamageFromWater); wanderingTraderAllowTrading = getBoolean("mobs.wandering_trader.allow-trading", wanderingTraderAllowTrading); @@ -2144,14 +2160,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean witchRidable = false; - public boolean witchRidableInWater = false; +@@ -2585,6 +2711,7 @@ public class PurpurWorldConfig { + public boolean witchControllable = true; public double witchMaxHealth = 26.0D; public boolean witchTakeDamageFromWater = false; + public boolean witchAlwaysDropExp = false; private void witchSettings() { witchRidable = getBoolean("mobs.witch.ridable", witchRidable); witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); -@@ -2474,6 +2601,7 @@ public class PurpurWorldConfig { +@@ -2596,6 +2723,7 @@ public class PurpurWorldConfig { } witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); witchTakeDamageFromWater = getBoolean("mobs.witch.takes-damage-from-water", witchTakeDamageFromWater); @@ -2159,7 +2176,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean witherRidable = false; -@@ -2487,6 +2615,7 @@ public class PurpurWorldConfig { +@@ -2610,6 +2738,7 @@ public class PurpurWorldConfig { public boolean witherCanRideVehicles = false; public float witherExplosionRadius = 1.0F; public boolean witherPlaySpawnSound = true; @@ -2167,7 +2184,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2508,12 +2637,14 @@ public class PurpurWorldConfig { +@@ -2632,6 +2761,7 @@ public class PurpurWorldConfig { witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles); witherExplosionRadius = (float) getDouble("mobs.wither.explosion-radius", witherExplosionRadius); witherPlaySpawnSound = getBoolean("mobs.wither.play-spawn-sound", witherPlaySpawnSound); @@ -2175,14 +2192,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean witherSkeletonRidable = false; - public boolean witherSkeletonRidableInWater = false; +@@ -2639,6 +2769,7 @@ public class PurpurWorldConfig { + public boolean witherSkeletonControllable = true; public double witherSkeletonMaxHealth = 20.0D; public boolean witherSkeletonTakeDamageFromWater = false; + public boolean witherSkeletonAlwaysDropExp = false; private void witherSkeletonSettings() { witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); -@@ -2524,6 +2655,7 @@ public class PurpurWorldConfig { +@@ -2650,6 +2781,7 @@ public class PurpurWorldConfig { } witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); witherSkeletonTakeDamageFromWater = getBoolean("mobs.wither_skeleton.takes-damage-from-water", witherSkeletonTakeDamageFromWater); @@ -2190,7 +2208,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean wolfRidable = false; -@@ -2534,6 +2666,7 @@ public class PurpurWorldConfig { +@@ -2661,6 +2793,7 @@ public class PurpurWorldConfig { public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; public boolean wolfTakeDamageFromWater = false; @@ -2198,7 +2216,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -2552,12 +2685,14 @@ public class PurpurWorldConfig { +@@ -2680,6 +2813,7 @@ public class PurpurWorldConfig { wolfNaturalRabid = getDouble("mobs.wolf.spawn-rabid-chance", wolfNaturalRabid); wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); wolfTakeDamageFromWater = getBoolean("mobs.wolf.takes-damage-from-water", wolfTakeDamageFromWater); @@ -2206,14 +2224,15 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean zoglinRidable = false; - public boolean zoglinRidableInWater = false; +@@ -2687,6 +2821,7 @@ public class PurpurWorldConfig { + public boolean zoglinControllable = true; public double zoglinMaxHealth = 40.0D; public boolean zoglinTakeDamageFromWater = false; + public boolean zoglinAlwaysDropExp = false; private void zoglinSettings() { zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); -@@ -2568,6 +2703,7 @@ public class PurpurWorldConfig { +@@ -2698,6 +2833,7 @@ public class PurpurWorldConfig { } zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); zoglinTakeDamageFromWater = getBoolean("mobs.zoglin.takes-damage-from-water", zoglinTakeDamageFromWater); @@ -2221,7 +2240,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean zombieRidable = false; -@@ -2580,6 +2716,7 @@ public class PurpurWorldConfig { +@@ -2711,6 +2847,7 @@ public class PurpurWorldConfig { public boolean zombieAggressiveTowardsVillagerWhenLagging = true; public boolean zombieBypassMobGriefing = false; public boolean zombieTakeDamageFromWater = false; @@ -2229,7 +2248,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2596,6 +2733,7 @@ public class PurpurWorldConfig { +@@ -2728,6 +2865,7 @@ public class PurpurWorldConfig { zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); @@ -2237,7 +2256,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean zombieHorseRidableInWater = false; -@@ -2608,6 +2746,7 @@ public class PurpurWorldConfig { +@@ -2740,6 +2878,7 @@ public class PurpurWorldConfig { public double zombieHorseMovementSpeedMax = 0.2D; public double zombieHorseSpawnChance = 0.0D; public boolean zombieHorseTakeDamageFromWater = false; @@ -2245,7 +2264,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void zombieHorseSettings() { zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); zombieHorseCanSwim = getBoolean("mobs.zombie_horse.can-swim", zombieHorseCanSwim); -@@ -2625,6 +2764,7 @@ public class PurpurWorldConfig { +@@ -2757,6 +2896,7 @@ public class PurpurWorldConfig { zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); zombieHorseTakeDamageFromWater = getBoolean("mobs.zombie_horse.takes-damage-from-water", zombieHorseTakeDamageFromWater); @@ -2253,7 +2272,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean zombieVillagerRidable = false; -@@ -2638,6 +2778,7 @@ public class PurpurWorldConfig { +@@ -2771,6 +2911,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMin = 3600; public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; @@ -2261,7 +2280,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -2655,6 +2796,7 @@ public class PurpurWorldConfig { +@@ -2789,6 +2930,7 @@ public class PurpurWorldConfig { zombieVillagerCuringTimeMin = getInt("mobs.zombie_villager.curing_time.min", zombieVillagerCuringTimeMin); zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled); @@ -2269,7 +2288,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 } public boolean zombifiedPiglinRidable = false; -@@ -2666,6 +2808,7 @@ public class PurpurWorldConfig { +@@ -2801,6 +2943,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyTryExistingChickens = true; public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; public boolean zombifiedPiglinTakeDamageFromWater = false; @@ -2277,7 +2296,7 @@ index 193b88dfce1b6db8687ce4552bb6cd26fdee23f0..7134fbde05d461cb130b19fbb5917ba9 private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -2681,6 +2824,7 @@ public class PurpurWorldConfig { +@@ -2817,6 +2960,7 @@ public class PurpurWorldConfig { zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); diff --git a/patches/server/0247-Option-to-prevent-spiders-from-climbing-world-border.patch b/patches/server/0247-Option-to-prevent-spiders-from-climbing-world-border.patch index e710d22565..ccbc432968 100644 --- a/patches/server/0247-Option-to-prevent-spiders-from-climbing-world-border.patch +++ b/patches/server/0247-Option-to-prevent-spiders-from-climbing-world-border.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Option to prevent spiders from climbing world border diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 032bc56ad7700d1ba79efbce32654c57a9434711..1f6183c4fe55168c5a234c6258fb46d49cee3b2d 100644 +index e4b6bdf0d9ac751094374f5f6197ebd2fe22c652..16ac7a216464f1f1ef1db8278c58574af4988171 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -234,6 +234,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i @@ -26,10 +26,10 @@ index 032bc56ad7700d1ba79efbce32654c57a9434711..1f6183c4fe55168c5a234c6258fb46d4 } 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 f85daf21ae3d77d2d56c131c6df9aa0715a306ca..6ef3cf19e5374631602e68d15ad431fc1a747ea5 100644 +index 177f9fe0d0a10e5d3644805751f2050fe984fde7..07dc3b10a275895f23fcf50720ef25faea358c58 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java -@@ -113,7 +113,7 @@ public class Spider extends Monster { +@@ -118,7 +118,7 @@ public class Spider extends Monster { public void tick() { super.tick(); if (!this.level.isClientSide) { @@ -39,10 +39,10 @@ index f85daf21ae3d77d2d56c131c6df9aa0715a306ca..6ef3cf19e5374631602e68d15ad431fc } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7134fbde05d461cb130b19fbb5917ba9a96293bf..042d93e68f883eda989a08bcffe7be0ff61c8d9b 100644 +index b030105bea31453a4cfd978c16d228ff3795f871..f85b3df4b19c3f2692b0419fe406896bf1f6d62e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2359,6 +2359,7 @@ public class PurpurWorldConfig { +@@ -2460,6 +2460,7 @@ public class PurpurWorldConfig { public double spiderMaxHealth = 16.0D; public boolean spiderTakeDamageFromWater = false; public boolean spiderAlwaysDropExp = false; @@ -50,7 +50,7 @@ index 7134fbde05d461cb130b19fbb5917ba9a96293bf..042d93e68f883eda989a08bcffe7be0f private void spiderSettings() { spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); -@@ -2370,6 +2371,7 @@ public class PurpurWorldConfig { +@@ -2472,6 +2473,7 @@ public class PurpurWorldConfig { spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); spiderTakeDamageFromWater = getBoolean("mobs.spider.takes-damage-from-water", spiderTakeDamageFromWater); spiderAlwaysDropExp = getBoolean("mobs.spider.always-drop-exp", spiderAlwaysDropExp); diff --git a/patches/server/0249-Shearing-jeb-produces-random-color-wool.patch b/patches/server/0249-Shearing-jeb-produces-random-color-wool.patch index 7a96d4c107..9da37b1274 100644 --- a/patches/server/0249-Shearing-jeb-produces-random-color-wool.patch +++ b/patches/server/0249-Shearing-jeb-produces-random-color-wool.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Shearing jeb produces random color wool 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 860e03111b29f9178a1cd361357985308a39d254..3e72abd93bc5b9f97c2bd62702273d63b43cc245 100644 +index 17d1a0b43b2d155535cf2483af4ba9dd09700c83..fbe71ed86553965aa9fc20b7d8e6fdefd1d85a60 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -288,7 +288,7 @@ public class Sheep extends Animal implements Shearable { +@@ -293,7 +293,7 @@ public class Sheep extends Animal implements Shearable { for (int j = 0; j < i; ++j) { this.forceDrops = true; // CraftBukkit @@ -18,10 +18,10 @@ index 860e03111b29f9178a1cd361357985308a39d254..3e72abd93bc5b9f97c2bd62702273d63 if (entityitem != null) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7810776e47817c16caee500344f8c1d812b5782e..a5c555e736e8883c485a37d86110777921e07489 100644 +index 483a6e1c05b8a103f639d37daeb4ee805e9dba96..638ec0b7d026f0164a73f03fed36c25ba17f53a3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2166,6 +2166,7 @@ public class PurpurWorldConfig { +@@ -2253,6 +2253,7 @@ public class PurpurWorldConfig { public boolean sheepBypassMobGriefing = false; public boolean sheepTakeDamageFromWater = false; public boolean sheepAlwaysDropExp = false; @@ -29,7 +29,7 @@ index 7810776e47817c16caee500344f8c1d812b5782e..a5c555e736e8883c485a37d861107779 private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -2179,6 +2180,7 @@ public class PurpurWorldConfig { +@@ -2267,6 +2268,7 @@ public class PurpurWorldConfig { sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); sheepTakeDamageFromWater = getBoolean("mobs.sheep.takes-damage-from-water", sheepTakeDamageFromWater); sheepAlwaysDropExp = getBoolean("mobs.sheep.always-drop-exp", sheepAlwaysDropExp); diff --git a/patches/server/0251-Mob-head-visibility-percent.patch b/patches/server/0251-Mob-head-visibility-percent.patch index c283243be4..447753b226 100644 --- a/patches/server/0251-Mob-head-visibility-percent.patch +++ b/patches/server/0251-Mob-head-visibility-percent.patch @@ -29,10 +29,10 @@ index e44b0c3704ca6b7609f6638e43aa8abe1939bfd8..b23c78fe2ad93a88378af90563e90b96 // Purpur start if (entity instanceof LivingEntity entityliving) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0318508770b956b9278466e6f2d1f724a6f5fd70..f73df2c3cb5c15bf409804de9da14098de355822 100644 +index 7f438d507807801f4aff13441bf7b14e46ab8a4a..cd900a8022aa23da4ab2a294c74100fc80fb960d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1237,6 +1237,7 @@ public class PurpurWorldConfig { +@@ -1256,6 +1256,7 @@ public class PurpurWorldConfig { public boolean creeperExplodeWhenKilled = false; public boolean creeperHealthRadius = false; public boolean creeperAlwaysDropExp = false; @@ -40,7 +40,7 @@ index 0318508770b956b9278466e6f2d1f724a6f5fd70..f73df2c3cb5c15bf409804de9da14098 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -1253,6 +1254,7 @@ public class PurpurWorldConfig { +@@ -1273,6 +1274,7 @@ public class PurpurWorldConfig { creeperExplodeWhenKilled = getBoolean("mobs.creeper.explode-when-killed", creeperExplodeWhenKilled); creeperHealthRadius = getBoolean("mobs.creeper.health-impacts-explosion", creeperHealthRadius); creeperAlwaysDropExp = getBoolean("mobs.creeper.always-drop-exp", creeperAlwaysDropExp); @@ -48,7 +48,7 @@ index 0318508770b956b9278466e6f2d1f724a6f5fd70..f73df2c3cb5c15bf409804de9da14098 } public boolean dolphinRidable = false; -@@ -2240,6 +2242,7 @@ public class PurpurWorldConfig { +@@ -2333,6 +2335,7 @@ public class PurpurWorldConfig { public double skeletonMaxHealth = 20.0D; public boolean skeletonTakeDamageFromWater = false; public boolean skeletonAlwaysDropExp = false; @@ -56,7 +56,7 @@ index 0318508770b956b9278466e6f2d1f724a6f5fd70..f73df2c3cb5c15bf409804de9da14098 private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -2251,6 +2254,7 @@ public class PurpurWorldConfig { +@@ -2345,6 +2348,7 @@ public class PurpurWorldConfig { skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); @@ -64,7 +64,7 @@ index 0318508770b956b9278466e6f2d1f724a6f5fd70..f73df2c3cb5c15bf409804de9da14098 } public boolean skeletonHorseRidableInWater = true; -@@ -2727,6 +2731,7 @@ public class PurpurWorldConfig { +@@ -2858,6 +2862,7 @@ public class PurpurWorldConfig { public boolean zombieBypassMobGriefing = false; public boolean zombieTakeDamageFromWater = false; public boolean zombieAlwaysDropExp = false; @@ -72,7 +72,7 @@ index 0318508770b956b9278466e6f2d1f724a6f5fd70..f73df2c3cb5c15bf409804de9da14098 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2744,6 +2749,7 @@ public class PurpurWorldConfig { +@@ -2876,6 +2881,7 @@ public class PurpurWorldConfig { zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); diff --git a/patches/server/0253-Shears-can-have-looting-enchantment.patch b/patches/server/0253-Shears-can-have-looting-enchantment.patch index a308ee86fe..cd758d3a04 100644 --- a/patches/server/0253-Shears-can-have-looting-enchantment.patch +++ b/patches/server/0253-Shears-can-have-looting-enchantment.patch @@ -37,10 +37,10 @@ index 5e8cc5cfac8888628c6d513148f41be09ca65a2c..a089fc61ec09be6b7490375489178dc6 boolean readyForShearing(); } diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 16b4b6a382db7c81eb19771a4fa0cc3ae73c3645..6fc17adcfd300796579badc5af3ce2e8c1baf928 100644 +index 00cfd89f175206b3bb29d3a954f8564077a7115b..08e4dce53f7d2709f64ed41afdb362d5673c534c 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -161,7 +161,7 @@ public class MushroomCow extends Cow implements Shearable { +@@ -166,7 +166,7 @@ public class MushroomCow extends Cow implements Shearable { return tryRide(player, hand); // Purpur } // CraftBukkit end @@ -49,7 +49,7 @@ index 16b4b6a382db7c81eb19771a4fa0cc3ae73c3645..6fc17adcfd300796579badc5af3ce2e8 this.gameEvent(GameEvent.SHEAR, (Entity) player); if (!this.level.isClientSide) { itemstack.hurtAndBreak(1, player, (entityhuman1) -> { -@@ -204,7 +204,7 @@ public class MushroomCow extends Cow implements Shearable { +@@ -209,7 +209,7 @@ public class MushroomCow extends Cow implements Shearable { } @Override @@ -58,7 +58,7 @@ index 16b4b6a382db7c81eb19771a4fa0cc3ae73c3645..6fc17adcfd300796579badc5af3ce2e8 this.level.playSound((Player) null, (Entity) this, SoundEvents.MOOSHROOM_SHEAR, shearedSoundCategory, 1.0F, 1.0F); if (!this.level.isClientSide()) { ((ServerLevel) this.level).sendParticles(ParticleTypes.EXPLOSION, this.getX(), this.getY(0.5D), this.getZ(), 1, 0.0D, 0.0D, 0.0D, 0.0D); -@@ -239,7 +239,7 @@ public class MushroomCow extends Cow implements Shearable { +@@ -244,7 +244,7 @@ public class MushroomCow extends Cow implements Shearable { this.discard(); // CraftBukkit - from above // CraftBukkit end @@ -68,10 +68,10 @@ index 16b4b6a382db7c81eb19771a4fa0cc3ae73c3645..6fc17adcfd300796579badc5af3ce2e8 ItemEntity entityitem = new ItemEntity(this.level, this.getX(), this.getY(1.0D), this.getZ(), new ItemStack(this.getMushroomType().blockState.getBlock())); EntityDropItemEvent event = new EntityDropItemEvent(this.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); 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 3e72abd93bc5b9f97c2bd62702273d63b43cc245..6c044f123c0cdcdaec93b6761a117493c4a5bbe8 100644 +index fbe71ed86553965aa9fc20b7d8e6fdefd1d85a60..d61204c8aaef5e0e4e79096b6469ce3f6e8f92af 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -266,7 +266,7 @@ public class Sheep extends Animal implements Shearable { +@@ -271,7 +271,7 @@ public class Sheep extends Animal implements Shearable { return InteractionResult.PASS; } // CraftBukkit end @@ -80,7 +80,7 @@ index 3e72abd93bc5b9f97c2bd62702273d63b43cc245..6c044f123c0cdcdaec93b6761a117493 this.gameEvent(GameEvent.SHEAR, (Entity) player); itemstack.hurtAndBreak(1, player, (entityhuman1) -> { entityhuman1.broadcastBreakEvent(hand); -@@ -281,10 +281,11 @@ public class Sheep extends Animal implements Shearable { +@@ -286,10 +286,11 @@ public class Sheep extends Animal implements Shearable { } @Override @@ -94,10 +94,10 @@ index 3e72abd93bc5b9f97c2bd62702273d63b43cc245..6c044f123c0cdcdaec93b6761a117493 for (int j = 0; j < i; ++j) { this.forceDrops = true; // CraftBukkit 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 d60cb629586e6eccfcd79b1b2e4da119550497f3..465bd5c7401ec29d0c43d9add3b072542a2c7923 100644 +index 2396c175433fdfe23b0db0e3303d82c34309a540..dc9694ec29bc1a522a1501caa6e2b63f358fe564 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -195,7 +195,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -200,7 +200,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM return tryRide(player, hand); // Purpur } // CraftBukkit end @@ -106,7 +106,7 @@ index d60cb629586e6eccfcd79b1b2e4da119550497f3..465bd5c7401ec29d0c43d9add3b07254 this.gameEvent(GameEvent.SHEAR, (Entity) player); if (!this.level.isClientSide) { itemstack.hurtAndBreak(1, player, (entityhuman1) -> { -@@ -218,12 +218,13 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -223,12 +223,13 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM } @Override diff --git a/patches/server/0254-Stop-bees-from-dying-after-stinging.patch b/patches/server/0254-Stop-bees-from-dying-after-stinging.patch index bdc5037313..a917716a10 100644 --- a/patches/server/0254-Stop-bees-from-dying-after-stinging.patch +++ b/patches/server/0254-Stop-bees-from-dying-after-stinging.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Stop bees from dying after stinging 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 350863ed11b62600dc88324283637a01162acd21..6819e007d892ee855d3e9fdab0340538cd81abf8 100644 +index e2a3a3e2722c7c5fae232ce30538ccb5fa663b7d..19cc69f9bca1bb86d0a84345ae39a0a18f87fa54 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -451,6 +451,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -456,6 +456,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.hurt(DamageSource.DROWN, 1.0F); } @@ -17,10 +17,10 @@ index 350863ed11b62600dc88324283637a01162acd21..6819e007d892ee855d3e9fdab0340538 ++this.timeSinceSting; if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, (int) 1, (int) 1200)) == 0) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f73df2c3cb5c15bf409804de9da14098de355822..cbc915076d8ba7da3ca83b43d296f7d36a12b98b 100644 +index cd900a8022aa23da4ab2a294c74100fc80fb960d..6259405b9e934534163f32cf7ba4036ebbd8859a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1071,6 +1071,7 @@ public class PurpurWorldConfig { +@@ -1076,6 +1076,7 @@ public class PurpurWorldConfig { public boolean beeCanWorkAtNight = false; public boolean beeCanWorkInRain = false; public boolean beeAlwaysDropExp = false; @@ -28,7 +28,7 @@ index f73df2c3cb5c15bf409804de9da14098de355822..cbc915076d8ba7da3ca83b43d296f7d3 private void beeSettings() { beeRidable = getBoolean("mobs.bee.ridable", beeRidable); beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); -@@ -1086,6 +1087,7 @@ public class PurpurWorldConfig { +@@ -1092,6 +1093,7 @@ public class PurpurWorldConfig { beeCanWorkAtNight = getBoolean("mobs.bee.can-work-at-night", beeCanWorkAtNight); beeCanWorkInRain = getBoolean("mobs.bee.can-work-in-rain", beeCanWorkInRain); beeAlwaysDropExp = getBoolean("mobs.bee.always-drop-exp", beeAlwaysDropExp); diff --git a/patches/server/0260-Configurable-phantom-size.patch b/patches/server/0260-Configurable-phantom-size.patch index 989dabc39f..cba9368e4f 100644 --- a/patches/server/0260-Configurable-phantom-size.patch +++ b/patches/server/0260-Configurable-phantom-size.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable phantom size diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index bf6adaa28142019182b984b3b6aa244af970d6f5..520a5a6f3683048d64edc96b6ee69ffbbdb29af9 100644 +index 9d83b50d43edc7bfd857daab7be90558d86ca334..c12fbc6a8ba9fd6807a5d43c49881ea4e5c016e1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -270,7 +270,11 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -275,7 +275,11 @@ public class Phantom extends FlyingMob implements Enemy { @Override public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, @Nullable SpawnGroupData entityData, @Nullable CompoundTag entityNbt) { this.anchorPoint = this.blockPosition().above(5); @@ -22,10 +22,10 @@ index bf6adaa28142019182b984b3b6aa244af970d6f5..520a5a6f3683048d64edc96b6ee69ffb } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9e9c0b4ea3247d676f351cc1ef1f246c3b3eb297..a1cd8d5bd68b74bc7548105255061e8caf7374a5 100644 +index 6cb51605e560b9e4a57cb87b9b731575f4c1cd8c..2de131b31d8c80ca9be130b8755db9bec379cf6c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1925,6 +1925,8 @@ public class PurpurWorldConfig { +@@ -1992,6 +1992,8 @@ public class PurpurWorldConfig { public boolean phantomFlamesOnSwoop = false; public boolean phantomTakeDamageFromWater = false; public boolean phantomAlwaysDropExp = false; @@ -34,7 +34,7 @@ index 9e9c0b4ea3247d676f351cc1ef1f246c3b3eb297..a1cd8d5bd68b74bc7548105255061e8c private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1966,6 +1968,13 @@ public class PurpurWorldConfig { +@@ -2034,6 +2036,13 @@ public class PurpurWorldConfig { phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); phantomTakeDamageFromWater = getBoolean("mobs.phantom.takes-damage-from-water", phantomTakeDamageFromWater); phantomAlwaysDropExp = getBoolean("mobs.phantom.always-drop-exp", phantomAlwaysDropExp);