diff --git a/patches/unapplied-server/0101-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch b/patches/server/0097-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch similarity index 92% rename from patches/unapplied-server/0101-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch rename to patches/server/0097-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch index f7d6bfcd4..306e7682c 100644 --- a/patches/unapplied-server/0101-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch +++ b/patches/server/0097-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Set name visible when using a Name Tag on an Armor Stand diff --git a/src/main/java/net/minecraft/world/item/NameTagItem.java b/src/main/java/net/minecraft/world/item/NameTagItem.java -index 774c982f28b4f127fc3f036c19dfb47fb9ae3264..d49b60e7e643498b49c03593dc0da2f8e4459902 100644 +index 000d1863bfba98b5132dfc6743362d687b2f54f3..20fece9908382f40b4082f7b1fb7d41914ae31be 100644 --- a/src/main/java/net/minecraft/world/item/NameTagItem.java +++ b/src/main/java/net/minecraft/world/item/NameTagItem.java @@ -23,6 +23,7 @@ public class NameTagItem extends Item { @@ -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 cc95e8ba5d847348afdd4263c9e84554cb2ec713..4294b5bbf24f63023dd3c63614de7d7a14c50857 100644 +index a241c190532b0afd6d00deff3ec9c9100562524a..258f973c9debcaf09f95f73b8ca1276e107d29f8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -99,9 +99,11 @@ public class PurpurWorldConfig { diff --git a/patches/unapplied-server/0102-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch b/patches/server/0098-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch similarity index 86% rename from patches/unapplied-server/0102-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch rename to patches/server/0098-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch index 040edd6b8..01b7ed638 100644 --- a/patches/unapplied-server/0102-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch +++ b/patches/server/0098-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 b081ea3f272ec2dba426bf0ebdfbbba1cec718ee..3348b5a9e4e00ef7f4dabe10d0fe0a9c0456dbd7 100644 +index 1a33a41f79f9d661cb958a6ecee2ab7e8a819877..3a37ff8bd8ca792393fa10fed4d38eb72559d4db 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -487,7 +487,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -468,7 +468,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { @@ -21,10 +21,10 @@ index b081ea3f272ec2dba426bf0ebdfbbba1cec718ee..3348b5a9e4e00ef7f4dabe10d0fe0a9c 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 4294b5bbf24f63023dd3c63614de7d7a14c50857..35457d2d53d7497ab8e370b0059a67b8563e1eff 100644 +index 258f973c9debcaf09f95f73b8ca1276e107d29f8..bc28a4851dd68874042c05bed3486eace3db5963 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -848,6 +848,7 @@ public class PurpurWorldConfig { +@@ -847,6 +847,7 @@ public class PurpurWorldConfig { public double endermanMaxHealth = 40.0D; public double endermanScale = 1.0D; public boolean endermanAllowGriefing = true; @@ -32,7 +32,7 @@ index 4294b5bbf24f63023dd3c63614de7d7a14c50857..35457d2d53d7497ab8e370b0059a67b8 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -860,6 +861,7 @@ public class PurpurWorldConfig { +@@ -859,6 +860,7 @@ public class PurpurWorldConfig { endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanScale = Mth.clamp(getDouble("mobs.enderman.attributes.scale", endermanScale), 0.0625D, 16.0D); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); diff --git a/patches/unapplied-server/0103-Add-configurable-snowball-damage.patch b/patches/server/0099-Add-configurable-snowball-damage.patch similarity index 86% rename from patches/unapplied-server/0103-Add-configurable-snowball-damage.patch rename to patches/server/0099-Add-configurable-snowball-damage.patch index e9754a2cd..f0ee56d8a 100644 --- a/patches/unapplied-server/0103-Add-configurable-snowball-damage.patch +++ b/patches/server/0099-Add-configurable-snowball-damage.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add configurable snowball damage diff --git a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java -index 2b4d206c0d31ba38d7b2af654bd420e85145d441..f59a2903bfb8ae591a638ea5bb387caaa93ce664 100644 +index 70961e151666a0ecf5b791853f4581eaebbdcc8b..8c853b6fbbc966ee6ba9ad3770d4e2e2a50ef388 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java @@ -58,7 +58,7 @@ public class Snowball extends ThrowableItemProjectile { @@ -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 35457d2d53d7497ab8e370b0059a67b8563e1eff..e1efcfcddacf41e516dd297b99183fe8f8aabddc 100644 +index bc28a4851dd68874042c05bed3486eace3db5963..3bbc81e6a97728b032f0097b2a88a7ff69bd18ce 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -338,6 +338,11 @@ public class PurpurWorldConfig { +@@ -337,6 +337,11 @@ public class PurpurWorldConfig { }); } diff --git a/patches/unapplied-server/0104-Changeable-Mob-Left-Handed-Chance.patch b/patches/server/0100-Changeable-Mob-Left-Handed-Chance.patch similarity index 83% rename from patches/unapplied-server/0104-Changeable-Mob-Left-Handed-Chance.patch rename to patches/server/0100-Changeable-Mob-Left-Handed-Chance.patch index 50fe607d7..3d29927e9 100644 --- a/patches/unapplied-server/0104-Changeable-Mob-Left-Handed-Chance.patch +++ b/patches/server/0100-Changeable-Mob-Left-Handed-Chance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Changeable Mob Left Handed Chance diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 0d93a8cbf15fa84f422d61adddb420ba5dcb226a..d9743c9e0026d1f858aacc6a78dc39f144360b96 100644 +index 17e6e4a858d3a2332c14d2860d2f5d1e87e1c629..7b0cb3f4d8d810b32cda964c20437fea5ea00e24 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1441,7 +1441,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -1422,7 +1422,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)); } @@ -18,10 +18,10 @@ index 0d93a8cbf15fa84f422d61adddb420ba5dcb226a..d9743c9e0026d1f858aacc6a78dc39f1 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e1efcfcddacf41e516dd297b99183fe8f8aabddc..fc218492aeca22efd869433b145699bf31e95aca 100644 +index 3bbc81e6a97728b032f0097b2a88a7ff69bd18ce..a5f51c2dff32452ad5dda0623dda90da358fe322 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -151,8 +151,10 @@ public class PurpurWorldConfig { +@@ -150,8 +150,10 @@ public class PurpurWorldConfig { } public int entityLifeSpan = 0; diff --git a/patches/unapplied-server/0105-Add-boat-fall-damage-config.patch b/patches/server/0101-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/0101-Add-boat-fall-damage-config.patch index 5d15646eb..9724e020c 100644 --- a/patches/unapplied-server/0105-Add-boat-fall-damage-config.patch +++ b/patches/server/0101-Add-boat-fall-damage-config.patch @@ -5,11 +5,11 @@ 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 aca60e21e7a191212d07a03a105fc4fb636359b2..0b57d9a2e2573bdb41c9e163d953130c3a4a1747 100644 +index 5f86f0b46e91ac41820931a9d64a7240d3ddd8d4..14640ed95dbbf99150ef1f41ff1046c2c034e552 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1182,7 +1182,16 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple - if (this.isInvulnerableTo(source)) { +@@ -1435,7 +1435,16 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple + if (this.isInvulnerableTo(world, source)) { return false; } else { - if (source.is(DamageTypeTags.IS_FALL) && getRootVehicle() instanceof net.minecraft.world.entity.vehicle.AbstractMinecart && level().purpurConfig.minecartControllable && !level().purpurConfig.minecartControllableFallDamage) return false; // Purpur @@ -27,7 +27,7 @@ index aca60e21e7a191212d07a03a105fc4fb636359b2..0b57d9a2e2573bdb41c9e163d953130c 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 fc218492aeca22efd869433b145699bf31e95aca..17df2ad9ec746736ca2968caa66a0bb1ff5a1151 100644 +index a5f51c2dff32452ad5dda0623dda90da358fe322..d5a546191014dc1cc9ed8b314c67983b0401d37b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -113,6 +113,7 @@ public class PurpurWorldConfig { @@ -36,13 +36,13 @@ index fc218492aeca22efd869433b145699bf31e95aca..17df2ad9ec746736ca2968caa66a0bb1 public boolean boatEjectPlayersOnLand = false; + public boolean boatsDoFallDamage = false; public boolean disableDropsOnCrammingDeath = false; + public double tridentLoyaltyVoidReturnHeight = 0.0D; public boolean entitiesCanUsePortals = true; - public boolean milkCuresBadOmen = true; -@@ -123,6 +124,7 @@ public class PurpurWorldConfig { +@@ -122,6 +123,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); + tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight); entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals); - milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen); diff --git a/patches/unapplied-server/0106-Snow-Golem-rate-of-fire-config.patch b/patches/server/0102-Snow-Golem-rate-of-fire-config.patch similarity index 89% rename from patches/unapplied-server/0106-Snow-Golem-rate-of-fire-config.patch rename to patches/server/0102-Snow-Golem-rate-of-fire-config.patch index 0a2201f3b..8e3542522 100644 --- a/patches/unapplied-server/0106-Snow-Golem-rate-of-fire-config.patch +++ b/patches/server/0102-Snow-Golem-rate-of-fire-config.patch @@ -10,10 +10,10 @@ If min-shoot-interval-ticks and max-shoot-interval-ticks are both set to 0, snow golems won't shoot any snowballs. diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index dc5af0b71ec82a8f22e64b03950e35845110a331..5b910b4168b7f7825916c14e402f7f00b651cd60 100644 +index bfdb0c52db44e7cc4f37fd42a22c8dae2cc28fac..3f97118c8ce4f4e9a5f2a2fc3acdc68a6828baed 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -78,7 +78,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -81,7 +81,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -23,10 +23,10 @@ index dc5af0b71ec82a8f22e64b03950e35845110a331..5b910b4168b7f7825916c14e402f7f00 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 17df2ad9ec746736ca2968caa66a0bb1ff5a1151..7cb8996240fe658fe5858f009fb1b8171c6de7de 100644 +index d5a546191014dc1cc9ed8b314c67983b0401d37b..e7a09087dc2382d7739f8955be1bfc966fbc4c70 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1685,6 +1685,10 @@ public class PurpurWorldConfig { +@@ -1684,6 +1684,10 @@ public class PurpurWorldConfig { public double snowGolemMaxHealth = 4.0D; public double snowGolemScale = 1.0D; public boolean snowGolemPutPumpkinBack = false; @@ -37,7 +37,7 @@ index 17df2ad9ec746736ca2968caa66a0bb1ff5a1151..7cb8996240fe658fe5858f009fb1b817 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1698,6 +1702,10 @@ public class PurpurWorldConfig { +@@ -1697,6 +1701,10 @@ public class PurpurWorldConfig { snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); snowGolemScale = Mth.clamp(getDouble("mobs.snow_golem.attributes.scale", snowGolemScale), 0.0625D, 16.0D); snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); diff --git a/patches/unapplied-server/0107-EMC-Configurable-disable-give-dropping.patch b/patches/server/0103-EMC-Configurable-disable-give-dropping.patch similarity index 100% rename from patches/unapplied-server/0107-EMC-Configurable-disable-give-dropping.patch rename to patches/server/0103-EMC-Configurable-disable-give-dropping.patch diff --git a/patches/unapplied-server/0108-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/patches/server/0104-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch similarity index 96% rename from patches/unapplied-server/0108-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch rename to patches/server/0104-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch index 7625a9b5b..6ee4dcf1b 100644 --- a/patches/unapplied-server/0108-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch +++ b/patches/server/0104-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch @@ -90,7 +90,7 @@ index 8508ac7de8cda3127b73e11ff4aee62502e65ead..b1544e028d5a9b84b944e1fb5a12bb16 throwHalfStack(entity, this.trades, villager); } diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java -index f000a6c1e61198e6dd06ae5f084d12fdf309f50a..3091d985ba9c55d404332576320718840538722e 100644 +index bb65d46967cb04f611b3c9c97d5732cfb21ede9b..7f4156e4690bbd57f9e9141f008851062cae733d 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java @@ -52,8 +52,13 @@ public class VillagerGoalPackages { @@ -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 37aefffb16c43221e39ef0b41a16968a560968ea..730327d560075e28f0ba316c64311297a474f0ca 100644 +index 62a1d6876ce75676c5fa381e48bc58b8ef92701b..666ab4c3c957db48783d8b891737370c3ced881c 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -226,7 +226,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -224,7 +224,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 37aefffb16c43221e39ef0b41a16968a560968ea..730327d560075e28f0ba316c64311297 } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -975,6 +975,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -940,6 +940,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean hasFarmSeeds() { return this.getInventory().hasAnyMatching((itemstack) -> { @@ -174,10 +174,10 @@ index 8734ab1bd8299bbf43906d81a349c2a13e0981a7..3ca83269311cbc18c9ef3ce62cff6a2d "farmer", PoiTypes.FARMER, diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7cb8996240fe658fe5858f009fb1b8171c6de7de..057877ee0430de3b14a3082f16e510e64f3663ae 100644 +index e7a09087dc2382d7739f8955be1bfc966fbc4c70..24855a55bc90c5b57cec3bfcf2efc36523d817f2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1905,6 +1905,8 @@ public class PurpurWorldConfig { +@@ -1904,6 +1904,8 @@ public class PurpurWorldConfig { public boolean villagerCanBeLeashed = false; public boolean villagerCanBreed = true; public int villagerBreedingTicks = 6000; @@ -186,7 +186,7 @@ index 7cb8996240fe658fe5858f009fb1b8171c6de7de..057877ee0430de3b14a3082f16e510e6 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1920,6 +1922,8 @@ public class PurpurWorldConfig { +@@ -1919,6 +1921,8 @@ public class PurpurWorldConfig { villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); diff --git a/patches/unapplied-server/0109-Toggle-for-Zombified-Piglin-death-always-counting-as.patch b/patches/server/0105-Toggle-for-Zombified-Piglin-death-always-counting-as.patch similarity index 91% rename from patches/unapplied-server/0109-Toggle-for-Zombified-Piglin-death-always-counting-as.patch rename to patches/server/0105-Toggle-for-Zombified-Piglin-death-always-counting-as.patch index 5a24292f6..befa54882 100644 --- a/patches/unapplied-server/0109-Toggle-for-Zombified-Piglin-death-always-counting-as.patch +++ b/patches/server/0105-Toggle-for-Zombified-Piglin-death-always-counting-as.patch @@ -13,7 +13,7 @@ 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 53b8f46bda60289ec310cb45513a2b729fcbea76..2756319fd1e53eca6a3dfa094d7c669014c383e9 100644 +index 650f9e1ca3a5ddec5123133c9604f33140e948a8..cb47b15d197b1167dcbac1b989903bbf84b079b4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java @@ -148,7 +148,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @@ -35,10 +35,10 @@ index 53b8f46bda60289ec310cb45513a2b729fcbea76..2756319fd1e53eca6a3dfa094d7c6690 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 057877ee0430de3b14a3082f16e510e64f3663ae..43f98be23b7da635f168b123f7e47c005707be77 100644 +index 24855a55bc90c5b57cec3bfcf2efc36523d817f2..71b5f351c539584ccb1d215b7d4dce3e4541ac41 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2171,6 +2171,7 @@ public class PurpurWorldConfig { +@@ -2170,6 +2170,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyOnlyBaby = true; public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; @@ -46,7 +46,7 @@ index 057877ee0430de3b14a3082f16e510e64f3663ae..43f98be23b7da635f168b123f7e47c00 private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -2186,5 +2187,6 @@ public class PurpurWorldConfig { +@@ -2185,5 +2186,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/0106-Configurable-chance-for-wolves-to-spawn-rabid.patch similarity index 89% rename from patches/unapplied-server/0110-Configurable-chance-for-wolves-to-spawn-rabid.patch rename to patches/server/0106-Configurable-chance-for-wolves-to-spawn-rabid.patch index 4ec654dec..250f26105 100644 --- a/patches/unapplied-server/0110-Configurable-chance-for-wolves-to-spawn-rabid.patch +++ b/patches/server/0106-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 0647cee2d6a7c847ab923f819a092c9004eabc6c..d159d573d5f87c31cf61baacbaae193d24ab6801 100644 +index bbdc5eb28c2be570866070d2d055a97721f46d94..54effd4230d1b231ef94a3e3948a535e6ba15537 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -107,6 +107,37 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder(this, Llama.class, 24.0F, 1.5D, 1.5D)); @@ -87,7 +87,7 @@ index 0647cee2d6a7c847ab923f819a092c9004eabc6c..d159d573d5f87c31cf61baacbaae193d 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)); -@@ -180,7 +236,7 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder(this, Player.class, 10, true, false, this::isAngryAt)); @@ -96,7 +96,7 @@ index 0647cee2d6a7c847ab923f819a092c9004eabc6c..d159d573d5f87c31cf61baacbaae193d 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)); -@@ -229,6 +285,7 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder { nbt.putString("variant", resourcekey.location().toString()); }); -@@ -246,6 +303,10 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder implements +@@ -341,6 +341,7 @@ public class ChestBlock extends AbstractChestBlock implements } public static boolean isBlockedChestByBlock(BlockGetter world, BlockPos pos) { @@ -17,10 +17,10 @@ index 0b27baf10770cb3077c4e75da55209689d614513..485ea9892f257c6843db23bca43f9fdc return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4dce5107ed9a2ae1148ccc5c51ec54d57426cb83..a83719bd540910f799997e6593356d56bd097c42 100644 +index 947c0405fd4e695509597cfa54f5307fc9fc5add..0fb7337e34d172d28172f2836432e4ff24769765 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -375,6 +375,11 @@ public class PurpurWorldConfig { +@@ -374,6 +374,11 @@ public class PurpurWorldConfig { } } diff --git a/patches/unapplied-server/0114-Implement-TPSBar.patch b/patches/server/0110-Implement-TPSBar.patch similarity index 93% rename from patches/unapplied-server/0114-Implement-TPSBar.patch rename to patches/server/0110-Implement-TPSBar.patch index 5224c15a0..9a6bbb1d7 100644 --- a/patches/unapplied-server/0114-Implement-TPSBar.patch +++ b/patches/server/0110-Implement-TPSBar.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Implement TPSBar diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 09e3c9dd08b6a5765d76390b2c8f62200fd3e27c..286f141255984dddbc3252304d6c11b0647cbbf4 100644 +index 24c2568db30f970aed1a4897cfbc7d07297047d3..5d94b71bd54f99040b76cca74964a32d55339767 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -253,6 +253,7 @@ public class Commands { +@@ -258,6 +258,7 @@ public class Commands { org.purpurmc.purpur.command.CreditsCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur @@ -17,10 +17,10 @@ index 09e3c9dd08b6a5765d76390b2c8f62200fd3e27c..286f141255984dddbc3252304d6c11b0 if (environment.includeIntegrated) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index f514c421b5ff7e46b2d211f895dcb0d7a375704f..b14bfa10927c1e0e93f1c3515947077f11eb3ece 100644 +index d5efd5fdbf0acc89de3790f30b9739809f0a02d4..6bc6d24022c4f5ea3b7da7074725737fae341fcf 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1137,6 +1137,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop byteAllowed) { diff --git a/patches/unapplied-server/0117-Full-netherite-armor-grants-fire-resistance.patch b/patches/server/0113-Full-netherite-armor-grants-fire-resistance.patch similarity index 85% rename from patches/unapplied-server/0117-Full-netherite-armor-grants-fire-resistance.patch rename to patches/server/0113-Full-netherite-armor-grants-fire-resistance.patch index eae8e921f..c3f0820ce 100644 --- a/patches/unapplied-server/0117-Full-netherite-armor-grants-fire-resistance.patch +++ b/patches/server/0113-Full-netherite-armor-grants-fire-resistance.patch @@ -5,11 +5,11 @@ 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 9dd8dc8f0dc218c5a021d84649f364cd2f1b3a45..33c1b2b387e7412a001841d1bcbb3966c188c1a3 100644 +index 773be9c116a664e4d0349c58c00df34f203f8ebf..00b3e300c0d43f7791c9d5f83a7901304f6464f5 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -387,6 +387,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 +@@ -397,6 +397,16 @@ public abstract class Player extends LivingEntity { + super.onInsideBubbleColumn(drag); } + // Purpur start @@ -24,12 +24,12 @@ index 9dd8dc8f0dc218c5a021d84649f364cd2f1b3a45..33c1b2b387e7412a001841d1bcbb3966 + // Purpur end } - protected ItemCooldowns createItemCooldowns() { + private void turtleHelmetTick() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cef84202cfd5a74a722994be58c46619ae7cb951..38a3ea0784a0797f26b8d3b9adb1d825b0c8058b 100644 +index b02c2aa15bbfd3b917476f0fd296612d548d450f..b236fdc1f7cfcf9be6ab2486e53025123b950106 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -284,6 +284,19 @@ public class PurpurWorldConfig { +@@ -283,6 +283,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/0114-Add-mobGriefing-bypass-to-everything-affected.patch similarity index 64% rename from patches/unapplied-server/0118-Add-mobGriefing-bypass-to-everything-affected.patch rename to patches/server/0114-Add-mobGriefing-bypass-to-everything-affected.patch index 714091ed8..067595236 100644 --- a/patches/unapplied-server/0118-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/patches/server/0114-Add-mobGriefing-bypass-to-everything-affected.patch @@ -5,31 +5,31 @@ 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 cd2775bf0b59056a8329b1e7e2649f4b3cd92b2a..4f172f9a0ec61a10b0b1411b9d0eb82d49bd0c57 100644 +index 06ccf6daaf5e7affe505c75cdbf85c1c29c3ebf9..7c60a938850e5db62022217168a075e2b88fa22d 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1857,7 +1857,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1886,7 +1886,7 @@ public abstract class LivingEntity extends Entity implements Attackable { boolean flag = false; if (this.dead && adversary instanceof WitherBoss) { // Paper -- if (this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (this.level().purpurConfig.witherBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur +- if (worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (worldserver.purpurConfig.witherBypassMobGriefing || worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur BlockPos blockposition = this.blockPosition(); 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 d9743c9e0026d1f858aacc6a78dc39f144360b96..70ace6f2a42c0d4181cb22a08dd923bd77c08295 100644 +index 7b0cb3f4d8d810b32cda964c20437fea5ea00e24..bc2beee267f535e23bd804d415019bab5ee2fd88 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -707,7 +707,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab - public void aiStep() { - super.aiStep(); - this.level().getProfiler().push("looting"); -- if (!this.level().isClientSide && this.canPickUpLoot() && this.isAlive() && !this.dead && this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!this.level().isClientSide && this.canPickUpLoot() && this.isAlive() && !this.dead && (this.level().purpurConfig.entitiesPickUpLootBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { - Vec3i baseblockposition = this.getPickupReach(); - List list = this.level().getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ())); - Iterator iterator = list.iterator(); +@@ -704,7 +704,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + Level world = this.level(); + + if (world instanceof ServerLevel worldserver) { +- if (this.canPickUpLoot() && this.isAlive() && !this.dead && worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (this.canPickUpLoot() && this.isAlive() && !this.dead && (worldserver.purpurConfig.entitiesPickUpLootBypassMobGriefing || worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // Purpur + Vec3i baseblockposition = this.getPickupReach(); + List list = this.level().getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ())); + Iterator iterator = list.iterator(); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java index 4fa4ec34963730507253182cad1c2bf04090ad50..8d4e206aa05b95b7bfec5d23496085cf55a3e1de 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java @@ -44,28 +44,28 @@ index 4fa4ec34963730507253182cad1c2bf04090ad50..8d4e206aa05b95b7bfec5d23496085cf } else if (entity.getVillagerData().getProfession() != VillagerProfession.FARMER && !(world.purpurConfig.villagerClericsFarmWarts && entity.getVillagerData().getProfession() == VillagerProfession.CLERIC)) { // Purpur return false; diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java -index a85885ee51df585fa11ae9f8fcd67ff2a71c5a18..d81509e08e70ec5b2f837c9dc66b1254c86854e4 100644 +index 7324da6b7dd2623ce394e3827ff77ef684a3b98b..4b7cfca51ced0f781561ecd68484de4adb23e082 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java -@@ -32,7 +32,7 @@ public class BreakDoorGoal extends DoorInteractGoal { +@@ -33,7 +33,7 @@ public class BreakDoorGoal extends DoorInteractGoal { @Override public boolean canUse() { -- return !super.canUse() ? false : (!this.mob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.isValidDifficulty(this.mob.level().getDifficulty()) && !this.isOpen()); -+ return !super.canUse() ? false : ((!this.mob.level().purpurConfig.zombieBypassMobGriefing && !this.mob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) ? false : this.isValidDifficulty(this.mob.level().getDifficulty()) && !this.isOpen()); // Purpur +- return !super.canUse() ? false : (!getServerLevel((Entity) this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.isValidDifficulty(this.mob.level().getDifficulty()) && !this.isOpen()); ++ return !super.canUse() ? false : ((!this.mob.level().purpurConfig.zombieBypassMobGriefing && !getServerLevel((Entity) this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) ? false : this.isValidDifficulty(this.mob.level().getDifficulty()) && !this.isOpen()); // Purpur } @Override diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java -index 4e2c23ccdf4e4a4d65b291dbe20952bae1838bff..0da884a833f6c707fea512e826658c3bb73f7a77 100644 +index 32bb591371fe78ba10a2bc52389ef33978cbc0eb..f3697510974be0c3cfdb0e2179d89c8109152829 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java @@ -74,7 +74,7 @@ public class EatBlockGoal extends Goal { final BlockState blockState = this.level.getBlockState(blockposition); // Paper - fix wrong block state if (EatBlockGoal.IS_TALL_GRASS.test(blockState)) { // Paper - fix wrong block state -- if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, blockState.getFluidState().createLegacyBlock(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state -+ if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, blockState.getFluidState().createLegacyBlock(), !this.level.purpurConfig.sheepBypassMobGriefing && !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state // Purpur +- if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state ++ if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).purpurConfig.sheepBypassMobGriefing && !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state // Purpur this.level.destroyBlock(blockposition, false); } @@ -73,103 +73,103 @@ index 4e2c23ccdf4e4a4d65b291dbe20952bae1838bff..0da884a833f6c707fea512e826658c3b BlockPos blockposition1 = blockposition.below(); if (this.level.getBlockState(blockposition1).is(Blocks.GRASS_BLOCK)) { -- if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.DIRT.defaultBlockState(), !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state -+ if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.DIRT.defaultBlockState(), !this.level.purpurConfig.sheepBypassMobGriefing && !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state // Purpur +- if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state ++ if (CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockposition1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).purpurConfig.sheepBypassMobGriefing && !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state // Purpur this.level.levelEvent(2001, blockposition1, Block.getId(Blocks.GRASS_BLOCK.defaultBlockState())); this.level.setBlock(blockposition1, Blocks.DIRT.defaultBlockState(), 2); } diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java -index 6634228ef002cbef67980272a26be4a75c954116..a61abba840a55fb4fbc9716a5e05eb2778068785 100644 +index 9d245d08be61d7edee9138196ae3bf52023e3993..d002acdac893e2744cde5f1145d29ac2c8ff6959 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java -@@ -40,7 +40,7 @@ public class RemoveBlockGoal extends MoveToBlockGoal { +@@ -41,7 +41,7 @@ public class RemoveBlockGoal extends MoveToBlockGoal { @Override public boolean canUse() { -- if (!this.removerMob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!this.removerMob.level().purpurConfig.zombieBypassMobGriefing && !this.removerMob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur +- if (!getServerLevel((Entity) this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (!getServerLevel((Entity) this.removerMob).purpurConfig.zombieBypassMobGriefing && !getServerLevel((Entity) this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur return false; } 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 252df18c369d5e556632ed5a287dab04e4e9b58d..6c56c51a89928ba52b1fb5f66f6169fa94fffed0 100644 +index 56b2e83285f02581d03746246f370f18fc0f3c3f..dfff1b51544476dffccfd6bfa016cf57b9c1c081 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -1385,7 +1385,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -1370,7 +1370,7 @@ public class Fox extends Animal implements VariantHolder { } protected void onReachedTarget() { -- if (Fox.this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (Fox.this.level().purpurConfig.foxBypassMobGriefing || Fox.this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur +- if (getServerLevel(Fox.this.level()).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (getServerLevel(Fox.this.level()).purpurConfig.foxBypassMobGriefing || getServerLevel(Fox.this.level()).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur BlockState iblockdata = Fox.this.level().getBlockState(this.blockPos); 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 7e509458134340bd05d15f5f51b6d1fce3206d6a..db9ed247a2a2c2316a9dcc06a8961345c40752a9 100644 +index 629a0729cae629dea89fdf491afa9eed96e7a38a..2281f08f07ec4d820586883ef7378883344a4f27 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -636,7 +636,7 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -634,7 +634,7 @@ public class Rabbit extends Animal implements VariantHolder { @Override public boolean canUse() { if (this.nextStartTick <= 0) { -- if (!this.rabbit.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!this.rabbit.level().purpurConfig.rabbitBypassMobGriefing && !this.rabbit.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur +- if (!getServerLevel((Entity) this.rabbit).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (!getServerLevel((Entity) this.rabbit).purpurConfig.rabbitBypassMobGriefing && !getServerLevel((Entity) this.rabbit).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur return false; } diff --git a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -index 5b910b4168b7f7825916c14e402f7f00b651cd60..09be2e9651a736bf44f3f06f1d4e6a5b4dcf230b 100644 +index 3f97118c8ce4f4e9a5f2a2fc3acdc68a6828baed..59fe12a265523f3f1e3568216b703abcff27f4cc 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -126,7 +126,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - this.hurt(this.damageSources().melting(), 1.0F); // CraftBukkit - DamageSources.ON_FIRE -> CraftEventFactory.MELTING +@@ -131,7 +131,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM + this.hurtServer(worldserver, this.damageSources().melting(), 1.0F); // CraftBukkit - DamageSources.ON_FIRE -> CraftEventFactory.MELTING } -- if (!this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!this.level().purpurConfig.snowGolemBypassMobGriefing && !this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur +- if (!worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (!worldserver.purpurConfig.snowGolemBypassMobGriefing && !worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur return; } 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 cc5fd3d020187adcbd20d4947beb353b291bdfd1..f80319504d70580f977acccd935af489f7d8f712 100644 +index f356110850dd71d066243ec29853f547d94e4400..0462718041e34bdc9fc3cdee1a2c9bd000686718 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 -@@ -621,7 +621,7 @@ public class EnderDragon extends Mob implements Enemy { - BlockState iblockdata = this.level().getBlockState(blockposition); +@@ -591,7 +591,7 @@ public class EnderDragon extends Mob implements Enemy { + BlockState iblockdata = world.getBlockState(blockposition); if (!iblockdata.isAir() && !iblockdata.is(BlockTags.DRAGON_TRANSPARENT)) { -- if (this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !iblockdata.is(BlockTags.DRAGON_IMMUNE)) { -+ if ((this.level().purpurConfig.enderDragonBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && !iblockdata.is(BlockTags.DRAGON_IMMUNE)) { // Purpur +- if (world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !iblockdata.is(BlockTags.DRAGON_IMMUNE)) { ++ if ((world.purpurConfig.enderDragonBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && !iblockdata.is(BlockTags.DRAGON_IMMUNE)) { // Purpur // CraftBukkit start - Add blocks to list rather than destroying them - // flag1 = this.level().removeBlock(blockposition, false) || flag1; + // flag1 = worldserver.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 0d753a16c77251b421735f9e38202af00baf46f9..24677d1a9750f5757a983c4f6ecef42a442932c6 100644 +index 2ec12ec298446b556132785d4d376130594a7cb6..6b499d59ab27869a74ee1e3b3f777cbda9e4d53b 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 -@@ -502,7 +502,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -492,7 +492,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { if (this.destroyBlocksTick > 0) { --this.destroyBlocksTick; -- if (this.destroyBlocksTick == 0 && this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (this.destroyBlocksTick == 0 && (this.level().purpurConfig.witherBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // Purpur +- if (this.destroyBlocksTick == 0 && world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (this.destroyBlocksTick == 0 && (world.purpurConfig.witherBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // Purpur boolean flag = false; 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 3348b5a9e4e00ef7f4dabe10d0fe0a9c0456dbd7..e71db58a2824d0a6a8df1a3d13ad5ac14604ad99 100644 +index 3a37ff8bd8ca792393fa10fed4d38eb72559d4db..262350aaed5070a9353ba15726bba197df3b9de0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -535,7 +535,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -516,7 +516,15 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur -- return this.enderman.getCarriedBlock() == null ? false : (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0); +- return this.enderman.getCarriedBlock() == null ? false : (!getServerLevel((Entity) this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0); + // Purpur start + if (this.enderman.getCarriedBlock() == null) { + return false; + } -+ if (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !this.enderman.level().purpurConfig.endermanBypassMobGriefing) { ++ if (!getServerLevel((Entity) this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !this.enderman.level().purpurConfig.endermanBypassMobGriefing) { + return false; + } + return this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0; @@ -177,16 +177,16 @@ index 3348b5a9e4e00ef7f4dabe10d0fe0a9c0456dbd7..e71db58a2824d0a6a8df1a3d13ad5ac1 } @Override -@@ -581,7 +589,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -562,7 +570,15 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur -- return this.enderman.getCarriedBlock() != null ? false : (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0); +- return this.enderman.getCarriedBlock() != null ? false : (!getServerLevel((Entity) this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0); + // Purpur start + if (this.enderman.getCarriedBlock() != null) { + return false; + } -+ if (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !this.enderman.level().purpurConfig.endermanBypassMobGriefing) { ++ if (!getServerLevel((Entity) this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !this.enderman.level().purpurConfig.endermanBypassMobGriefing) { + return false; + } + return this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0; @@ -195,177 +195,178 @@ index 3348b5a9e4e00ef7f4dabe10d0fe0a9c0456dbd7..e71db58a2824d0a6a8df1a3d13ad5ac1 @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 8aa91f45d3a863308ce1fce1fde40a6c9a2042db..a7976b5d8548277061aa6a4e1147922e283d5a7d 100644 +index 72d855a22e1507ad5f735df17db820c9b3fb2251..371a3db041ae8990c0a2a7c5e1702ba83712fcdc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -365,7 +365,7 @@ public class Evoker extends SpellcasterIllager { - return false; - } else if (Evoker.this.tickCount < this.nextAttackTickCount) { - return false; -- } else if (!Evoker.this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ } else if (!Evoker.this.level().purpurConfig.evokerBypassMobGriefing && !Evoker.this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - return false; +@@ -367,7 +367,7 @@ public class Evoker extends SpellcasterIllager { } else { - List list = Evoker.this.level().getNearbyEntities(Sheep.class, this.wololoTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0D, 4.0D, 16.0D)); + ServerLevel worldserver = getServerLevel(Evoker.this.level()); + +- if (!worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (!worldserver.purpurConfig.evokerBypassMobGriefing && !worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur + return false; + } else { + List list = worldserver.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 f3b57f58738d7cb84bd25f0ce7752ce859f03c96..5d9e85b22c0fe8d0b9d9fc06fc1f3cd170931e17 100644 +index fdf30a72c6c1bf4024592dc3071fc101256a1138..83fcf23077721fcc976fc0cd3a4a18ba4f05e1e5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -170,7 +170,7 @@ public class Ravager extends Raider { - this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1D, d1, d0)); - } +@@ -184,7 +184,7 @@ public class Ravager extends Raider { + if (world instanceof ServerLevel) { + ServerLevel worldserver = (ServerLevel) world; -- if (this.horizontalCollision && this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (this.horizontalCollision && (this.level().purpurConfig.ravagerBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // Purpur - boolean flag = false; - AABB axisalignedbb = this.getBoundingBox().inflate(0.2D); - Iterator iterator = BlockPos.betweenClosed(Mth.floor(axisalignedbb.minX), Mth.floor(axisalignedbb.minY), Mth.floor(axisalignedbb.minZ), Mth.floor(axisalignedbb.maxX), Mth.floor(axisalignedbb.maxY), Mth.floor(axisalignedbb.maxZ)).iterator(); +- if (this.horizontalCollision && worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (this.horizontalCollision && (worldserver.purpurConfig.ravagerBypassMobGriefing || worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // Purpur + boolean flag = false; + AABB axisalignedbb = this.getBoundingBox().inflate(0.2D); + Iterator iterator = BlockPos.betweenClosed(Mth.floor(axisalignedbb.minX), Mth.floor(axisalignedbb.minY), Mth.floor(axisalignedbb.minZ), Mth.floor(axisalignedbb.maxX), Mth.floor(axisalignedbb.maxY), Mth.floor(axisalignedbb.maxZ)).iterator(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -index e59ee35faa8b4ec35021074ce67666569c27da63..4325dc4889fb4c514798b85ef4d06725b0c5faa7 100644 +index c31a72bad0b75940ea550acf47fab2220ff669ff..01c4627c4879389bcd0a328e00c0471ef38f60d6 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -@@ -194,7 +194,7 @@ public class Silverfish extends Monster { +@@ -197,7 +197,7 @@ public class Silverfish extends Monster { continue; } // CraftBukkit end -- if (world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (world.purpurConfig.silverfishBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur +- if (getServerLevel(world).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (getServerLevel(world).purpurConfig.silverfishBypassMobGriefing || getServerLevel(world).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur world.destroyBlock(blockposition1, true, this.silverfish); } else { world.setBlock(blockposition1, ((InfestedBlock) block).hostStateByInfested(world.getBlockState(blockposition1)), 3); -@@ -232,7 +232,7 @@ public class Silverfish extends Monster { +@@ -235,7 +235,7 @@ public class Silverfish extends Monster { } else { RandomSource randomsource = this.mob.getRandom(); -- if (this.mob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && randomsource.nextInt(reducedTickDelay(10)) == 0) { -+ if ((this.mob.level().purpurConfig.silverfishBypassMobGriefing || this.mob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && randomsource.nextInt(reducedTickDelay(10)) == 0) { // Purpur +- if (getServerLevel((Entity) this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && randomsource.nextInt(reducedTickDelay(10)) == 0) { ++ if (getServerLevel((Entity) this.mob).purpurConfig.silverfishBypassMobGriefing || getServerLevel((Entity) this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && randomsource.nextInt(reducedTickDelay(10)) == 0) { // Purpur this.selectedDirection = Direction.getRandom(randomsource); 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 65bb3045cd74ef1695eb8c1edd71f8b72b2d9378..ed312ed8c668ee6b02ae6e89b5a44bb4fe6d4b48 100644 +index 33326839175d2826eaa61eb7bc1e110d1ff6bc94..18d4a90bef46522e12e79e03c466910fbb703f6d 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 -@@ -413,7 +413,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -429,7 +429,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override - public boolean wantsToPickUp(ItemStack stack) { -- return this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); -+ return (this.level().purpurConfig.piglinBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); + public boolean wantsToPickUp(ServerLevel world, ItemStack stack) { +- return world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); ++ return (world.purpurConfig.piglinBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur } 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 28a65f2a9ef441ae96a7a635e0695b14ce2ee367..7b6c58a31d37896daccb5f570d3cb9247cea2cd6 100644 +index 2f00676f62478897ae4931ea06e047567c407535..6bd6113cabfae068aa421991f0a9016419f20349 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java -@@ -23,20 +23,20 @@ public class LargeFireball extends Fireball { +@@ -23,13 +23,13 @@ public class LargeFireball extends Fireball { public LargeFireball(EntityType type, Level world) { super(type, world); -- 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 +- this.isIncendiary = (world instanceof ServerLevel worldserver) && worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit ++ this.isIncendiary = (world instanceof ServerLevel worldserver) && (worldserver.purpurConfig.fireballsBypassMobGriefing || worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)); // CraftBukkit // Purpur } 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 +- this.isIncendiary = (world instanceof ServerLevel worldserver) && worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit ++ this.isIncendiary = (world instanceof ServerLevel worldserver) && (worldserver.purpurConfig.fireballsBypassMobGriefing || worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)); // CraftBukkit // Purpur } @Override - protected void onHit(HitResult hitResult) { - super.onHit(hitResult); - if (!this.level().isClientSide) { -- boolean flag = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -+ boolean flag = this.level().purpurConfig.fireballsBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur +@@ -38,7 +38,7 @@ public class LargeFireball extends Fireball { + Level world = this.level(); + + if (world instanceof ServerLevel worldserver) { +- boolean flag = worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); ++ boolean flag = worldserver.purpurConfig.fireballsBypassMobGriefing || worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur // 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 710e67ff9c57a6b1dc46abf5de98d54da1410136..9ededdbb5db39e9dff7376d80e93f41e93efdf5d 100644 +index 49c0f09f91f9ea2428fd3b13b00c99073074beba..b0e258d6025dd9536f1656e087bf85fee60e642d 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -394,7 +394,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { - public boolean mayInteract(Level world, BlockPos pos) { +@@ -479,7 +479,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { + public boolean mayInteract(ServerLevel world, BlockPos pos) { Entity entity = this.getOwner(); - return entity instanceof Player ? entity.mayInteract(world, pos) : entity == null || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); + return entity instanceof Player ? entity.mayInteract(world, pos) : entity == null || world.purpurConfig.projectilesBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); } - public boolean mayBreak(Level world) { + public boolean mayBreak(ServerLevel 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 1711ad457e7d1233fd32edc3e9e3b9f1e3be9980..554d3c4db6ed07e3d12af23a9a18c28480bf77c0 100644 +index bb159ea4baf208aab6d6fcfbbddacd5b089b55c8..69dd29ed5e3cb37180b65183b0a83c8619d8e9a0 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java @@ -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); -+ this.isIncendiary = this.level().purpurConfig.fireballsBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur +- this.isIncendiary = (world instanceof ServerLevel worldserver) && worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); ++ this.isIncendiary = (world instanceof ServerLevel worldserver) && (worldserver.purpurConfig.fireballsBypassMobGriefing || worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)); // Purpur } // 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 bbf21ea433f9e3963aac0ede597ed8d3c8e50ed8..06487fc9ea416d8256e0c2cd1969d4e0283ffb05 100644 +index ab132041982df2a701e4baea8195873f31b4a5fb..4ef87acec025c6eb706fd8845663aa4f415efb29 100644 --- a/src/main/java/net/minecraft/world/entity/raid/Raider.java +++ b/src/main/java/net/minecraft/world/entity/raid/Raider.java -@@ -299,7 +299,7 @@ public abstract class Raider extends PatrollingMonster { - - @Override - public boolean canUse() { -- 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(); +@@ -345,7 +345,7 @@ public abstract class Raider extends PatrollingMonster { + } - 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)))) { + private boolean cannotPickUpBanner() { +- if (!getServerLevel(this.mob).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 && !getServerLevel(this.mob).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 + if (!this.mob.hasActiveRaid()) { + return true; + } else if (this.mob.getCurrentRaid().isOver()) { diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java -index 112d2feba5f75a2a873b595617780515945c10e4..2af4c365743b2956939335512f74e0a1d84298f7 100644 +index 1ada5ed825501666addacf527a513ab7bd4a3a58..d1efd728f0660b77361fa4f9c2bf5f2e654be0d2 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java -@@ -179,7 +179,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { - @Override +@@ -180,7 +180,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { protected void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent -- if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit -+ if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), (!world.purpurConfig.ravagerBypassMobGriefing && !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)))) { // CraftBukkit // Purpur - world.destroyBlock(pos, true, entity); + if (world instanceof ServerLevel worldserver) { +- if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit ++ if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), (!world.purpurConfig.ravagerBypassMobGriefing && !worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)))) { // CraftBukkit // Purpur + worldserver.destroyBlock(pos, true, entity); + } } - diff --git a/src/main/java/net/minecraft/world/level/block/FarmBlock.java b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -index dc356bd0931af9bdab9ec71e3de66e88a67375ad..99798220b6e0ad06db2ba5c9b74bfb72af185fee 100644 +index e744a117d2f25ad24c87263ba2ab7f760b6e594d..e1abec46177887a92726de80f66226fe7fbbb4a2 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -@@ -111,7 +111,7 @@ public class FarmBlock extends Block { - @Override +@@ -112,7 +112,7 @@ public class FarmBlock extends Block { public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { super.fallOn(world, state, pos, entity, fallDistance); // CraftBukkit - moved here as game rules / events shouldn't affect fall damage. -- if (!world.isClientSide && world.random.nextFloat() < fallDistance - 0.5F && entity instanceof LivingEntity && (entity instanceof Player || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && entity.getBbWidth() * entity.getBbWidth() * entity.getBbHeight() > 0.512F) { -+ if (!world.isClientSide && world.random.nextFloat() < fallDistance - 0.5F && entity instanceof LivingEntity && (entity instanceof Player || world.purpurConfig.farmlandBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && entity.getBbWidth() * entity.getBbWidth() * entity.getBbHeight() > 0.512F) { // Purpur - // CraftBukkit start - Interact soil - org.bukkit.event.Cancellable cancellable; - if (entity instanceof Player) { + if (world instanceof ServerLevel worldserver) { +- if (world.random.nextFloat() < fallDistance - 0.5F && entity instanceof LivingEntity && (entity instanceof Player || worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && entity.getBbWidth() * entity.getBbWidth() * entity.getBbHeight() > 0.512F) { ++ if (world.random.nextFloat() < fallDistance - 0.5F && entity instanceof LivingEntity && (entity instanceof Player || worldserver.purpurConfig.farmlandBypassMobGriefing || worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) && entity.getBbWidth() * entity.getBbWidth() * entity.getBbHeight() > 0.512F) { // Purpur + // CraftBukkit start - Interact soil + org.bukkit.event.Cancellable cancellable; + if (entity instanceof Player) { diff --git a/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java b/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java -index a6e6545402904141ffc6218a0158b0e9c67217c8..5eac1a54398dfa5571b98fb6eefca9d2bf9b2793 100644 +index 53f1a7ed6b4bd6e2d8460531226aabf249994c02..19a403ac19695ed6984c42f83c4698ffcc6ac2b7 100644 --- a/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java +++ b/src/main/java/net/minecraft/world/level/block/PowderSnowBlock.java -@@ -80,7 +80,7 @@ public class PowderSnowBlock extends Block implements BucketPickup { - if (!world.isClientSide) { +@@ -76,7 +76,7 @@ public class PowderSnowBlock extends Block implements BucketPickup { + if (world instanceof ServerLevel worldserver) { // CraftBukkit start - if (entity.isOnFire() && entity.mayInteract(world, pos)) { -- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !(world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity instanceof Player))) { -+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !((world.purpurConfig.powderSnowBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) || entity instanceof Player))) { + if (entity.isOnFire() && entity.mayInteract(worldserver, pos)) { +- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !(worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity instanceof Player))) { ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !((worldserver.purpurConfig.powderSnowBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) || entity instanceof Player))) { // Purpur return; } // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -index c7377d04ceac3ea624117439783a443c6d6f6d08..0c732cfbd9ce50198a3f85ae8ef2263d7ae0bc1a 100644 +index bae4931fff0db56aa125248e17b29f7c2557221f..4eb0f7a9cf6b12c02d0bd42980ae302dd56c1b8a 100644 --- a/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/src/main/java/net/minecraft/world/level/block/TurtleEggBlock.java -@@ -221,7 +221,7 @@ public class TurtleEggBlock extends Block { +@@ -222,7 +222,7 @@ public class TurtleEggBlock extends Block { } if (entity instanceof Player) return true; @@ -375,34 +376,30 @@ index c7377d04ceac3ea624117439783a443c6d6f6d08..0c732cfbd9ce50198a3f85ae8ef2263d } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550a95f2f49 100644 +index b236fdc1f7cfcf9be6ab2486e53025123b950106..b1d63425dc952c0ee0b3bd371a0910787ce628b7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -116,8 +116,11 @@ public class PurpurWorldConfig { - public boolean boatsDoFallDamage = false; - public boolean disableDropsOnCrammingDeath = false; - public boolean entitiesCanUsePortals = true; +@@ -120,6 +120,9 @@ public class PurpurWorldConfig { + public int raidCooldownSeconds = 0; + public int animalBreedingCooldownSeconds = 0; + public boolean persistentDroppableEntityDisplayNames = true; + public boolean entitiesPickUpLootBypassMobGriefing = false; + public boolean fireballsBypassMobGriefing = false; - public boolean milkCuresBadOmen = true; - public boolean persistentDroppableEntityDisplayNames = true; + public boolean projectilesBypassMobGriefing = false; - public double tridentLoyaltyVoidReturnHeight = 0.0D; - public int raidCooldownSeconds = 0; - public int animalBreedingCooldownSeconds = 0; -@@ -127,8 +130,11 @@ public class PurpurWorldConfig { - 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); + private void miscGameplayMechanicsSettings() { + useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); + boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); +@@ -130,6 +133,9 @@ public class PurpurWorldConfig { + raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds); + animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds); + persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames); + 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); - persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames); + projectilesBypassMobGriefing = getBoolean("gameplay-mechanics.projectiles-bypass-mob-griefing", projectilesBypassMobGriefing); - tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight); - raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds); - animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds); -@@ -400,9 +406,11 @@ public class PurpurWorldConfig { + + } + +@@ -399,9 +405,11 @@ public class PurpurWorldConfig { dispenserPlaceAnvils = getBoolean("blocks.dispenser.place-anvils", dispenserPlaceAnvils); } @@ -414,7 +411,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow); farmlandAlpha = getBoolean("blocks.farmland.use-alpha-farmland", farmlandAlpha); } -@@ -427,6 +435,11 @@ public class PurpurWorldConfig { +@@ -426,6 +434,11 @@ public class PurpurWorldConfig { lavaSpeedNotNether = getInt("blocks.lava.speed.not-nether", lavaSpeedNotNether); } @@ -426,7 +423,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 public boolean respawnAnchorExplode = true; public double respawnAnchorExplosionPower = 5.0D; public boolean respawnAnchorExplosionFire = true; -@@ -456,10 +469,12 @@ public class PurpurWorldConfig { +@@ -455,10 +468,12 @@ public class PurpurWorldConfig { public boolean turtleEggsBreakFromExpOrbs = false; public boolean turtleEggsBreakFromItems = false; public boolean turtleEggsBreakFromMinecarts = false; @@ -439,7 +436,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public int waterInfiniteRequiredSources = 2; -@@ -744,6 +759,7 @@ public class PurpurWorldConfig { +@@ -743,6 +758,7 @@ public class PurpurWorldConfig { public double creeperScale = 1.0D; public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; @@ -447,7 +444,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -757,6 +773,7 @@ public class PurpurWorldConfig { +@@ -756,6 +772,7 @@ public class PurpurWorldConfig { creeperScale = Mth.clamp(getDouble("mobs.creeper.attributes.scale", creeperScale), 0.0625D, 16.0D); creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); @@ -455,7 +452,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean dolphinRidable = false; -@@ -857,6 +874,7 @@ public class PurpurWorldConfig { +@@ -856,6 +873,7 @@ public class PurpurWorldConfig { public double enderDragonMaxY = 320D; public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; @@ -463,7 +460,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -873,6 +891,7 @@ public class PurpurWorldConfig { +@@ -872,6 +890,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 +468,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean endermanRidable = false; -@@ -882,6 +901,7 @@ public class PurpurWorldConfig { +@@ -881,6 +900,7 @@ public class PurpurWorldConfig { public double endermanScale = 1.0D; public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; @@ -479,7 +476,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -895,6 +915,7 @@ public class PurpurWorldConfig { +@@ -894,6 +914,7 @@ public class PurpurWorldConfig { endermanScale = Mth.clamp(getDouble("mobs.enderman.attributes.scale", endermanScale), 0.0625D, 16.0D); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); @@ -487,7 +484,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean endermiteRidable = false; -@@ -920,6 +941,7 @@ public class PurpurWorldConfig { +@@ -919,6 +940,7 @@ public class PurpurWorldConfig { public boolean evokerControllable = true; public double evokerMaxHealth = 24.0D; public double evokerScale = 1.0D; @@ -495,7 +492,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -931,6 +953,7 @@ public class PurpurWorldConfig { +@@ -930,6 +952,7 @@ public class PurpurWorldConfig { } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); evokerScale = Mth.clamp(getDouble("mobs.evoker.attributes.scale", evokerScale), 0.0625D, 16.0D); @@ -503,7 +500,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean foxRidable = false; -@@ -940,6 +963,7 @@ public class PurpurWorldConfig { +@@ -939,6 +962,7 @@ public class PurpurWorldConfig { public double foxScale = 1.0D; public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; @@ -511,7 +508,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -953,6 +977,7 @@ public class PurpurWorldConfig { +@@ -952,6 +976,7 @@ public class PurpurWorldConfig { foxScale = Mth.clamp(getDouble("mobs.fox.attributes.scale", foxScale), 0.0625D, 16.0D); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); @@ -519,7 +516,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean frogRidable = false; -@@ -1429,6 +1454,7 @@ public class PurpurWorldConfig { +@@ -1428,6 +1453,7 @@ public class PurpurWorldConfig { public boolean piglinControllable = true; public double piglinMaxHealth = 16.0D; public double piglinScale = 1.0D; @@ -527,7 +524,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1440,6 +1466,7 @@ public class PurpurWorldConfig { +@@ -1439,6 +1465,7 @@ public class PurpurWorldConfig { } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); piglinScale = Mth.clamp(getDouble("mobs.piglin.attributes.scale", piglinScale), 0.0625D, 16.0D); @@ -535,7 +532,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean piglinBruteRidable = false; -@@ -1465,6 +1492,7 @@ public class PurpurWorldConfig { +@@ -1464,6 +1491,7 @@ public class PurpurWorldConfig { public boolean pillagerControllable = true; public double pillagerMaxHealth = 24.0D; public double pillagerScale = 1.0D; @@ -543,7 +540,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1476,6 +1504,7 @@ public class PurpurWorldConfig { +@@ -1475,6 +1503,7 @@ public class PurpurWorldConfig { } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); pillagerScale = Mth.clamp(getDouble("mobs.pillager.attributes.scale", pillagerScale), 0.0625D, 16.0D); @@ -551,7 +548,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean polarBearRidable = false; -@@ -1527,6 +1556,7 @@ public class PurpurWorldConfig { +@@ -1526,6 +1555,7 @@ public class PurpurWorldConfig { public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; @@ -559,7 +556,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1541,6 +1571,7 @@ public class PurpurWorldConfig { +@@ -1540,6 +1570,7 @@ 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); @@ -567,7 +564,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean ravagerRidable = false; -@@ -1548,6 +1579,7 @@ public class PurpurWorldConfig { +@@ -1547,6 +1578,7 @@ public class PurpurWorldConfig { public boolean ravagerControllable = true; public double ravagerMaxHealth = 100.0D; public double ravagerScale = 1.0D; @@ -575,7 +572,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1559,6 +1591,7 @@ public class PurpurWorldConfig { +@@ -1558,6 +1590,7 @@ public class PurpurWorldConfig { } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ravagerScale = Mth.clamp(getDouble("mobs.ravager.attributes.scale", ravagerScale), 0.0625D, 16.0D); @@ -583,7 +580,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean salmonRidable = false; -@@ -1583,6 +1616,7 @@ public class PurpurWorldConfig { +@@ -1582,6 +1615,7 @@ public class PurpurWorldConfig { public double sheepMaxHealth = 8.0D; public double sheepScale = 1.0D; public int sheepBreedingTicks = 6000; @@ -591,7 +588,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1595,6 +1629,7 @@ public class PurpurWorldConfig { +@@ -1594,6 +1628,7 @@ public class PurpurWorldConfig { sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepScale = Mth.clamp(getDouble("mobs.sheep.attributes.scale", sheepScale), 0.0625D, 16.0D); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); @@ -599,7 +596,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean shulkerRidable = false; -@@ -1622,6 +1657,7 @@ public class PurpurWorldConfig { +@@ -1621,6 +1656,7 @@ public class PurpurWorldConfig { public double silverfishScale = 1.0D; public double silverfishMovementSpeed = 0.25D; public double silverfishAttackDamage = 1.0D; @@ -607,7 +604,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -1635,6 +1671,7 @@ public class PurpurWorldConfig { +@@ -1634,6 +1670,7 @@ public class PurpurWorldConfig { silverfishScale = Mth.clamp(getDouble("mobs.silverfish.attributes.scale", silverfishScale), 0.0625D, 16.0D); silverfishMovementSpeed = getDouble("mobs.silverfish.attributes.movement_speed", silverfishMovementSpeed); silverfishAttackDamage = getDouble("mobs.silverfish.attributes.attack_damage", silverfishAttackDamage); @@ -615,7 +612,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean skeletonRidable = false; -@@ -1715,6 +1752,7 @@ public class PurpurWorldConfig { +@@ -1714,6 +1751,7 @@ public class PurpurWorldConfig { public int snowGolemSnowBallMax = 20; public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; @@ -623,7 +620,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1732,6 +1770,7 @@ public class PurpurWorldConfig { +@@ -1731,6 +1769,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); @@ -631,7 +628,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean snifferRidable = false; -@@ -1935,6 +1974,7 @@ public class PurpurWorldConfig { +@@ -1934,6 +1973,7 @@ public class PurpurWorldConfig { public int villagerBreedingTicks = 6000; public boolean villagerClericsFarmWarts = false; public boolean villagerClericFarmersThrowWarts = true; @@ -639,7 +636,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1952,6 +1992,7 @@ public class PurpurWorldConfig { +@@ -1951,6 +1991,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); @@ -647,7 +644,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean vindicatorRidable = false; -@@ -2031,6 +2072,7 @@ public class PurpurWorldConfig { +@@ -2030,6 +2071,7 @@ public class PurpurWorldConfig { public double witherScale = 1.0D; public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; @@ -655,7 +652,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2049,6 +2091,7 @@ public class PurpurWorldConfig { +@@ -2048,6 +2090,7 @@ public class PurpurWorldConfig { witherScale = Mth.clamp(getDouble("mobs.wither.attributes.scale", witherScale), 0.0625D, 16.0D); witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); @@ -663,7 +660,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 } public boolean witherSkeletonRidable = false; -@@ -2127,6 +2170,7 @@ public class PurpurWorldConfig { +@@ -2126,6 +2169,7 @@ public class PurpurWorldConfig { public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; @@ -671,7 +668,7 @@ index 38a3ea0784a0797f26b8d3b9adb1d825b0c8058b..c38e6078eca2628dcd3cc3640a869550 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2143,6 +2187,7 @@ public class PurpurWorldConfig { +@@ -2142,6 +2186,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/0115-Config-to-allow-Note-Block-sounds-when-blocked.patch similarity index 72% rename from patches/unapplied-server/0119-Config-to-allow-Note-Block-sounds-when-blocked.patch rename to patches/server/0115-Config-to-allow-Note-Block-sounds-when-blocked.patch index 8b45198ff..775aee19f 100644 --- a/patches/unapplied-server/0119-Config-to-allow-Note-Block-sounds-when-blocked.patch +++ b/patches/server/0115-Config-to-allow-Note-Block-sounds-when-blocked.patch @@ -9,10 +9,10 @@ Normally, the sounds will only play when the block directly above is air. With this patch enabled, players can place any block above the Note Block and it will still work. diff --git a/src/main/java/net/minecraft/world/level/block/NoteBlock.java b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -index 1d82cfe7af0dc42f88901fb0c44896771fdf8a93..43dd972b374daa1072608f3a68e812e7fb733a2b 100644 +index 6582db84c5307257f16c321453491cf24e40c9c7..f9015d4e478efeec8a796b7a897638f76064db20 100644 --- a/src/main/java/net/minecraft/world/level/block/NoteBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -@@ -95,7 +95,7 @@ public class NoteBlock extends Block { +@@ -97,7 +97,7 @@ public class NoteBlock extends Block { } private void playNote(@Nullable Entity entity, BlockState state, Level world, BlockPos pos) { @@ -22,22 +22,23 @@ 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 c38e6078eca2628dcd3cc3640a869550a95f2f49..d7ea0c68b93dee2bf43e8b863b680f060bda0869 100644 +index b1d63425dc952c0ee0b3bd371a0910787ce628b7..eed88f28a22665b2998297af2d74535610cf9d58 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -119,6 +119,7 @@ public class PurpurWorldConfig { +@@ -123,6 +123,7 @@ public class PurpurWorldConfig { public boolean entitiesPickUpLootBypassMobGriefing = false; public boolean fireballsBypassMobGriefing = false; - public boolean milkCuresBadOmen = true; -+ public boolean noteBlockIgnoreAbove = false; - public boolean persistentDroppableEntityDisplayNames = true; public boolean projectilesBypassMobGriefing = false; - public double tridentLoyaltyVoidReturnHeight = 0.0D; -@@ -133,6 +134,7 @@ public class PurpurWorldConfig { ++ public boolean noteBlockIgnoreAbove = false; + private void miscGameplayMechanicsSettings() { + useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); + boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); +@@ -136,7 +137,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); -+ 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); - tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight); +- ++ noteBlockIgnoreAbove = getBoolean("gameplay-mechanics.note-block-ignore-above", noteBlockIgnoreAbove); + } + + public int daytimeTicks = 12000; diff --git a/patches/unapplied-server/0120-Add-EntityTeleportHinderedEvent.patch b/patches/server/0116-Add-EntityTeleportHinderedEvent.patch similarity index 80% rename from patches/unapplied-server/0120-Add-EntityTeleportHinderedEvent.patch rename to patches/server/0116-Add-EntityTeleportHinderedEvent.patch index dd4e257da..d363f13a8 100644 --- a/patches/unapplied-server/0120-Add-EntityTeleportHinderedEvent.patch +++ b/patches/server/0116-Add-EntityTeleportHinderedEvent.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/level/block/EndGatewayBlock.java b/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java -index 3f5bb5c9ceb5b31fcc9ef0a7a6157e1e1cb2a09f..9bd56c48119fe630f272427a2ec99ffe19eefdfb 100644 +index a7a21f071161fb7e73a046717d2462f871ab653c..abb75f9389167a1f51a2c50831664d50181749de 100644 --- a/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java -@@ -102,6 +102,13 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { +@@ -104,6 +104,13 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { TheEndGatewayBlockEntity tileentityendgateway = (TheEndGatewayBlockEntity) tileentity; if (!tileentityendgateway.isCoolingDown()) { @@ -35,13 +35,13 @@ index 3f5bb5c9ceb5b31fcc9ef0a7a6157e1e1cb2a09f..9bd56c48119fe630f272427a2ec99ffe TheEndGatewayBlockEntity.triggerCooldown(world, pos, state, tileentityendgateway); } diff --git a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java -index a35a426cc7778a51523f26057b5d61b8a3e23d5d..28d8c8a879badc97cd1168e1847e2fafdc40e4bd 100644 +index 4aa14f975e1ceedf3d4a427e0daefb58b12fcafe..2dffc3990d9ae3d595d923239885e3a7d8ec04f3 100644 --- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java -@@ -65,6 +65,13 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal { +@@ -70,6 +70,13 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal { protected void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent - if (entity.canUsePortal(false) && Shapes.joinIsNotEmpty(Shapes.create(entity.getBoundingBox().move((double) (-pos.getX()), (double) (-pos.getY()), (double) (-pos.getZ()))), state.getShape(world, pos), BooleanOp.AND)) { + if (entity.canUsePortal(false)) { + // Purpur start + if (world.purpurConfig.imposeTeleportRestrictionsOnEndPortals && (entity.isVehicle() || entity.isPassenger())) { + if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, PlayerTeleportEvent.TeleportCause.END_PORTAL).callEvent()) { @@ -53,10 +53,10 @@ index a35a426cc7778a51523f26057b5d61b8a3e23d5d..28d8c8a879badc97cd1168e1847e2faf EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()), org.bukkit.PortalType.ENDER); // Paper - add portal type world.getCraftServer().getPluginManager().callEvent(event); diff --git a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -index 0fdbcab175b51a8b77646e0e4a267d987b133a35..e8cccf3d89ecef13c0523c2357ef4b07e30a25b4 100644 +index 2b31bf586c1c0bd393d2aa8d0b6635dd9f22f21c..c00b13482ce3f603f1d85b9a5ad36b768de5a9f8 100644 --- a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -@@ -109,6 +109,13 @@ public class NetherPortalBlock extends Block implements Portal { +@@ -117,6 +117,13 @@ public class NetherPortalBlock extends Block implements Portal { protected void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent if (entity.canUsePortal(false)) { @@ -71,10 +71,10 @@ index 0fdbcab175b51a8b77646e0e4a267d987b133a35..e8cccf3d89ecef13c0523c2357ef4b07 EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()), org.bukkit.PortalType.NETHER); // Paper - add portal type world.getCraftServer().getPluginManager().callEvent(event); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 0883ac705b507c839246a50bd99f7230f9f3a56f..af3ab1eb9af64605203e7bb671ff08a38be9e6a6 100644 +index cf1797c6ba877c510bba5c8016e57003373d8220..f68c1d6c7003202c4d107663b9c60c2fb1c95455 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -245,6 +245,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -246,6 +246,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { boolean ignorePassengers = flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS); // Don't allow teleporting between worlds while keeping passengers if (flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS) && this.entity.isVehicle() && location.getWorld() != this.getWorld()) { @@ -83,10 +83,10 @@ index 0883ac705b507c839246a50bd99f7230f9f3a56f..af3ab1eb9af64605203e7bb671ff08a3 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 82b8fca9ca46f24d71b357ed5eab89c6b27ecd8a..9df9b518f6188a758d9a712def36dadb9dd94f21 100644 +index dc698d64ff3b5ab3b65b91159ce26d7cf51e68a1..32f0aa352a4809573784451bccd70ae8c02590f4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1440,6 +1440,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1458,6 +1458,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Paper start - Teleport passenger API // Don't allow teleporting between worlds while keeping passengers if (ignorePassengers && entity.isVehicle() && location.getWorld() != this.getWorld()) { @@ -95,26 +95,27 @@ index 82b8fca9ca46f24d71b357ed5eab89c6b27ecd8a..9df9b518f6188a758d9a712def36dadb } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d7ea0c68b93dee2bf43e8b863b680f060bda0869..c348b5570aa8a311198569a2024aec12e21a3e40 100644 +index eed88f28a22665b2998297af2d74535610cf9d58..929bb86a823f3283d9abae278186b9f24a8543a8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -118,6 +118,9 @@ public class PurpurWorldConfig { - public boolean entitiesCanUsePortals = true; - public boolean entitiesPickUpLootBypassMobGriefing = false; +@@ -124,6 +124,9 @@ public class PurpurWorldConfig { public boolean fireballsBypassMobGriefing = false; + public boolean projectilesBypassMobGriefing = false; + public boolean noteBlockIgnoreAbove = false; + public boolean imposeTeleportRestrictionsOnGateways = false; + public boolean imposeTeleportRestrictionsOnNetherPortals = false; + public boolean imposeTeleportRestrictionsOnEndPortals = false; - public boolean milkCuresBadOmen = true; - public boolean noteBlockIgnoreAbove = false; - public boolean persistentDroppableEntityDisplayNames = true; -@@ -133,6 +136,9 @@ public class PurpurWorldConfig { - entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals); - entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing); + private void miscGameplayMechanicsSettings() { + useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); + boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); +@@ -138,6 +141,10 @@ public class PurpurWorldConfig { fireballsBypassMobGriefing = getBoolean("gameplay-mechanics.fireballs-bypass-mob-griefing", fireballsBypassMobGriefing); + projectilesBypassMobGriefing = getBoolean("gameplay-mechanics.projectiles-bypass-mob-griefing", projectilesBypassMobGriefing); + noteBlockIgnoreAbove = getBoolean("gameplay-mechanics.note-block-ignore-above", noteBlockIgnoreAbove); + imposeTeleportRestrictionsOnGateways = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-gateways", imposeTeleportRestrictionsOnGateways); + imposeTeleportRestrictionsOnNetherPortals = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-nether-portals", imposeTeleportRestrictionsOnNetherPortals); + imposeTeleportRestrictionsOnEndPortals = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-end-portals", imposeTeleportRestrictionsOnEndPortals); - milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen); - noteBlockIgnoreAbove = getBoolean("gameplay-mechanics.note-block-ignore-above", noteBlockIgnoreAbove); - persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames); ++ + } + + public int daytimeTicks = 12000; diff --git a/patches/unapplied-server/0121-Farmland-trampling-changes.patch b/patches/server/0117-Farmland-trampling-changes.patch similarity index 87% rename from patches/unapplied-server/0121-Farmland-trampling-changes.patch rename to patches/server/0117-Farmland-trampling-changes.patch index b8602a15e..d8587105e 100644 --- a/patches/unapplied-server/0121-Farmland-trampling-changes.patch +++ b/patches/server/0117-Farmland-trampling-changes.patch @@ -12,11 +12,11 @@ necessary to trample in the first place. Feather Falling 1 requires you to fall over 3+ blocks to trample. FF 2 requires 4+, etc. diff --git a/src/main/java/net/minecraft/world/level/block/FarmBlock.java b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -index 99798220b6e0ad06db2ba5c9b74bfb72af185fee..12a0c69f8fec30fad64cbb00af2ca1bbf0ea5153 100644 +index e1abec46177887a92726de80f66226fe7fbbb4a2..bc149eb17695ac727aa8db08db6209497f7d20bf 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -@@ -126,12 +126,20 @@ public class FarmBlock extends Block { - } +@@ -127,12 +127,20 @@ public class FarmBlock extends Block { + } // Purpur start + if (world.purpurConfig.farmlandTramplingDisabled) return; @@ -34,13 +34,13 @@ index 99798220b6e0ad06db2ba5c9b74bfb72af185fee..12a0c69f8fec30fad64cbb00af2ca1bb + } + } // Purpur end - if (!CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.DIRT.defaultBlockState())) { - return; + 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 c348b5570aa8a311198569a2024aec12e21a3e40..0bc350c73ecbaa253cf126c3b4071b07593643fe 100644 +index 929bb86a823f3283d9abae278186b9f24a8543a8..ec44bddaedef83fa9feedee6253df78213f71280 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -417,10 +417,16 @@ public class PurpurWorldConfig { +@@ -416,10 +416,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/0118-Movement-options-for-armor-stands.patch similarity index 89% rename from patches/unapplied-server/0122-Movement-options-for-armor-stands.patch rename to patches/server/0118-Movement-options-for-armor-stands.patch index 545f68860..3050bc038 100644 --- a/patches/unapplied-server/0122-Movement-options-for-armor-stands.patch +++ b/patches/server/0118-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 acf10656ea445554ee537dcb2f23164ee77e4d60..b8b38d6b544261038905c97e8c600625f5ce2bda 100644 +index 4b516fcc23c692ec2c9847bee45484d747981410..49af66a9f5e0fcc0993fdfb8095645e48c17bd68 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1937,7 +1937,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -2007,7 +2007,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return this.isInWater() || flag; } @@ -28,12 +28,12 @@ index acf10656ea445554ee537dcb2f23164ee77e4d60..b8b38d6b544261038905c97e8c600625 + public void updateInWaterStateAndDoWaterCurrentPushing() { // Purpur - package-private -> public Entity entity = this.getVehicle(); - if (entity instanceof Boat entityboat) { + if (entity instanceof AbstractBoat abstractboat) { 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 4d6df7ec1bffbd30d4aac906f393ead0dfd8f69d..7180d65afee6216a0bc6ff2dc7888f64b9b6c22d 100644 +index 12ff824ffa81ea45f76337ec2b6d80b01047b698..c954cb3255145e18e8ab1e5a1b0267b879bbd1f3 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -@@ -102,10 +102,12 @@ public class ArmorStand extends LivingEntity { +@@ -114,10 +114,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 4d6df7ec1bffbd30d4aac906f393ead0dfd8f69d..7180d65afee6216a0bc6ff2dc7888f64 this.handItems = NonNullList.withSize(2, ItemStack.EMPTY); this.armorItems = NonNullList.withSize(4, ItemStack.EMPTY); this.headPose = ArmorStand.DEFAULT_HEAD_POSE; -@@ -1017,4 +1019,18 @@ public class ArmorStand extends LivingEntity { +@@ -1015,4 +1017,18 @@ public class ArmorStand extends LivingEntity { } } // Paper end @@ -66,7 +66,7 @@ index 4d6df7ec1bffbd30d4aac906f393ead0dfd8f69d..7180d65afee6216a0bc6ff2dc7888f64 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0bc350c73ecbaa253cf126c3b4071b07593643fe..fd1dfddc41e27d065f3eb429d2217c5eaa77f3b0 100644 +index ec44bddaedef83fa9feedee6253df78213f71280..63b38c9c0862a5bd00468024015e62d0485b2619 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,10 +100,16 @@ public class PurpurWorldConfig { diff --git a/patches/unapplied-server/0123-Fix-stuck-in-portals.patch b/patches/server/0119-Fix-stuck-in-portals.patch similarity index 75% rename from patches/unapplied-server/0123-Fix-stuck-in-portals.patch rename to patches/server/0119-Fix-stuck-in-portals.patch index da077d537..66d7ab4cb 100644 --- a/patches/unapplied-server/0123-Fix-stuck-in-portals.patch +++ b/patches/server/0119-Fix-stuck-in-portals.patch @@ -5,22 +5,22 @@ Subject: [PATCH] Fix stuck in portals diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 6100c35a54a9f597bb7e4925bf2c63aa7e0d64d3..d677c1308412e5a12046225ce2449af136b7665f 100644 +index d1a4eca112ad8698aa9025cec1b38bca01805e3f..c64b2386f35c55e3484df2d193f712a1728dc745 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1424,6 +1424,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -1680,6 +1680,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple worldserver1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); // CraftBukkit end + this.portalPos = io.papermc.paper.util.MCUtil.toBlockPosition(exit); // Purpur - Fix stuck in portals this.setServerLevel(worldserver); - this.connection.teleport(exit); // CraftBukkit - use internal teleport without event + this.connection.internalTeleport(PositionMoveRotation.of(teleportTarget), teleportTarget.relatives()); // CraftBukkit - use internal teleport without event this.connection.resetPosition(); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index b8b38d6b544261038905c97e8c600625f5ce2bda..901080dd8431b83b20aa5604e931519dcba82b22 100644 +index 49af66a9f5e0fcc0993fdfb8095645e48c17bd68..0b936bcf09bb12b0a29a1ef755df1a24604f0904 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3274,13 +3274,16 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3428,14 +3428,17 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return Vec3.directionFromRotation(this.getRotationVector()); } @@ -31,17 +31,18 @@ index b8b38d6b544261038905c97e8c600625f5ce2bda..901080dd8431b83b20aa5604e931519d this.setPortalCooldown(); } else if (this.level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer) { // Purpur - Entities can use portals if (this.portalProcess != null && this.portalProcess.isSamePortal(portal)) { - this.portalProcess.updateEntryPosition(pos.immutable()); - this.portalProcess.setAsInsidePortalThisTick(true); -+ this.portalPos = BlockPos.ZERO; // Purpur - Fix stuck in portals + if (!this.portalProcess.isInsidePortalThisTick()) { + this.portalProcess.updateEntryPosition(pos.immutable()); + this.portalProcess.setAsInsidePortalThisTick(true); ++ this.portalPos = BlockPos.ZERO; // Purpur - Fix stuck in portals + } } else { this.portalProcess = new PortalProcessor(portal, pos.immutable()); - } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fd1dfddc41e27d065f3eb429d2217c5eaa77f3b0..f8717837f1fb25b244e38f4b32c73e57158a2bb9 100644 +index 63b38c9c0862a5bd00468024015e62d0485b2619..b700c52f74cbae8f99bc721b9b594845a1c1ee6d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -326,6 +326,7 @@ public class PurpurWorldConfig { +@@ -325,6 +325,7 @@ public class PurpurWorldConfig { public int playerDeathExpDropMax = 100; public boolean teleportIfOutsideBorder = false; public boolean totemOfUndyingWorksInInventory = false; @@ -49,7 +50,7 @@ index fd1dfddc41e27d065f3eb429d2217c5eaa77f3b0..f8717837f1fb25b244e38f4b32c73e57 private void playerSettings() { if (PurpurConfig.version < 19) { boolean oldVal = getBoolean("gameplay-mechanics.player.idle-timeout.mods-target", idleTimeoutTargetPlayer); -@@ -341,6 +342,7 @@ public class PurpurWorldConfig { +@@ -340,6 +341,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); diff --git a/patches/unapplied-server/0124-Toggle-for-water-sensitive-mob-damage.patch b/patches/server/0120-Toggle-for-water-sensitive-mob-damage.patch similarity index 85% rename from patches/unapplied-server/0124-Toggle-for-water-sensitive-mob-damage.patch rename to patches/server/0120-Toggle-for-water-sensitive-mob-damage.patch index 286dfd5a1..15f049c1a 100644 --- a/patches/unapplied-server/0124-Toggle-for-water-sensitive-mob-damage.patch +++ b/patches/server/0120-Toggle-for-water-sensitive-mob-damage.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Toggle for water sensitive mob damage diff --git a/src/main/java/net/minecraft/world/entity/GlowSquid.java b/src/main/java/net/minecraft/world/entity/GlowSquid.java -index 4cd57672c548950cb4e0aa97af75ecca84be6823..70e3d583f7a039a5c67428ce9e8beb1922574c7b 100644 +index 0f5be53c6f6a66c61dc3f2bebeb18ca61d06c10d..a83187312422b0e087785d89f4a49b4c67427b95 100644 --- a/src/main/java/net/minecraft/world/entity/GlowSquid.java +++ b/src/main/java/net/minecraft/world/entity/GlowSquid.java -@@ -46,6 +46,11 @@ public class GlowSquid extends Squid { +@@ -48,6 +48,11 @@ public class GlowSquid extends Squid { return this.level().purpurConfig.glowSquidsCanFly; } @@ -21,10 +21,10 @@ index 4cd57672c548950cb4e0aa97af75ecca84be6823..70e3d583f7a039a5c67428ce9e8beb19 protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 115314cf19f8ed8f1c115f95438dee5cbe329900..3d556fb56977f3a75702c43e933340155e3e1cf3 100644 +index e16eea0be67c59e4b5af9e387e1acaa258cf1fce..a65286044be79e351bd5c80114a2f9fc5dacc11b 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -278,6 +278,11 @@ public class Bat extends AmbientCreature { +@@ -281,6 +281,11 @@ public class Bat extends AmbientCreature { this.getAttribute(Attributes.ATTACK_KNOCKBACK).setBaseValue(this.level().purpurConfig.batAttackKnockback); } @@ -37,10 +37,10 @@ index 115314cf19f8ed8f1c115f95438dee5cbe329900..3d556fb56977f3a75702c43e93334015 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 4b57756e938db00f5c6eba915c096110d68751eb..e7f85150fb7dcee5ba0d7bc3830a0544e18e9817 100644 +index 51b736979e43cd0e60a8ecaf2cf95511b9f4d858..d47e5f774567aa4710686430b66eb1409c2f0c97 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -176,7 +176,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -182,7 +182,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 4b57756e938db00f5c6eba915c096110d68751eb..e7f85150fb7dcee5ba0d7bc3830a0544 this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F); this.setPathfindingMalus(PathType.COCOA, -1.0F); this.setPathfindingMalus(PathType.FENCE, -1.0F); -@@ -489,6 +489,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -496,6 +496,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { return this.level().purpurConfig.beeBreedingTicks; } @@ -62,10 +62,10 @@ index 4b57756e938db00f5c6eba915c096110d68751eb..e7f85150fb7dcee5ba0d7bc3830a0544 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 356f3728fdadf8190cd6c806789f4fd70820ec94..4476fb2764bccdb0868e6e43f3a803971982effb 100644 +index 8a89ea47d79065e85bb831578c6a1ab71ca5a040..1a060021f92822a85aa45d682ee09d8ef69d7a1f 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 { +@@ -193,6 +193,11 @@ public class Fox extends Animal implements VariantHolder { return this.level().purpurConfig.foxBreedingTicks; } @@ -158,7 +158,7 @@ index 6c56c51a89928ba52b1fb5f66f6169fa94fffed0..759e013fea63d859f357744605a1895e 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 5aa58b5bc9e97c030d075accd6803c5fc1f33f07..0cf985cac3279c0cb6255f02b76a5012027cae99 100644 +index 500109364b4741fc310eb22c151754a153db027e..6396d31a14815fbe4f9f51dc610af317566bf522 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java @@ -85,6 +85,11 @@ public class IronGolem extends AbstractGolem implements NeutralMob { @@ -174,10 +174,10 @@ index 5aa58b5bc9e97c030d075accd6803c5fc1f33f07..0cf985cac3279c0cb6255f02b76a5012 protected void registerGoals() { if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 22a2328fe5159c8fed635a62334a3f1028c346a5..6cb8d85986f4d891dfbb66b83163ed23bac694f6 100644 +index f3873e0ad6ca1f547450e44bba917241bbc80c20..9682f0b26456f3db005a4996123c6b9e2dfa19ef 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -91,6 +91,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { +@@ -150,6 +150,11 @@ public class Rabbit extends Animal implements VariantHolder { public int getPurpurBreedTime() { return this.level().purpurConfig.rabbitBreedingTicks; } @@ -302,10 +302,10 @@ index db9ed247a2a2c2316a9dcc06a8961345c40752a9..41477fc4148ce10d72bcde5c5b391af4 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/Salmon.java b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -index 742805994f29a18af444912b10af631d2c60cacf..e101c3bf425902908c43ffa18867fb83a5e1f16e 100644 +index 9ec3479b0db1f42493db127081e341fa5acc8e41..486709c9701657c7aa93586f539c18e4157f8ef3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Salmon.java +++ b/src/main/java/net/minecraft/world/entity/animal/Salmon.java -@@ -30,6 +30,11 @@ public class Salmon extends AbstractSchoolingFish { +@@ -49,6 +49,11 @@ public class Salmon extends AbstractSchoolingFish implements VariantHolder, B + public int getPurpurBreedTime() { return this.level().purpurConfig.axolotlBreedingTicks; } - ++ + @Override + public boolean isSensitiveToWater() { + return this.level().purpurConfig.axolotlTakeDamageFromWater; + } -+ + // Purpur end + @Override - public Map getModelRotationValues() { - return this.modelRotationValues; diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 2fd6ff9d9dc603020114cc6ab8eb28c9d09e448c..8272b68f05723caceca806f2dd5fa00c6fd50e6e 100644 +index 54e880fb1c03a8b578fd1d2929bc174edb9918c5..4f7b2511a401e0c8818f11fba7b39ef2f1b4797f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -113,6 +113,11 @@ public class Goat extends Animal { +@@ -115,6 +115,11 @@ public class Goat extends Animal { return this.level().purpurConfig.goatBreedingTicks; } @@ -443,10 +443,10 @@ index 2fd6ff9d9dc603020114cc6ab8eb28c9d09e448c..8272b68f05723caceca806f2dd5fa00c protected Brain.Provider brainProvider() { return Brain.provider(Goat.MEMORY_TYPES, Goat.SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -index 2990d50fd5209b272e0cfbd5dd633124048e8129..891ea1cca8495c08a1817096c8c4277f5311d6c7 100644 +index ba0b6c0154d72dd13acf9e1c0966e394d59943c7..9bb98c2e3215011211bb3498862f08b1c1a43086 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Donkey.java -@@ -42,6 +42,11 @@ public class Donkey extends AbstractChestedHorse { +@@ -43,6 +43,11 @@ public class Donkey extends AbstractChestedHorse { return this.level().purpurConfig.donkeyBreedingTicks; } @@ -459,10 +459,10 @@ index 2990d50fd5209b272e0cfbd5dd633124048e8129..891ea1cca8495c08a1817096c8c4277f protected SoundEvent getAmbientSound() { return SoundEvents.DONKEY_AMBIENT; diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -index c4b22c52e335080e744a723622f455c0d8cf73e2..d92415ec722935317b7927e3251cce7e2269b1a0 100644 +index b9a406cd4e317c663a12d897b8cf1f4f6eeca662..46d29c15941b542c2f8da20642f2fcbd058b4e60 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Horse.java -@@ -72,6 +72,11 @@ public class Horse extends AbstractHorse implements VariantHolder { +@@ -70,6 +70,11 @@ public class Horse extends AbstractHorse implements VariantHolder { return this.level().purpurConfig.horseBreedingTicks; } @@ -475,10 +475,10 @@ index c4b22c52e335080e744a723622f455c0d8cf73e2..d92415ec722935317b7927e3251cce7e 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 b8a6ebd8301c4873060505c866dabb4e8772d5b5..96f1eba4a356e131a8f3c689bedc9eb8821e1a72 100644 +index 1a992d4c867ebe65b56be724fb54b9bc389cd8ec..1c23531fed535e61afe47bfb66fc4e5ffb1d2dc5 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); this.moveControl = new org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD(this, 0.3F); // Purpur @@ -599,7 +599,7 @@ index 089edbcc1c92783e61e56beb32c471029eb2486e..fda1aa7e3db530243e1d71446d0d1290 this.setPathfindingMalus(PathType.LAVA, 8.0F); this.setPathfindingMalus(PathType.DANGER_FIRE, 0.0F); this.setPathfindingMalus(PathType.DAMAGE_FIRE, 0.0F); -@@ -154,7 +154,7 @@ public class Blaze extends Monster { +@@ -155,7 +155,7 @@ public class Blaze extends Monster { @Override public boolean isSensitiveToWater() { @@ -609,10 +609,10 @@ index 089edbcc1c92783e61e56beb32c471029eb2486e..fda1aa7e3db530243e1d71446d0d1290 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -index 00c48623e8d53e4a00b9c3e40f6fd2c5af4f61b7..e1db768336872a63a20094ea9058550bece1549a 100644 +index c1d1a589a6f83e524cc799187d557b504586c24f..8eafedc70e54dfb125b72f1099d7e0917631d292 100644 --- a/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java +++ b/src/main/java/net/minecraft/world/entity/monster/CaveSpider.java -@@ -49,6 +49,11 @@ public class CaveSpider extends Spider { +@@ -50,6 +50,11 @@ public class CaveSpider extends Spider { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.caveSpiderScale); } @@ -622,13 +622,13 @@ index 00c48623e8d53e4a00b9c3e40f6fd2c5af4f61b7..e1db768336872a63a20094ea9058550b + } + @Override - public boolean doHurtTarget(Entity target) { - if (super.doHurtTarget(target)) { + public boolean doHurtTarget(ServerLevel world, Entity target) { + if (super.doHurtTarget(world, target)) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 576d8288a9a5e39479623cac6cbf0f2cc81096db..1ce1cf48624d8273dccc571ee37a08c06951acad 100644 +index 397509198ab1e7ee275d86fac57ba52445276284..aed8273dd74930914a495d6963e55308d935008c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -266,6 +266,11 @@ public class Creeper extends Monster implements PowerableMob { +@@ -265,6 +265,11 @@ public class Creeper extends Monster { return super.finalizeSpawn(world, difficulty, spawnReason, entityData); } @@ -641,10 +641,10 @@ index 576d8288a9a5e39479623cac6cbf0f2cc81096db..1ce1cf48624d8273dccc571ee37a08c0 protected SoundEvent getHurtSound(DamageSource source) { return SoundEvents.CREEPER_HURT; diff --git a/src/main/java/net/minecraft/world/entity/monster/Drowned.java b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -index 4f9daaeb1bd4d115a84b0c20649e4dd44af37924..370f1b76c002f7cecf596767db717da51b2990f8 100644 +index 7b3c999a03d91c167dfc1a1c90750b2efd4eb675..1f41e4a88fb41347b8b1ac6b3d1c454ad35ebfc4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Drowned.java +++ b/src/main/java/net/minecraft/world/entity/monster/Drowned.java -@@ -99,6 +99,11 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -100,6 +100,11 @@ public class Drowned extends Zombie implements RangedAttackMob { this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.drownedSpawnReinforcements); } @@ -657,7 +657,7 @@ index 4f9daaeb1bd4d115a84b0c20649e4dd44af37924..370f1b76c002f7cecf596767db717da5 public boolean jockeyOnlyBaby() { return level().purpurConfig.drownedJockeyOnlyBaby; diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -index 986a0f75dd8ac3d36e827d88e1e8e6a0f755aab7..795bf6c37362382124ca1ea8ce2a294b421eaa3b 100644 +index 1cfb85a72e270a953c13102490dc38f3dbfb76d1..a0c76ffa16edffdfa75fd539e58282d3115f473b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java @@ -51,6 +51,11 @@ public class ElderGuardian extends Guardian { @@ -673,7 +673,7 @@ index 986a0f75dd8ac3d36e827d88e1e8e6a0f755aab7..795bf6c37362382124ca1ea8ce2a294b return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.30000001192092896D).add(Attributes.ATTACK_DAMAGE, 8.0D).add(Attributes.MAX_HEALTH, 80.0D); } diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index e71db58a2824d0a6a8df1a3d13ad5ac14604ad99..d4360a62cc2514dafc02749e49674213db65cc85 100644 +index 262350aaed5070a9353ba15726bba197df3b9de0..d48be9b5ac329bddd1eb3c26d35421b32d87f547 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -92,7 +92,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -685,7 +685,7 @@ index e71db58a2824d0a6a8df1a3d13ad5ac14604ad99..d4360a62cc2514dafc02749e49674213 } // Purpur start -@@ -301,7 +301,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -288,7 +288,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean isSensitiveToWater() { @@ -695,7 +695,7 @@ index e71db58a2824d0a6a8df1a3d13ad5ac14604ad99..d4360a62cc2514dafc02749e49674213 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Endermite.java b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -index 3352007750e093f038a8c47476ff80601a6d7cee..dd73278cea317280b88c3290dfcc052866c9ec52 100644 +index 89f808dd5470c9d94a0cd6b690b9711136027f8a..e8b7e291c96ff6856832fc6612f792fc778e5162 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java +++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java @@ -61,6 +61,11 @@ public class Endermite extends Monster { @@ -711,10 +711,10 @@ index 3352007750e093f038a8c47476ff80601a6d7cee..dd73278cea317280b88c3290dfcc0528 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 a7976b5d8548277061aa6a4e1147922e283d5a7d..03f29e4bc4d161df06d0c71bda10b3c117cda1f5 100644 +index 371a3db041ae8990c0a2a7c5e1702ba83712fcdc..64db1748d25db5d52f182e05a9d3ac1e04d4fe6a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -75,6 +75,11 @@ public class Evoker extends SpellcasterIllager { +@@ -76,6 +76,11 @@ public class Evoker extends SpellcasterIllager { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.evokerScale); } @@ -727,10 +727,10 @@ index a7976b5d8548277061aa6a4e1147922e283d5a7d..03f29e4bc4d161df06d0c71bda10b3c1 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 54b4f299a281096e559baf817f3de7185e419983..f1e379ca03826f4a8ab86cdd1a129b4bef458f97 100644 +index 1dfc164c129c1b10bdcbcf0fc140b7c5d76da0a6..29fdd9ca2ea4e6c2a0b51e9803f94b4a1201340a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java -@@ -137,6 +137,11 @@ public class Ghast extends FlyingMob implements Enemy { +@@ -138,6 +138,11 @@ public class Ghast extends FlyingMob implements Enemy { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ghastScale); } @@ -759,10 +759,10 @@ index 39367523621c330eda59905d1f2c129288a1026c..f2e838def533b524e0fc7c20095e4bb1 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 9904f9b79913ae2ee1d2fb26b03606c47fbbb730..9038501f4b7a0cd1ca1e65892ca537358a896c18 100644 +index a77496aa3be1167a8d3cd9075361ea8c1415b921..cf5d172b165488a3b771b3003cb3cb138c4c6dab 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Guardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/Guardian.java -@@ -96,6 +96,11 @@ public class Guardian extends Monster { +@@ -97,6 +97,11 @@ public class Guardian extends Monster { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.guardianScale); } @@ -775,10 +775,10 @@ index 9904f9b79913ae2ee1d2fb26b03606c47fbbb730..9038501f4b7a0cd1ca1e65892ca53735 protected void registerGoals() { MoveTowardsRestrictionGoal pathfindergoalmovetowardsrestriction = new MoveTowardsRestrictionGoal(this, 1.0D); diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index 6673c0bff3a4e3d11a09e9dc8aeb0c2418dc7f59..cb96bd5769159e6c25968673ea07cd6d107cff46 100644 +index ed4b1e2df6d7c7dfa45d96b9c08f2aa429ad32c5..78e95f15de02cc0b2f2c6d71bf6c10828986c6f4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java -@@ -64,6 +64,11 @@ public class Husk extends Zombie { +@@ -65,6 +65,11 @@ public class Husk extends Zombie { return level().purpurConfig.huskJockeyTryExistingChickens; } @@ -787,14 +787,14 @@ index 6673c0bff3a4e3d11a09e9dc8aeb0c2418dc7f59..cb96bd5769159e6c25968673ea07cd6d + return this.level().purpurConfig.huskTakeDamageFromWater; + } + - public static boolean checkHuskSpawnRules(EntityType type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { - return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (MobSpawnType.isSpawner(spawnReason) || world.canSeeSky(pos)); + public static boolean checkHuskSpawnRules(EntityType type, ServerLevelAccessor world, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random) { + return checkMonsterSpawnRules(type, world, spawnReason, pos, random) && (EntitySpawnReason.isSpawner(spawnReason) || world.canSeeSky(pos)); } diff --git a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -index 4c73f5d2746dbb4d3689ff24a46951505c3419d2..3eaa9cb4b343a17c9bf6efb92c866871d11e7975 100644 +index 70f4452a97b45e23698b812f934822a150ad55e8..b50ec12affd476d9ad1c73942fcef070ddfc1efd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Illusioner.java +++ b/src/main/java/net/minecraft/world/entity/monster/Illusioner.java -@@ -82,6 +82,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -84,6 +84,11 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.illusionerScale); } @@ -807,7 +807,7 @@ index 4c73f5d2746dbb4d3689ff24a46951505c3419d2..3eaa9cb4b343a17c9bf6efb92c866871 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 7769faef7606afca7de8a11fd82a7c3cc61f0b32..f81c09aa7673703e97ac4c39caaf25fac05e3de8 100644 +index 3656c83ed02392f4121dab69ea7e0e5a64a984b0..0dde6fb0fbf85d1b5afe0fe25941c0c05e821290 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,10 +823,10 @@ index 7769faef7606afca7de8a11fd82a7c3cc61f0b32..f81c09aa7673703e97ac4c39caaf25fa 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 88725e6f8c6490253e110485f5a62e9d3d2c9aa9..554e01cf4fb3b15549c8c381274014c4735e08c6 100644 +index 32ac2ec33daacf038d2c10b748e89a7725d36a79..2dc44d3b2609fef26925f2a4a21e0a8bdd14d24a 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 { +@@ -137,6 +137,11 @@ public class Phantom extends FlyingMob implements Enemy { } // Purpur end @@ -839,10 +839,10 @@ index 88725e6f8c6490253e110485f5a62e9d3d2c9aa9..554e01cf4fb3b15549c8c381274014c4 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 a8f9f8fac9786b140090b90f34a31ec227cd0b3d..67e6646f68bd2ff47cfd581d2167240309cfeac5 100644 +index 3613b82bef45dddf7e356deaee6353c48455e33a..b85579065ac006589120d4d7ed83d355a517b46d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java -@@ -85,6 +85,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve +@@ -87,6 +87,11 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.pillagerScale); } @@ -855,10 +855,10 @@ index a8f9f8fac9786b140090b90f34a31ec227cd0b3d..67e6646f68bd2ff47cfd581d21672403 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 5d9e85b22c0fe8d0b9d9fc06fc1f3cd170931e17..30aee88ab5fd1e849780903083c2c95dd4e392aa 100644 +index 83fcf23077721fcc976fc0cd3a4a18ba4f05e1e5..159b542361debf397bbd24ac9a4f037e584de876 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -98,6 +98,11 @@ public class Ravager extends Raider { +@@ -106,6 +106,11 @@ public class Ravager extends Raider { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ravagerScale); } @@ -871,10 +871,10 @@ index 5d9e85b22c0fe8d0b9d9fc06fc1f3cd170931e17..30aee88ab5fd1e849780903083c2c95d 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 f746e4002dbd2f10d04fcecdbc488a8152efc171..bd4f2297b2267ab99c0419417f37898dd943480b 100644 +index ebc50e517093329dc5c76cdcd3b6d7e7e66bf55f..4a04ade0cfeac23afbac1a5ef7dfff0df2136191 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -@@ -120,6 +120,11 @@ public class Shulker extends AbstractGolem implements VariantHolder type, ServerLevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { - BlockPos blockPos = pos; - + public static boolean checkStraySpawnRules( + EntityType type, ServerLevelAccessor world, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index d534eaa9231602f8fa73d0230223f08348aae95b..a4d94f15e7c7eb90cf5f11f3cec2b19c6f0ba514 100644 +index bb2283fa9a21d7fc609f0a914cdb8b1370d90235..6c7b3b306b69c5b0526e48e4e636ed24d5c96820 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java @@ -91,7 +91,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @@ -981,7 +981,7 @@ index d534eaa9231602f8fa73d0230223f08348aae95b..a4d94f15e7c7eb90cf5f11f3cec2b19c this.setPathfindingMalus(PathType.LAVA, 0.0F); this.setPathfindingMalus(PathType.DANGER_FIRE, 0.0F); this.setPathfindingMalus(PathType.DAMAGE_FIRE, 0.0F); -@@ -443,7 +443,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -441,7 +441,7 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { @Override public boolean isSensitiveToWater() { @@ -991,10 +991,10 @@ index d534eaa9231602f8fa73d0230223f08348aae95b..a4d94f15e7c7eb90cf5f11f3cec2b19c @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index ffa4107ec80f153f37221657a1d3aec26819a4c6..1071905ef1fa813f3f43a3e7fce9a295a10c2c5c 100644 +index 4306deb77e4bea5e8e8d39cc4d094ecafab12af2..8e99397f182ccd4e23697121eba23ee69e6e710d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java -@@ -108,6 +108,11 @@ public class Vex extends Monster implements TraceableEntity { +@@ -107,6 +107,11 @@ public class Vex extends Monster implements TraceableEntity { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.vexMaxHealth); this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.vexScale); } @@ -1007,10 +1007,10 @@ index ffa4107ec80f153f37221657a1d3aec26819a4c6..1071905ef1fa813f3f43a3e7fce9a295 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index f8c2911496aa18e8e2b589309e9cdd78d679f004..7708ed356f9718852b08cb666e165c0d40180448 100644 +index 2f7da09e14787395e95211acadd5c693cf07fba3..81ed8846daedc783c5b855dd9f0fd5c48892b362 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -@@ -76,6 +76,11 @@ public class Vindicator extends AbstractIllager { +@@ -78,6 +78,11 @@ public class Vindicator extends AbstractIllager { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.vindicatorScale); } @@ -1023,10 +1023,10 @@ index f8c2911496aa18e8e2b589309e9cdd78d679f004..7708ed356f9718852b08cb666e165c0d protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/Witch.java b/src/main/java/net/minecraft/world/entity/monster/Witch.java -index 24dea8eac5db45f6d3b1851b83cb33cfa9d5c578..2dc3817ac26eb8dcf09b414d3e186434ac8a3cd3 100644 +index 790e36ae4bd1d6290e16ec579127f8017ac43335..151169d76276409d6a042945b05ae680d1f5fd1e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java -@@ -79,6 +79,11 @@ public class Witch extends Raider implements RangedAttackMob { +@@ -80,6 +80,11 @@ public class Witch extends Raider implements RangedAttackMob { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.witchScale); } @@ -1039,7 +1039,7 @@ index 24dea8eac5db45f6d3b1851b83cb33cfa9d5c578..2dc3817ac26eb8dcf09b414d3e186434 protected void registerGoals() { super.registerGoals(); diff --git a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java -index f0ede7c7734d43aa4d15734a2e0b8bf539151673..da310c5d76c157b23925de97ffe337a9d7da2afe 100644 +index 89ed0d044426aa0415f5cb4eb3f02342fcdddc7d..4c426f87fe2833382f48e353b27f381b48774fd9 100644 --- a/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/WitherSkeleton.java @@ -56,6 +56,11 @@ public class WitherSkeleton extends AbstractSkeleton { @@ -1055,10 +1055,10 @@ index f0ede7c7734d43aa4d15734a2e0b8bf539151673..da310c5d76c157b23925de97ffe337a9 protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index 28c400e1d8b56d1dd91d41a30b12543b242eadf9..3c9c32f09b3c60b52cd2e678e3c9e328156d44d0 100644 +index b4240934ebe95cd16403131bc1bf21400f7b37f2..8eb5236bed0ca7ed5e05aae5f179ef31214b18e8 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 { +@@ -108,6 +108,11 @@ public class Zoglin extends Monster implements HoglinBase { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zoglinScale); } @@ -1071,10 +1071,10 @@ index 28c400e1d8b56d1dd91d41a30b12543b242eadf9..3c9c32f09b3c60b52cd2e678e3c9e328 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 c0adb41e2772ac1204bbdf8e6eee27fbfc82ef12..990daa4f12ed7fb9a1ab40443c7f68bca4534626 100644 +index e6fb53b828c1a2e76d398e88449260f6206145c3..d79eb7bd6d38a4f1aee89cf0cf331a126351e767 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -143,6 +143,11 @@ public class Zombie extends Monster { +@@ -145,6 +145,11 @@ public class Zombie extends Monster { return level().purpurConfig.zombieJockeyTryExistingChickens; } @@ -1087,10 +1087,10 @@ index c0adb41e2772ac1204bbdf8e6eee27fbfc82ef12..990daa4f12ed7fb9a1ab40443c7f68bc 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 cdf6753b6bb2bbb4f3ab21792bd3153988b26b75..3c4cff3f095cdf2dd74df7bf4bb8f3d5600b342d 100644 +index eb6daba7d44542739f1c537cbeef8f87c6db61bf..7298ba35cb27269e778de6b265933baed3077b36 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -110,6 +110,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -112,6 +112,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,7 +1103,7 @@ index cdf6753b6bb2bbb4f3ab21792bd3153988b26b75..3c4cff3f095cdf2dd74df7bf4bb8f3d5 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 2756319fd1e53eca6a3dfa094d7c669014c383e9..f2081f3b4a4bbda071cfc5c714d887ff2de96148 100644 +index cb47b15d197b1167dcbac1b989903bbf84b079b4..4cd470db5a427e0c0bec0fe2a7c7307cac47b39b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java @@ -86,6 +86,11 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @@ -1119,10 +1119,10 @@ index 2756319fd1e53eca6a3dfa094d7c669014c383e9..f2081f3b4a4bbda071cfc5c714d887ff 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 eb4a2e57ee9bddacef184e81167f8ee32c63c63f..563af99f4b17b38e074fbc752b41a8c7fb9f5a01 100644 +index 0220fb517d99e8c9629d191eb554799a1dc8d7bc..f3f77e5e219d6a3a831ac9b1a642e77ec67ce770 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 -@@ -118,6 +118,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -125,6 +125,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { return this.level().purpurConfig.hoglinBreedingTicks; } @@ -1135,10 +1135,10 @@ index eb4a2e57ee9bddacef184e81167f8ee32c63c63f..563af99f4b17b38e074fbc752b41a8c7 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 ed312ed8c668ee6b02ae6e89b5a44bb4fe6d4b48..bb85a7dfbb4225e0f1d1d63212928bbb4b137a78 100644 +index 18d4a90bef46522e12e79e03c466910fbb703f6d..334d7a657e883de6ea81b6f88876f5ca45c43d7b 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 +@@ -119,6 +119,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.piglinScale); } @@ -1151,10 +1151,10 @@ index ed312ed8c668ee6b02ae6e89b5a44bb4fe6d4b48..bb85a7dfbb4225e0f1d1d63212928bbb public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index ea62ab46518647759bd8ce3e4f3d5ced680414bd..db8c029799215223d7a594dbb945d6aa7966e67a 100644 +index 6459e588e6feb6d7bcf999e36b658bbad4069af2..9c196b0cf49cb6f69bd17748fd13ce5960094f88 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -@@ -85,6 +85,11 @@ public class PiglinBrute extends AbstractPiglin { +@@ -88,6 +88,11 @@ public class PiglinBrute extends AbstractPiglin { this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.piglinBruteScale); } @@ -1164,13 +1164,13 @@ index ea62ab46518647759bd8ce3e4f3d5ced680414bd..db8c029799215223d7a594dbb945d6aa + } + public static AttributeSupplier.Builder createAttributes() { - return Monster.createMonsterAttributes().add(Attributes.MAX_HEALTH, 50.0).add(Attributes.MOVEMENT_SPEED, 0.35F).add(Attributes.ATTACK_DAMAGE, 7.0); - } + return Monster.createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 50.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 730327d560075e28f0ba316c64311297a474f0ca..a717443f894d1e30efed61944f45e991902d1fa4 100644 +index 666ab4c3c957db48783d8b891737370c3ced881c..3fce5c42ca000250bb25201939ba6c73170486be 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -192,6 +192,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -190,6 +190,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.villagerScale); } @@ -1183,10 +1183,10 @@ index 730327d560075e28f0ba316c64311297a474f0ca..a717443f894d1e30efed61944f45e991 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 0d5e828a7fb6fd6facc04a27175541ac463c918e..05c63eb6cf8a7067105c58d244c7cc27d6bf1125 100644 +index 7b8b5a7b1fea50c7b238afc4b3d79746da08b641..5eac0ba67b3ab258dd594ad1e1aaa7a2535fcfca 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 +@@ -99,6 +99,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); } @@ -1199,10 +1199,10 @@ index 0d5e828a7fb6fd6facc04a27175541ac463c918e..05c63eb6cf8a7067105c58d244c7cc27 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 f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85ea641efd0 100644 +index b700c52f74cbae8f99bc721b9b594845a1c1ee6d..d3e196a29e10a21436c4e8049790d87cae2037be 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -548,12 +548,14 @@ public class PurpurWorldConfig { +@@ -547,12 +547,14 @@ public class PurpurWorldConfig { public double axolotlMaxHealth = 14.0D; public double axolotlScale = 1.0D; public int axolotlBreedingTicks = 6000; @@ -1217,7 +1217,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean batRidable = false; -@@ -569,6 +571,7 @@ public class PurpurWorldConfig { +@@ -568,6 +570,7 @@ public class PurpurWorldConfig { public double batArmor = 0.0D; public double batArmorToughness = 0.0D; public double batAttackKnockback = 0.0D; @@ -1225,7 +1225,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void batSettings() { batRidable = getBoolean("mobs.bat.ridable", batRidable); batRidableInWater = getBoolean("mobs.bat.ridable-in-water", batRidableInWater); -@@ -588,6 +591,7 @@ public class PurpurWorldConfig { +@@ -587,6 +590,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); @@ -1233,7 +1233,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean beeRidable = false; -@@ -597,6 +601,7 @@ public class PurpurWorldConfig { +@@ -596,6 +600,7 @@ public class PurpurWorldConfig { public double beeMaxHealth = 10.0D; public double beeScale = 1.0D; public int beeBreedingTicks = 6000; @@ -1241,7 +1241,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void beeSettings() { beeRidable = getBoolean("mobs.bee.ridable", beeRidable); beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); -@@ -610,6 +615,7 @@ public class PurpurWorldConfig { +@@ -609,6 +614,7 @@ public class PurpurWorldConfig { beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); beeScale = Mth.clamp(getDouble("mobs.bee.attributes.scale", beeScale), 0.0625D, 16.0D); beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); @@ -1249,7 +1249,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean blazeRidable = false; -@@ -618,6 +624,7 @@ public class PurpurWorldConfig { +@@ -617,6 +623,7 @@ public class PurpurWorldConfig { public double blazeMaxY = 320D; public double blazeMaxHealth = 20.0D; public double blazeScale = 1.0D; @@ -1257,7 +1257,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void blazeSettings() { blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable); blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater); -@@ -630,6 +637,7 @@ public class PurpurWorldConfig { +@@ -629,6 +636,7 @@ public class PurpurWorldConfig { } blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); blazeScale = Mth.clamp(getDouble("mobs.blaze.attributes.scale", blazeScale), 0.0625D, 16.0D); @@ -1265,7 +1265,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean boggedRidable = false; -@@ -674,6 +682,7 @@ public class PurpurWorldConfig { +@@ -673,6 +681,7 @@ public class PurpurWorldConfig { public int catSpawnVillageScanRange = 48; public int catBreedingTicks = 6000; public DyeColor catDefaultCollarColor = DyeColor.RED; @@ -1273,7 +1273,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void catSettings() { catRidable = getBoolean("mobs.cat.ridable", catRidable); catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -694,6 +703,7 @@ public class PurpurWorldConfig { +@@ -693,6 +702,7 @@ public class PurpurWorldConfig { } catch (IllegalArgumentException ignore) { catDefaultCollarColor = DyeColor.RED; } @@ -1281,7 +1281,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean caveSpiderRidable = false; -@@ -701,6 +711,7 @@ public class PurpurWorldConfig { +@@ -700,6 +710,7 @@ public class PurpurWorldConfig { public boolean caveSpiderControllable = true; public double caveSpiderMaxHealth = 12.0D; public double caveSpiderScale = 1.0D; @@ -1289,7 +1289,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void caveSpiderSettings() { caveSpiderRidable = getBoolean("mobs.cave_spider.ridable", caveSpiderRidable); caveSpiderRidableInWater = getBoolean("mobs.cave_spider.ridable-in-water", caveSpiderRidableInWater); -@@ -712,6 +723,7 @@ public class PurpurWorldConfig { +@@ -711,6 +722,7 @@ public class PurpurWorldConfig { } caveSpiderMaxHealth = getDouble("mobs.cave_spider.attributes.max_health", caveSpiderMaxHealth); caveSpiderScale = Mth.clamp(getDouble("mobs.cave_spider.attributes.scale", caveSpiderScale), 0.0625D, 16.0D); @@ -1297,7 +1297,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean chickenRidable = false; -@@ -721,6 +733,7 @@ public class PurpurWorldConfig { +@@ -720,6 +732,7 @@ public class PurpurWorldConfig { public double chickenScale = 1.0D; public boolean chickenRetaliate = false; public int chickenBreedingTicks = 6000; @@ -1305,7 +1305,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void chickenSettings() { chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -734,12 +747,14 @@ public class PurpurWorldConfig { +@@ -733,12 +746,14 @@ public class PurpurWorldConfig { chickenScale = Mth.clamp(getDouble("mobs.chicken.attributes.scale", chickenScale), 0.0625D, 16.0D); chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); @@ -1320,7 +1320,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void codSettings() { codRidable = getBoolean("mobs.cod.ridable", codRidable); codControllable = getBoolean("mobs.cod.controllable", codControllable); -@@ -750,6 +765,7 @@ public class PurpurWorldConfig { +@@ -749,6 +764,7 @@ public class PurpurWorldConfig { } codMaxHealth = getDouble("mobs.cod.attributes.max_health", codMaxHealth); codScale = Mth.clamp(getDouble("mobs.cod.attributes.scale", codScale), 0.0625D, 16.0D); @@ -1328,7 +1328,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean cowRidable = false; -@@ -759,6 +775,7 @@ public class PurpurWorldConfig { +@@ -758,6 +774,7 @@ public class PurpurWorldConfig { public double cowScale = 1.0D; public int cowFeedMushrooms = 0; public int cowBreedingTicks = 6000; @@ -1336,7 +1336,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void cowSettings() { cowRidable = getBoolean("mobs.cow.ridable", cowRidable); cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); -@@ -772,6 +789,7 @@ public class PurpurWorldConfig { +@@ -771,6 +788,7 @@ public class PurpurWorldConfig { cowScale = Mth.clamp(getDouble("mobs.cow.attributes.scale", cowScale), 0.0625D, 16.0D); cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); @@ -1344,7 +1344,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean creeperRidable = false; -@@ -782,6 +800,7 @@ public class PurpurWorldConfig { +@@ -781,6 +799,7 @@ public class PurpurWorldConfig { public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; public boolean creeperBypassMobGriefing = false; @@ -1352,7 +1352,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -796,6 +815,7 @@ public class PurpurWorldConfig { +@@ -795,6 +814,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); @@ -1360,7 +1360,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean dolphinRidable = false; -@@ -806,6 +826,7 @@ public class PurpurWorldConfig { +@@ -805,6 +825,7 @@ public class PurpurWorldConfig { public double dolphinMaxHealth = 10.0D; public double dolphinScale = 1.0D; public boolean dolphinDisableTreasureSearching = false; @@ -1368,7 +1368,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void dolphinSettings() { dolphinRidable = getBoolean("mobs.dolphin.ridable", dolphinRidable); dolphinControllable = getBoolean("mobs.dolphin.controllable", dolphinControllable); -@@ -820,6 +841,7 @@ public class PurpurWorldConfig { +@@ -819,6 +840,7 @@ public class PurpurWorldConfig { dolphinMaxHealth = getDouble("mobs.dolphin.attributes.max_health", dolphinMaxHealth); dolphinScale = Mth.clamp(getDouble("mobs.dolphin.attributes.scale", dolphinScale), 0.0625D, 16.0D); dolphinDisableTreasureSearching = getBoolean("mobs.dolphin.disable-treasure-searching", dolphinDisableTreasureSearching); @@ -1376,7 +1376,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean donkeyRidableInWater = false; -@@ -830,6 +852,7 @@ public class PurpurWorldConfig { +@@ -829,6 +851,7 @@ public class PurpurWorldConfig { public double donkeyMovementSpeedMin = 0.175D; public double donkeyMovementSpeedMax = 0.175D; public int donkeyBreedingTicks = 6000; @@ -1384,7 +1384,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void donkeySettings() { donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { -@@ -846,6 +869,7 @@ public class PurpurWorldConfig { +@@ -845,6 +868,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); @@ -1392,7 +1392,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean drownedRidable = false; -@@ -857,6 +881,7 @@ public class PurpurWorldConfig { +@@ -856,6 +880,7 @@ public class PurpurWorldConfig { public boolean drownedJockeyOnlyBaby = true; public double drownedJockeyChance = 0.05D; public boolean drownedJockeyTryExistingChickens = true; @@ -1400,7 +1400,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -872,12 +897,14 @@ public class PurpurWorldConfig { +@@ -871,12 +896,14 @@ 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); @@ -1415,7 +1415,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void elderGuardianSettings() { elderGuardianRidable = getBoolean("mobs.elder_guardian.ridable", elderGuardianRidable); elderGuardianControllable = getBoolean("mobs.elder_guardian.controllable", elderGuardianControllable); -@@ -888,6 +915,7 @@ public class PurpurWorldConfig { +@@ -887,6 +914,7 @@ public class PurpurWorldConfig { } elderGuardianMaxHealth = getDouble("mobs.elder_guardian.attributes.max_health", elderGuardianMaxHealth); elderGuardianScale = Mth.clamp(getDouble("mobs.elder_guardian.attributes.scale", elderGuardianScale), 0.0625D, 16.0D); @@ -1423,7 +1423,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean enderDragonRidable = false; -@@ -897,6 +925,7 @@ public class PurpurWorldConfig { +@@ -896,6 +924,7 @@ public class PurpurWorldConfig { public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; public boolean enderDragonBypassMobGriefing = false; @@ -1431,7 +1431,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void enderDragonSettings() { enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -914,6 +943,7 @@ public class PurpurWorldConfig { +@@ -913,6 +942,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); @@ -1439,7 +1439,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean endermanRidable = false; -@@ -924,6 +954,7 @@ public class PurpurWorldConfig { +@@ -923,6 +953,7 @@ public class PurpurWorldConfig { public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; @@ -1447,7 +1447,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -938,6 +969,7 @@ public class PurpurWorldConfig { +@@ -937,6 +968,7 @@ 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); @@ -1455,7 +1455,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean endermiteRidable = false; -@@ -945,6 +977,7 @@ public class PurpurWorldConfig { +@@ -944,6 +976,7 @@ public class PurpurWorldConfig { public boolean endermiteControllable = true; public double endermiteMaxHealth = 8.0D; public double endermiteScale = 1.0D; @@ -1463,7 +1463,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void endermiteSettings() { endermiteRidable = getBoolean("mobs.endermite.ridable", endermiteRidable); endermiteRidableInWater = getBoolean("mobs.endermite.ridable-in-water", endermiteRidableInWater); -@@ -956,6 +989,7 @@ public class PurpurWorldConfig { +@@ -955,6 +988,7 @@ public class PurpurWorldConfig { } endermiteMaxHealth = getDouble("mobs.endermite.attributes.max_health", endermiteMaxHealth); endermiteScale = Mth.clamp(getDouble("mobs.endermite.attributes.scale", endermiteScale), 0.0625D, 16.0D); @@ -1471,7 +1471,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean evokerRidable = false; -@@ -964,6 +998,7 @@ public class PurpurWorldConfig { +@@ -963,6 +997,7 @@ public class PurpurWorldConfig { public double evokerMaxHealth = 24.0D; public double evokerScale = 1.0D; public boolean evokerBypassMobGriefing = false; @@ -1479,7 +1479,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void evokerSettings() { evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -976,6 +1011,7 @@ public class PurpurWorldConfig { +@@ -975,6 +1010,7 @@ public class PurpurWorldConfig { evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); evokerScale = Mth.clamp(getDouble("mobs.evoker.attributes.scale", evokerScale), 0.0625D, 16.0D); evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); @@ -1487,7 +1487,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean foxRidable = false; -@@ -986,6 +1022,7 @@ public class PurpurWorldConfig { +@@ -985,6 +1021,7 @@ public class PurpurWorldConfig { public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; public boolean foxBypassMobGriefing = false; @@ -1495,7 +1495,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void foxSettings() { foxRidable = getBoolean("mobs.fox.ridable", foxRidable); foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -1000,6 +1037,7 @@ public class PurpurWorldConfig { +@@ -999,6 +1036,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); @@ -1503,7 +1503,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean frogRidable = false; -@@ -1021,6 +1059,7 @@ public class PurpurWorldConfig { +@@ -1020,6 +1058,7 @@ public class PurpurWorldConfig { public double ghastMaxY = 320D; public double ghastMaxHealth = 10.0D; public double ghastScale = 1.0D; @@ -1511,7 +1511,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void ghastSettings() { ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable); ghastRidableInWater = getBoolean("mobs.ghast.ridable-in-water", ghastRidableInWater); -@@ -1033,6 +1072,7 @@ public class PurpurWorldConfig { +@@ -1032,6 +1071,7 @@ public class PurpurWorldConfig { } ghastMaxHealth = getDouble("mobs.ghast.attributes.max_health", ghastMaxHealth); ghastScale = Mth.clamp(getDouble("mobs.ghast.attributes.scale", ghastScale), 0.0625D, 16.0D); @@ -1519,7 +1519,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean giantRidable = false; -@@ -1046,6 +1086,7 @@ public class PurpurWorldConfig { +@@ -1045,6 +1085,7 @@ public class PurpurWorldConfig { public float giantJumpHeight = 1.0F; public boolean giantHaveAI = false; public boolean giantHaveHostileAI = false; @@ -1527,7 +1527,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void giantSettings() { giantRidable = getBoolean("mobs.giant.ridable", giantRidable); giantRidableInWater = getBoolean("mobs.giant.ridable-in-water", giantRidableInWater); -@@ -1067,6 +1108,7 @@ public class PurpurWorldConfig { +@@ -1066,6 +1107,7 @@ 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); @@ -1535,7 +1535,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean glowSquidRidable = false; -@@ -1074,12 +1116,14 @@ public class PurpurWorldConfig { +@@ -1073,12 +1115,14 @@ public class PurpurWorldConfig { public double glowSquidMaxHealth = 10.0D; public double glowSquidScale = 1.0D; public boolean glowSquidsCanFly = false; @@ -1550,7 +1550,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean goatRidable = false; -@@ -1088,6 +1132,7 @@ public class PurpurWorldConfig { +@@ -1087,6 +1131,7 @@ public class PurpurWorldConfig { public double goatMaxHealth = 10.0D; public double goatScale = 1.0D; public int goatBreedingTicks = 6000; @@ -1558,7 +1558,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void goatSettings() { goatRidable = getBoolean("mobs.goat.ridable", goatRidable); goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); -@@ -1095,12 +1140,14 @@ public class PurpurWorldConfig { +@@ -1094,12 +1139,14 @@ public class PurpurWorldConfig { goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); goatScale = Mth.clamp(getDouble("mobs.goat.attributes.scale", goatScale), 0.0625D, 16.0D); goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); @@ -1573,7 +1573,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void guardianSettings() { guardianRidable = getBoolean("mobs.guardian.ridable", guardianRidable); guardianControllable = getBoolean("mobs.guardian.controllable", guardianControllable); -@@ -1111,6 +1158,7 @@ public class PurpurWorldConfig { +@@ -1110,6 +1157,7 @@ public class PurpurWorldConfig { } guardianMaxHealth = getDouble("mobs.guardian.attributes.max_health", guardianMaxHealth); guardianScale = Mth.clamp(getDouble("mobs.guardian.attributes.scale", guardianScale), 0.0625D, 16.0D); @@ -1581,7 +1581,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean hoglinRidable = false; -@@ -1119,6 +1167,7 @@ public class PurpurWorldConfig { +@@ -1118,6 +1166,7 @@ public class PurpurWorldConfig { public double hoglinMaxHealth = 40.0D; public double hoglinScale = 1.0D; public int hoglinBreedingTicks = 6000; @@ -1589,7 +1589,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void hoglinSettings() { hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -1131,6 +1180,7 @@ public class PurpurWorldConfig { +@@ -1130,6 +1179,7 @@ public class PurpurWorldConfig { hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); hoglinScale = Mth.clamp(getDouble("mobs.hoglin.attributes.scale", hoglinScale), 0.0625D, 16.0D); hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); @@ -1597,7 +1597,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean horseRidableInWater = false; -@@ -1141,6 +1191,7 @@ public class PurpurWorldConfig { +@@ -1140,6 +1190,7 @@ public class PurpurWorldConfig { public double horseMovementSpeedMin = 0.1125D; public double horseMovementSpeedMax = 0.3375D; public int horseBreedingTicks = 6000; @@ -1605,7 +1605,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void horseSettings() { horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -1157,6 +1208,7 @@ public class PurpurWorldConfig { +@@ -1156,6 +1207,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); @@ -1613,7 +1613,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean huskRidable = false; -@@ -1168,6 +1220,7 @@ public class PurpurWorldConfig { +@@ -1167,6 +1219,7 @@ public class PurpurWorldConfig { public boolean huskJockeyOnlyBaby = true; public double huskJockeyChance = 0.05D; public boolean huskJockeyTryExistingChickens = true; @@ -1621,7 +1621,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1183,6 +1236,7 @@ public class PurpurWorldConfig { +@@ -1182,6 +1235,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); @@ -1629,7 +1629,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean illusionerRidable = false; -@@ -1192,6 +1246,7 @@ public class PurpurWorldConfig { +@@ -1191,6 +1245,7 @@ public class PurpurWorldConfig { public double illusionerFollowRange = 18.0D; public double illusionerMaxHealth = 32.0D; public double illusionerScale = 1.0D; @@ -1637,7 +1637,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void illusionerSettings() { illusionerRidable = getBoolean("mobs.illusioner.ridable", illusionerRidable); illusionerRidableInWater = getBoolean("mobs.illusioner.ridable-in-water", illusionerRidableInWater); -@@ -1209,6 +1264,7 @@ public class PurpurWorldConfig { +@@ -1208,6 +1263,7 @@ public class PurpurWorldConfig { } illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max_health", illusionerMaxHealth); illusionerScale = Mth.clamp(getDouble("mobs.illusioner.attributes.scale", illusionerScale), 0.0625D, 16.0D); @@ -1645,7 +1645,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean ironGolemRidable = false; -@@ -1217,6 +1273,7 @@ public class PurpurWorldConfig { +@@ -1216,6 +1272,7 @@ public class PurpurWorldConfig { public boolean ironGolemCanSwim = false; public double ironGolemMaxHealth = 100.0D; public double ironGolemScale = 1.0D; @@ -1653,7 +1653,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void ironGolemSettings() { ironGolemRidable = getBoolean("mobs.iron_golem.ridable", ironGolemRidable); ironGolemRidableInWater = getBoolean("mobs.iron_golem.ridable-in-water", ironGolemRidableInWater); -@@ -1229,6 +1286,7 @@ public class PurpurWorldConfig { +@@ -1228,6 +1285,7 @@ public class PurpurWorldConfig { } ironGolemMaxHealth = getDouble("mobs.iron_golem.attributes.max_health", ironGolemMaxHealth); ironGolemScale = Mth.clamp(getDouble("mobs.iron_golem.attributes.scale", ironGolemScale), 0.0625D, 16.0D); @@ -1661,7 +1661,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean llamaRidable = false; -@@ -1241,6 +1299,7 @@ public class PurpurWorldConfig { +@@ -1240,6 +1298,7 @@ public class PurpurWorldConfig { public double llamaMovementSpeedMin = 0.175D; public double llamaMovementSpeedMax = 0.175D; public int llamaBreedingTicks = 6000; @@ -1669,7 +1669,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1259,6 +1318,7 @@ public class PurpurWorldConfig { +@@ -1258,6 +1317,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); @@ -1677,7 +1677,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean magmaCubeRidable = false; -@@ -1268,6 +1328,7 @@ public class PurpurWorldConfig { +@@ -1267,6 +1327,7 @@ public class PurpurWorldConfig { public String magmaCubeAttackDamage = "size"; public Map magmaCubeMaxHealthCache = new HashMap<>(); public Map magmaCubeAttackDamageCache = new HashMap<>(); @@ -1685,7 +1685,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void magmaCubeSettings() { magmaCubeRidable = getBoolean("mobs.magma_cube.ridable", magmaCubeRidable); magmaCubeRidableInWater = getBoolean("mobs.magma_cube.ridable-in-water", magmaCubeRidableInWater); -@@ -1281,6 +1342,7 @@ public class PurpurWorldConfig { +@@ -1280,6 +1341,7 @@ public class PurpurWorldConfig { magmaCubeAttackDamage = getString("mobs.magma_cube.attributes.attack_damage", magmaCubeAttackDamage); magmaCubeMaxHealthCache.clear(); magmaCubeAttackDamageCache.clear(); @@ -1693,7 +1693,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean mooshroomRidable = false; -@@ -1289,6 +1351,7 @@ public class PurpurWorldConfig { +@@ -1288,6 +1350,7 @@ public class PurpurWorldConfig { public double mooshroomMaxHealth = 10.0D; public double mooshroomScale = 1.0D; public int mooshroomBreedingTicks = 6000; @@ -1701,7 +1701,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void mooshroomSettings() { mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1301,6 +1364,7 @@ public class PurpurWorldConfig { +@@ -1300,6 +1363,7 @@ public class PurpurWorldConfig { mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); mooshroomScale = Mth.clamp(getDouble("mobs.mooshroom.attributes.scale", mooshroomScale), 0.0625D, 16.0D); mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); @@ -1709,7 +1709,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean muleRidableInWater = false; -@@ -1311,6 +1375,7 @@ public class PurpurWorldConfig { +@@ -1310,6 +1374,7 @@ public class PurpurWorldConfig { public double muleMovementSpeedMin = 0.175D; public double muleMovementSpeedMax = 0.175D; public int muleBreedingTicks = 6000; @@ -1717,7 +1717,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void muleSettings() { muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { -@@ -1327,6 +1392,7 @@ public class PurpurWorldConfig { +@@ -1326,6 +1391,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); @@ -1725,7 +1725,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean ocelotRidable = false; -@@ -1335,6 +1401,7 @@ public class PurpurWorldConfig { +@@ -1334,6 +1400,7 @@ public class PurpurWorldConfig { public double ocelotMaxHealth = 10.0D; public double ocelotScale = 1.0D; public int ocelotBreedingTicks = 6000; @@ -1733,7 +1733,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void ocelotSettings() { ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -1347,6 +1414,7 @@ public class PurpurWorldConfig { +@@ -1346,6 +1413,7 @@ public class PurpurWorldConfig { ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); ocelotScale = Mth.clamp(getDouble("mobs.ocelot.attributes.scale", ocelotScale), 0.0625D, 16.0D); ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); @@ -1741,7 +1741,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean pandaRidable = false; -@@ -1355,6 +1423,7 @@ public class PurpurWorldConfig { +@@ -1354,6 +1422,7 @@ public class PurpurWorldConfig { public double pandaMaxHealth = 20.0D; public double pandaScale = 1.0D; public int pandaBreedingTicks = 6000; @@ -1749,7 +1749,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void pandaSettings() { pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -1367,6 +1436,7 @@ public class PurpurWorldConfig { +@@ -1366,6 +1435,7 @@ public class PurpurWorldConfig { pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); pandaScale = Mth.clamp(getDouble("mobs.panda.attributes.scale", pandaScale), 0.0625D, 16.0D); pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); @@ -1757,7 +1757,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean parrotRidable = false; -@@ -1375,6 +1445,7 @@ public class PurpurWorldConfig { +@@ -1374,6 +1444,7 @@ public class PurpurWorldConfig { public double parrotMaxY = 320D; public double parrotMaxHealth = 6.0D; public double parrotScale = 1.0D; @@ -1765,7 +1765,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void parrotSettings() { parrotRidable = getBoolean("mobs.parrot.ridable", parrotRidable); parrotRidableInWater = getBoolean("mobs.parrot.ridable-in-water", parrotRidableInWater); -@@ -1387,6 +1458,7 @@ public class PurpurWorldConfig { +@@ -1386,6 +1457,7 @@ public class PurpurWorldConfig { } parrotMaxHealth = getDouble("mobs.parrot.attributes.max_health", parrotMaxHealth); parrotScale = Mth.clamp(getDouble("mobs.parrot.attributes.scale", parrotScale), 0.0625D, 16.0D); @@ -1773,7 +1773,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean phantomRidable = false; -@@ -1413,6 +1485,7 @@ public class PurpurWorldConfig { +@@ -1412,6 +1484,7 @@ public class PurpurWorldConfig { public boolean phantomIgnorePlayersWithTorch = false; public boolean phantomBurnInDaylight = true; public boolean phantomFlamesOnSwoop = false; @@ -1781,7 +1781,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void phantomSettings() { phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1447,6 +1520,7 @@ public class PurpurWorldConfig { +@@ -1446,6 +1519,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); @@ -1789,7 +1789,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean pigRidable = false; -@@ -1456,6 +1530,7 @@ public class PurpurWorldConfig { +@@ -1455,6 +1529,7 @@ public class PurpurWorldConfig { public double pigScale = 1.0D; public boolean pigGiveSaddleBack = false; public int pigBreedingTicks = 6000; @@ -1797,7 +1797,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void pigSettings() { pigRidable = getBoolean("mobs.pig.ridable", pigRidable); pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -1469,6 +1544,7 @@ public class PurpurWorldConfig { +@@ -1468,6 +1543,7 @@ public class PurpurWorldConfig { pigScale = Mth.clamp(getDouble("mobs.pig.attributes.scale", pigScale), 0.0625D, 16.0D); pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); @@ -1805,7 +1805,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean piglinRidable = false; -@@ -1477,6 +1553,7 @@ public class PurpurWorldConfig { +@@ -1476,6 +1552,7 @@ public class PurpurWorldConfig { public double piglinMaxHealth = 16.0D; public double piglinScale = 1.0D; public boolean piglinBypassMobGriefing = false; @@ -1813,7 +1813,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void piglinSettings() { piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1489,6 +1566,7 @@ public class PurpurWorldConfig { +@@ -1488,6 +1565,7 @@ public class PurpurWorldConfig { piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); piglinScale = Mth.clamp(getDouble("mobs.piglin.attributes.scale", piglinScale), 0.0625D, 16.0D); piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); @@ -1821,7 +1821,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean piglinBruteRidable = false; -@@ -1496,6 +1574,7 @@ public class PurpurWorldConfig { +@@ -1495,6 +1573,7 @@ public class PurpurWorldConfig { public boolean piglinBruteControllable = true; public double piglinBruteMaxHealth = 50.0D; public double piglinBruteScale = 1.0D; @@ -1829,7 +1829,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void piglinBruteSettings() { piglinBruteRidable = getBoolean("mobs.piglin_brute.ridable", piglinBruteRidable); piglinBruteRidableInWater = getBoolean("mobs.piglin_brute.ridable-in-water", piglinBruteRidableInWater); -@@ -1507,6 +1586,7 @@ public class PurpurWorldConfig { +@@ -1506,6 +1585,7 @@ public class PurpurWorldConfig { } piglinBruteMaxHealth = getDouble("mobs.piglin_brute.attributes.max_health", piglinBruteMaxHealth); piglinBruteScale = Mth.clamp(getDouble("mobs.piglin_brute.attributes.scale", piglinBruteScale), 0.0625D, 16.0D); @@ -1837,7 +1837,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean pillagerRidable = false; -@@ -1515,6 +1595,7 @@ public class PurpurWorldConfig { +@@ -1514,6 +1594,7 @@ public class PurpurWorldConfig { public double pillagerMaxHealth = 24.0D; public double pillagerScale = 1.0D; public boolean pillagerBypassMobGriefing = false; @@ -1845,7 +1845,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void pillagerSettings() { pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1527,6 +1608,7 @@ public class PurpurWorldConfig { +@@ -1526,6 +1607,7 @@ public class PurpurWorldConfig { pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); pillagerScale = Mth.clamp(getDouble("mobs.pillager.attributes.scale", pillagerScale), 0.0625D, 16.0D); pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); @@ -1853,7 +1853,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean polarBearRidable = false; -@@ -1537,6 +1619,7 @@ public class PurpurWorldConfig { +@@ -1536,6 +1618,7 @@ public class PurpurWorldConfig { public String polarBearBreedableItemString = ""; public Item polarBearBreedableItem = null; public int polarBearBreedingTicks = 6000; @@ -1861,7 +1861,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void polarBearSettings() { polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -1552,12 +1635,14 @@ public class PurpurWorldConfig { +@@ -1551,12 +1634,14 @@ public class PurpurWorldConfig { Item item = BuiltInRegistries.ITEM.get(ResourceLocation.parse(polarBearBreedableItemString)); if (item != Items.AIR) polarBearBreedableItem = item; polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); @@ -1876,7 +1876,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void pufferfishSettings() { pufferfishRidable = getBoolean("mobs.pufferfish.ridable", pufferfishRidable); pufferfishControllable = getBoolean("mobs.pufferfish.controllable", pufferfishControllable); -@@ -1568,6 +1653,7 @@ public class PurpurWorldConfig { +@@ -1567,6 +1652,7 @@ public class PurpurWorldConfig { } pufferfishMaxHealth = getDouble("mobs.pufferfish.attributes.max_health", pufferfishMaxHealth); pufferfishScale = Mth.clamp(getDouble("mobs.pufferfish.attributes.scale", pufferfishScale), 0.0625D, 16.0D); @@ -1884,7 +1884,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean rabbitRidable = false; -@@ -1579,6 +1665,7 @@ public class PurpurWorldConfig { +@@ -1578,6 +1664,7 @@ public class PurpurWorldConfig { public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; public boolean rabbitBypassMobGriefing = false; @@ -1892,7 +1892,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void rabbitSettings() { rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1594,6 +1681,7 @@ public class PurpurWorldConfig { +@@ -1593,6 +1680,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); @@ -1900,7 +1900,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean ravagerRidable = false; -@@ -1602,6 +1690,7 @@ public class PurpurWorldConfig { +@@ -1601,6 +1689,7 @@ public class PurpurWorldConfig { public double ravagerMaxHealth = 100.0D; public double ravagerScale = 1.0D; public boolean ravagerBypassMobGriefing = false; @@ -1908,7 +1908,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1614,12 +1703,14 @@ public class PurpurWorldConfig { +@@ -1613,12 +1702,14 @@ public class PurpurWorldConfig { ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); ravagerScale = Mth.clamp(getDouble("mobs.ravager.attributes.scale", ravagerScale), 0.0625D, 16.0D); ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); @@ -1923,7 +1923,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void salmonSettings() { salmonRidable = getBoolean("mobs.salmon.ridable", salmonRidable); salmonControllable = getBoolean("mobs.salmon.controllable", salmonControllable); -@@ -1630,6 +1721,7 @@ public class PurpurWorldConfig { +@@ -1629,6 +1720,7 @@ public class PurpurWorldConfig { } salmonMaxHealth = getDouble("mobs.salmon.attributes.max_health", salmonMaxHealth); salmonScale = Mth.clamp(getDouble("mobs.salmon.attributes.scale", salmonScale), 0.0625D, 16.0D); @@ -1931,7 +1931,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean sheepRidable = false; -@@ -1639,6 +1731,7 @@ public class PurpurWorldConfig { +@@ -1638,6 +1730,7 @@ public class PurpurWorldConfig { public double sheepScale = 1.0D; public int sheepBreedingTicks = 6000; public boolean sheepBypassMobGriefing = false; @@ -1939,7 +1939,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void sheepSettings() { sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1652,6 +1745,7 @@ public class PurpurWorldConfig { +@@ -1651,6 +1744,7 @@ public class PurpurWorldConfig { sheepScale = Mth.clamp(getDouble("mobs.sheep.attributes.scale", sheepScale), 0.0625D, 16.0D); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); @@ -1947,7 +1947,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean shulkerRidable = false; -@@ -1659,6 +1753,7 @@ public class PurpurWorldConfig { +@@ -1658,6 +1752,7 @@ public class PurpurWorldConfig { public boolean shulkerControllable = true; public double shulkerMaxHealth = 30.0D; public double shulkerScale = 1.0D; @@ -1955,7 +1955,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void shulkerSettings() { shulkerRidable = getBoolean("mobs.shulker.ridable", shulkerRidable); shulkerRidableInWater = getBoolean("mobs.shulker.ridable-in-water", shulkerRidableInWater); -@@ -1670,6 +1765,7 @@ public class PurpurWorldConfig { +@@ -1669,6 +1764,7 @@ public class PurpurWorldConfig { } shulkerMaxHealth = getDouble("mobs.shulker.attributes.max_health", shulkerMaxHealth); shulkerScale = Mth.clamp(getDouble("mobs.shulker.attributes.scale", shulkerScale), 0.0625D, Shulker.MAX_SCALE); @@ -1963,7 +1963,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean silverfishRidable = false; -@@ -1680,6 +1776,7 @@ public class PurpurWorldConfig { +@@ -1679,6 +1775,7 @@ public class PurpurWorldConfig { public double silverfishMovementSpeed = 0.25D; public double silverfishAttackDamage = 1.0D; public boolean silverfishBypassMobGriefing = false; @@ -1971,7 +1971,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void silverfishSettings() { silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -1694,6 +1791,7 @@ public class PurpurWorldConfig { +@@ -1693,6 +1790,7 @@ public class PurpurWorldConfig { silverfishMovementSpeed = getDouble("mobs.silverfish.attributes.movement_speed", silverfishMovementSpeed); silverfishAttackDamage = getDouble("mobs.silverfish.attributes.attack_damage", silverfishAttackDamage); silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); @@ -1979,7 +1979,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean skeletonRidable = false; -@@ -1701,6 +1799,7 @@ public class PurpurWorldConfig { +@@ -1700,6 +1798,7 @@ public class PurpurWorldConfig { public boolean skeletonControllable = true; public double skeletonMaxHealth = 20.0D; public double skeletonScale = 1.0D; @@ -1987,7 +1987,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void skeletonSettings() { skeletonRidable = getBoolean("mobs.skeleton.ridable", skeletonRidable); skeletonRidableInWater = getBoolean("mobs.skeleton.ridable-in-water", skeletonRidableInWater); -@@ -1712,6 +1811,7 @@ public class PurpurWorldConfig { +@@ -1711,6 +1810,7 @@ public class PurpurWorldConfig { } skeletonMaxHealth = getDouble("mobs.skeleton.attributes.max_health", skeletonMaxHealth); skeletonScale = Mth.clamp(getDouble("mobs.skeleton.attributes.scale", skeletonScale), 0.0625D, 16.0D); @@ -1995,7 +1995,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean skeletonHorseRidable = false; -@@ -1723,6 +1823,7 @@ public class PurpurWorldConfig { +@@ -1722,6 +1822,7 @@ public class PurpurWorldConfig { public double skeletonHorseJumpStrengthMax = 1.0D; public double skeletonHorseMovementSpeedMin = 0.2D; public double skeletonHorseMovementSpeedMax = 0.2D; @@ -2003,7 +2003,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void skeletonHorseSettings() { skeletonHorseRidable = getBoolean("mobs.skeleton_horse.ridable", skeletonHorseRidable); skeletonHorseRidableInWater = getBoolean("mobs.skeleton_horse.ridable-in-water", skeletonHorseRidableInWater); -@@ -1739,6 +1840,7 @@ public class PurpurWorldConfig { +@@ -1738,6 +1839,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); @@ -2011,7 +2011,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean slimeRidable = false; -@@ -1748,6 +1850,7 @@ public class PurpurWorldConfig { +@@ -1747,6 +1849,7 @@ public class PurpurWorldConfig { public String slimeAttackDamage = "size"; public Map slimeMaxHealthCache = new HashMap<>(); public Map slimeAttackDamageCache = new HashMap<>(); @@ -2019,7 +2019,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void slimeSettings() { slimeRidable = getBoolean("mobs.slime.ridable", slimeRidable); slimeRidableInWater = getBoolean("mobs.slime.ridable-in-water", slimeRidableInWater); -@@ -1761,6 +1864,7 @@ public class PurpurWorldConfig { +@@ -1760,6 +1863,7 @@ public class PurpurWorldConfig { slimeAttackDamage = getString("mobs.slime.attributes.attack_damage", slimeAttackDamage); slimeMaxHealthCache.clear(); slimeAttackDamageCache.clear(); @@ -2027,7 +2027,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean snowGolemRidable = false; -@@ -1775,6 +1879,7 @@ public class PurpurWorldConfig { +@@ -1774,6 +1878,7 @@ public class PurpurWorldConfig { public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; public boolean snowGolemBypassMobGriefing = false; @@ -2035,7 +2035,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void snowGolemSettings() { snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1793,6 +1898,7 @@ public class PurpurWorldConfig { +@@ -1792,6 +1897,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); @@ -2043,7 +2043,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean snifferRidable = false; -@@ -1817,6 +1923,7 @@ public class PurpurWorldConfig { +@@ -1816,6 +1922,7 @@ public class PurpurWorldConfig { public boolean squidImmuneToEAR = true; public double squidOffsetWaterCheck = 0.0D; public boolean squidsCanFly = false; @@ -2051,7 +2051,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void squidSettings() { squidRidable = getBoolean("mobs.squid.ridable", squidRidable); squidControllable = getBoolean("mobs.squid.controllable", squidControllable); -@@ -1830,6 +1937,7 @@ public class PurpurWorldConfig { +@@ -1829,6 +1936,7 @@ 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); @@ -2059,7 +2059,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean spiderRidable = false; -@@ -1837,6 +1945,7 @@ public class PurpurWorldConfig { +@@ -1836,6 +1944,7 @@ public class PurpurWorldConfig { public boolean spiderControllable = true; public double spiderMaxHealth = 16.0D; public double spiderScale = 1.0D; @@ -2067,7 +2067,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void spiderSettings() { spiderRidable = getBoolean("mobs.spider.ridable", spiderRidable); spiderRidableInWater = getBoolean("mobs.spider.ridable-in-water", spiderRidableInWater); -@@ -1848,6 +1957,7 @@ public class PurpurWorldConfig { +@@ -1847,6 +1956,7 @@ public class PurpurWorldConfig { } spiderMaxHealth = getDouble("mobs.spider.attributes.max_health", spiderMaxHealth); spiderScale = Mth.clamp(getDouble("mobs.spider.attributes.scale", spiderScale), 0.0625D, 16.0D); @@ -2075,7 +2075,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean strayRidable = false; -@@ -1855,6 +1965,7 @@ public class PurpurWorldConfig { +@@ -1854,6 +1964,7 @@ public class PurpurWorldConfig { public boolean strayControllable = true; public double strayMaxHealth = 20.0D; public double strayScale = 1.0D; @@ -2083,7 +2083,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void straySettings() { strayRidable = getBoolean("mobs.stray.ridable", strayRidable); strayRidableInWater = getBoolean("mobs.stray.ridable-in-water", strayRidableInWater); -@@ -1866,6 +1977,7 @@ public class PurpurWorldConfig { +@@ -1865,6 +1976,7 @@ public class PurpurWorldConfig { } strayMaxHealth = getDouble("mobs.stray.attributes.max_health", strayMaxHealth); strayScale = Mth.clamp(getDouble("mobs.stray.attributes.scale", strayScale), 0.0625D, 16.0D); @@ -2091,7 +2091,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean striderRidable = false; -@@ -1875,6 +1987,7 @@ public class PurpurWorldConfig { +@@ -1874,6 +1986,7 @@ public class PurpurWorldConfig { public double striderScale = 1.0D; public int striderBreedingTicks = 6000; public boolean striderGiveSaddleBack = false; @@ -2099,7 +2099,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void striderSettings() { striderRidable = getBoolean("mobs.strider.ridable", striderRidable); striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1888,6 +2001,7 @@ public class PurpurWorldConfig { +@@ -1887,6 +2000,7 @@ public class PurpurWorldConfig { striderScale = Mth.clamp(getDouble("mobs.strider.attributes.scale", striderScale), 0.0625D, 16.0D); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); @@ -2107,7 +2107,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean tadpoleRidable = false; -@@ -1909,6 +2023,7 @@ public class PurpurWorldConfig { +@@ -1908,6 +2022,7 @@ public class PurpurWorldConfig { public double traderLlamaMovementSpeedMin = 0.175D; public double traderLlamaMovementSpeedMax = 0.175D; public int traderLlamaBreedingTicks = 6000; @@ -2115,7 +2115,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void traderLlamaSettings() { traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -1927,12 +2042,14 @@ public class PurpurWorldConfig { +@@ -1926,12 +2041,14 @@ 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); @@ -2130,7 +2130,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void tropicalFishSettings() { tropicalFishRidable = getBoolean("mobs.tropical_fish.ridable", tropicalFishRidable); tropicalFishControllable = getBoolean("mobs.tropical_fish.controllable", tropicalFishControllable); -@@ -1943,6 +2060,7 @@ public class PurpurWorldConfig { +@@ -1942,6 +2059,7 @@ public class PurpurWorldConfig { } tropicalFishMaxHealth = getDouble("mobs.tropical_fish.attributes.max_health", tropicalFishMaxHealth); tropicalFishScale = Mth.clamp(getDouble("mobs.tropical_fish.attributes.scale", tropicalFishScale), 0.0625D, 16.0D); @@ -2138,7 +2138,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean turtleRidable = false; -@@ -1951,6 +2069,7 @@ public class PurpurWorldConfig { +@@ -1950,6 +2068,7 @@ public class PurpurWorldConfig { public double turtleMaxHealth = 30.0D; public double turtleScale = 1.0D; public int turtleBreedingTicks = 6000; @@ -2146,7 +2146,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void turtleSettings() { turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -1963,6 +2082,7 @@ public class PurpurWorldConfig { +@@ -1962,6 +2081,7 @@ public class PurpurWorldConfig { turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); turtleScale = Mth.clamp(getDouble("mobs.turtle.attributes.scale", turtleScale), 0.0625D, 16.0D); turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); @@ -2154,7 +2154,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean vexRidable = false; -@@ -1971,6 +2091,7 @@ public class PurpurWorldConfig { +@@ -1970,6 +2090,7 @@ public class PurpurWorldConfig { public double vexMaxY = 320D; public double vexMaxHealth = 14.0D; public double vexScale = 1.0D; @@ -2162,7 +2162,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void vexSettings() { vexRidable = getBoolean("mobs.vex.ridable", vexRidable); vexRidableInWater = getBoolean("mobs.vex.ridable-in-water", vexRidableInWater); -@@ -1983,6 +2104,7 @@ public class PurpurWorldConfig { +@@ -1982,6 +2103,7 @@ public class PurpurWorldConfig { } vexMaxHealth = getDouble("mobs.vex.attributes.max_health", vexMaxHealth); vexScale = Mth.clamp(getDouble("mobs.vex.attributes.scale", vexScale), 0.0625D, 16.0D); @@ -2170,7 +2170,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean villagerRidable = false; -@@ -1997,6 +2119,7 @@ public class PurpurWorldConfig { +@@ -1996,6 +2118,7 @@ public class PurpurWorldConfig { public boolean villagerClericsFarmWarts = false; public boolean villagerClericFarmersThrowWarts = true; public boolean villagerBypassMobGriefing = false; @@ -2178,7 +2178,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2015,6 +2138,7 @@ public class PurpurWorldConfig { +@@ -2014,6 +2137,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); @@ -2186,7 +2186,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean vindicatorRidable = false; -@@ -2023,6 +2147,7 @@ public class PurpurWorldConfig { +@@ -2022,6 +2146,7 @@ public class PurpurWorldConfig { public double vindicatorMaxHealth = 24.0D; public double vindicatorScale = 1.0D; public double vindicatorJohnnySpawnChance = 0D; @@ -2194,7 +2194,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void vindicatorSettings() { vindicatorRidable = getBoolean("mobs.vindicator.ridable", vindicatorRidable); vindicatorRidableInWater = getBoolean("mobs.vindicator.ridable-in-water", vindicatorRidableInWater); -@@ -2035,6 +2160,7 @@ public class PurpurWorldConfig { +@@ -2034,6 +2159,7 @@ public class PurpurWorldConfig { vindicatorMaxHealth = getDouble("mobs.vindicator.attributes.max_health", vindicatorMaxHealth); vindicatorScale = Mth.clamp(getDouble("mobs.vindicator.attributes.scale", vindicatorScale), 0.0625D, 16.0D); vindicatorJohnnySpawnChance = getDouble("mobs.vindicator.johnny.spawn-chance", vindicatorJohnnySpawnChance); @@ -2202,7 +2202,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean wanderingTraderRidable = false; -@@ -2044,6 +2170,7 @@ public class PurpurWorldConfig { +@@ -2043,6 +2169,7 @@ public class PurpurWorldConfig { public double wanderingTraderScale = 1.0D; public boolean wanderingTraderFollowEmeraldBlock = false; public boolean wanderingTraderCanBeLeashed = false; @@ -2210,7 +2210,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -2057,6 +2184,7 @@ public class PurpurWorldConfig { +@@ -2056,6 +2183,7 @@ public class PurpurWorldConfig { wanderingTraderScale = Mth.clamp(getDouble("mobs.wandering_trader.attributes.scale", wanderingTraderScale), 0.0625D, 16.0D); wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); @@ -2218,7 +2218,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean wardenRidable = false; -@@ -2073,6 +2201,7 @@ public class PurpurWorldConfig { +@@ -2072,6 +2200,7 @@ public class PurpurWorldConfig { public boolean witchControllable = true; public double witchMaxHealth = 26.0D; public double witchScale = 1.0D; @@ -2226,7 +2226,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void witchSettings() { witchRidable = getBoolean("mobs.witch.ridable", witchRidable); witchRidableInWater = getBoolean("mobs.witch.ridable-in-water", witchRidableInWater); -@@ -2084,6 +2213,7 @@ public class PurpurWorldConfig { +@@ -2083,6 +2212,7 @@ public class PurpurWorldConfig { } witchMaxHealth = getDouble("mobs.witch.attributes.max_health", witchMaxHealth); witchScale = Mth.clamp(getDouble("mobs.witch.attributes.scale", witchScale), 0.0625D, 16.0D); @@ -2234,7 +2234,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean witherRidable = false; -@@ -2095,6 +2225,7 @@ public class PurpurWorldConfig { +@@ -2094,6 +2224,7 @@ public class PurpurWorldConfig { public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; public boolean witherBypassMobGriefing = false; @@ -2242,7 +2242,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void witherSettings() { witherRidable = getBoolean("mobs.wither.ridable", witherRidable); witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -2114,6 +2245,7 @@ public class PurpurWorldConfig { +@@ -2113,6 +2244,7 @@ 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); @@ -2250,7 +2250,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean witherSkeletonRidable = false; -@@ -2121,6 +2253,7 @@ public class PurpurWorldConfig { +@@ -2120,6 +2252,7 @@ public class PurpurWorldConfig { public boolean witherSkeletonControllable = true; public double witherSkeletonMaxHealth = 20.0D; public double witherSkeletonScale = 1.0D; @@ -2258,7 +2258,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void witherSkeletonSettings() { witherSkeletonRidable = getBoolean("mobs.wither_skeleton.ridable", witherSkeletonRidable); witherSkeletonRidableInWater = getBoolean("mobs.wither_skeleton.ridable-in-water", witherSkeletonRidableInWater); -@@ -2132,6 +2265,7 @@ public class PurpurWorldConfig { +@@ -2131,6 +2264,7 @@ public class PurpurWorldConfig { } witherSkeletonMaxHealth = getDouble("mobs.wither_skeleton.attributes.max_health", witherSkeletonMaxHealth); witherSkeletonScale = Mth.clamp(getDouble("mobs.wither_skeleton.attributes.scale", witherSkeletonScale), 0.0625D, 16.0D); @@ -2266,7 +2266,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean wolfRidable = false; -@@ -2143,6 +2277,7 @@ public class PurpurWorldConfig { +@@ -2142,6 +2276,7 @@ public class PurpurWorldConfig { public boolean wolfMilkCuresRabies = true; public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; @@ -2274,7 +2274,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void wolfSettings() { wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -2162,6 +2297,7 @@ public class PurpurWorldConfig { +@@ -2161,6 +2296,7 @@ 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); @@ -2282,7 +2282,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean zoglinRidable = false; -@@ -2169,6 +2305,7 @@ public class PurpurWorldConfig { +@@ -2168,6 +2304,7 @@ public class PurpurWorldConfig { public boolean zoglinControllable = true; public double zoglinMaxHealth = 40.0D; public double zoglinScale = 1.0D; @@ -2290,7 +2290,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void zoglinSettings() { zoglinRidable = getBoolean("mobs.zoglin.ridable", zoglinRidable); zoglinRidableInWater = getBoolean("mobs.zoglin.ridable-in-water", zoglinRidableInWater); -@@ -2180,6 +2317,7 @@ public class PurpurWorldConfig { +@@ -2179,6 +2316,7 @@ public class PurpurWorldConfig { } zoglinMaxHealth = getDouble("mobs.zoglin.attributes.max_health", zoglinMaxHealth); zoglinScale = Mth.clamp(getDouble("mobs.zoglin.attributes.scale", zoglinScale), 0.0625D, 16.0D); @@ -2298,7 +2298,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean zombieRidable = false; -@@ -2193,6 +2331,7 @@ public class PurpurWorldConfig { +@@ -2192,6 +2330,7 @@ public class PurpurWorldConfig { public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; public boolean zombieBypassMobGriefing = false; @@ -2306,7 +2306,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2210,6 +2349,7 @@ public class PurpurWorldConfig { +@@ -2209,6 +2348,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); @@ -2314,7 +2314,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean zombieHorseRidable = false; -@@ -2222,6 +2362,7 @@ public class PurpurWorldConfig { +@@ -2221,6 +2361,7 @@ public class PurpurWorldConfig { public double zombieHorseMovementSpeedMin = 0.2D; public double zombieHorseMovementSpeedMax = 0.2D; public double zombieHorseSpawnChance = 0.0D; @@ -2322,7 +2322,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void zombieHorseSettings() { zombieHorseRidable = getBoolean("mobs.zombie_horse.ridable", zombieHorseRidable); zombieHorseRidableInWater = getBoolean("mobs.zombie_horse.ridable-in-water", zombieHorseRidableInWater); -@@ -2239,6 +2380,7 @@ public class PurpurWorldConfig { +@@ -2238,6 +2379,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); @@ -2330,7 +2330,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean zombieVillagerRidable = false; -@@ -2250,6 +2392,7 @@ public class PurpurWorldConfig { +@@ -2249,6 +2391,7 @@ public class PurpurWorldConfig { public boolean zombieVillagerJockeyOnlyBaby = true; public double zombieVillagerJockeyChance = 0.05D; public boolean zombieVillagerJockeyTryExistingChickens = true; @@ -2338,7 +2338,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -2265,6 +2408,7 @@ public class PurpurWorldConfig { +@@ -2264,6 +2407,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); @@ -2346,7 +2346,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e } public boolean zombifiedPiglinRidable = false; -@@ -2277,6 +2421,7 @@ public class PurpurWorldConfig { +@@ -2276,6 +2420,7 @@ public class PurpurWorldConfig { public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; @@ -2354,7 +2354,7 @@ index f8717837f1fb25b244e38f4b32c73e57158a2bb9..791b12dd28c0a56cc9ce6a4e4414b85e private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -2293,5 +2438,6 @@ public class PurpurWorldConfig { +@@ -2292,5 +2437,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/0121-Config-to-always-tame-in-Creative.patch similarity index 88% rename from patches/unapplied-server/0125-Config-to-always-tame-in-Creative.patch rename to patches/server/0121-Config-to-always-tame-in-Creative.patch index eda45c2de..884b215ba 100644 --- a/patches/unapplied-server/0125-Config-to-always-tame-in-Creative.patch +++ b/patches/server/0121-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 4476fb2764bccdb0868e6e43f3a803971982effb..2cbaebbdc6bf4ce9131e67d891a612ec6ce86275 100644 +index 1a060021f92822a85aa45d682ee09d8ef69d7a1f..8f0a31c896340907aa8017c0a56fb58db48c2c65 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -513,7 +513,7 @@ public class Cat extends TamableAnimal implements VariantHolder collisionsBB = new java.util.ArrayList<>(); + private boolean isPlayerCollidingWithAnythingNew(LevelReader world, AABB box, double newX, double newY, double newZ) { + AABB axisalignedbb1 = this.player.getBoundingBox().move(newX - this.player.getX(), newY - this.player.getY(), newZ - this.player.getZ()); + Iterable iterable = world.getCollisions(this.player, axisalignedbb1.deflate(9.999999747378752E-6D)); diff --git a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java index 99a7e9eb75231c15bd8bb24fbb4e296bc9fdedff..a375d40ec6365ba8704ba3ece22dd5b2de9857b5 100644 --- a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java @@ -93,24 +93,24 @@ index c83e80ebdbbfb2d0e08561a44486a308d16f50af..aa65f4bf60172a2629daf6e15f7f48d2 } // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSources.java b/src/main/java/net/minecraft/world/damagesource/DamageSources.java -index e34584e4780f343d6c946af5377088d53818e88e..da790aac3bd8981f351b7e241015ff42bd0da73b 100644 +index be87cb3cfa15a7d889118cdc4b87232e30749023..61e906fb47b242e86789dca1a210473c76863166 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSources.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSources.java -@@ -45,11 +45,13 @@ public class DamageSources { +@@ -46,11 +46,13 @@ public class DamageSources { // CraftBukkit start private final DamageSource melting; private final DamageSource poison; + private final DamageSource scissors; // Purpur public DamageSources(RegistryAccess registryManager) { - this.damageTypes = registryManager.registryOrThrow(Registries.DAMAGE_TYPE); + this.damageTypes = registryManager.lookupOrThrow(Registries.DAMAGE_TYPE); this.melting = this.source(DamageTypes.ON_FIRE).melting(); this.poison = this.source(DamageTypes.MAGIC).poison(); + this.scissors = this.source(DamageTypes.MAGIC).scissors(); // Purpur // CraftBukkit end this.inFire = this.source(DamageTypes.IN_FIRE); this.campfire = this.source(DamageTypes.CAMPFIRE); -@@ -99,6 +101,12 @@ public class DamageSources { +@@ -101,6 +103,12 @@ public class DamageSources { } // CraftBukkit end @@ -149,10 +149,10 @@ index 2685a3e5e4d0a1559f2d28152bab73b8982362fd..6fcb2db92a38e862da288518ce34d16a public static String serverModName = io.papermc.paper.ServerBuildInfo.buildInfo().brandName(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index caeaf92e383cb5aa7e2e2c053adc7aee391f38a7..1cf04d5acd6a252762f643f5933f22846930c1a0 100644 +index 49edc77bdfe789408e553b9e08aa09ee23806aa1..77e6729051509bdf6d226206578a813b3e80cedc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -190,6 +190,10 @@ public class PurpurWorldConfig { +@@ -189,6 +189,10 @@ public class PurpurWorldConfig { public List itemImmuneToExplosion = new ArrayList<>(); public List itemImmuneToFire = new ArrayList<>(); public List itemImmuneToLightning = new ArrayList<>(); @@ -163,7 +163,7 @@ index caeaf92e383cb5aa7e2e2c053adc7aee391f38a7..1cf04d5acd6a252762f643f5933f2284 private void itemSettings() { itemImmuneToCactus.clear(); getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { -@@ -227,6 +231,10 @@ public class PurpurWorldConfig { +@@ -226,6 +230,10 @@ public class PurpurWorldConfig { Item item = BuiltInRegistries.ITEM.get(ResourceLocation.parse(key.toString())); if (item != Items.AIR) itemImmuneToLightning.add(item); }); diff --git a/patches/unapplied-server/0129-One-Punch-Man.patch b/patches/server/0125-One-Punch-Man.patch similarity index 83% rename from patches/unapplied-server/0129-One-Punch-Man.patch rename to patches/server/0125-One-Punch-Man.patch index ce9bc535f..a59f27af2 100644 --- a/patches/unapplied-server/0129-One-Punch-Man.patch +++ b/patches/server/0125-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 4f172f9a0ec61a10b0b1411b9d0eb82d49bd0c57..7a99319d6ac85fd794fef361dd6f8092b847c744 100644 +index 7c60a938850e5db62022217168a075e2b88fa22d..698340b3934a500ebd2cc50bc8818914d53af92d 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1441,6 +1441,24 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1457,6 +1457,24 @@ public abstract class LivingEntity extends Entity implements Attackable { this.stopSleeping(); } @@ -32,13 +32,13 @@ index 4f172f9a0ec61a10b0b1411b9d0eb82d49bd0c57..7a99319d6ac85fd794fef361dd6f8092 + // Purpur end + this.noActionTime = 0; - float f1 = amount; final float originalAmount = f1; // Paper - revert to vanilla #hurt - OBFHELPER - boolean flag = amount > 0.0F && this.isDamageSourceBlocked(source); // Copied from below + if (amount < 0.0F) { + amount = 0.0F; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1cf04d5acd6a252762f643f5933f22846930c1a0..a963ceb3b9ed41d36239c468ebc901e3d94e4768 100644 +index 77e6729051509bdf6d226206578a813b3e80cedc..bdf8bdf14cc54ddb44c6e6f7bc1572bb7920dd45 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -337,6 +337,7 @@ public class PurpurWorldConfig { +@@ -336,6 +336,7 @@ public class PurpurWorldConfig { public boolean teleportIfOutsideBorder = false; public boolean totemOfUndyingWorksInInventory = false; public boolean playerFixStuckPortal = false; @@ -46,7 +46,7 @@ index 1cf04d5acd6a252762f643f5933f22846930c1a0..a963ceb3b9ed41d36239c468ebc901e3 private void playerSettings() { if (PurpurConfig.version < 19) { boolean oldVal = getBoolean("gameplay-mechanics.player.idle-timeout.mods-target", idleTimeoutTargetPlayer); -@@ -353,6 +354,7 @@ public class PurpurWorldConfig { +@@ -352,6 +353,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); diff --git a/patches/unapplied-server/0130-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch b/patches/server/0126-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch similarity index 60% rename from patches/unapplied-server/0130-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch rename to patches/server/0126-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch index e34509471..3cc696de6 100644 --- a/patches/unapplied-server/0130-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch +++ b/patches/server/0126-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch @@ -8,45 +8,44 @@ 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 1aa5e57a4e6a4be60514d8808a2e6c973d93e798..0d2a18190c46f34277a714570267bcc33507ff10 100644 +index 5f790dd24f2bdae827c6dc597064b9b265089751..88bb9ef154faf45a270750914b9b6b769819ccb9 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -@@ -77,7 +77,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { +@@ -152,7 +152,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 (this.random.nextFloat() < worldserver.purpurConfig.enderPearlEndermiteChance && worldserver.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { // Purpur + Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(worldserver, EntitySpawnReason.TRIGGERED); 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 { +@@ -170,7 +170,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { + if (entityplayer1 != null) { + entityplayer1.resetFallDistance(); + entityplayer1.resetCurrentImpulseContext(); +- entityplayer1.hurtServer(entityplayer.serverLevel(), this.damageSources().enderPearl().customEventDamager(this), 5.0F); // CraftBukkit // Paper - fix DamageSource API ++ entityplayer1.hurtServer(entityplayer.serverLevel(), this.damageSources().enderPearl().customEventDamager(this), this.level().purpurConfig.enderPearlDamage); // CraftBukkit // Paper - fix DamageSource API // Purpur + } + + this.playSound(worldserver, vec3d); 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 +index b232390d8ee8e449e61c0ea7f3af60df507abb97..ad99c6fb7bcd8ccbdeb405ca7ff73ae4d1c2f2ee 100644 --- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java +++ b/src/main/java/net/minecraft/world/item/EnderpearlItem.java -@@ -36,7 +36,7 @@ public class EnderpearlItem extends Item { +@@ -35,6 +35,7 @@ public class EnderpearlItem extends Item { - world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (net.minecraft.world.entity.Entity.SHARED_RANDOM.nextFloat() * 0.4F + 0.8F)); + world.playSound((Player) null, user.getX(), user.getY(), user.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); user.awardStat(Stats.ITEM_USED.get(this)); -- user.getCooldowns().addCooldown(this, 20); -+ user.getCooldowns().addCooldown(this, user.getAbilities().instabuild ? world.purpurConfig.enderPearlCooldownCreative : world.purpurConfig.enderPearlCooldown); // Purpur ++ user.getCooldowns().addCooldown(itemstack, user.getAbilities().instabuild ? world.purpurConfig.enderPearlCooldownCreative : world.purpurConfig.enderPearlCooldown); // Purpur } else { - // Paper end - PlayerLaunchProjectileEvent + // 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 a963ceb3b9ed41d36239c468ebc901e3d94e4768..70d5b6e46dce5f1e22f7bc365fd01e6da8a7c591 100644 +index bdf8bdf14cc54ddb44c6e6f7bc1572bb7920dd45..428fd6150856e3f247c37779891c5ccc92dddcc1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -194,6 +194,10 @@ public class PurpurWorldConfig { +@@ -193,6 +193,10 @@ public class PurpurWorldConfig { public boolean ignoreScissorsInWater = false; public boolean ignoreScissorsInLava = false; public double scissorsRunningDamage = 1D; @@ -57,7 +56,7 @@ index a963ceb3b9ed41d36239c468ebc901e3d94e4768..70d5b6e46dce5f1e22f7bc365fd01e6d private void itemSettings() { itemImmuneToCactus.clear(); getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> { -@@ -235,6 +239,10 @@ public class PurpurWorldConfig { +@@ -234,6 +238,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/0127-Config-to-ignore-nearby-mobs-when-sleeping.patch similarity index 84% rename from patches/unapplied-server/0131-Config-to-ignore-nearby-mobs-when-sleeping.patch rename to patches/server/0127-Config-to-ignore-nearby-mobs-when-sleeping.patch index 902bf3410..0c5dfde44 100644 --- a/patches/unapplied-server/0131-Config-to-ignore-nearby-mobs-when-sleeping.patch +++ b/patches/server/0127-Config-to-ignore-nearby-mobs-when-sleeping.patch @@ -5,11 +5,11 @@ 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 d677c1308412e5a12046225ce2449af136b7665f..513ab3d7d3ff4fe0a5c9c609ca752357b2d8055a 100644 +index c64b2386f35c55e3484df2d193f712a1728dc745..8d4e50aade704403cd713506268a1711080f72a3 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1529,7 +1529,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple - return entitymonster.isPreventingPlayerRest(this); +@@ -1791,7 +1791,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple + return entitymonster.isPreventingPlayerRest(this.serverLevel(), this); }); - if (!list.isEmpty()) { @@ -18,10 +18,10 @@ index d677c1308412e5a12046225ce2449af136b7665f..513ab3d7d3ff4fe0a5c9c609ca752357 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 70d5b6e46dce5f1e22f7bc365fd01e6da8a7c591..4293d2a343fa9ac2dec503371c2fb62311f8e77f 100644 +index 428fd6150856e3f247c37779891c5ccc92dddcc1..f032d27542b26797126a9b060fa52237349dbca5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -346,6 +346,7 @@ public class PurpurWorldConfig { +@@ -345,6 +345,7 @@ public class PurpurWorldConfig { public boolean totemOfUndyingWorksInInventory = false; public boolean playerFixStuckPortal = false; public boolean creativeOnePunch = false; @@ -29,7 +29,7 @@ index 70d5b6e46dce5f1e22f7bc365fd01e6da8a7c591..4293d2a343fa9ac2dec503371c2fb623 private void playerSettings() { if (PurpurConfig.version < 19) { boolean oldVal = getBoolean("gameplay-mechanics.player.idle-timeout.mods-target", idleTimeoutTargetPlayer); -@@ -363,6 +364,7 @@ public class PurpurWorldConfig { +@@ -362,6 +363,7 @@ public class PurpurWorldConfig { 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/0132-Add-back-player-spawned-endermite-API.patch b/patches/server/0128-Add-back-player-spawned-endermite-API.patch similarity index 90% rename from patches/unapplied-server/0132-Add-back-player-spawned-endermite-API.patch rename to patches/server/0128-Add-back-player-spawned-endermite-API.patch index 5a838354e..8dd320556 100644 --- a/patches/unapplied-server/0132-Add-back-player-spawned-endermite-API.patch +++ b/patches/server/0128-Add-back-player-spawned-endermite-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add back player spawned endermite API diff --git a/src/main/java/net/minecraft/world/entity/monster/Endermite.java b/src/main/java/net/minecraft/world/entity/monster/Endermite.java -index dd73278cea317280b88c3290dfcc052866c9ec52..13c41b561683231a369affd309a28509c8ce5c93 100644 +index e8b7e291c96ff6856832fc6612f792fc778e5162..806719a3673f3c333bfc720a7ccf07f7ba5cffc2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java +++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java @@ -32,6 +32,7 @@ public class Endermite extends Monster { @@ -47,11 +47,11 @@ index dd73278cea317280b88c3290dfcc052866c9ec52..13c41b561683231a369affd309a28509 @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 0d2a18190c46f34277a714570267bcc33507ff10..334fa781e94d195c13dd78cdbe8f43b4b126ebd0 100644 +index 88bb9ef154faf45a270750914b9b6b769819ccb9..7cc4a2a6cfef90a84859a128a9e0521ce3110854 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -@@ -81,6 +81,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { - Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(worldserver); +@@ -156,6 +156,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { + Endermite entityendermite = (Endermite) EntityType.ENDERMITE.create(worldserver, EntitySpawnReason.TRIGGERED); if (entityendermite != null) { + entityendermite.setPlayerSpawned(true); // Purpur diff --git a/patches/unapplied-server/0133-Config-Enderman-aggressiveness-towards-Endermites.patch b/patches/server/0129-Config-Enderman-aggressiveness-towards-Endermites.patch similarity index 92% rename from patches/unapplied-server/0133-Config-Enderman-aggressiveness-towards-Endermites.patch rename to patches/server/0129-Config-Enderman-aggressiveness-towards-Endermites.patch index 99a34d992..d7e5ce56d 100644 --- a/patches/unapplied-server/0133-Config-Enderman-aggressiveness-towards-Endermites.patch +++ b/patches/server/0129-Config-Enderman-aggressiveness-towards-Endermites.patch @@ -5,7 +5,7 @@ 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 d4360a62cc2514dafc02749e49674213db65cc85..22583cdb173862b021c9701d26171ca337796557 100644 +index d48be9b5ac329bddd1eb3c26d35421b32d87f547..4a223113757320610eddd89d5404dd54e38fc87d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -132,7 +132,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -18,10 +18,10 @@ index d4360a62cc2514dafc02749e49674213db65cc85..22583cdb173862b021c9701d26171ca3 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4293d2a343fa9ac2dec503371c2fb62311f8e77f..9dd087d34438b7685e50d4574e3cb58c09bdf9c5 100644 +index f032d27542b26797126a9b060fa52237349dbca5..2b0984f7a2dd0d2f42f59b85a5b6e8d7b09319c2 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1016,6 +1016,8 @@ public class PurpurWorldConfig { +@@ -1015,6 +1015,8 @@ public class PurpurWorldConfig { public boolean endermanDespawnEvenWithBlock = false; public boolean endermanBypassMobGriefing = false; public boolean endermanTakeDamageFromWater = true; @@ -30,7 +30,7 @@ index 4293d2a343fa9ac2dec503371c2fb62311f8e77f..9dd087d34438b7685e50d4574e3cb58c private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -1025,12 +1027,18 @@ public class PurpurWorldConfig { +@@ -1024,12 +1026,18 @@ 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/0130-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch similarity index 63% rename from patches/unapplied-server/0134-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch rename to patches/server/0130-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch index 0aee4c529..96e4a57cf 100644 --- a/patches/unapplied-server/0134-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch +++ b/patches/server/0130-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch @@ -7,36 +7,34 @@ 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 22583cdb173862b021c9701d26171ca337796557..65c7bf88071dda62034d71b6a83caedd49d0902a 100644 +index 4a223113757320610eddd89d5404dd54e38fc87d..27a4b47ad46700b595dd829e6aab558d170c0a8f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -269,7 +269,7 @@ public class EnderMan extends Monster implements NeutralMob { - // Paper end - EndermanAttackPlayerEvent - ItemStack itemstack = (ItemStack) player.getInventory().armor.get(3); +@@ -260,7 +260,7 @@ public class EnderMan extends Monster implements NeutralMob { -- if (itemstack.is(Blocks.CARVED_PUMPKIN.asItem())) { -+ if (this.level().purpurConfig.endermanDisableStareAggro || itemstack.is(Blocks.CARVED_PUMPKIN.asItem()) || (this.level().purpurConfig.endermanIgnorePlayerDragonHead && itemstack.is(net.minecraft.world.item.Items.DRAGON_HEAD))) { // Purpur - return false; - } else { - Vec3 vec3d = player.getViewVector(1.0F).normalize(); + boolean isBeingStaredBy(Player player) { + // Paper start - EndermanAttackPlayerEvent +- boolean shouldAttack = isBeingStaredBy0(player); ++ boolean shouldAttack = !this.level().purpurConfig.endermanDisableStareAggro && isBeingStaredBy0(player); // Purpur + com.destroystokyo.paper.event.entity.EndermanAttackPlayerEvent event = new com.destroystokyo.paper.event.entity.EndermanAttackPlayerEvent((org.bukkit.entity.Enderman) getBukkitEntity(), (org.bukkit.entity.Player) player.getBukkitEntity()); + event.setCancelled(!shouldAttack); + return event.callEvent(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9dd087d34438b7685e50d4574e3cb58c09bdf9c5..5902f7c6a74723c07892abbefbf7d2daf5e66271 100644 +index 2b0984f7a2dd0d2f42f59b85a5b6e8d7b09319c2..d138bb202fd13c92800e634543ff4559fe19b9d4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1018,6 +1018,8 @@ public class PurpurWorldConfig { +@@ -1017,6 +1017,7 @@ public class PurpurWorldConfig { public boolean endermanTakeDamageFromWater = true; public boolean endermanAggroEndermites = true; public boolean endermanAggroEndermitesOnlyIfPlayerSpawned = false; -+ public boolean endermanIgnorePlayerDragonHead = false; + public boolean endermanDisableStareAggro = false; private void endermanSettings() { endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -1039,6 +1041,8 @@ public class PurpurWorldConfig { +@@ -1038,6 +1039,7 @@ 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); -+ endermanIgnorePlayerDragonHead = getBoolean("mobs.enderman.ignore-players-wearing-dragon-head", endermanIgnorePlayerDragonHead); + endermanDisableStareAggro = getBoolean("mobs.enderman.disable-player-stare-aggression", endermanDisableStareAggro); } diff --git a/patches/server/0131-Tick-fluids-config.patch b/patches/server/0131-Tick-fluids-config.patch new file mode 100644 index 000000000..4a532cf05 --- /dev/null +++ b/patches/server/0131-Tick-fluids-config.patch @@ -0,0 +1,58 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Mon, 15 Mar 2021 03:52:17 -0500 +Subject: [PATCH] Tick fluids config + + +diff --git a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java +index a2d023ff011f71f80032f02430a53d6a08a23623..399441dd8388dcdec08768665d3cfa189aca0a95 100644 +--- a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java +@@ -140,7 +140,7 @@ public class LiquidBlock extends Block implements BucketPickup { + + @Override + protected void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { +- if (this.shouldSpreadLiquid(world, pos, state)) { ++ if (world.purpurConfig.tickFluids && this.shouldSpreadLiquid(world, pos, state)) { // Purpur + world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper - Configurable speed for water flowing over lava + } + +@@ -168,7 +168,7 @@ public class LiquidBlock extends Block implements BucketPickup { + + @Override + protected BlockState updateShape(BlockState state, LevelReader world, ScheduledTickAccess tickView, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, RandomSource random) { +- if (state.getFluidState().isSource() || neighborState.getFluidState().isSource()) { ++ if (world.getWorldBorder().world.purpurConfig.tickFluids && state.getFluidState().isSource() || neighborState.getFluidState().isSource()) { // Purpur + tickView.scheduleTick(pos, state.getFluidState().getType(), this.fluid.getTickDelay(world)); + } + +@@ -177,7 +177,7 @@ public class LiquidBlock extends Block implements BucketPickup { + + @Override + protected void neighborChanged(BlockState state, Level world, BlockPos pos, Block sourceBlock, @Nullable Orientation wireOrientation, boolean notify) { +- if (this.shouldSpreadLiquid(world, pos, state)) { ++ if (world.purpurConfig.tickFluids && this.shouldSpreadLiquid(world, pos, state)) { // Purpur + world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper - Configurable speed for water flowing over lava + } + +diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +index d138bb202fd13c92800e634543ff4559fe19b9d4..58fb417f9f59fc5d97d963afdbf9a69e64c69057 100644 +--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java ++++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +@@ -134,6 +134,7 @@ public class PurpurWorldConfig { + public boolean imposeTeleportRestrictionsOnGateways = false; + public boolean imposeTeleportRestrictionsOnNetherPortals = false; + public boolean imposeTeleportRestrictionsOnEndPortals = false; ++ public boolean tickFluids = true; + private void miscGameplayMechanicsSettings() { + useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); + alwaysTameInCreative = getBoolean("gameplay-mechanics.always-tame-in-creative", alwaysTameInCreative); +@@ -152,7 +153,7 @@ public class PurpurWorldConfig { + imposeTeleportRestrictionsOnGateways = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-gateways", imposeTeleportRestrictionsOnGateways); + imposeTeleportRestrictionsOnNetherPortals = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-nether-portals", imposeTeleportRestrictionsOnNetherPortals); + imposeTeleportRestrictionsOnEndPortals = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-end-portals", imposeTeleportRestrictionsOnEndPortals); +- ++ tickFluids = getBoolean("gameplay-mechanics.tick-fluids", tickFluids); + } + + public int daytimeTicks = 12000; diff --git a/patches/unapplied-server/0136-Config-to-disable-Llama-caravans.patch b/patches/server/0132-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/0132-Config-to-disable-Llama-caravans.patch index b4cdad2ee..ca3261081 100644 --- a/patches/unapplied-server/0136-Config-to-disable-Llama-caravans.patch +++ b/patches/server/0132-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 96f1eba4a356e131a8f3c689bedc9eb8821e1a72..8edfc34a17d8c05cfa2928738306c1abc1743cc5 100644 +index 1c23531fed535e61afe47bfb66fc4e5ffb1d2dc5..be4429f922bab5fd389759f85aeadbd0335d75b4 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 -@@ -477,7 +477,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, Level world) { super(type, world); -@@ -271,6 +272,16 @@ public class Creeper extends Monster implements PowerableMob { +@@ -270,6 +271,16 @@ public class Creeper extends Monster { return this.level().purpurConfig.creeperTakeDamageFromWater; } @@ -34,16 +34,15 @@ index 1ce1cf48624d8273dccc571ee37a08c06951acad..902191001a7302872ff661564fb63894 @Override protected SoundEvent getHurtSound(DamageSource source) { return SoundEvents.CREEPER_HURT; -@@ -359,6 +370,8 @@ public class Creeper extends Monster implements PowerableMob { - } +@@ -358,6 +369,7 @@ public class Creeper extends Monster { public void explodeCreeper() { + Level world = this.level(); + this.exploding = true; // Purpur - Config to make Creepers explode on death -+ - if (!this.level().isClientSide) { - float f = this.isPowered() ? 2.0F : 1.0F; -@@ -379,6 +392,7 @@ public class Creeper extends Monster implements PowerableMob { + if (world instanceof ServerLevel worldserver) { + float f = this.isPowered() ? 2.0F : 1.0F; +@@ -379,6 +391,7 @@ public class Creeper extends Monster { // CraftBukkit end } @@ -52,10 +51,10 @@ index 1ce1cf48624d8273dccc571ee37a08c06951acad..902191001a7302872ff661564fb63894 private void spawnLingeringCloud() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1a690b72b8d149a3c9338abc83069fcab4ff0ccc..d861652c9495ad58b24124c495b3041e071ad549 100644 +index 205fc1779a51440232c368e3e9d54f5ce9d0c62c..b1ce0257e3cad9d37f6ab998a7ff6e41060fc3ed 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -862,6 +862,7 @@ public class PurpurWorldConfig { +@@ -860,6 +860,7 @@ public class PurpurWorldConfig { public boolean creeperAllowGriefing = true; public boolean creeperBypassMobGriefing = false; public boolean creeperTakeDamageFromWater = false; @@ -63,7 +62,7 @@ index 1a690b72b8d149a3c9338abc83069fcab4ff0ccc..d861652c9495ad58b24124c495b3041e private void creeperSettings() { creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -877,6 +878,7 @@ public class PurpurWorldConfig { +@@ -875,6 +876,7 @@ public class PurpurWorldConfig { creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); creeperTakeDamageFromWater = getBoolean("mobs.creeper.takes-damage-from-water", creeperTakeDamageFromWater); diff --git a/patches/unapplied-server/0138-Configurable-ravager-griefable-blocks-list.patch b/patches/server/0134-Configurable-ravager-griefable-blocks-list.patch similarity index 60% rename from patches/unapplied-server/0138-Configurable-ravager-griefable-blocks-list.patch rename to patches/server/0134-Configurable-ravager-griefable-blocks-list.patch index a569eddd5..e62f56ce3 100644 --- a/patches/unapplied-server/0138-Configurable-ravager-griefable-blocks-list.patch +++ b/patches/server/0134-Configurable-ravager-griefable-blocks-list.patch @@ -5,36 +5,36 @@ Subject: [PATCH] Configurable ravager griefable blocks list diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 30aee88ab5fd1e849780903083c2c95dd4e392aa..6c52629a304e48d6f9ea04ac52c8b1cae00df53a 100644 +index 159b542361debf397bbd24ac9a4f037e584de876..d4d02459f078788b404f39e84d1547a6c9d0313c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -185,7 +185,7 @@ public class Ravager extends Raider { - BlockState iblockdata = this.level().getBlockState(blockposition); - Block block = iblockdata.getBlock(); +@@ -199,7 +199,7 @@ public class Ravager extends Raider { + BlockState iblockdata = worldserver.getBlockState(blockposition); + Block block = iblockdata.getBlock(); -- if (block instanceof LeavesBlock) { -+ if (this.level().purpurConfig.ravagerGriefableBlocks.contains(block)) { // Purpur - // CraftBukkit start - if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state - continue; +- if (block instanceof LeavesBlock) { ++ if (this.level().purpurConfig.ravagerGriefableBlocks.contains(block)) { // Purpur + // CraftBukkit start + if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state + continue; diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java -index 2af4c365743b2956939335512f74e0a1d84298f7..a69e7e8da81bd13578d230cc1e3f0f900817cbfd 100644 +index d1efd728f0660b77361fa4f9c2bf5f2e654be0d2..ab58c4dbe9deb8807478a8e66e01f81a30221532 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java -@@ -179,7 +179,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { - @Override +@@ -180,7 +180,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { protected void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(world, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent -- if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), (!world.purpurConfig.ravagerBypassMobGriefing && !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)))) { // CraftBukkit // Purpur -+ if (entity instanceof Ravager && world.purpurConfig.ravagerGriefableBlocks.contains(world.getBlockState(pos).getBlock()) && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), (!world.purpurConfig.ravagerBypassMobGriefing && !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)))) { // CraftBukkit // Purpur - world.destroyBlock(pos, true, entity); + if (world instanceof ServerLevel worldserver) { +- if (entity instanceof Ravager && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), (!world.purpurConfig.ravagerBypassMobGriefing && !worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)))) { // CraftBukkit // Purpur ++ if (entity instanceof Ravager && world.purpurConfig.ravagerGriefableBlocks.contains(world.getBlockState(pos).getBlock()) && CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), (!world.purpurConfig.ravagerBypassMobGriefing && !worldserver.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)))) { // CraftBukkit // Purpur + worldserver.destroyBlock(pos, true, entity); + } } - diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d861652c9495ad58b24124c495b3041e071ad549..7f2a5c5720bd7f5e176a58d2369a4ffbd81ca138 100644 +index b1ce0257e3cad9d37f6ab998a7ff6e41060fc3ed..f99d1df0358804862f2d98cd39d1aaf1369081c5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1770,6 +1770,7 @@ public class PurpurWorldConfig { +@@ -1766,6 +1766,7 @@ public class PurpurWorldConfig { public double ravagerScale = 1.0D; public boolean ravagerBypassMobGriefing = false; public boolean ravagerTakeDamageFromWater = false; @@ -42,7 +42,7 @@ index d861652c9495ad58b24124c495b3041e071ad549..7f2a5c5720bd7f5e176a58d2369a4ffb private void ravagerSettings() { ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1783,6 +1784,23 @@ public class PurpurWorldConfig { +@@ -1779,6 +1780,23 @@ public class PurpurWorldConfig { ravagerScale = Mth.clamp(getDouble("mobs.ravager.attributes.scale", ravagerScale), 0.0625D, 16.0D); ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); ravagerTakeDamageFromWater = getBoolean("mobs.ravager.takes-damage-from-water", ravagerTakeDamageFromWater); diff --git a/patches/unapplied-server/0139-Sneak-to-bulk-process-composter.patch b/patches/server/0135-Sneak-to-bulk-process-composter.patch similarity index 81% rename from patches/unapplied-server/0139-Sneak-to-bulk-process-composter.patch rename to patches/server/0135-Sneak-to-bulk-process-composter.patch index 3fc47d3b0..de0236cc5 100644 --- a/patches/unapplied-server/0139-Sneak-to-bulk-process-composter.patch +++ b/patches/server/0135-Sneak-to-bulk-process-composter.patch @@ -5,23 +5,23 @@ Subject: [PATCH] Sneak to bulk process composter diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index ee9e4521079137d7b72194e8789810e7a89b8e75..09ab1904ea9c587f365513150dafe434a0b56ccf 100644 +index 504c996220b278c194c93e001a3b326d549868ec..9c33daaf92fe590272d5cc32f538ae9bef4d07bc 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -577,7 +577,7 @@ public class ServerPlayerGameMode { +@@ -583,7 +583,7 @@ public class ServerPlayerGameMode { ItemStack itemstack1 = stack.copy(); InteractionResult enuminteractionresult; - if (!flag1) { + if (!flag1 || (player.level().purpurConfig.composterBulkProcess && iblockdata.is(Blocks.COMPOSTER))) { // Purpur - ItemInteractionResult iteminteractionresult = iblockdata.useItemOn(player.getItemInHand(hand), world, player, hand, hitResult); + InteractionResult enuminteractionresult1 = iblockdata.useItemOn(player.getItemInHand(hand), world, player, hand, hitResult); - if (iteminteractionresult.consumesAction()) { + if (enuminteractionresult1.consumesAction()) { diff --git a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -index d3d12f9114173f4971f95d7ef895a4374705bd3f..f34159f8d6c51af2341bf49db0d6d6f0417919cf 100644 +index db837b250fc35af5b528bf973b3b07f63e79bc46..ed3a310d56a0cca8c4c11c3768ac2056cd11edea 100644 --- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -@@ -237,18 +237,27 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { +@@ -241,18 +241,27 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { int i = (Integer) state.getValue(ComposterBlock.LEVEL); if (i < 8 && ComposterBlock.COMPOSTABLES.containsKey(stack.getItem())) { @@ -29,7 +29,7 @@ index d3d12f9114173f4971f95d7ef895a4374705bd3f..f34159f8d6c51af2341bf49db0d6d6f0 - BlockState iblockdata1 = ComposterBlock.addItem(player, state, world, pos, stack); - // Paper start - handle cancelled events - if (iblockdata1 == null) { -- return ItemInteractionResult.SKIP_DEFAULT_BLOCK_INTERACTION; +- return InteractionResult.PASS; - } - // Paper end - @@ -39,7 +39,7 @@ index d3d12f9114173f4971f95d7ef895a4374705bd3f..f34159f8d6c51af2341bf49db0d6d6f0 + // Purpur start - sneak to bulk process composter + BlockState newState = process(i, player, state, world, pos, stack); + if (newState == null) { -+ return ItemInteractionResult.SKIP_DEFAULT_BLOCK_INTERACTION; ++ return InteractionResult.PASS; } + if (world.purpurConfig.composterBulkProcess && player.isShiftKeyDown() && newState != state) { + BlockState oldState; @@ -50,7 +50,7 @@ index d3d12f9114173f4971f95d7ef895a4374705bd3f..f34159f8d6c51af2341bf49db0d6d6f0 + oldLevel = oldState.getValue(ComposterBlock.LEVEL); + newState = process(oldLevel, player, oldState, world, pos, stack); + if (newState == null) { -+ return ItemInteractionResult.SKIP_DEFAULT_BLOCK_INTERACTION; ++ return InteractionResult.PASS; + } + newCount = stack.getCount(); + newLevel = newState.getValue(ComposterBlock.LEVEL); @@ -58,9 +58,9 @@ index d3d12f9114173f4971f95d7ef895a4374705bd3f..f34159f8d6c51af2341bf49db0d6d6f0 + } + // Purpur end - return ItemInteractionResult.sidedSuccess(world.isClientSide); + return InteractionResult.SUCCESS; } else { -@@ -256,6 +265,25 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { +@@ -260,6 +269,25 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { } } @@ -87,10 +87,10 @@ index d3d12f9114173f4971f95d7ef895a4374705bd3f..f34159f8d6c51af2341bf49db0d6d6f0 protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) { int i = (Integer) state.getValue(ComposterBlock.LEVEL); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7f2a5c5720bd7f5e176a58d2369a4ffbd81ca138..b1d81d3877c207ec711f8e796f2b12e6febb8eba 100644 +index f99d1df0358804862f2d98cd39d1aaf1369081c5..3740c1390debbc660ecf31dee0dc7e58096bf1ba 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -439,6 +439,11 @@ public class PurpurWorldConfig { +@@ -437,6 +437,11 @@ public class PurpurWorldConfig { chestOpenWithBlockOnTop = getBoolean("blocks.chest.open-with-solid-block-on-top", chestOpenWithBlockOnTop); } diff --git a/patches/unapplied-server/0140-Config-for-skipping-night.patch b/patches/server/0136-Config-for-skipping-night.patch similarity index 84% rename from patches/unapplied-server/0140-Config-for-skipping-night.patch rename to patches/server/0136-Config-for-skipping-night.patch index f8964ca3d..631fc1726 100644 --- a/patches/unapplied-server/0140-Config-for-skipping-night.patch +++ b/patches/server/0136-Config-for-skipping-night.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config for skipping night diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index e077c6cb1880ee19e696d2430b07d1101e330919..40a5107d37e908d13bd0307fc41d9a6e3faf1217 100644 +index 8dd211d20a695164c2086c03c8b0237ba109fda4..29b8a57477032c85bc498e90af4bfb739926d03c 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -661,7 +661,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -731,7 +731,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); long j; @@ -18,10 +18,10 @@ index e077c6cb1880ee19e696d2430b07d1101e330919..40a5107d37e908d13bd0307fc41d9a6e j = this.levelData.getDayTime() + 24000L; TimeSkipEvent event = new TimeSkipEvent(this.getWorld(), TimeSkipEvent.SkipReason.NIGHT_SKIP, (j - j % 24000L) - this.getDayTime()); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index b1d81d3877c207ec711f8e796f2b12e6febb8eba..dbacc159567dea21653148a4e9d9dbf78c8139f7 100644 +index 3740c1390debbc660ecf31dee0dc7e58096bf1ba..c0341b91afa7eda863caec0395db2129dba59450 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -349,6 +349,7 @@ public class PurpurWorldConfig { +@@ -347,6 +347,7 @@ public class PurpurWorldConfig { public boolean playerFixStuckPortal = false; public boolean creativeOnePunch = false; public boolean playerSleepNearMonsters = false; @@ -29,7 +29,7 @@ index b1d81d3877c207ec711f8e796f2b12e6febb8eba..dbacc159567dea21653148a4e9d9dbf7 private void playerSettings() { if (PurpurConfig.version < 19) { boolean oldVal = getBoolean("gameplay-mechanics.player.idle-timeout.mods-target", idleTimeoutTargetPlayer); -@@ -367,6 +368,7 @@ public class PurpurWorldConfig { +@@ -365,6 +366,7 @@ public class PurpurWorldConfig { 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/0141-Add-config-for-villager-trading.patch b/patches/server/0137-Add-config-for-villager-trading.patch similarity index 84% rename from patches/unapplied-server/0141-Add-config-for-villager-trading.patch rename to patches/server/0137-Add-config-for-villager-trading.patch index 857d8bedc..c3a50ed70 100644 --- a/patches/unapplied-server/0141-Add-config-for-villager-trading.patch +++ b/patches/server/0137-Add-config-for-villager-trading.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add config for villager trading diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index a717443f894d1e30efed61944f45e991902d1fa4..671d1dafbfe2f8ba24096f78e2661014d00a5e09 100644 +index 3fce5c42ca000250bb25201939ba6c73170486be..3b17133289f95e5420f1c0a73b34b953470df533 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -376,6 +376,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -369,6 +369,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (level().purpurConfig.villagerRidable && itemstack.isEmpty()) return tryRide(player, hand); // Purpur @@ -17,10 +17,10 @@ index a717443f894d1e30efed61944f45e991902d1fa4..671d1dafbfe2f8ba24096f78e2661014 } 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 05c63eb6cf8a7067105c58d244c7cc27d6bf1125..7c2d5d28f8c2aba2cd8255a4aef22247fe04d0e0 100644 +index 5eac0ba67b3ab258dd594ad1e1aaa7a2535fcfca..485a49bb13532177a949938d4b99c934518a0af1 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -155,8 +155,10 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -156,8 +156,10 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill return tryRide(player, hand, InteractionResult.CONSUME); // Purpur } if (level().purpurConfig.wanderingTraderRidable && itemstack.isEmpty()) return tryRide(player, hand); // Purpur @@ -30,12 +30,12 @@ index 05c63eb6cf8a7067105c58d244c7cc27d6bf1125..7c2d5d28f8c2aba2cd8255a4aef22247 + } // Purpur } - return InteractionResult.sidedSuccess(this.level().isClientSide); + return InteractionResult.SUCCESS; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index dbacc159567dea21653148a4e9d9dbf78c8139f7..4430a61f8c923e92ea889897c17ab4535fa47b4d 100644 +index c0341b91afa7eda863caec0395db2129dba59450..dbaff51304eb9830ae2740e2274d7a5036880482 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2224,6 +2224,7 @@ public class PurpurWorldConfig { +@@ -2220,6 +2220,7 @@ public class PurpurWorldConfig { public boolean villagerClericFarmersThrowWarts = true; public boolean villagerBypassMobGriefing = false; public boolean villagerTakeDamageFromWater = false; @@ -43,7 +43,7 @@ index dbacc159567dea21653148a4e9d9dbf78c8139f7..4430a61f8c923e92ea889897c17ab453 private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2243,6 +2244,7 @@ public class PurpurWorldConfig { +@@ -2239,6 +2240,7 @@ public class PurpurWorldConfig { villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts); villagerBypassMobGriefing = getBoolean("mobs.villager.bypass-mob-griefing", villagerBypassMobGriefing); villagerTakeDamageFromWater = getBoolean("mobs.villager.takes-damage-from-water", villagerTakeDamageFromWater); @@ -51,7 +51,7 @@ index dbacc159567dea21653148a4e9d9dbf78c8139f7..4430a61f8c923e92ea889897c17ab453 } public boolean vindicatorRidable = false; -@@ -2275,6 +2277,7 @@ public class PurpurWorldConfig { +@@ -2271,6 +2273,7 @@ public class PurpurWorldConfig { public boolean wanderingTraderFollowEmeraldBlock = false; public boolean wanderingTraderCanBeLeashed = false; public boolean wanderingTraderTakeDamageFromWater = false; @@ -59,7 +59,7 @@ index dbacc159567dea21653148a4e9d9dbf78c8139f7..4430a61f8c923e92ea889897c17ab453 private void wanderingTraderSettings() { wanderingTraderRidable = getBoolean("mobs.wandering_trader.ridable", wanderingTraderRidable); wanderingTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", wanderingTraderRidableInWater); -@@ -2289,6 +2292,7 @@ public class PurpurWorldConfig { +@@ -2285,6 +2288,7 @@ public class PurpurWorldConfig { wanderingTraderFollowEmeraldBlock = getBoolean("mobs.wandering_trader.follow-emerald-blocks", wanderingTraderFollowEmeraldBlock); wanderingTraderCanBeLeashed = getBoolean("mobs.wandering_trader.can-be-leashed", wanderingTraderCanBeLeashed); wanderingTraderTakeDamageFromWater = getBoolean("mobs.wandering_trader.takes-damage-from-water", wanderingTraderTakeDamageFromWater); diff --git a/patches/unapplied-server/0142-Drowning-Settings.patch b/patches/server/0138-Drowning-Settings.patch similarity index 83% rename from patches/unapplied-server/0142-Drowning-Settings.patch rename to patches/server/0138-Drowning-Settings.patch index 5dbf778a5..e7b09146c 100644 --- a/patches/unapplied-server/0142-Drowning-Settings.patch +++ b/patches/server/0138-Drowning-Settings.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Drowning Settings diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 901080dd8431b83b20aa5604e931519dcba82b22..657980c6c82b6a50ee9874f4aeb483b40dc24247 100644 +index 0b936bcf09bb12b0a29a1ef755df1a24604f0904..f3769da2422d98dec32ba252bde5d9467f1bd84f 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3493,7 +3493,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3655,7 +3655,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } public int getMaxAirSupply() { @@ -18,10 +18,10 @@ index 901080dd8431b83b20aa5604e931519dcba82b22..657980c6c82b6a50ee9874f4aeb483b4 public int getAirSupply() { diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 7a99319d6ac85fd794fef361dd6f8092b847c744..d4ba4752b04ad3d1a8133c56144800af756f4aa6 100644 +index 698340b3934a500ebd2cc50bc8818914d53af92d..64e30f4b32484da95a5eb6d5556fdc8f66727410 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -473,7 +473,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -493,7 +493,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (flag1) { this.setAirSupply(this.decreaseAirSupply(this.getAirSupply())); @@ -30,8 +30,8 @@ index 7a99319d6ac85fd794fef361dd6f8092b847c744..d4ba4752b04ad3d1a8133c56144800af this.setAirSupply(0); Vec3 vec3d = this.getDeltaMovement(); -@@ -485,7 +485,7 @@ public abstract class LivingEntity extends Entity implements Attackable { - this.level().addParticle(ParticleTypes.BUBBLE, this.getX() + d2, this.getY() + d3, this.getZ() + d4, vec3d.x, vec3d.y, vec3d.z); +@@ -505,7 +505,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + this.level().addParticle(ParticleTypes.BUBBLE, this.getX() + d0, this.getY() + d2, this.getZ() + d3, vec3d.x, vec3d.y, vec3d.z); } - this.hurt(this.damageSources().drown(), 2.0F); @@ -40,10 +40,10 @@ index 7a99319d6ac85fd794fef361dd6f8092b847c744..d4ba4752b04ad3d1a8133c56144800af } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4430a61f8c923e92ea889897c17ab4535fa47b4d..1859d0003a0c1860dd9db434b113dcfec284e025 100644 +index dbaff51304eb9830ae2740e2274d7a5036880482..c0084a992ae74365e4da842795adee98ebd99a09 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -165,6 +165,15 @@ public class PurpurWorldConfig { +@@ -163,6 +163,15 @@ public class PurpurWorldConfig { nighttimeTicks = getInt("gameplay-mechanics.daylight-cycle-ticks.nighttime", nighttimeTicks); } diff --git a/patches/unapplied-server/0143-Break-individual-slabs-when-sneaking.patch b/patches/server/0139-Break-individual-slabs-when-sneaking.patch similarity index 87% rename from patches/unapplied-server/0143-Break-individual-slabs-when-sneaking.patch rename to patches/server/0139-Break-individual-slabs-when-sneaking.patch index bbba47fb3..be5f02b7c 100644 --- a/patches/unapplied-server/0143-Break-individual-slabs-when-sneaking.patch +++ b/patches/server/0139-Break-individual-slabs-when-sneaking.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Break individual slabs when sneaking diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index 09ab1904ea9c587f365513150dafe434a0b56ccf..d3c49951c0bd7db4352326d3113f0ca9da393fab 100644 +index 9c33daaf92fe590272d5cc32f538ae9bef4d07bc..8ad07b6939831f57469bb6ad7c78b2c7e3b17fea 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -405,6 +405,7 @@ public class ServerPlayerGameMode { +@@ -403,6 +403,7 @@ public class ServerPlayerGameMode { } else {capturedBlockEntity = true;} // Paper - Send block entities after destroy prediction return false; } @@ -17,10 +17,10 @@ index 09ab1904ea9c587f365513150dafe434a0b56ccf..d3c49951c0bd7db4352326d3113f0ca9 // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/level/block/SlabBlock.java b/src/main/java/net/minecraft/world/level/block/SlabBlock.java -index fa29eb15934b3dad171d27c21d99b2451cfe553b..ba4aa69425d796d306791ea193f9c6b21a065f0b 100644 +index 9274fd639c22e305dda567b303f9b01068adb52c..4433e432ea0ee8d11045b87e68dac3ed43e8cf82 100644 --- a/src/main/java/net/minecraft/world/level/block/SlabBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SlabBlock.java -@@ -138,4 +138,25 @@ public class SlabBlock extends Block implements SimpleWaterloggedBlock { +@@ -150,4 +150,25 @@ public class SlabBlock extends Block implements SimpleWaterloggedBlock { return false; } } @@ -47,10 +47,10 @@ index fa29eb15934b3dad171d27c21d99b2451cfe553b..ba4aa69425d796d306791ea193f9c6b2 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1859d0003a0c1860dd9db434b113dcfec284e025..c9bff81954385a2f4113a4fd51d3b85b2f7048c2 100644 +index c0084a992ae74365e4da842795adee98ebd99a09..54c971872973d6c997530fa147850e06a86c1bf0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -560,6 +560,11 @@ public class PurpurWorldConfig { +@@ -558,6 +558,11 @@ public class PurpurWorldConfig { } } diff --git a/patches/unapplied-server/0144-Config-to-disable-hostile-mob-spawn-on-ice.patch b/patches/server/0140-Config-to-disable-hostile-mob-spawn-on-ice.patch similarity index 87% rename from patches/unapplied-server/0144-Config-to-disable-hostile-mob-spawn-on-ice.patch rename to patches/server/0140-Config-to-disable-hostile-mob-spawn-on-ice.patch index c837d146f..acda04d8e 100644 --- a/patches/unapplied-server/0144-Config-to-disable-hostile-mob-spawn-on-ice.patch +++ b/patches/server/0140-Config-to-disable-hostile-mob-spawn-on-ice.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config to disable hostile mob spawn on ice diff --git a/src/main/java/net/minecraft/world/entity/monster/Monster.java b/src/main/java/net/minecraft/world/entity/monster/Monster.java -index e7bfce0534c7ef3a1480a1082ae8514caf78778b..6511b8c737a57fbc72122dd04e2b544987a49b92 100644 +index e2de074bbe7bab0e5a7aecc1fae4c5914a203dd4..c2061f575c731ecc6071384b007517c08e0cf983 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Monster.java +++ b/src/main/java/net/minecraft/world/entity/monster/Monster.java -@@ -87,6 +87,14 @@ public abstract class Monster extends PathfinderMob implements Enemy { +@@ -88,6 +88,14 @@ public abstract class Monster extends PathfinderMob implements Enemy { } public static boolean isDarkEnoughToSpawn(ServerLevelAccessor world, BlockPos pos, RandomSource random) { @@ -24,10 +24,10 @@ index e7bfce0534c7ef3a1480a1082ae8514caf78778b..6511b8c737a57fbc72122dd04e2b5449 return false; } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c9bff81954385a2f4113a4fd51d3b85b2f7048c2..4e6824fa7adf8dfbafeff2bd6f6426ddb03c5a15 100644 +index 54c971872973d6c997530fa147850e06a86c1bf0..d30f6bd3b57d8b7bb18a714e80089253a028840b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -525,6 +525,13 @@ public class PurpurWorldConfig { +@@ -523,6 +523,13 @@ public class PurpurWorldConfig { furnaceUseLavaFromUnderneath = getBoolean("blocks.furnace.use-lava-from-underneath", furnaceUseLavaFromUnderneath); } diff --git a/patches/unapplied-server/0145-Config-to-show-Armor-Stand-arms-on-spawn.patch b/patches/server/0141-Config-to-show-Armor-Stand-arms-on-spawn.patch similarity index 90% rename from patches/unapplied-server/0145-Config-to-show-Armor-Stand-arms-on-spawn.patch rename to patches/server/0141-Config-to-show-Armor-Stand-arms-on-spawn.patch index 01873c8b7..3e70e5769 100644 --- a/patches/unapplied-server/0145-Config-to-show-Armor-Stand-arms-on-spawn.patch +++ b/patches/server/0141-Config-to-show-Armor-Stand-arms-on-spawn.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config to show Armor Stand arms on spawn 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 7180d65afee6216a0bc6ff2dc7888f64b9b6c22d..c0383771b08e1d89dfa4996b979248da1de8aca1 100644 +index c954cb3255145e18e8ab1e5a1b0267b879bbd1f3..037586c0fdb42a02660aba89dd741a647c67e52b 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -@@ -116,6 +116,7 @@ public class ArmorStand extends LivingEntity { +@@ -128,6 +128,7 @@ public class ArmorStand extends LivingEntity { this.rightArmPose = ArmorStand.DEFAULT_RIGHT_ARM_POSE; this.leftLegPose = ArmorStand.DEFAULT_LEFT_LEG_POSE; this.rightLegPose = ArmorStand.DEFAULT_RIGHT_LEG_POSE; @@ -17,7 +17,7 @@ index 7180d65afee6216a0bc6ff2dc7888f64b9b6c22d..c0383771b08e1d89dfa4996b979248da public ArmorStand(Level world, double x, double y, double z) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4e6824fa7adf8dfbafeff2bd6f6426ddb03c5a15..678130678e1f0b018fc77c608ed092c94e2f52a0 100644 +index d30f6bd3b57d8b7bb18a714e80089253a028840b..4c751f6b66536ad976c9b8fc936bda38ea12f6e5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -103,6 +103,7 @@ public class PurpurWorldConfig { diff --git a/patches/unapplied-server/0146-Option-to-make-doors-require-redstone.patch b/patches/server/0142-Option-to-make-doors-require-redstone.patch similarity index 91% rename from patches/unapplied-server/0146-Option-to-make-doors-require-redstone.patch rename to patches/server/0142-Option-to-make-doors-require-redstone.patch index 3bcfa96b1..243eb1e12 100644 --- a/patches/unapplied-server/0146-Option-to-make-doors-require-redstone.patch +++ b/patches/server/0142-Option-to-make-doors-require-redstone.patch @@ -36,10 +36,10 @@ index 3513b15f6622bfc134ecfcd9129f81a8acc2c601..6e70579a58a1bf906b176b81713e5531 } 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 7c2d5d28f8c2aba2cd8255a4aef22247fe04d0e0..6250bc28db4bbac0f101cdc93c90ec4d7ec6b2ba 100644 +index 485a49bb13532177a949938d4b99c934518a0af1..dac073bf9626bd8198c912241d4ca36d90b8441c 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -156,8 +156,8 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill +@@ -157,8 +157,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 @@ -51,10 +51,10 @@ index 7c2d5d28f8c2aba2cd8255a4aef22247fe04d0e0..6250bc28db4bbac0f101cdc93c90ec4d } 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 6dd75bc722f9c20b4869e6353115c3b02dd79f99..dfaf82f5b0180cf08c4125347867d37a2557fd24 100644 +index 077b99caf0ec0ee098786d23194d88e1dc4481ce..daf865c20cc193a12db0d98e3c0472eefdf635c2 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 { +@@ -200,6 +200,7 @@ public class DoorBlock extends Block { protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player, BlockHitResult hit) { if (!this.type.canOpenByHand()) { return InteractionResult.PASS; @@ -62,7 +62,7 @@ index 6dd75bc722f9c20b4869e6353115c3b02dd79f99..dfaf82f5b0180cf08c4125347867d37a } else { state = (BlockState) state.cycle(DoorBlock.OPEN); world.setBlock(pos, state, 10); -@@ -299,4 +300,18 @@ public class DoorBlock extends Block { +@@ -301,4 +302,18 @@ public class DoorBlock extends Block { flag = false; return flag; } @@ -82,10 +82,10 @@ index 6dd75bc722f9c20b4869e6353115c3b02dd79f99..dfaf82f5b0180cf08c4125347867d37a + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 678130678e1f0b018fc77c608ed092c94e2f52a0..58726907eb4dcb4f386873c4092df2b314736f2d 100644 +index 4c751f6b66536ad976c9b8fc936bda38ea12f6e5..c11e68ba894df3e21d499920585df8128bf7429f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -464,6 +464,16 @@ public class PurpurWorldConfig { +@@ -462,6 +462,16 @@ public class PurpurWorldConfig { dispenserPlaceAnvils = getBoolean("blocks.dispenser.place-anvils", dispenserPlaceAnvils); } diff --git a/patches/unapplied-server/0147-Config-to-allow-unsafe-enchants.patch b/patches/server/0143-Config-to-allow-unsafe-enchants.patch similarity index 94% rename from patches/unapplied-server/0147-Config-to-allow-unsafe-enchants.patch rename to patches/server/0143-Config-to-allow-unsafe-enchants.patch index 7acdbe48c..15f909b0c 100644 --- a/patches/unapplied-server/0147-Config-to-allow-unsafe-enchants.patch +++ b/patches/server/0143-Config-to-allow-unsafe-enchants.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to allow 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 99695e38b6a10c3cffda6e453f9f0619c7406cc0..2283f69607cb769545c85bcae940ac956779e80b 100644 +index cf0a5943f457c532958f40b4989fa18f967abae6..2ab8ff8ca51eb841932ccca4a348acc0141264a8 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 { @@ -27,10 +27,10 @@ index 99695e38b6a10c3cffda6e453f9f0619c7406cc0..2283f69607cb769545c85bcae940ac95 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 58135a3292bcdfea17726f17d86192ced96eea9a..29e54876c22739f45565cd91bcbd76612e8bfad1 100644 +index f1834eec821a14ef6a7f42f827b7e0b8284ae5a2..e9c17953a3767e03e528ed93b10fb42626fff118 100644 --- a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java -@@ -232,7 +232,10 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -234,7 +234,10 @@ public class AnvilMenu extends ItemCombinerMenu { i2 = l1 == i2 ? i2 + 1 : Math.max(i2, l1); Enchantment enchantment = (Enchantment) holder.value(); @@ -42,7 +42,7 @@ index 58135a3292bcdfea17726f17d86192ced96eea9a..29e54876c22739f45565cd91bcbd7661 if (this.player.getAbilities().instabuild || itemstack.is(Items.ENCHANTED_BOOK)) { flag3 = true; -@@ -244,16 +247,22 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -246,16 +249,22 @@ public class AnvilMenu extends ItemCombinerMenu { Holder holder1 = (Holder) iterator1.next(); if (!holder1.equals(holder) && !Enchantment.areCompatible(holder, holder1)) { @@ -68,7 +68,7 @@ index 58135a3292bcdfea17726f17d86192ced96eea9a..29e54876c22739f45565cd91bcbd7661 i2 = enchantment.getMaxLevel(); } -@@ -379,7 +388,7 @@ public class AnvilMenu extends ItemCombinerMenu { +@@ -385,7 +394,7 @@ public class AnvilMenu extends ItemCombinerMenu { this.broadcastChanges(); // Purpur start - Anvil API @@ -78,10 +78,10 @@ index 58135a3292bcdfea17726f17d86192ced96eea9a..29e54876c22739f45565cd91bcbd7661 ((ServerPlayer) this.player).connection.send(new ClientboundContainerSetDataPacket(this.containerId, 0, this.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 5f57f3494705ca1664dbca395c1af3280a50cad8..8c14f8c9f61baf1842e42b62bcd73717e82a29e1 100644 +index dcb656be3d37f29bdbe7d25ace05c6dd1889e252..d644d02b039ca918391a32a04549f7a34386b3f9 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -1255,6 +1255,12 @@ public final class ItemStack implements DataComponentHolder { +@@ -1351,6 +1351,12 @@ public final class ItemStack implements DataComponentHolder { return !((ItemEnchantments) this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY)).isEmpty(); } diff --git a/patches/unapplied-server/0148-Configurable-sponge-absorption.patch b/patches/server/0144-Configurable-sponge-absorption.patch similarity index 87% rename from patches/unapplied-server/0148-Configurable-sponge-absorption.patch rename to patches/server/0144-Configurable-sponge-absorption.patch index ec6b4fb14..869dbf7a6 100644 --- a/patches/unapplied-server/0148-Configurable-sponge-absorption.patch +++ b/patches/server/0144-Configurable-sponge-absorption.patch @@ -8,10 +8,10 @@ Allows the total area and radius of water blocks the sponge can absorb to be cha Co-authored by: granny diff --git a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java -index 902825ec9ea05f4418b45f56a008d73f217bd178..a676ccfa6b02e8986df6f6a2e04cbb06b3edd0ff 100644 +index 59cf905b1b5686f6f4f2bad94730ffa69d3a2834..d82c62cdb219cee0bbc3083e38e18b7615ad09ef 100644 --- a/src/main/java/net/minecraft/world/level/block/SpongeBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SpongeBlock.java -@@ -58,7 +58,7 @@ public class SpongeBlock extends Block { +@@ -61,7 +61,7 @@ public class SpongeBlock extends Block { private boolean removeWaterBreadthFirstSearch(Level world, BlockPos pos) { BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator @@ -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 58726907eb4dcb4f386873c4092df2b314736f2d..a4c0ed4e5b6145cb8e33f6bd38af678cae4d79d7 100644 +index c11e68ba894df3e21d499920585df8128bf7429f..e6787f6885e7f40b195544f753b4782d16d4b6ef 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -589,6 +589,13 @@ public class PurpurWorldConfig { +@@ -587,6 +587,13 @@ public class PurpurWorldConfig { spawnerDeactivateByRedstone = getBoolean("blocks.spawner.deactivate-by-redstone", spawnerDeactivateByRedstone); } diff --git a/patches/unapplied-server/0149-Projectile-offset-config.patch b/patches/server/0145-Projectile-offset-config.patch similarity index 54% rename from patches/unapplied-server/0149-Projectile-offset-config.patch rename to patches/server/0145-Projectile-offset-config.patch index 1445779b7..c952e5129 100644 --- a/patches/unapplied-server/0149-Projectile-offset-config.patch +++ b/patches/server/0145-Projectile-offset-config.patch @@ -5,11 +5,11 @@ 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 4db2032178471860baddc6b669c9a4f8cffd084b..fc534b1f214663eb8e4fe479fed12b1dd069105c 100644 +index 1d4d0799a86b9940b5e3b614c5a188ade5133f7e..58fa528e4b2589d362eb976afd6221cd94f2623c 100644 --- a/src/main/java/net/minecraft/world/item/BowItem.java +++ b/src/main/java/net/minecraft/world/item/BowItem.java -@@ -37,7 +37,7 @@ public class BowItem extends ProjectileWeaponItem { - if (!((double)f < 0.1)) { +@@ -43,7 +43,7 @@ public class BowItem extends ProjectileWeaponItem { + } else { List list = draw(stack, itemStack, player); if (world instanceof ServerLevel serverLevel && !list.isEmpty()) { - this.shoot(serverLevel, player, player.getUsedItemHand(), stack, list, f * 3.0F, 1.0F, f == 1.0F, null); @@ -18,7 +18,7 @@ index 4db2032178471860baddc6b669c9a4f8cffd084b..fc534b1f214663eb8e4fe479fed12b1d 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 1467e6f2df302e0b7992dcb6c136cb626ade3d2b..4e60c2102e3e838c68e4b9db41c8bca365d22923 100644 +index 52c40eafc77e50a6fd21b9a7a250cea501f11690..86204c2ab5bbd5d45ddb1d626f844d91ccae6b4f 100644 --- a/src/main/java/net/minecraft/world/item/CrossbowItem.java +++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java @@ -69,7 +69,7 @@ public class CrossbowItem extends ProjectileWeaponItem { @@ -27,79 +27,79 @@ index 1467e6f2df302e0b7992dcb6c136cb626ade3d2b..4e60c2102e3e838c68e4b9db41c8bca3 if (chargedProjectiles != null && !chargedProjectiles.isEmpty()) { - this.performShooting(world, user, hand, itemStack, getShootingPower(chargedProjectiles), 1.0F, null); + this.performShooting(world, user, hand, itemStack, getShootingPower(chargedProjectiles), (float) world.purpurConfig.crossbowProjectileOffset, null); // Purpur - return InteractionResultHolder.consume(itemStack); + return InteractionResult.CONSUME; } else if (!user.getProjectile(itemStack).isEmpty()) { this.startSoundPlayed = false; diff --git a/src/main/java/net/minecraft/world/item/EggItem.java b/src/main/java/net/minecraft/world/item/EggItem.java -index 4ebd634cff286b10868e26eeb3ecf34abdcab22e..7dc811335caa46870d1d895899a1e6c21980382d 100644 +index 3ddd34e5d05fa1355a2affd329d72dea216cd0e4..770bdb3fb2426083ff6785f1c38ffe9d11f898e5 100644 --- a/src/main/java/net/minecraft/world/item/EggItem.java +++ b/src/main/java/net/minecraft/world/item/EggItem.java @@ -27,7 +27,7 @@ public class EggItem extends Item implements ProjectileItem { - ThrownEgg entityegg = new ThrownEgg(world, user); - - entityegg.setItem(itemstack); -- entityegg.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F); -+ entityegg.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, (float) world.purpurConfig.eggProjectileOffset); // Purpur + if (world instanceof ServerLevel worldserver) { + // CraftBukkit start // Paper start - PlayerLaunchProjectileEvent - 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) entityegg.getBukkitEntity()); - if (event.callEvent() && world.addFreshEntity(entityegg)) { +- final Projectile.Delayed thrownEgg = Projectile.spawnProjectileFromRotationDelayed(ThrownEgg::new, worldserver, itemstack, user, 0.0F, 1.5F, 1.0F); ++ final Projectile.Delayed thrownEgg = Projectile.spawnProjectileFromRotationDelayed(ThrownEgg::new, worldserver, itemstack, user, 0.0F, 1.5F, (float) worldserver.purpurConfig.eggProjectileOffset); // Purpur + 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) thrownEgg.projectile().getBukkitEntity()); + if (event.callEvent() && thrownEgg.attemptSpawn()) { + if (event.shouldConsume()) { diff --git a/src/main/java/net/minecraft/world/item/EnderpearlItem.java b/src/main/java/net/minecraft/world/item/EnderpearlItem.java -index fc62754f93bd11a10c28b8b7b116e9fff70a5c7b..11b04455f09d8bfdf44499bb8359dc715c2daffd 100644 +index ad99c6fb7bcd8ccbdeb405ca7ff73ae4d1c2f2ee..4039d300debadf29e6c544e8b4c950b7121a02d1 100644 --- a/src/main/java/net/minecraft/world/item/EnderpearlItem.java +++ b/src/main/java/net/minecraft/world/item/EnderpearlItem.java @@ -24,7 +24,7 @@ public class EnderpearlItem extends Item { - ThrownEnderpearl entityenderpearl = new ThrownEnderpearl(world, user); - - entityenderpearl.setItem(itemstack); -- entityenderpearl.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F); -+ entityenderpearl.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, (float) world.purpurConfig.enderPearlProjectileOffset); // Purpur + if (world instanceof ServerLevel worldserver) { + // CraftBukkit start // Paper start - PlayerLaunchProjectileEvent - 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) entityenderpearl.getBukkitEntity()); - if (event.callEvent() && world.addFreshEntity(entityenderpearl)) { +- final Projectile.Delayed thrownEnderpearl = Projectile.spawnProjectileFromRotationDelayed(ThrownEnderpearl::new, worldserver, itemstack, user, 0.0F, 1.5F, 1.0F); ++ final Projectile.Delayed thrownEnderpearl = Projectile.spawnProjectileFromRotationDelayed(ThrownEnderpearl::new, worldserver, itemstack, user, 0.0F, 1.5F, (float) worldserver.purpurConfig.enderPearlProjectileOffset); // Purpur + 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) thrownEnderpearl.projectile().getBukkitEntity()); + if (event.callEvent() && thrownEnderpearl.attemptSpawn()) { + if (event.shouldConsume()) { diff --git a/src/main/java/net/minecraft/world/item/SnowballItem.java b/src/main/java/net/minecraft/world/item/SnowballItem.java -index 32b170551a2f5bdc88d29f4d03750bfe3974e71b..a41fb0dd26af367fc2470a7913a84d864bc505f7 100644 +index 57872ebef6beb8cdc03c9f8f19de94652ee19062..60a064c26de0566aaf9f8be886402e291c03ca3b 100644 --- a/src/main/java/net/minecraft/world/item/SnowballItem.java +++ b/src/main/java/net/minecraft/world/item/SnowballItem.java -@@ -28,7 +28,7 @@ public class SnowballItem extends Item implements ProjectileItem { - Snowball entitysnowball = new Snowball(world, user); - - entitysnowball.setItem(itemstack); -- entitysnowball.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F); -+ entitysnowball.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, (float) world.purpurConfig.snowballProjectileOffset); // Purpur +@@ -27,7 +27,7 @@ public class SnowballItem extends Item implements ProjectileItem { + // world.playSound((EntityHuman) null, entityhuman.getX(), entityhuman.getY(), entityhuman.getZ(), SoundEffects.SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); + if (world instanceof ServerLevel worldserver) { // Paper start - PlayerLaunchProjectileEvent - 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) entitysnowball.getBukkitEntity()); - if (event.callEvent() && world.addFreshEntity(entitysnowball)) { +- final Projectile.Delayed snowball = Projectile.spawnProjectileFromRotationDelayed(Snowball::new, worldserver, itemstack, user, 0.0F, 1.5F, 1.0F); ++ final Projectile.Delayed snowball = Projectile.spawnProjectileFromRotationDelayed(Snowball::new, worldserver, itemstack, user, 0.0F, 1.5F, (float) worldserver.purpurConfig.snowballProjectileOffset); // Purpur + 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) snowball.projectile().getBukkitEntity()); + if (event.callEvent() && snowball.attemptSpawn()) { + user.awardStat(Stats.ITEM_USED.get(this)); diff --git a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java -index 369955746f4b51f69fa01103e3771dd74fc6c8f0..e6edd3a0fa2578900cdbe8bd588219dc3fd3af5f 100644 +index fa9d2ae44fcdd06f8f33cd14ffca422b20a01451..ffbc71ca2a27800d7758e3db339bf06a39ef1f11 100644 --- a/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java +++ b/src/main/java/net/minecraft/world/item/ThrowablePotionItem.java @@ -21,7 +21,7 @@ public class ThrowablePotionItem extends PotionItem implements ProjectileItem { - if (!world.isClientSide) { - ThrownPotion thrownPotion = new ThrownPotion(world, user); - thrownPotion.setItem(itemStack); -- thrownPotion.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.5F, 1.0F); -+ thrownPotion.shootFromRotation(user, user.getXRot(), user.getYRot(), -20.0F, 0.5F, (float) world.purpurConfig.throwablePotionProjectileOffset); // Purpur + ItemStack itemStack = user.getItemInHand(hand); + if (world instanceof ServerLevel serverLevel) { + // Paper start - PlayerLaunchProjectileEvent +- final Projectile.Delayed thrownPotion = Projectile.spawnProjectileFromRotationDelayed(ThrownPotion::new, serverLevel, itemStack, user, -20.0F, 0.5F, 1.0F); ++ final Projectile.Delayed thrownPotion = Projectile.spawnProjectileFromRotationDelayed(ThrownPotion::new, serverLevel, itemStack, user, -20.0F, 0.5F, (float) serverLevel.purpurConfig.throwablePotionProjectileOffset); // Purpur // Paper start - PlayerLaunchProjectileEvent - 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)) { + 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.projectile().getBukkitEntity()); + if (event.callEvent() && thrownPotion.attemptSpawn()) { diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java -index 4934bae61114b49a9f8d0ed044fbb881210df32a..1be074074283f12543ac771ac9201580e7736289 100644 +index 24b97c8e2758e4a991dbbbf5276580e1fe027439..4e863ae1f94291b391a142e04e0c41e83417ab70 100644 --- a/src/main/java/net/minecraft/world/item/TridentItem.java +++ b/src/main/java/net/minecraft/world/item/TridentItem.java -@@ -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, 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; - } +@@ -88,7 +88,7 @@ public class TridentItem extends Item implements ProjectileItem { + // itemstack.hurtWithoutBreaking(1, entityhuman); // CraftBukkit - moved down + if (f == 0.0F) { + // Paper start - PlayerLaunchProjectileEvent +- Projectile.Delayed tridentDelayed = Projectile.spawnProjectileFromRotationDelayed(ThrownTrident::new, worldserver, stack, entityhuman, 0.0F, 2.5F, 1.0F); ++ Projectile.Delayed tridentDelayed = Projectile.spawnProjectileFromRotationDelayed(ThrownTrident::new, worldserver, stack, entityhuman, 0.0F, 2.5F, (float) worldserver.purpurConfig.tridentProjectileOffset); // Purpur + // Paper start - PlayerLaunchProjectileEvent + com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack), (org.bukkit.entity.Projectile) tridentDelayed.projectile().getBukkitEntity()); + if (!event.callEvent() || !tridentDelayed.attemptSpawn()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a4c0ed4e5b6145cb8e33f6bd38af678cae4d79d7..c4233c138edf6c685cbcb487c79c02e84adaf65e 100644 +index e6787f6885e7f40b195544f753b4782d16d4b6ef..de393b153bd5efd0e39aaedc506d280e548e81e4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -414,6 +414,23 @@ public class PurpurWorldConfig { +@@ -412,6 +412,23 @@ public class PurpurWorldConfig { }); } diff --git a/patches/unapplied-server/0150-Config-for-powered-rail-activation-distance.patch b/patches/server/0146-Config-for-powered-rail-activation-distance.patch similarity index 86% rename from patches/unapplied-server/0150-Config-for-powered-rail-activation-distance.patch rename to patches/server/0146-Config-for-powered-rail-activation-distance.patch index 743b3226e..f0fe8333f 100644 --- a/patches/unapplied-server/0150-Config-for-powered-rail-activation-distance.patch +++ b/patches/server/0146-Config-for-powered-rail-activation-distance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config for powered rail activation distance diff --git a/src/main/java/net/minecraft/world/level/block/PoweredRailBlock.java b/src/main/java/net/minecraft/world/level/block/PoweredRailBlock.java -index 9603d8c84ff483030dc08e82d3579b89e5c1f6e9..8fc65c32a3c6e6842a76b36f45e1b1c23abbc480 100644 +index b763361a8f0f1b46093d5dd9afe8dba0cadf9c78..bd14c08defe8afc5ceca59d16a5b1dbad178f594 100644 --- a/src/main/java/net/minecraft/world/level/block/PoweredRailBlock.java +++ b/src/main/java/net/minecraft/world/level/block/PoweredRailBlock.java @@ -30,7 +30,7 @@ public class PoweredRailBlock extends BaseRailBlock { @@ -18,10 +18,10 @@ index 9603d8c84ff483030dc08e82d3579b89e5c1f6e9..8fc65c32a3c6e6842a76b36f45e1b1c2 } else { int j = pos.getX(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c4233c138edf6c685cbcb487c79c02e84adaf65e..22de19aeb28795484525ddb22df96b89f915eceb 100644 +index de393b153bd5efd0e39aaedc506d280e548e81e4..0f940d6b8d927355cf0ae120e857b62be8af7806 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -575,6 +575,11 @@ public class PurpurWorldConfig { +@@ -573,6 +573,11 @@ public class PurpurWorldConfig { powderSnowBypassMobGriefing = getBoolean("blocks.powder_snow.bypass-mob-griefing", powderSnowBypassMobGriefing); } diff --git a/patches/unapplied-server/0135-Tick-fluids-config.patch b/patches/unapplied-server/0135-Tick-fluids-config.patch deleted file mode 100644 index 24fffaaa1..000000000 --- a/patches/unapplied-server/0135-Tick-fluids-config.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Mon, 15 Mar 2021 03:52:17 -0500 -Subject: [PATCH] Tick fluids config - - -diff --git a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java -index 84623c632d8c2f0fa7ec939c711316d757117d23..1851035b9fdcc076442d0699567a3b020e6425d6 100644 ---- a/src/main/java/net/minecraft/world/level/block/LiquidBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/LiquidBlock.java -@@ -137,7 +137,7 @@ public class LiquidBlock extends Block implements BucketPickup { - - @Override - protected void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { -- if (this.shouldSpreadLiquid(world, pos, state)) { -+ if (world.purpurConfig.tickFluids && this.shouldSpreadLiquid(world, pos, state)) { // Purpur - world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper - Configurable speed for water flowing over lava - } - -@@ -165,7 +165,7 @@ public class LiquidBlock extends Block implements BucketPickup { - - @Override - protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { -- if (state.getFluidState().isSource() || neighborState.getFluidState().isSource()) { -+ if (world.getMinecraftWorld().purpurConfig.tickFluids && state.getFluidState().isSource() || neighborState.getFluidState().isSource()) { // Purpur - world.scheduleTick(pos, state.getFluidState().getType(), this.fluid.getTickDelay(world)); - } - -@@ -174,7 +174,7 @@ public class LiquidBlock extends Block implements BucketPickup { - - @Override - protected void neighborChanged(BlockState state, Level world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) { -- if (this.shouldSpreadLiquid(world, pos, state)) { -+ if (world.purpurConfig.tickFluids && this.shouldSpreadLiquid(world, pos, state)) { // Purpur - world.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(world, pos)); // Paper - Configurable speed for water flowing over lava - } - -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5902f7c6a74723c07892abbefbf7d2daf5e66271..4e7ea1f1b4413c929ed4066e9dd213a9fc9b4b35 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -132,6 +132,7 @@ public class PurpurWorldConfig { - public boolean noteBlockIgnoreAbove = false; - public boolean persistentDroppableEntityDisplayNames = true; - public boolean projectilesBypassMobGriefing = false; -+ public boolean tickFluids = true; - public double tridentLoyaltyVoidReturnHeight = 0.0D; - public int raidCooldownSeconds = 0; - public int animalBreedingCooldownSeconds = 0; -@@ -151,6 +152,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); -+ tickFluids = getBoolean("gameplay-mechanics.tick-fluids", tickFluids); - tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight); - raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds); - animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds);