From a255ef31df3887033d7d583a3b49855c52711c93 Mon Sep 17 00:00:00 2001 From: granny Date: Sun, 12 Jan 2025 13:55:27 -0800 Subject: [PATCH] port Mobs always drop experience patch --- .../0216-Mobs-always-drop-experience.patch | 2386 ----------------- .../features/0001-Ridables.patch | 16 +- ...-Configurable-entity-base-attributes.patch | 10 +- ...urable-void-damage-height-and-damage.patch | 6 +- ...019-API-for-any-mob-to-burn-daylight.patch | 8 +- .../0021-Mobs-always-drop-experience.patch | 1302 +++++++++ .../purpurmc/purpur/PurpurWorldConfig.java | 144 + 7 files changed, 1466 insertions(+), 2406 deletions(-) delete mode 100644 patches/server/0216-Mobs-always-drop-experience.patch create mode 100644 purpur-server/minecraft-patches/features/0021-Mobs-always-drop-experience.patch diff --git a/patches/server/0216-Mobs-always-drop-experience.patch b/patches/server/0216-Mobs-always-drop-experience.patch deleted file mode 100644 index 15488f7a2..000000000 --- a/patches/server/0216-Mobs-always-drop-experience.patch +++ /dev/null @@ -1,2386 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: BillyGalbreath -Date: Tue, 21 Dec 2021 20:40:42 -0600 -Subject: [PATCH] Mobs always drop experience - - -diff --git a/net/minecraft/world/entity/GlowSquid.java b/net/minecraft/world/entity/GlowSquid.java -index 781f0adde9194162af57523aad4b73a358f622a7..97a062c48b22c34edb2a5ad8b8c2f5443e6f7556 100644 ---- a/net/minecraft/world/entity/GlowSquid.java -+++ b/net/minecraft/world/entity/GlowSquid.java -@@ -50,6 +50,12 @@ public class GlowSquid extends Squid { - return this.level().purpurConfig.glowSquidTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.glowSquidAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public boolean canFly() { - return this.level().purpurConfig.glowSquidsCanFly; -diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index 7b647f41bd5ca4fa62795ad2fbcb5b73a3405979..b9d146547a6993a960618bfd95f617046666e8eb 100644 ---- a/net/minecraft/world/entity/ambient/Bat.java -+++ b/net/minecraft/world/entity/ambient/Bat.java -@@ -120,6 +120,12 @@ public class Bat extends AmbientCreature { - return this.level().purpurConfig.batTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.batAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public boolean isFlapping() { - return !this.isResting() && (float) this.tickCount % 10.0F == 0.0F; -diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index e191e27308dd8c5c8702692091541756f2b57ac1..c73cc8ffe5f67826971872de78adce72d202325a 100644 ---- a/net/minecraft/world/entity/animal/Bee.java -+++ b/net/minecraft/world/entity/animal/Bee.java -@@ -502,6 +502,12 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - return this.level().purpurConfig.beeBreedingTicks; - } - // Purpur end - Make entity breeding times configurable -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.beeAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public boolean isSensitiveToWater() { - return this.level().purpurConfig.beeTakeDamageFromWater; -diff --git a/net/minecraft/world/entity/animal/Cat.java b/net/minecraft/world/entity/animal/Cat.java -index 9bf07130a86ac8ab153eb7547c451d35eb2bb016..5a3348ca39b86cfea941fdfb98ca90a7a0ef908d 100644 ---- a/net/minecraft/world/entity/animal/Cat.java -+++ b/net/minecraft/world/entity/animal/Cat.java -@@ -144,6 +144,12 @@ public class Cat extends TamableAnimal implements VariantHolder { -diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java -index 09ad3ca4fd5aaebb1f394e73bc030ffa798346ba..550b1035c2d6c6c7f0fc959e1a82c867c1f362d8 100644 ---- a/net/minecraft/world/entity/animal/Chicken.java -+++ b/net/minecraft/world/entity/animal/Chicken.java -@@ -94,6 +94,12 @@ public class Chicken extends Animal { - return this.level().purpurConfig.chickenTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.chickenAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Cod.java b/net/minecraft/world/entity/animal/Cod.java -index 478fb13b84609a545713371f903e4d6042747e94..a2d946aa9784e49e628fe6ebbdcbf9ce4423520f 100644 ---- a/net/minecraft/world/entity/animal/Cod.java -+++ b/net/minecraft/world/entity/animal/Cod.java -@@ -37,6 +37,12 @@ public class Cod extends AbstractSchoolingFish { - return this.level().purpurConfig.codTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.codAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public ItemStack getBucketItemStack() { - return new ItemStack(Items.COD_BUCKET); -diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java -index 42324d0d22c1f1a233aa6e6a810171b26894f8bc..845206570193682f5aca5abbb6915a64fa7f5044 100644 ---- a/net/minecraft/world/entity/animal/Cow.java -+++ b/net/minecraft/world/entity/animal/Cow.java -@@ -82,6 +82,12 @@ public class Cow extends Animal { - return this.level().purpurConfig.cowTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.cowAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public net.minecraft.world.entity.SpawnGroupData finalizeSpawn(net.minecraft.world.level.ServerLevelAccessor world, net.minecraft.world.DifficultyInstance difficulty, net.minecraft.world.entity.EntitySpawnReason spawnReason, net.minecraft.world.entity.SpawnGroupData entityData) { - this.isNaturallyAggressiveToPlayers = world.getLevel().purpurConfig.cowNaturallyAggressiveToPlayersChance > 0.0D && random.nextDouble() <= world.getLevel().purpurConfig.cowNaturallyAggressiveToPlayersChance; -diff --git a/net/minecraft/world/entity/animal/Dolphin.java b/net/minecraft/world/entity/animal/Dolphin.java -index 64d1e932ac3bc673cffa324d8e75e8da596d6941..abbf13d79b4c1ed46bd486ebbd4ff5001bb096b5 100644 ---- a/net/minecraft/world/entity/animal/Dolphin.java -+++ b/net/minecraft/world/entity/animal/Dolphin.java -@@ -175,6 +175,12 @@ public class Dolphin extends AgeableWaterCreature { - return this.level().purpurConfig.dolphinTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.dolphinAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Nullable - @Override - public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData entityData) { -diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index a758f312ae4ed4a0404ca7cedbd8c7b88aef58f4..fb75b983f7c522708964a9352546ae29611bf4e9 100644 ---- a/net/minecraft/world/entity/animal/Fox.java -+++ b/net/minecraft/world/entity/animal/Fox.java -@@ -201,6 +201,12 @@ public class Fox extends Animal implements VariantHolder { - return this.level().purpurConfig.foxTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.foxAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index 2cde18232b4101a5b20ca7897c0b8638eab68169..caa29df16214c60c4e0a471ad6320ea5d62ba7d0 100644 ---- a/net/minecraft/world/entity/animal/IronGolem.java -+++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -103,6 +103,12 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - this.summoner = summoner; - } - // Purpur end - Summoner API -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.ironGolemAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/animal/MushroomCow.java b/net/minecraft/world/entity/animal/MushroomCow.java -index a8694e39954db18840e7c066ef6bcb58e3399c0b..481d373d3906f35d0e8e7aeaef3b70b4d443894f 100644 ---- a/net/minecraft/world/entity/animal/MushroomCow.java -+++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -99,6 +99,12 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { - return this.level().purpurConfig.rabbitTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.rabbitAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Salmon.java b/net/minecraft/world/entity/animal/Salmon.java -index 053c2773b52bd3399c3812452dbee2d1882d32a2..b0ac0fb823cb2860e301c63c4cd2d35cdf108275 100644 ---- a/net/minecraft/world/entity/animal/Salmon.java -+++ b/net/minecraft/world/entity/animal/Salmon.java -@@ -59,6 +59,12 @@ public class Salmon extends AbstractSchoolingFish implements VariantHolder, B - return this.level().purpurConfig.axolotlTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.axolotlAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public float getWalkTargetValue(BlockPos pos, LevelReader world) { - return 0.0F; -diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 4a8ac3d75a3c75eea8e361d7eb729f27ea807347..214a97aa88c569f55619512e712b7bfe32d26b30 100644 ---- a/net/minecraft/world/entity/animal/goat/Goat.java -+++ b/net/minecraft/world/entity/animal/goat/Goat.java -@@ -122,6 +122,12 @@ public class Goat extends Animal { - return this.level().purpurConfig.goatTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.goatAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected Brain.Provider brainProvider() { - return Brain.provider(Goat.MEMORY_TYPES, Goat.SENSOR_TYPES); -diff --git a/net/minecraft/world/entity/animal/horse/Donkey.java b/net/minecraft/world/entity/animal/horse/Donkey.java -index 6a511e01f8805451ce89d697568c23803b5985a8..dc1ed34349a6d0d2f233d35a81f2c28e32b10210 100644 ---- a/net/minecraft/world/entity/animal/horse/Donkey.java -+++ b/net/minecraft/world/entity/animal/horse/Donkey.java -@@ -51,6 +51,12 @@ public class Donkey extends AbstractChestedHorse { - return this.level().purpurConfig.donkeyTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.donkeyAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected SoundEvent getAmbientSound() { - return SoundEvents.DONKEY_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/Horse.java b/net/minecraft/world/entity/animal/horse/Horse.java -index c5ba0669b7e184ac42243a65a230fe325c3f84cc..b39cbc42acacdedecfc996dbe25b3773a9fae8b2 100644 ---- a/net/minecraft/world/entity/animal/horse/Horse.java -+++ b/net/minecraft/world/entity/animal/horse/Horse.java -@@ -78,6 +78,12 @@ public class Horse extends AbstractHorse implements VariantHolder { - return this.level().purpurConfig.horseTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.horseAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void randomizeAttributes(RandomSource random) { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt)); -diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java -index ee8d756fed5b6458b28acbd2a62a5693baddd45d..3c265a80f55eee38406066cd02460b18fbac896d 100644 ---- a/net/minecraft/world/entity/animal/horse/Llama.java -+++ b/net/minecraft/world/entity/animal/horse/Llama.java -@@ -152,6 +152,12 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, ServerLevelAccessor world, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random) { - return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (EntitySpawnReason.isSpawner(spawnReason) || world.canSeeSky(pos)); - } -diff --git a/net/minecraft/world/entity/monster/Illusioner.java b/net/minecraft/world/entity/monster/Illusioner.java -index d0fe85e7c44b78a078e6c2d6220849a336b079d3..83b64a8091a85b9eb940af33e4d44bd4a906b248 100644 ---- a/net/minecraft/world/entity/monster/Illusioner.java -+++ b/net/minecraft/world/entity/monster/Illusioner.java -@@ -91,6 +91,12 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - return this.level().purpurConfig.illusionerTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.illusionerAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - super.registerGoals(); -diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java -index 8f0e9f854c4032c43cc1c9a8b087a5fa286326d8..2449a960493cbd99a22ce9b8d2fe852d1ec4b20d 100644 ---- a/net/minecraft/world/entity/monster/MagmaCube.java -+++ b/net/minecraft/world/entity/monster/MagmaCube.java -@@ -73,6 +73,12 @@ public class MagmaCube extends Slime { - return this.level().purpurConfig.magmaCubeTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.magmaCubeAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - public static AttributeSupplier.Builder createAttributes() { - return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F); - } -diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 71bbb3209acc12c9f20b8964770be8666a7e72f8..0682479b37064d7690c8da1569de8f7452a0439d 100644 ---- a/net/minecraft/world/entity/monster/Phantom.java -+++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -145,6 +145,12 @@ public class Phantom extends FlyingMob implements Enemy { - return crystalPosition != null; - } - // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.phantomAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public boolean isFlapping() { - return (this.getUniqueFlapTickOffset() + this.tickCount) % Phantom.TICKS_PER_FLAP == 0; -diff --git a/net/minecraft/world/entity/monster/Pillager.java b/net/minecraft/world/entity/monster/Pillager.java -index 0bc9ee0de4f30d4d57164e02992856a0bfa92041..5b98144992c366009a2b2c48e13884ceaf72acfb 100644 ---- a/net/minecraft/world/entity/monster/Pillager.java -+++ b/net/minecraft/world/entity/monster/Pillager.java -@@ -97,6 +97,12 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - return this.level().purpurConfig.pillagerTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.pillagerAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - super.registerGoals(); -diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index 7fb2af68c101dc12e60f120da1bb5c1efd20d164..95562e3614880702655df4578119e6cf3702e566 100644 ---- a/net/minecraft/world/entity/monster/Ravager.java -+++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -111,6 +111,12 @@ public class Ravager extends Raider { - return this.level().purpurConfig.ravagerTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.ravagerAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - super.registerGoals(); -diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index 2052549f2e6b23aff5491bb0cc1af00b7f560227..78ac42c89cb768e0dfb17197a850a029937c145c 100644 ---- a/net/minecraft/world/entity/monster/Shulker.java -+++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -126,6 +126,12 @@ public class Shulker extends AbstractGolem implements VariantHolder type, ServerLevelAccessor world, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { -diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index 420118b1df271377f69e8e2bab8a62623382c819..df44d9fbb71ff252cd261fc8da6de14383e054de 100644 ---- a/net/minecraft/world/entity/monster/Strider.java -+++ b/net/minecraft/world/entity/monster/Strider.java -@@ -127,6 +127,12 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { - return this.level().purpurConfig.striderBreedingTicks; - } - // Purpur end - Make entity breeding times configurable -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.striderAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random) { - BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable(); - -diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index 1630074bf8065a7ecf49d426f8d5fe5e109b1d2c..ec61bc0d9b934ceed15b721e86200abfea21a923 100644 ---- a/net/minecraft/world/entity/monster/Vex.java -+++ b/net/minecraft/world/entity/monster/Vex.java -@@ -116,6 +116,12 @@ public class Vex extends Monster implements TraceableEntity { - return this.level().purpurConfig.vexTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.vexAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public boolean isFlapping() { - return this.tickCount % Vex.TICKS_PER_FLAP == 0; -diff --git a/net/minecraft/world/entity/monster/Vindicator.java b/net/minecraft/world/entity/monster/Vindicator.java -index 5693081f061dcefbfda374c26a6ab5be0c2e2fcc..3d1cb875edfe6bf5c9e3f4b7dade7868b7dbfa93 100644 ---- a/net/minecraft/world/entity/monster/Vindicator.java -+++ b/net/minecraft/world/entity/monster/Vindicator.java -@@ -85,6 +85,12 @@ public class Vindicator extends AbstractIllager { - return this.level().purpurConfig.vindicatorTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.vindicatorAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - super.registerGoals(); -diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index f77ce3de847ea5c7f40bfa6bd4bba254dc863bd0..8e7f4cb8ede8721f05c6c35e9b4d08884254853e 100644 ---- a/net/minecraft/world/entity/monster/Witch.java -+++ b/net/minecraft/world/entity/monster/Witch.java -@@ -87,6 +87,12 @@ public class Witch extends Raider implements RangedAttackMob { - return this.level().purpurConfig.witchTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.witchAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - super.registerGoals(); -diff --git a/net/minecraft/world/entity/monster/WitherSkeleton.java b/net/minecraft/world/entity/monster/WitherSkeleton.java -index 1a864ebb6257f34e8fb7a543d6da19cfa96bb7d0..351a35bdcb820c9c65aeddfbe0f00486d8057f7c 100644 ---- a/net/minecraft/world/entity/monster/WitherSkeleton.java -+++ b/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -66,6 +66,12 @@ public class WitherSkeleton extends AbstractSkeleton { - return this.level().purpurConfig.witherSkeletonTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.witherSkeletonAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); -diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index 1c2c0f94811f934804cfb0be15fa55c0281ad0ba..8aec50e7330d16bd3d0bc027c191fa1a4ce4552b 100644 ---- a/net/minecraft/world/entity/monster/Zoglin.java -+++ b/net/minecraft/world/entity/monster/Zoglin.java -@@ -115,6 +115,12 @@ public class Zoglin extends Monster implements HoglinBase { - return this.level().purpurConfig.zoglinTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.zoglinAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index 37ee837f6e722cd4cb07ae9fcd366a1473dc0b49..867d9ddce630482a7d3fadfe5aab213a0f912ca4 100644 ---- a/net/minecraft/world/entity/monster/Zombie.java -+++ b/net/minecraft/world/entity/monster/Zombie.java -@@ -154,6 +154,12 @@ public class Zombie extends Monster { - return this.level().purpurConfig.zombieTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.zombieAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index 40490767e474bc1e954c8f837f25268d2fd38f5b..bba3562bf316878e7b8ba6a138889d9583a1b0f6 100644 ---- a/net/minecraft/world/entity/monster/ZombieVillager.java -+++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -135,6 +135,12 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - return this.level().purpurConfig.zombieVillagerTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.zombieVillagerAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 3070f4484276f8ea6b95134abda6409e58f1161a..c0e611f3222ffacfbd0683c8c65b778f9012a2ad 100644 ---- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java -+++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -109,6 +109,12 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - return this.level().purpurConfig.zombifiedPiglinTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.zombifiedPiglinAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public void setPersistentAngerTarget(@Nullable UUID angryAt) { - this.persistentAngerTarget = angryAt; -diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 534626336e45da2c67cb023f4e5feea59daa8b5d..5e8da964681cb63d7733af8b5173715fd7e54a63 100644 ---- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java -+++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -112,6 +112,12 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - return this.level().purpurConfig.hoglinTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.hoglinAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public boolean canBeLeashed() { - return true; -diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index f0b0642571a242f9c22febbafba587f1ca6caaaa..468be0368d0f485eaa2a5c321f45986bf5156b4b 100644 ---- a/net/minecraft/world/entity/monster/piglin/Piglin.java -+++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -129,6 +129,12 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - return this.level().purpurConfig.piglinTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.piglinAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public void addAdditionalSaveData(CompoundTag nbt) { - super.addAdditionalSaveData(nbt); -diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index 0e77e9e4a4fd14b5cecc377a03f0d6b2c9df039f..24e198440d4841daac664dc6c5a8a3dc6825b469 100644 ---- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -+++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -@@ -95,6 +95,12 @@ public class PiglinBrute extends AbstractPiglin { - return this.level().purpurConfig.piglinBruteTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.piglinBruteAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - public static AttributeSupplier.Builder createAttributes() { - return Monster.createMonsterAttributes() - .add(Attributes.MAX_HEALTH, 50.0) -diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index c912268081beda34c472cff13e41c9dfd51902f2..fcaf3db893d14b8359bddc1cc69da82e533ebc87 100644 ---- a/net/minecraft/world/entity/npc/Villager.java -+++ b/net/minecraft/world/entity/npc/Villager.java -@@ -199,6 +199,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - return this.level().purpurConfig.villagerTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.villagerAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - public Brain getBrain() { - return (Brain) super.getBrain(); // CraftBukkit - decompile error -diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java -index 2cfd9c9194edda92185adecca80c5cd140e26c9f..89ad300d0ba9088af64fb9fee19399939bb4eff6 100644 ---- a/net/minecraft/world/entity/npc/WanderingTrader.java -+++ b/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -113,6 +113,12 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - return this.level().purpurConfig.wanderingTraderTakeDamageFromWater; - } - // Purpur end - Toggle for water sensitive mob damage -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.wanderingTraderAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1f5b541cd87c4e6fafbd1ee9b75d4a323aeacaa1..d1a20069971e46a5bd58a31390b54f9216d9cb64 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1096,6 +1096,7 @@ public class PurpurWorldConfig { - public double axolotlScale = 1.0D; - public int axolotlBreedingTicks = 6000; - public boolean axolotlTakeDamageFromWater = false; -+ public boolean axolotlAlwaysDropExp = false; - private void axolotlSettings() { - axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); - axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); -@@ -1103,6 +1104,7 @@ public class PurpurWorldConfig { - axolotlScale = Mth.clamp(getDouble("mobs.axolotl.attributes.scale", axolotlScale), 0.0625D, 16.0D); - axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); - axolotlTakeDamageFromWater = getBoolean("mobs.axolotl.takes-damage-from-water", axolotlTakeDamageFromWater); -+ axolotlAlwaysDropExp = getBoolean("mobs.axolotl.always-drop-exp", axolotlAlwaysDropExp); - } - - public boolean batRidable = false; -@@ -1119,6 +1121,7 @@ public class PurpurWorldConfig { - public double batArmorToughness = 0.0D; - public double batAttackKnockback = 0.0D; - public boolean batTakeDamageFromWater = false; -+ public boolean batAlwaysDropExp = false; - private void batSettings() { - batRidable = getBoolean("mobs.bat.ridable", batRidable); - batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); -@@ -1139,6 +1142,7 @@ public class PurpurWorldConfig { - batArmorToughness = getDouble("mobs.bat.attributes.armor_toughness", batArmorToughness); - batAttackKnockback = getDouble("mobs.bat.attributes.attack_knockback", batAttackKnockback); - batTakeDamageFromWater = getBoolean("mobs.bat.takes-damage-from-water", batTakeDamageFromWater); -+ batAlwaysDropExp = getBoolean("mobs.bat.always-drop-exp", batAlwaysDropExp); - } - - public boolean beeRidable = false; -@@ -1151,6 +1155,7 @@ public class PurpurWorldConfig { - public boolean beeTakeDamageFromWater = true; - public boolean beeCanWorkAtNight = false; - public boolean beeCanWorkInRain = false; -+ public boolean beeAlwaysDropExp = false; - private void beeSettings() { - beeRidable = getBoolean("mobs.bee.ridable", beeRidable); - beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); -@@ -1167,6 +1172,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); -+ beeAlwaysDropExp = getBoolean("mobs.bee.always-drop-exp", beeAlwaysDropExp); - } - - public boolean blazeRidable = false; -@@ -1176,6 +1182,7 @@ public class PurpurWorldConfig { - public double blazeMaxHealth = 20.0D; - public double blazeScale = 1.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); -@@ -1189,6 +1196,7 @@ public class PurpurWorldConfig { - blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); - blazeScale = Mth.clamp(getDouble("mobs.blaze.attributes.scale", blazeScale), 0.0625D, 16.0D); - blazeTakeDamageFromWater = getBoolean("mobs.blaze.takes-damage-from-water", blazeTakeDamageFromWater); -+ blazeAlwaysDropExp = getBoolean("mobs.blaze.always-drop-exp", blazeAlwaysDropExp); - } - - public boolean boggedRidable = false; -@@ -1234,6 +1242,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); -@@ -1255,6 +1264,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; -@@ -1263,6 +1273,7 @@ public class PurpurWorldConfig { - public double caveSpiderMaxHealth = 12.0D; - public double caveSpiderScale = 1.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); -@@ -1275,6 +1286,7 @@ public class PurpurWorldConfig { - caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); - caveSpiderScale = Mth.clamp(getDouble("mobs.cave_spider.attributes.scale", caveSpiderScale), 0.0625D, 16.0D); - caveSpiderTakeDamageFromWater = getBoolean("mobs.cave_spider.takes-damage-from-water", caveSpiderTakeDamageFromWater); -+ caveSpiderAlwaysDropExp = getBoolean("mobs.cave_spider.always-drop-exp", caveSpiderAlwaysDropExp); - } - - public boolean chickenRidable = false; -@@ -1285,6 +1297,7 @@ public class PurpurWorldConfig { - public boolean chickenRetaliate = false; - public int chickenBreedingTicks = 6000; - public boolean chickenTakeDamageFromWater = false; -+ public boolean chickenAlwaysDropExp = false; - private void chickenSettings() { - chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); - chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -1299,6 +1312,7 @@ 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); -+ chickenAlwaysDropExp = getBoolean("mobs.chicken.always-drop-exp", chickenAlwaysDropExp); - } - - public boolean codRidable = false; -@@ -1306,6 +1320,7 @@ public class PurpurWorldConfig { - public double codMaxHealth = 3.0D; - public double codScale = 1.0D; - public boolean codTakeDamageFromWater = false; -+ public boolean codAlwaysDropExp = false; - private void codSettings() { - codRidable = getBoolean("mobs.cod.ridable", codRidable); - codControllable = getBoolean("mobs.cod.controllable", codControllable); -@@ -1317,6 +1332,7 @@ public class PurpurWorldConfig { - codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); - codScale = Mth.clamp(getDouble("mobs.cod.attributes.scale", codScale), 0.0625D, 16.0D); - codTakeDamageFromWater = getBoolean("mobs.cod.takes-damage-from-water", codTakeDamageFromWater); -+ codAlwaysDropExp = getBoolean("mobs.cod.always-drop-exp", codAlwaysDropExp); - } - - public boolean cowRidable = false; -@@ -1329,6 +1345,7 @@ public class PurpurWorldConfig { - public boolean cowTakeDamageFromWater = false; - public double cowNaturallyAggressiveToPlayersChance = 0.0D; - public double cowNaturallyAggressiveToPlayersDamage = 2.0D; -+ public boolean cowAlwaysDropExp = false; - private void cowSettings() { - if (PurpurConfig.version < 22) { - double oldValue = getDouble("mobs.cow.naturally-aggressive-to-players-chance", cowNaturallyAggressiveToPlayersChance); -@@ -1350,6 +1367,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); -+ cowAlwaysDropExp = getBoolean("mobs.cow.always-drop-exp", cowAlwaysDropExp); - } - - public boolean creakingRidable = false; -@@ -1376,6 +1394,7 @@ public class PurpurWorldConfig { - public boolean creeperTakeDamageFromWater = false; - public boolean creeperExplodeWhenKilled = false; - public boolean creeperHealthRadius = false; -+ public boolean creeperAlwaysDropExp = false; - private void creeperSettings() { - creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); - creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -1393,6 +1412,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); -+ creeperAlwaysDropExp = getBoolean("mobs.creeper.always-drop-exp", creeperAlwaysDropExp); - } - - public boolean dolphinRidable = false; -@@ -1405,6 +1425,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); - dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); -@@ -1421,6 +1442,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); -+ dolphinAlwaysDropExp = getBoolean("mobs.dolphin.always-drop-exp", dolphinAlwaysDropExp); - } - - public boolean donkeyRidableInWater = false; -@@ -1432,6 +1454,7 @@ public class PurpurWorldConfig { - public double donkeyMovementSpeedMax = 0.175D; - public int donkeyBreedingTicks = 6000; - public boolean donkeyTakeDamageFromWater = false; -+ public boolean donkeyAlwaysDropExp = false; - private void donkeySettings() { - donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); - if (PurpurConfig.version < 10) { -@@ -1449,6 +1472,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); -+ donkeyAlwaysDropExp = getBoolean("mobs.donkey.always-drop-exp", donkeyAlwaysDropExp); - } - - public boolean drownedRidable = false; -@@ -1462,6 +1486,7 @@ public class PurpurWorldConfig { - public boolean drownedJockeyTryExistingChickens = true; - public boolean drownedTakeDamageFromWater = false; - public boolean drownedBreakDoors = false; -+ public boolean drownedAlwaysDropExp = false; - private void drownedSettings() { - drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); - drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -1479,6 +1504,7 @@ 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); -+ drownedAlwaysDropExp = getBoolean("mobs.drowned.always-drop-exp", drownedAlwaysDropExp); - } - - public boolean elderGuardianRidable = false; -@@ -1486,6 +1512,7 @@ public class PurpurWorldConfig { - public double elderGuardianMaxHealth = 80.0D; - public double elderGuardianScale = 1.0D; - public boolean elderGuardianTakeDamageFromWater = false; -+ public boolean elderGuardianAlwaysDropExp = false; - private void elderGuardianSettings() { - elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); - elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); -@@ -1497,6 +1524,7 @@ public class PurpurWorldConfig { - elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); - elderGuardianScale = Mth.clamp(getDouble("mobs.elder_guardian.attributes.scale", elderGuardianScale), 0.0625D, 16.0D); - elderGuardianTakeDamageFromWater = getBoolean("mobs.elder_guardian.takes-damage-from-water", elderGuardianTakeDamageFromWater); -+ elderGuardianAlwaysDropExp = getBoolean("mobs.elder_guardian.always-drop-exp", elderGuardianAlwaysDropExp); - } - - public boolean enderDragonRidable = false; -@@ -1542,6 +1570,7 @@ public class PurpurWorldConfig { - public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; - public boolean endermanDisableStareAggro = false; - public boolean endermanIgnoreProjectiles = false; -+ public boolean endermanAlwaysDropExp = false; - private void endermanSettings() { - endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); - endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -1565,6 +1594,7 @@ public class PurpurWorldConfig { - endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); - endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); - endermanIgnoreProjectiles = getBoolean("mobs.enderman.ignore-projectiles", endermanIgnoreProjectiles); -+ endermanAlwaysDropExp = getBoolean("mobs.enderman.always-drop-exp", endermanAlwaysDropExp); - } - - public boolean endermiteRidable = false; -@@ -1573,6 +1603,7 @@ public class PurpurWorldConfig { - public double endermiteMaxHealth = 8.0D; - public double endermiteScale = 1.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); -@@ -1585,6 +1616,7 @@ public class PurpurWorldConfig { - endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); - endermiteScale = Mth.clamp(getDouble("mobs.endermite.attributes.scale", endermiteScale), 0.0625D, 16.0D); - endermiteTakeDamageFromWater = getBoolean("mobs.endermite.takes-damage-from-water", endermiteTakeDamageFromWater); -+ endermiteAlwaysDropExp = getBoolean("mobs.endermite.always-drop-exp", endermiteAlwaysDropExp); - } - - public boolean evokerRidable = false; -@@ -1594,6 +1626,7 @@ public class PurpurWorldConfig { - public double evokerScale = 1.0D; - public boolean evokerBypassMobGriefing = false; - public boolean evokerTakeDamageFromWater = false; -+ public boolean evokerAlwaysDropExp = false; - private void evokerSettings() { - evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); - evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -1607,6 +1640,7 @@ public class PurpurWorldConfig { - evokerScale = Mth.clamp(getDouble("mobs.evoker.attributes.scale", evokerScale), 0.0625D, 16.0D); - evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); - evokerTakeDamageFromWater = getBoolean("mobs.evoker.takes-damage-from-water", evokerTakeDamageFromWater); -+ evokerAlwaysDropExp = getBoolean("mobs.evoker.always-drop-exp", evokerAlwaysDropExp); - } - - public boolean foxRidable = false; -@@ -1618,6 +1652,7 @@ public class PurpurWorldConfig { - public int foxBreedingTicks = 6000; - public boolean foxBypassMobGriefing = false; - public boolean foxTakeDamageFromWater = false; -+ public boolean foxAlwaysDropExp = false; - private void foxSettings() { - foxRidable = getBoolean("mobs.fox.ridable", foxRidable); - foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -1633,6 +1668,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); -+ foxAlwaysDropExp = getBoolean("mobs.fox.always-drop-exp", foxAlwaysDropExp); - } - - public boolean frogRidable = false; -@@ -1655,6 +1691,7 @@ public class PurpurWorldConfig { - public double ghastMaxHealth = 10.0D; - public double ghastScale = 1.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); -@@ -1668,6 +1705,7 @@ public class PurpurWorldConfig { - ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); - ghastScale = Mth.clamp(getDouble("mobs.ghast.attributes.scale", ghastScale), 0.0625D, 16.0D); - ghastTakeDamageFromWater = getBoolean("mobs.ghast.takes-damage-from-water", ghastTakeDamageFromWater); -+ ghastAlwaysDropExp = getBoolean("mobs.ghast.always-drop-exp", ghastAlwaysDropExp); - } - - public boolean giantRidable = false; -@@ -1682,6 +1720,7 @@ public class PurpurWorldConfig { - public boolean giantHaveAI = false; - public boolean giantHaveHostileAI = false; - public boolean giantTakeDamageFromWater = false; -+ public boolean giantAlwaysDropExp = false; - private void giantSettings() { - giantRidable = getBoolean("mobs.giant.ridable", giantRidable); - giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); -@@ -1704,6 +1743,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); -+ giantAlwaysDropExp = getBoolean("mobs.giant.always-drop-exp", giantAlwaysDropExp); - } - - public boolean glowSquidRidable = false; -@@ -1712,6 +1752,7 @@ public class PurpurWorldConfig { - public double glowSquidScale = 1.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); -@@ -1719,6 +1760,7 @@ public class PurpurWorldConfig { - glowSquidScale = Mth.clamp(getDouble("mobs.glow_squid.attributes.scale", glowSquidScale), 0.0625D, 16.0D); - glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); - glowSquidTakeDamageFromWater = getBoolean("mobs.glow_squid.takes-damage-from-water", glowSquidTakeDamageFromWater); -+ glowSquidAlwaysDropExp = getBoolean("mobs.glow_squid.always-drop-exp", glowSquidAlwaysDropExp); - } - - public boolean goatRidable = false; -@@ -1728,6 +1770,7 @@ public class PurpurWorldConfig { - public double goatScale = 1.0D; - public int goatBreedingTicks = 6000; - public boolean goatTakeDamageFromWater = false; -+ public boolean goatAlwaysDropExp = false; - private void goatSettings() { - goatRidable = getBoolean("mobs.goat.ridable", goatRidable); - goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); -@@ -1736,6 +1779,7 @@ public class PurpurWorldConfig { - goatScale = Mth.clamp(getDouble("mobs.goat.attributes.scale", goatScale), 0.0625D, 16.0D); - goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); - goatTakeDamageFromWater = getBoolean("mobs.goat.takes-damage-from-water", goatTakeDamageFromWater); -+ goatAlwaysDropExp = getBoolean("mobs.goat.always-drop-exp", goatAlwaysDropExp); - } - - public boolean guardianRidable = false; -@@ -1743,6 +1787,7 @@ public class PurpurWorldConfig { - public double guardianMaxHealth = 30.0D; - public double guardianScale = 1.0D; - public boolean guardianTakeDamageFromWater = false; -+ public boolean guardianAlwaysDropExp = false; - private void guardianSettings() { - guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); - guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); -@@ -1754,6 +1799,7 @@ public class PurpurWorldConfig { - guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); - guardianScale = Mth.clamp(getDouble("mobs.guardian.attributes.scale", guardianScale), 0.0625D, 16.0D); - guardianTakeDamageFromWater = getBoolean("mobs.guardian.takes-damage-from-water", guardianTakeDamageFromWater); -+ guardianAlwaysDropExp = getBoolean("mobs.guardian.always-drop-exp", guardianAlwaysDropExp); - } - - public boolean forceHalloweenSeason = false; -@@ -1770,6 +1816,7 @@ public class PurpurWorldConfig { - public double hoglinScale = 1.0D; - public int hoglinBreedingTicks = 6000; - public boolean hoglinTakeDamageFromWater = false; -+ public boolean hoglinAlwaysDropExp = false; - private void hoglinSettings() { - hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); - hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -1783,6 +1830,7 @@ public class PurpurWorldConfig { - hoglinScale = Mth.clamp(getDouble("mobs.hoglin.attributes.scale", hoglinScale), 0.0625D, 16.0D); - hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); - hoglinTakeDamageFromWater = getBoolean("mobs.hoglin.takes-damage-from-water", hoglinTakeDamageFromWater); -+ hoglinAlwaysDropExp = getBoolean("mobs.hoglin.always-drop-exp", hoglinAlwaysDropExp); - } - - public boolean horseRidableInWater = false; -@@ -1794,6 +1842,7 @@ public class PurpurWorldConfig { - public double horseMovementSpeedMax = 0.3375D; - public int horseBreedingTicks = 6000; - public boolean horseTakeDamageFromWater = false; -+ public boolean horseAlwaysDropExp = false; - private void horseSettings() { - horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); - if (PurpurConfig.version < 10) { -@@ -1811,6 +1860,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); -+ horseAlwaysDropExp = getBoolean("mobs.horse.always-drop-exp", horseAlwaysDropExp); - } - - public boolean huskRidable = false; -@@ -1823,6 +1873,7 @@ public class PurpurWorldConfig { - public double huskJockeyChance = 0.05D; - public boolean huskJockeyTryExistingChickens = true; - public boolean huskTakeDamageFromWater = false; -+ public boolean huskAlwaysDropExp = false; - private void huskSettings() { - huskRidable = getBoolean("mobs.husk.ridable", huskRidable); - huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1839,6 +1890,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); -+ huskAlwaysDropExp = getBoolean("mobs.husk.always-drop-exp", huskAlwaysDropExp); - } - - public boolean illusionerRidable = false; -@@ -1849,6 +1901,7 @@ public class PurpurWorldConfig { - public double illusionerMaxHealth = 32.0D; - public double illusionerScale = 1.0D; - public boolean illusionerTakeDamageFromWater = false; -+ public boolean illusionerAlwaysDropExp = false; - private void illusionerSettings() { - illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); - illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); -@@ -1867,6 +1920,7 @@ public class PurpurWorldConfig { - illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); - illusionerScale = Mth.clamp(getDouble("mobs.illusioner.attributes.scale", illusionerScale), 0.0625D, 16.0D); - illusionerTakeDamageFromWater = getBoolean("mobs.illusioner.takes-damage-from-water", illusionerTakeDamageFromWater); -+ illusionerAlwaysDropExp = getBoolean("mobs.illusioner.always-drop-exp", illusionerAlwaysDropExp); - } - - public boolean ironGolemRidable = false; -@@ -1878,6 +1932,7 @@ public class PurpurWorldConfig { - public boolean ironGolemTakeDamageFromWater = false; - public boolean ironGolemPoppyCalm = false; - public boolean ironGolemHealCalm = false; -+ public boolean ironGolemAlwaysDropExp = false; - private void ironGolemSettings() { - ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); - ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); -@@ -1893,6 +1948,7 @@ public class PurpurWorldConfig { - ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater); - ironGolemPoppyCalm = getBoolean("mobs.iron_golem.poppy-calms-anger", ironGolemPoppyCalm); - ironGolemHealCalm = getBoolean("mobs.iron_golem.healing-calms-anger", ironGolemHealCalm); -+ ironGolemAlwaysDropExp = getBoolean("mobs.iron_golem.always-drop-exp", ironGolemAlwaysDropExp); - } - - public boolean llamaRidable = false; -@@ -1907,6 +1963,7 @@ public class PurpurWorldConfig { - public int llamaBreedingTicks = 6000; - public boolean llamaTakeDamageFromWater = false; - public boolean llamaJoinCaravans = true; -+ public boolean llamaAlwaysDropExp = false; - private void llamaSettings() { - llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); - llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1927,6 +1984,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); -+ llamaAlwaysDropExp = getBoolean("mobs.llama.always-drop-exp", llamaAlwaysDropExp); - } - - public boolean magmaCubeRidable = false; -@@ -1937,6 +1995,7 @@ public class PurpurWorldConfig { - public Map magmaCubeMaxHealthCache = new HashMap<>(); - public Map magmaCubeAttackDamageCache = new HashMap<>(); - public boolean magmaCubeTakeDamageFromWater = false; -+ public boolean magmaCubeAlwaysDropExp = false; - private void magmaCubeSettings() { - magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); - magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); -@@ -1951,6 +2010,7 @@ public class PurpurWorldConfig { - magmaCubeMaxHealthCache.clear(); - magmaCubeAttackDamageCache.clear(); - magmaCubeTakeDamageFromWater = getBoolean("mobs.magma_cube.takes-damage-from-water", magmaCubeTakeDamageFromWater); -+ magmaCubeAlwaysDropExp = getBoolean("mobs.magma_cube.always-drop-exp", magmaCubeAlwaysDropExp); - } - - public boolean mooshroomRidable = false; -@@ -1960,6 +2020,7 @@ public class PurpurWorldConfig { - public double mooshroomScale = 1.0D; - public int mooshroomBreedingTicks = 6000; - public boolean mooshroomTakeDamageFromWater = false; -+ public boolean mooshroomAlwaysDropExp = false; - private void mooshroomSettings() { - mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); - mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1973,6 +2034,7 @@ public class PurpurWorldConfig { - mooshroomScale = Mth.clamp(getDouble("mobs.mooshroom.attributes.scale", mooshroomScale), 0.0625D, 16.0D); - mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); - mooshroomTakeDamageFromWater = getBoolean("mobs.mooshroom.takes-damage-from-water", mooshroomTakeDamageFromWater); -+ mooshroomAlwaysDropExp = getBoolean("mobs.mooshroom.always-drop-exp", mooshroomAlwaysDropExp); - } - - public boolean muleRidableInWater = false; -@@ -1984,6 +2046,7 @@ public class PurpurWorldConfig { - public double muleMovementSpeedMax = 0.175D; - public int muleBreedingTicks = 6000; - public boolean muleTakeDamageFromWater = false; -+ public boolean muleAlwaysDropExp = false; - private void muleSettings() { - muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); - if (PurpurConfig.version < 10) { -@@ -2001,6 +2064,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); -+ muleAlwaysDropExp = getBoolean("mobs.mule.always-drop-exp", muleAlwaysDropExp); - } - - public boolean ocelotRidable = false; -@@ -2010,6 +2074,7 @@ public class PurpurWorldConfig { - public double ocelotScale = 1.0D; - public int ocelotBreedingTicks = 6000; - public boolean ocelotTakeDamageFromWater = false; -+ public boolean ocelotAlwaysDropExp = false; - private void ocelotSettings() { - ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); - ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -2023,6 +2088,7 @@ public class PurpurWorldConfig { - ocelotScale = Mth.clamp(getDouble("mobs.ocelot.attributes.scale", ocelotScale), 0.0625D, 16.0D); - ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); - ocelotTakeDamageFromWater = getBoolean("mobs.ocelot.takes-damage-from-water", ocelotTakeDamageFromWater); -+ ocelotAlwaysDropExp = getBoolean("mobs.ocelot.always-drop-exp", ocelotAlwaysDropExp); - } - - public boolean pandaRidable = false; -@@ -2032,6 +2098,7 @@ public class PurpurWorldConfig { - public double pandaScale = 1.0D; - public int pandaBreedingTicks = 6000; - public boolean pandaTakeDamageFromWater = false; -+ public boolean pandaAlwaysDropExp = false; - private void pandaSettings() { - pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); - pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -2045,6 +2112,7 @@ public class PurpurWorldConfig { - pandaScale = Mth.clamp(getDouble("mobs.panda.attributes.scale", pandaScale), 0.0625D, 16.0D); - pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); - pandaTakeDamageFromWater = getBoolean("mobs.panda.takes-damage-from-water", pandaTakeDamageFromWater); -+ pandaAlwaysDropExp = getBoolean("mobs.panda.always-drop-exp", pandaAlwaysDropExp); - } - - public boolean parrotRidable = false; -@@ -2055,6 +2123,7 @@ public class PurpurWorldConfig { - public double parrotScale = 1.0D; - public boolean parrotTakeDamageFromWater = false; - public boolean parrotBreedable = false; -+ public boolean parrotAlwaysDropExp = false; - private void parrotSettings() { - parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); - parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); -@@ -2069,6 +2138,7 @@ public class PurpurWorldConfig { - parrotScale = Mth.clamp(getDouble("mobs.parrot.attributes.scale", parrotScale), 0.0625D, 16.0D); - parrotTakeDamageFromWater = getBoolean("mobs.parrot.takes-damage-from-water", parrotTakeDamageFromWater); - parrotBreedable = getBoolean("mobs.parrot.can-breed", parrotBreedable); -+ parrotAlwaysDropExp = getBoolean("mobs.parrot.always-drop-exp", parrotAlwaysDropExp); - } - - public boolean phantomRidable = false; -@@ -2096,6 +2166,7 @@ public class PurpurWorldConfig { - public boolean phantomBurnInDaylight = true; - public boolean phantomFlamesOnSwoop = false; - public boolean phantomTakeDamageFromWater = false; -+ public boolean phantomAlwaysDropExp = false; - private void phantomSettings() { - phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); - phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -2131,6 +2202,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); -+ phantomAlwaysDropExp = getBoolean("mobs.phantom.always-drop-exp", phantomAlwaysDropExp); - } - - public boolean pigRidable = false; -@@ -2141,6 +2213,7 @@ public class PurpurWorldConfig { - public boolean pigGiveSaddleBack = false; - public int pigBreedingTicks = 6000; - public boolean pigTakeDamageFromWater = false; -+ public boolean pigAlwaysDropExp = false; - private void pigSettings() { - pigRidable = getBoolean("mobs.pig.ridable", pigRidable); - pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -2155,6 +2228,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); -+ pigAlwaysDropExp = getBoolean("mobs.pig.always-drop-exp", pigAlwaysDropExp); - } - - public boolean piglinRidable = false; -@@ -2165,6 +2239,7 @@ public class PurpurWorldConfig { - public boolean piglinBypassMobGriefing = false; - public boolean piglinTakeDamageFromWater = false; - public int piglinPortalSpawnModifier = 2000; -+ public boolean piglinAlwaysDropExp = false; - private void piglinSettings() { - piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); - piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -2179,6 +2254,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); -+ piglinAlwaysDropExp = getBoolean("mobs.piglin.always-drop-exp", piglinAlwaysDropExp); - } - - public boolean piglinBruteRidable = false; -@@ -2187,6 +2263,7 @@ public class PurpurWorldConfig { - public double piglinBruteMaxHealth = 50.0D; - public double piglinBruteScale = 1.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); -@@ -2199,6 +2276,7 @@ public class PurpurWorldConfig { - piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); - piglinBruteScale = Mth.clamp(getDouble("mobs.piglin_brute.attributes.scale", piglinBruteScale), 0.0625D, 16.0D); - piglinBruteTakeDamageFromWater = getBoolean("mobs.piglin_brute.takes-damage-from-water", piglinBruteTakeDamageFromWater); -+ piglinBruteAlwaysDropExp = getBoolean("mobs.piglin_brute.always-drop-exp", piglinBruteAlwaysDropExp); - } - - public boolean pillagerRidable = false; -@@ -2208,6 +2286,7 @@ public class PurpurWorldConfig { - public double pillagerScale = 1.0D; - public boolean pillagerBypassMobGriefing = false; - public boolean pillagerTakeDamageFromWater = false; -+ public boolean pillagerAlwaysDropExp = false; - private void pillagerSettings() { - pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); - pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -2221,6 +2300,7 @@ public class PurpurWorldConfig { - pillagerScale = Mth.clamp(getDouble("mobs.pillager.attributes.scale", pillagerScale), 0.0625D, 16.0D); - pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); - pillagerTakeDamageFromWater = getBoolean("mobs.pillager.takes-damage-from-water", pillagerTakeDamageFromWater); -+ pillagerAlwaysDropExp = getBoolean("mobs.pillager.always-drop-exp", pillagerAlwaysDropExp); - } - - public boolean polarBearRidable = false; -@@ -2232,6 +2312,7 @@ public class PurpurWorldConfig { - public Item polarBearBreedableItem = null; - public int polarBearBreedingTicks = 6000; - public boolean polarBearTakeDamageFromWater = false; -+ public boolean polarBearAlwaysDropExp = false; - private void polarBearSettings() { - polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); - polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -2248,6 +2329,7 @@ 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); -+ polarBearAlwaysDropExp = getBoolean("mobs.polar_bear.always-drop-exp", polarBearAlwaysDropExp); - } - - public boolean pufferfishRidable = false; -@@ -2255,6 +2337,7 @@ public class PurpurWorldConfig { - public double pufferfishMaxHealth = 3.0D; - public double pufferfishScale = 1.0D; - public boolean pufferfishTakeDamageFromWater = false; -+ public boolean pufferfishAlwaysDropExp = false; - private void pufferfishSettings() { - pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); - pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); -@@ -2266,6 +2349,7 @@ public class PurpurWorldConfig { - pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); - pufferfishScale = Mth.clamp(getDouble("mobs.pufferfish.attributes.scale", pufferfishScale), 0.0625D, 16.0D); - pufferfishTakeDamageFromWater = getBoolean("mobs.pufferfish.takes-damage-from-water", pufferfishTakeDamageFromWater); -+ pufferfishAlwaysDropExp = getBoolean("mobs.pufferfish.always-drop-exp", pufferfishAlwaysDropExp); - } - - public boolean rabbitRidable = false; -@@ -2278,6 +2362,7 @@ public class PurpurWorldConfig { - public int rabbitBreedingTicks = 6000; - public boolean rabbitBypassMobGriefing = false; - public boolean rabbitTakeDamageFromWater = false; -+ public boolean rabbitAlwaysDropExp = false; - private void rabbitSettings() { - rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); - rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -2294,6 +2379,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); -+ rabbitAlwaysDropExp = getBoolean("mobs.rabbit.always-drop-exp", rabbitAlwaysDropExp); - } - - public boolean ravagerRidable = false; -@@ -2304,6 +2390,7 @@ public class PurpurWorldConfig { - public boolean ravagerBypassMobGriefing = false; - public boolean ravagerTakeDamageFromWater = false; - public List ravagerGriefableBlocks = new ArrayList<>(); -+ public boolean ravagerAlwaysDropExp = false; - private void ravagerSettings() { - ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); - ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -2334,6 +2421,7 @@ public class PurpurWorldConfig { - ravagerGriefableBlocks.add(block); - } - }); -+ ravagerAlwaysDropExp = getBoolean("mobs.ravager.always-drop-exp", ravagerAlwaysDropExp); - } - - public boolean salmonRidable = false; -@@ -2341,6 +2429,7 @@ public class PurpurWorldConfig { - public double salmonMaxHealth = 3.0D; - public double salmonScale = 1.0D; - public boolean salmonTakeDamageFromWater = false; -+ public boolean salmonAlwaysDropExp = false; - private void salmonSettings() { - salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); - salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); -@@ -2352,6 +2441,7 @@ public class PurpurWorldConfig { - salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); - salmonScale = Mth.clamp(getDouble("mobs.salmon.attributes.scale", salmonScale), 0.0625D, 16.0D); - salmonTakeDamageFromWater = getBoolean("mobs.salmon.takes-damage-from-water", salmonTakeDamageFromWater); -+ salmonAlwaysDropExp = getBoolean("mobs.salmon.always-drop-exp", salmonAlwaysDropExp); - } - - public boolean sheepRidable = false; -@@ -2362,6 +2452,7 @@ public class PurpurWorldConfig { - public int sheepBreedingTicks = 6000; - public boolean sheepBypassMobGriefing = false; - public boolean sheepTakeDamageFromWater = false; -+ public boolean sheepAlwaysDropExp = false; - private void sheepSettings() { - sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); - sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -2376,6 +2467,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); -+ sheepAlwaysDropExp = getBoolean("mobs.sheep.always-drop-exp", sheepAlwaysDropExp); - } - - public boolean shulkerRidable = false; -@@ -2390,6 +2482,7 @@ public class PurpurWorldConfig { - public String shulkerSpawnFromBulletNearbyEquation = "(nearby - 1) / 5.0"; - public boolean shulkerSpawnFromBulletRandomColor = false; - public boolean shulkerChangeColorWithDye = false; -+ public boolean shulkerAlwaysDropExp = false; - private void shulkerSettings() { - shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); - shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -2408,6 +2501,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); -+ shulkerAlwaysDropExp = getBoolean("mobs.shulker.always-drop-exp", shulkerAlwaysDropExp); - } - - public boolean silverfishRidable = false; -@@ -2419,6 +2513,7 @@ public class PurpurWorldConfig { - public double silverfishAttackDamage = 1.0D; - public boolean silverfishBypassMobGriefing = false; - public boolean silverfishTakeDamageFromWater = false; -+ public boolean silverfishAlwaysDropExp = false; - private void silverfishSettings() { - silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); - silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -2434,6 +2529,7 @@ public class PurpurWorldConfig { - silverfishAttackDamage = getDouble("mobs.silverfish.attributes.attack_damage", silverfishAttackDamage); - silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); - silverfishTakeDamageFromWater = getBoolean("mobs.silverfish.takes-damage-from-water", silverfishTakeDamageFromWater); -+ silverfishAlwaysDropExp = getBoolean("mobs.silverfish.always-drop-exp", silverfishAlwaysDropExp); - } - - public boolean skeletonRidable = false; -@@ -2442,6 +2538,7 @@ public class PurpurWorldConfig { - public double skeletonMaxHealth = 20.0D; - public double skeletonScale = 1.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); -@@ -2454,6 +2551,7 @@ public class PurpurWorldConfig { - skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); - skeletonScale = Mth.clamp(getDouble("mobs.skeleton.attributes.scale", skeletonScale), 0.0625D, 16.0D); - skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); -+ skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); - } - - public boolean skeletonHorseRidable = false; -@@ -2466,6 +2564,7 @@ public class PurpurWorldConfig { - public double skeletonHorseMovementSpeedMin = 0.2D; - public double skeletonHorseMovementSpeedMax = 0.2D; - public boolean skeletonHorseTakeDamageFromWater = false; -+ public boolean skeletonHorseAlwaysDropExp = false; - private void skeletonHorseSettings() { - skeletonHorseRidable = getBoolean("mobs.skeleton_horse.ridable", skeletonHorseRidable); - skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); -@@ -2483,6 +2582,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); -+ skeletonHorseAlwaysDropExp = getBoolean("mobs.skeleton_horse.always-drop-exp", skeletonHorseAlwaysDropExp); - } - - public boolean slimeRidable = false; -@@ -2493,6 +2593,7 @@ public class PurpurWorldConfig { - public Map slimeMaxHealthCache = new HashMap<>(); - public Map slimeAttackDamageCache = new HashMap<>(); - public boolean slimeTakeDamageFromWater = false; -+ public boolean slimeAlwaysDropExp = false; - private void slimeSettings() { - slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); - slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); -@@ -2507,6 +2608,7 @@ public class PurpurWorldConfig { - slimeMaxHealthCache.clear(); - slimeAttackDamageCache.clear(); - slimeTakeDamageFromWater = getBoolean("mobs.slime.takes-damage-from-water", slimeTakeDamageFromWater); -+ slimeAlwaysDropExp = getBoolean("mobs.slime.always-drop-exp", slimeAlwaysDropExp); - } - - public boolean snowGolemRidable = false; -@@ -2522,6 +2624,7 @@ public class PurpurWorldConfig { - public double snowGolemAttackDistance = 1.25D; - public boolean snowGolemBypassMobGriefing = false; - public boolean snowGolemTakeDamageFromWater = true; -+ public boolean snowGolemAlwaysDropExp = false; - private void snowGolemSettings() { - snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); - snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -2541,6 +2644,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); -+ snowGolemAlwaysDropExp = getBoolean("mobs.snow_golem.always-drop-exp", snowGolemAlwaysDropExp); - } - - public boolean snifferRidable = false; -@@ -2566,6 +2670,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); - squidControllable = getBoolean("mobs.squid.controllable", squidControllable); -@@ -2580,6 +2685,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); -+ squidAlwaysDropExp = getBoolean("mobs.squid.always-drop-exp", squidAlwaysDropExp); - } - - public boolean spiderRidable = false; -@@ -2588,6 +2694,7 @@ public class PurpurWorldConfig { - public double spiderMaxHealth = 16.0D; - public double spiderScale = 1.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); -@@ -2600,6 +2707,7 @@ public class PurpurWorldConfig { - spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); - spiderScale = Mth.clamp(getDouble("mobs.spider.attributes.scale", spiderScale), 0.0625D, 16.0D); - spiderTakeDamageFromWater = getBoolean("mobs.spider.takes-damage-from-water", spiderTakeDamageFromWater); -+ spiderAlwaysDropExp = getBoolean("mobs.spider.always-drop-exp", spiderAlwaysDropExp); - } - - public boolean strayRidable = false; -@@ -2608,6 +2716,7 @@ public class PurpurWorldConfig { - public double strayMaxHealth = 20.0D; - public double strayScale = 1.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); -@@ -2620,6 +2729,7 @@ public class PurpurWorldConfig { - strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); - strayScale = Mth.clamp(getDouble("mobs.stray.attributes.scale", strayScale), 0.0625D, 16.0D); - strayTakeDamageFromWater = getBoolean("mobs.stray.takes-damage-from-water", strayTakeDamageFromWater); -+ strayAlwaysDropExp = getBoolean("mobs.stray.always-drop-exp", strayAlwaysDropExp); - } - - public boolean striderRidable = false; -@@ -2630,6 +2740,7 @@ public class PurpurWorldConfig { - public int striderBreedingTicks = 6000; - public boolean striderGiveSaddleBack = false; - public boolean striderTakeDamageFromWater = true; -+ public boolean striderAlwaysDropExp = false; - private void striderSettings() { - striderRidable = getBoolean("mobs.strider.ridable", striderRidable); - striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -2644,6 +2755,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); -+ striderAlwaysDropExp = getBoolean("mobs.strider.always-drop-exp", striderAlwaysDropExp); - } - - public boolean tadpoleRidable = false; -@@ -2666,6 +2778,7 @@ public class PurpurWorldConfig { - public double traderLlamaMovementSpeedMax = 0.175D; - public int traderLlamaBreedingTicks = 6000; - public boolean traderLlamaTakeDamageFromWater = false; -+ public boolean traderLlamaAlwaysDropExp = false; - private void traderLlamaSettings() { - traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); - traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -2685,6 +2798,7 @@ 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); -+ traderLlamaAlwaysDropExp = getBoolean("mobs.trader_llama.always-drop-exp", traderLlamaAlwaysDropExp); - } - - public boolean tropicalFishRidable = false; -@@ -2692,6 +2806,7 @@ public class PurpurWorldConfig { - public double tropicalFishMaxHealth = 3.0D; - public double tropicalFishScale = 1.0D; - public boolean tropicalFishTakeDamageFromWater = false; -+ public boolean tropicalFishAlwaysDropExp = false; - private void tropicalFishSettings() { - tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); - tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); -@@ -2703,6 +2818,7 @@ public class PurpurWorldConfig { - tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); - tropicalFishScale = Mth.clamp(getDouble("mobs.tropical_fish.attributes.scale", tropicalFishScale), 0.0625D, 16.0D); - tropicalFishTakeDamageFromWater = getBoolean("mobs.tropical_fish.takes-damage-from-water", tropicalFishTakeDamageFromWater); -+ tropicalFishAlwaysDropExp = getBoolean("mobs.tropical_fish.always-drop-exp", tropicalFishAlwaysDropExp); - } - - public boolean turtleRidable = false; -@@ -2712,6 +2828,7 @@ public class PurpurWorldConfig { - public double turtleScale = 1.0D; - public int turtleBreedingTicks = 6000; - public boolean turtleTakeDamageFromWater = false; -+ public boolean turtleAlwaysDropExp = false; - private void turtleSettings() { - turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); - turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -2725,6 +2842,7 @@ public class PurpurWorldConfig { - turtleScale = Mth.clamp(getDouble("mobs.turtle.attributes.scale", turtleScale), 0.0625D, 16.0D); - turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); - turtleTakeDamageFromWater = getBoolean("mobs.turtle.takes-damage-from-water", turtleTakeDamageFromWater); -+ turtleAlwaysDropExp = getBoolean("mobs.turtle.always-drop-exp", turtleAlwaysDropExp); - } - - public boolean vexRidable = false; -@@ -2734,6 +2852,7 @@ public class PurpurWorldConfig { - public double vexMaxHealth = 14.0D; - public double vexScale = 1.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); -@@ -2747,6 +2866,7 @@ public class PurpurWorldConfig { - vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); - vexScale = Mth.clamp(getDouble("mobs.vex.attributes.scale", vexScale), 0.0625D, 16.0D); - vexTakeDamageFromWater = getBoolean("mobs.vex.takes-damage-from-water", vexTakeDamageFromWater); -+ vexAlwaysDropExp = getBoolean("mobs.vex.always-drop-exp", vexAlwaysDropExp); - } - - public boolean villagerRidable = false; -@@ -2764,6 +2884,7 @@ public class PurpurWorldConfig { - public boolean villagerBypassMobGriefing = false; - public boolean villagerTakeDamageFromWater = false; - public boolean villagerAllowTrading = true; -+ public boolean villagerAlwaysDropExp = false; - private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2785,6 +2906,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); -+ villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); - } - - public boolean vindicatorRidable = false; -@@ -2794,6 +2916,7 @@ public class PurpurWorldConfig { - public double vindicatorScale = 1.0D; - public double vindicatorJohnnySpawnChance = 0D; - public boolean vindicatorTakeDamageFromWater = false; -+ public boolean vindicatorAlwaysDropExp = false; - private void vindicatorSettings() { - vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); - vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -2807,6 +2930,7 @@ public class PurpurWorldConfig { - vindicatorScale = Mth.clamp(getDouble("mobs.vindicator.attributes.scale", vindicatorScale), 0.0625D, 16.0D); - vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); - vindicatorTakeDamageFromWater = getBoolean("mobs.vindicator.takes-damage-from-water", vindicatorTakeDamageFromWater); -+ vindicatorAlwaysDropExp = getBoolean("mobs.vindicator.always-drop-exp", vindicatorAlwaysDropExp); - } - - public boolean wanderingTraderRidable = false; -@@ -2819,6 +2943,7 @@ public class PurpurWorldConfig { - public boolean wanderingTraderCanBeLeashed = false; - public boolean wanderingTraderTakeDamageFromWater = false; - public boolean wanderingTraderAllowTrading = true; -+ public boolean wanderingTraderAlwaysDropExp = false; - private void wanderingTraderSettings() { - wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); - wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -2835,6 +2960,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); -+ wanderingTraderAlwaysDropExp = getBoolean("mobs.wandering_trader.always-drop-exp", wanderingTraderAlwaysDropExp); - } - - public boolean wardenRidable = false; -@@ -2852,6 +2978,7 @@ public class PurpurWorldConfig { - public double witchMaxHealth = 26.0D; - public double witchScale = 1.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); -@@ -2864,6 +2991,7 @@ public class PurpurWorldConfig { - witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); - witchScale = Mth.clamp(getDouble("mobs.witch.attributes.scale", witchScale), 0.0625D, 16.0D); - witchTakeDamageFromWater = getBoolean("mobs.witch.takes-damage-from-water", witchTakeDamageFromWater); -+ witchAlwaysDropExp = getBoolean("mobs.witch.always-drop-exp", witchAlwaysDropExp); - } - - public boolean witherRidable = false; -@@ -2879,6 +3007,7 @@ public class PurpurWorldConfig { - public boolean witherCanRideVehicles = false; - public float witherExplosionRadius = 1.0F; - public boolean witherPlaySpawnSound = true; -+ public boolean witherAlwaysDropExp = false; - private void witherSettings() { - witherRidable = getBoolean("mobs.wither.ridable", witherRidable); - witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2902,6 +3031,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); -+ witherAlwaysDropExp = getBoolean("mobs.wither.always-drop-exp", witherAlwaysDropExp); - } - - public boolean witherSkeletonRidable = false; -@@ -2910,6 +3040,7 @@ public class PurpurWorldConfig { - public double witherSkeletonMaxHealth = 20.0D; - public double witherSkeletonScale = 1.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); -@@ -2922,6 +3053,7 @@ public class PurpurWorldConfig { - witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); - witherSkeletonScale = Mth.clamp(getDouble("mobs.wither_skeleton.attributes.scale", witherSkeletonScale), 0.0625D, 16.0D); - witherSkeletonTakeDamageFromWater = getBoolean("mobs.wither_skeleton.takes-damage-from-water", witherSkeletonTakeDamageFromWater); -+ witherSkeletonAlwaysDropExp = getBoolean("mobs.wither_skeleton.always-drop-exp", witherSkeletonAlwaysDropExp); - } - - public boolean wolfRidable = false; -@@ -2934,6 +3066,7 @@ public class PurpurWorldConfig { - public double wolfNaturalRabid = 0.0D; - public int wolfBreedingTicks = 6000; - public boolean wolfTakeDamageFromWater = false; -+ public boolean wolfAlwaysDropExp = false; - private void wolfSettings() { - wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); - wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -2954,6 +3087,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); -+ wolfAlwaysDropExp = getBoolean("mobs.wolf.always-drop-exp", wolfAlwaysDropExp); - } - - public boolean zoglinRidable = false; -@@ -2962,6 +3096,7 @@ public class PurpurWorldConfig { - public double zoglinMaxHealth = 40.0D; - public double zoglinScale = 1.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); -@@ -2974,6 +3109,7 @@ public class PurpurWorldConfig { - zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); - zoglinScale = Mth.clamp(getDouble("mobs.zoglin.attributes.scale", zoglinScale), 0.0625D, 16.0D); - zoglinTakeDamageFromWater = getBoolean("mobs.zoglin.takes-damage-from-water", zoglinTakeDamageFromWater); -+ zoglinAlwaysDropExp = getBoolean("mobs.zoglin.always-drop-exp", zoglinAlwaysDropExp); - } - - public boolean zombieRidable = false; -@@ -2988,6 +3124,7 @@ public class PurpurWorldConfig { - public boolean zombieAggressiveTowardsVillagerWhenLagging = true; - public boolean zombieBypassMobGriefing = false; - public boolean zombieTakeDamageFromWater = false; -+ public boolean zombieAlwaysDropExp = false; - private void zombieSettings() { - zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); - zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -3006,6 +3143,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); -+ zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); - } - - public boolean zombieHorseRidable = false; -@@ -3019,6 +3157,7 @@ public class PurpurWorldConfig { - public double zombieHorseMovementSpeedMax = 0.2D; - public double zombieHorseSpawnChance = 0.0D; - public boolean zombieHorseTakeDamageFromWater = false; -+ public boolean zombieHorseAlwaysDropExp = false; - private void zombieHorseSettings() { - zombieHorseRidable = getBoolean("mobs.zombie_horse.ridable", zombieHorseRidable); - zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); -@@ -3037,6 +3176,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); -+ zombieHorseAlwaysDropExp = getBoolean("mobs.zombie_horse.always-drop-exp", zombieHorseAlwaysDropExp); - } - - public boolean zombieVillagerRidable = false; -@@ -3052,6 +3192,7 @@ public class PurpurWorldConfig { - public int zombieVillagerCuringTimeMin = 3600; - public int zombieVillagerCuringTimeMax = 6000; - public boolean zombieVillagerCureEnabled = true; -+ public boolean zombieVillagerAlwaysDropExp = false; - private void zombieVillagerSettings() { - zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); - zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -3071,6 +3212,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); -+ zombieVillagerAlwaysDropExp = getBoolean("mobs.zombie_villager.always-drop-exp", zombieVillagerAlwaysDropExp); - } - - public boolean zombifiedPiglinRidable = false; -@@ -3084,6 +3226,7 @@ public class PurpurWorldConfig { - public boolean zombifiedPiglinJockeyTryExistingChickens = true; - public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; - public boolean zombifiedPiglinTakeDamageFromWater = false; -+ public boolean zombifiedPiglinAlwaysDropExp = false; - private void zombifiedPiglinSettings() { - zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); - zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -3101,6 +3244,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); -+ zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp); - } - - public float hungerStarvationDamage = 1.0F; diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch index a556fcd67..abc257e0d 100644 --- a/purpur-server/minecraft-patches/features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -18,10 +18,10 @@ index 29d402620d2e1cbed94f941f933ae8eb5d786e7f..ec0998369158286fccb38c8e10c3cfa2 public boolean isLocalPlayer() { return true; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index c7a7a65273801ee1c11aa9f72ee2327beac21ec0..69bd4d3401cf8432494be78ce5d8c0099373b201 100644 +index f90e90368552d7e38e719bc080184ccaa64b6a0b..47b1f87e224fe963807c244e9cf03b2c8b049d9c 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1723,6 +1723,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - Add EntityMoveEvent serverLevel.updateLagCompensationTick(); // Paper - lag compensation net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = serverLevel.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers @@ -42,7 +42,7 @@ index 704e618c1a71c5182bc927758eb3f91e5f008f7d..a55772a67bca2be0a36ce63e7b0143b8 public LevelChunk getChunkIfLoaded(int x, int z) { return this.chunkSource.getChunkAtIfLoadedImmediately(x, z); // Paper - Use getChunkIfLoadedImmediately diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 31739c5c9dfdd940263cc9b931068b3f624329ec..a8287654d3023f0a5fb183d4ad2dd418126dc305 100644 +index 07786a459c46b79d06b55a248d609e6dd353071a..2c7bc52de6e7498e1056711d5671294efcf50438 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -845,6 +845,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @@ -426,7 +426,7 @@ index d7f9b3b2b1077ea10e8f64b87c8f4c4354e90858..713f62b34a91fa76f40e49a5e390145f this.lookAtCooldown--; this.getYRotD().ifPresent(rotationWanted -> this.mob.yHeadRot = this.rotateTowards(this.mob.yHeadRot, rotationWanted + 20.0F, this.yMaxRotSpeed)); diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index 5ebe7b1dce367d5c5e1136b97b2b9f6737595201..f01ddd493d38e2e231c59841649a2e5bf3b87c49 100644 +index 4d715a29f1ad31e87977562bd0e2aeddb54ee082..e7ea944e77175ee4051b8e7361c502d0cc2115d5 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java @@ -42,11 +42,58 @@ public class Bat extends AmbientCreature { @@ -2983,7 +2983,7 @@ index 95cf215e8804cc2d7b681723dfebd1dcb8cbaeee..5d97ae09292fb3209e7362df778e88dc public boolean isPowered() { diff --git a/net/minecraft/world/entity/monster/AbstractSkeleton.java b/net/minecraft/world/entity/monster/AbstractSkeleton.java -index 37abc7769573e3cdda380166dd086551d5e7bd88..6c78780166822755a89e7021733ccb7641c62ffe 100644 +index e9d4e05849c7113e058df13a5753c495536a17b3..291cfff445f707d04d89a709ad28fcc1251b77b9 100644 --- a/net/minecraft/world/entity/monster/AbstractSkeleton.java +++ b/net/minecraft/world/entity/monster/AbstractSkeleton.java @@ -73,12 +73,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @@ -4630,7 +4630,7 @@ index 9b94e74f6317f835500225b087fe93487a7a0b22..b279e33bb14dfea4813bba770daf950f profilerFiller.pop(); this.updateActivity(); diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index 9c12c1de3a57915ee0a02b6574bfe3a4bb49d5d1..4f1c04c65ffb01d931d2ab5979ab05bb9b1d3923 100644 +index 844add05c2a51825d410da428fd3e5a2ae71652c..9f476680247f50ca9381a4919dadc15f210a543c 100644 --- a/net/minecraft/world/entity/monster/Zombie.java +++ b/net/minecraft/world/entity/monster/Zombie.java @@ -100,11 +100,30 @@ public class Zombie extends Monster { @@ -4665,7 +4665,7 @@ index 9c12c1de3a57915ee0a02b6574bfe3a4bb49d5d1..4f1c04c65ffb01d931d2ab5979ab05bb } diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index aa9ac63f3f0d8c35c9a5a987d49e8511cfabca45..0bce803739eb3ade7a256c6249914651c7f253ee 100644 +index 3608fbcd1998ddcdec8ec501dd5f6b80911104ee..33bb29bc03bce90750b3b9376a6ed848208a569d 100644 --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java @@ -78,6 +78,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -4943,7 +4943,7 @@ index 9f476e587d7df797129e49738f101cccca7e10b7..f968e5c99bdb23b268bc34ea1ba5d54a && this.level() == entity.level() && EntitySelector.NO_CREATIVE_OR_SPECTATOR.test(entity) diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 7b514b40070946f93156599349311c654ad6c9c4..286ca9a05db4823a277c150d1b18592e64c70aca 100644 +index b36e7c75af71f7472ccb0af3ba217ba39b05d081..742ae13084b2ab6c1ed26c0e7601ba7f9009367e 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java @@ -200,6 +200,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler diff --git a/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch b/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch index a8fc86e19..2c3b82f92 100644 --- a/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch +++ b/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch @@ -44,7 +44,7 @@ index e86dcc0f596491fc7a5c22fa3909287ba520ca95..fef8910f31d697a77ea6f0e7aa6fd5eb return this.brain; } diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index f01ddd493d38e2e231c59841649a2e5bf3b87c49..e158fdc79c2c8f27203d6f229c1ac906394e5f96 100644 +index e7ea944e77175ee4051b8e7361c502d0cc2115d5..ecbec552e5cd1935f57872d2fb502d3e9743e3d8 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java @@ -94,6 +94,21 @@ public class Bat extends AmbientCreature { @@ -1595,7 +1595,7 @@ index b279e33bb14dfea4813bba770daf950f5343419d..132b38d717ac3c5acc64a5ec519f345a protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index 4f1c04c65ffb01d931d2ab5979ab05bb9b1d3923..4b0f04c861397af694c477a8d3dc0de707e36874 100644 +index 9f476680247f50ca9381a4919dadc15f210a543c..73dfc60d9d30ce53a75eaac2630cdd9a8c508ccc 100644 --- a/net/minecraft/world/entity/monster/Zombie.java +++ b/net/minecraft/world/entity/monster/Zombie.java @@ -117,6 +117,14 @@ public class Zombie extends Monster { @@ -1613,7 +1613,7 @@ index 4f1c04c65ffb01d931d2ab5979ab05bb9b1d3923..4b0f04c861397af694c477a8d3dc0de7 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -634,7 +642,7 @@ public class Zombie extends Monster { +@@ -631,7 +639,7 @@ public class Zombie extends Monster { } protected void randomizeReinforcementsChance() { @@ -1623,7 +1623,7 @@ index 4f1c04c65ffb01d931d2ab5979ab05bb9b1d3923..4b0f04c861397af694c477a8d3dc0de7 @Override diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index 0bce803739eb3ade7a256c6249914651c7f253ee..33831be05465c466408e6e84ee635e16ab9db5e2 100644 +index 33bb29bc03bce90750b3b9376a6ed848208a569d..578cfc33a493b5ebc2ed42733577129a8953a461 100644 --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java @@ -95,6 +95,18 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -1750,7 +1750,7 @@ index 97241682311797faa93927e0477a7646ce53b2c8..eb82252cd87797927e153974b9280b5e return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 286ca9a05db4823a277c150d1b18592e64c70aca..a7bb3c4e9909872a13dd5f78060cd951189f14d8 100644 +index 742ae13084b2ab6c1ed26c0e7601ba7f9009367e..3890d315b747f2688527ff3a97ae9d9587a277ab 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java @@ -222,6 +222,14 @@ public class Villager extends AbstractVillager implements ReputationEventHandler diff --git a/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch b/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch index 3288eebb8..55ea3201c 100644 --- a/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch +++ b/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch @@ -7,10 +7,10 @@ temporarily migrate to paper's config drop patch on the next minecraft release diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 69bd4d3401cf8432494be78ce5d8c0099373b201..b545362d99d39e1fbecf2e38ba4406e7936b9d6e 100644 +index 47b1f87e224fe963807c244e9cf03b2c8b049d9c..e535d67c8c910884e151863b2dd793a39ed27a41 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1200,7 +1200,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop +Date: Tue, 21 Dec 2021 20:40:42 -0600 +Subject: [PATCH] Mobs always drop experience + + +diff --git a/net/minecraft/world/entity/GlowSquid.java b/net/minecraft/world/entity/GlowSquid.java +index e717c063c8f9623b8c4b4ea3843d05fd79af3653..b982d4b7bdf39fcaf5f22cc889467d7b953e3a8e 100644 +--- a/net/minecraft/world/entity/GlowSquid.java ++++ b/net/minecraft/world/entity/GlowSquid.java +@@ -59,6 +59,13 @@ public class GlowSquid extends Squid { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.glowSquidAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected ParticleOptions getInkParticle() { + return ParticleTypes.GLOW_SQUID_INK; +diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java +index 4fa526496265a85b637136f0fd0692ef4f570ad6..4ac052a78841939a53dac2afb575cb115581e249 100644 +--- a/net/minecraft/world/entity/ambient/Bat.java ++++ b/net/minecraft/world/entity/ambient/Bat.java +@@ -116,6 +116,13 @@ public class Bat extends AmbientCreature { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.batAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public boolean isFlapping() { + return !this.isResting() && this.tickCount % 10.0F == 0.0F; +diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java +index 70e90b91aaf1c5cd46d818d171194fbbba5000e6..0912fa7de3e3f8e90121802312e78e3638ebd085 100644 +--- a/net/minecraft/world/entity/animal/Bee.java ++++ b/net/minecraft/world/entity/animal/Bee.java +@@ -486,6 +486,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.beeAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public boolean isSensitiveToWater() { + return this.level().purpurConfig.beeTakeDamageFromWater; +diff --git a/net/minecraft/world/entity/animal/Cat.java b/net/minecraft/world/entity/animal/Cat.java +index b41ca04043e65f107edaebc49d398650898e35fb..edd796fd34e43d66a48104201d885756fdd968c3 100644 +--- a/net/minecraft/world/entity/animal/Cat.java ++++ b/net/minecraft/world/entity/animal/Cat.java +@@ -140,6 +140,13 @@ public class Cat extends TamableAnimal implements VariantHolder itemStack.is(ItemTags.CAT_FOOD), true); +diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java +index 2364596156c21e82879f5bf4fd873b9d90b1c308..4d0b172a9d54b1524c8052051859c7178774bef7 100644 +--- a/net/minecraft/world/entity/animal/Chicken.java ++++ b/net/minecraft/world/entity/animal/Chicken.java +@@ -95,6 +95,13 @@ public class Chicken extends Animal { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.chickenAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/Cod.java b/net/minecraft/world/entity/animal/Cod.java +index ac7259cfc8428131f90956d7f76f2227049ffae3..b259de78198e0e3df9e5901019283ad246c8e044 100644 +--- a/net/minecraft/world/entity/animal/Cod.java ++++ b/net/minecraft/world/entity/animal/Cod.java +@@ -39,6 +39,13 @@ public class Cod extends AbstractSchoolingFish { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.codAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public ItemStack getBucketItemStack() { + return new ItemStack(Items.COD_BUCKET); +diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java +index b62c4449047da36d8b4d4b87d03c77906d12dc31..a0297ac3ba520122ed2095d6008c057d749b731e 100644 +--- a/net/minecraft/world/entity/animal/Cow.java ++++ b/net/minecraft/world/entity/animal/Cow.java +@@ -88,6 +88,13 @@ public class Cow extends Animal { + } + // Purpur end - Cows naturally aggressive to players chance + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.cowAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/Dolphin.java b/net/minecraft/world/entity/animal/Dolphin.java +index e104058b3c01bea4cc8a77de2ad4378465903b34..7003b532182737a745491e397a967b72e6b308aa 100644 +--- a/net/minecraft/world/entity/animal/Dolphin.java ++++ b/net/minecraft/world/entity/animal/Dolphin.java +@@ -163,6 +163,13 @@ public class Dolphin extends AgeableWaterCreature { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.dolphinAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Nullable + @Override + public SpawnGroupData finalizeSpawn( +diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java +index 22a70c6af965114e272bb56cb217f975a3cd1bd4..aa610af9db105081fcabc1f299e5f2dd1f4d907e 100644 +--- a/net/minecraft/world/entity/animal/Fox.java ++++ b/net/minecraft/world/entity/animal/Fox.java +@@ -189,6 +189,13 @@ public class Fox extends Animal implements VariantHolder { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.foxAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java +index 23108729ce65ef8b7b215b82f29347513cfd4ebf..ccadc9a151e258ff2c74c65c374b1f09d56d10ec 100644 +--- a/net/minecraft/world/entity/animal/IronGolem.java ++++ b/net/minecraft/world/entity/animal/IronGolem.java +@@ -105,6 +105,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.ironGolemAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options +diff --git a/net/minecraft/world/entity/animal/MushroomCow.java b/net/minecraft/world/entity/animal/MushroomCow.java +index 5e9795f447e88a42909730d383eaa36acfaf18f5..3bcd119757dfc579df790fcc8919a3636bafa7fe 100644 +--- a/net/minecraft/world/entity/animal/MushroomCow.java ++++ b/net/minecraft/world/entity/animal/MushroomCow.java +@@ -93,6 +93,13 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.rabbitAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/Salmon.java b/net/minecraft/world/entity/animal/Salmon.java +index 8bd4b2b29438bff65ed00a42bbc9639111af181f..5da2f14770aebb2286c3e8cbd9622a89a33e0e20 100644 +--- a/net/minecraft/world/entity/animal/Salmon.java ++++ b/net/minecraft/world/entity/animal/Salmon.java +@@ -61,6 +61,13 @@ public class Salmon extends AbstractSchoolingFish implements VariantHolder, B + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.axolotlAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public float getWalkTargetValue(BlockPos pos, LevelReader level) { + return 0.0F; +diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java +index b95570519301bb9e260ce3c20f3231c79ff22fac..5603b13e7f8a4f61e63900c93f9524347e288efa 100644 +--- a/net/minecraft/world/entity/animal/goat/Goat.java ++++ b/net/minecraft/world/entity/animal/goat/Goat.java +@@ -142,6 +142,13 @@ public class Goat extends Animal { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.goatAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected Brain.Provider brainProvider() { + return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); +diff --git a/net/minecraft/world/entity/animal/horse/Donkey.java b/net/minecraft/world/entity/animal/horse/Donkey.java +index 1db6ccdc6c83c704aa84a46ee2751a17125bf457..3e0181578a6f2d22d1da3776abf30bf97d124620 100644 +--- a/net/minecraft/world/entity/animal/horse/Donkey.java ++++ b/net/minecraft/world/entity/animal/horse/Donkey.java +@@ -54,6 +54,13 @@ public class Donkey extends AbstractChestedHorse { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.donkeyAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.DONKEY_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/horse/Horse.java b/net/minecraft/world/entity/animal/horse/Horse.java +index f257d549570918381925cef98734fc0aa605f8f2..be0d636ca894c5995f28f59c196cd8e56dd228c4 100644 +--- a/net/minecraft/world/entity/animal/horse/Horse.java ++++ b/net/minecraft/world/entity/animal/horse/Horse.java +@@ -81,6 +81,13 @@ public class Horse extends AbstractHorse implements VariantHolder { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.horseAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void randomizeAttributes(RandomSource random) { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); +diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java +index 872a54186a20fd855fe7981f3ff1c867f4c64d19..c21d558a6a3a61d6c54b8163f8cb4963846b2c26 100644 +--- a/net/minecraft/world/entity/animal/horse/Llama.java ++++ b/net/minecraft/world/entity/animal/horse/Llama.java +@@ -155,6 +155,13 @@ public class Llama extends AbstractChestedHorse implements VariantHolder entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { +diff --git a/net/minecraft/world/entity/monster/Illusioner.java b/net/minecraft/world/entity/monster/Illusioner.java +index ad661f2bf8957644605b52a469d6a7cf8e064398..9686658b90e886d6236f553d7406771814d18672 100644 +--- a/net/minecraft/world/entity/monster/Illusioner.java ++++ b/net/minecraft/world/entity/monster/Illusioner.java +@@ -91,6 +91,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.illusionerAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java +index bf26f5f6017c60d5991d5f6c87da2acbd95ef5bb..312d4a3d312b5c326d6ca13ccfc48171e18f4370 100644 +--- a/net/minecraft/world/entity/monster/MagmaCube.java ++++ b/net/minecraft/world/entity/monster/MagmaCube.java +@@ -75,6 +75,13 @@ public class MagmaCube extends Slime { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.magmaCubeAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public static AttributeSupplier.Builder createAttributes() { + return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F); + } +diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java +index 78569c2790f74fb91c3c7e7b72158e77ec568c79..74ac280bfc62de761acb3d940b721aab6e325806 100644 +--- a/net/minecraft/world/entity/monster/Phantom.java ++++ b/net/minecraft/world/entity/monster/Phantom.java +@@ -157,6 +157,13 @@ public class Phantom extends FlyingMob implements Enemy { + public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; } + // Purpur end - API for any mob to burn daylight + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.phantomAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public boolean isFlapping() { + return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; +diff --git a/net/minecraft/world/entity/monster/Pillager.java b/net/minecraft/world/entity/monster/Pillager.java +index 869a1007de13f3f5d757968d0f84cbf43786c870..a57d869cdc6a05124237933437aa2d26ff72cab3 100644 +--- a/net/minecraft/world/entity/monster/Pillager.java ++++ b/net/minecraft/world/entity/monster/Pillager.java +@@ -95,6 +95,13 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.pillagerAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java +index 2844846811398350832a0f88a72772831e3e43d5..4dc2b324183254753b6b3269a6ef3ec2f5c2ee2d 100644 +--- a/net/minecraft/world/entity/monster/Ravager.java ++++ b/net/minecraft/world/entity/monster/Ravager.java +@@ -104,6 +104,13 @@ public class Ravager extends Raider { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.ravagerAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java +index c26e4858a14571d58e439cabd5f2593da4ee2634..a006300aea2cbb05400550f1c79e872d095384f8 100644 +--- a/net/minecraft/world/entity/monster/Shulker.java ++++ b/net/minecraft/world/entity/monster/Shulker.java +@@ -136,6 +136,13 @@ public class Shulker extends AbstractGolem implements VariantHolder entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { +diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java +index d01bc46d77340b10b23d0c0d50bddc37657028c8..241526239bdbd5d9276f85e7fca46a7051f46a25 100644 +--- a/net/minecraft/world/entity/monster/Strider.java ++++ b/net/minecraft/world/entity/monster/Strider.java +@@ -126,6 +126,13 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.striderAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public static boolean checkStriderSpawnRules( + EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { +diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java +index ffdb200d9716104f8df91dbeef590b2264e587b8..0ce9eb1f4108b6afab6df84d5e709be0882e515a 100644 +--- a/net/minecraft/world/entity/monster/Vex.java ++++ b/net/minecraft/world/entity/monster/Vex.java +@@ -117,6 +117,13 @@ public class Vex extends Monster implements TraceableEntity { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.vexAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public boolean isFlapping() { + return this.tickCount % TICKS_PER_FLAP == 0; +diff --git a/net/minecraft/world/entity/monster/Vindicator.java b/net/minecraft/world/entity/monster/Vindicator.java +index 5f68d73460adfac2ead57d168156a2784af979ae..b584f71440a81ac09d24e59763a21e857f290e5a 100644 +--- a/net/minecraft/world/entity/monster/Vindicator.java ++++ b/net/minecraft/world/entity/monster/Vindicator.java +@@ -87,6 +87,13 @@ public class Vindicator extends AbstractIllager { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.vindicatorAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java +index 96ba35f3530ab405a960c79955699666deb6b845..e4353c64732067198f082cdd266c1f1ee1fe4f4e 100644 +--- a/net/minecraft/world/entity/monster/Witch.java ++++ b/net/minecraft/world/entity/monster/Witch.java +@@ -88,6 +88,13 @@ public class Witch extends Raider implements RangedAttackMob { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.witchAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/WitherSkeleton.java b/net/minecraft/world/entity/monster/WitherSkeleton.java +index a4dc9b7fbde19b08eb389dc42df21aa5df94e703..ff2596f69d00b36c65872ab2e27e5d44a6ffa3e1 100644 +--- a/net/minecraft/world/entity/monster/WitherSkeleton.java ++++ b/net/minecraft/world/entity/monster/WitherSkeleton.java +@@ -66,6 +66,13 @@ public class WitherSkeleton extends AbstractSkeleton { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.witherSkeletonAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); +diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java +index 79a4a3f4e10e1f9c1a6100060a95636075fc8236..d2a67f3e1c971f737e58567dae23fa70e9d942ea 100644 +--- a/net/minecraft/world/entity/monster/Zoglin.java ++++ b/net/minecraft/world/entity/monster/Zoglin.java +@@ -117,6 +117,13 @@ public class Zoglin extends Monster implements HoglinBase { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.zoglinAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected Brain.Provider brainProvider() { + return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); +diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java +index f8d41ce860c5f48ab9b5e4b79a554dab85d2ba9b..26b57ffdc08a851e4e5cbdeebcc19d62517ba9fa 100644 +--- a/net/minecraft/world/entity/monster/Zombie.java ++++ b/net/minecraft/world/entity/monster/Zombie.java +@@ -147,6 +147,13 @@ public class Zombie extends Monster { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.zombieAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables +diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java +index 94b9abc765b78a40a7ecbf4cbd775b778d49c815..1ca0514732916d325c4a76d73120aaf613c3f780 100644 +--- a/net/minecraft/world/entity/monster/ZombieVillager.java ++++ b/net/minecraft/world/entity/monster/ZombieVillager.java +@@ -131,6 +131,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.zombieVillagerAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java +index 09c991d8e344f11bc84dea453042ee35c39e580e..fddbbffafea275dad187b7908386cf4c05c86743 100644 +--- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java ++++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java +@@ -112,6 +112,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.zombifiedPiglinAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public void setPersistentAngerTarget(@Nullable UUID target) { + this.persistentAngerTarget = target; +diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java +index 896bd531a5333d6dc8996bbdfc5c878b1a7d2da0..cf0a15ff4a49bcc17dc6dd58e91eadec0c519455 100644 +--- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java ++++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java +@@ -136,6 +136,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.hoglinAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public boolean canBeLeashed() { + return true; +diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java +index 55ebfa5df06a59203248514d10dced9660ebf215..f0d78cf5fe2c39add9a673471103c352cce72a45 100644 +--- a/net/minecraft/world/entity/monster/piglin/Piglin.java ++++ b/net/minecraft/world/entity/monster/piglin/Piglin.java +@@ -183,6 +183,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.piglinAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public void addAdditionalSaveData(CompoundTag compound) { + super.addAdditionalSaveData(compound); +diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +index 2237681f298113bda0556699e19e880f4b04a853..4984b9864b63f92bc939b530253e871ca94a3277 100644 +--- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java ++++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +@@ -97,6 +97,13 @@ public class PiglinBrute extends AbstractPiglin { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.piglinBruteAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public static AttributeSupplier.Builder createAttributes() { + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 50.0) +diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java +index 73bf940b73e8bee91fcb6d7bec4545bd63d8da2e..aa6ed56b7a2da45fcbc8c7023e875ab3dd2d8617 100644 +--- a/net/minecraft/world/entity/npc/Villager.java ++++ b/net/minecraft/world/entity/npc/Villager.java +@@ -239,6 +239,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.villagerAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public Brain getBrain() { + return (Brain)super.getBrain(); +diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java +index 5a87c3c7aca38f3fe4a003b2075f43b0ae1cddea..63a83fb3b103b81dad26c353babfde2e35636f53 100644 +--- a/net/minecraft/world/entity/npc/WanderingTrader.java ++++ b/net/minecraft/world/entity/npc/WanderingTrader.java +@@ -114,6 +114,13 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.wanderingTraderAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index 2cd083485..dd28cb782 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1095,6 +1095,7 @@ public class PurpurWorldConfig { public double axolotlScale = 1.0D; public int axolotlBreedingTicks = 6000; public boolean axolotlTakeDamageFromWater = false; + public boolean axolotlAlwaysDropExp = false; private void axolotlSettings() { axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); @@ -1102,6 +1103,7 @@ public class PurpurWorldConfig { axolotlScale = Mth.clamp(getDouble("mobs.axolotl.attributes.scale", axolotlScale), 0.0625D, 16.0D); axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); axolotlTakeDamageFromWater = getBoolean("mobs.axolotl.takes-damage-from-water", axolotlTakeDamageFromWater); + axolotlAlwaysDropExp = getBoolean("mobs.axolotl.always-drop-exp", axolotlAlwaysDropExp); } public boolean batRidable = false; @@ -1118,6 +1120,7 @@ public class PurpurWorldConfig { public double batArmorToughness = 0.0D; public double batAttackKnockback = 0.0D; public boolean batTakeDamageFromWater = false; + public boolean batAlwaysDropExp = false; private void batSettings() { batRidable = getBoolean("mobs.bat.ridable", batRidable); batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); @@ -1138,6 +1141,7 @@ public class PurpurWorldConfig { batArmorToughness = getDouble("mobs.bat.attributes.armor_toughness", batArmorToughness); batAttackKnockback = getDouble("mobs.bat.attributes.attack_knockback", batAttackKnockback); batTakeDamageFromWater = getBoolean("mobs.bat.takes-damage-from-water", batTakeDamageFromWater); + batAlwaysDropExp = getBoolean("mobs.bat.always-drop-exp", batAlwaysDropExp); } public boolean beeRidable = false; @@ -1150,6 +1154,7 @@ public class PurpurWorldConfig { public boolean beeTakeDamageFromWater = true; public boolean beeCanWorkAtNight = false; public boolean beeCanWorkInRain = false; + public boolean beeAlwaysDropExp = false; private void beeSettings() { beeRidable = getBoolean("mobs.bee.ridable", beeRidable); beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); @@ -1166,6 +1171,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); + beeAlwaysDropExp = getBoolean("mobs.bee.always-drop-exp", beeAlwaysDropExp); } public boolean blazeRidable = false; @@ -1175,6 +1181,7 @@ public class PurpurWorldConfig { public double blazeMaxHealth = 20.0D; public double blazeScale = 1.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); @@ -1188,6 +1195,7 @@ public class PurpurWorldConfig { blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); blazeScale = Mth.clamp(getDouble("mobs.blaze.attributes.scale", blazeScale), 0.0625D, 16.0D); blazeTakeDamageFromWater = getBoolean("mobs.blaze.takes-damage-from-water", blazeTakeDamageFromWater); + blazeAlwaysDropExp = getBoolean("mobs.blaze.always-drop-exp", blazeAlwaysDropExp); } public boolean boggedRidable = false; @@ -1233,6 +1241,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); @@ -1254,6 +1263,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; @@ -1262,6 +1272,7 @@ public class PurpurWorldConfig { public double caveSpiderMaxHealth = 12.0D; public double caveSpiderScale = 1.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); @@ -1274,6 +1285,7 @@ public class PurpurWorldConfig { caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); caveSpiderScale = Mth.clamp(getDouble("mobs.cave_spider.attributes.scale", caveSpiderScale), 0.0625D, 16.0D); caveSpiderTakeDamageFromWater = getBoolean("mobs.cave_spider.takes-damage-from-water", caveSpiderTakeDamageFromWater); + caveSpiderAlwaysDropExp = getBoolean("mobs.cave_spider.always-drop-exp", caveSpiderAlwaysDropExp); } public boolean chickenRidable = false; @@ -1284,6 +1296,7 @@ public class PurpurWorldConfig { public boolean chickenRetaliate = false; public int chickenBreedingTicks = 6000; public boolean chickenTakeDamageFromWater = false; + public boolean chickenAlwaysDropExp = false; private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); @@ -1298,6 +1311,7 @@ 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); + chickenAlwaysDropExp = getBoolean("mobs.chicken.always-drop-exp", chickenAlwaysDropExp); } public boolean codRidable = false; @@ -1305,6 +1319,7 @@ public class PurpurWorldConfig { public double codMaxHealth = 3.0D; public double codScale = 1.0D; public boolean codTakeDamageFromWater = false; + public boolean codAlwaysDropExp = false; private void codSettings() { codRidable = getBoolean("mobs.cod.ridable", codRidable); codControllable = getBoolean("mobs.cod.controllable", codControllable); @@ -1316,6 +1331,7 @@ public class PurpurWorldConfig { codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); codScale = Mth.clamp(getDouble("mobs.cod.attributes.scale", codScale), 0.0625D, 16.0D); codTakeDamageFromWater = getBoolean("mobs.cod.takes-damage-from-water", codTakeDamageFromWater); + codAlwaysDropExp = getBoolean("mobs.cod.always-drop-exp", codAlwaysDropExp); } public boolean cowRidable = false; @@ -1328,6 +1344,7 @@ public class PurpurWorldConfig { public boolean cowTakeDamageFromWater = false; public double cowNaturallyAggressiveToPlayersChance = 0.0D; public double cowNaturallyAggressiveToPlayersDamage = 2.0D; + public boolean cowAlwaysDropExp = false; private void cowSettings() { if (PurpurConfig.version < 22) { double oldValue = getDouble("mobs.cow.naturally-aggressive-to-players-chance", cowNaturallyAggressiveToPlayersChance); @@ -1349,6 +1366,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); + cowAlwaysDropExp = getBoolean("mobs.cow.always-drop-exp", cowAlwaysDropExp); } public boolean creakingRidable = false; @@ -1375,6 +1393,7 @@ public class PurpurWorldConfig { public boolean creeperTakeDamageFromWater = false; public boolean creeperExplodeWhenKilled = false; public boolean creeperHealthRadius = false; + public boolean creeperAlwaysDropExp = false; private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); @@ -1392,6 +1411,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); + creeperAlwaysDropExp = getBoolean("mobs.creeper.always-drop-exp", creeperAlwaysDropExp); } public boolean dolphinRidable = false; @@ -1404,6 +1424,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); dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); @@ -1420,6 +1441,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); + dolphinAlwaysDropExp = getBoolean("mobs.dolphin.always-drop-exp", dolphinAlwaysDropExp); } public boolean donkeyRidableInWater = false; @@ -1431,6 +1453,7 @@ public class PurpurWorldConfig { public double donkeyMovementSpeedMax = 0.175D; public int donkeyBreedingTicks = 6000; public boolean donkeyTakeDamageFromWater = false; + public boolean donkeyAlwaysDropExp = false; private void donkeySettings() { donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { @@ -1448,6 +1471,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); + donkeyAlwaysDropExp = getBoolean("mobs.donkey.always-drop-exp", donkeyAlwaysDropExp); } public boolean drownedRidable = false; @@ -1461,6 +1485,7 @@ public class PurpurWorldConfig { public boolean drownedJockeyTryExistingChickens = true; public boolean drownedTakeDamageFromWater = false; public boolean drownedBreakDoors = false; + public boolean drownedAlwaysDropExp = false; private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); @@ -1478,6 +1503,7 @@ 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); + drownedAlwaysDropExp = getBoolean("mobs.drowned.always-drop-exp", drownedAlwaysDropExp); } public boolean elderGuardianRidable = false; @@ -1485,6 +1511,7 @@ public class PurpurWorldConfig { public double elderGuardianMaxHealth = 80.0D; public double elderGuardianScale = 1.0D; public boolean elderGuardianTakeDamageFromWater = false; + public boolean elderGuardianAlwaysDropExp = false; private void elderGuardianSettings() { elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); @@ -1496,6 +1523,7 @@ public class PurpurWorldConfig { elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); elderGuardianScale = Mth.clamp(getDouble("mobs.elder_guardian.attributes.scale", elderGuardianScale), 0.0625D, 16.0D); elderGuardianTakeDamageFromWater = getBoolean("mobs.elder_guardian.takes-damage-from-water", elderGuardianTakeDamageFromWater); + elderGuardianAlwaysDropExp = getBoolean("mobs.elder_guardian.always-drop-exp", elderGuardianAlwaysDropExp); } public boolean enderDragonRidable = false; @@ -1541,6 +1569,7 @@ public class PurpurWorldConfig { public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; public boolean endermanDisableStareAggro = false; public boolean endermanIgnoreProjectiles = false; + public boolean endermanAlwaysDropExp = false; private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); @@ -1564,6 +1593,7 @@ public class PurpurWorldConfig { endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); endermanIgnoreProjectiles = getBoolean("mobs.enderman.ignore-projectiles", endermanIgnoreProjectiles); + endermanAlwaysDropExp = getBoolean("mobs.enderman.always-drop-exp", endermanAlwaysDropExp); } public boolean endermiteRidable = false; @@ -1572,6 +1602,7 @@ public class PurpurWorldConfig { public double endermiteMaxHealth = 8.0D; public double endermiteScale = 1.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); @@ -1584,6 +1615,7 @@ public class PurpurWorldConfig { endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); endermiteScale = Mth.clamp(getDouble("mobs.endermite.attributes.scale", endermiteScale), 0.0625D, 16.0D); endermiteTakeDamageFromWater = getBoolean("mobs.endermite.takes-damage-from-water", endermiteTakeDamageFromWater); + endermiteAlwaysDropExp = getBoolean("mobs.endermite.always-drop-exp", endermiteAlwaysDropExp); } public boolean evokerRidable = false; @@ -1593,6 +1625,7 @@ public class PurpurWorldConfig { public double evokerScale = 1.0D; public boolean evokerBypassMobGriefing = false; public boolean evokerTakeDamageFromWater = false; + public boolean evokerAlwaysDropExp = false; private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); @@ -1606,6 +1639,7 @@ public class PurpurWorldConfig { evokerScale = Mth.clamp(getDouble("mobs.evoker.attributes.scale", evokerScale), 0.0625D, 16.0D); evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); evokerTakeDamageFromWater = getBoolean("mobs.evoker.takes-damage-from-water", evokerTakeDamageFromWater); + evokerAlwaysDropExp = getBoolean("mobs.evoker.always-drop-exp", evokerAlwaysDropExp); } public boolean foxRidable = false; @@ -1617,6 +1651,7 @@ public class PurpurWorldConfig { public int foxBreedingTicks = 6000; public boolean foxBypassMobGriefing = false; public boolean foxTakeDamageFromWater = false; + public boolean foxAlwaysDropExp = false; private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); @@ -1632,6 +1667,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); + foxAlwaysDropExp = getBoolean("mobs.fox.always-drop-exp", foxAlwaysDropExp); } public boolean frogRidable = false; @@ -1654,6 +1690,7 @@ public class PurpurWorldConfig { public double ghastMaxHealth = 10.0D; public double ghastScale = 1.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); @@ -1667,6 +1704,7 @@ public class PurpurWorldConfig { ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); ghastScale = Mth.clamp(getDouble("mobs.ghast.attributes.scale", ghastScale), 0.0625D, 16.0D); ghastTakeDamageFromWater = getBoolean("mobs.ghast.takes-damage-from-water", ghastTakeDamageFromWater); + ghastAlwaysDropExp = getBoolean("mobs.ghast.always-drop-exp", ghastAlwaysDropExp); } public boolean giantRidable = false; @@ -1681,6 +1719,7 @@ public class PurpurWorldConfig { public boolean giantHaveAI = false; public boolean giantHaveHostileAI = false; public boolean giantTakeDamageFromWater = false; + public boolean giantAlwaysDropExp = false; private void giantSettings() { giantRidable = getBoolean("mobs.giant.ridable", giantRidable); giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); @@ -1703,6 +1742,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); + giantAlwaysDropExp = getBoolean("mobs.giant.always-drop-exp", giantAlwaysDropExp); } public boolean glowSquidRidable = false; @@ -1711,6 +1751,7 @@ public class PurpurWorldConfig { public double glowSquidScale = 1.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); @@ -1718,6 +1759,7 @@ public class PurpurWorldConfig { glowSquidScale = Mth.clamp(getDouble("mobs.glow_squid.attributes.scale", glowSquidScale), 0.0625D, 16.0D); glowSquidsCanFly = getBoolean("mobs.glow_squid.can-fly", glowSquidsCanFly); glowSquidTakeDamageFromWater = getBoolean("mobs.glow_squid.takes-damage-from-water", glowSquidTakeDamageFromWater); + glowSquidAlwaysDropExp = getBoolean("mobs.glow_squid.always-drop-exp", glowSquidAlwaysDropExp); } public boolean goatRidable = false; @@ -1727,6 +1769,7 @@ public class PurpurWorldConfig { public double goatScale = 1.0D; public int goatBreedingTicks = 6000; public boolean goatTakeDamageFromWater = false; + public boolean goatAlwaysDropExp = false; private void goatSettings() { goatRidable = getBoolean("mobs.goat.ridable", goatRidable); goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); @@ -1735,6 +1778,7 @@ public class PurpurWorldConfig { goatScale = Mth.clamp(getDouble("mobs.goat.attributes.scale", goatScale), 0.0625D, 16.0D); goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); goatTakeDamageFromWater = getBoolean("mobs.goat.takes-damage-from-water", goatTakeDamageFromWater); + goatAlwaysDropExp = getBoolean("mobs.goat.always-drop-exp", goatAlwaysDropExp); } public boolean guardianRidable = false; @@ -1742,6 +1786,7 @@ public class PurpurWorldConfig { public double guardianMaxHealth = 30.0D; public double guardianScale = 1.0D; public boolean guardianTakeDamageFromWater = false; + public boolean guardianAlwaysDropExp = false; private void guardianSettings() { guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); @@ -1753,6 +1798,7 @@ public class PurpurWorldConfig { guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); guardianScale = Mth.clamp(getDouble("mobs.guardian.attributes.scale", guardianScale), 0.0625D, 16.0D); guardianTakeDamageFromWater = getBoolean("mobs.guardian.takes-damage-from-water", guardianTakeDamageFromWater); + guardianAlwaysDropExp = getBoolean("mobs.guardian.always-drop-exp", guardianAlwaysDropExp); } public boolean forceHalloweenSeason = false; @@ -1769,6 +1815,7 @@ public class PurpurWorldConfig { public double hoglinScale = 1.0D; public int hoglinBreedingTicks = 6000; public boolean hoglinTakeDamageFromWater = false; + public boolean hoglinAlwaysDropExp = false; private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); @@ -1782,6 +1829,7 @@ public class PurpurWorldConfig { hoglinScale = Mth.clamp(getDouble("mobs.hoglin.attributes.scale", hoglinScale), 0.0625D, 16.0D); hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); hoglinTakeDamageFromWater = getBoolean("mobs.hoglin.takes-damage-from-water", hoglinTakeDamageFromWater); + hoglinAlwaysDropExp = getBoolean("mobs.hoglin.always-drop-exp", hoglinAlwaysDropExp); } public boolean horseRidableInWater = false; @@ -1793,6 +1841,7 @@ public class PurpurWorldConfig { public double horseMovementSpeedMax = 0.3375D; public int horseBreedingTicks = 6000; public boolean horseTakeDamageFromWater = false; + public boolean horseAlwaysDropExp = false; private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { @@ -1810,6 +1859,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); + horseAlwaysDropExp = getBoolean("mobs.horse.always-drop-exp", horseAlwaysDropExp); } public boolean huskRidable = false; @@ -1822,6 +1872,7 @@ public class PurpurWorldConfig { public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; public boolean huskTakeDamageFromWater = false; + public boolean huskAlwaysDropExp = false; private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); @@ -1838,6 +1889,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); + huskAlwaysDropExp = getBoolean("mobs.husk.always-drop-exp", huskAlwaysDropExp); } public boolean illusionerRidable = false; @@ -1848,6 +1900,7 @@ public class PurpurWorldConfig { public double illusionerMaxHealth = 32.0D; public double illusionerScale = 1.0D; public boolean illusionerTakeDamageFromWater = false; + public boolean illusionerAlwaysDropExp = false; private void illusionerSettings() { illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); @@ -1866,6 +1919,7 @@ public class PurpurWorldConfig { illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); illusionerScale = Mth.clamp(getDouble("mobs.illusioner.attributes.scale", illusionerScale), 0.0625D, 16.0D); illusionerTakeDamageFromWater = getBoolean("mobs.illusioner.takes-damage-from-water", illusionerTakeDamageFromWater); + illusionerAlwaysDropExp = getBoolean("mobs.illusioner.always-drop-exp", illusionerAlwaysDropExp); } public boolean ironGolemRidable = false; @@ -1877,6 +1931,7 @@ public class PurpurWorldConfig { public boolean ironGolemTakeDamageFromWater = false; public boolean ironGolemPoppyCalm = false; public boolean ironGolemHealCalm = false; + public boolean ironGolemAlwaysDropExp = false; private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); @@ -1892,6 +1947,7 @@ public class PurpurWorldConfig { ironGolemTakeDamageFromWater = getBoolean("mobs.iron_golem.takes-damage-from-water", ironGolemTakeDamageFromWater); ironGolemPoppyCalm = getBoolean("mobs.iron_golem.poppy-calms-anger", ironGolemPoppyCalm); ironGolemHealCalm = getBoolean("mobs.iron_golem.healing-calms-anger", ironGolemHealCalm); + ironGolemAlwaysDropExp = getBoolean("mobs.iron_golem.always-drop-exp", ironGolemAlwaysDropExp); } public boolean llamaRidable = false; @@ -1906,6 +1962,7 @@ public class PurpurWorldConfig { public int llamaBreedingTicks = 6000; public boolean llamaTakeDamageFromWater = false; public boolean llamaJoinCaravans = true; + public boolean llamaAlwaysDropExp = false; private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); @@ -1926,6 +1983,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); + llamaAlwaysDropExp = getBoolean("mobs.llama.always-drop-exp", llamaAlwaysDropExp); } public boolean magmaCubeRidable = false; @@ -1936,6 +1994,7 @@ public class PurpurWorldConfig { public Map magmaCubeMaxHealthCache = new HashMap<>(); public Map magmaCubeAttackDamageCache = new HashMap<>(); public boolean magmaCubeTakeDamageFromWater = false; + public boolean magmaCubeAlwaysDropExp = false; private void magmaCubeSettings() { magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); @@ -1950,6 +2009,7 @@ public class PurpurWorldConfig { magmaCubeMaxHealthCache.clear(); magmaCubeAttackDamageCache.clear(); magmaCubeTakeDamageFromWater = getBoolean("mobs.magma_cube.takes-damage-from-water", magmaCubeTakeDamageFromWater); + magmaCubeAlwaysDropExp = getBoolean("mobs.magma_cube.always-drop-exp", magmaCubeAlwaysDropExp); } public boolean mooshroomRidable = false; @@ -1959,6 +2019,7 @@ public class PurpurWorldConfig { public double mooshroomScale = 1.0D; public int mooshroomBreedingTicks = 6000; public boolean mooshroomTakeDamageFromWater = false; + public boolean mooshroomAlwaysDropExp = false; private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); @@ -1972,6 +2033,7 @@ public class PurpurWorldConfig { mooshroomScale = Mth.clamp(getDouble("mobs.mooshroom.attributes.scale", mooshroomScale), 0.0625D, 16.0D); mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); mooshroomTakeDamageFromWater = getBoolean("mobs.mooshroom.takes-damage-from-water", mooshroomTakeDamageFromWater); + mooshroomAlwaysDropExp = getBoolean("mobs.mooshroom.always-drop-exp", mooshroomAlwaysDropExp); } public boolean muleRidableInWater = false; @@ -1983,6 +2045,7 @@ public class PurpurWorldConfig { public double muleMovementSpeedMax = 0.175D; public int muleBreedingTicks = 6000; public boolean muleTakeDamageFromWater = false; + public boolean muleAlwaysDropExp = false; private void muleSettings() { muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { @@ -2000,6 +2063,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); + muleAlwaysDropExp = getBoolean("mobs.mule.always-drop-exp", muleAlwaysDropExp); } public boolean ocelotRidable = false; @@ -2009,6 +2073,7 @@ public class PurpurWorldConfig { public double ocelotScale = 1.0D; public int ocelotBreedingTicks = 6000; public boolean ocelotTakeDamageFromWater = false; + public boolean ocelotAlwaysDropExp = false; private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); @@ -2022,6 +2087,7 @@ public class PurpurWorldConfig { ocelotScale = Mth.clamp(getDouble("mobs.ocelot.attributes.scale", ocelotScale), 0.0625D, 16.0D); ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); ocelotTakeDamageFromWater = getBoolean("mobs.ocelot.takes-damage-from-water", ocelotTakeDamageFromWater); + ocelotAlwaysDropExp = getBoolean("mobs.ocelot.always-drop-exp", ocelotAlwaysDropExp); } public boolean pandaRidable = false; @@ -2031,6 +2097,7 @@ public class PurpurWorldConfig { public double pandaScale = 1.0D; public int pandaBreedingTicks = 6000; public boolean pandaTakeDamageFromWater = false; + public boolean pandaAlwaysDropExp = false; private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); @@ -2044,6 +2111,7 @@ public class PurpurWorldConfig { pandaScale = Mth.clamp(getDouble("mobs.panda.attributes.scale", pandaScale), 0.0625D, 16.0D); pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); pandaTakeDamageFromWater = getBoolean("mobs.panda.takes-damage-from-water", pandaTakeDamageFromWater); + pandaAlwaysDropExp = getBoolean("mobs.panda.always-drop-exp", pandaAlwaysDropExp); } public boolean parrotRidable = false; @@ -2054,6 +2122,7 @@ public class PurpurWorldConfig { public double parrotScale = 1.0D; public boolean parrotTakeDamageFromWater = false; public boolean parrotBreedable = false; + public boolean parrotAlwaysDropExp = false; private void parrotSettings() { parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); @@ -2068,6 +2137,7 @@ public class PurpurWorldConfig { parrotScale = Mth.clamp(getDouble("mobs.parrot.attributes.scale", parrotScale), 0.0625D, 16.0D); parrotTakeDamageFromWater = getBoolean("mobs.parrot.takes-damage-from-water", parrotTakeDamageFromWater); parrotBreedable = getBoolean("mobs.parrot.can-breed", parrotBreedable); + parrotAlwaysDropExp = getBoolean("mobs.parrot.always-drop-exp", parrotAlwaysDropExp); } public boolean phantomRidable = false; @@ -2095,6 +2165,7 @@ public class PurpurWorldConfig { public boolean phantomBurnInDaylight = true; public boolean phantomFlamesOnSwoop = false; public boolean phantomTakeDamageFromWater = false; + public boolean phantomAlwaysDropExp = false; private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); @@ -2130,6 +2201,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); + phantomAlwaysDropExp = getBoolean("mobs.phantom.always-drop-exp", phantomAlwaysDropExp); } public boolean pigRidable = false; @@ -2140,6 +2212,7 @@ public class PurpurWorldConfig { public boolean pigGiveSaddleBack = false; public int pigBreedingTicks = 6000; public boolean pigTakeDamageFromWater = false; + public boolean pigAlwaysDropExp = false; private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); @@ -2154,6 +2227,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); + pigAlwaysDropExp = getBoolean("mobs.pig.always-drop-exp", pigAlwaysDropExp); } public boolean piglinRidable = false; @@ -2164,6 +2238,7 @@ public class PurpurWorldConfig { public boolean piglinBypassMobGriefing = false; public boolean piglinTakeDamageFromWater = false; public int piglinPortalSpawnModifier = 2000; + public boolean piglinAlwaysDropExp = false; private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); @@ -2178,6 +2253,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); + piglinAlwaysDropExp = getBoolean("mobs.piglin.always-drop-exp", piglinAlwaysDropExp); } public boolean piglinBruteRidable = false; @@ -2186,6 +2262,7 @@ public class PurpurWorldConfig { public double piglinBruteMaxHealth = 50.0D; public double piglinBruteScale = 1.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); @@ -2198,6 +2275,7 @@ public class PurpurWorldConfig { piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); piglinBruteScale = Mth.clamp(getDouble("mobs.piglin_brute.attributes.scale", piglinBruteScale), 0.0625D, 16.0D); piglinBruteTakeDamageFromWater = getBoolean("mobs.piglin_brute.takes-damage-from-water", piglinBruteTakeDamageFromWater); + piglinBruteAlwaysDropExp = getBoolean("mobs.piglin_brute.always-drop-exp", piglinBruteAlwaysDropExp); } public boolean pillagerRidable = false; @@ -2207,6 +2285,7 @@ public class PurpurWorldConfig { public double pillagerScale = 1.0D; public boolean pillagerBypassMobGriefing = false; public boolean pillagerTakeDamageFromWater = false; + public boolean pillagerAlwaysDropExp = false; private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); @@ -2220,6 +2299,7 @@ public class PurpurWorldConfig { pillagerScale = Mth.clamp(getDouble("mobs.pillager.attributes.scale", pillagerScale), 0.0625D, 16.0D); pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); pillagerTakeDamageFromWater = getBoolean("mobs.pillager.takes-damage-from-water", pillagerTakeDamageFromWater); + pillagerAlwaysDropExp = getBoolean("mobs.pillager.always-drop-exp", pillagerAlwaysDropExp); } public boolean polarBearRidable = false; @@ -2231,6 +2311,7 @@ public class PurpurWorldConfig { public Item polarBearBreedableItem = null; public int polarBearBreedingTicks = 6000; public boolean polarBearTakeDamageFromWater = false; + public boolean polarBearAlwaysDropExp = false; private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); @@ -2247,6 +2328,7 @@ 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); + polarBearAlwaysDropExp = getBoolean("mobs.polar_bear.always-drop-exp", polarBearAlwaysDropExp); } public boolean pufferfishRidable = false; @@ -2254,6 +2336,7 @@ public class PurpurWorldConfig { public double pufferfishMaxHealth = 3.0D; public double pufferfishScale = 1.0D; public boolean pufferfishTakeDamageFromWater = false; + public boolean pufferfishAlwaysDropExp = false; private void pufferfishSettings() { pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); @@ -2265,6 +2348,7 @@ public class PurpurWorldConfig { pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); pufferfishScale = Mth.clamp(getDouble("mobs.pufferfish.attributes.scale", pufferfishScale), 0.0625D, 16.0D); pufferfishTakeDamageFromWater = getBoolean("mobs.pufferfish.takes-damage-from-water", pufferfishTakeDamageFromWater); + pufferfishAlwaysDropExp = getBoolean("mobs.pufferfish.always-drop-exp", pufferfishAlwaysDropExp); } public boolean rabbitRidable = false; @@ -2277,6 +2361,7 @@ public class PurpurWorldConfig { public int rabbitBreedingTicks = 6000; public boolean rabbitBypassMobGriefing = false; public boolean rabbitTakeDamageFromWater = false; + public boolean rabbitAlwaysDropExp = false; private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); @@ -2293,6 +2378,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); + rabbitAlwaysDropExp = getBoolean("mobs.rabbit.always-drop-exp", rabbitAlwaysDropExp); } public boolean ravagerRidable = false; @@ -2303,6 +2389,7 @@ public class PurpurWorldConfig { public boolean ravagerBypassMobGriefing = false; public boolean ravagerTakeDamageFromWater = false; public List ravagerGriefableBlocks = new ArrayList<>(); + public boolean ravagerAlwaysDropExp = false; private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); @@ -2333,6 +2420,7 @@ public class PurpurWorldConfig { ravagerGriefableBlocks.add(block); } }); + ravagerAlwaysDropExp = getBoolean("mobs.ravager.always-drop-exp", ravagerAlwaysDropExp); } public boolean salmonRidable = false; @@ -2340,6 +2428,7 @@ public class PurpurWorldConfig { public double salmonMaxHealth = 3.0D; public double salmonScale = 1.0D; public boolean salmonTakeDamageFromWater = false; + public boolean salmonAlwaysDropExp = false; private void salmonSettings() { salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); @@ -2351,6 +2440,7 @@ public class PurpurWorldConfig { salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); salmonScale = Mth.clamp(getDouble("mobs.salmon.attributes.scale", salmonScale), 0.0625D, 16.0D); salmonTakeDamageFromWater = getBoolean("mobs.salmon.takes-damage-from-water", salmonTakeDamageFromWater); + salmonAlwaysDropExp = getBoolean("mobs.salmon.always-drop-exp", salmonAlwaysDropExp); } public boolean sheepRidable = false; @@ -2361,6 +2451,7 @@ public class PurpurWorldConfig { public int sheepBreedingTicks = 6000; public boolean sheepBypassMobGriefing = false; public boolean sheepTakeDamageFromWater = false; + public boolean sheepAlwaysDropExp = false; private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); @@ -2375,6 +2466,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); + sheepAlwaysDropExp = getBoolean("mobs.sheep.always-drop-exp", sheepAlwaysDropExp); } public boolean shulkerRidable = false; @@ -2389,6 +2481,7 @@ public class PurpurWorldConfig { public String shulkerSpawnFromBulletNearbyEquation = "(nearby - 1) / 5.0"; public boolean shulkerSpawnFromBulletRandomColor = false; public boolean shulkerChangeColorWithDye = false; + public boolean shulkerAlwaysDropExp = false; private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); @@ -2407,6 +2500,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); + shulkerAlwaysDropExp = getBoolean("mobs.shulker.always-drop-exp", shulkerAlwaysDropExp); } public boolean silverfishRidable = false; @@ -2418,6 +2512,7 @@ public class PurpurWorldConfig { public double silverfishAttackDamage = 1.0D; public boolean silverfishBypassMobGriefing = false; public boolean silverfishTakeDamageFromWater = false; + public boolean silverfishAlwaysDropExp = false; private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); @@ -2433,6 +2528,7 @@ public class PurpurWorldConfig { silverfishAttackDamage = getDouble("mobs.silverfish.attributes.attack_damage", silverfishAttackDamage); silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); silverfishTakeDamageFromWater = getBoolean("mobs.silverfish.takes-damage-from-water", silverfishTakeDamageFromWater); + silverfishAlwaysDropExp = getBoolean("mobs.silverfish.always-drop-exp", silverfishAlwaysDropExp); } public boolean skeletonRidable = false; @@ -2441,6 +2537,7 @@ public class PurpurWorldConfig { public double skeletonMaxHealth = 20.0D; public double skeletonScale = 1.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); @@ -2453,6 +2550,7 @@ public class PurpurWorldConfig { skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); skeletonScale = Mth.clamp(getDouble("mobs.skeleton.attributes.scale", skeletonScale), 0.0625D, 16.0D); skeletonTakeDamageFromWater = getBoolean("mobs.skeleton.takes-damage-from-water", skeletonTakeDamageFromWater); + skeletonAlwaysDropExp = getBoolean("mobs.skeleton.always-drop-exp", skeletonAlwaysDropExp); } public boolean skeletonHorseRidable = false; @@ -2465,6 +2563,7 @@ public class PurpurWorldConfig { public double skeletonHorseMovementSpeedMin = 0.2D; public double skeletonHorseMovementSpeedMax = 0.2D; public boolean skeletonHorseTakeDamageFromWater = false; + public boolean skeletonHorseAlwaysDropExp = false; private void skeletonHorseSettings() { skeletonHorseRidable = getBoolean("mobs.skeleton_horse.ridable", skeletonHorseRidable); skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); @@ -2482,6 +2581,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); + skeletonHorseAlwaysDropExp = getBoolean("mobs.skeleton_horse.always-drop-exp", skeletonHorseAlwaysDropExp); } public boolean slimeRidable = false; @@ -2492,6 +2592,7 @@ public class PurpurWorldConfig { public Map slimeMaxHealthCache = new HashMap<>(); public Map slimeAttackDamageCache = new HashMap<>(); public boolean slimeTakeDamageFromWater = false; + public boolean slimeAlwaysDropExp = false; private void slimeSettings() { slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); @@ -2506,6 +2607,7 @@ public class PurpurWorldConfig { slimeMaxHealthCache.clear(); slimeAttackDamageCache.clear(); slimeTakeDamageFromWater = getBoolean("mobs.slime.takes-damage-from-water", slimeTakeDamageFromWater); + slimeAlwaysDropExp = getBoolean("mobs.slime.always-drop-exp", slimeAlwaysDropExp); } public boolean snowGolemRidable = false; @@ -2521,6 +2623,7 @@ public class PurpurWorldConfig { public double snowGolemAttackDistance = 1.25D; public boolean snowGolemBypassMobGriefing = false; public boolean snowGolemTakeDamageFromWater = true; + public boolean snowGolemAlwaysDropExp = false; private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); @@ -2540,6 +2643,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); + snowGolemAlwaysDropExp = getBoolean("mobs.snow_golem.always-drop-exp", snowGolemAlwaysDropExp); } public boolean snifferRidable = false; @@ -2565,6 +2669,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); squidControllable = getBoolean("mobs.squid.controllable", squidControllable); @@ -2579,6 +2684,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); + squidAlwaysDropExp = getBoolean("mobs.squid.always-drop-exp", squidAlwaysDropExp); } public boolean spiderRidable = false; @@ -2587,6 +2693,7 @@ public class PurpurWorldConfig { public double spiderMaxHealth = 16.0D; public double spiderScale = 1.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); @@ -2599,6 +2706,7 @@ public class PurpurWorldConfig { spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); spiderScale = Mth.clamp(getDouble("mobs.spider.attributes.scale", spiderScale), 0.0625D, 16.0D); spiderTakeDamageFromWater = getBoolean("mobs.spider.takes-damage-from-water", spiderTakeDamageFromWater); + spiderAlwaysDropExp = getBoolean("mobs.spider.always-drop-exp", spiderAlwaysDropExp); } public boolean strayRidable = false; @@ -2607,6 +2715,7 @@ public class PurpurWorldConfig { public double strayMaxHealth = 20.0D; public double strayScale = 1.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); @@ -2619,6 +2728,7 @@ public class PurpurWorldConfig { strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); strayScale = Mth.clamp(getDouble("mobs.stray.attributes.scale", strayScale), 0.0625D, 16.0D); strayTakeDamageFromWater = getBoolean("mobs.stray.takes-damage-from-water", strayTakeDamageFromWater); + strayAlwaysDropExp = getBoolean("mobs.stray.always-drop-exp", strayAlwaysDropExp); } public boolean striderRidable = false; @@ -2629,6 +2739,7 @@ public class PurpurWorldConfig { public int striderBreedingTicks = 6000; public boolean striderGiveSaddleBack = false; public boolean striderTakeDamageFromWater = true; + public boolean striderAlwaysDropExp = false; private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); @@ -2643,6 +2754,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); + striderAlwaysDropExp = getBoolean("mobs.strider.always-drop-exp", striderAlwaysDropExp); } public boolean tadpoleRidable = false; @@ -2665,6 +2777,7 @@ public class PurpurWorldConfig { public double traderLlamaMovementSpeedMax = 0.175D; public int traderLlamaBreedingTicks = 6000; public boolean traderLlamaTakeDamageFromWater = false; + public boolean traderLlamaAlwaysDropExp = false; private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); @@ -2684,6 +2797,7 @@ 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); + traderLlamaAlwaysDropExp = getBoolean("mobs.trader_llama.always-drop-exp", traderLlamaAlwaysDropExp); } public boolean tropicalFishRidable = false; @@ -2691,6 +2805,7 @@ public class PurpurWorldConfig { public double tropicalFishMaxHealth = 3.0D; public double tropicalFishScale = 1.0D; public boolean tropicalFishTakeDamageFromWater = false; + public boolean tropicalFishAlwaysDropExp = false; private void tropicalFishSettings() { tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); @@ -2702,6 +2817,7 @@ public class PurpurWorldConfig { tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); tropicalFishScale = Mth.clamp(getDouble("mobs.tropical_fish.attributes.scale", tropicalFishScale), 0.0625D, 16.0D); tropicalFishTakeDamageFromWater = getBoolean("mobs.tropical_fish.takes-damage-from-water", tropicalFishTakeDamageFromWater); + tropicalFishAlwaysDropExp = getBoolean("mobs.tropical_fish.always-drop-exp", tropicalFishAlwaysDropExp); } public boolean turtleRidable = false; @@ -2711,6 +2827,7 @@ public class PurpurWorldConfig { public double turtleScale = 1.0D; public int turtleBreedingTicks = 6000; public boolean turtleTakeDamageFromWater = false; + public boolean turtleAlwaysDropExp = false; private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); @@ -2724,6 +2841,7 @@ public class PurpurWorldConfig { turtleScale = Mth.clamp(getDouble("mobs.turtle.attributes.scale", turtleScale), 0.0625D, 16.0D); turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); turtleTakeDamageFromWater = getBoolean("mobs.turtle.takes-damage-from-water", turtleTakeDamageFromWater); + turtleAlwaysDropExp = getBoolean("mobs.turtle.always-drop-exp", turtleAlwaysDropExp); } public boolean vexRidable = false; @@ -2733,6 +2851,7 @@ public class PurpurWorldConfig { public double vexMaxHealth = 14.0D; public double vexScale = 1.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); @@ -2746,6 +2865,7 @@ public class PurpurWorldConfig { vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); vexScale = Mth.clamp(getDouble("mobs.vex.attributes.scale", vexScale), 0.0625D, 16.0D); vexTakeDamageFromWater = getBoolean("mobs.vex.takes-damage-from-water", vexTakeDamageFromWater); + vexAlwaysDropExp = getBoolean("mobs.vex.always-drop-exp", vexAlwaysDropExp); } public boolean villagerRidable = false; @@ -2763,6 +2883,7 @@ public class PurpurWorldConfig { public boolean villagerBypassMobGriefing = false; public boolean villagerTakeDamageFromWater = false; public boolean villagerAllowTrading = true; + public boolean villagerAlwaysDropExp = false; private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); @@ -2784,6 +2905,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); + villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); } public boolean vindicatorRidable = false; @@ -2793,6 +2915,7 @@ public class PurpurWorldConfig { public double vindicatorScale = 1.0D; public double vindicatorJohnnySpawnChance = 0D; public boolean vindicatorTakeDamageFromWater = false; + public boolean vindicatorAlwaysDropExp = false; private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); @@ -2806,6 +2929,7 @@ public class PurpurWorldConfig { vindicatorScale = Mth.clamp(getDouble("mobs.vindicator.attributes.scale", vindicatorScale), 0.0625D, 16.0D); vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); vindicatorTakeDamageFromWater = getBoolean("mobs.vindicator.takes-damage-from-water", vindicatorTakeDamageFromWater); + vindicatorAlwaysDropExp = getBoolean("mobs.vindicator.always-drop-exp", vindicatorAlwaysDropExp); } public boolean wanderingTraderRidable = false; @@ -2818,6 +2942,7 @@ public class PurpurWorldConfig { public boolean wanderingTraderCanBeLeashed = false; public boolean wanderingTraderTakeDamageFromWater = false; public boolean wanderingTraderAllowTrading = true; + public boolean wanderingTraderAlwaysDropExp = false; private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); @@ -2834,6 +2959,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); + wanderingTraderAlwaysDropExp = getBoolean("mobs.wandering_trader.always-drop-exp", wanderingTraderAlwaysDropExp); } public boolean wardenRidable = false; @@ -2851,6 +2977,7 @@ public class PurpurWorldConfig { public double witchMaxHealth = 26.0D; public double witchScale = 1.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); @@ -2863,6 +2990,7 @@ public class PurpurWorldConfig { witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); witchScale = Mth.clamp(getDouble("mobs.witch.attributes.scale", witchScale), 0.0625D, 16.0D); witchTakeDamageFromWater = getBoolean("mobs.witch.takes-damage-from-water", witchTakeDamageFromWater); + witchAlwaysDropExp = getBoolean("mobs.witch.always-drop-exp", witchAlwaysDropExp); } public boolean witherRidable = false; @@ -2878,6 +3006,7 @@ public class PurpurWorldConfig { public boolean witherCanRideVehicles = false; public float witherExplosionRadius = 1.0F; public boolean witherPlaySpawnSound = true; + public boolean witherAlwaysDropExp = false; private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); @@ -2901,6 +3030,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); + witherAlwaysDropExp = getBoolean("mobs.wither.always-drop-exp", witherAlwaysDropExp); } public boolean witherSkeletonRidable = false; @@ -2909,6 +3039,7 @@ public class PurpurWorldConfig { public double witherSkeletonMaxHealth = 20.0D; public double witherSkeletonScale = 1.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); @@ -2921,6 +3052,7 @@ public class PurpurWorldConfig { witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); witherSkeletonScale = Mth.clamp(getDouble("mobs.wither_skeleton.attributes.scale", witherSkeletonScale), 0.0625D, 16.0D); witherSkeletonTakeDamageFromWater = getBoolean("mobs.wither_skeleton.takes-damage-from-water", witherSkeletonTakeDamageFromWater); + witherSkeletonAlwaysDropExp = getBoolean("mobs.wither_skeleton.always-drop-exp", witherSkeletonAlwaysDropExp); } public boolean wolfRidable = false; @@ -2933,6 +3065,7 @@ public class PurpurWorldConfig { public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; public boolean wolfTakeDamageFromWater = false; + public boolean wolfAlwaysDropExp = false; private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); @@ -2953,6 +3086,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); + wolfAlwaysDropExp = getBoolean("mobs.wolf.always-drop-exp", wolfAlwaysDropExp); } public boolean zoglinRidable = false; @@ -2961,6 +3095,7 @@ public class PurpurWorldConfig { public double zoglinMaxHealth = 40.0D; public double zoglinScale = 1.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); @@ -2973,6 +3108,7 @@ public class PurpurWorldConfig { zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); zoglinScale = Mth.clamp(getDouble("mobs.zoglin.attributes.scale", zoglinScale), 0.0625D, 16.0D); zoglinTakeDamageFromWater = getBoolean("mobs.zoglin.takes-damage-from-water", zoglinTakeDamageFromWater); + zoglinAlwaysDropExp = getBoolean("mobs.zoglin.always-drop-exp", zoglinAlwaysDropExp); } public boolean zombieRidable = false; @@ -2987,6 +3123,7 @@ public class PurpurWorldConfig { public boolean zombieAggressiveTowardsVillagerWhenLagging = true; public boolean zombieBypassMobGriefing = false; public boolean zombieTakeDamageFromWater = false; + public boolean zombieAlwaysDropExp = false; private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); @@ -3005,6 +3142,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); + zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); } public boolean zombieHorseRidable = false; @@ -3018,6 +3156,7 @@ public class PurpurWorldConfig { public double zombieHorseMovementSpeedMax = 0.2D; public double zombieHorseSpawnChance = 0.0D; public boolean zombieHorseTakeDamageFromWater = false; + public boolean zombieHorseAlwaysDropExp = false; private void zombieHorseSettings() { zombieHorseRidable = getBoolean("mobs.zombie_horse.ridable", zombieHorseRidable); zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); @@ -3036,6 +3175,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); + zombieHorseAlwaysDropExp = getBoolean("mobs.zombie_horse.always-drop-exp", zombieHorseAlwaysDropExp); } public boolean zombieVillagerRidable = false; @@ -3051,6 +3191,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMin = 3600; public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; + public boolean zombieVillagerAlwaysDropExp = false; private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); @@ -3070,6 +3211,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); + zombieVillagerAlwaysDropExp = getBoolean("mobs.zombie_villager.always-drop-exp", zombieVillagerAlwaysDropExp); } public boolean zombifiedPiglinRidable = false; @@ -3083,6 +3225,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyTryExistingChickens = true; public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; public boolean zombifiedPiglinTakeDamageFromWater = false; + public boolean zombifiedPiglinAlwaysDropExp = false; private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); @@ -3100,6 +3243,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); + zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp); } public float hungerStarvationDamage = 1.0F;