diff --git a/patches/unapplied-server/0101-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch b/patches/server/0096-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch similarity index 96% rename from patches/unapplied-server/0101-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch rename to patches/server/0096-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch index 3fc1704f3..2f7f5e035 100644 --- a/patches/unapplied-server/0101-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch +++ b/patches/server/0096-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch @@ -17,7 +17,7 @@ index 774c982f28b4f127fc3f036c19dfb47fb9ae3264..d49b60e7e643498b49c03593dc0da2f8 // Paper end - Add PlayerNameEntityEvent mob.setPersistenceRequired(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8a0eb8281364cd0b140381474a46d02a6c4ad3ba..5b1c6815967d5006fbc466e3368398cc4d1f0c18 100644 +index 28e074e5d966d02c07bf9151d2452eff63871ac7..50a21def146bf009f9275335f7b8640b8182441b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -98,9 +98,11 @@ public class PurpurWorldConfig { diff --git a/patches/unapplied-server/0102-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch b/patches/server/0097-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch similarity index 85% rename from patches/unapplied-server/0102-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch rename to patches/server/0097-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch index 9d94d0c70..d640bbf34 100644 --- a/patches/unapplied-server/0102-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch +++ b/patches/server/0097-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch @@ -8,10 +8,10 @@ This should help to reduce the amount of dirt, gravel, grass, and etc. that Endermen like to randomly place all over the world. diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index cb307a9419399e33a895376a584456f084691965..052a0c168268b7e788953063f54c3769023f3c03 100644 +index 8604db61d2c8042d0399262cb60b98457e4f894c..ada2403856aeb7cb50c0b00fb1dad18b93ecd52c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -478,7 +478,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -480,7 +480,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { @@ -21,10 +21,10 @@ index cb307a9419399e33a895376a584456f084691965..052a0c168268b7e788953063f54c3769 private static class EndermanFreezeWhenLookedAt extends Goal { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 49d105df72c8f67fe48c39f03d840ccaa90b7c73..7c7b1cba2d50b1a4eda66ee4cde9137f01735e63 100644 +index 50a21def146bf009f9275335f7b8640b8182441b..f53b06363f2a7b3977bb8e99297468bb06e5be31 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -858,6 +858,7 @@ public class PurpurWorldConfig { +@@ -845,6 +845,7 @@ public class PurpurWorldConfig { public boolean endermanControllable = true; public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; @@ -32,7 +32,7 @@ index 49d105df72c8f67fe48c39f03d840ccaa90b7c73..7c7b1cba2d50b1a4eda66ee4cde9137f private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -869,6 +870,7 @@ public class PurpurWorldConfig { +@@ -856,6 +857,7 @@ public class PurpurWorldConfig { } endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); diff --git a/patches/unapplied-server/0103-Add-configurable-snowball-damage.patch b/patches/server/0098-Add-configurable-snowball-damage.patch similarity index 92% rename from patches/unapplied-server/0103-Add-configurable-snowball-damage.patch rename to patches/server/0098-Add-configurable-snowball-damage.patch index 226d4c521..50134ac81 100644 --- a/patches/unapplied-server/0103-Add-configurable-snowball-damage.patch +++ b/patches/server/0098-Add-configurable-snowball-damage.patch @@ -18,10 +18,10 @@ index 2b4d206c0d31ba38d7b2af654bd420e85145d441..f59a2903bfb8ae591a638ea5bb387caa entity.hurt(this.damageSources().thrown(this, this.getOwner()), (float) i); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2afd56fd352f7a0bd2028a2b9b238f3d1d8fe14a..f87abb5d0572b8d51c91dd90638e7a728c49a69a 100644 +index f53b06363f2a7b3977bb8e99297468bb06e5be31..d0105b3673c0ef1e04b565e80f4f661463fbc75c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -383,6 +383,11 @@ public class PurpurWorldConfig { +@@ -370,6 +370,11 @@ public class PurpurWorldConfig { //} } diff --git a/patches/unapplied-server/0104-Changeable-Mob-Left-Handed-Chance.patch b/patches/server/0099-Changeable-Mob-Left-Handed-Chance.patch similarity index 64% rename from patches/unapplied-server/0104-Changeable-Mob-Left-Handed-Chance.patch rename to patches/server/0099-Changeable-Mob-Left-Handed-Chance.patch index f71b027f0..e30b6cedf 100644 --- a/patches/unapplied-server/0104-Changeable-Mob-Left-Handed-Chance.patch +++ b/patches/server/0099-Changeable-Mob-Left-Handed-Chance.patch @@ -5,23 +5,23 @@ Subject: [PATCH] Changeable Mob Left Handed Chance diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 6415bc82e44629a08a2ec881acaa5d993e48bb9d..24755576d2c0e59fe5ed2d6019dfe33a5d6a64f9 100644 +index 94508891d9ea3806c66b020fec4c97297dd558d8..d92d19bdb2c49be1303065583d59f37419b0fd22 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1437,7 +1437,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti - RandomSource randomsource = world.getRandom(); +@@ -1426,7 +1426,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + attributemodifiable.addPermanentModifier(new AttributeModifier(Mob.RANDOM_SPAWN_BONUS_ID, randomsource.triangle(0.0D, 0.11485000000000001D), AttributeModifier.Operation.ADD_MULTIPLIED_BASE)); + } - this.getAttribute(Attributes.FOLLOW_RANGE).addPermanentModifier(new AttributeModifier("Random spawn bonus", randomsource.triangle(0.0D, 0.11485000000000001D), AttributeModifier.Operation.ADD_MULTIPLIED_BASE)); - this.setLeftHanded(randomsource.nextFloat() < 0.05F); + this.setLeftHanded(randomsource.nextFloat() < world.getLevel().purpurConfig.entityLeftHandedChance); // Purpur return entityData; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3f3584399f56fd475f1a0baa1e29ecfd188fa469..aba8165029d6b614072f511f45bb16c35988fbfd 100644 +index d0105b3673c0ef1e04b565e80f4f661463fbc75c..8eb20e10b14b8798aed433a5b1a208add61573d7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -156,8 +156,10 @@ public class PurpurWorldConfig { +@@ -154,8 +154,10 @@ public class PurpurWorldConfig { } public int entityLifeSpan = 0; @@ -31,4 +31,4 @@ index 3f3584399f56fd475f1a0baa1e29ecfd188fa469..aba8165029d6b614072f511f45bb16c3 + entityLeftHandedChance = (float) getDouble("gameplay-mechanics.entity-left-handed-chance", entityLeftHandedChance); } - public boolean infinityWorksWithoutArrows = false; + public List itemImmuneToCactus = new ArrayList<>(); diff --git a/patches/unapplied-server/0105-Add-boat-fall-damage-config.patch b/patches/server/0100-Add-boat-fall-damage-config.patch similarity index 83% rename from patches/unapplied-server/0105-Add-boat-fall-damage-config.patch rename to patches/server/0100-Add-boat-fall-damage-config.patch index 363d4b351..69bc81900 100644 --- a/patches/unapplied-server/0105-Add-boat-fall-damage-config.patch +++ b/patches/server/0100-Add-boat-fall-damage-config.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add boat fall damage config diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index a11dd0a2f302f1ff64c3ca92d55d6a8ef28398b7..6aeb9f330380b0adc3f45433a462799675d5380c 100644 +index ec77e834d5f21c64aaf5ac8425fb1b42859b22e8..d45990c793cd11a1e443af59738d47a21877f417 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1190,7 +1190,16 @@ public class ServerPlayer extends Player { +@@ -1146,7 +1146,16 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { if (this.isInvulnerableTo(source)) { return false; } else { @@ -27,7 +27,7 @@ index a11dd0a2f302f1ff64c3ca92d55d6a8ef28398b7..6aeb9f330380b0adc3f45433a4627996 if (!flag && this.spawnInvulnerableTime > 0 && !source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index aba8165029d6b614072f511f45bb16c35988fbfd..8ef18139d06e34a885f284fc1954236349a2f1ba 100644 +index 8eb20e10b14b8798aed433a5b1a208add61573d7..28016e60278abafb6fc4cc2535eb63c5dbafd28b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -112,6 +112,7 @@ public class PurpurWorldConfig { @@ -36,13 +36,13 @@ index aba8165029d6b614072f511f45bb16c35988fbfd..8ef18139d06e34a885f284fc19542363 public boolean boatEjectPlayersOnLand = false; + public boolean boatsDoFallDamage = false; public boolean disableDropsOnCrammingDeath = false; - public boolean entitiesCanUsePortals = true; public boolean milkCuresBadOmen = true; -@@ -124,6 +125,7 @@ public class PurpurWorldConfig { + public boolean persistentDroppableEntityDisplayNames = true; +@@ -123,6 +124,7 @@ public class PurpurWorldConfig { private void miscGameplayMechanicsSettings() { useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); + boatsDoFallDamage = getBoolean("gameplay-mechanics.boat.do-fall-damage", boatsDoFallDamage); disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath); - entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals); milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen); + persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames); diff --git a/patches/unapplied-server/0106-Snow-Golem-rate-of-fire-config.patch b/patches/server/0101-Snow-Golem-rate-of-fire-config.patch similarity index 94% rename from patches/unapplied-server/0106-Snow-Golem-rate-of-fire-config.patch rename to patches/server/0101-Snow-Golem-rate-of-fire-config.patch index a53dcd9c1..6227602d8 100644 --- a/patches/unapplied-server/0106-Snow-Golem-rate-of-fire-config.patch +++ b/patches/server/0101-Snow-Golem-rate-of-fire-config.patch @@ -23,10 +23,10 @@ index 0060414b1d5afde56372ce121e9d37a1668cd03b..ee4d4a4fe314ee9bce69c96dd65d84ed this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 62a56a447e1a5c97e0f1bf6d0901d4ad1e4e6ef7..a51830db95db7256ddefa9da89f39471f2d169ec 100644 +index 28016e60278abafb6fc4cc2535eb63c5dbafd28b..ed3e51879d558e65553d1ea2d6d135499baab318 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1631,6 +1631,10 @@ public class PurpurWorldConfig { +@@ -1618,6 +1618,10 @@ public class PurpurWorldConfig { public boolean snowGolemLeaveTrailWhenRidden = false; public double snowGolemMaxHealth = 4.0D; public boolean snowGolemPutPumpkinBack = false; @@ -37,7 +37,7 @@ index 62a56a447e1a5c97e0f1bf6d0901d4ad1e4e6ef7..a51830db95db7256ddefa9da89f39471 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1643,6 +1647,10 @@ public class PurpurWorldConfig { +@@ -1630,6 +1634,10 @@ public class PurpurWorldConfig { } snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); diff --git a/patches/unapplied-server/0107-EMC-Configurable-disable-give-dropping.patch b/patches/server/0102-EMC-Configurable-disable-give-dropping.patch similarity index 89% rename from patches/unapplied-server/0107-EMC-Configurable-disable-give-dropping.patch rename to patches/server/0102-EMC-Configurable-disable-give-dropping.patch index 30a396354..7b76066dc 100644 --- a/patches/unapplied-server/0107-EMC-Configurable-disable-give-dropping.patch +++ b/patches/server/0102-EMC-Configurable-disable-give-dropping.patch @@ -8,10 +8,10 @@ purpur.yml to disable the /give command from dropping items on the floor when a player's inventory is full. diff --git a/src/main/java/net/minecraft/server/commands/GiveCommand.java b/src/main/java/net/minecraft/server/commands/GiveCommand.java -index 47355158e5e762540a10dc67b23092a0fc53bce3..9f1c8a62bda242781a0966fa2fc01534261423c7 100644 +index 0d9de4c61c7b26a6ff37c12fde629161fd0c3d5a..2f7897744f4aea718170698881773e9031a58a51 100644 --- a/src/main/java/net/minecraft/server/commands/GiveCommand.java +++ b/src/main/java/net/minecraft/server/commands/GiveCommand.java -@@ -92,6 +92,7 @@ public class GiveCommand { +@@ -60,6 +60,7 @@ public class GiveCommand { boolean flag = entityplayer.getInventory().add(itemstack1); ItemEntity entityitem; @@ -20,7 +20,7 @@ index 47355158e5e762540a10dc67b23092a0fc53bce3..9f1c8a62bda242781a0966fa2fc01534 entityitem = entityplayer.drop(itemstack, false, false, false); // CraftBukkit - SPIGOT-2942: Add boolean to call event if (entityitem != null) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 6d621a93aaf94927fa6c73e649dcdb8bbbaadd2a..4d747759e2bfaebb02a875ff46159d0ae16acad6 100644 +index b1dec36f0446773b066a4f08cc4045c312f64259..70b9981d739881190cb45bd64369651358bf3447 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -209,6 +209,11 @@ public class PurpurConfig { diff --git a/patches/unapplied-server/0108-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/patches/server/0103-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch similarity index 95% rename from patches/unapplied-server/0108-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch rename to patches/server/0103-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch index e0bd732aa..795daf05e 100644 --- a/patches/unapplied-server/0108-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch +++ b/patches/server/0103-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch @@ -136,10 +136,10 @@ index a0e0692d17760f440fe81d52887284c787e562db..ab9bebc07b5228dbc0d3ba4b0f7d1bbe brain.setMemory(MemoryModuleType.SECONDARY_JOB_SITE, list); } else { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 6de74d992bd8b2845ab98d56201e7eeabd1dfc6b..f7d8f672a680cf2dfebba5677f97895e4a8c209f 100644 +index f07379734f7c131e1ad3e22062f2deac4a0a342e..ba2e1ea184bf31efdf30050fdcc3a5f193d2f096 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -223,7 +223,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -218,7 +218,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler brain.addActivity(Activity.PLAY, VillagerGoalPackages.getPlayPackage(0.5F)); } else { brain.setSchedule(Schedule.VILLAGER_DEFAULT); @@ -148,7 +148,7 @@ index 6de74d992bd8b2845ab98d56201e7eeabd1dfc6b..f7d8f672a680cf2dfebba5677f97895e } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -970,6 +970,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -949,6 +949,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean hasFarmSeeds() { return this.getInventory().hasAnyMatching((itemstack) -> { @@ -161,7 +161,7 @@ index 6de74d992bd8b2845ab98d56201e7eeabd1dfc6b..f7d8f672a680cf2dfebba5677f97895e }); } diff --git a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java -index 1316f4475802e17039800cc6128e1b065328beb7..d02e2d1aceac651e06a3a3698b7ac64dd30d4b12 100644 +index 8734ab1bd8299bbf43906d81a349c2a13e0981a7..3ca83269311cbc18c9ef3ce62cff6a2d4dc0a683 100644 --- a/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java +++ b/src/main/java/net/minecraft/world/entity/npc/VillagerProfession.java @@ -31,7 +31,7 @@ public record VillagerProfession( @@ -174,11 +174,11 @@ index 1316f4475802e17039800cc6128e1b065328beb7..d02e2d1aceac651e06a3a3698b7ac64d "farmer", PoiTypes.FARMER, diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a51830db95db7256ddefa9da89f39471f2d169ec..13cb926fa98b187a0a36beb164179f0085fd8369 100644 +index ed3e51879d558e65553d1ea2d6d135499baab318..bbb9e5a420b327da9546f07592bc6e47eb365d5d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1833,6 +1833,8 @@ public class PurpurWorldConfig { - public boolean villagerCanBeLeashed = false; +@@ -1819,6 +1819,8 @@ public class PurpurWorldConfig { + public boolean villagerFollowEmeraldBlock = false; public boolean villagerCanBreed = true; public int villagerBreedingTicks = 6000; + public boolean villagerClericsFarmWarts = false; @@ -186,8 +186,8 @@ index a51830db95db7256ddefa9da89f39471f2d169ec..13cb926fa98b187a0a36beb164179f00 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1847,6 +1849,8 @@ public class PurpurWorldConfig { - villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); +@@ -1832,6 +1834,8 @@ public class PurpurWorldConfig { + villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); + villagerClericsFarmWarts = getBoolean("mobs.villager.clerics-farm-warts", villagerClericsFarmWarts); diff --git a/patches/unapplied-server/0109-Toggle-for-Zombified-Piglin-death-always-counting-as.patch b/patches/server/0104-Toggle-for-Zombified-Piglin-death-always-counting-as.patch similarity index 87% rename from patches/unapplied-server/0109-Toggle-for-Zombified-Piglin-death-always-counting-as.patch rename to patches/server/0104-Toggle-for-Zombified-Piglin-death-always-counting-as.patch index b03480d03..d26218e35 100644 --- a/patches/unapplied-server/0109-Toggle-for-Zombified-Piglin-death-always-counting-as.patch +++ b/patches/server/0104-Toggle-for-Zombified-Piglin-death-always-counting-as.patch @@ -13,10 +13,10 @@ to the Piglin being angry, even though the player never hit them. This patch adds a toggle to disable this behavior. diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 75c34d9fcc4b33d30b18f1ce4c8749a068744abc..6be751e2d434982a35bbbece4f4fc4631fb3d8e0 100644 +index 0dcf5638e12c7670e6a5e577210e2542de1fd38b..47419219d4f435a17344361f4a60d5aab925d574 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -146,7 +146,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -147,7 +147,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.maybeAlertOthers(); } @@ -25,7 +25,7 @@ index 75c34d9fcc4b33d30b18f1ce4c8749a068744abc..6be751e2d434982a35bbbece4f4fc463 this.lastHurtByPlayerTime = this.tickCount; } -@@ -201,7 +201,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -202,7 +202,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.ticksUntilNextAlert = ZombifiedPiglin.ALERT_INTERVAL.sample(this.random); } @@ -35,10 +35,10 @@ index 75c34d9fcc4b33d30b18f1ce4c8749a068744abc..6be751e2d434982a35bbbece4f4fc463 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 13cb926fa98b187a0a36beb164179f0085fd8369..43e02a35c742aced64c0b9700da9a71c15532478 100644 +index bbb9e5a420b327da9546f07592bc6e47eb365d5d..a86332fceebc02466f194e038dd473c7a7b621cd 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2079,6 +2079,7 @@ public class PurpurWorldConfig { +@@ -2062,6 +2062,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyOnlyBaby = true; public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; @@ -46,7 +46,7 @@ index 13cb926fa98b187a0a36beb164179f0085fd8369..43e02a35c742aced64c0b9700da9a71c private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -2093,5 +2094,6 @@ public class PurpurWorldConfig { +@@ -2076,5 +2077,6 @@ public class PurpurWorldConfig { zombifiedPiglinJockeyOnlyBaby = getBoolean("mobs.zombified_piglin.jockey.only-babies", zombifiedPiglinJockeyOnlyBaby); zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); diff --git a/patches/unapplied-server/0110-Configurable-chance-for-wolves-to-spawn-rabid.patch b/patches/server/0105-Configurable-chance-for-wolves-to-spawn-rabid.patch similarity index 88% rename from patches/unapplied-server/0110-Configurable-chance-for-wolves-to-spawn-rabid.patch rename to patches/server/0105-Configurable-chance-for-wolves-to-spawn-rabid.patch index a69fc887b..032f64dc1 100644 --- a/patches/unapplied-server/0110-Configurable-chance-for-wolves-to-spawn-rabid.patch +++ b/patches/server/0105-Configurable-chance-for-wolves-to-spawn-rabid.patch @@ -7,10 +7,10 @@ Configurable chance to spawn a wolf that is rabid. Rabid wolves attack all players, mobs, and animals. diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 2267f8da1c27ff54b2ced59ef15eb45357b7075d..073014d44a3ccfca9bb5a387843e22917de13bb4 100644 +index e3c0163a4b00dca01b97c41aa57aa998063ec491..04d7e4bc6cc1deda5f53f6ae5f46d2402e0d0c10 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -104,6 +104,37 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder(this, Llama.class, 24.0F, 1.5D, 1.5D)); + this.goalSelector.addGoal(3, new AvoidRabidWolfGoal(this, 24.0F, 1.5D, 1.5D)); // Purpur this.goalSelector.addGoal(4, new LeapAtTargetGoal(this, 0.4F)); this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0D, true)); - this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F, false)); -@@ -176,7 +232,7 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder(this, Player.class, 10, true, false, this::isAngryAt)); @@ -96,15 +96,15 @@ index 2267f8da1c27ff54b2ced59ef15eb45357b7075d..073014d44a3ccfca9bb5a387843e2291 this.targetSelector.addGoal(6, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); this.targetSelector.addGoal(7, new NearestAttackableTargetGoal<>(this, AbstractSkeleton.class, false)); this.targetSelector.addGoal(8, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -219,6 +275,7 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder { + nbt.putString("variant", resourcekey.location().toString()); + }); +@@ -244,6 +301,10 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1)); -@@ -610,6 +611,7 @@ public class ServerPlayer extends Player { + public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile, ClientInformation clientOptions) { + super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); +@@ -566,6 +567,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { }); } @@ -60,7 +60,7 @@ index 6aeb9f330380b0adc3f45433a462799675d5380c..ea2b179be7fe04bb690d7ff01dca0cc2 } @Override -@@ -686,6 +688,7 @@ public class ServerPlayer extends Player { +@@ -642,6 +644,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { }); } @@ -68,7 +68,7 @@ index 6aeb9f330380b0adc3f45433a462799675d5380c..ea2b179be7fe04bb690d7ff01dca0cc2 } // CraftBukkit start - World fallback code, either respawn location or global spawn -@@ -2993,5 +2996,13 @@ public class ServerPlayer extends Player { +@@ -3022,5 +3025,13 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { this.server.getPlayerList().respawn(this, toLevel, true, to, !toLevel.paperConfig().environment.disableTeleportationSuffocationCheck, org.bukkit.event.player.PlayerRespawnEvent.RespawnReason.DEATH); } } @@ -83,10 +83,10 @@ index 6aeb9f330380b0adc3f45433a462799675d5380c..ea2b179be7fe04bb690d7ff01dca0cc2 // Purpur end } diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 338808ba1138f62d89f3f1338a4c5068426df0e4..f2a7eba2618ea9c1acaf93c0ef8f6f5f737de6fe 100644 +index 09595bbd536fc84d309163923317a860f606ea7c..b6289dbad3d2a840dfef9505127a343f032f1da5 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -486,6 +486,7 @@ public abstract class PlayerList { +@@ -480,6 +480,7 @@ public abstract class PlayerList { scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); } // Paper end - Configurable player collision @@ -94,7 +94,7 @@ index 338808ba1138f62d89f3f1338a4c5068426df0e4..f2a7eba2618ea9c1acaf93c0ef8f6f5f PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), s1, player.getId(), worldserver1.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ()); } -@@ -597,6 +598,7 @@ public abstract class PlayerList { +@@ -590,6 +591,7 @@ public abstract class PlayerList { } public net.kyori.adventure.text.Component remove(ServerPlayer entityplayer, net.kyori.adventure.text.Component leaveMessage) { // Paper end - Fix kick event leave message not being sent @@ -103,7 +103,7 @@ index 338808ba1138f62d89f3f1338a4c5068426df0e4..f2a7eba2618ea9c1acaf93c0ef8f6f5f entityplayer.awardStat(Stats.LEAVE_GAME); diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index d493d6a4b613c6881c5be231fcf751048c2fe3a2..fb8fb45d87ffe23e005bd9bc2d3cebc92b9ff478 100644 +index 70b9981d739881190cb45bd64369651358bf3447..4e5e04915f912d873eb5c86037e6b78c82c2ca53 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -182,6 +182,7 @@ public class PurpurConfig { diff --git a/patches/unapplied-server/0115-Striders-give-saddle-back.patch b/patches/server/0110-Striders-give-saddle-back.patch similarity index 89% rename from patches/unapplied-server/0115-Striders-give-saddle-back.patch rename to patches/server/0110-Striders-give-saddle-back.patch index 39c224be1..57357ee01 100644 --- a/patches/unapplied-server/0115-Striders-give-saddle-back.patch +++ b/patches/server/0110-Striders-give-saddle-back.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Striders give saddle back diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index 5f1166ccd64509a70323e2713f3ab58674d83105..741eedcd9e0e29b57d2b3caf5aef1aef18ae5118 100644 +index 0a297368678cafb92eb0374d1d410271c0d10033..13d40773ff8272ca081e852d4ae3dc09f6fa0ffc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java @@ -484,6 +484,19 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @@ -29,10 +29,10 @@ index 5f1166ccd64509a70323e2713f3ab58674d83105..741eedcd9e0e29b57d2b3caf5aef1aef if (!this.level().isClientSide) { player.startRiding(this); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bcb0780b0f1aa5063a1481031e5fcf8cf3fa4884..91630e23b9568418e74a59958bb8f1728095e6fd 100644 +index cb5dd760a689107dbde6ef884577c233f88c3e9a..0df12cd3ace5077e4a916a79af180316df0ad4c3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1736,6 +1736,7 @@ public class PurpurWorldConfig { +@@ -1723,6 +1723,7 @@ public class PurpurWorldConfig { public boolean striderControllable = true; public double striderMaxHealth = 20.0D; public int striderBreedingTicks = 6000; @@ -40,7 +40,7 @@ index bcb0780b0f1aa5063a1481031e5fcf8cf3fa4884..91630e23b9568418e74a59958bb8f172 private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1747,6 +1748,7 @@ public class PurpurWorldConfig { +@@ -1734,6 +1735,7 @@ public class PurpurWorldConfig { } striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); diff --git a/patches/unapplied-server/0116-PlayerBookTooLargeEvent.patch b/patches/server/0111-PlayerBookTooLargeEvent.patch similarity index 81% rename from patches/unapplied-server/0116-PlayerBookTooLargeEvent.patch rename to patches/server/0111-PlayerBookTooLargeEvent.patch index dc4e5a9c7..a8adc4d00 100644 --- a/patches/unapplied-server/0116-PlayerBookTooLargeEvent.patch +++ b/patches/server/0111-PlayerBookTooLargeEvent.patch @@ -5,10 +5,10 @@ Subject: [PATCH] PlayerBookTooLargeEvent diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index e5df5583ef6084e59c8375c82c9909ff2d2bdc3f..b3cecec8a93bd0de1a74e693b7c103fdbc87eba2 100644 +index 3de25a0f8e8242986c9fc8660ca9d0af976d9088..66fe42636f1b1d9f57121f7a98be4f512cc4f999 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1183,10 +1183,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1152,10 +1152,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl int maxBookPageSize = io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.pageMax; double multiplier = Math.max(0.3D, Math.min(1D, io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier)); long byteAllowed = maxBookPageSize; @@ -21,14 +21,14 @@ index e5df5583ef6084e59c8375c82c9909ff2d2bdc3f..b3cecec8a93bd0de1a74e693b7c103fd if (byteLength > 256 * 4) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send a book with with a page too large!"); + org.purpurmc.purpur.event.player.PlayerBookTooLargeEvent event = new org.purpurmc.purpur.event.player.PlayerBookTooLargeEvent(player.getBukkitEntity(), itemstack.asBukkitCopy()); if (event.shouldKickPlayer()) // Purpur - server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause + server.scheduleOnMain(() -> this.disconnect(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1210,6 +1215,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1179,6 +1184,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (byteTotal > byteAllowed) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); + org.purpurmc.purpur.event.player.PlayerBookTooLargeEvent event = new org.purpurmc.purpur.event.player.PlayerBookTooLargeEvent(player.getBukkitEntity(), itemstack.asBukkitCopy()); if (event.shouldKickPlayer()) // Purpur - server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause + server.scheduleOnMain(() -> this.disconnect(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } diff --git a/patches/unapplied-server/0117-Full-netherite-armor-grants-fire-resistance.patch b/patches/server/0112-Full-netherite-armor-grants-fire-resistance.patch similarity index 91% rename from patches/unapplied-server/0117-Full-netherite-armor-grants-fire-resistance.patch rename to patches/server/0112-Full-netherite-armor-grants-fire-resistance.patch index b7a8b3d84..86ab25a2d 100644 --- a/patches/unapplied-server/0117-Full-netherite-armor-grants-fire-resistance.patch +++ b/patches/server/0112-Full-netherite-armor-grants-fire-resistance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Full netherite armor grants fire resistance diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index d98f5e4323859f9eae0caac04865a78719f5befc..579a9c7d914015ef74c6147f2e17962a7aea2a78 100644 +index db8b5a85895ef68f9c492103b0530951e2b71ba3..2578bfa9d31e04506d0e91da22913d3948f9656d 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -381,6 +381,16 @@ public abstract class Player extends LivingEntity { +@@ -386,6 +386,16 @@ public abstract class Player extends LivingEntity { this.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 200, 0, false, false, true), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TURTLE_HELMET); // CraftBukkit } @@ -26,10 +26,10 @@ index d98f5e4323859f9eae0caac04865a78719f5befc..579a9c7d914015ef74c6147f2e17962a protected ItemCooldowns createItemCooldowns() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3f83dee1fc6a847d8f56cc230a6de1223d4f3964..66c4906cb9c3da6f111b96f0ad6be17772764125 100644 +index 0df12cd3ace5077e4a916a79af180316df0ad4c3..706365b7299e5ae2c70a3ce99866982cd3f32729 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -295,6 +295,19 @@ public class PurpurWorldConfig { +@@ -282,6 +282,19 @@ public class PurpurWorldConfig { villageSiegeSpawning = getBoolean("gameplay-mechanics.mob-spawning.village-sieges", predicate); } diff --git a/patches/unapplied-server/0118-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0113-Add-mobGriefing-bypass-to-everything-affected.patch similarity index 89% rename from patches/unapplied-server/0118-Add-mobGriefing-bypass-to-everything-affected.patch rename to patches/server/0113-Add-mobGriefing-bypass-to-everything-affected.patch index e3f73d825..9f6524c90 100644 --- a/patches/unapplied-server/0118-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/patches/server/0113-Add-mobGriefing-bypass-to-everything-affected.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add mobGriefing bypass to everything affected diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index bc410b94c479e9acf969b21c920db0f616342591..6af45fb6ba462730e639d97879f97272445a2246 100644 +index d7175268bf615e20a7e14ad024ab5e3843c91f64..13ada4aa83ddb75d6107d41b4a7d10196d5f01f0 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1825,7 +1825,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1808,7 +1808,7 @@ public abstract class LivingEntity extends Entity implements Attackable { boolean flag = false; if (this.dead && adversary instanceof WitherBoss) { // Paper @@ -18,10 +18,10 @@ index bc410b94c479e9acf969b21c920db0f616342591..6af45fb6ba462730e639d97879f97272 BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 24755576d2c0e59fe5ed2d6019dfe33a5d6a64f9..d4325d9a55f244d96ad1dded9f62b64834dd56c6 100644 +index d92d19bdb2c49be1303065583d59f37419b0fd22..7535f28c2e181363a7bd4874a14244f9cb0a06fe 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -747,7 +747,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti +@@ -694,7 +694,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab public void aiStep() { super.aiStep(); this.level().getProfiler().push("looting"); @@ -92,7 +92,7 @@ index 6634228ef002cbef67980272a26be4a75c954116..a61abba840a55fb4fbc9716a5e05eb27 } else if (this.nextStartTick > 0) { --this.nextStartTick; diff --git a/src/main/java/net/minecraft/world/entity/animal/Fox.java b/src/main/java/net/minecraft/world/entity/animal/Fox.java -index 0f0171c6b34f58ef98ffeb9409f601ea25bbc662..63e2f3574b784672688f0c486fa160e5b02b01b3 100644 +index 2aac6472453aa2ec58a6d5b7040df6d457353ff5..857f59f47e47e183b6e4191978d225ee040fb979 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java @@ -1384,7 +1384,7 @@ public class Fox extends Animal implements VariantHolder { @@ -105,10 +105,10 @@ index 0f0171c6b34f58ef98ffeb9409f601ea25bbc662..63e2f3574b784672688f0c486fa160e5 if (iblockdata.is(Blocks.SWEET_BERRY_BUSH)) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index b5297b1d7223af622636a7defdb98b5bc6e6a3c9..ce424d046d7c4abd2371154b00624aa6a9ca3ae3 100644 +index 4ef310dda00d049b109fc379de2b90696eb24d27..b7ab06f46cfa1fdc4c33595484df781db1967da5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -631,7 +631,7 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -635,7 +635,7 @@ public class Rabbit extends Animal implements VariantHolder { @Override public boolean canUse() { if (this.nextStartTick <= 0) { @@ -131,10 +131,10 @@ index ee4d4a4fe314ee9bce69c96dd65d84ed1ace0543..cdb6657d30d224709aec3921c5fb8380 } diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index ff2faa3ad719378b21f84a7839b4e0c60ea5f66f..ca26c926a014c985f83cfa376a9e859d0c8b2d6b 100644 +index bf2591f163b8482d35a6e532004677199685a593..b078d1922db9f0db561d6e824794bc4518a44947 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -603,7 +603,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -620,7 +620,7 @@ public class EnderDragon extends Mob implements Enemy { BlockState iblockdata = this.level().getBlockState(blockposition); if (!iblockdata.isAir() && !iblockdata.is(BlockTags.DRAGON_TRANSPARENT)) { @@ -144,7 +144,7 @@ index ff2faa3ad719378b21f84a7839b4e0c60ea5f66f..ca26c926a014c985f83cfa376a9e859d // flag1 = this.level().removeBlock(blockposition, false) || flag1; flag1 = true; diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 8d2894bb1ae70f63c8fa67de3e9f7c6a9c940f3e..2f0c44a0b97e9ad7591c5b66c2560f3e405c61c4 100644 +index 8f1458d250bb875396c6318a7abc520f3563b8ef..ed262a905a1a0bf4247538f1db210ed41c73809c 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -493,7 +493,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -157,10 +157,10 @@ index 8d2894bb1ae70f63c8fa67de3e9f7c6a9c940f3e..2f0c44a0b97e9ad7591c5b66c2560f3e j = Mth.floor(this.getBbWidth() / 2.0F + 1.0F); diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 052a0c168268b7e788953063f54c3769023f3c03..de1fe3b115c1b3936b79c8900389542a8c8a2c90 100644 +index ada2403856aeb7cb50c0b00fb1dad18b93ecd52c..c2bddf3e67929b1d9da5739c4f0f15475b537cf0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -526,7 +526,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -528,7 +528,15 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -177,7 +177,7 @@ index 052a0c168268b7e788953063f54c3769023f3c03..de1fe3b115c1b3936b79c8900389542a } @Override -@@ -572,7 +580,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -574,7 +582,15 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -195,7 +195,7 @@ index 052a0c168268b7e788953063f54c3769023f3c03..de1fe3b115c1b3936b79c8900389542a @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -index 8f0c685790aa59b7f2352c3bac6ede444d0ede22..ce2e5c16db13accb082b3f2403661c65411c7a80 100644 +index 3ac01d7e55934d145365790b6cb0c5a04ac2a74d..5ade0be7989ccea459e3c08a0280b6be31f684ce 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java @@ -364,7 +364,7 @@ public class Evoker extends SpellcasterIllager { @@ -208,10 +208,10 @@ index 8f0c685790aa59b7f2352c3bac6ede444d0ede22..ce2e5c16db13accb082b3f2403661c65 } else { List list = Evoker.this.level().getNearbyEntities(Sheep.class, this.wololoTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0D, 4.0D, 16.0D)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 32d547a4430a8f524a7fc0bd1aa063bbebfaeb7f..cebe89b0868043b819fb3e9987f899926961be52 100644 +index ebbfd1fec85f1d4e099f02c91f3d7346b6bb3c7b..86704fcba15cec26eef3f77167aee9116ba27980 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -168,7 +168,7 @@ public class Ravager extends Raider { +@@ -169,7 +169,7 @@ public class Ravager extends Raider { this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1D, d1, d0)); } @@ -243,10 +243,10 @@ index 75f82922260b2c0666021e7ed42dfde401e1a9d6..a175144d5480b7af091787c6ab366fb3 BlockPos blockposition = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ()).relative(this.selectedDirection); BlockState iblockdata = this.mob.level().getBlockState(blockposition); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 06e0f737615c90bd733a89a731156598ccfe447f..57089ba787731ddda853dce959ba015abe135bfd 100644 +index faf5889c040a6c8fbac61a1d02036d32601f3d24..d54f8041b55f8b8d72dc4fda78ae456671f779d4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -412,7 +412,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -411,7 +411,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override public boolean wantsToPickUp(ItemStack stack) { @@ -256,10 +256,10 @@ index 06e0f737615c90bd733a89a731156598ccfe447f..57089ba787731ddda853dce959ba015a protected boolean canReplaceCurrentItem(ItemStack stack) { diff --git a/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java b/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java -index 9d89872c5958f3e8d6c1ef4fd93f9b8b85296851..6a94c86acce5afbf1e9c8e7d664b3eb2d79ab5ab 100644 +index 28a65f2a9ef441ae96a7a635e0695b14ce2ee367..7b6c58a31d37896daccb5f570d3cb9247cea2cd6 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java -@@ -19,20 +19,20 @@ public class LargeFireball extends Fireball { +@@ -23,20 +23,20 @@ public class LargeFireball extends Fireball { public LargeFireball(EntityType type, Level world) { super(type, world); @@ -267,8 +267,8 @@ index 9d89872c5958f3e8d6c1ef4fd93f9b8b85296851..6a94c86acce5afbf1e9c8e7d664b3eb2 + this.isIncendiary = this.level().purpurConfig.fireballsBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit // Purpur } - public LargeFireball(Level world, LivingEntity owner, double velocityX, double velocityY, double velocityZ, int explosionPower) { - super(EntityType.FIREBALL, owner, velocityX, velocityY, velocityZ, world); + public LargeFireball(Level world, LivingEntity owner, Vec3 velocity, int explosionPower) { + super(EntityType.FIREBALL, owner, velocity, world); this.explosionPower = explosionPower; - this.isIncendiary = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit + this.isIncendiary = this.level().purpurConfig.fireballsBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit // Purpur @@ -284,10 +284,10 @@ index 9d89872c5958f3e8d6c1ef4fd93f9b8b85296851..6a94c86acce5afbf1e9c8e7d664b3eb2 // CraftBukkit start - fire ExplosionPrimeEvent ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index 74c596264d4da551437bd2a23e1c70022cfc73fc..e4d4ff0ef4a0f3283aa42fe2304816cd6d9475a8 100644 +index 5f7d152f41eb85f17bcded4bc8099b998e5a338b..8a5baed3d82e49af55f4d58e8729f14c0cd466f2 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -343,7 +343,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { +@@ -355,7 +355,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner(); @@ -297,11 +297,11 @@ index 74c596264d4da551437bd2a23e1c70022cfc73fc..e4d4ff0ef4a0f3283aa42fe2304816cd public boolean mayBreak(Level world) { diff --git a/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java b/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java -index 3a11ad32d95088a5aca713a1a6a984cc22d4fa9a..c078ccad4aabe469a9611331b415a4cef241973e 100644 +index 1711ad457e7d1233fd32edc3e9e3b9f1e3be9980..554d3c4db6ed07e3d12af23a9a18c28480bf77c0 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java -@@ -27,7 +27,7 @@ public class SmallFireball extends Fireball { - super(EntityType.SMALL_FIREBALL, owner, velocityX, velocityY, velocityZ, world); +@@ -30,7 +30,7 @@ public class SmallFireball extends Fireball { + super(EntityType.SMALL_FIREBALL, owner, velocity, world); // CraftBukkit start if (this.getOwner() != null && this.getOwner() instanceof Mob) { - this.isIncendiary = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); @@ -310,15 +310,15 @@ index 3a11ad32d95088a5aca713a1a6a984cc22d4fa9a..c078ccad4aabe469a9611331b415a4ce // CraftBukkit end } diff --git a/src/main/java/net/minecraft/world/entity/raid/Raider.java b/src/main/java/net/minecraft/world/entity/raid/Raider.java -index 98e558338b5d9fb03869d2cc21b3e90eb45b95f6..4a8fa7e5844b5cd12ef6b113f988b715c7a3ef64 100644 +index bbf21ea433f9e3963aac0ede597ed8d3c8e50ed8..06487fc9ea416d8256e0c2cd1969d4e0283ffb05 100644 --- a/src/main/java/net/minecraft/world/entity/raid/Raider.java +++ b/src/main/java/net/minecraft/world/entity/raid/Raider.java -@@ -341,7 +341,7 @@ public abstract class Raider extends PatrollingMonster { +@@ -299,7 +299,7 @@ public abstract class Raider extends PatrollingMonster { @Override public boolean canUse() { -- if (!this.mob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items -+ if ((!this.mob.level().purpurConfig.pillagerBypassMobGriefing && !this.mob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items // Purpur +- if (!this.mob.level().getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items ++ if ((!this.mob.level().purpurConfig.pillagerBypassMobGriefing && !this.mob.level().getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING)) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items // Purpur Raid raid = this.mob.getCurrentRaid(); if (this.mob.hasActiveRaid() && !this.mob.getCurrentRaid().isOver() && this.mob.canBeLeader() && !ItemStack.matches(this.mob.getItemBySlot(EquipmentSlot.HEAD), Raid.getLeaderBannerInstance(this.mob.registryAccess().lookupOrThrow(Registries.BANNER_PATTERN)))) { @@ -375,13 +375,13 @@ index c7377d04ceac3ea624117439783a443c6d6f6d08..0c732cfbd9ce50198a3f85ae8ef2263d } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b1787f34072 100644 +index 706365b7299e5ae2c70a3ce99866982cd3f32729..c03e7560b09d2540278e557867569bcb1eb9722c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -115,8 +115,11 @@ public class PurpurWorldConfig { +@@ -114,8 +114,11 @@ public class PurpurWorldConfig { + public boolean boatEjectPlayersOnLand = false; public boolean boatsDoFallDamage = false; public boolean disableDropsOnCrammingDeath = false; - public boolean entitiesCanUsePortals = true; + public boolean entitiesPickUpLootBypassMobGriefing = false; + public boolean fireballsBypassMobGriefing = false; public boolean milkCuresBadOmen = true; @@ -390,10 +390,10 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 public double tridentLoyaltyVoidReturnHeight = 0.0D; public double voidDamageHeight = -64.0D; public double voidDamageDealt = 4.0D; -@@ -128,8 +131,11 @@ public class PurpurWorldConfig { +@@ -126,8 +129,11 @@ public class PurpurWorldConfig { + boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); boatsDoFallDamage = getBoolean("gameplay-mechanics.boat.do-fall-damage", boatsDoFallDamage); disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath); - entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals); + entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing); + fireballsBypassMobGriefing = getBoolean("gameplay-mechanics.fireballs-bypass-mob-griefing", fireballsBypassMobGriefing); milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen); @@ -402,7 +402,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight); voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight); voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt); -@@ -445,9 +451,11 @@ public class PurpurWorldConfig { +@@ -432,9 +438,11 @@ public class PurpurWorldConfig { dispenserPlaceAnvils = getBoolean("blocks.dispenser.place-anvils", dispenserPlaceAnvils); } @@ -414,7 +414,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow); farmlandAlpha = getBoolean("blocks.farmland.use-alpha-farmland", farmlandAlpha); } -@@ -472,6 +480,11 @@ public class PurpurWorldConfig { +@@ -459,6 +467,11 @@ public class PurpurWorldConfig { lavaSpeedNotNether = getInt("blocks.lava.speed.not-nether", lavaSpeedNotNether); } @@ -426,7 +426,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 public boolean respawnAnchorExplode = true; public double respawnAnchorExplosionPower = 5.0D; public boolean respawnAnchorExplosionFire = true; -@@ -501,10 +514,12 @@ public class PurpurWorldConfig { +@@ -488,10 +501,12 @@ public class PurpurWorldConfig { public boolean turtleEggsBreakFromExpOrbs = false; public boolean turtleEggsBreakFromItems = false; public boolean turtleEggsBreakFromMinecarts = false; @@ -439,7 +439,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public int waterInfiniteRequiredSources = 2; -@@ -762,6 +777,7 @@ public class PurpurWorldConfig { +@@ -749,6 +764,7 @@ public class PurpurWorldConfig { public double creeperMaxHealth = 20.0D; public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; @@ -447,7 +447,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -774,6 +790,7 @@ public class PurpurWorldConfig { +@@ -761,6 +777,7 @@ public class PurpurWorldConfig { creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); @@ -455,7 +455,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean dolphinRidable = false; -@@ -868,6 +885,7 @@ public class PurpurWorldConfig { +@@ -855,6 +872,7 @@ public class PurpurWorldConfig { public double enderDragonMaxY = 320D; public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; @@ -463,7 +463,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -884,6 +902,7 @@ public class PurpurWorldConfig { +@@ -871,6 +889,7 @@ public class PurpurWorldConfig { } enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); @@ -471,7 +471,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean endermanRidable = false; -@@ -892,6 +911,7 @@ public class PurpurWorldConfig { +@@ -879,6 +898,7 @@ public class PurpurWorldConfig { public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; @@ -479,7 +479,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -904,6 +924,7 @@ public class PurpurWorldConfig { +@@ -891,6 +911,7 @@ public class PurpurWorldConfig { endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); @@ -487,7 +487,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean endermiteRidable = false; -@@ -926,6 +947,7 @@ public class PurpurWorldConfig { +@@ -913,6 +934,7 @@ public class PurpurWorldConfig { public boolean evokerRidableInWater = true; public boolean evokerControllable = true; public double evokerMaxHealth = 24.0D; @@ -495,7 +495,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -936,6 +958,7 @@ public class PurpurWorldConfig { +@@ -923,6 +945,7 @@ public class PurpurWorldConfig { set("mobs.evoker.attributes.max_health", oldValue); } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); @@ -503,7 +503,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean foxRidable = false; -@@ -944,6 +967,7 @@ public class PurpurWorldConfig { +@@ -931,6 +954,7 @@ public class PurpurWorldConfig { public double foxMaxHealth = 10.0D; public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; @@ -511,7 +511,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -956,6 +980,7 @@ public class PurpurWorldConfig { +@@ -943,6 +967,7 @@ public class PurpurWorldConfig { foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); @@ -519,7 +519,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean frogRidable = false; -@@ -1403,6 +1428,7 @@ public class PurpurWorldConfig { +@@ -1390,6 +1415,7 @@ public class PurpurWorldConfig { public boolean piglinRidableInWater = true; public boolean piglinControllable = true; public double piglinMaxHealth = 16.0D; @@ -527,7 +527,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1413,6 +1439,7 @@ public class PurpurWorldConfig { +@@ -1400,6 +1426,7 @@ public class PurpurWorldConfig { set("mobs.piglin.attributes.max_health", oldValue); } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); @@ -535,7 +535,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean piglinBruteRidable = false; -@@ -1435,6 +1462,7 @@ public class PurpurWorldConfig { +@@ -1422,6 +1449,7 @@ public class PurpurWorldConfig { public boolean pillagerRidableInWater = true; public boolean pillagerControllable = true; public double pillagerMaxHealth = 24.0D; @@ -543,7 +543,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1445,6 +1473,7 @@ public class PurpurWorldConfig { +@@ -1432,6 +1460,7 @@ public class PurpurWorldConfig { set("mobs.pillager.attributes.max_health", oldValue); } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); @@ -551,7 +551,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean polarBearRidable = false; -@@ -1491,6 +1520,7 @@ public class PurpurWorldConfig { +@@ -1478,6 +1507,7 @@ public class PurpurWorldConfig { public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; @@ -559,7 +559,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1504,12 +1534,14 @@ public class PurpurWorldConfig { +@@ -1491,12 +1521,14 @@ public class PurpurWorldConfig { rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); @@ -574,7 +574,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1520,6 +1552,7 @@ public class PurpurWorldConfig { +@@ -1507,6 +1539,7 @@ public class PurpurWorldConfig { set("mobs.ravager.attributes.max_health", oldValue); } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); @@ -582,7 +582,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean salmonRidable = false; -@@ -1541,6 +1574,7 @@ public class PurpurWorldConfig { +@@ -1528,6 +1561,7 @@ public class PurpurWorldConfig { public boolean sheepControllable = true; public double sheepMaxHealth = 8.0D; public int sheepBreedingTicks = 6000; @@ -590,7 +590,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1552,6 +1586,7 @@ public class PurpurWorldConfig { +@@ -1539,6 +1573,7 @@ public class PurpurWorldConfig { } sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); @@ -598,7 +598,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean shulkerRidable = false; -@@ -1574,6 +1609,7 @@ public class PurpurWorldConfig { +@@ -1561,6 +1596,7 @@ public class PurpurWorldConfig { public boolean silverfishRidableInWater = true; public boolean silverfishControllable = true; public double silverfishMaxHealth = 8.0D; @@ -606,7 +606,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -1584,6 +1620,7 @@ public class PurpurWorldConfig { +@@ -1571,6 +1607,7 @@ public class PurpurWorldConfig { set("mobs.silverfish.attributes.max_health", oldValue); } silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); @@ -614,7 +614,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean skeletonRidable = false; -@@ -1661,6 +1698,7 @@ public class PurpurWorldConfig { +@@ -1648,6 +1685,7 @@ public class PurpurWorldConfig { public int snowGolemSnowBallMax = 20; public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; @@ -622,7 +622,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1677,6 +1715,7 @@ public class PurpurWorldConfig { +@@ -1664,6 +1702,7 @@ public class PurpurWorldConfig { snowGolemSnowBallMax = getInt("mobs.snow_golem.max-shoot-interval-ticks", snowGolemSnowBallMax); snowGolemSnowBallModifier = (float) getDouble("mobs.snow_golem.snow-ball-modifier", snowGolemSnowBallModifier); snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); @@ -630,7 +630,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean snifferRidable = false; -@@ -1863,6 +1902,7 @@ public class PurpurWorldConfig { +@@ -1849,6 +1888,7 @@ public class PurpurWorldConfig { public int villagerBreedingTicks = 6000; public boolean villagerClericsFarmWarts = false; public boolean villagerClericFarmersThrowWarts = true; @@ -638,7 +638,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1879,6 +1919,7 @@ public class PurpurWorldConfig { +@@ -1864,6 +1904,7 @@ public class PurpurWorldConfig { villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); villagerClericsFarmWarts = getBoolean("mobs.villager.clerics-farm-warts", villagerClericsFarmWarts); villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts); @@ -646,7 +646,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean vindicatorRidable = false; -@@ -1951,6 +1992,7 @@ public class PurpurWorldConfig { +@@ -1934,6 +1975,7 @@ public class PurpurWorldConfig { public double witherMaxHealth = 300.0D; public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; @@ -654,7 +654,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1968,6 +2010,7 @@ public class PurpurWorldConfig { +@@ -1951,6 +1993,7 @@ public class PurpurWorldConfig { witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); @@ -662,7 +662,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 } public boolean witherSkeletonRidable = false; -@@ -2039,6 +2082,7 @@ public class PurpurWorldConfig { +@@ -2022,6 +2065,7 @@ public class PurpurWorldConfig { public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; @@ -670,7 +670,7 @@ index b6d625af2acb61f867739624b975d369efe547e0..4ee6c06c6e04bb9dd6150fa4a00b5b17 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2054,6 +2098,7 @@ public class PurpurWorldConfig { +@@ -2037,6 +2081,7 @@ public class PurpurWorldConfig { zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance); zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); diff --git a/patches/unapplied-server/0119-Config-to-allow-Note-Block-sounds-when-blocked.patch b/patches/server/0114-Config-to-allow-Note-Block-sounds-when-blocked.patch similarity index 94% rename from patches/unapplied-server/0119-Config-to-allow-Note-Block-sounds-when-blocked.patch rename to patches/server/0114-Config-to-allow-Note-Block-sounds-when-blocked.patch index fe5cc46f7..57d0953a3 100644 --- a/patches/unapplied-server/0119-Config-to-allow-Note-Block-sounds-when-blocked.patch +++ b/patches/server/0114-Config-to-allow-Note-Block-sounds-when-blocked.patch @@ -22,10 +22,10 @@ index 1d82cfe7af0dc42f88901fb0c44896771fdf8a93..43dd972b374daa1072608f3a68e812e7 // org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(world, pos, state.getValue(NoteBlock.INSTRUMENT), state.getValue(NoteBlock.NOTE)); // if (event.isCancelled()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 51002cc2901b432123dfc6b3c130e26b3c3486a3..30a95d4b18964c6b25beb4dbec84f03effc2145b 100644 +index c03e7560b09d2540278e557867569bcb1eb9722c..e7bcc4cd6b9e2018e717e62b85165d203ed0d925 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -118,6 +118,7 @@ public class PurpurWorldConfig { +@@ -117,6 +117,7 @@ public class PurpurWorldConfig { public boolean entitiesPickUpLootBypassMobGriefing = false; public boolean fireballsBypassMobGriefing = false; public boolean milkCuresBadOmen = true; @@ -33,7 +33,7 @@ index 51002cc2901b432123dfc6b3c130e26b3c3486a3..30a95d4b18964c6b25beb4dbec84f03e public boolean persistentDroppableEntityDisplayNames = true; public boolean projectilesBypassMobGriefing = false; public double tridentLoyaltyVoidReturnHeight = 0.0D; -@@ -134,6 +135,7 @@ public class PurpurWorldConfig { +@@ -132,6 +133,7 @@ public class PurpurWorldConfig { entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing); fireballsBypassMobGriefing = getBoolean("gameplay-mechanics.fireballs-bypass-mob-griefing", fireballsBypassMobGriefing); milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen); diff --git a/patches/unapplied-server/0121-Farmland-trampling-changes.patch b/patches/server/0115-Farmland-trampling-changes.patch similarity index 95% rename from patches/unapplied-server/0121-Farmland-trampling-changes.patch rename to patches/server/0115-Farmland-trampling-changes.patch index e48e6ca91..bf77f0535 100644 --- a/patches/unapplied-server/0121-Farmland-trampling-changes.patch +++ b/patches/server/0115-Farmland-trampling-changes.patch @@ -37,10 +37,10 @@ index 99798220b6e0ad06db2ba5c9b74bfb72af185fee..12a0c69f8fec30fad64cbb00af2ca1bb if (!CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.DIRT.defaultBlockState())) { return; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bed0ee3cac8d2acda872f5f3fcbd2b75a6ca3a0d..91f204f313ee4b5a1f16416670e855d4e7177e51 100644 +index e7bcc4cd6b9e2018e717e62b85165d203ed0d925..255203353384df09f09ffe481094b37f6aa499e0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -458,10 +458,16 @@ public class PurpurWorldConfig { +@@ -443,10 +443,16 @@ public class PurpurWorldConfig { public boolean farmlandBypassMobGriefing = false; public boolean farmlandGetsMoistFromBelow = false; public boolean farmlandAlpha = false; diff --git a/patches/unapplied-server/0122-Movement-options-for-armor-stands.patch b/patches/server/0116-Movement-options-for-armor-stands.patch similarity index 90% rename from patches/unapplied-server/0122-Movement-options-for-armor-stands.patch rename to patches/server/0116-Movement-options-for-armor-stands.patch index e984f34d3..59d6ad8bb 100644 --- a/patches/unapplied-server/0122-Movement-options-for-armor-stands.patch +++ b/patches/server/0116-Movement-options-for-armor-stands.patch @@ -17,10 +17,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index e29f56c83e8ce237e9135fabcf2381130a1a790d..eaa290e87be6953466252f0ae60de7763813e23f 100644 +index 368af5e31919ad5a648315d9d848511a791cc5bb..ccaa58b27c139ec6e6f2375c99dc122342ee7c81 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1935,7 +1935,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1709,7 +1709,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return this.isInWater() || flag; } @@ -30,10 +30,10 @@ index e29f56c83e8ce237e9135fabcf2381130a1a790d..eaa290e87be6953466252f0ae60de776 if (entity instanceof Boat entityboat) { diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index 67eb7ddb77e781bf9d140133e0ad9f16c1ca0f0e..d22ce9181e3b403328b8510bc73f8e6b712ffc89 100644 +index a37054d39ee142e5f3ca3c5e1e3a15c150a3ba32..ea3cad6c9cc561b225cd41f04bd204c99ecd66ec 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -@@ -103,10 +103,12 @@ public class ArmorStand extends LivingEntity { +@@ -102,10 +102,12 @@ public class ArmorStand extends LivingEntity { private boolean noTickPoseDirty = false; private boolean noTickEquipmentDirty = false; // Paper end - Allow ArmorStands not to tick @@ -46,7 +46,7 @@ index 67eb7ddb77e781bf9d140133e0ad9f16c1ca0f0e..d22ce9181e3b403328b8510bc73f8e6b this.handItems = NonNullList.withSize(2, ItemStack.EMPTY); this.armorItems = NonNullList.withSize(4, ItemStack.EMPTY); this.headPose = ArmorStand.DEFAULT_HEAD_POSE; -@@ -1010,4 +1012,18 @@ public class ArmorStand extends LivingEntity { +@@ -1017,4 +1019,18 @@ public class ArmorStand extends LivingEntity { } } // Paper end @@ -66,7 +66,7 @@ index 67eb7ddb77e781bf9d140133e0ad9f16c1ca0f0e..d22ce9181e3b403328b8510bc73f8e6b + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5694476f17d56f0db1c9fdfbafa1fc935cb84b3e..8c36c55ba6230bd254f1416e0a6446737fc1d911 100644 +index 255203353384df09f09ffe481094b37f6aa499e0..24b90abc3171c824008af0a8e49b7963a9636493 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -99,10 +99,16 @@ public class PurpurWorldConfig { diff --git a/patches/unapplied-server/0124-Toggle-for-water-sensitive-mob-damage.patch b/patches/server/0117-Toggle-for-water-sensitive-mob-damage.patch similarity index 88% rename from patches/unapplied-server/0124-Toggle-for-water-sensitive-mob-damage.patch rename to patches/server/0117-Toggle-for-water-sensitive-mob-damage.patch index 387ec54b2..a6ddcd263 100644 --- a/patches/unapplied-server/0124-Toggle-for-water-sensitive-mob-damage.patch +++ b/patches/server/0117-Toggle-for-water-sensitive-mob-damage.patch @@ -37,10 +37,10 @@ index 49adf3f230fa34289a2ce09a9d829f5dbf952fc8..a7847b6ca5b203fd693337928f31a904 public void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index cbcfe8177362d9b8af97f21e716a4dce9e227465..0978f519177ce2f0991402dafb9a22c5a8686168 100644 +index a758f360741de84a004ecc55f1415e74bd0a0fd5..af49371612b56f6e191c580cd54a80e5e77989a3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -175,7 +175,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -176,7 +176,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { // Paper end - Fix MC-167279 this.lookControl = new Bee.BeeLookControl(this); this.setPathfindingMalus(PathType.DANGER_FIRE, -1.0F); @@ -49,7 +49,7 @@ index cbcfe8177362d9b8af97f21e716a4dce9e227465..0978f519177ce2f0991402dafb9a22c5 this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F); this.setPathfindingMalus(PathType.COCOA, -1.0F); this.setPathfindingMalus(PathType.FENCE, -1.0F); -@@ -477,6 +477,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -488,6 +488,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { return this.level().purpurConfig.beeBreedingTicks; } @@ -62,10 +62,10 @@ index cbcfe8177362d9b8af97f21e716a4dce9e227465..0978f519177ce2f0991402dafb9a22c5 public int getRemainingPersistentAngerTime() { return (Integer) this.entityData.get(Bee.DATA_REMAINING_ANGER_TIME); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 27e448a38377ea3cc2e527dbe48a23d233f1ea13..446aec4d10e614f136fe6ae4bb5a7dd0ac6d0f18 100644 +index 8d12b8dad60b44e3315584746d27772fec093323..f679ba03614cc6b0e976330569ed2b678c622fa3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -139,6 +139,11 @@ public class Cat extends TamableAnimal implements VariantHolder { @@ -158,10 +158,10 @@ index 63e2f3574b784672688f0c486fa160e5b02b01b3..5807a498b910ad96d7e6f69db5241c92 protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index 2919d055e2136a956aa038bd0bf4c1a2ff5afa2f..9c86d86a6d89585cfbdace89e66866f496da86cb 100644 +index 9ea96c02d08b342b42b5600acc703be359023dbe..65232a2cb23eb4757abdc8741d55e0faccf4c0bb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -83,6 +83,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -84,6 +84,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { } // Purpur end @@ -190,7 +190,7 @@ index 22a2328fe5159c8fed635a62334a3f1028c346a5..6cb8d85986f4d891dfbb66b83163ed23 public float getWalkTargetValue(BlockPos pos, LevelReader world) { return world.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : world.getPathfindingCostFromLightLevels(pos); diff --git a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java -index fc74c21d2c506df2134fc4ce61917af65fa89466..a1b7661ae0676007d59d202493efc5a0c795045f 100644 +index 14d94992bc02c0eedab0c83fcffb975ac33d48cb..b94f65a1f83159be0f15eba49df8854686bcc069 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Ocelot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Ocelot.java @@ -93,6 +93,11 @@ public class Ocelot extends Animal { @@ -206,10 +206,10 @@ index fc74c21d2c506df2134fc4ce61917af65fa89466..a1b7661ae0676007d59d202493efc5a0 return (Boolean) this.entityData.get(Ocelot.DATA_TRUSTING); } diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java -index e90fc016fc7e0e9aac2c2d0cf081748100f225f3..4895bd2566605ab3986f35d43345f29ce78e81e0 100644 +index 925bed4503a4023c01d8b9ffd07047831e5e96e5..6ea8ecf8672b71533c9b979a3d46bd947fbc4b73 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -157,6 +157,11 @@ public class Panda extends Animal { +@@ -158,6 +158,11 @@ public class Panda extends Animal { return this.level().purpurConfig.pandaBreedingTicks; } @@ -220,9 +220,9 @@ index e90fc016fc7e0e9aac2c2d0cf081748100f225f3..4895bd2566605ab3986f35d43345f29c + @Override public boolean canTakeItem(ItemStack stack) { - EquipmentSlot enumitemslot = Mob.getEquipmentSlotForItem(stack); + EquipmentSlot enumitemslot = this.getEquipmentSlotForItem(stack); diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index 22b8701accc76d806819433a8511172e13a9ed9e..7b139028ae5c590960e6b8a74b6ba667f3db7f5d 100644 +index d2cdb2d14dc8fe3cf6ffb14668f848e5dd020827..aefb5624409e7c31944d897d52f3a71ea85e1923 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java @@ -196,6 +196,11 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder { +@@ -150,6 +150,11 @@ public class Rabbit extends Animal implements VariantHolder { public int getPurpurBreedTime() { return this.level().purpurConfig.rabbitBreedingTicks; } @@ -318,10 +318,10 @@ index 742805994f29a18af444912b10af631d2c60cacf..e101c3bf425902908c43ffa18867fb83 public int getMaxSchoolSize() { return 5; diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index c3cc949291d11ae707fa5175d666df2ee81cdcce..afec39ba3b51b121fd7ae937e7bac060ef430dfd 100644 +index 7d716efe614902c35ae63b49e159e8d2d8e7d8ea..c7c1ab91d761113d307332491cf5d05e5d5b5bf7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -144,6 +144,11 @@ public class Sheep extends Animal implements Shearable { +@@ -142,6 +142,11 @@ public class Sheep extends Animal implements Shearable { return this.level().purpurConfig.sheepBreedingTicks; } @@ -347,10 +347,10 @@ index cdb6657d30d224709aec3921c5fb8380f8acd93e..9f20eae7449c670b913cc3bbe1a89254 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index f0261117a4f8ae240b3b991053deaf8d6419b5b4..0d05879eadeff8731028d78d89d5d32142818ea2 100644 +index b4cb9fc3f543b70233fe88a31565252eefdb4ce9..7092070b8f540ad34b92ac6d4fc9feaca4bd296d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java -@@ -88,6 +88,11 @@ public class Squid extends WaterAnimal { +@@ -87,6 +87,11 @@ public class Squid extends WaterAnimal { return this.wasTouchingWater || canFly(); } @@ -379,7 +379,7 @@ index 327b1805d9d4069212a8772ff189c9ab24ae1183..4ac998e9d96aed3b0ea0ec3f9dcd5fdd return "entity.minecraft.tropical_fish.predefined." + variant; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index a577ec78b2f5bca0166277c499da4fa7988d5395..b146ac72584d998cee4279133b3b19051fbf14c9 100644 +index 58a390b462ec387f5376559c3d615ed4bcf055ea..6994c78b1a9229124b8d36468cd2beab914780ef 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -114,6 +114,11 @@ public class Turtle extends Animal { @@ -392,13 +392,13 @@ index a577ec78b2f5bca0166277c499da4fa7988d5395..b146ac72584d998cee4279133b3b1905 + } + public void setHomePos(BlockPos pos) { - this.entityData.set(Turtle.HOME_POS, pos.immutable()); // Paper - called with mutablepos... + this.entityData.set(Turtle.HOME_POS, pos); } diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 3b7392852fd8b3c88969b46eeee3aefddde06920..c0a4a6066f7330974971e93a74f9b35d135166e7 100644 +index 5dd146d318851ce581a0d7841bd87ae9767dab6a..5802d5a43c5f2dc569130cc70c4ba519c471abc0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -217,6 +217,11 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder { +@@ -72,6 +72,11 @@ public class Horse extends AbstractHorse implements VariantHolder { return this.level().purpurConfig.horseBreedingTicks; } @@ -475,7 +475,7 @@ index 16d4278d49dad84f72c968ca36914e93d46dc5f6..e623284b353831d1a540af40e139ac16 protected void randomizeAttributes(RandomSource random) { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt)); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 326d94eabe0a469bfebed4517960be0042517249..876b06fd6a371caa6cc71026a3b2f7a111c89dc8 100644 +index b8a6ebd8301c4873060505c866dabb4e8772d5b5..96f1eba4a356e131a8f3c689bedc9eb8821e1a72 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java @@ -146,6 +146,11 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, Level world) { super(type, world); @@ -685,7 +685,7 @@ index de1fe3b115c1b3936b79c8900389542a8c8a2c90..17b044e58d2ed33ed16e60f4fd4f63b2 } // Purpur start -@@ -298,7 +298,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -300,7 +300,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean isSensitiveToWater() { @@ -711,7 +711,7 @@ index 52e2588b32b56b51bdbbdf63a290b2a4a4b02c13..514354bfcd0608554fd515248975fb10 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Evoker.java b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -index ce2e5c16db13accb082b3f2403661c65411c7a80..a3e88c252b39a78a0759623f188dbdc8aa2fcc0b 100644 +index 5ade0be7989ccea459e3c08a0280b6be31f684ce..fac5b13d1428528182d529eacba7ad2d0cee051a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java @@ -74,6 +74,11 @@ public class Evoker extends SpellcasterIllager { @@ -727,7 +727,7 @@ index ce2e5c16db13accb082b3f2403661c65411c7a80..a3e88c252b39a78a0759623f188dbdc8 protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ghast.java b/src/main/java/net/minecraft/world/entity/monster/Ghast.java -index 4bad5bdce2df5f5233465b30bcd3121b1dff0874..96f7c8fb4e49e7640aaa1adb466d67fc887a2dc5 100644 +index 82d8e23e7e0b8f806fe93597c8869518dde0cb36..69a0b774f653b5c95ac63ba08f79174dc2ec648d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java @@ -136,6 +136,11 @@ public class Ghast extends FlyingMob implements Enemy { @@ -759,7 +759,7 @@ index ca53c5b45c119dce1c713dbf931251f89c90cb8d..7ede13f462e2641de63104ba34cdea03 protected void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.giantMaxHealth); diff --git a/src/main/java/net/minecraft/world/entity/monster/Guardian.java b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -index 7fa4e9761c6aad83848bf5e80a213689d728921d..6b0ff4ded5e8b62572d5889f0be5e3148243ed7d 100644 +index af33e2b099ba1b41c0ac62d5504b130b6aa3e41b..286ff759957ea56e0055cb25c71bce36cb348934 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java @@ -95,6 +95,11 @@ public class Guardian extends Monster { @@ -791,10 +791,10 @@ index 6673c0bff3a4e3d11a09e9dc8aeb0c2418dc7f59..cb96bd5769159e6c25968673ea07cd6d return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (MobSpawnType.isSpawner(spawnReason) || world.canSeeSky(pos)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -index c680e1efb73a6387aad6ecdab94f690c12451a32..e2393be574475377fd401d55ab0be9b483e705e6 100644 +index 060f82c4be49db618871dca29db7fd959a6ada0b..b659075fb4678c46e6ae29dddc19875471ff9a73 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -80,6 +80,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -81,6 +81,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.illusionerMaxHealth); } @@ -807,7 +807,7 @@ index c680e1efb73a6387aad6ecdab94f690c12451a32..e2393be574475377fd401d55ab0be9b4 protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java -index 61cd97bc17802d3ab30999fc1f2b91e8b00652b2..adacdbf9fac7d1504be73e2e5a7526e8258a126d 100644 +index 7769faef7606afca7de8a11fd82a7c3cc61f0b32..f81c09aa7673703e97ac4c39caaf25fac05e3de8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java +++ b/src/main/java/net/minecraft/world/entity/monster/MagmaCube.java @@ -66,6 +66,11 @@ public class MagmaCube extends Slime { @@ -823,7 +823,7 @@ index 61cd97bc17802d3ab30999fc1f2b91e8b00652b2..adacdbf9fac7d1504be73e2e5a7526e8 return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index c15d75472d4d92baeb87a147832e17e363c360be..c52d40eb33a16e428c016a902faeb62aea0fd727 100644 +index 88725e6f8c6490253e110485f5a62e9d3d2c9aa9..554e01cf4fb3b15549c8c381274014c4735e08c6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -136,6 +136,11 @@ public class Phantom extends FlyingMob implements Enemy { @@ -839,10 +839,10 @@ index c15d75472d4d92baeb87a147832e17e363c360be..c52d40eb33a16e428c016a902faeb62a public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % Phantom.TICKS_PER_FLAP == 0; diff --git a/src/main/java/net/minecraft/world/entity/monster/Pillager.java b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -index 8c06e648df453fdd4eea0aa4843fada9b6375f81..a405764724d7f4b586d8510450a6258417495942 100644 +index 6dd51e6a3542436f5adb0e32b367517132261459..50416e3c3d9a89b5d78e3b7df21b5c99b1babd28 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -80,6 +80,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve +@@ -84,6 +84,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pillagerMaxHealth); } @@ -855,10 +855,10 @@ index 8c06e648df453fdd4eea0aa4843fada9b6375f81..a405764724d7f4b586d8510450a62584 protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index cebe89b0868043b819fb3e9987f899926961be52..e592b5ee3a0bfce987557defed8250682373fe65 100644 +index 86704fcba15cec26eef3f77167aee9116ba27980..796dfcf5e3ee27dda08eb1e05aa5e51bdedee1a6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -96,6 +96,11 @@ public class Ravager extends Raider { +@@ -97,6 +97,11 @@ public class Ravager extends Raider { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ravagerMaxHealth); } @@ -871,7 +871,7 @@ index cebe89b0868043b819fb3e9987f899926961be52..e592b5ee3a0bfce987557defed825068 protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index 277ec293cfd8f50e9e8ce6a0380a007d7ef786a1..836cd735f343312c020f6498e078cf3bf420d3cb 100644 +index 123f8418544468d5c8d0d280f7dd44ebd25339d7..ff6a91caa9bd7fa90d71a2014354c67570d4fccb 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -119,6 +119,11 @@ public class Shulker extends AbstractGolem implements VariantHolder(this, AbstractPiglin.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 698076b0e958aadf9736d7753df64a73dd3c17cd..76d47ba17dd140572a0be40dfda18c24851198bb 100644 +index 4bdbcb59051cc4bbc44aca2f70318275d4267b14..5027fc69d6a32474a6bfa1fd2b567996647ec172 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -@@ -102,6 +102,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { +@@ -101,6 +101,11 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zoglinMaxHealth); } @@ -1071,10 +1071,10 @@ index 698076b0e958aadf9736d7753df64a73dd3c17cd..76d47ba17dd140572a0be40dfda18c24 protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 3d42b2ea26217243dba96174ff0eadbcdd81a6cd..de7a74f1e5181373da8dcc639245f35f77f4f09b 100644 +index b39d8ee4c6e9483a15991be3b1440384708aee65..1c2291c8a20541cc1e306efdd5263e5d8b3e0b16 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -138,6 +138,11 @@ public class Zombie extends Monster { +@@ -142,6 +142,11 @@ public class Zombie extends Monster { return level().purpurConfig.zombieJockeyTryExistingChickens; } @@ -1087,10 +1087,10 @@ index 3d42b2ea26217243dba96174ff0eadbcdd81a6cd..de7a74f1e5181373da8dcc639245f35f protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -index ffe2144e307acebd4a8bed043db0ee0bb6bf611c..2ec3a09135f85a5de68e77511f3f213adf08712c 100644 +index cdf6753b6bb2bbb4f3ab21792bd3153988b26b75..3c4cff3f095cdf2dd74df7bf4bb8f3d5600b342d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -107,6 +107,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -110,6 +110,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieVillagerSpawnReinforcements); } @@ -1103,10 +1103,10 @@ index ffe2144e307acebd4a8bed043db0ee0bb6bf611c..2ec3a09135f85a5de68e77511f3f213a public boolean jockeyOnlyBaby() { return level().purpurConfig.zombieVillagerJockeyOnlyBaby; diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 6be751e2d434982a35bbbece4f4fc4631fb3d8e0..bd2953448e568b1a20bcc6a889cef83b88418548 100644 +index 47419219d4f435a17344361f4a60d5aab925d574..baa2bedb4c7f2c05df333ac1ff9222b5c6674a10 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -84,6 +84,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -85,6 +85,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombifiedPiglinMaxHealth); } @@ -1119,7 +1119,7 @@ index 6be751e2d434982a35bbbece4f4fc4631fb3d8e0..bd2953448e568b1a20bcc6a889cef83b public boolean jockeyOnlyBaby() { return level().purpurConfig.zombifiedPiglinJockeyOnlyBaby; diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index a770ae0e13c4dad296dfb8f33259408ee1531c70..9ca294d5177ec7d541433d644d2fb90d937b011c 100644 +index d43e26af79be5078124d8013167f452bb46a9a4d..26af55acfdeee25f64295f50eec9a0ea0b76c58d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -117,6 +117,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -1132,13 +1132,13 @@ index a770ae0e13c4dad296dfb8f33259408ee1531c70..9ca294d5177ec7d541433d644d2fb90d + } + @Override - public boolean canBeLeashed(Player player) { - return !this.isLeashed(); + public boolean canBeLeashed() { + return true; diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 57089ba787731ddda853dce959ba015abe135bfd..e5b24bd8e31ca5748185181bb6741760c86a92a1 100644 +index d54f8041b55f8b8d72dc4fda78ae456671f779d4..c397ff495930ee1b7f6479ea060c116e92e03801 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -116,6 +116,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -115,6 +115,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.piglinMaxHealth); } @@ -1167,11 +1167,11 @@ index 362f3fddd8090799278f4b4e58c5af5de00315f2..6c7e0f177382cb6329002dcde270f6ce return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0).add(Attributes.MOVEMENT_SPEED, 0.35F).add(Attributes.ATTACK_DAMAGE, 7.0); } diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index f7d8f672a680cf2dfebba5677f97895e4a8c209f..c9cfbc8817fe62e22cb165f856ed8569668c0a60 100644 +index ba2e1ea184bf31efdf30050fdcc3a5f193d2f096..80f6a5a6553d752857ccd53815a9341c5e7502e8 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -189,6 +189,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - return level().purpurConfig.villagerCanBeLeashed && !this.isLeashed(); +@@ -184,6 +184,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.villagerMaxHealth); } + @Override @@ -1183,11 +1183,11 @@ index f7d8f672a680cf2dfebba5677f97895e4a8c209f..c9cfbc8817fe62e22cb165f856ed8569 public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -index 9d5eaaf1869a3ecb61947ab0c09af558fa1cd283..c192f4cc5fd9cb0cf40083c4297f649ab909649d 100644 +index 6990d6dc306b1d25544793b365fd6f7be8a37201..5951e0f583b5ab8a5b13dca6d8fcb537be4be73f 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -98,6 +98,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - return level().purpurConfig.wanderingTraderCanBeLeashed && !this.isLeashed(); +@@ -93,6 +93,11 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill + this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.wanderingTraderMaxHealth); } + @Override @@ -1199,10 +1199,10 @@ index 9d5eaaf1869a3ecb61947ab0c09af558fa1cd283..c192f4cc5fd9cb0cf40083c4297f649a 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 a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be506bfe6626 100644 +index 24b90abc3171c824008af0a8e49b7963a9636493..409cd7ab15931b378a39993e906a7cc92eb1273e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -582,11 +582,13 @@ public class PurpurWorldConfig { +@@ -565,11 +565,13 @@ public class PurpurWorldConfig { public boolean axolotlControllable = true; public double axolotlMaxHealth = 14.0D; public int axolotlBreedingTicks = 6000; @@ -1216,7 +1216,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean batRidable = false; -@@ -601,6 +603,7 @@ public class PurpurWorldConfig { +@@ -584,6 +586,7 @@ public class PurpurWorldConfig { public double batArmor = 0.0D; public double batArmorToughness = 0.0D; public double batAttackKnockback = 0.0D; @@ -1224,7 +1224,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void batSettings() { batRidable = getBoolean("mobs.bat.ridable", batRidable); batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); -@@ -619,6 +622,7 @@ public class PurpurWorldConfig { +@@ -602,6 +605,7 @@ public class PurpurWorldConfig { batArmor = getDouble("mobs.bat.attributes.armor", batArmor); batArmorToughness = getDouble("mobs.bat.attributes.armor_toughness", batArmorToughness); batAttackKnockback = getDouble("mobs.bat.attributes.attack_knockback", batAttackKnockback); @@ -1232,7 +1232,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean beeRidable = false; -@@ -627,6 +631,7 @@ public class PurpurWorldConfig { +@@ -610,6 +614,7 @@ public class PurpurWorldConfig { public double beeMaxY = 320D; public double beeMaxHealth = 10.0D; public int beeBreedingTicks = 6000; @@ -1240,7 +1240,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void beeSettings() { beeRidable = getBoolean("mobs.bee.ridable", beeRidable); beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); -@@ -639,6 +644,7 @@ public class PurpurWorldConfig { +@@ -622,6 +627,7 @@ public class PurpurWorldConfig { } beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); @@ -1248,7 +1248,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean blazeRidable = false; -@@ -646,6 +652,7 @@ public class PurpurWorldConfig { +@@ -629,6 +635,7 @@ public class PurpurWorldConfig { public boolean blazeControllable = true; public double blazeMaxY = 320D; public double blazeMaxHealth = 20.0D; @@ -1256,7 +1256,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void blazeSettings() { blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); -@@ -657,6 +664,7 @@ public class PurpurWorldConfig { +@@ -640,6 +647,7 @@ public class PurpurWorldConfig { set("mobs.blaze.attributes.max_health", oldValue); } blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); @@ -1264,7 +1264,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean boggedRidable = false; -@@ -698,6 +706,7 @@ public class PurpurWorldConfig { +@@ -681,6 +689,7 @@ public class PurpurWorldConfig { public int catSpawnVillageScanRange = 48; public int catBreedingTicks = 6000; public DyeColor catDefaultCollarColor = DyeColor.RED; @@ -1272,7 +1272,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -717,12 +726,14 @@ public class PurpurWorldConfig { +@@ -700,12 +709,14 @@ public class PurpurWorldConfig { } catch (IllegalArgumentException ignore) { catDefaultCollarColor = DyeColor.RED; } @@ -1287,7 +1287,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void caveSpiderSettings() { caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); -@@ -733,6 +744,7 @@ public class PurpurWorldConfig { +@@ -716,6 +727,7 @@ public class PurpurWorldConfig { set("mobs.cave_spider.attributes.max_health", oldValue); } caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); @@ -1295,7 +1295,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean chickenRidable = false; -@@ -741,6 +753,7 @@ public class PurpurWorldConfig { +@@ -724,6 +736,7 @@ public class PurpurWorldConfig { public double chickenMaxHealth = 4.0D; public boolean chickenRetaliate = false; public int chickenBreedingTicks = 6000; @@ -1303,7 +1303,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -753,11 +766,13 @@ public class PurpurWorldConfig { +@@ -736,11 +749,13 @@ public class PurpurWorldConfig { chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); @@ -1317,7 +1317,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void codSettings() { codRidable = getBoolean("mobs.cod.ridable", codRidable); codControllable = getBoolean("mobs.cod.controllable", codControllable); -@@ -767,6 +782,7 @@ public class PurpurWorldConfig { +@@ -750,6 +765,7 @@ public class PurpurWorldConfig { set("mobs.cod.attributes.max_health", oldValue); } codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); @@ -1325,7 +1325,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean cowRidable = false; -@@ -775,6 +791,7 @@ public class PurpurWorldConfig { +@@ -758,6 +774,7 @@ public class PurpurWorldConfig { public double cowMaxHealth = 10.0D; public int cowFeedMushrooms = 0; public int cowBreedingTicks = 6000; @@ -1333,7 +1333,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void cowSettings() { cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); -@@ -787,6 +804,7 @@ public class PurpurWorldConfig { +@@ -770,6 +787,7 @@ public class PurpurWorldConfig { cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); @@ -1341,7 +1341,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean creeperRidable = false; -@@ -796,6 +814,7 @@ public class PurpurWorldConfig { +@@ -779,6 +797,7 @@ public class PurpurWorldConfig { public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; public boolean creeperBypassMobGriefing = false; @@ -1349,7 +1349,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -809,6 +828,7 @@ public class PurpurWorldConfig { +@@ -792,6 +811,7 @@ public class PurpurWorldConfig { creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); @@ -1357,7 +1357,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean dolphinRidable = false; -@@ -818,6 +838,7 @@ public class PurpurWorldConfig { +@@ -801,6 +821,7 @@ public class PurpurWorldConfig { public float dolphinSpitDamage = 2.0F; public double dolphinMaxHealth = 10.0D; public boolean dolphinDisableTreasureSearching = false; @@ -1365,7 +1365,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); -@@ -831,6 +852,7 @@ public class PurpurWorldConfig { +@@ -814,6 +835,7 @@ public class PurpurWorldConfig { } dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); @@ -1373,7 +1373,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean donkeyRidableInWater = false; -@@ -841,6 +863,7 @@ public class PurpurWorldConfig { +@@ -824,6 +846,7 @@ public class PurpurWorldConfig { public double donkeyMovementSpeedMin = 0.175D; public double donkeyMovementSpeedMax = 0.175D; public int donkeyBreedingTicks = 6000; @@ -1381,7 +1381,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void donkeySettings() { donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { -@@ -857,6 +880,7 @@ public class PurpurWorldConfig { +@@ -840,6 +863,7 @@ public class PurpurWorldConfig { donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); @@ -1389,7 +1389,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean drownedRidable = false; -@@ -867,6 +891,7 @@ public class PurpurWorldConfig { +@@ -850,6 +874,7 @@ public class PurpurWorldConfig { public boolean drownedJockeyOnlyBaby = true; public double drownedJockeyChance = 0.05D; public boolean drownedJockeyTryExistingChickens = true; @@ -1397,7 +1397,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -881,11 +906,13 @@ public class PurpurWorldConfig { +@@ -864,11 +889,13 @@ public class PurpurWorldConfig { drownedJockeyOnlyBaby = getBoolean("mobs.drowned.jockey.only-babies", drownedJockeyOnlyBaby); drownedJockeyChance = getDouble("mobs.drowned.jockey.chance", drownedJockeyChance); drownedJockeyTryExistingChickens = getBoolean("mobs.drowned.jockey.try-existing-chickens", drownedJockeyTryExistingChickens); @@ -1411,7 +1411,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void elderGuardianSettings() { elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); -@@ -895,6 +922,7 @@ public class PurpurWorldConfig { +@@ -878,6 +905,7 @@ public class PurpurWorldConfig { set("mobs.elder_guardian.attributes.max_health", oldValue); } elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); @@ -1419,7 +1419,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean enderDragonRidable = false; -@@ -904,6 +932,7 @@ public class PurpurWorldConfig { +@@ -887,6 +915,7 @@ public class PurpurWorldConfig { public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; public boolean enderDragonBypassMobGriefing = false; @@ -1427,7 +1427,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -921,6 +950,7 @@ public class PurpurWorldConfig { +@@ -904,6 +933,7 @@ public class PurpurWorldConfig { enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth); enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp); enderDragonBypassMobGriefing = getBoolean("mobs.ender_dragon.bypass-mob-griefing", enderDragonBypassMobGriefing); @@ -1435,7 +1435,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean endermanRidable = false; -@@ -930,6 +960,7 @@ public class PurpurWorldConfig { +@@ -913,6 +943,7 @@ public class PurpurWorldConfig { public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; @@ -1443,7 +1443,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -943,12 +974,14 @@ public class PurpurWorldConfig { +@@ -926,12 +957,14 @@ public class PurpurWorldConfig { endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); endermanBypassMobGriefing = getBoolean("mobs.enderman.bypass-mob-griefing", endermanBypassMobGriefing); @@ -1458,7 +1458,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void endermiteSettings() { endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); -@@ -959,6 +992,7 @@ public class PurpurWorldConfig { +@@ -942,6 +975,7 @@ public class PurpurWorldConfig { set("mobs.endermite.attributes.max_health", oldValue); } endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); @@ -1466,7 +1466,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean evokerRidable = false; -@@ -966,6 +1000,7 @@ public class PurpurWorldConfig { +@@ -949,6 +983,7 @@ public class PurpurWorldConfig { public boolean evokerControllable = true; public double evokerMaxHealth = 24.0D; public boolean evokerBypassMobGriefing = false; @@ -1474,7 +1474,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -977,6 +1012,7 @@ public class PurpurWorldConfig { +@@ -960,6 +995,7 @@ public class PurpurWorldConfig { } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); @@ -1482,7 +1482,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean foxRidable = false; -@@ -986,6 +1022,7 @@ public class PurpurWorldConfig { +@@ -969,6 +1005,7 @@ public class PurpurWorldConfig { public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; public boolean foxBypassMobGriefing = false; @@ -1490,7 +1490,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -999,6 +1036,7 @@ public class PurpurWorldConfig { +@@ -982,6 +1019,7 @@ public class PurpurWorldConfig { foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); @@ -1498,7 +1498,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean frogRidable = false; -@@ -1019,6 +1057,7 @@ public class PurpurWorldConfig { +@@ -1002,6 +1040,7 @@ public class PurpurWorldConfig { public boolean ghastControllable = true; public double ghastMaxY = 320D; public double ghastMaxHealth = 10.0D; @@ -1506,7 +1506,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void ghastSettings() { ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); -@@ -1030,6 +1069,7 @@ public class PurpurWorldConfig { +@@ -1013,6 +1052,7 @@ public class PurpurWorldConfig { set("mobs.ghast.attributes.max_health", oldValue); } ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); @@ -1514,7 +1514,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean giantRidable = false; -@@ -1042,6 +1082,7 @@ public class PurpurWorldConfig { +@@ -1025,6 +1065,7 @@ public class PurpurWorldConfig { public float giantJumpHeight = 1.0F; public boolean giantHaveAI = false; public boolean giantHaveHostileAI = false; @@ -1522,7 +1522,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void giantSettings() { giantRidable = getBoolean("mobs.giant.ridable", giantRidable); giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); -@@ -1062,17 +1103,20 @@ public class PurpurWorldConfig { +@@ -1045,17 +1086,20 @@ public class PurpurWorldConfig { giantJumpHeight = (float) getDouble("mobs.giant.jump-height", giantJumpHeight); giantHaveAI = getBoolean("mobs.giant.have-ai", giantHaveAI); giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI); @@ -1543,7 +1543,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean goatRidable = false; -@@ -1080,17 +1124,20 @@ public class PurpurWorldConfig { +@@ -1063,17 +1107,20 @@ public class PurpurWorldConfig { public boolean goatControllable = true; public double goatMaxHealth = 10.0D; public int goatBreedingTicks = 6000; @@ -1564,7 +1564,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void guardianSettings() { guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); -@@ -1100,6 +1147,7 @@ public class PurpurWorldConfig { +@@ -1083,6 +1130,7 @@ public class PurpurWorldConfig { set("mobs.guardian.attributes.max_health", oldValue); } guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); @@ -1572,7 +1572,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean hoglinRidable = false; -@@ -1107,6 +1155,7 @@ public class PurpurWorldConfig { +@@ -1090,6 +1138,7 @@ public class PurpurWorldConfig { public boolean hoglinControllable = true; public double hoglinMaxHealth = 40.0D; public int hoglinBreedingTicks = 6000; @@ -1580,7 +1580,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -1118,6 +1167,7 @@ public class PurpurWorldConfig { +@@ -1101,6 +1150,7 @@ public class PurpurWorldConfig { } hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); @@ -1588,7 +1588,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean horseRidableInWater = false; -@@ -1128,6 +1178,7 @@ public class PurpurWorldConfig { +@@ -1111,6 +1161,7 @@ public class PurpurWorldConfig { public double horseMovementSpeedMin = 0.1125D; public double horseMovementSpeedMax = 0.3375D; public int horseBreedingTicks = 6000; @@ -1596,7 +1596,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -1144,6 +1195,7 @@ public class PurpurWorldConfig { +@@ -1127,6 +1178,7 @@ public class PurpurWorldConfig { horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); @@ -1604,7 +1604,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean huskRidable = false; -@@ -1154,6 +1206,7 @@ public class PurpurWorldConfig { +@@ -1137,6 +1189,7 @@ public class PurpurWorldConfig { public boolean huskJockeyOnlyBaby = true; public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; @@ -1612,7 +1612,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1168,6 +1221,7 @@ public class PurpurWorldConfig { +@@ -1151,6 +1204,7 @@ public class PurpurWorldConfig { huskJockeyOnlyBaby = getBoolean("mobs.husk.jockey.only-babies", huskJockeyOnlyBaby); huskJockeyChance = getDouble("mobs.husk.jockey.chance", huskJockeyChance); huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); @@ -1620,7 +1620,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean illusionerRidable = false; -@@ -1176,6 +1230,7 @@ public class PurpurWorldConfig { +@@ -1159,6 +1213,7 @@ public class PurpurWorldConfig { public double illusionerMovementSpeed = 0.5D; public double illusionerFollowRange = 18.0D; public double illusionerMaxHealth = 32.0D; @@ -1628,7 +1628,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void illusionerSettings() { illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); -@@ -1192,6 +1247,7 @@ public class PurpurWorldConfig { +@@ -1175,6 +1230,7 @@ public class PurpurWorldConfig { set("mobs.illusioner.attributes.max_health", oldValue); } illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); @@ -1636,7 +1636,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean ironGolemRidable = false; -@@ -1199,6 +1255,7 @@ public class PurpurWorldConfig { +@@ -1182,6 +1238,7 @@ public class PurpurWorldConfig { public boolean ironGolemControllable = true; public boolean ironGolemCanSwim = false; public double ironGolemMaxHealth = 100.0D; @@ -1644,7 +1644,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); -@@ -1210,6 +1267,7 @@ public class PurpurWorldConfig { +@@ -1193,6 +1250,7 @@ public class PurpurWorldConfig { set("mobs.iron_golem.attributes.max_health", oldValue); } ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); @@ -1652,7 +1652,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean llamaRidable = false; -@@ -1222,6 +1280,7 @@ public class PurpurWorldConfig { +@@ -1205,6 +1263,7 @@ public class PurpurWorldConfig { public double llamaMovementSpeedMin = 0.175D; public double llamaMovementSpeedMax = 0.175D; public int llamaBreedingTicks = 6000; @@ -1660,7 +1660,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1240,6 +1299,7 @@ public class PurpurWorldConfig { +@@ -1223,6 +1282,7 @@ public class PurpurWorldConfig { llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); @@ -1668,7 +1668,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean magmaCubeRidable = false; -@@ -1249,6 +1309,7 @@ public class PurpurWorldConfig { +@@ -1232,6 +1292,7 @@ public class PurpurWorldConfig { public String magmaCubeAttackDamage = "size"; public Map magmaCubeMaxHealthCache = new HashMap<>(); public Map magmaCubeAttackDamageCache = new HashMap<>(); @@ -1676,7 +1676,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void magmaCubeSettings() { magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); -@@ -1262,6 +1323,7 @@ public class PurpurWorldConfig { +@@ -1245,6 +1306,7 @@ public class PurpurWorldConfig { magmaCubeAttackDamage = getString("mobs.magma_cube.attributes.attack_damage", magmaCubeAttackDamage); magmaCubeMaxHealthCache.clear(); magmaCubeAttackDamageCache.clear(); @@ -1684,7 +1684,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean mooshroomRidable = false; -@@ -1269,6 +1331,7 @@ public class PurpurWorldConfig { +@@ -1252,6 +1314,7 @@ public class PurpurWorldConfig { public boolean mooshroomControllable = true; public double mooshroomMaxHealth = 10.0D; public int mooshroomBreedingTicks = 6000; @@ -1692,7 +1692,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1280,6 +1343,7 @@ public class PurpurWorldConfig { +@@ -1263,6 +1326,7 @@ public class PurpurWorldConfig { } mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); @@ -1700,7 +1700,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean muleRidableInWater = false; -@@ -1290,6 +1354,7 @@ public class PurpurWorldConfig { +@@ -1273,6 +1337,7 @@ public class PurpurWorldConfig { public double muleMovementSpeedMin = 0.175D; public double muleMovementSpeedMax = 0.175D; public int muleBreedingTicks = 6000; @@ -1708,7 +1708,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void muleSettings() { muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { -@@ -1306,6 +1371,7 @@ public class PurpurWorldConfig { +@@ -1289,6 +1354,7 @@ public class PurpurWorldConfig { muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); @@ -1716,7 +1716,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean ocelotRidable = false; -@@ -1313,6 +1379,7 @@ public class PurpurWorldConfig { +@@ -1296,6 +1362,7 @@ public class PurpurWorldConfig { public boolean ocelotControllable = true; public double ocelotMaxHealth = 10.0D; public int ocelotBreedingTicks = 6000; @@ -1724,7 +1724,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -1324,6 +1391,7 @@ public class PurpurWorldConfig { +@@ -1307,6 +1374,7 @@ public class PurpurWorldConfig { } ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); @@ -1732,7 +1732,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean pandaRidable = false; -@@ -1331,6 +1399,7 @@ public class PurpurWorldConfig { +@@ -1314,6 +1382,7 @@ public class PurpurWorldConfig { public boolean pandaControllable = true; public double pandaMaxHealth = 20.0D; public int pandaBreedingTicks = 6000; @@ -1740,7 +1740,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -1342,6 +1411,7 @@ public class PurpurWorldConfig { +@@ -1325,6 +1394,7 @@ public class PurpurWorldConfig { } pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); @@ -1748,7 +1748,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean parrotRidable = false; -@@ -1349,6 +1419,7 @@ public class PurpurWorldConfig { +@@ -1332,6 +1402,7 @@ public class PurpurWorldConfig { public boolean parrotControllable = true; public double parrotMaxY = 320D; public double parrotMaxHealth = 6.0D; @@ -1756,7 +1756,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void parrotSettings() { parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); -@@ -1360,6 +1431,7 @@ public class PurpurWorldConfig { +@@ -1343,6 +1414,7 @@ public class PurpurWorldConfig { set("mobs.parrot.attributes.max_health", oldValue); } parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); @@ -1764,7 +1764,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean phantomRidable = false; -@@ -1386,6 +1458,7 @@ public class PurpurWorldConfig { +@@ -1369,6 +1441,7 @@ public class PurpurWorldConfig { public boolean phantomIgnorePlayersWithTorch = false; public boolean phantomBurnInDaylight = true; public boolean phantomFlamesOnSwoop = false; @@ -1772,7 +1772,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1420,6 +1493,7 @@ public class PurpurWorldConfig { +@@ -1403,6 +1476,7 @@ public class PurpurWorldConfig { phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight); phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); @@ -1780,7 +1780,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean pigRidable = false; -@@ -1428,6 +1502,7 @@ public class PurpurWorldConfig { +@@ -1411,6 +1485,7 @@ public class PurpurWorldConfig { public double pigMaxHealth = 10.0D; public boolean pigGiveSaddleBack = false; public int pigBreedingTicks = 6000; @@ -1788,7 +1788,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -1440,6 +1515,7 @@ public class PurpurWorldConfig { +@@ -1423,6 +1498,7 @@ public class PurpurWorldConfig { pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); @@ -1796,7 +1796,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean piglinRidable = false; -@@ -1447,6 +1523,7 @@ public class PurpurWorldConfig { +@@ -1430,6 +1506,7 @@ public class PurpurWorldConfig { public boolean piglinControllable = true; public double piglinMaxHealth = 16.0D; public boolean piglinBypassMobGriefing = false; @@ -1804,7 +1804,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1458,12 +1535,14 @@ public class PurpurWorldConfig { +@@ -1441,12 +1518,14 @@ public class PurpurWorldConfig { } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); @@ -1819,7 +1819,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void piglinBruteSettings() { piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); -@@ -1474,6 +1553,7 @@ public class PurpurWorldConfig { +@@ -1457,6 +1536,7 @@ public class PurpurWorldConfig { set("mobs.piglin_brute.attributes.max_health", oldValue); } piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); @@ -1827,7 +1827,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean pillagerRidable = false; -@@ -1481,6 +1561,7 @@ public class PurpurWorldConfig { +@@ -1464,6 +1544,7 @@ public class PurpurWorldConfig { public boolean pillagerControllable = true; public double pillagerMaxHealth = 24.0D; public boolean pillagerBypassMobGriefing = false; @@ -1835,7 +1835,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1492,6 +1573,7 @@ public class PurpurWorldConfig { +@@ -1475,6 +1556,7 @@ public class PurpurWorldConfig { } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); @@ -1843,7 +1843,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean polarBearRidable = false; -@@ -1501,6 +1583,7 @@ public class PurpurWorldConfig { +@@ -1484,6 +1566,7 @@ public class PurpurWorldConfig { public String polarBearBreedableItemString = ""; public Item polarBearBreedableItem = null; public int polarBearBreedingTicks = 6000; @@ -1851,7 +1851,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -1515,11 +1598,13 @@ public class PurpurWorldConfig { +@@ -1498,11 +1581,13 @@ public class PurpurWorldConfig { Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); if (item != Items.AIR) polarBearBreedableItem = item; polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); @@ -1865,7 +1865,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void pufferfishSettings() { pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); -@@ -1529,6 +1614,7 @@ public class PurpurWorldConfig { +@@ -1512,6 +1597,7 @@ public class PurpurWorldConfig { set("mobs.pufferfish.attributes.max_health", oldValue); } pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); @@ -1873,7 +1873,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean rabbitRidable = false; -@@ -1539,6 +1625,7 @@ public class PurpurWorldConfig { +@@ -1522,6 +1608,7 @@ public class PurpurWorldConfig { public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; public boolean rabbitBypassMobGriefing = false; @@ -1881,7 +1881,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1553,6 +1640,7 @@ public class PurpurWorldConfig { +@@ -1536,6 +1623,7 @@ public class PurpurWorldConfig { rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); rabbitBypassMobGriefing = getBoolean("mobs.rabbit.bypass-mob-griefing", rabbitBypassMobGriefing); @@ -1889,7 +1889,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean ravagerRidable = false; -@@ -1560,6 +1648,7 @@ public class PurpurWorldConfig { +@@ -1543,6 +1631,7 @@ public class PurpurWorldConfig { public boolean ravagerControllable = true; public double ravagerMaxHealth = 100.0D; public boolean ravagerBypassMobGriefing = false; @@ -1897,7 +1897,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1571,11 +1660,13 @@ public class PurpurWorldConfig { +@@ -1554,11 +1643,13 @@ public class PurpurWorldConfig { } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); @@ -1911,7 +1911,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void salmonSettings() { salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); -@@ -1585,6 +1676,7 @@ public class PurpurWorldConfig { +@@ -1568,6 +1659,7 @@ public class PurpurWorldConfig { set("mobs.salmon.attributes.max_health", oldValue); } salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); @@ -1919,7 +1919,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean sheepRidable = false; -@@ -1593,6 +1685,7 @@ public class PurpurWorldConfig { +@@ -1576,6 +1668,7 @@ public class PurpurWorldConfig { public double sheepMaxHealth = 8.0D; public int sheepBreedingTicks = 6000; public boolean sheepBypassMobGriefing = false; @@ -1927,7 +1927,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1605,12 +1698,14 @@ public class PurpurWorldConfig { +@@ -1588,12 +1681,14 @@ public class PurpurWorldConfig { sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); @@ -1942,7 +1942,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -1621,6 +1716,7 @@ public class PurpurWorldConfig { +@@ -1604,6 +1699,7 @@ public class PurpurWorldConfig { set("mobs.shulker.attributes.max_health", oldValue); } shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); @@ -1950,7 +1950,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean silverfishRidable = false; -@@ -1628,6 +1724,7 @@ public class PurpurWorldConfig { +@@ -1611,6 +1707,7 @@ public class PurpurWorldConfig { public boolean silverfishControllable = true; public double silverfishMaxHealth = 8.0D; public boolean silverfishBypassMobGriefing = false; @@ -1958,7 +1958,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -1639,12 +1736,14 @@ public class PurpurWorldConfig { +@@ -1622,12 +1719,14 @@ public class PurpurWorldConfig { } silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); @@ -1973,7 +1973,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -1655,6 +1754,7 @@ public class PurpurWorldConfig { +@@ -1638,6 +1737,7 @@ public class PurpurWorldConfig { set("mobs.skeleton.attributes.max_health", oldValue); } skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); @@ -1981,7 +1981,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean skeletonHorseRidable = false; -@@ -1666,6 +1766,7 @@ public class PurpurWorldConfig { +@@ -1649,6 +1749,7 @@ public class PurpurWorldConfig { public double skeletonHorseJumpStrengthMax = 1.0D; public double skeletonHorseMovementSpeedMin = 0.2D; public double skeletonHorseMovementSpeedMax = 0.2D; @@ -1989,7 +1989,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void skeletonHorseSettings() { skeletonHorseRidable = getBoolean("mobs.skeleton_horse.ridable", skeletonHorseRidable); skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); -@@ -1682,6 +1783,7 @@ public class PurpurWorldConfig { +@@ -1665,6 +1766,7 @@ public class PurpurWorldConfig { skeletonHorseJumpStrengthMax = getDouble("mobs.skeleton_horse.attributes.jump_strength.max", skeletonHorseJumpStrengthMax); skeletonHorseMovementSpeedMin = getDouble("mobs.skeleton_horse.attributes.movement_speed.min", skeletonHorseMovementSpeedMin); skeletonHorseMovementSpeedMax = getDouble("mobs.skeleton_horse.attributes.movement_speed.max", skeletonHorseMovementSpeedMax); @@ -1997,7 +1997,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean slimeRidable = false; -@@ -1691,6 +1793,7 @@ public class PurpurWorldConfig { +@@ -1674,6 +1776,7 @@ public class PurpurWorldConfig { public String slimeAttackDamage = "size"; public Map slimeMaxHealthCache = new HashMap<>(); public Map slimeAttackDamageCache = new HashMap<>(); @@ -2005,7 +2005,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void slimeSettings() { slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); -@@ -1704,6 +1807,7 @@ public class PurpurWorldConfig { +@@ -1687,6 +1790,7 @@ public class PurpurWorldConfig { slimeAttackDamage = getString("mobs.slime.attributes.attack_damage", slimeAttackDamage); slimeMaxHealthCache.clear(); slimeAttackDamageCache.clear(); @@ -2013,7 +2013,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean snowGolemRidable = false; -@@ -1717,6 +1821,7 @@ public class PurpurWorldConfig { +@@ -1700,6 +1804,7 @@ public class PurpurWorldConfig { public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; public boolean snowGolemBypassMobGriefing = false; @@ -2021,7 +2021,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1734,6 +1839,7 @@ public class PurpurWorldConfig { +@@ -1717,6 +1822,7 @@ public class PurpurWorldConfig { snowGolemSnowBallModifier = (float) getDouble("mobs.snow_golem.snow-ball-modifier", snowGolemSnowBallModifier); snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); snowGolemBypassMobGriefing = getBoolean("mobs.snow_golem.bypass-mob-griefing", snowGolemBypassMobGriefing); @@ -2029,7 +2029,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean snifferRidable = false; -@@ -1755,6 +1861,7 @@ public class PurpurWorldConfig { +@@ -1738,6 +1844,7 @@ public class PurpurWorldConfig { public boolean squidImmuneToEAR = true; public double squidOffsetWaterCheck = 0.0D; public boolean squidsCanFly = false; @@ -2037,7 +2037,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); squidControllable = getBoolean("mobs.squid.controllable", squidControllable); -@@ -1767,12 +1874,14 @@ public class PurpurWorldConfig { +@@ -1750,12 +1857,14 @@ public class PurpurWorldConfig { squidImmuneToEAR = getBoolean("mobs.squid.immune-to-EAR", squidImmuneToEAR); squidOffsetWaterCheck = getDouble("mobs.squid.water-offset-check", squidOffsetWaterCheck); squidsCanFly = getBoolean("mobs.squid.can-fly", squidsCanFly); @@ -2052,7 +2052,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void spiderSettings() { spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); -@@ -1783,12 +1892,14 @@ public class PurpurWorldConfig { +@@ -1766,12 +1875,14 @@ public class PurpurWorldConfig { set("mobs.spider.attributes.max_health", oldValue); } spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); @@ -2067,7 +2067,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void straySettings() { strayRidable = getBoolean("mobs.stray.ridable", strayRidable); strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); -@@ -1799,6 +1910,7 @@ public class PurpurWorldConfig { +@@ -1782,6 +1893,7 @@ public class PurpurWorldConfig { set("mobs.stray.attributes.max_health", oldValue); } strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); @@ -2075,7 +2075,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean striderRidable = false; -@@ -1807,6 +1919,7 @@ public class PurpurWorldConfig { +@@ -1790,6 +1902,7 @@ public class PurpurWorldConfig { public double striderMaxHealth = 20.0D; public int striderBreedingTicks = 6000; public boolean striderGiveSaddleBack = false; @@ -2083,7 +2083,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1819,6 +1932,7 @@ public class PurpurWorldConfig { +@@ -1802,6 +1915,7 @@ public class PurpurWorldConfig { striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); @@ -2091,7 +2091,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean tadpoleRidable = false; -@@ -1840,6 +1954,7 @@ public class PurpurWorldConfig { +@@ -1823,6 +1937,7 @@ public class PurpurWorldConfig { public double traderLlamaMovementSpeedMin = 0.175D; public double traderLlamaMovementSpeedMax = 0.175D; public int traderLlamaBreedingTicks = 6000; @@ -2099,7 +2099,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -1858,11 +1973,13 @@ public class PurpurWorldConfig { +@@ -1841,11 +1956,13 @@ public class PurpurWorldConfig { traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); @@ -2113,7 +2113,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void tropicalFishSettings() { tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); -@@ -1872,6 +1989,7 @@ public class PurpurWorldConfig { +@@ -1855,6 +1972,7 @@ public class PurpurWorldConfig { set("mobs.tropical_fish.attributes.max_health", oldValue); } tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); @@ -2121,7 +2121,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean turtleRidable = false; -@@ -1879,6 +1997,7 @@ public class PurpurWorldConfig { +@@ -1862,6 +1980,7 @@ public class PurpurWorldConfig { public boolean turtleControllable = true; public double turtleMaxHealth = 30.0D; public int turtleBreedingTicks = 6000; @@ -2129,7 +2129,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -1890,6 +2009,7 @@ public class PurpurWorldConfig { +@@ -1873,6 +1992,7 @@ public class PurpurWorldConfig { } turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); @@ -2137,7 +2137,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean vexRidable = false; -@@ -1897,6 +2017,7 @@ public class PurpurWorldConfig { +@@ -1880,6 +2000,7 @@ public class PurpurWorldConfig { public boolean vexControllable = true; public double vexMaxY = 320D; public double vexMaxHealth = 14.0D; @@ -2145,7 +2145,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void vexSettings() { vexRidable = getBoolean("mobs.vex.ridable", vexRidable); vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); -@@ -1908,6 +2029,7 @@ public class PurpurWorldConfig { +@@ -1891,6 +2012,7 @@ public class PurpurWorldConfig { set("mobs.vex.attributes.max_health", oldValue); } vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); @@ -2153,7 +2153,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean villagerRidable = false; -@@ -1921,6 +2043,7 @@ public class PurpurWorldConfig { +@@ -1903,6 +2025,7 @@ public class PurpurWorldConfig { public boolean villagerClericsFarmWarts = false; public boolean villagerClericFarmersThrowWarts = true; public boolean villagerBypassMobGriefing = false; @@ -2161,7 +2161,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1938,6 +2061,7 @@ public class PurpurWorldConfig { +@@ -1919,6 +2042,7 @@ public class PurpurWorldConfig { villagerClericsFarmWarts = getBoolean("mobs.villager.clerics-farm-warts", villagerClericsFarmWarts); villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts); villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); @@ -2169,7 +2169,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean vindicatorRidable = false; -@@ -1945,6 +2069,7 @@ public class PurpurWorldConfig { +@@ -1926,6 +2050,7 @@ public class PurpurWorldConfig { public boolean vindicatorControllable = true; public double vindicatorMaxHealth = 24.0D; public double vindicatorJohnnySpawnChance = 0D; @@ -2177,7 +2177,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -1956,6 +2081,7 @@ public class PurpurWorldConfig { +@@ -1937,6 +2062,7 @@ public class PurpurWorldConfig { } vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); @@ -2185,23 +2185,23 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean wanderingTraderRidable = false; -@@ -1964,6 +2090,7 @@ public class PurpurWorldConfig { +@@ -1944,6 +2070,7 @@ public class PurpurWorldConfig { + public boolean wanderingTraderControllable = true; public double wanderingTraderMaxHealth = 20.0D; public boolean wanderingTraderFollowEmeraldBlock = false; - public boolean wanderingTraderCanBeLeashed = false; + public boolean wanderingTraderTakeDamageFromWater = false; private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -1976,6 +2103,7 @@ public class PurpurWorldConfig { +@@ -1955,6 +2082,7 @@ public class PurpurWorldConfig { + } wanderingTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", wanderingTraderMaxHealth); wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); - wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); + wanderingTraderTakeDamageFromWater = getBoolean("mobs.wandering_trader.takes-damage-from-water", wanderingTraderTakeDamageFromWater); } public boolean wardenRidable = false; -@@ -1991,6 +2119,7 @@ public class PurpurWorldConfig { +@@ -1970,6 +2098,7 @@ public class PurpurWorldConfig { public boolean witchRidableInWater = true; public boolean witchControllable = true; public double witchMaxHealth = 26.0D; @@ -2209,7 +2209,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void witchSettings() { witchRidable = getBoolean("mobs.witch.ridable", witchRidable); witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); -@@ -2001,6 +2130,7 @@ public class PurpurWorldConfig { +@@ -1980,6 +2109,7 @@ public class PurpurWorldConfig { set("mobs.witch.attributes.max_health", oldValue); } witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); @@ -2217,7 +2217,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean witherRidable = false; -@@ -2011,6 +2141,7 @@ public class PurpurWorldConfig { +@@ -1990,6 +2120,7 @@ public class PurpurWorldConfig { public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; public boolean witherBypassMobGriefing = false; @@ -2225,7 +2225,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2029,12 +2160,14 @@ public class PurpurWorldConfig { +@@ -2008,12 +2139,14 @@ public class PurpurWorldConfig { witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); @@ -2240,7 +2240,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void witherSkeletonSettings() { witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); -@@ -2045,6 +2178,7 @@ public class PurpurWorldConfig { +@@ -2024,6 +2157,7 @@ public class PurpurWorldConfig { set("mobs.wither_skeleton.attributes.max_health", oldValue); } witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); @@ -2248,7 +2248,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean wolfRidable = false; -@@ -2055,6 +2189,7 @@ public class PurpurWorldConfig { +@@ -2034,6 +2168,7 @@ public class PurpurWorldConfig { public boolean wolfMilkCuresRabies = true; public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; @@ -2256,7 +2256,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -2073,12 +2208,14 @@ public class PurpurWorldConfig { +@@ -2052,12 +2187,14 @@ public class PurpurWorldConfig { wolfMilkCuresRabies = getBoolean("mobs.wolf.milk-cures-rabid-wolves", wolfMilkCuresRabies); wolfNaturalRabid = getDouble("mobs.wolf.spawn-rabid-chance", wolfNaturalRabid); wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); @@ -2271,7 +2271,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void zoglinSettings() { zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); -@@ -2089,6 +2226,7 @@ public class PurpurWorldConfig { +@@ -2068,6 +2205,7 @@ public class PurpurWorldConfig { set("mobs.zoglin.attributes.max_health", oldValue); } zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); @@ -2279,7 +2279,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean zombieRidable = false; -@@ -2101,6 +2239,7 @@ public class PurpurWorldConfig { +@@ -2080,6 +2218,7 @@ public class PurpurWorldConfig { public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; public boolean zombieBypassMobGriefing = false; @@ -2287,7 +2287,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2117,6 +2256,7 @@ public class PurpurWorldConfig { +@@ -2096,6 +2235,7 @@ public class PurpurWorldConfig { zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens); zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging); zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); @@ -2295,7 +2295,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean zombieHorseRidable = false; -@@ -2129,6 +2269,7 @@ public class PurpurWorldConfig { +@@ -2108,6 +2248,7 @@ public class PurpurWorldConfig { public double zombieHorseMovementSpeedMin = 0.2D; public double zombieHorseMovementSpeedMax = 0.2D; public double zombieHorseSpawnChance = 0.0D; @@ -2303,7 +2303,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void zombieHorseSettings() { zombieHorseRidable = getBoolean("mobs.zombie_horse.ridable", zombieHorseRidable); zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); -@@ -2146,6 +2287,7 @@ public class PurpurWorldConfig { +@@ -2125,6 +2266,7 @@ public class PurpurWorldConfig { zombieHorseMovementSpeedMin = getDouble("mobs.zombie_horse.attributes.movement_speed.min", zombieHorseMovementSpeedMin); zombieHorseMovementSpeedMax = getDouble("mobs.zombie_horse.attributes.movement_speed.max", zombieHorseMovementSpeedMax); zombieHorseSpawnChance = getDouble("mobs.zombie_horse.spawn-chance", zombieHorseSpawnChance); @@ -2311,7 +2311,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean zombieVillagerRidable = false; -@@ -2156,6 +2298,7 @@ public class PurpurWorldConfig { +@@ -2135,6 +2277,7 @@ public class PurpurWorldConfig { public boolean zombieVillagerJockeyOnlyBaby = true; public double zombieVillagerJockeyChance = 0.05D; public boolean zombieVillagerJockeyTryExistingChickens = true; @@ -2319,7 +2319,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -2170,6 +2313,7 @@ public class PurpurWorldConfig { +@@ -2149,6 +2292,7 @@ public class PurpurWorldConfig { zombieVillagerJockeyOnlyBaby = getBoolean("mobs.zombie_villager.jockey.only-babies", zombieVillagerJockeyOnlyBaby); zombieVillagerJockeyChance = getDouble("mobs.zombie_villager.jockey.chance", zombieVillagerJockeyChance); zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens); @@ -2327,7 +2327,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 } public boolean zombifiedPiglinRidable = false; -@@ -2181,6 +2325,7 @@ public class PurpurWorldConfig { +@@ -2160,6 +2304,7 @@ public class PurpurWorldConfig { public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; @@ -2335,7 +2335,7 @@ index a9148a96d988632109a82603dc538b5111a8f1aa..0427946e49661354265f6bfb3be1be50 private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -2196,5 +2341,6 @@ public class PurpurWorldConfig { +@@ -2175,5 +2320,6 @@ public class PurpurWorldConfig { zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance); zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); diff --git a/patches/unapplied-server/0125-Config-to-always-tame-in-Creative.patch b/patches/server/0118-Config-to-always-tame-in-Creative.patch similarity index 90% rename from patches/unapplied-server/0125-Config-to-always-tame-in-Creative.patch rename to patches/server/0118-Config-to-always-tame-in-Creative.patch index 2232ab1d9..50feaee96 100644 --- a/patches/unapplied-server/0125-Config-to-always-tame-in-Creative.patch +++ b/patches/server/0118-Config-to-always-tame-in-Creative.patch @@ -20,10 +20,10 @@ index b0944fa1f3849dd24cd010fa0a6638f5fd7179d1..d409ae987088df3d47192128401d7491 return; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index 446aec4d10e614f136fe6ae4bb5a7dd0ac6d0f18..17aaeb734a5c1b16bd7771c909958f3acc956b7a 100644 +index f679ba03614cc6b0e976330569ed2b678c622fa3..613235f547adc5be69f5a144aee67a2e09970520 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -522,7 +522,7 @@ public class Cat extends TamableAnimal implements VariantHolder itemImmuneToExplosion = new ArrayList<>(); public List itemImmuneToFire = new ArrayList<>(); public List itemImmuneToLightning = new ArrayList<>(); @@ -164,7 +163,7 @@ index 876f8b77160e39499bc95a574ecdc6b333014b4b..3a13246c0dccb82ef8168d35d5993291 private void itemSettings() { itemImmuneToCactus.clear(); getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { -@@ -234,6 +238,10 @@ public class PurpurWorldConfig { +@@ -219,6 +223,10 @@ public class PurpurWorldConfig { Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(key.toString())); if (item != Items.AIR) itemImmuneToLightning.add(item); }); diff --git a/patches/unapplied-server/0129-One-Punch-Man.patch b/patches/server/0122-One-Punch-Man.patch similarity index 84% rename from patches/unapplied-server/0129-One-Punch-Man.patch rename to patches/server/0122-One-Punch-Man.patch index d04ac11d9..dcd536be3 100644 --- a/patches/unapplied-server/0129-One-Punch-Man.patch +++ b/patches/server/0122-One-Punch-Man.patch @@ -6,10 +6,10 @@ Subject: [PATCH] One Punch Man! inspired by https://modrinth.com/mod/creative-one-punch diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 450b289398cb3cccfcddcb4377004358a77d2c45..d69efde99472087c98cdadfe76b154847718951b 100644 +index 13ada4aa83ddb75d6107d41b4a7d10196d5f01f0..ab9769d9a14d7736f9a9d1c3afbf44dc9339fc3b 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1451,6 +1451,24 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1428,6 +1428,24 @@ public abstract class LivingEntity extends Entity implements Attackable { this.stopSleeping(); } @@ -35,21 +35,21 @@ index 450b289398cb3cccfcddcb4377004358a77d2c45..d69efde99472087c98cdadfe76b15484 float f1 = amount; boolean flag = amount > 0.0F && this.isDamageSourceBlocked(source); // Copied from below diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3a13246c0dccb82ef8168d35d59932911ef2a5ad..b830a673a8c7033147d15d0a63474aa33f5520e6 100644 +index 12d70d3a064c3cf031818f25777eb0aaf97b7ea1..0913c3f49fb36dd63c15e3cfb891a60a9495a92a 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -344,6 +344,7 @@ public class PurpurWorldConfig { +@@ -328,6 +328,7 @@ public class PurpurWorldConfig { + public int playerDeathExpDropMax = 100; public boolean teleportIfOutsideBorder = false; public boolean totemOfUndyingWorksInInventory = false; - public boolean playerFixStuckPortal = false; + public boolean creativeOnePunch = false; private void playerSettings() { if (PurpurConfig.version < 19) { boolean oldVal = getBoolean("gameplay-mechanics.player.idle-timeout.mods-target", idleTimeoutTargetPlayer); -@@ -360,6 +361,7 @@ public class PurpurWorldConfig { +@@ -343,6 +344,7 @@ public class PurpurWorldConfig { + playerDeathExpDropMax = getInt("gameplay-mechanics.player.exp-dropped-on-death.maximum", playerDeathExpDropMax); teleportIfOutsideBorder = getBoolean("gameplay-mechanics.player.teleport-if-outside-border", teleportIfOutsideBorder); totemOfUndyingWorksInInventory = getBoolean("gameplay-mechanics.player.totem-of-undying-works-in-inventory", totemOfUndyingWorksInInventory); - playerFixStuckPortal = getBoolean("gameplay-mechanics.player.fix-stuck-in-portal", playerFixStuckPortal); + creativeOnePunch = getBoolean("gameplay-mechanics.player.one-punch-in-creative", creativeOnePunch); } diff --git a/patches/unapplied-server/0130-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch b/patches/server/0123-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch similarity index 64% rename from patches/unapplied-server/0130-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch rename to patches/server/0123-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch index 617c8cedb..dcba99fd5 100644 --- a/patches/unapplied-server/0130-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch +++ b/patches/server/0123-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch @@ -8,27 +8,27 @@ Subject: [PATCH] Configurable Ender Pearl cooldown, damage, and Endermite RNG - Endermite spawn chance diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -index 519755b7f8bc7e8bb9fab135fc5bf7de3a9419f9..0d781b55afa32c58028ec4ed367c2c6e01faa271 100644 +index 1aa5e57a4e6a4be60514d8808a2e6c973d93e798..0d2a18190c46f34277a714570267bcc33507ff10 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -@@ -70,7 +70,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { - Bukkit.getPluginManager().callEvent(teleEvent); +@@ -77,7 +77,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { + return; + } + // CraftBukkit end +- if (this.random.nextFloat() < 0.05F && worldserver.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { ++ if (this.random.nextFloat() < this.level().purpurConfig.enderPearlEndermiteChance && worldserver.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { // Purpur + Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(worldserver); - if (!teleEvent.isCancelled() && entityplayer.connection.isAcceptingMessages()) { -- if (this.random.nextFloat() < 0.05F && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { -+ if (this.random.nextFloat() < this.level().purpurConfig.enderPearlEndermiteChance && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { // Purpur - Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(this.level()); - - if (entityendermite != null) { -@@ -85,7 +85,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { - - entityplayer.connection.teleport(teleEvent.getTo()); - entity.resetFallDistance(); -- entity.hurt(this.damageSources().fall().customEventDamager(this), 5.0F); // CraftBukkit // Paper - fix DamageSource API -+ entity.hurt(this.damageSources().fall().customEventDamager(this), this.level().purpurConfig.enderPearlDamage); // CraftBukkit // Paper - fix DamageSource API // Purpur - } - // CraftBukkit end - this.level().playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.PLAYER_TELEPORT, SoundSource.PLAYERS); + if (entityendermite != null) { +@@ -89,7 +89,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { + // entity.changeDimension(new DimensionTransition(worldserver, this.position(), entity.getDeltaMovement(), entity.getYRot(), entity.getXRot(), DimensionTransition.DO_NOTHING)); // CraftBukkit - moved up + entity.resetFallDistance(); + entityplayer.resetCurrentImpulseContext(); +- entity.hurt(this.damageSources().fall().customEventDamager(this), 5.0F); // CraftBukkit // Paper - fix DamageSource API ++ entity.hurt(this.damageSources().fall().customEventDamager(this), this.level().purpurConfig.enderPearlDamage); // CraftBukkit // Paper - fix DamageSource API // Purpur + this.playSound(worldserver, this.position()); + } + } else { diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java index 20a91d798d31a71b3c05efa2cc5bda55494e26cc..fc62754f93bd11a10c28b8b7b116e9fff70a5c7b 100644 --- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java @@ -43,10 +43,10 @@ index 20a91d798d31a71b3c05efa2cc5bda55494e26cc..fc62754f93bd11a10c28b8b7b116e9ff // Paper end - PlayerLaunchProjectileEvent if (user instanceof net.minecraft.server.level.ServerPlayer) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5f01c0d1277e1aa910208a3b9308c427b6e22cdb..a71ce1e255bbb469d3c0a20853450130589af326 100644 +index 0913c3f49fb36dd63c15e3cfb891a60a9495a92a..cab510c8a0cb68b0d741cad6c46505f9916ac835 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -201,6 +201,10 @@ public class PurpurWorldConfig { +@@ -186,6 +186,10 @@ public class PurpurWorldConfig { public boolean ignoreScissorsInWater = false; public boolean ignoreScissorsInLava = false; public double scissorsRunningDamage = 1D; @@ -57,7 +57,7 @@ index 5f01c0d1277e1aa910208a3b9308c427b6e22cdb..a71ce1e255bbb469d3c0a20853450130 private void itemSettings() { itemImmuneToCactus.clear(); getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { -@@ -242,6 +246,10 @@ public class PurpurWorldConfig { +@@ -227,6 +231,10 @@ public class PurpurWorldConfig { ignoreScissorsInWater = getBoolean("gameplay-mechanics.item.shears.ignore-in-water", ignoreScissorsInWater); ignoreScissorsInLava = getBoolean("gameplay-mechanics.item.shears.ignore-in-lava", ignoreScissorsInLava); scissorsRunningDamage = getDouble("gameplay-mechanics.item.shears.sprinting-damage", scissorsRunningDamage); diff --git a/patches/unapplied-server/0131-Config-to-ignore-nearby-mobs-when-sleeping.patch b/patches/server/0124-Config-to-ignore-nearby-mobs-when-sleeping.patch similarity index 72% rename from patches/unapplied-server/0131-Config-to-ignore-nearby-mobs-when-sleeping.patch rename to patches/server/0124-Config-to-ignore-nearby-mobs-when-sleeping.patch index 66597622e..ee683245e 100644 --- a/patches/unapplied-server/0131-Config-to-ignore-nearby-mobs-when-sleeping.patch +++ b/patches/server/0124-Config-to-ignore-nearby-mobs-when-sleeping.patch @@ -5,33 +5,33 @@ Subject: [PATCH] Config to ignore nearby mobs when sleeping diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index d1c5c334cf3d8ef6c34fcaac194fef693a594250..e0f0ad1fab5d980beb1bfdcd837504e2e94eea83 100644 +index 20fcf96f5cc89631cc993168f009e91c5bd57c48..03fe9f169ac76ca346e798571eaeaf6aea63f775 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1506,7 +1506,7 @@ public class ServerPlayer extends Player { +@@ -1493,7 +1493,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { return entitymonster.isPreventingPlayerRest(this); }); - if (!list.isEmpty()) { + if (!this.level().purpurConfig.playerSleepNearMonsters && !list.isEmpty()) { // Purpur - return Either.left(Player.BedSleepingProblem.NOT_SAFE); + return Either.left(net.minecraft.world.entity.player.Player.BedSleepingProblem.NOT_SAFE); } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d7c0928a9e96e9c85877830ff5f8e929ce7284d5..c9a65ec607a306acb1f51b483d1b3f9901b07684 100644 +index cab510c8a0cb68b0d741cad6c46505f9916ac835..dba6c5ef3138347321ab2a5d2871bcf71fbb1796 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -353,6 +353,7 @@ public class PurpurWorldConfig { +@@ -337,6 +337,7 @@ public class PurpurWorldConfig { + public boolean teleportIfOutsideBorder = false; public boolean totemOfUndyingWorksInInventory = false; - public boolean playerFixStuckPortal = false; public boolean creativeOnePunch = false; + public boolean playerSleepNearMonsters = false; private void playerSettings() { if (PurpurConfig.version < 19) { boolean oldVal = getBoolean("gameplay-mechanics.player.idle-timeout.mods-target", idleTimeoutTargetPlayer); -@@ -370,6 +371,7 @@ public class PurpurWorldConfig { +@@ -353,6 +354,7 @@ public class PurpurWorldConfig { + teleportIfOutsideBorder = getBoolean("gameplay-mechanics.player.teleport-if-outside-border", teleportIfOutsideBorder); totemOfUndyingWorksInInventory = getBoolean("gameplay-mechanics.player.totem-of-undying-works-in-inventory", totemOfUndyingWorksInInventory); - playerFixStuckPortal = getBoolean("gameplay-mechanics.player.fix-stuck-in-portal", playerFixStuckPortal); creativeOnePunch = getBoolean("gameplay-mechanics.player.one-punch-in-creative", creativeOnePunch); + playerSleepNearMonsters = getBoolean("gameplay-mechanics.player.sleep-ignore-nearby-mobs", playerSleepNearMonsters); } diff --git a/patches/unapplied-server/0132-Add-back-player-spawned-endermite-API.patch b/patches/server/0125-Add-back-player-spawned-endermite-API.patch similarity index 80% rename from patches/unapplied-server/0132-Add-back-player-spawned-endermite-API.patch rename to patches/server/0125-Add-back-player-spawned-endermite-API.patch index a92ca74c4..1ad32dce5 100644 --- a/patches/unapplied-server/0132-Add-back-player-spawned-endermite-API.patch +++ b/patches/server/0125-Add-back-player-spawned-endermite-API.patch @@ -47,17 +47,17 @@ index 514354bfcd0608554fd515248975fb107eddf427..c5fcefc6810c2127d6a0a48f95c50c2e @Override diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -index 0d781b55afa32c58028ec4ed367c2c6e01faa271..61bd2459f2b9164dce90134103abaddce42b0621 100644 +index 0d2a18190c46f34277a714570267bcc33507ff10..334fa781e94d195c13dd78cdbe8f43b4b126ebd0 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -@@ -74,6 +74,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { - Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(this.level()); +@@ -81,6 +81,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { + Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(worldserver); - if (entityendermite != null) { -+ entityendermite.setPlayerSpawned(true); // Purpur - entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); - this.level().addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); - } + if (entityendermite != null) { ++ entityendermite.setPlayerSpawned(true); // Purpur + entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); + worldserver.addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); + } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java index d657fd2c507a5b215aeab0a5f3e9c2ee892a27c8..985e9ec21c60a1f47973bd5fc53b96a6f9b7d04a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java diff --git a/patches/unapplied-server/0133-Config-Enderman-aggressiveness-towards-Endermites.patch b/patches/server/0126-Config-Enderman-aggressiveness-towards-Endermites.patch similarity index 90% rename from patches/unapplied-server/0133-Config-Enderman-aggressiveness-towards-Endermites.patch rename to patches/server/0126-Config-Enderman-aggressiveness-towards-Endermites.patch index 6eb82e5d5..090a1a997 100644 --- a/patches/unapplied-server/0133-Config-Enderman-aggressiveness-towards-Endermites.patch +++ b/patches/server/0126-Config-Enderman-aggressiveness-towards-Endermites.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config Enderman aggressiveness towards Endermites diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 17b044e58d2ed33ed16e60f4fd4f63b2ee3f854d..4821aec304399c64cbcff741334567a08b840c0a 100644 +index 75d462d7f55dedfa62844549fa6690a4a652bd1f..cc9da5134ece550e8a1902e90282090f05818fd8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -129,7 +129,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -131,7 +131,7 @@ public class EnderMan extends Monster implements NeutralMob { this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); @@ -18,10 +18,10 @@ index 17b044e58d2ed33ed16e60f4fd4f63b2ee3f854d..4821aec304399c64cbcff741334567a0 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 39f612bbe47c20e718c82d8259fd784139457608..5ff45015f6a902eacfbd7978d2abdcd64af43e0f 100644 +index dba6c5ef3138347321ab2a5d2871bcf71fbb1796..023858324966929b8fb45b046309e403ec937351 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1022,6 +1022,8 @@ public class PurpurWorldConfig { +@@ -1005,6 +1005,8 @@ public class PurpurWorldConfig { public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; public boolean endermanTakeDamageFromWater = true; @@ -30,7 +30,7 @@ index 39f612bbe47c20e718c82d8259fd784139457608..5ff45015f6a902eacfbd7978d2abdcd6 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -1031,11 +1033,17 @@ public class PurpurWorldConfig { +@@ -1014,11 +1016,17 @@ public class PurpurWorldConfig { set("mobs.enderman.attributes.max-health", null); set("mobs.enderman.attributes.max_health", oldValue); } diff --git a/patches/unapplied-server/0134-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch b/patches/server/0127-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch similarity index 88% rename from patches/unapplied-server/0134-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch rename to patches/server/0127-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch index 93a7f0380..45b67369f 100644 --- a/patches/unapplied-server/0134-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch +++ b/patches/server/0127-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch @@ -7,10 +7,10 @@ Prevents Enderman from becoming aggresive towards players that are wearing a Dra Adds functionality to a useless item! diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 4821aec304399c64cbcff741334567a08b840c0a..b361c6b4ca17b9d466555037235a5660caa5c9bd 100644 +index cc9da5134ece550e8a1902e90282090f05818fd8..f2e21c9d3cefb635c4eb583ac9355b46675c94e7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -266,7 +266,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -268,7 +268,7 @@ public class EnderMan extends Monster implements NeutralMob { // Paper end - EndermanAttackPlayerEvent ItemStack itemstack = (ItemStack) player.getInventory().armor.get(3); @@ -20,10 +20,10 @@ index 4821aec304399c64cbcff741334567a08b840c0a..b361c6b4ca17b9d466555037235a5660 } else { Vec3 vec3d = player.getViewVector(1.0F).normalize(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5ff45015f6a902eacfbd7978d2abdcd64af43e0f..55f557d7e2aa8af8ae1ddf7a4225786ec5dca66f 100644 +index 023858324966929b8fb45b046309e403ec937351..e9f1fce3c10fc44a4a092f7b32fa5f2ac5dcc3da 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1024,6 +1024,8 @@ public class PurpurWorldConfig { +@@ -1007,6 +1007,8 @@ public class PurpurWorldConfig { public boolean endermanTakeDamageFromWater = true; public boolean endermanAggroEndermites = true; public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; @@ -32,7 +32,7 @@ index 5ff45015f6a902eacfbd7978d2abdcd64af43e0f..55f557d7e2aa8af8ae1ddf7a4225786e private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -1044,6 +1046,8 @@ public class PurpurWorldConfig { +@@ -1027,6 +1029,8 @@ public class PurpurWorldConfig { endermanTakeDamageFromWater = getBoolean("mobs.enderman.takes-damage-from-water", endermanTakeDamageFromWater); endermanAggroEndermites = getBoolean("mobs.enderman.aggressive-towards-endermites", endermanAggroEndermites); endermanAggroEndermitesOnlyIfPlayerSpawned = getBoolean("mobs.enderman.aggressive-towards-endermites-only-spawned-by-player-thrown-ender-pearls", endermanAggroEndermitesOnlyIfPlayerSpawned); diff --git a/patches/unapplied-server/0135-Tick-fluids-config.patch b/patches/server/0128-Tick-fluids-config.patch similarity index 94% rename from patches/unapplied-server/0135-Tick-fluids-config.patch rename to patches/server/0128-Tick-fluids-config.patch index 4a067efd0..4a7d232cb 100644 --- a/patches/unapplied-server/0135-Tick-fluids-config.patch +++ b/patches/server/0128-Tick-fluids-config.patch @@ -36,10 +36,10 @@ index 84623c632d8c2f0fa7ec939c711316d757117d23..1851035b9fdcc076442d0699567a3b02 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e3e0a5c0f241e7fe1fdd2be1bd1afe7752628b9e..6756564f9b03bc822485b4199bf46c50069eea65 100644 +index e9f1fce3c10fc44a4a092f7b32fa5f2ac5dcc3da..9d5852c9c0009db15134af1b40fca619090a6732 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -129,6 +129,7 @@ public class PurpurWorldConfig { +@@ -127,6 +127,7 @@ public class PurpurWorldConfig { public boolean noteBlockIgnoreAbove = false; public boolean persistentDroppableEntityDisplayNames = true; public boolean projectilesBypassMobGriefing = false; @@ -47,7 +47,7 @@ index e3e0a5c0f241e7fe1fdd2be1bd1afe7752628b9e..6756564f9b03bc822485b4199bf46c50 public double tridentLoyaltyVoidReturnHeight = 0.0D; public double voidDamageHeight = -64.0D; public double voidDamageDealt = 4.0D; -@@ -148,6 +149,7 @@ public class PurpurWorldConfig { +@@ -144,6 +145,7 @@ public class PurpurWorldConfig { noteBlockIgnoreAbove = getBoolean("gameplay-mechanics.note-block-ignore-above", noteBlockIgnoreAbove); persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames); projectilesBypassMobGriefing = getBoolean("gameplay-mechanics.projectiles-bypass-mob-griefing", projectilesBypassMobGriefing); diff --git a/patches/unapplied-server/0136-Config-to-disable-Llama-caravans.patch b/patches/server/0129-Config-to-disable-Llama-caravans.patch similarity index 90% rename from patches/unapplied-server/0136-Config-to-disable-Llama-caravans.patch rename to patches/server/0129-Config-to-disable-Llama-caravans.patch index d261f9a15..ba795d948 100644 --- a/patches/unapplied-server/0136-Config-to-disable-Llama-caravans.patch +++ b/patches/server/0129-Config-to-disable-Llama-caravans.patch @@ -19,10 +19,10 @@ index eb0faf58fa1a408f294fc62120b140def97f998d..0f4f546cd0eda4bd82b47446ae23ac32 List list = this.llama.level().getEntities(this.llama, this.llama.getBoundingBox().inflate(9.0, 4.0, 9.0), entity -> { EntityType entityType = entity.getType(); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 876b06fd6a371caa6cc71026a3b2f7a111c89dc8..6f744c07d01d5e01dda5aa5cdcf9a29f883ad28a 100644 +index 96f1eba4a356e131a8f3c689bedc9eb8821e1a72..8edfc34a17d8c05cfa2928738306c1abc1743cc5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -@@ -482,7 +482,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder { + if (iblockdata.is(BlockTags.MOB_INTERACTABLE_DOORS, (blockbase_blockdata) -> { return blockbase_blockdata.getBlock() instanceof DoorBlock; - })) { + }) && !DoorBlock.requiresRedstone(entityliving.level(), iblockdata, blockposition)) { // Purpur @@ -19,7 +19,7 @@ index 736f46d552d558bf0edd9a86601b5fbb6940815b..cf039181dfe0ddb3ccda44064a5d8a2f if (!blockdoor.isOpen(iblockdata)) { @@ -79,7 +79,7 @@ public class InteractWithDoor { - if (iblockdata1.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> { + if (iblockdata1.is(BlockTags.MOB_INTERACTABLE_DOORS, (blockbase_blockdata) -> { return blockbase_blockdata.getBlock() instanceof DoorBlock; - })) { + }) && !DoorBlock.requiresRedstone(entityliving.level(), iblockdata, blockposition1)) { // Purpur @@ -28,15 +28,30 @@ index 736f46d552d558bf0edd9a86601b5fbb6940815b..cf039181dfe0ddb3ccda44064a5d8a2f if (!blockdoor1.isOpen(iblockdata1)) { @@ -122,7 +122,7 @@ public class InteractWithDoor { - if (!iblockdata.is(BlockTags.WOODEN_DOORS, (blockbase_blockdata) -> { + if (!iblockdata.is(BlockTags.MOB_INTERACTABLE_DOORS, (blockbase_blockdata) -> { return blockbase_blockdata.getBlock() instanceof DoorBlock; - })) { + }) || DoorBlock.requiresRedstone(entity.level(), iblockdata, blockposition)) { // Purpur iterator.remove(); } else { DoorBlock blockdoor = (DoorBlock) iblockdata.getBlock(); +diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +index 07204c4d56d0a33bd596a255f3281dd6a29233ae..ac95d5acc275d69d2b420173540d7ddb64b6d711 100644 +--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java ++++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +@@ -151,8 +151,8 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill + } + if (level().purpurConfig.wanderingTraderRidable && itemstack.isEmpty()) return tryRide(player, hand); // Purpur + if (this.level().purpurConfig.wanderingTraderAllowTrading) { // Purpur +- this.setTradingPlayer(player); +- this.openTradingScreen(player, this.getDisplayName(), 1); ++ this.setTradingPlayer(player); ++ this.openTradingScreen(player, this.getDisplayName(), 1); + } // Purpur + } + diff --git a/src/main/java/net/minecraft/world/level/block/DoorBlock.java b/src/main/java/net/minecraft/world/level/block/DoorBlock.java -index 42d43b7a7e3b7c53cc80b8706c130e660f2c72da..96199441202ad929ad0274574704635c538a93c7 100644 +index 6dd75bc722f9c20b4869e6353115c3b02dd79f99..dfaf82f5b0180cf08c4125347867d37a2557fd24 100644 --- a/src/main/java/net/minecraft/world/level/block/DoorBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DoorBlock.java @@ -198,6 +198,7 @@ public class DoorBlock extends Block { @@ -67,10 +82,10 @@ index 42d43b7a7e3b7c53cc80b8706c130e660f2c72da..96199441202ad929ad0274574704635c + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4c9479029b659baa53377fde1dd7117d5e1bfc15..3464f0c8d019c4675c2df7c83e0a77cb3eec16e0 100644 +index 1c23b9aa694bd107344e18ee765d0d651cd22240..9be6d30c688e4929e34e9f039b32e3db177f6f57 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -505,6 +505,16 @@ public class PurpurWorldConfig { +@@ -488,6 +488,16 @@ public class PurpurWorldConfig { dispenserPlaceAnvils = getBoolean("blocks.dispenser.place-anvils", dispenserPlaceAnvils); } diff --git a/patches/unapplied-server/0148-Config-to-allow-for-unsafe-enchants.patch b/patches/server/0140-Config-to-allow-for-unsafe-enchants.patch similarity index 83% rename from patches/unapplied-server/0148-Config-to-allow-for-unsafe-enchants.patch rename to patches/server/0140-Config-to-allow-for-unsafe-enchants.patch index a9b0cab9c..d9bdbf841 100644 --- a/patches/unapplied-server/0148-Config-to-allow-for-unsafe-enchants.patch +++ b/patches/server/0140-Config-to-allow-for-unsafe-enchants.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to allow for unsafe enchants diff --git a/src/main/java/net/minecraft/server/commands/EnchantCommand.java b/src/main/java/net/minecraft/server/commands/EnchantCommand.java -index 84f1ba6275f04624f46ccd772924b5e075e7b205..bfb455fb74f0a9645212f90acb54f68d1c7d9772 100644 +index 99695e38b6a10c3cffda6e453f9f0619c7406cc0..6e63b838de2edeab03ae25fc34e6004830fb7349 100644 --- a/src/main/java/net/minecraft/server/commands/EnchantCommand.java +++ b/src/main/java/net/minecraft/server/commands/EnchantCommand.java @@ -70,7 +70,7 @@ public class EnchantCommand { @@ -21,19 +21,19 @@ index 84f1ba6275f04624f46ccd772924b5e075e7b205..bfb455fb74f0a9645212f90acb54f68d ItemStack itemStack = livingEntity.getMainHandItem(); if (!itemStack.isEmpty()) { if (enchantment2.canEnchant(itemStack) -- && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(itemStack).keySet(), enchantment2)) { -+ && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(itemStack).keySet(), enchantment2) || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && !itemStack.hasEnchantment(enchantment2))) { // Purpur - itemStack.enchant(enchantment2, level); +- && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(itemStack).keySet(), enchantment)) { ++ && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(itemStack).keySet(), enchantment) || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && !itemStack.hasEnchantment(enchantment2))) { // Purpur + itemStack.enchant(enchantment, level); i++; } else if (targets.size() == 1) { diff --git a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java -index 5cadd69bcae33b1de58806fcf40533850d976154..17067510990f575bf638f6a95ed0d964f6e94dc5 100644 +index 48d803a3e8419a04fce934263f7a01dbfd335e2e..26951cc5fb64a8d6c99d450dbe236f28b56e44a7 100644 --- a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java @@ -228,7 +228,8 @@ public class AnvilMenu extends ItemCombinerMenu { - int i2 = entry.getIntValue(); i2 = l1 == i2 ? i2 + 1 : Math.max(i2, l1); + Enchantment enchantment = (Enchantment) holder.value(); - boolean flag3 = enchantment.canEnchant(itemstack); + boolean flag3 = canDoUnsafeEnchants || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchants && org.purpurmc.purpur.PurpurConfig.allowInapplicableEnchants) || enchantment.canEnchant(itemstack); // Purpur + boolean flag4 = true; // Purpur @@ -74,10 +74,10 @@ index 5cadd69bcae33b1de58806fcf40533850d976154..17067510990f575bf638f6a95ed0d964 ((ServerPlayer) player).connection.send(new ClientboundContainerSetDataPacket(containerId, 0, cost.get())); } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index c3a4158df98d52854d777f986d8a8b962ea55e29..18f0652da2b7a8572463fcf302eb4d35480daf1a 100644 +index ff721322468571aa86aa1fadf4e59fc0e62c457a..29ff737c0dd267710f852e50ac64a0eea7f8738b 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -1235,6 +1235,16 @@ public final class ItemStack implements DataComponentHolder { +@@ -1240,6 +1240,16 @@ public final class ItemStack implements DataComponentHolder { return !((ItemEnchantments) this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY)).isEmpty(); } @@ -95,25 +95,20 @@ index c3a4158df98d52854d777f986d8a8b962ea55e29..18f0652da2b7a8572463fcf302eb4d35 return (ItemEnchantments) this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 06b9b3777e58366608433adbd92e4c22083725cf..ac50ff035635f33ee8d4bb3363fb13a1d0a013df 100644 +index a601f18f94e80b16ae22d077a405d685803529a8..01f192f911dfd4c4afcd942196fce62e35cdbacf 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -285,14 +285,34 @@ public class PurpurConfig { +@@ -283,6 +283,29 @@ public class PurpurConfig { + cryingObsidianValidForPortalFrame = getBoolean("settings.blocks.crying_obsidian.valid-for-portal-frame", cryingObsidianValidForPortalFrame); + } - public static boolean allowInfinityMending = false; - public static boolean allowCrossbowInfinity = true; + public static boolean allowUnsafeEnchants = false; + public static boolean allowInapplicableEnchants = true; + public static boolean allowIncompatibleEnchants = true; + public static boolean allowHigherEnchantsLevels = true; + public static boolean allowUnsafeEnchantCommand = false; + public static boolean replaceIncompatibleEnchants = false; - private static void enchantmentSettings() { - if (version < 5) { - boolean oldValue = getBoolean("settings.enchantment.allow-infinite-and-mending-together", false); - set("settings.enchantment.allow-infinity-and-mending-together", oldValue); - set("settings.enchantment.allow-infinite-and-mending-together", null); - } ++ private static void enchantmentSettings() { + if (version < 30) { + boolean oldValue = getBoolean("settings.enchantment.allow-unsafe-enchants", false); + set("settings.enchantment.anvil.allow-unsafe-enchants", oldValue); @@ -122,14 +117,14 @@ index 06b9b3777e58366608433adbd92e4c22083725cf..ac50ff035635f33ee8d4bb3363fb13a1 + set("settings.enchantment.anvil.allow-higher-enchants-levels", true); + set("settings.enchantment.allow-unsafe-enchants", null); + } - allowInfinityMending = getBoolean("settings.enchantment.allow-infinity-and-mending-together", allowInfinityMending); - allowCrossbowInfinity = getBoolean("settings.enchantment.allow-infinity-on-crossbow", allowCrossbowInfinity); + allowUnsafeEnchants = getBoolean("settings.enchantment.anvil.allow-unsafe-enchants", allowUnsafeEnchants); + allowInapplicableEnchants = getBoolean("settings.enchantment.anvil.allow-inapplicable-enchants", allowInapplicableEnchants); + allowIncompatibleEnchants = getBoolean("settings.enchantment.anvil.allow-incompatible-enchants", allowIncompatibleEnchants); + allowHigherEnchantsLevels = getBoolean("settings.enchantment.anvil.allow-higher-enchants-levels", allowHigherEnchantsLevels); + allowUnsafeEnchantCommand = getBoolean("settings.enchantment.allow-unsafe-enchant-command", allowUnsafeEnchants); // allowUnsafeEnchants as default for backwards compatability + replaceIncompatibleEnchants = getBoolean("settings.enchantment.anvil.replace-incompatible-enchants", replaceIncompatibleEnchants); - } - ++ } ++ public static boolean endermanShortHeight = false; + private static void entitySettings() { + endermanShortHeight = getBoolean("settings.entity.enderman.short-height", endermanShortHeight); diff --git a/patches/unapplied-server/0149-Configurable-sponge-absorption.patch b/patches/server/0141-Configurable-sponge-absorption.patch similarity index 93% rename from patches/unapplied-server/0149-Configurable-sponge-absorption.patch rename to patches/server/0141-Configurable-sponge-absorption.patch index 3c506fc31..3fa231c5f 100644 --- a/patches/unapplied-server/0149-Configurable-sponge-absorption.patch +++ b/patches/server/0141-Configurable-sponge-absorption.patch @@ -21,10 +21,10 @@ index 902825ec9ea05f4418b45f56a008d73f217bd178..a676ccfa6b02e8986df6f6a2e04cbb06 int i = aenumdirection.length; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3464f0c8d019c4675c2df7c83e0a77cb3eec16e0..d7cfb2ab82953799d0ff13fcdcb115ca2fa20450 100644 +index 9be6d30c688e4929e34e9f039b32e3db177f6f57..43e26db7e22115c6814c5e6e01a96b4d08ad8bd7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -630,6 +630,13 @@ public class PurpurWorldConfig { +@@ -613,6 +613,13 @@ public class PurpurWorldConfig { spawnerDeactivateByRedstone = getBoolean("blocks.spawner.deactivate-by-redstone", spawnerDeactivateByRedstone); } diff --git a/patches/unapplied-server/0150-Projectile-offset-config.patch b/patches/server/0142-Projectile-offset-config.patch similarity index 83% rename from patches/unapplied-server/0150-Projectile-offset-config.patch rename to patches/server/0142-Projectile-offset-config.patch index bf73e8d3c..69a688aa1 100644 --- a/patches/unapplied-server/0150-Projectile-offset-config.patch +++ b/patches/server/0142-Projectile-offset-config.patch @@ -5,23 +5,23 @@ Subject: [PATCH] Projectile offset config diff --git a/src/main/java/net/minecraft/world/item/BowItem.java b/src/main/java/net/minecraft/world/item/BowItem.java -index abe6da2d70e8080461f70014757c1e1b5878bbf7..8bca38ec152f9612298bf6b3e10e7e0566ec3b78 100644 +index 6eb5c0f23d9dc61e69ad5ad493c89602a9dcd4b5..a00181da8417445705d181fe62933c48a0b1170a 100644 --- a/src/main/java/net/minecraft/world/item/BowItem.java +++ b/src/main/java/net/minecraft/world/item/BowItem.java -@@ -31,7 +31,7 @@ public class BowItem extends ProjectileWeaponItem { +@@ -32,7 +32,7 @@ public class BowItem extends ProjectileWeaponItem { if (!((double)f < 0.1)) { List list = draw(stack, itemStack, player); - if (!world.isClientSide() && !list.isEmpty()) { -- this.shoot(world, player, player.getUsedItemHand(), stack, list, f * 3.0F, 1.0F, f == 1.0F, null); -+ this.shoot(world, player, player.getUsedItemHand(), stack, list, f * 3.0F, (float) world.purpurConfig.bowProjectileOffset, f == 1.0F, null); // Purpur + if (world instanceof ServerLevel serverLevel && !list.isEmpty()) { +- this.shoot(serverLevel, player, player.getUsedItemHand(), stack, list, f * 3.0F, 1.0F, f == 1.0F, null); ++ this.shoot(serverLevel, player, player.getUsedItemHand(), stack, list, f * 3.0F, (float) world.purpurConfig.bowProjectileOffset, f == 1.0F, null); // Purpur } world.playSound( diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java -index d2bb5c84e1895f28afed03d1868a79338e4f3e58..78f124f5204e4af9318ca3eeced6b1e3353b210f 100644 +index c39fa953accd6cf35672f452052cca42fe6f29d0..dbdd1cd9486d91142e1c6b8a34aafba46c3988d3 100644 --- a/src/main/java/net/minecraft/world/item/CrossbowItem.java +++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java -@@ -60,7 +60,7 @@ public class CrossbowItem extends ProjectileWeaponItem { +@@ -69,7 +69,7 @@ public class CrossbowItem extends ProjectileWeaponItem { ItemStack itemStack = user.getItemInHand(hand); ChargedProjectiles chargedProjectiles = itemStack.get(DataComponents.CHARGED_PROJECTILES); if (chargedProjectiles != null && !chargedProjectiles.isEmpty()) { @@ -83,23 +83,23 @@ index 369955746f4b51f69fa01103e3771dd74fc6c8f0..e6edd3a0fa2578900cdbe8bd588219dc com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) thrownPotion.getBukkitEntity()); if (event.callEvent() && world.addFreshEntity(thrownPotion)) { diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java -index b094f4ec513194e10442156d8f7f2205da2384ac..85dc79b9b969fa0cbf6964cb26bac139fa55710a 100644 +index 4934bae61114b49a9f8d0ed044fbb881210df32a..1be074074283f12543ac771ac9201580e7736289 100644 --- a/src/main/java/net/minecraft/world/item/TridentItem.java +++ b/src/main/java/net/minecraft/world/item/TridentItem.java -@@ -76,7 +76,7 @@ public class TridentItem extends Item implements ProjectileItem { - if (k == 0) { - ThrownTrident entitythrowntrident = new ThrownTrident(world, entityhuman, stack); +@@ -81,7 +81,7 @@ public class TridentItem extends Item implements ProjectileItem { + if (f == 0.0F) { + ThrownTrident entitythrowntrident = new ThrownTrident(world, entityhuman, stack); -- entitythrowntrident.shootFromRotation(entityhuman, entityhuman.getXRot(), entityhuman.getYRot(), 0.0F, 2.5F + (float) k * 0.5F, 1.0F); -+ entitythrowntrident.shootFromRotation(entityhuman, entityhuman.getXRot(), entityhuman.getYRot(), 0.0F, 2.5F + (float) k * 0.5F, (float) world.purpurConfig.tridentProjectileOffset); // Purpur - if (entityhuman.hasInfiniteMaterials()) { - entitythrowntrident.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; - } +- entitythrowntrident.shootFromRotation(entityhuman, entityhuman.getXRot(), entityhuman.getYRot(), 0.0F, 2.5F, 1.0F); ++ entitythrowntrident.shootFromRotation(entityhuman, entityhuman.getXRot(), entityhuman.getYRot(), 0.0F, 2.5F, (float) world.purpurConfig.tridentProjectileOffset); // Purpur + if (entityhuman.hasInfiniteMaterials()) { + entitythrowntrident.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; + } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d7cfb2ab82953799d0ff13fcdcb115ca2fa20450..3550147e9c80964dc1bf4007e4280de4a3b39d78 100644 +index 43e26db7e22115c6814c5e6e01a96b4d08ad8bd7..ebc3615b395e9f9ff9a6dd5ac65eec6b530edad4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -455,6 +455,23 @@ public class PurpurWorldConfig { +@@ -438,6 +438,23 @@ public class PurpurWorldConfig { //} }