diff --git a/gradle.properties b/gradle.properties index 3741887ef..f34eb8600 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group = org.purpurmc.purpur version = 1.20-R0.1-SNAPSHOT mcVersion = 1.20 -paperCommit = f0aea8123e4a6d3c854f7147c3aff150b79b4f63 +paperCommit = 3fe0e32495a0a95a92a203321a3f414e9bb5a55f org.gradle.caching = true org.gradle.parallel = true diff --git a/patches/server/0046-Add-enderman-and-creeper-griefing-controls.patch b/patches/server/0046-Add-enderman-and-creeper-griefing-controls.patch index 6010345ab..ca1c795ba 100644 --- a/patches/server/0046-Add-enderman-and-creeper-griefing-controls.patch +++ b/patches/server/0046-Add-enderman-and-creeper-griefing-controls.patch @@ -18,7 +18,7 @@ index 9658611850a266ee1acf347d3f90cf4922a89d3c..7e3b64dbd6df0b4d3556f7666c632a63 this.spawnLingeringCloud(); } else { 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 81b3f96b1fe8d592cac95e2deff8395edb6d589c..d1602c71f96d817d212582737dc6ec5db1c4f79a 100644 +index 81b3f96b1fe8d592cac95e2deff8395edb6d589c..7eefdbe71588dbfcfb47bbb944e051f893bf790c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -510,6 +510,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -29,16 +29,14 @@ index 81b3f96b1fe8d592cac95e2deff8395edb6d589c..d1602c71f96d817d212582737dc6ec5d return this.enderman.getCarriedBlock() == null ? false : (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0); } -@@ -557,7 +558,8 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -557,6 +558,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { -- return this.enderman.getCarriedBlock() != null ? false : (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0); + 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 : (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? false : this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0); } - @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index a08a38dabc08f88cea0411540236128b18ff47fa..d725ea8aa559120f3b0841296cae8643475e0046 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java diff --git a/patches/server/0049-Implement-infinite-liquids.patch b/patches/server/0049-Implement-infinite-liquids.patch index 817e367b5..b555fbe42 100644 --- a/patches/server/0049-Implement-infinite-liquids.patch +++ b/patches/server/0049-Implement-infinite-liquids.patch @@ -67,7 +67,7 @@ index 82e85fbbd45244d02df90fa00c9046e7f51275a2..ec6c63075306f9e5389e83641d2c8a82 @Override protected void beforeDestroyingBlock(LevelAccessor world, BlockPos pos, BlockState state, BlockPos source) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5874ad0a9d3d2e838c15b3cc3c1e8a9992fdfc54..ff6bda851c5e7f7b5eba17d059fcda6e5a469db7 100644 +index 5874ad0a9d3d2e838c15b3cc3c1e8a9992fdfc54..88978de01b75526802436714f6a9493d2eb4b0d9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -227,6 +227,11 @@ public class PurpurWorldConfig { @@ -82,21 +82,3 @@ index 5874ad0a9d3d2e838c15b3cc3c1e8a9992fdfc54..ff6bda851c5e7f7b5eba17d059fcda6e public boolean turtleEggsBreakFromExpOrbs = true; public boolean turtleEggsBreakFromItems = true; public boolean turtleEggsBreakFromMinecarts = true; -@@ -1186,3 +1191,17 @@ public class PurpurWorldConfig { - zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); - } - } -+||||||| expected -+ public boolean babiesAreRidable = true; -+ public boolean untamedTamablesAreRidable = true; -+ public boolean useNightVisionWhenRiding = false; -+======= -+ public int waterInfiniteRequiredSources = 2; -+ private void waterSources() { -+ waterInfiniteRequiredSources = getInt("blocks.water.infinite-required-sources", waterInfiniteRequiredSources); -+ } -+ -+ public boolean babiesAreRidable = true; -+ public boolean untamedTamablesAreRidable = true; -+ public boolean useNightVisionWhenRiding = false; -+>>>>>>> replacement diff --git a/patches/server/0063-Configurable-jockey-options.patch b/patches/server/0063-Configurable-jockey-options.patch index e32d758fb..a41ed3522 100644 --- a/patches/server/0063-Configurable-jockey-options.patch +++ b/patches/server/0063-Configurable-jockey-options.patch @@ -167,7 +167,7 @@ index 5e97cec00a6ea97520f0e5acb6e30d5e7e5fab89..45c93c148cde236e01fe925c1a9b67e3 public void setPersistentAngerTarget(@Nullable UUID angryAt) { this.persistentAngerTarget = angryAt; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 31d259d0b914b344095dd0435891f55dd5ab4c56..1301d9498808d2edf98ca20de6886c8f50fbdb83 100644 +index 2011a1e6ec9d52e6f97a2c311c39aa50e67c93a2..ec7bc641fa77a9fbb48aa0adf05dc119755dbe90 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -490,6 +490,9 @@ public class PurpurWorldConfig { @@ -257,7 +257,7 @@ index 31d259d0b914b344095dd0435891f55dd5ab4c56..1301d9498808d2edf98ca20de6886c8f private void zombifiedPiglinSettings() { if (PurpurConfig.version < 10) { double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); -@@ -1266,6 +1293,9 @@ public class PurpurWorldConfig { +@@ -1266,5 +1293,8 @@ public class PurpurWorldConfig { } zombifiedPiglinMaxHealth = getDouble("mobs.zombified_piglin.attributes.max_health", zombifiedPiglinMaxHealth); zombifiedPiglinSpawnReinforcements = getDouble("mobs.zombified_piglin.attributes.spawn_reinforcements", zombifiedPiglinSpawnReinforcements); @@ -266,4 +266,3 @@ index 31d259d0b914b344095dd0435891f55dd5ab4c56..1301d9498808d2edf98ca20de6886c8f + zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens); } } - ||||||| expected diff --git a/patches/todo/server/0101-Furnace-uses-lava-from-underneath.patch b/patches/server/0096-Furnace-uses-lava-from-underneath.patch similarity index 95% rename from patches/todo/server/0101-Furnace-uses-lava-from-underneath.patch rename to patches/server/0096-Furnace-uses-lava-from-underneath.patch index 53e31db26..38ca121ee 100644 --- a/patches/todo/server/0101-Furnace-uses-lava-from-underneath.patch +++ b/patches/server/0096-Furnace-uses-lava-from-underneath.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Furnace uses lava from underneath diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index a3f073066f6e2eea8964461ad2b0409ade202f35..4ff472f454b60c3608286b7553926acf74069b73 100644 +index 448fa4f4f200430d6ce3051763c7ceb697696146..ca2052804ad829a1528a9c5a0a792275beead113 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java @@ -44,6 +44,7 @@ import net.minecraft.world.level.Level; @@ -47,7 +47,7 @@ index a3f073066f6e2eea8964461ad2b0409ade202f35..4ff472f454b60c3608286b7553926acf private static boolean canBurn(RegistryAccess registryManager, @Nullable Recipe recipe, NonNullList slots, int count) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3f0f7264aef8942d82f8d12ccf9bc48c72104ab5..f607e8fc2bc998c93f86f01dbb556f960825489e 100644 +index 421f08c047af617141f08682742fb81c7e077f94..0fec88e696fe1c0cc241ed296e5a8ad4435e251e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -415,6 +415,17 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0102-Arrows-should-not-reset-despawn-counter.patch b/patches/server/0097-Arrows-should-not-reset-despawn-counter.patch similarity index 91% rename from patches/todo/server/0102-Arrows-should-not-reset-despawn-counter.patch rename to patches/server/0097-Arrows-should-not-reset-despawn-counter.patch index fc65e301e..b054312a3 100644 --- a/patches/todo/server/0102-Arrows-should-not-reset-despawn-counter.patch +++ b/patches/server/0097-Arrows-should-not-reset-despawn-counter.patch @@ -7,7 +7,7 @@ This prevents keeping arrows alive indefinitely (such as when the block the arrow is stuck in gets removed, like a piston head going up/down) diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -index 5d6d26cfe8f0ab68a3145214b3fc126ca7a71a66..1ea5664e1e7dc73cbd2d1cc38c830a19ba985528 100644 +index 7226be19248a1ffb8ff2c89b55882529d33a6c0c..57f89ff7ddcd738100f296ae7a21b3240ab374de 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java @@ -312,7 +312,7 @@ public abstract class AbstractArrow extends Projectile { @@ -20,7 +20,7 @@ index 5d6d26cfe8f0ab68a3145214b3fc126ca7a71a66..1ea5664e1e7dc73cbd2d1cc38c830a19 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f607e8fc2bc998c93f86f01dbb556f960825489e..70911b0e8c47d505e43e11e5d29da150afb19272 100644 +index 0fec88e696fe1c0cc241ed296e5a8ad4435e251e..698dff77d5507f8da1170757a77e790598102c30 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -103,6 +103,11 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0103-Ability-to-re-add-farmland-mechanics-from-Alpha.patch b/patches/server/0098-Ability-to-re-add-farmland-mechanics-from-Alpha.patch similarity index 87% rename from patches/todo/server/0103-Ability-to-re-add-farmland-mechanics-from-Alpha.patch rename to patches/server/0098-Ability-to-re-add-farmland-mechanics-from-Alpha.patch index 3bd1fb88a..7f726ffe6 100644 --- a/patches/todo/server/0103-Ability-to-re-add-farmland-mechanics-from-Alpha.patch +++ b/patches/server/0098-Ability-to-re-add-farmland-mechanics-from-Alpha.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Ability to re-add farmland mechanics from Alpha 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 fce9ebcaaac18ecee24c7091ea77a32ac567762e..8725ca6eec1becc401951a746a90f678e5edf7ac 100644 +index d446b440e2bc5b73362fc3d30a10d2e52fde68e1..d4e3a32a0f9b49bff64cb43d77727ce3cae95f09 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -@@ -114,6 +114,14 @@ public class FarmBlock extends Block { +@@ -115,6 +115,14 @@ public class FarmBlock extends Block { return; } @@ -24,7 +24,7 @@ index fce9ebcaaac18ecee24c7091ea77a32ac567762e..8725ca6eec1becc401951a746a90f678 return; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 70911b0e8c47d505e43e11e5d29da150afb19272..00e4930d899b547f4a410fae3bc91dfe16259ed6 100644 +index 698dff77d5507f8da1170757a77e790598102c30..fbde69170f19333faa02552f0bccc4fbaf04ef14 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -416,8 +416,10 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0104-Add-adjustable-breeding-cooldown-to-config.patch b/patches/server/0099-Add-adjustable-breeding-cooldown-to-config.patch similarity index 73% rename from patches/todo/server/0104-Add-adjustable-breeding-cooldown-to-config.patch rename to patches/server/0099-Add-adjustable-breeding-cooldown-to-config.patch index 0470f2055..5b682595b 100644 --- a/patches/todo/server/0104-Add-adjustable-breeding-cooldown-to-config.patch +++ b/patches/server/0099-Add-adjustable-breeding-cooldown-to-config.patch @@ -5,38 +5,47 @@ Subject: [PATCH] Add adjustable breeding cooldown to config diff --git a/src/main/java/net/minecraft/world/entity/animal/Animal.java b/src/main/java/net/minecraft/world/entity/animal/Animal.java -index 3c4d142e982c34a23bdb5da1f51c8dcacc0532c1..f185215b826c4b50a819c8454089cb8ccdb0ed3a 100644 +index 80598d4e679999138f6aca9f6f847e9509fa68da..e3a0a2914db92c95c894174e3815e3eca8d70826 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Animal.java +++ b/src/main/java/net/minecraft/world/entity/animal/Animal.java -@@ -150,7 +150,7 @@ public abstract class Animal extends AgeableMob { +@@ -151,7 +151,7 @@ public abstract class Animal extends AgeableMob { if (this.isFood(itemstack)) { int i = this.getAge(); -- if (!this.level.isClientSide && i == 0 && this.canFallInLove()) { -+ if (!this.level.isClientSide && i == 0 && this.canFallInLove() && (this.level.purpurConfig.animalBreedingCooldownSeconds <= 0 || !this.level.hasBreedingCooldown(player.getUUID(), this.getClass()))) { // Purpur +- if (!this.level().isClientSide && i == 0 && this.canFallInLove()) { ++ if (!this.level().isClientSide && i == 0 && this.canFallInLove() && (this.level().purpurConfig.animalBreedingCooldownSeconds <= 0 || !this.level().hasBreedingCooldown(player.getUUID(), this.getClass()))) { // Purpur this.usePlayerItem(player, hand, itemstack); this.setInLove(player); return InteractionResult.SUCCESS; -@@ -237,6 +237,14 @@ public abstract class Animal extends AgeableMob { - if (entityplayer == null && other.getLoveCause() != null) { - entityplayer = other.getLoveCause(); - } +@@ -233,12 +233,20 @@ public abstract class Animal extends AgeableMob { + AgeableMob entityageable = this.getBreedOffspring(world, other); + + if (entityageable != null) { +- entityageable.setBaby(true); +- entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); +- // CraftBukkit start - call EntityBreedEvent + // Purpur start -+ if (entityplayer != null && world.purpurConfig.animalBreedingCooldownSeconds > 0) { -+ if (world.hasBreedingCooldown(entityplayer.getUUID(), this.getClass())) { + ServerPlayer breeder = Optional.ofNullable(this.getLoveCause()).or(() -> { + return Optional.ofNullable(other.getLoveCause()); + }).orElse(null); ++ if (breeder != null && world.purpurConfig.animalBreedingCooldownSeconds > 0) { ++ if (world.hasBreedingCooldown(breeder.getUUID(), this.getClass())) { + return; + } -+ world.addBreedingCooldown(entityplayer.getUUID(), this.getClass()); ++ world.addBreedingCooldown(breeder.getUUID(), this.getClass()); + } ++ entityageable.setBaby(true); ++ entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); ++ // CraftBukkit start - call EntityBreedEvent + // Purpur end - // CraftBukkit start - call EntityBreedEvent - entityageable.setBaby(true); - entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); + int experience = this.getRandom().nextInt(7) + 1; + org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityageable, this, other, breeder, this.breedItem, experience); + if (entityBreedEvent.isCancelled()) { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index d0e0ce953dd0cdd6b54bb00224e82dca62f793cd..52d2fa575a29ec36280bb4dbcab6954ac468d2a1 100644 +index 8673d325bd866704ae90ac31eb54f78097eac952..10cff85dd4a59558dd487a3c5c7871a026835ceb 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -195,6 +195,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -193,6 +193,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } // Paper end - fix and optimise world upgrading @@ -86,7 +95,7 @@ index d0e0ce953dd0cdd6b54bb00224e82dca62f793cd..52d2fa575a29ec36280bb4dbcab6954a public CraftWorld getWorld() { return this.world; } -@@ -290,6 +333,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -277,6 +320,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName(), env); // Purpur @@ -95,7 +104,7 @@ index d0e0ce953dd0cdd6b54bb00224e82dca62f793cd..52d2fa575a29ec36280bb4dbcab6954a this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 00e4930d899b547f4a410fae3bc91dfe16259ed6..f3e623890c29726d2bfa7713ab5183a788664ed7 100644 +index fbde69170f19333faa02552f0bccc4fbaf04ef14..0780e76f12cd36744e5682860cf399634d4d137c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -117,6 +117,7 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0105-Make-entity-breeding-times-configurable.patch b/patches/server/0100-Make-entity-breeding-times-configurable.patch similarity index 65% rename from patches/todo/server/0105-Make-entity-breeding-times-configurable.patch rename to patches/server/0100-Make-entity-breeding-times-configurable.patch index fc54f0aab..e598e355c 100644 --- a/patches/todo/server/0105-Make-entity-breeding-times-configurable.patch +++ b/patches/server/0100-Make-entity-breeding-times-configurable.patch @@ -22,10 +22,10 @@ index 0951c04533e7c39b969d041271684355770b53c2..02d4ba2ccdce99ca97614baa7c8e4921 world.broadcastEntityEvent(entityvillager2, (byte) 12); return Optional.of(entityvillager2); diff --git a/src/main/java/net/minecraft/world/entity/animal/Animal.java b/src/main/java/net/minecraft/world/entity/animal/Animal.java -index f185215b826c4b50a819c8454089cb8ccdb0ed3a..2ac88f06ebb79e515cd9934ac1e3e2c8003d9e3c 100644 +index e3a0a2914db92c95c894174e3815e3eca8d70826..4643c07bc2a26e7886b714514b7a4a059835af64 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Animal.java +++ b/src/main/java/net/minecraft/world/entity/animal/Animal.java -@@ -39,6 +39,7 @@ public abstract class Animal extends AgeableMob { +@@ -40,6 +40,7 @@ public abstract class Animal extends AgeableMob { @Nullable public UUID loveCause; public ItemStack breedItem; // CraftBukkit - Add breedItem variable @@ -33,100 +33,100 @@ index f185215b826c4b50a819c8454089cb8ccdb0ed3a..2ac88f06ebb79e515cd9934ac1e3e2c8 protected Animal(EntityType type, Level world) { super(type, world); -@@ -261,8 +262,10 @@ public abstract class Animal extends AgeableMob { - CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer, this, other, entityageable); - } - -- this.setAge(6000); -- other.setAge(6000); -+ // Purpur start -+ this.setAge(this.getPurpurBreedTime()); -+ other.setAge(other.getPurpurBreedTime()); -+ // Purpur end - this.resetLove(); - other.resetLove(); - world.addFreshEntityWithPassengers(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason +@@ -272,8 +273,10 @@ public abstract class Animal extends AgeableMob { + entityplayer.awardStat(Stats.ANIMALS_BRED); + CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer, this, entityanimal, entityageable); + }); +- this.setAge(6000); +- entityanimal.setAge(6000); ++ // Purpur start ++ this.setAge(this.getPurpurBreedTime()); ++ entityanimal.setAge(entityanimal.getPurpurBreedTime()); ++ // Purpur end + this.resetLove(); + entityanimal.resetLove(); + worldserver.broadcastEntityEvent(this, (byte) 18); diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index c0b85da9cce5ec75d83945ba7b4d2fc823105103..980bab802ce49384fc836187fa69e178a04a3ea2 100644 +index cd960eaeb3b86177b962db69173112f746bc52e1..d50f80e1b6ba690c25fb2993f596f2329bd422a3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -219,6 +219,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - public void initAttributes() { +@@ -420,6 +420,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.beeMaxHealth); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.beeBreedingTicks; + } - // Purpur end - ++ @Override + 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 944da53f7f48e5218c12b7fd4bb443621cafc331..bc9c39e90f0a41f9bec6f93db921d2157183698c 100644 +index 3981a2b7501ceb62562785b2ace5990473919fa0..a47718747f41a80b5aecffdf74aa1095786cf9a3 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -125,6 +125,11 @@ public class Cat extends TamableAnimal implements VariantHolder { - public void initAttributes() { +@@ -102,6 +102,11 @@ public class Cat extends TamableAnimal implements VariantHolder { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.catMaxHealth); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.catBreedingTicks; + } - // Purpur end - ++ public ResourceLocation getResourceLocation() { + return this.getVariant().texture(); + } diff --git a/src/main/java/net/minecraft/world/entity/animal/Chicken.java b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -index da281eb1355fd753dfdb69cee13661818b5d0fc8..12faecfb4ffdd2c248c4a36134ed38f96b6d4069 100644 +index 7d6307aed4d1c15edf2008715ec90f61aac42046..6ade6225e83bab038aab91637a425616cab2853e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Chicken.java +++ b/src/main/java/net/minecraft/world/entity/animal/Chicken.java -@@ -77,6 +77,11 @@ public class Chicken extends Animal { - this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(2.0D); +@@ -62,6 +62,11 @@ public class Chicken extends Animal { } } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.chickenBreedingTicks; + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Cow.java b/src/main/java/net/minecraft/world/entity/animal/Cow.java -index b7a0ee0e055d12e36b411859211367c9df3b9549..7776aa8db4b8782fea1ac57b82b98687548aab93 100644 +index 2d8f51fd2f9562ccffe25a965aa02613eed3d71b..154829bdef01a0a93f163578ea8e51a0cb3952e5 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cow.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java -@@ -63,6 +63,11 @@ public class Cow extends Animal { - public void initAttributes() { +@@ -48,6 +48,11 @@ public class Cow extends Animal { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.cowMaxHealth); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.cowBreedingTicks; + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); 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 d5f536eb87163c946815ace610ba99ad2a0b16c5..920b70b5c534ee83f5acb26890f3cfdf220fd887 100644 +index 5ee2f4d9e0bb97de9cb8bd3b2c4b6280c607b323..a80d18398db003ddeaa28aa00e13a0869191695f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -184,6 +184,11 @@ public class Fox extends Animal implements VariantHolder { - public void initAttributes() { +@@ -148,6 +148,11 @@ public class Fox extends Animal implements VariantHolder { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.foxMaxHealth); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.foxBreedingTicks; + } - // Purpur end - ++ @Override -@@ -981,8 +986,10 @@ public class Fox extends Animal implements VariantHolder { + protected void defineSynchedData() { + super.defineSynchedData(); +@@ -941,8 +946,10 @@ public class Fox extends Animal implements VariantHolder { CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer2, this.animal, this.partner, entityfox); } @@ -140,186 +140,186 @@ index d5f536eb87163c946815ace610ba99ad2a0b16c5..920b70b5c534ee83f5acb26890f3cfdf this.partner.resetLove(); worldserver.addFreshEntityWithPassengers(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 12b715086a347b82726327358ac71c72a4fca8b0..7e3f730aac201dd5302c1d3a1b98e06c214f0740 100644 +index 841d97651827c24350854fa16f9c65e8daf70d55..6d7fd5bab1173e99eb8f2b67d202b22abaad28bb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -@@ -83,6 +83,11 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { - public void initAttributes() { +@@ -96,6 +96,11 @@ public class Rabbit extends Animal implements VariantHolder { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.rabbitMaxHealth); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.rabbitBreedingTicks; + } - // Purpur end - ++ // CraftBukkit start - code from constructor + public void initializePathFinderGoals(){ + this.setSpeedModifier(0.0D); diff --git a/src/main/java/net/minecraft/world/entity/animal/Sheep.java b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -index ce2bac7cc95dca0f3d8c97ba6d7cf922d328c579..0969acaee0708a6fbb52c1cbee05ebb58b1408dd 100644 +index 5886a9a40cbac1a97d4213d4a806802359953d18..34ddf57d47dc82b87ad9898c91b7891b8255455f 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Sheep.java +++ b/src/main/java/net/minecraft/world/entity/animal/Sheep.java -@@ -136,6 +136,11 @@ public class Sheep extends Animal implements Shearable { - public void initAttributes() { +@@ -122,6 +122,11 @@ public class Sheep extends Animal implements Shearable { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.sheepMaxHealth); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.sheepBreedingTicks; + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.eatBlockGoal = new EatBlockGoal(this); diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index 67c8f06d1befaf810e3954dbda156ee29bfbc0d4..303a2c74574d9ef456866ff30b98b9d103562658 100644 +index fc98554897f009352f1869d3e5a42d209a8d520c..2f685d2512d8bd3cb41dd1b652ca2c2fb805b83b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -@@ -103,6 +103,11 @@ public class Turtle extends Animal { - public void initAttributes() { +@@ -88,6 +88,11 @@ public class Turtle extends Animal { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.turtleMaxHealth); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.turtleBreedingTicks; + } - // Purpur end - ++ public void setHomePos(BlockPos pos) { + this.entityData.set(Turtle.HOME_POS, pos.immutable()); // Paper - called with mutablepos... + } 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 05792466a89bdcffe1a4241761b7c23afcc6bc88..6ddcf37ce8dbc6a57cabd43b04be6baba496a904 100644 +index 123bb0b0a8437935ae5dafbe93b44eb268d1b4c0..d914f8d659404e0e8c499e2cd8bf0a3a6d21905e 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -127,6 +127,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { - public void initAttributes() { +@@ -107,6 +107,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.wolfMaxHealth); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.wolfBreedingTicks; + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 65587c422eb7e2b64670dd869e01297998765c30..6fb82a4497dbc1ace86b8446f45ddecda18302bb 100644 +index d90bf5a45466525c9a04d54b02d366861423be8f..4ce8b7cfdbbb475e257fe91ea541669361b92173 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -118,6 +118,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { + return this.modelRotationValues; diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java -index a58028bfd3722210e801e85c355d679cd8557e85..a66f77ec5cb5a2b9f6944c2a747b22d8f89e9cb7 100644 +index 95fbdb0e9c59edeb647fe0e5d51d5e6a35152cd6..eb7c9846aa01ec0f5e46c24005110b6e6961e295 100644 --- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java +++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java -@@ -83,6 +83,13 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Rider +@@ -84,6 +84,13 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Rider groundPathNavigation.setCanWalkOverFences(true); } @@ -334,230 +334,228 @@ index a58028bfd3722210e801e85c355d679cd8557e85..a66f77ec5cb5a2b9f6944c2a747b22d8 public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -index 24419e78976cabc7f14a4cff0f273c958344a8d6..84de3dc9695eb857874cb60940049a978222c9ad 100644 +index 22eb0a8fc35baa04b34265b62aa29a71f3cc7343..177db290818ebd80cdcd74c4e86074bf19a884aa 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -@@ -139,6 +139,10 @@ public class Frog extends Animal implements VariantHolder { - public float getJumpPower() { - return (getRider() != null && isControllable()) ? level.purpurConfig.frogRidableJumpHeight * this.getBlockJumpFactor() : super.getJumpPower(); +@@ -87,6 +87,10 @@ public class Frog extends Animal implements VariantHolder { + this.setMaxUpStep(1.0F); } -+ + + public int getPurpurBreedTime() { + return this.level.purpurConfig.frogBreedingTicks; + } - // Purpur end - ++ @Override + protected Brain.Provider brainProvider() { + return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); 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 81790ac38ef67682053751a9e6813eed8d744337..c16caaf748d5972be455234b4e2cb8a3980e17b0 100644 +index 528e7ba29dcd38726b2c1bbc1d8ac208c64ba9df..2c1a6321f46a029ddc1c4e4c0afe07516c874843 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 -@@ -104,6 +104,11 @@ public class Goat extends Animal { - public boolean isControllable() { - return level.purpurConfig.goatControllable; +@@ -89,6 +89,11 @@ public class Goat extends Animal { + return InstrumentItem.create(Items.GOAT_HORN, (Holder) holderset.getRandomElement(randomsource).get()); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.goatBreedingTicks; + } - // Purpur end - ++ @Override + 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 7afd065d6a5d5b9650e64a26449dcf81724744bb..fdb32983ddb979b53f547b6ec999cfae539b8179 100644 +index d3e8b9ddc42c506f8a0b696becc2ca63414db76f..11dc7cf7cd38994edb6e8c1ed0761e45bc998bfc 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 -@@ -35,6 +35,11 @@ public class Donkey extends AbstractChestedHorse { - public double generateSpeed(net.minecraft.util.RandomSource random) { +@@ -30,6 +30,11 @@ public class Donkey extends AbstractChestedHorse { return generateSpeed(this.level.purpurConfig.donkeyMovementSpeedMin, this.level.purpurConfig.donkeyMovementSpeedMax); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.donkeyBreedingTicks; + } - // Purpur end - ++ @Override + 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 fcd5afe0e25482877894fde500ddf7a0cb290b62..a129757a6ad38aaea854dbfe97eb6673058d3f31 100644 +index 62f7cdc02e7eb15a96f20ff48470d9869ec82d59..97cbd228dd33333468e545697530bbd14de86308 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 -@@ -60,6 +60,11 @@ public class Horse extends AbstractHorse implements VariantHolder { - public double generateSpeed(RandomSource random) { +@@ -55,6 +55,11 @@ public class Horse extends AbstractHorse implements VariantHolder { return generateSpeed(this.level.purpurConfig.horseMovementSpeedMin, this.level.purpurConfig.horseMovementSpeedMax); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.horseBreedingTicks; + } - // Purpur end - ++ @Override + 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 2343accfb669e38635eab949ff04a3f729ac3992..5de1bd35bdd064d1bcdd891719352beb2dae662b 100644 +index fbcd47e656a8d33da08d1d852a959bc7cf3a2394..5d960b40ff2c41e7e21cace33a2655eb8bea7dc9 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 -@@ -136,6 +136,11 @@ public class Llama extends AbstractChestedHorse implements VariantHolder type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { + BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable(); + 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 b855647ebd374e4d01e90b78a5d650ceab85173d..6e8715bf332826c8326c00c5288e2402f02339a1 100644 +index 139c0853d54f736d61ae8c2f90c8bef9e4acb164..467ea5292a5dca5679b0e9b92b75447c3770fae0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -87,6 +87,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - public void initAttributes() { +@@ -72,6 +72,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level.purpurConfig.hoglinMaxHealth); } -+ + + @Override + public int getPurpurBreedTime() { + return this.level.purpurConfig.hoglinBreedingTicks; + } - // Purpur end - ++ @Override + public boolean canBeLeashed(Player player) { + return !this.isLeashed(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f3e623890c29726d2bfa7713ab5183a788664ed7..c2651f1a01a1ae04b937316671bc16a33b6c9b8e 100644 +index 0780e76f12cd36744e5682860cf399634d4d137c..82222e74b3fd450b3c8c3d8b04a7243c7baba475 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -512,10 +512,12 @@ public class PurpurWorldConfig { - public boolean axolotlRidable = false; - public boolean axolotlControllable = true; +@@ -480,8 +480,10 @@ public class PurpurWorldConfig { + } + public double axolotlMaxHealth = 14.0D; + public int axolotlBreedingTicks = 6000; private void axolotlSettings() { - axolotlRidable = getBoolean("mobs.axolotl.ridable", axolotlRidable); - axolotlControllable = getBoolean("mobs.axolotl.controllable", axolotlControllable); axolotlMaxHealth = getDouble("mobs.axolotl.attributes.max_health", axolotlMaxHealth); + axolotlBreedingTicks = getInt("mobs.axolotl.breeding-delay-ticks", axolotlBreedingTicks); } - public boolean batRidable = false; -@@ -548,6 +550,7 @@ public class PurpurWorldConfig { - public boolean beeControllable = true; - public double beeMaxY = 320D; + public double batMaxHealth = 6.0D; +@@ -509,6 +511,7 @@ public class PurpurWorldConfig { + } + public double beeMaxHealth = 10.0D; + public int beeBreedingTicks = 6000; private void beeSettings() { - beeRidable = getBoolean("mobs.bee.ridable", beeRidable); - beeRidableInWater = getBoolean("mobs.bee.ridable-in-water", beeRidableInWater); -@@ -559,6 +562,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.bee.attributes.max-health", beeMaxHealth); +@@ -516,6 +519,7 @@ public class PurpurWorldConfig { set("mobs.bee.attributes.max_health", oldValue); } beeMaxHealth = getDouble("mobs.bee.attributes.max_health", beeMaxHealth); + beeBreedingTicks = getInt("mobs.bee.breeding-delay-ticks", beeBreedingTicks); } - public boolean blazeRidable = false; -@@ -579,6 +583,7 @@ public class PurpurWorldConfig { + public double blazeMaxHealth = 20.0D; +@@ -528,6 +532,7 @@ public class PurpurWorldConfig { blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth); } @@ -565,154 +563,142 @@ index f3e623890c29726d2bfa7713ab5183a788664ed7..c2651f1a01a1ae04b937316671bc16a3 public double camelMaxHealthMin = 32.0D; public double camelMaxHealthMax = 32.0D; public double camelJumpStrengthMin = 0.42D; -@@ -592,6 +597,7 @@ public class PurpurWorldConfig { +@@ -541,12 +546,14 @@ public class PurpurWorldConfig { camelJumpStrengthMax = getDouble("mobs.camel.attributes.jump_strength.max", camelJumpStrengthMax); camelMovementSpeedMin = getDouble("mobs.camel.attributes.movement_speed.min", camelMovementSpeedMin); camelMovementSpeedMax = getDouble("mobs.camel.attributes.movement_speed.max", camelMovementSpeedMax); + camelBreedingTicks = getInt("mobs.camel.breeding-delay-ticks", camelBreedingTicks); } - public boolean catRidable = false; -@@ -601,6 +607,7 @@ public class PurpurWorldConfig { + public double catMaxHealth = 10.0D; public int catSpawnDelay = 1200; public int catSpawnSwampHutScanRange = 16; public int catSpawnVillageScanRange = 48; + public int catBreedingTicks = 6000; private void catSettings() { - catRidable = getBoolean("mobs.cat.ridable", catRidable); - catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -614,6 +621,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); +@@ -557,6 +564,7 @@ public class PurpurWorldConfig { catSpawnDelay = getInt("mobs.cat.spawn-delay", catSpawnDelay); catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); + catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); } - public boolean caveSpiderRidable = false; -@@ -637,6 +645,7 @@ public class PurpurWorldConfig { - public boolean chickenControllable = true; + public double caveSpiderMaxHealth = 12.0D; +@@ -571,6 +579,7 @@ public class PurpurWorldConfig { + public double chickenMaxHealth = 4.0D; public boolean chickenRetaliate = false; + public int chickenBreedingTicks = 6000; private void chickenSettings() { - chickenRidable = getBoolean("mobs.chicken.ridable", chickenRidable); - chickenRidableInWater = getBoolean("mobs.chicken.ridable-in-water", chickenRidableInWater); -@@ -648,6 +657,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.chicken.attributes.max-health", chickenMaxHealth); +@@ -579,6 +588,7 @@ public class PurpurWorldConfig { } chickenMaxHealth = getDouble("mobs.chicken.attributes.max_health", chickenMaxHealth); chickenRetaliate = getBoolean("mobs.chicken.retaliate", chickenRetaliate); + chickenBreedingTicks = getInt("mobs.chicken.breeding-delay-ticks", chickenBreedingTicks); } - public boolean codRidable = false; -@@ -669,6 +679,7 @@ public class PurpurWorldConfig { - public boolean cowControllable = true; + public double codMaxHealth = 3.0D; +@@ -593,6 +603,7 @@ public class PurpurWorldConfig { + public double cowMaxHealth = 10.0D; public int cowFeedMushrooms = 0; + public int cowBreedingTicks = 6000; private void cowSettings() { - cowRidable = getBoolean("mobs.cow.ridable", cowRidable); - cowRidableInWater = getBoolean("mobs.cow.ridable-in-water", cowRidableInWater); -@@ -680,6 +691,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cow.attributes.max-health", cowMaxHealth); +@@ -601,6 +612,7 @@ public class PurpurWorldConfig { } cowMaxHealth = getDouble("mobs.cow.attributes.max_health", cowMaxHealth); cowFeedMushrooms = getInt("mobs.cow.feed-mushrooms-for-mooshroom", cowFeedMushrooms); + cowBreedingTicks = getInt("mobs.cow.breeding-delay-ticks", cowBreedingTicks); } - public boolean creeperRidable = false; -@@ -731,6 +743,7 @@ public class PurpurWorldConfig { + public double creeperMaxHealth = 20.0D; +@@ -635,6 +647,7 @@ public class PurpurWorldConfig { public double donkeyJumpStrengthMax = 0.5D; public double donkeyMovementSpeedMin = 0.175D; public double donkeyMovementSpeedMax = 0.175D; + public int donkeyBreedingTicks = 6000; private void donkeySettings() { - donkeyRidableInWater = getBoolean("mobs.donkey.ridable-in-water", donkeyRidableInWater); if (PurpurConfig.version < 10) { -@@ -746,6 +759,7 @@ public class PurpurWorldConfig { + double oldMin = getDouble("mobs.donkey.attributes.max-health.min", donkeyMaxHealthMin); +@@ -649,6 +662,7 @@ public class PurpurWorldConfig { donkeyJumpStrengthMax = getDouble("mobs.donkey.attributes.jump_strength.max", donkeyJumpStrengthMax); donkeyMovementSpeedMin = getDouble("mobs.donkey.attributes.movement_speed.min", donkeyMovementSpeedMin); donkeyMovementSpeedMax = getDouble("mobs.donkey.attributes.movement_speed.max", donkeyMovementSpeedMax); + donkeyBreedingTicks = getInt("mobs.donkey.breeding-delay-ticks", donkeyBreedingTicks); } - public boolean drownedRidable = false; -@@ -865,6 +879,7 @@ public class PurpurWorldConfig { - public boolean foxControllable = true; + public double drownedMaxHealth = 20.0D; +@@ -729,6 +743,7 @@ public class PurpurWorldConfig { + public double foxMaxHealth = 10.0D; public boolean foxTypeChangesWithTulips = false; + public int foxBreedingTicks = 6000; private void foxSettings() { - foxRidable = getBoolean("mobs.fox.ridable", foxRidable); - foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -876,17 +891,20 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); +@@ -737,6 +752,12 @@ public class PurpurWorldConfig { } foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); + foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); - } - - public boolean frogRidable = false; - public boolean frogRidableInWater = true; - public boolean frogControllable = true; - public float frogRidableJumpHeight = 0.65F; ++ } ++ + public int frogBreedingTicks = 6000; - private void frogSettings() { - frogRidable = getBoolean("mobs.frog.ridable", frogRidable); - frogRidableInWater = getBoolean("mobs.frog.ridable-in-water", frogRidableInWater); - frogControllable = getBoolean("mobs.frog.controllable", frogControllable); - frogRidableJumpHeight = (float) getDouble("mobs.frog.ridable-jump-height", frogRidableJumpHeight); ++ private void frogSettings() { + frogBreedingTicks = getInt("mobs.frog.breeding-delay-ticks", frogBreedingTicks); } - public boolean ghastRidable = false; -@@ -954,11 +972,13 @@ public class PurpurWorldConfig { - public boolean goatRidableInWater = true; - public boolean goatControllable = true; + public double ghastMaxHealth = 10.0D; +@@ -783,8 +804,10 @@ public class PurpurWorldConfig { + } + public double goatMaxHealth = 10.0D; + public int goatBreedingTicks = 6000; private void goatSettings() { - goatRidable = getBoolean("mobs.goat.ridable", goatRidable); - goatRidableInWater = getBoolean("mobs.goat.ridable-in-water", goatRidableInWater); - goatControllable = getBoolean("mobs.goat.controllable", goatControllable); goatMaxHealth = getDouble("mobs.goat.attributes.max_health", goatMaxHealth); + goatBreedingTicks = getInt("mobs.goat.breeding-delay-ticks", goatBreedingTicks); } - public boolean guardianRidable = false; -@@ -979,6 +999,7 @@ public class PurpurWorldConfig { - public boolean hoglinRidableInWater = true; - public boolean hoglinControllable = true; + public double guardianMaxHealth = 30.0D; +@@ -798,6 +821,7 @@ public class PurpurWorldConfig { + } + public double hoglinMaxHealth = 40.0D; + public int hoglinBreedingTicks = 6000; private void hoglinSettings() { - hoglinRidable = getBoolean("mobs.hoglin.ridable", hoglinRidable); - hoglinRidableInWater = getBoolean("mobs.hoglin.ridable-in-water", hoglinRidableInWater); -@@ -989,6 +1010,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.hoglin.attributes.max-health", hoglinMaxHealth); +@@ -805,6 +829,7 @@ public class PurpurWorldConfig { set("mobs.hoglin.attributes.max_health", oldValue); } hoglinMaxHealth = getDouble("mobs.hoglin.attributes.max_health", hoglinMaxHealth); + hoglinBreedingTicks = getInt("mobs.hoglin.breeding-delay-ticks", hoglinBreedingTicks); } - public boolean horseRidableInWater = false; -@@ -998,6 +1020,7 @@ public class PurpurWorldConfig { + public double horseMaxHealthMin = 15.0D; +@@ -813,6 +838,7 @@ public class PurpurWorldConfig { public double horseJumpStrengthMax = 1.0D; public double horseMovementSpeedMin = 0.1125D; public double horseMovementSpeedMax = 0.3375D; + public int horseBreedingTicks = 6000; private void horseSettings() { - horseRidableInWater = getBoolean("mobs.horse.ridable-in-water", horseRidableInWater); if (PurpurConfig.version < 10) { -@@ -1013,6 +1036,7 @@ public class PurpurWorldConfig { + double oldMin = getDouble("mobs.horse.attributes.max-health.min", horseMaxHealthMin); +@@ -827,6 +853,7 @@ public class PurpurWorldConfig { horseJumpStrengthMax = getDouble("mobs.horse.attributes.jump_strength.max", horseJumpStrengthMax); horseMovementSpeedMin = getDouble("mobs.horse.attributes.movement_speed.min", horseMovementSpeedMin); horseMovementSpeedMax = getDouble("mobs.horse.attributes.movement_speed.max", horseMovementSpeedMax); + horseBreedingTicks = getInt("mobs.horse.breeding-delay-ticks", horseBreedingTicks); } - public boolean huskRidable = false; -@@ -1090,6 +1114,7 @@ public class PurpurWorldConfig { + public double huskMaxHealth = 20.0D; +@@ -884,6 +911,7 @@ public class PurpurWorldConfig { public double llamaJumpStrengthMax = 0.5D; public double llamaMovementSpeedMin = 0.175D; public double llamaMovementSpeedMax = 0.175D; @@ -720,231 +706,222 @@ index f3e623890c29726d2bfa7713ab5183a788664ed7..c2651f1a01a1ae04b937316671bc16a3 private void llamaSettings() { llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable); llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater); -@@ -1107,6 +1132,7 @@ public class PurpurWorldConfig { +@@ -901,6 +929,7 @@ public class PurpurWorldConfig { llamaJumpStrengthMax = getDouble("mobs.llama.attributes.jump_strength.max", llamaJumpStrengthMax); llamaMovementSpeedMin = getDouble("mobs.llama.attributes.movement_speed.min", llamaMovementSpeedMin); llamaMovementSpeedMax = getDouble("mobs.llama.attributes.movement_speed.max", llamaMovementSpeedMax); + llamaBreedingTicks = getInt("mobs.llama.breeding-delay-ticks", llamaBreedingTicks); } - public boolean magmaCubeRidable = false; -@@ -1135,6 +1161,7 @@ public class PurpurWorldConfig { - public boolean mooshroomRidableInWater = true; - public boolean mooshroomControllable = true; + public String magmaCubeMaxHealth = "size * size"; +@@ -920,6 +949,7 @@ public class PurpurWorldConfig { + } + public double mooshroomMaxHealth = 10.0D; + public int mooshroomBreedingTicks = 6000; private void mooshroomSettings() { - mooshroomRidable = getBoolean("mobs.mooshroom.ridable", mooshroomRidable); - mooshroomRidableInWater = getBoolean("mobs.mooshroom.ridable-in-water", mooshroomRidableInWater); -@@ -1145,6 +1172,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.mooshroom.attributes.max-health", mooshroomMaxHealth); +@@ -927,6 +957,7 @@ public class PurpurWorldConfig { set("mobs.mooshroom.attributes.max_health", oldValue); } mooshroomMaxHealth = getDouble("mobs.mooshroom.attributes.max_health", mooshroomMaxHealth); + mooshroomBreedingTicks = getInt("mobs.mooshroom.breeding-delay-ticks", mooshroomBreedingTicks); } - public boolean muleRidableInWater = false; -@@ -1154,6 +1182,7 @@ public class PurpurWorldConfig { + public double muleMaxHealthMin = 15.0D; +@@ -935,6 +966,7 @@ public class PurpurWorldConfig { public double muleJumpStrengthMax = 0.5D; public double muleMovementSpeedMin = 0.175D; public double muleMovementSpeedMax = 0.175D; + public int muleBreedingTicks = 6000; private void muleSettings() { - muleRidableInWater = getBoolean("mobs.mule.ridable-in-water", muleRidableInWater); if (PurpurConfig.version < 10) { -@@ -1169,12 +1198,14 @@ public class PurpurWorldConfig { + double oldMin = getDouble("mobs.mule.attributes.max-health.min", muleMaxHealthMin); +@@ -949,9 +981,11 @@ public class PurpurWorldConfig { muleJumpStrengthMax = getDouble("mobs.mule.attributes.jump_strength.max", muleJumpStrengthMax); muleMovementSpeedMin = getDouble("mobs.mule.attributes.movement_speed.min", muleMovementSpeedMin); muleMovementSpeedMax = getDouble("mobs.mule.attributes.movement_speed.max", muleMovementSpeedMax); + muleBreedingTicks = getInt("mobs.mule.breeding-delay-ticks", muleBreedingTicks); } - public boolean ocelotRidable = false; - public boolean ocelotRidableInWater = true; - public boolean ocelotControllable = true; public double ocelotMaxHealth = 10.0D; + public int ocelotBreedingTicks = 6000; private void ocelotSettings() { - ocelotRidable = getBoolean("mobs.ocelot.ridable", ocelotRidable); - ocelotRidableInWater = getBoolean("mobs.ocelot.ridable-in-water", ocelotRidableInWater); -@@ -1185,12 +1216,14 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ocelot.attributes.max-health", ocelotMaxHealth); +@@ -959,9 +993,11 @@ public class PurpurWorldConfig { set("mobs.ocelot.attributes.max_health", oldValue); } ocelotMaxHealth = getDouble("mobs.ocelot.attributes.max_health", ocelotMaxHealth); + ocelotBreedingTicks = getInt("mobs.ocelot.breeding-delay-ticks", ocelotBreedingTicks); } - public boolean pandaRidable = false; - public boolean pandaRidableInWater = true; - public boolean pandaControllable = true; public double pandaMaxHealth = 20.0D; + public int pandaBreedingTicks = 6000; private void pandaSettings() { - pandaRidable = getBoolean("mobs.panda.ridable", pandaRidable); - pandaRidableInWater = getBoolean("mobs.panda.ridable-in-water", pandaRidableInWater); -@@ -1201,6 +1234,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.panda.attributes.max-health", pandaMaxHealth); +@@ -969,6 +1005,7 @@ public class PurpurWorldConfig { set("mobs.panda.attributes.max_health", oldValue); } pandaMaxHealth = getDouble("mobs.panda.attributes.max_health", pandaMaxHealth); + pandaBreedingTicks = getInt("mobs.panda.breeding-delay-ticks", pandaBreedingTicks); } - public boolean parrotRidable = false; -@@ -1284,6 +1318,7 @@ public class PurpurWorldConfig { - public boolean pigControllable = true; + public double parrotMaxHealth = 6.0D; +@@ -1021,6 +1058,7 @@ public class PurpurWorldConfig { + public double pigMaxHealth = 10.0D; public boolean pigGiveSaddleBack = false; + public int pigBreedingTicks = 6000; private void pigSettings() { - pigRidable = getBoolean("mobs.pig.ridable", pigRidable); - pigRidableInWater = getBoolean("mobs.pig.ridable-in-water", pigRidableInWater); -@@ -1295,6 +1330,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pig.attributes.max-health", pigMaxHealth); +@@ -1029,6 +1067,7 @@ public class PurpurWorldConfig { } pigMaxHealth = getDouble("mobs.pig.attributes.max_health", pigMaxHealth); pigGiveSaddleBack = getBoolean("mobs.pig.give-saddle-back", pigGiveSaddleBack); + pigBreedingTicks = getInt("mobs.pig.breeding-delay-ticks", pigBreedingTicks); } - public boolean piglinRidable = false; -@@ -1351,6 +1387,7 @@ public class PurpurWorldConfig { + public double piglinMaxHealth = 16.0D; +@@ -1064,6 +1103,7 @@ public class PurpurWorldConfig { public double polarBearMaxHealth = 30.0D; public String polarBearBreedableItemString = ""; public Item polarBearBreedableItem = null; + public int polarBearBreedingTicks = 6000; private void polarBearSettings() { - polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable); - polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater); -@@ -1364,6 +1401,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.polar_bear.attributes.max-health", polarBearMaxHealth); +@@ -1074,6 +1114,7 @@ public class PurpurWorldConfig { polarBearBreedableItemString = getString("mobs.polar_bear.breedable-item", polarBearBreedableItemString); Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(polarBearBreedableItemString)); if (item != Items.AIR) polarBearBreedableItem = item; + polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks); } - public boolean pufferfishRidable = false; -@@ -1386,6 +1424,7 @@ public class PurpurWorldConfig { + public double pufferfishMaxHealth = 3.0D; +@@ -1089,6 +1130,7 @@ public class PurpurWorldConfig { public double rabbitMaxHealth = 3.0D; public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; + public int rabbitBreedingTicks = 6000; private void rabbitSettings() { - rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); - rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1398,6 +1437,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); +@@ -1098,6 +1140,7 @@ public class PurpurWorldConfig { rabbitMaxHealth = getDouble("mobs.rabbit.attributes.max_health", rabbitMaxHealth); rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast); rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller); + rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks); } - public boolean ravagerRidable = false; -@@ -1434,6 +1474,7 @@ public class PurpurWorldConfig { - public boolean sheepRidableInWater = true; - public boolean sheepControllable = true; + public double ravagerMaxHealth = 100.0D; +@@ -1121,6 +1164,7 @@ public class PurpurWorldConfig { + } + public double sheepMaxHealth = 8.0D; + public int sheepBreedingTicks = 6000; private void sheepSettings() { - sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); - sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1444,6 +1485,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); +@@ -1128,6 +1172,7 @@ public class PurpurWorldConfig { set("mobs.sheep.attributes.max_health", oldValue); } sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); + sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); } - public boolean shulkerRidable = false; -@@ -1567,11 +1609,13 @@ public class PurpurWorldConfig { - public boolean snifferRidableInWater = true; - public boolean snifferControllable = true; + public double shulkerMaxHealth = 30.0D; +@@ -1214,8 +1259,10 @@ public class PurpurWorldConfig { + } + public double snifferMaxHealth = 14.0D; + public int snifferBreedingTicks = 6000; private void snifferSettings() { - snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); - snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); - snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable); snifferMaxHealth = getDouble("mobs.sniffer.attributes.max_health", snifferMaxHealth); + snifferBreedingTicks = getInt("mobs.sniffer.breeding-delay-ticks", chickenBreedingTicks); } - public boolean squidRidable = false; -@@ -1630,6 +1674,7 @@ public class PurpurWorldConfig { - public boolean striderRidableInWater = false; - public boolean striderControllable = true; + public double squidMaxHealth = 10.0D; +@@ -1255,6 +1302,7 @@ public class PurpurWorldConfig { + } + public double striderMaxHealth = 20.0D; + public int striderBreedingTicks = 6000; private void striderSettings() { - striderRidable = getBoolean("mobs.strider.ridable", striderRidable); - striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1640,6 +1685,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.strider.attributes.max-health", striderMaxHealth); +@@ -1262,6 +1310,7 @@ public class PurpurWorldConfig { set("mobs.strider.attributes.max_health", oldValue); } striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); + striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); } - public boolean tadpoleRidable = false; -@@ -1660,6 +1706,7 @@ public class PurpurWorldConfig { + public double traderLlamaMaxHealthMin = 15.0D; +@@ -1270,6 +1319,7 @@ public class PurpurWorldConfig { public double traderLlamaJumpStrengthMax = 0.5D; public double traderLlamaMovementSpeedMin = 0.175D; public double traderLlamaMovementSpeedMax = 0.175D; + public int traderLlamaBreedingTicks = 6000; private void traderLlamaSettings() { - traderLlamaRidable = getBoolean("mobs.trader_llama.ridable", traderLlamaRidable); - traderLlamaRidableInWater = getBoolean("mobs.trader_llama.ridable-in-water", traderLlamaRidableInWater); -@@ -1677,6 +1724,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldMin = getDouble("mobs.trader_llama.attributes.max-health.min", traderLlamaMaxHealthMin); +@@ -1284,6 +1334,7 @@ public class PurpurWorldConfig { traderLlamaJumpStrengthMax = getDouble("mobs.trader_llama.attributes.jump_strength.max", traderLlamaJumpStrengthMax); traderLlamaMovementSpeedMin = getDouble("mobs.trader_llama.attributes.movement_speed.min", traderLlamaMovementSpeedMin); traderLlamaMovementSpeedMax = getDouble("mobs.trader_llama.attributes.movement_speed.max", traderLlamaMovementSpeedMax); + traderLlamaBreedingTicks = getInt("mobs.trader_llama.breeding-delay-ticks", traderLlamaBreedingTicks); } - public boolean tropicalFishRidable = false; -@@ -1697,6 +1745,7 @@ public class PurpurWorldConfig { - public boolean turtleRidableInWater = true; - public boolean turtleControllable = true; + public double tropicalFishMaxHealth = 3.0D; +@@ -1297,6 +1348,7 @@ public class PurpurWorldConfig { + } + public double turtleMaxHealth = 30.0D; + public int turtleBreedingTicks = 6000; private void turtleSettings() { - turtleRidable = getBoolean("mobs.turtle.ridable", turtleRidable); - turtleRidableInWater = getBoolean("mobs.turtle.ridable-in-water", turtleRidableInWater); -@@ -1707,6 +1756,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.turtle.attributes.max-health", turtleMaxHealth); +@@ -1304,6 +1356,7 @@ public class PurpurWorldConfig { set("mobs.turtle.attributes.max_health", oldValue); } turtleMaxHealth = getDouble("mobs.turtle.attributes.max_health", turtleMaxHealth); + turtleBreedingTicks = getInt("mobs.turtle.breeding-delay-ticks", turtleBreedingTicks); } - public boolean vexRidable = false; -@@ -1734,6 +1784,7 @@ public class PurpurWorldConfig { + public double vexMaxY = 320D; +@@ -1322,6 +1375,7 @@ public class PurpurWorldConfig { public boolean villagerFollowEmeraldBlock = false; public boolean villagerCanBeLeashed = false; public boolean villagerCanBreed = true; + public int villagerBreedingTicks = 6000; private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1747,6 +1798,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); +@@ -1332,6 +1386,7 @@ public class PurpurWorldConfig { villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock); villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed); villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed); + villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks); } - public boolean vindicatorRidable = false; -@@ -1858,6 +1910,7 @@ public class PurpurWorldConfig { - public boolean wolfRidableInWater = true; - public boolean wolfControllable = true; + public double vindicatorMaxHealth = 24.0D; +@@ -1399,6 +1454,7 @@ public class PurpurWorldConfig { + } + public double wolfMaxHealth = 8.0D; + public int wolfBreedingTicks = 6000; private void wolfSettings() { - wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); - wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater); -@@ -1868,6 +1921,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.wolf.attributes.max-health", wolfMaxHealth); +@@ -1406,6 +1462,7 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); + wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks); } - public boolean zoglinRidable = false; + public double zoglinMaxHealth = 40.0D; diff --git a/patches/todo/server/0106-Apply-display-names-from-item-forms-of-entities-to-e.patch b/patches/server/0101-Apply-display-names-from-item-forms-of-entities-to-e.patch similarity index 94% rename from patches/todo/server/0106-Apply-display-names-from-item-forms-of-entities-to-e.patch rename to patches/server/0101-Apply-display-names-from-item-forms-of-entities-to-e.patch index c5de6c5c2..8a82a333a 100644 --- a/patches/todo/server/0106-Apply-display-names-from-item-forms-of-entities-to-e.patch +++ b/patches/server/0101-Apply-display-names-from-item-forms-of-entities-to-e.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Apply display names from item forms of entities to entities 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 697d6d6cca0a1c8df9c5bf6852495130a0c57eb4..5b4523320de59167bd5864b2f17187590afb5ad6 100644 +index 316716b8827b974fa62f7f27d57c3b776b42fbd8..1406cdd79c7183522f1f5c0b0edc6166ff9d4ed9 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -@@ -609,7 +609,7 @@ public class ArmorStand extends LivingEntity { +@@ -603,7 +603,7 @@ public class ArmorStand extends LivingEntity { private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(DamageSource damageSource) { // Paper ItemStack itemstack = new ItemStack(Items.ARMOR_STAND); @@ -19,7 +19,7 @@ index 697d6d6cca0a1c8df9c5bf6852495130a0c57eb4..5b4523320de59167bd5864b2f1718759 } diff --git a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -index 30aec9dff249ae629b22318e52902361a9fa4099..165382f5da5307d6f6eae971a565ab1ae3046891 100644 +index 955316687e2e29ad75a0052317a7b0f89034c82a..43f9733d4cc180b3103173d86bf2e8742f87de2a 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java @@ -272,7 +272,13 @@ public class ItemFrame extends HangingEntity { @@ -38,7 +38,7 @@ index 30aec9dff249ae629b22318e52902361a9fa4099..165382f5da5307d6f6eae971a565ab1a if (!itemstack.isEmpty()) { diff --git a/src/main/java/net/minecraft/world/entity/decoration/Painting.java b/src/main/java/net/minecraft/world/entity/decoration/Painting.java -index cefb3d0658e56c7c103626b8cfc5faa05f03665b..90cab3586d3e3e290475fe8d59a69d89d3c24add 100644 +index d5784a19cec98eb199a51acd9e1f4de8c6bf7265..6bf0daff390e1a7335d2b61cc52d415002cf6f08 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/Painting.java +++ b/src/main/java/net/minecraft/world/entity/decoration/Painting.java @@ -159,7 +159,13 @@ public class Painting extends HangingEntity implements VariantHolder { @@ -136,7 +136,7 @@ index b2ad6d230de2c29f371178bccde1111c7532ee70..6667926519a0f1c151e53f59cce36e74 if (((HangingEntity) object).survives()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c2651f1a01a1ae04b937316671bc16a33b6c9b8e..dfd60520c7924e4258d1a481fc1f72ff182ed6b9 100644 +index 82222e74b3fd450b3c8c3d8b04a7243c7baba475..cd37b4e5705ccbb88bf9fd8559c66e4ed7f092f0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -99,8 +99,10 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0107-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch b/patches/server/0102-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch similarity index 84% rename from patches/todo/server/0107-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch rename to patches/server/0102-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch index 1c38ef278..e1993a26e 100644 --- a/patches/todo/server/0107-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch +++ b/patches/server/0102-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch @@ -5,19 +5,19 @@ 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 623f78c078fb3aa2665d7e8a37672438227bce6b..500c69e555c7247e20ef8cc59d83415578f44427 100644 +index 2941c16ef486345b57ab2dfcd26f0272285d3b5a..a312bdc5c90cdcc45b40fc54a1a2a98f54eae82e 100644 --- a/src/main/java/net/minecraft/world/item/NameTagItem.java +++ b/src/main/java/net/minecraft/world/item/NameTagItem.java -@@ -24,6 +24,7 @@ public class NameTagItem extends Item { +@@ -20,6 +20,7 @@ public class NameTagItem extends Item { if (!event.callEvent()) return InteractionResult.PASS; LivingEntity newEntityLiving = ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getEntity()).getHandle(); - newEntityLiving.setCustomName(event.getName() != null ? PaperAdventure.asVanilla(event.getName()) : null); + newEntityLiving.setCustomName(event.getName() != null ? io.papermc.paper.adventure.PaperAdventure.asVanilla(event.getName()) : null); + if (user.level.purpurConfig.armorstandFixNametags && entity instanceof net.minecraft.world.entity.decoration.ArmorStand) entity.setCustomNameVisible(true); // Purpur if (event.isPersistent() && newEntityLiving instanceof Mob) { ((Mob) newEntityLiving).setPersistenceRequired(); - // Paper end + // Paper end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index dfd60520c7924e4258d1a481fc1f72ff182ed6b9..c5c02479efbe1531f7b86bfd18e86f6fff7e27fe 100644 +index cd37b4e5705ccbb88bf9fd8559c66e4ed7f092f0..ceb42382e3f80c795d75ba2a34a4bed741d84ea7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,9 +100,11 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0108-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch b/patches/server/0103-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch similarity index 74% rename from patches/todo/server/0108-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch rename to patches/server/0103-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch index f6b2bf3cd..dc88ad6af 100644 --- a/patches/todo/server/0108-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch +++ b/patches/server/0103-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 d8123aa5585cb4c0cc1210ced04fdf08f731fdb2..757aa2e3fa1c4608f07adbff0f718ad8f04be475 100644 +index 1bb0f20e964d74e9949fe7ec3034d5ada8bafa89..c3c32a99d53eea7f61b70d7ed8ddc8a2112dd9f7 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -490,7 +490,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -464,7 +464,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { @@ -21,22 +21,22 @@ index d8123aa5585cb4c0cc1210ced04fdf08f731fdb2..757aa2e3fa1c4608f07adbff0f718ad8 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 c5c02479efbe1531f7b86bfd18e86f6fff7e27fe..2d63b6de58149bd160d8455becbf224757cb3baf 100644 +index ceb42382e3f80c795d75ba2a34a4bed741d84ea7..94c3fd880ac8a5561a9af57485810ed428cd718c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -835,6 +835,7 @@ public class PurpurWorldConfig { - public boolean endermanControllable = true; +@@ -717,6 +717,7 @@ public class PurpurWorldConfig { + public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; + public boolean endermanDespawnEvenWithBlock = false; private void endermanSettings() { - endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); - endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -846,6 +847,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); +@@ -725,6 +726,7 @@ public class PurpurWorldConfig { } endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); + endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); } - public boolean endermiteRidable = false; + public double endermiteMaxHealth = 8.0D; diff --git a/patches/todo/server/0109-Add-configurable-snowball-damage.patch b/patches/server/0104-Add-configurable-snowball-damage.patch similarity index 90% rename from patches/todo/server/0109-Add-configurable-snowball-damage.patch rename to patches/server/0104-Add-configurable-snowball-damage.patch index 2b38794d4..cd31d0604 100644 --- a/patches/todo/server/0109-Add-configurable-snowball-damage.patch +++ b/patches/server/0104-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 6cded52e4627c2b6073fa221fc6d6583f1b2a96d..5827236f351cd0679af764644bb22bb286ac361d 100644 +index 718e120c9768cf716b32d3d652f53f1dda925168..e1e19a360be99b189dee1652e5289292f4996d92 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java @@ -53,7 +53,7 @@ public class Snowball extends ThrowableItemProjectile { @@ -18,7 +18,7 @@ index 6cded52e4627c2b6073fa221fc6d6583f1b2a96d..5827236f351cd0679af764644bb22bb2 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 2d63b6de58149bd160d8455becbf224757cb3baf..c9559508d8962b891b5aca3a7ee1138b935a078b 100644 +index 94c3fd880ac8a5561a9af57485810ed428cd718c..b23ef63f21eec2224975e7ee531e4c7d4becfdd5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -356,6 +356,11 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0110-Changeable-Mob-Left-Handed-Chance.patch b/patches/server/0105-Changeable-Mob-Left-Handed-Chance.patch similarity index 86% rename from patches/todo/server/0110-Changeable-Mob-Left-Handed-Chance.patch rename to patches/server/0105-Changeable-Mob-Left-Handed-Chance.patch index 15c67ecf9..99c6f1d2b 100644 --- a/patches/todo/server/0110-Changeable-Mob-Left-Handed-Chance.patch +++ b/patches/server/0105-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 183261a031a2a0b6b95dbb983236cee3cd3a0398..9dae07b1f1e18cbc86d64e5f793a5eb1685c2f7b 100644 +index 0509b57efe9a42bf44a8ff2c13a042bb2d3accf9..311927443aaca5f3acd5936d333abc72719448d1 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1292,7 +1292,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1289,7 +1289,7 @@ public abstract class Mob extends LivingEntity implements Targeting { RandomSource randomsource = world.getRandom(); this.getAttribute(Attributes.FOLLOW_RANGE).addPermanentModifier(new AttributeModifier("Random spawn bonus", randomsource.triangle(0.0D, 0.11485000000000001D), AttributeModifier.Operation.MULTIPLY_BASE)); @@ -18,7 +18,7 @@ index 183261a031a2a0b6b95dbb983236cee3cd3a0398..9dae07b1f1e18cbc86d64e5f793a5eb1 } else { this.setLeftHanded(false); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c9559508d8962b891b5aca3a7ee1138b935a078b..a673ae630a0551fb242d920470c9165f4531f5fb 100644 +index b23ef63f21eec2224975e7ee531e4c7d4becfdd5..eacc769e0930f3b510f70b4c5cf5024d1d249d40 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -158,8 +158,10 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0111-Add-boat-fall-damage-config.patch b/patches/server/0106-Add-boat-fall-damage-config.patch similarity index 92% rename from patches/todo/server/0111-Add-boat-fall-damage-config.patch rename to patches/server/0106-Add-boat-fall-damage-config.patch index 1c63a968d..cd620db84 100644 --- a/patches/todo/server/0111-Add-boat-fall-damage-config.patch +++ b/patches/server/0106-Add-boat-fall-damage-config.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add boat fall damage config diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 581685e53fc9b63d291ba4904e47e8afc1119c9a..02078f459eb7230a5ac9b4499d961c8b37e5b196 100644 +index 5165f6d8189ec8e64cdb0902d61276571198f9a7..2a0e5c8ef89bf32411893b4ee4a045ddc104dc93 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1071,7 +1071,16 @@ public class ServerPlayer extends Player { +@@ -1103,7 +1103,16 @@ public class ServerPlayer extends Player { if (this.isInvulnerableTo(source)) { return false; } else { @@ -27,7 +27,7 @@ index 581685e53fc9b63d291ba4904e47e8afc1119c9a..02078f459eb7230a5ac9b4499d961c8b if (!flag && isSpawnInvulnerable() && !source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { // Purpur diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a673ae630a0551fb242d920470c9165f4531f5fb..780c094431e8206a7cd42b1f0bdfb098c1af8af2 100644 +index eacc769e0930f3b510f70b4c5cf5024d1d249d40..f4443840cc77feb3cc6a6519d91d66a757d756af 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -114,6 +114,7 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0112-Snow-Golem-rate-of-fire-config.patch b/patches/server/0107-Snow-Golem-rate-of-fire-config.patch similarity index 80% rename from patches/todo/server/0112-Snow-Golem-rate-of-fire-config.patch rename to patches/server/0107-Snow-Golem-rate-of-fire-config.patch index 81503ae5d..2561e5a7a 100644 --- a/patches/todo/server/0112-Snow-Golem-rate-of-fire-config.patch +++ b/patches/server/0107-Snow-Golem-rate-of-fire-config.patch @@ -10,23 +10,23 @@ 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 6c6e020522261ca5bbc47a59c25d3e98bf0b4007..30abf3ee1b9d3aef9291076a1f0bf865c54beadd 100644 +index 02e0f6d86a7dfc7a21a45bc8f50fed22a81207f2..ca557bf95c8238c6b671900affc1965b3f3af837 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -79,7 +79,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -61,7 +61,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 - this.goalSelector.addGoal(1, new RangedAttackGoal(this, 1.25D, 20, 10.0F)); + this.goalSelector.addGoal(1, new RangedAttackGoal(this, level.purpurConfig.snowGolemAttackDistance, level.purpurConfig.snowGolemSnowBallMin, level.purpurConfig.snowGolemSnowBallMax, level.purpurConfig.snowGolemSnowBallModifier)); // Purpur this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D, 1.0000001E-5F)); 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 780c094431e8206a7cd42b1f0bdfb098c1af8af2..496b797910b1248662289fab16ed5fa3390d0c4d 100644 +index f4443840cc77feb3cc6a6519d91d66a757d756af..ac11e65b03fb94afad7fca5c10884c1859c5d23b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1607,6 +1607,10 @@ public class PurpurWorldConfig { +@@ -1263,6 +1263,10 @@ public class PurpurWorldConfig { public double snowGolemMaxHealth = 4.0D; public boolean snowGolemDropsPumpkin = true; public boolean snowGolemPutPumpkinBack = false; @@ -35,9 +35,9 @@ index 780c094431e8206a7cd42b1f0bdfb098c1af8af2..496b797910b1248662289fab16ed5fa3 + public float snowGolemSnowBallModifier = 10.0F; + public double snowGolemAttackDistance = 1.25D; private void snowGolemSettings() { - snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); - snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1620,6 +1624,10 @@ public class PurpurWorldConfig { + snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); + if (PurpurConfig.version < 10) { +@@ -1273,6 +1277,10 @@ public class PurpurWorldConfig { snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth); snowGolemDropsPumpkin = getBoolean("mobs.snow_golem.drop-pumpkin-when-sheared", snowGolemDropsPumpkin); snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack); @@ -47,4 +47,4 @@ index 780c094431e8206a7cd42b1f0bdfb098c1af8af2..496b797910b1248662289fab16ed5fa3 + snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance); } - public boolean snifferRidable = false; + public double snifferMaxHealth = 14.0D; diff --git a/patches/todo/server/0113-EMC-Configurable-disable-give-dropping.patch b/patches/server/0108-EMC-Configurable-disable-give-dropping.patch similarity index 78% rename from patches/todo/server/0113-EMC-Configurable-disable-give-dropping.patch rename to patches/server/0108-EMC-Configurable-disable-give-dropping.patch index 66c1ac160..9c3c8cc1d 100644 --- a/patches/todo/server/0113-EMC-Configurable-disable-give-dropping.patch +++ b/patches/server/0108-EMC-Configurable-disable-give-dropping.patch @@ -8,22 +8,22 @@ purpur.yml to disable the /give command from dropping items on the floor when a player's inventory is full. diff --git a/src/main/java/net/minecraft/server/commands/GiveCommand.java b/src/main/java/net/minecraft/server/commands/GiveCommand.java -index ee7d29d85c8b024c9b23cba8ecd4192aa7e8aa7b..7a44bac6e66bc5f5fe14a45a5e7c78c940fb1efb 100644 +index d601d287e94a59ff93b8a83a44dac02544d211df..0ff3b06a98b2f4514b2d861b92dd70fe678ae86c 100644 --- a/src/main/java/net/minecraft/server/commands/GiveCommand.java +++ b/src/main/java/net/minecraft/server/commands/GiveCommand.java -@@ -58,6 +58,7 @@ public class GiveCommand { - boolean flag = entityplayer.getInventory().add(itemstack); +@@ -59,6 +59,7 @@ public class GiveCommand { + boolean flag = entityplayer.getInventory().add(itemstack1); ItemEntity entityitem; + if (org.purpurmc.purpur.PurpurConfig.disableGiveCommandDrops) continue; // Purpur - add config option for toggling give command dropping - if (flag && itemstack.isEmpty()) { - itemstack.setCount(1); - entityitem = entityplayer.drop(itemstack, false, false, false); // SPIGOT-2942: Add boolean to call event + if (flag && itemstack1.isEmpty()) { + itemstack1.setCount(1); + entityitem = entityplayer.drop(itemstack1, false, false, false); // SPIGOT-2942: Add boolean to call event diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index 4e303fc793bef67426308204d704b02960fc75b8..b1757cd2f828304ca7376eed6eea01f816b26550 100644 +index cac902dae062d706c6ba255f74fc0f82378df241..22e9972b95824d5ef695af65a927a08c3bacd4fa 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -209,6 +209,11 @@ public class PurpurConfig { +@@ -207,6 +207,11 @@ public class PurpurConfig { useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive); } diff --git a/patches/todo/server/0115-Toggle-for-Zombified-Piglin-death-always-counting-as.patch b/patches/server/0109-Toggle-for-Zombified-Piglin-death-always-counting-as.patch similarity index 80% rename from patches/todo/server/0115-Toggle-for-Zombified-Piglin-death-always-counting-as.patch rename to patches/server/0109-Toggle-for-Zombified-Piglin-death-always-counting-as.patch index c70a6f87b..88d69023e 100644 --- a/patches/todo/server/0115-Toggle-for-Zombified-Piglin-death-always-counting-as.patch +++ b/patches/server/0109-Toggle-for-Zombified-Piglin-death-always-counting-as.patch @@ -13,10 +13,10 @@ to the Piglin being angry, even though the player never hit them. This patch adds a toggle to disable this behavior. diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index f2c690c92dd2bf55f986f629ed79b76fbdfa32a4..6e8f0c9df06e2930084a6d58213f6edfb36ec444 100644 +index 45c93c148cde236e01fe925c1a9b67e3e963bbb8..c8a024c9bd7c9cdbeff029bfacf4dba91e6ac580 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -152,7 +152,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -135,7 +135,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.maybeAlertOthers(); } @@ -25,7 +25,7 @@ index f2c690c92dd2bf55f986f629ed79b76fbdfa32a4..6e8f0c9df06e2930084a6d58213f6edf this.lastHurtByPlayerTime = this.tickCount; } -@@ -207,7 +207,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -190,7 +190,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.ticksUntilNextAlert = ZombifiedPiglin.ALERT_INTERVAL.sample(this.random); } @@ -35,18 +35,18 @@ index f2c690c92dd2bf55f986f629ed79b76fbdfa32a4..6e8f0c9df06e2930084a6d58213f6edf } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1ffdd96306b525f217a630b4f8f05e16c0e8b7cd..86d033f990e19c80db0209aacd0a60a506a6e607 100644 +index ac11e65b03fb94afad7fca5c10884c1859c5d23b..abbdb20d10bd86c4d68ebbb93213a73fb24e35bd 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2054,6 +2054,7 @@ public class PurpurWorldConfig { +@@ -1566,6 +1566,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinJockeyOnlyBaby = true; public double zombifiedPiglinJockeyChance = 0.05D; public boolean zombifiedPiglinJockeyTryExistingChickens = true; + public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; private void zombifiedPiglinSettings() { - zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); - zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -2068,5 +2069,6 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombified_piglin.attributes.max-health", zombifiedPiglinMaxHealth); +@@ -1577,5 +1578,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/todo/server/0116-Configurable-chance-for-wolves-to-spawn-rabid.patch b/patches/server/0110-Configurable-chance-for-wolves-to-spawn-rabid.patch similarity index 90% rename from patches/todo/server/0116-Configurable-chance-for-wolves-to-spawn-rabid.patch rename to patches/server/0110-Configurable-chance-for-wolves-to-spawn-rabid.patch index 31ac804f2..3c7975071 100644 --- a/patches/todo/server/0116-Configurable-chance-for-wolves-to-spawn-rabid.patch +++ b/patches/server/0110-Configurable-chance-for-wolves-to-spawn-rabid.patch @@ -7,7 +7,7 @@ Configurable chance to spawn a wolf that is rabid. Rabid wolves attack all players, mobs, and animals. diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 6ddcf37ce8dbc6a57cabd43b04be6baba496a904..079d41636f1420a8755442843f1843e397cdbbf9 100644 +index d914f8d659404e0e8c499e2cd8bf0a3a6d21905e..55b2f060b4e05ba0999acf2ffe46f9b4fece1952 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -10,6 +10,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; @@ -93,11 +93,10 @@ index 6ddcf37ce8dbc6a57cabd43b04be6baba496a904..079d41636f1420a8755442843f1843e3 private static final float START_HEALTH = 8.0F; private static final float TAME_HEALTH = 20.0F; private float interestedAngle; -@@ -132,6 +170,37 @@ public class Wolf extends TamableAnimal implements NeutralMob { - public int getPurpurBreedTime() { +@@ -112,12 +150,44 @@ public class Wolf extends TamableAnimal implements NeutralMob { return this.level.purpurConfig.wolfBreedingTicks; } -+ + + public boolean isRabid() { + return this.isRabid; + } @@ -128,10 +127,10 @@ index 6ddcf37ce8dbc6a57cabd43b04be6baba496a904..079d41636f1420a8755442843f1843e3 + this.updatePathfinders(false); + return super.finalizeSpawn(world, difficulty, type, data, nbt); + } - // Purpur end - ++ @Override -@@ -141,6 +210,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); this.goalSelector.addGoal(1, new Wolf.WolfPanicGoal(1.5D)); this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(3, new Wolf.WolfAvoidEntityGoal<>(this, Llama.class, 24.0F, 1.5D, 1.5D)); @@ -139,7 +138,7 @@ index 6ddcf37ce8dbc6a57cabd43b04be6baba496a904..079d41636f1420a8755442843f1843e3 this.goalSelector.addGoal(4, new LeapAtTargetGoal(this, 0.4F)); this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0D, true)); this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0D, 10.0F, 2.0F, false)); -@@ -154,7 +224,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -130,7 +200,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); this.targetSelector.addGoal(3, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); @@ -148,7 +147,7 @@ index 6ddcf37ce8dbc6a57cabd43b04be6baba496a904..079d41636f1420a8755442843f1843e3 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)); -@@ -199,6 +269,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -175,6 +245,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); nbt.putByte("CollarColor", (byte) this.getCollarColor().getId()); @@ -156,7 +155,7 @@ index 6ddcf37ce8dbc6a57cabd43b04be6baba496a904..079d41636f1420a8755442843f1843e3 this.addPersistentAngerSaveData(nbt); } -@@ -208,6 +279,10 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -184,6 +255,10 @@ public class Wolf extends TamableAnimal implements NeutralMob { if (nbt.contains("CollarColor", 99)) { this.setCollarColor(DyeColor.byId(nbt.getInt("CollarColor"))); } @@ -165,9 +164,9 @@ index 6ddcf37ce8dbc6a57cabd43b04be6baba496a904..079d41636f1420a8755442843f1843e3 + this.updatePathfinders(false); + // Purpur end - this.readPersistentAngerSaveData(this.level, nbt); + this.readPersistentAngerSaveData(this.level(), nbt); } -@@ -252,6 +327,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -228,6 +303,11 @@ public class Wolf extends TamableAnimal implements NeutralMob { public void tick() { super.tick(); if (this.isAlive()) { @@ -179,9 +178,9 @@ index 6ddcf37ce8dbc6a57cabd43b04be6baba496a904..079d41636f1420a8755442843f1843e3 this.interestedAngleO = this.interestedAngle; if (this.isInterested()) { this.interestedAngle += (1.0F - this.interestedAngle) * 0.4F; -@@ -458,6 +538,20 @@ public class Wolf extends TamableAnimal implements NeutralMob { - - return InteractionResult.SUCCESS; +@@ -437,6 +517,20 @@ public class Wolf extends TamableAnimal implements NeutralMob { + } else { + this.level().broadcastEntityEvent(this, (byte) 6); } + // Purpur start + else if (this.level.purpurConfig.wolfMilkCuresRabies && itemstack.getItem() == Items.MILK_BUCKET && this.isRabid()) { @@ -198,8 +197,8 @@ index 6ddcf37ce8dbc6a57cabd43b04be6baba496a904..079d41636f1420a8755442843f1843e3 + } + // Purpur end - return super.mobInteract(player, hand); - } + return InteractionResult.SUCCESS; + } else { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java index e43fd3e59fd8c74828ae65965fade27f56beef65..b2f133c8baabba1cffa6e92ea0f854532f4c181b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java @@ -222,19 +221,19 @@ index e43fd3e59fd8c74828ae65965fade27f56beef65..b2f133c8baabba1cffa6e92ea0f85453 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 86d033f990e19c80db0209aacd0a60a506a6e607..a6fbccd217af50fa3abfe703de7e9e9894916f40 100644 +index abbdb20d10bd86c4d68ebbb93213a73fb24e35bd..7e8d7744f1f107308e5856e18831f986bcf41bd8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1939,6 +1939,8 @@ public class PurpurWorldConfig { - public boolean wolfRidableInWater = true; - public boolean wolfControllable = true; +@@ -1479,6 +1479,8 @@ public class PurpurWorldConfig { + } + public double wolfMaxHealth = 8.0D; + public boolean wolfMilkCuresRabies = true; + public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; private void wolfSettings() { - wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable); -@@ -1950,6 +1952,8 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { +@@ -1487,6 +1489,8 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/todo/server/0117-Configurable-default-collar-color.patch b/patches/server/0111-Configurable-default-collar-color.patch similarity index 76% rename from patches/todo/server/0117-Configurable-default-collar-color.patch rename to patches/server/0111-Configurable-default-collar-color.patch index ced610109..2a74c1e4c 100644 --- a/patches/todo/server/0117-Configurable-default-collar-color.patch +++ b/patches/server/0111-Configurable-default-collar-color.patch @@ -7,10 +7,10 @@ This allows for the server to set a default collar color when a wolf or cat is t Resets to RED when the value is invalid. diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java -index bc9c39e90f0a41f9bec6f93db921d2157183698c..8e6abeab0a7d7007d0deef3b1dea77aee66681fa 100644 +index a47718747f41a80b5aecffdf74aa1095786cf9a3..0d8320fde901cd9ae6aa420b76362be77ca62c93 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Cat.java +++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java -@@ -345,6 +345,14 @@ public class Cat extends TamableAnimal implements VariantHolder { +@@ -318,6 +318,14 @@ public class Cat extends TamableAnimal implements VariantHolder { return Mth.lerp(tickDelta, this.relaxStateOneAmountO, this.relaxStateOneAmount); } @@ -26,55 +26,55 @@ index bc9c39e90f0a41f9bec6f93db921d2157183698c..8e6abeab0a7d7007d0deef3b1dea77ae @Override public Cat getBreedOffspring(ServerLevel world, AgeableMob entity) { 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 079d41636f1420a8755442843f1843e397cdbbf9..214d5d27f8c4f352839c1a45a083c329f41164bd 100644 +index 55b2f060b4e05ba0999acf2ffe46f9b4fece1952..3c5186800381c414c8dd3f2c58b1cd947e64a092 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -201,6 +201,12 @@ public class Wolf extends TamableAnimal implements NeutralMob { - this.updatePathfinders(false); +@@ -181,6 +181,12 @@ public class Wolf extends TamableAnimal implements NeutralMob { return super.finalizeSpawn(world, difficulty, type, data, nbt); } -+ + + @Override + public void tame(Player player) { + setCollarColor(level.purpurConfig.wolfDefaultCollarColor); + super.tame(player); + } - // Purpur end - ++ @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a6fbccd217af50fa3abfe703de7e9e9894916f40..38dbd6ff79fe1e1f5e4abb8ca57548ff6f46e60a 100644 +index 7e8d7744f1f107308e5856e18831f986bcf41bd8..84bb7a1a7744a55ebc284bbd8e2fb8b840eb0391 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -623,6 +623,7 @@ public class PurpurWorldConfig { +@@ -569,6 +569,7 @@ public class PurpurWorldConfig { public int catSpawnSwampHutScanRange = 16; public int catSpawnVillageScanRange = 48; public int catBreedingTicks = 6000; + public DyeColor catDefaultCollarColor = DyeColor.RED; private void catSettings() { - catRidable = getBoolean("mobs.cat.ridable", catRidable); - catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater); -@@ -637,6 +638,11 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.cat.attributes.max-health", catMaxHealth); +@@ -580,6 +581,11 @@ public class PurpurWorldConfig { catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange); catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange); catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks); + try { -+ catDefaultCollarColor = DyeColor.valueOf(getString("mobs.cat.default-collar-color", wolfDefaultCollarColor.name())); ++ catDefaultCollarColor = DyeColor.valueOf(getString("mobs.cat.default-collar-color", catDefaultCollarColor.name())); + } catch (IllegalArgumentException ignore) { + catDefaultCollarColor = DyeColor.RED; + } } - public boolean caveSpiderRidable = false; -@@ -1939,6 +1945,7 @@ public class PurpurWorldConfig { - public boolean wolfRidableInWater = true; - public boolean wolfControllable = true; + public double caveSpiderMaxHealth = 12.0D; +@@ -1479,6 +1485,7 @@ public class PurpurWorldConfig { + } + public double wolfMaxHealth = 8.0D; + public DyeColor wolfDefaultCollarColor = DyeColor.RED; public boolean wolfMilkCuresRabies = true; public double wolfNaturalRabid = 0.0D; public int wolfBreedingTicks = 6000; -@@ -1952,6 +1959,11 @@ public class PurpurWorldConfig { +@@ -1489,6 +1496,11 @@ public class PurpurWorldConfig { set("mobs.wolf.attributes.max_health", oldValue); } wolfMaxHealth = getDouble("mobs.wolf.attributes.max_health", wolfMaxHealth); diff --git a/patches/todo/server/0118-Phantom-flames-on-swoop.patch b/patches/server/0112-Phantom-flames-on-swoop.patch similarity index 67% rename from patches/todo/server/0118-Phantom-flames-on-swoop.patch rename to patches/server/0112-Phantom-flames-on-swoop.patch index 66471c006..870343f3b 100644 --- a/patches/todo/server/0118-Phantom-flames-on-swoop.patch +++ b/patches/server/0112-Phantom-flames-on-swoop.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Phantom flames on swoop diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index b601c542e28bc0a588e56aa37c243fe92145547e..ed5c75d390babced3dc062428176e968da878d8f 100644 +index ca46d91d75de8aaf39a16141bba593be94cbc45f..c0980014edd84582f179882e9d63abb5474df622 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -@@ -244,6 +244,7 @@ public class Phantom extends FlyingMob implements Enemy { - this.level.addParticle(ParticleTypes.MYCELIUM, this.getX() - (double) f2, this.getY() + (double) f4, this.getZ() - (double) f3, 0.0D, 0.0D, 0.0D); +@@ -159,6 +159,7 @@ public class Phantom extends FlyingMob implements Enemy { + this.level().addParticle(ParticleTypes.MYCELIUM, this.getX() - (double) f2, this.getY() + (double) f4, this.getZ() - (double) f3, 0.0D, 0.0D, 0.0D); } + if (level.purpurConfig.phantomFlamesOnSwoop && attackPhase == AttackPhase.SWOOP) shoot(); // Purpur @@ -17,22 +17,22 @@ index b601c542e28bc0a588e56aa37c243fe92145547e..ed5c75d390babced3dc062428176e968 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 38dbd6ff79fe1e1f5e4abb8ca57548ff6f46e60a..b77cc1019396f8fa63baf9aad81227ff7452400d 100644 +index 84bb7a1a7744a55ebc284bbd8e2fb8b840eb0391..224bb233f4b608ea9b971aad141c76bb37a019c5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1301,6 +1301,7 @@ public class PurpurWorldConfig { +@@ -1054,6 +1054,7 @@ public class PurpurWorldConfig { public int phantomBurnInLight = 0; public boolean phantomIgnorePlayersWithTorch = false; public boolean phantomBurnInDaylight = true; + public boolean phantomFlamesOnSwoop = false; private void phantomSettings() { - phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable); - phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater); -@@ -1334,6 +1335,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.phantom.attributes.max-health", Double.parseDouble(phantomMaxHealth)); +@@ -1077,6 +1078,7 @@ public class PurpurWorldConfig { phantomBurnInLight = getInt("mobs.phantom.burn-in-light", phantomBurnInLight); phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight); phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch); + phantomFlamesOnSwoop = getBoolean("mobs.phantom.flames-on-swoop", phantomFlamesOnSwoop); } - public boolean pigRidable = false; + public double pigMaxHealth = 10.0D; diff --git a/patches/todo/server/0119-Option-for-chests-to-open-even-with-a-solid-block-on.patch b/patches/server/0113-Option-for-chests-to-open-even-with-a-solid-block-on.patch similarity index 94% rename from patches/todo/server/0119-Option-for-chests-to-open-even-with-a-solid-block-on.patch rename to patches/server/0113-Option-for-chests-to-open-even-with-a-solid-block-on.patch index d18c688e0..8c8389652 100644 --- a/patches/todo/server/0119-Option-for-chests-to-open-even-with-a-solid-block-on.patch +++ b/patches/server/0113-Option-for-chests-to-open-even-with-a-solid-block-on.patch @@ -17,7 +17,7 @@ index 5e22d175b1048a58802cdf64ac70a8b56329e915..d81946b400f208c39941128ce823ff77 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 b77cc1019396f8fa63baf9aad81227ff7452400d..bcb384761d4ad7abb6624d78e501084817c678e0 100644 +index 224bb233f4b608ea9b971aad141c76bb37a019c5..775a13fa3462f75fe62f1649ef731b1058703d2f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -425,6 +425,11 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0120-Implement-TPSBar.patch b/patches/server/0114-Implement-TPSBar.patch similarity index 91% rename from patches/todo/server/0120-Implement-TPSBar.patch rename to patches/server/0114-Implement-TPSBar.patch index 1c83a6bb8..96c63dfda 100644 --- a/patches/todo/server/0120-Implement-TPSBar.patch +++ b/patches/server/0114-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 277fb799d898ca726205519b1516861901be33c5..144e83bac0d8885c48d97d7fbb4b712d4c0fc4b3 100644 +index e5b1b6ad32c48a4ba13b4930954fad18669677ad..4e721dfca7559620d8ce65a6703f2089a839f4a0 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -225,6 +225,7 @@ public class Commands { +@@ -227,6 +227,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 277fb799d898ca726205519b1516861901be33c5..144e83bac0d8885c48d97d7fbb4b712d if (environment.includeIntegrated) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 52487bc86a28a2f2c1c677b07c9fec77685f2af0..de9e19d9979ad6981fcda881d22b18a613c4138d 100644 +index 5750934e3cfb1a9d7fc127a5033c504476900981..8e044ff6db7f4ab1605eec1bd8063916add22ca8 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1026,6 +1026,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1)); + public io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; +@@ -559,6 +560,7 @@ public class ServerPlayer extends Player { } } @@ -61,7 +61,7 @@ index 91a2081acf514b61033b669dc331b223c84adfbd..d526d2374008bdaac4b03437e24da25a } @Override -@@ -584,6 +586,7 @@ public class ServerPlayer extends Player { +@@ -625,6 +627,7 @@ public class ServerPlayer extends Player { } this.getBukkitEntity().setExtraData(nbt); // CraftBukkit @@ -69,7 +69,7 @@ index 91a2081acf514b61033b669dc331b223c84adfbd..d526d2374008bdaac4b03437e24da25a } // CraftBukkit start - World fallback code, either respawn location or global spawn -@@ -2703,5 +2706,13 @@ public class ServerPlayer extends Player { +@@ -2779,5 +2782,13 @@ public class ServerPlayer extends Player { this.server.getPlayerList().respawn(this, toLevel, true, to, !toLevel.paperConfig().environment.disableTeleportationSuffocationCheck, org.bukkit.event.player.PlayerRespawnEvent.RespawnReason.DEATH); } } @@ -84,10 +84,10 @@ index 91a2081acf514b61033b669dc331b223c84adfbd..d526d2374008bdaac4b03437e24da25a // Purpur end } diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 91166ac140e14a4300ecbec8d80716b175fd2889..37943331eecee6263041b64d274a8be682a1039d 100644 +index bacce71fe2616068d45bee9cf12a1a3b3326b98e..15a04d24f511425aee392a2fa4e333071ca5c582 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -469,6 +469,7 @@ public abstract class PlayerList { +@@ -476,6 +476,7 @@ public abstract class PlayerList { scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); } // Paper end @@ -95,28 +95,27 @@ index 91166ac140e14a4300ecbec8d80716b175fd2889..37943331eecee6263041b64d274a8be6 // CraftBukkit - Moved from above, added world PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), s1, player.getId(), worldserver1.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ()); } -@@ -578,6 +579,8 @@ public abstract class PlayerList { +@@ -585,6 +586,7 @@ public abstract class PlayerList { } public net.kyori.adventure.text.Component remove(ServerPlayer entityplayer, net.kyori.adventure.text.Component leaveMessage) { // Paper end + org.purpurmc.purpur.task.BossBarTask.removeFromAll(entityplayer.getBukkitEntity()); // Purpur -+ - ServerLevel worldserver = entityplayer.getLevel(); + ServerLevel worldserver = entityplayer.serverLevel(); entityplayer.awardStat(Stats.LEAVE_GAME); diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index b1757cd2f828304ca7376eed6eea01f816b26550..70db296b80b98b378917f68037420ae150e14adb 100644 +index 22e9972b95824d5ef695af65a927a08c3bacd4fa..fdfb1f6bd59f5b9e193aac61b2ddc1b1e4f20d6c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -182,6 +182,7 @@ public class PurpurConfig { +@@ -181,6 +181,7 @@ public class PurpurConfig { public static String creditsCommandOutput = "%s has been shown the end credits"; public static String demoCommandOutput = "%s has been shown the demo screen"; public static String pingCommandOutput = "%s's ping is %sms"; + public static String tpsbarCommandOutput = "Tpsbar toggled for "; private static void messages() { - cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob); afkBroadcastAway = getString("settings.messages.afk-broadcast-away", afkBroadcastAway); -@@ -192,6 +193,7 @@ public class PurpurConfig { + afkBroadcastBack = getString("settings.messages.afk-broadcast-back", afkBroadcastBack); +@@ -190,6 +191,7 @@ public class PurpurConfig { creditsCommandOutput = getString("settings.messages.credits-command-output", creditsCommandOutput); demoCommandOutput = getString("settings.messages.demo-command-output", demoCommandOutput); pingCommandOutput = getString("settings.messages.ping-command-output", pingCommandOutput); @@ -124,7 +123,7 @@ index b1757cd2f828304ca7376eed6eea01f816b26550..70db296b80b98b378917f68037420ae1 } public static String serverModName = "Purpur"; -@@ -214,6 +216,29 @@ public class PurpurConfig { +@@ -212,6 +214,29 @@ public class PurpurConfig { disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops); } diff --git a/patches/todo/server/0121-Striders-give-saddle-back.patch b/patches/server/0115-Striders-give-saddle-back.patch similarity index 75% rename from patches/todo/server/0121-Striders-give-saddle-back.patch rename to patches/server/0115-Striders-give-saddle-back.patch index 0bc1954a4..e52783af0 100644 --- a/patches/todo/server/0121-Striders-give-saddle-back.patch +++ b/patches/server/0115-Striders-give-saddle-back.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Striders give saddle back diff --git a/src/main/java/net/minecraft/world/entity/monster/Strider.java b/src/main/java/net/minecraft/world/entity/monster/Strider.java -index 1be6dc3608b839b0ed7d2fcd968991ce5bbeb89b..270135cb5a5f50b39683f74da84045ea75045030 100644 +index 3479e37415a1d5a94a1e2388bd56558b6d56eec9..7d57137951c9493265623f8674b8900c850ef396 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Strider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Strider.java -@@ -486,6 +486,19 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { +@@ -468,6 +468,19 @@ public class Strider extends Animal implements ItemSteerable, Saddleable { public InteractionResult mobInteract(Player player, InteractionHand hand) { boolean flag = this.isFood(player.getItemInHand(hand)); @@ -26,25 +26,25 @@ index 1be6dc3608b839b0ed7d2fcd968991ce5bbeb89b..270135cb5a5f50b39683f74da84045ea + // Purpur end + if (!flag && this.isSaddled() && !this.isVehicle() && !player.isSecondaryUseActive()) { - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { player.startRiding(this); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index bcb384761d4ad7abb6624d78e501084817c678e0..c877d28640ad083ef4d117b7c2deecbed3bcc12a 100644 +index 775a13fa3462f75fe62f1649ef731b1058703d2f..d7bb242d3be5cadfd848c105419d269391504537 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1713,6 +1713,7 @@ public class PurpurWorldConfig { - public boolean striderControllable = true; +@@ -1341,6 +1341,7 @@ public class PurpurWorldConfig { + public double striderMaxHealth = 20.0D; public int striderBreedingTicks = 6000; + public boolean striderGiveSaddleBack = false; private void striderSettings() { - striderRidable = getBoolean("mobs.strider.ridable", striderRidable); - striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater); -@@ -1724,6 +1725,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.strider.attributes.max-health", striderMaxHealth); +@@ -1349,6 +1350,7 @@ public class PurpurWorldConfig { } striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth); striderBreedingTicks = getInt("mobs.strider.breeding-delay-ticks", striderBreedingTicks); + striderGiveSaddleBack = getBoolean("mobs.strider.give-saddle-back", striderGiveSaddleBack); } - public boolean tadpoleRidable = false; + public double traderLlamaMaxHealthMin = 15.0D; diff --git a/patches/todo/server/0122-PlayerBookTooLargeEvent.patch b/patches/server/0116-PlayerBookTooLargeEvent.patch similarity index 92% rename from patches/todo/server/0122-PlayerBookTooLargeEvent.patch rename to patches/server/0116-PlayerBookTooLargeEvent.patch index 06c5e738a..866e7b2b6 100644 --- a/patches/todo/server/0122-PlayerBookTooLargeEvent.patch +++ b/patches/server/0116-PlayerBookTooLargeEvent.patch @@ -5,10 +5,10 @@ Subject: [PATCH] PlayerBookTooLargeEvent diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index d4280dcd4b8a4e09ef1b6c6d89ea5c58468f7229..d9a6a5ef1cd419d2111e49d42df8b866e90d9c6b 100644 +index 5ceb3a454fbd6993fd82cacb83b3ba9844463054..c624651d073eef3a71729555d7fe1adca27679e2 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1262,10 +1262,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1264,10 +1264,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic int maxBookPageSize = io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.pageMax; double multiplier = Math.max(0.3D, Math.min(1D, io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier)); long byteAllowed = maxBookPageSize; @@ -21,7 +21,7 @@ index d4280dcd4b8a4e09ef1b6c6d89ea5c58468f7229..d9a6a5ef1cd419d2111e49d42df8b866 server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1289,6 +1291,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1291,6 +1293,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic if (byteTotal > byteAllowed) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); diff --git a/patches/todo/server/0123-Full-netherite-armor-grants-fire-resistance.patch b/patches/server/0117-Full-netherite-armor-grants-fire-resistance.patch similarity index 93% rename from patches/todo/server/0123-Full-netherite-armor-grants-fire-resistance.patch rename to patches/server/0117-Full-netherite-armor-grants-fire-resistance.patch index 6e067986d..72140f35c 100644 --- a/patches/todo/server/0123-Full-netherite-armor-grants-fire-resistance.patch +++ b/patches/server/0117-Full-netherite-armor-grants-fire-resistance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Full netherite armor grants fire resistance diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index cd5d9b5e6853cebb556c347ebdcb0ec912a61f87..6e6fbcaab227b83144640e3e1024a0382984fdae 100644 +index d37080e74a7ce5442e4290eecb6352019b30fdb3..5537e4d735ff635bb1f088e41c0c5822487d0a6c 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -365,6 +365,16 @@ public abstract class Player extends LivingEntity { +@@ -353,6 +353,16 @@ public abstract class Player extends LivingEntity { this.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 200, 0, false, false, true), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TURTLE_HELMET); // CraftBukkit } @@ -26,7 +26,7 @@ index cd5d9b5e6853cebb556c347ebdcb0ec912a61f87..6e6fbcaab227b83144640e3e1024a038 protected ItemCooldowns createItemCooldowns() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c877d28640ad083ef4d117b7c2deecbed3bcc12a..0232f39eabedefbe0054a7e96d85fa7033da74f0 100644 +index d7bb242d3be5cadfd848c105419d269391504537..9b19c4c3cbeeb635a854668158acdc7b0d7c8627 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -297,6 +297,19 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0124-Fix-rotating-UP-DOWN-CW-and-CCW.patch b/patches/server/0118-Fix-rotating-UP-DOWN-CW-and-CCW.patch similarity index 83% rename from patches/todo/server/0124-Fix-rotating-UP-DOWN-CW-and-CCW.patch rename to patches/server/0118-Fix-rotating-UP-DOWN-CW-and-CCW.patch index beec55d28..514296a73 100644 --- a/patches/todo/server/0124-Fix-rotating-UP-DOWN-CW-and-CCW.patch +++ b/patches/server/0118-Fix-rotating-UP-DOWN-CW-and-CCW.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix rotating UP/DOWN CW and CCW diff --git a/src/main/java/net/minecraft/core/Direction.java b/src/main/java/net/minecraft/core/Direction.java -index 82bce6109d59cba30178a446f0ff129da6f3692f..eaa620ad86abfb151b43f697973cbc731e2e5e92 100644 +index d0a8092bf57a29ab7c00ec0ddf52a9fdb2a33267..defe5951938ce3a7b7f83017d4af36bb49ff5be0 100644 --- a/src/main/java/net/minecraft/core/Direction.java +++ b/src/main/java/net/minecraft/core/Direction.java -@@ -248,6 +248,12 @@ public enum Direction implements StringRepresentable { +@@ -238,6 +238,12 @@ public enum Direction implements StringRepresentable { case EAST: var10000 = SOUTH; break; @@ -21,7 +21,7 @@ index 82bce6109d59cba30178a446f0ff129da6f3692f..eaa620ad86abfb151b43f697973cbc73 default: throw new IllegalStateException("Unable to get Y-rotated facing of " + this); } -@@ -360,6 +366,12 @@ public enum Direction implements StringRepresentable { +@@ -350,6 +356,12 @@ public enum Direction implements StringRepresentable { case EAST: var10000 = NORTH; break; diff --git a/patches/todo/server/0125-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0119-Add-mobGriefing-bypass-to-everything-affected.patch similarity index 66% rename from patches/todo/server/0125-Add-mobGriefing-bypass-to-everything-affected.patch rename to patches/server/0119-Add-mobGriefing-bypass-to-everything-affected.patch index cbadac5c2..f73c4702f 100644 --- a/patches/todo/server/0125-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/patches/server/0119-Add-mobGriefing-bypass-to-everything-affected.patch @@ -5,59 +5,59 @@ 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 f7e95a73f60d06a102f79677bb0e31bf9532894d..f8957ef4d25c66002eb2dc992334a6db617ea5e0 100644 +index f8ed307bcc19eb5e0f3b9709fda623b1b2af9ae9..77a808d1f2737bd705807a97f84d1c3b77338346 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1723,7 +1723,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1766,7 +1766,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 (this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (this.level().purpurConfig.witherBypassMobGriefing || this.level().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 9dae07b1f1e18cbc86d64e5f793a5eb1685c2f7b..34eb04112fa47cbcd233f8a959036d988d73f1b4 100644 +index 311927443aaca5f3acd5936d333abc72719448d1..475ac814ccd4dc988a10511a4419336ecf34421e 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -700,7 +700,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -701,7 +701,7 @@ public abstract class Mob extends LivingEntity implements Targeting { 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))) { + 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())); + 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 ed67d2adf06f7ae9c451648e30945ad289ceae38..2dca8e45b9b1f5451db2734cba4c2b03c9dd303b 100644 +index 5bb3db5e1f47ef56ef40c84f06a1c5ae59f84c89..841954670c5a9b400552774669e57b68b156c300 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -@@ -41,7 +41,7 @@ public class HarvestFarmland extends Behavior { +@@ -45,7 +45,7 @@ public class HarvestFarmland extends Behavior { } protected boolean checkExtraStartConditions(ServerLevel world, Villager entity) { - if (!world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { + if (!world.purpurConfig.villagerBypassMobGriefing && !world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur return false; - } else if (entity.getVillagerData().getProfession() != VillagerProfession.FARMER && !(world.purpurConfig.villagerClericsFarmWarts && entity.getVillagerData().getProfession() == VillagerProfession.CLERIC)) { // Purpur + } else if (entity.getVillagerData().getProfession() != VillagerProfession.FARMER) { 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 529435cf648d61f80a37f041cee3c6fc0b74ceb6..6c7195c93b5968845da35450e80022c70839487d 100644 +index 4253b3b1263a7ae5a2f5f3a34674dfea615a81ea..a987c94fd321f51241c405659d6a0b2327a612ae 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 { @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 : (!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 } @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 80aa539f7c6a6ee44338de084cdcdf5fb4ef996a..3a633f369af8005de3c06cfa715a42e3b248b2f0 100644 +index abf796c3369da6b73c8587dfc05f56d0b8933fde..95dc62687d10e5c6f54baadda4a725094c52c07f 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 @@ -69,7 +69,7 @@ public class EatBlockGoal extends Goal { @@ -79,97 +79,97 @@ index 80aa539f7c6a6ee44338de084cdcdf5fb4ef996a..3a633f369af8005de3c06cfa715a42e3 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 d3e91faee8805e88d850740fb5de9e5c8288c48b..fe526ebf395ff9813b94284fc3f0142323d6a303 100644 +index 0035461aff86fa3f44c860e7d77589b974446048..8c08457b5a9ade9b602851c9a12b015e1b4b5a36 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 { @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 (!this.removerMob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (!this.removerMob.level().purpurConfig.zombieBypassMobGriefing && !this.removerMob.level().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 920b70b5c534ee83f5acb26890f3cfdf220fd887..6642f93ae5a8843a8e560594008c8643ef693878 100644 +index a80d18398db003ddeaa28aa00e13a0869191695f..5974577a408c13d05f326c7bfc704441644e7c8b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Fox.java +++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java -@@ -1377,7 +1377,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -1337,7 +1337,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 - BlockState iblockdata = Fox.this.level.getBlockState(this.blockPos); +- if (Fox.this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (Fox.this.level().purpurConfig.foxBypassMobGriefing || 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 aca51a77f02670809a6da5e7c384d9bbfcee2506..8aa108cdcbe3772e7dd140e0e9af77a1db163739 100644 +index c2106749af90e0fa0603ef90be919ef11da32758..919c27b38085d545617cc685fef9c8a29926b018 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -630,7 +630,7 @@ public class Rabbit extends Animal implements VariantHolder { +@@ -575,7 +575,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 (!this.rabbit.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (!this.rabbit.level().purpurConfig.rabbitBypassMobGriefing && !this.rabbit.level().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 30abf3ee1b9d3aef9291076a1f0bf865c54beadd..806abdd159ff5c696f16d799902f02bcc3cd252f 100644 +index ca557bf95c8238c6b671900affc1965b3f3af837..6b8169ac1fbe3920083ffd8cb5e15b9d8e67f436 100644 --- a/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/SnowGolem.java -@@ -127,7 +127,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -108,7 +108,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM this.hurt(this.damageSources().melting, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING } -- if (!this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!this.level.purpurConfig.snowGolemBypassMobGriefing && !this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur +- if (!this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (!this.level().purpurConfig.snowGolemBypassMobGriefing && !this.level().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 178c01444b7894833265c21a50ff6805d1aa356a..a07d1b6a45ef14cc4f121efe11869fc2da44a969 100644 +index b3b3572a6e3a1334b193f8e1462387e0b7526828..c819d041bf2e4909e97d6e856474786a96085a25 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 -@@ -579,7 +579,7 @@ public class EnderDragon extends Mob implements Enemy { - BlockState iblockdata = this.level.getBlockState(blockposition); +@@ -537,7 +537,7 @@ public class EnderDragon extends Mob implements Enemy { + BlockState iblockdata = this.level().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 (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 // CraftBukkit start - Add blocks to list rather than destroying them - // flag1 = this.level.removeBlock(blockposition, false) || flag1; + // flag1 = this.level().removeBlock(blockposition, false) || flag1; flag1 = true; diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index b22d0af2267581467af9a4d0e8104146b3da9b71..334ffb3553e1b87b538ac42155942049587639a0 100644 +index 462f4bdc4ca57aa46564df9372c5bc7fd673030f..dda3152aa6d4e8265fcb3fd450ecf39ec0f1a9ac 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 -@@ -496,7 +496,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -366,7 +366,7 @@ public class WitherBoss extends Monster implements PowerableMob, 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 && this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { ++ if (this.destroyBlocksTick == 0 && (this.level().purpurConfig.witherBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // Purpur i = Mth.floor(this.getY()); j = Mth.floor(this.getX()); int i1 = Mth.floor(this.getZ()); 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 757aa2e3fa1c4608f07adbff0f718ad8f04be475..643a3b83b7b7e173372e8ffa1607ea8bbf67f50f 100644 +index c3c32a99d53eea7f61b70d7ed8ddc8a2112dd9f7..444993e357e7a3e4aba0b0a73760fe478f6461ff 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -538,7 +538,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -512,7 +512,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); + 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); + // Purpur start + if (this.enderman.getCarriedBlock() == null) { + return false; + } -+ if (!this.enderman.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !this.enderman.level.purpurConfig.endermanBypassMobGriefing) { ++ if (!this.enderman.level().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 757aa2e3fa1c4608f07adbff0f718ad8f04be475..643a3b83b7b7e173372e8ffa1607ea8b } @Override -@@ -586,7 +594,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -560,7 +568,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); + 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); + // Purpur start + if (this.enderman.getCarriedBlock() != null) { + return false; + } -+ if (!this.enderman.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !this.enderman.level.purpurConfig.endermanBypassMobGriefing) { ++ if (!this.enderman.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !this.enderman.level().purpurConfig.endermanBypassMobGriefing) { + return false; + } + return this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0; @@ -195,36 +195,36 @@ index 757aa2e3fa1c4608f07adbff0f718ad8f04be475..643a3b83b7b7e173372e8ffa1607ea8b @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 bbcbccaeb479cc61adab96da2670ca31a1fda740..b05bf61183379e1d6aadee4de0796eb43175c47c 100644 +index a2dc53d9ce6c3bc2278fa389a98f1506bbcccefa..eaf84c30701dbe8562e0d498f088f0461c53c442 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Evoker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Evoker.java -@@ -341,7 +341,7 @@ public class Evoker extends SpellcasterIllager { +@@ -322,7 +322,7 @@ public class Evoker extends SpellcasterIllager { return false; } else if (Evoker.this.tickCount < this.nextAttackTickCount) { return false; -- } 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 +- } 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; } else { - List list = Evoker.this.level.getNearbyEntities(Sheep.class, this.wololoTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0D, 4.0D, 16.0D)); + List list = Evoker.this.level().getNearbyEntities(Sheep.class, this.wololoTargeting, Evoker.this, Evoker.this.getBoundingBox().inflate(16.0D, 4.0D, 16.0D)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 2d592307f42ede8a490c072da9ec796b2e356f0a..9c8ebbec20438401265d8049b33132f490e3c1ea 100644 +index 45ac92467b5cdadcc692c8867a52277e1754a934..26ca7b3ac44f24c324f0f97e0e2bb5ed62f3aa73 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -190,7 +190,7 @@ public class Ravager extends Raider { +@@ -165,7 +165,7 @@ public class Ravager extends Raider { this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1D, d1, d0)); } -- 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 +- 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(); 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 77204ec0e18807dd46cadb515b07a919b1bee16b..a676bb029fc4575028ce6833e608e3169d2fc358 100644 +index 49a025b0ffb823bd92319bf3194a13f71ec03c32..2b51cd9052271575c0f7ecabe69a1cc88f7ce800 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -@@ -208,7 +208,7 @@ public class Silverfish extends Monster { +@@ -189,7 +189,7 @@ public class Silverfish extends Monster { continue; } // CraftBukkit end @@ -233,61 +233,61 @@ index 77204ec0e18807dd46cadb515b07a919b1bee16b..a676bb029fc4575028ce6833e608e316 world.destroyBlock(blockposition1, true, this.silverfish); } else { world.setBlock(blockposition1, ((InfestedBlock) block).hostStateByInfested(world.getBlockState(blockposition1)), 3); -@@ -246,7 +246,7 @@ public class Silverfish extends Monster { +@@ -227,7 +227,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 (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 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); + 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 c36b17a7f209ce5f2b366077a192c16fc389cbf7..5b93bd222895c493dbdbcfa134c91b5e4b315c47 100644 +index 7e1a46eba403e238c266680e9f1fae435a246e1c..20339cb8a1fa4ca0716c7362276fc0cb9add6dee 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 -@@ -432,7 +432,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -410,7 +410,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); +- 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); } 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 4daa368881e4fa59a9365d7b3810ae7dc1455fa3..a4041580061b2acd150836a1437df66ebb4a62cb 100644 +index 251e6bc87eb02ec4372062ef22b21249ac5164ff..6b60597a0e837054b0d1891c1e6e5e7cd3af9539 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java @@ -16,20 +16,20 @@ public class LargeFireball extends Fireball { public LargeFireball(EntityType type, Level world) { super(type, world); -- isIncendiary = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit -+ isIncendiary = this.level.purpurConfig.fireballsBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit // Purpur +- isIncendiary = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit ++ isIncendiary = this.level().purpurConfig.fireballsBypassMobGriefing || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit // Purpur } public LargeFireball(Level world, LivingEntity owner, double velocityX, double velocityY, double velocityZ, int explosionPower) { super(EntityType.FIREBALL, owner, velocityX, velocityY, velocityZ, world); this.explosionPower = explosionPower; -- isIncendiary = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit -+ isIncendiary = this.level.purpurConfig.fireballsBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit // Purpur +- isIncendiary = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit ++ isIncendiary = this.level().purpurConfig.fireballsBypassMobGriefing || this.level().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 + 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 // 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 85260fd93ca8d5ffd0ba7a98f1d47093d58f0f87..505a60605ff2282f2c460c81464d60a433f41eda 100644 +index 1b7cf6d06bdf36f146656727511a461f2520762e..ddc84a02fa0dd7201925aa329b8101c6468b7dc6 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -318,6 +318,6 @@ public abstract class Projectile extends Entity implements TraceableEntity { +@@ -289,6 +289,6 @@ public abstract class Projectile extends Entity implements TraceableEntity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner(); @@ -296,33 +296,33 @@ index 85260fd93ca8d5ffd0ba7a98f1d47093d58f0f87..505a60605ff2282f2c460c81464d60a4 } } 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 b9e4955fecabbad8d6762f3d933ea1402e932d9b..895c501f8579799139239701703078ef060cd481 100644 +index 04c2ea1ff44af72ae48e2d6b7b912b1c14285038..7839d856b3f924f0c87b298d9a1e3b15ab0693d6 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java @@ -24,7 +24,7 @@ public class SmallFireball extends Fireball { super(EntityType.SMALL_FIREBALL, owner, velocityX, velocityY, velocityZ, world); // CraftBukkit start if (this.getOwner() != null && this.getOwner() instanceof Mob) { -- isIncendiary = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -+ isIncendiary = this.level.purpurConfig.fireballsBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur +- isIncendiary = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); ++ isIncendiary = this.level().purpurConfig.fireballsBypassMobGriefing || this.level().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 99e9d46d42ddd0b451c6aeb847f1b295ebe5c697..f7b03dc1d5316aeb760a52d6f6c50e8aae5f978e 100644 +index 57fdcdaf54fd1c92a6e51a3a81789029096e5abe..822dd4265ce02252afadbc652064450b7dfd7e0d 100644 --- a/src/main/java/net/minecraft/world/entity/raid/Raider.java +++ b/src/main/java/net/minecraft/world/entity/raid/Raider.java @@ -319,7 +319,7 @@ public abstract class Raider extends PatrollingMonster { @Override public boolean canUse() { -- if (!this.mob.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items -+ if ((!this.mob.level.purpurConfig.pillagerBypassMobGriefing && !this.mob.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items // Purpur +- if (!this.mob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items ++ if ((!this.mob.level().purpurConfig.pillagerBypassMobGriefing && !this.mob.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items // Purpur Raid raid = this.mob.getCurrentRaid(); if (this.mob.hasActiveRaid() && !this.mob.getCurrentRaid().isOver() && this.mob.canBeLeader() && !ItemStack.matches(this.mob.getItemBySlot(EquipmentSlot.HEAD), Raid.getLeaderBannerInstance())) { 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 a140fed067e7e6c1c42e111f47d3678863ef95ce..d78cb69c6b3fdc0883613c5cc53a38a7d31c0b76 100644 +index c463adf131c4ca6e38f18d4efd94f4629bcfafe9..cf7007cabe4ba7505f2728e79e4c56e2d1bc878b 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java @@ -168,7 +168,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { @@ -335,10 +335,10 @@ index a140fed067e7e6c1c42e111f47d3678863ef95ce..d78cb69c6b3fdc0883613c5cc53a38a7 } 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 8725ca6eec1becc401951a746a90f678e5edf7ac..f66a556e93469204e19baa5bf2decbf974701a5d 100644 +index d4e3a32a0f9b49bff64cb43d77727ce3cae95f09..090d232af0183c9c9ffeb4e75125514d827648f2 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -@@ -100,7 +100,7 @@ public class FarmBlock extends Block { +@@ -101,7 +101,7 @@ public class FarmBlock extends Block { @Override 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. @@ -374,7 +374,7 @@ index 1942649e868fc985a488034c411a6721595ecc67..7495e0e8beedad59fff24ebf189b58b3 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0232f39eabedefbe0054a7e96d85fa7033da74f0..a30ad2eb176b748f77dc396043b397f462027943 100644 +index 9b19c4c3cbeeb635a854668158acdc7b0d7c8627..5c37a4221391f461d1d4b6bd8bed3a71d478c666 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -117,8 +117,11 @@ public class PurpurWorldConfig { @@ -425,7 +425,7 @@ index 0232f39eabedefbe0054a7e96d85fa7033da74f0..a30ad2eb176b748f77dc396043b397f4 public boolean respawnAnchorExplode = true; public double respawnAnchorExplosionPower = 5.0D; public boolean respawnAnchorExplosionFire = true; -@@ -511,10 +524,12 @@ public class PurpurWorldConfig { +@@ -506,10 +519,12 @@ public class PurpurWorldConfig { public boolean turtleEggsBreakFromExpOrbs = true; public boolean turtleEggsBreakFromItems = true; public boolean turtleEggsBreakFromMinecarts = true; @@ -437,243 +437,236 @@ index 0232f39eabedefbe0054a7e96d85fa7033da74f0..a30ad2eb176b748f77dc396043b397f4 + turtleEggsBypassMobGriefing = getBoolean("blocks.turtle_egg.bypass-mob-griefing", turtleEggsBypassMobGriefing); } - public int waterInfiniteRequiredSources = 2; -@@ -739,6 +754,7 @@ public class PurpurWorldConfig { + public double axolotlMaxHealth = 14.0D; +@@ -657,6 +672,7 @@ public class PurpurWorldConfig { public double creeperMaxHealth = 20.0D; public double creeperChargedChance = 0.0D; public boolean creeperAllowGriefing = true; + public boolean creeperBypassMobGriefing = false; private void creeperSettings() { - creeperRidable = getBoolean("mobs.creeper.ridable", creeperRidable); - creeperRidableInWater = getBoolean("mobs.creeper.ridable-in-water", creeperRidableInWater); -@@ -751,6 +767,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.creeper.attributes.max-health", creeperMaxHealth); +@@ -666,6 +682,7 @@ public class PurpurWorldConfig { creeperMaxHealth = getDouble("mobs.creeper.attributes.max_health", creeperMaxHealth); creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance); creeperAllowGriefing = getBoolean("mobs.creeper.allow-griefing", creeperAllowGriefing); + creeperBypassMobGriefing = getBoolean("mobs.creeper.bypass-mob-griefing", creeperBypassMobGriefing); } - public boolean dolphinRidable = false; -@@ -845,6 +862,7 @@ public class PurpurWorldConfig { - public double enderDragonMaxY = 320D; + public double dolphinMaxHealth = 10.0D; +@@ -734,6 +751,7 @@ public class PurpurWorldConfig { + public double enderDragonMaxHealth = 200.0D; public boolean enderDragonAlwaysDropsFullExp = false; + public boolean enderDragonBypassMobGriefing = false; private void enderDragonSettings() { - enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable); - enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater); -@@ -861,6 +879,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 8) { + double oldValue = getDouble("mobs.ender_dragon.max-health", enderDragonMaxHealth); +@@ -746,11 +764,13 @@ 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); } - public boolean endermanRidable = false; -@@ -869,6 +888,7 @@ public class PurpurWorldConfig { public double endermanMaxHealth = 40.0D; public boolean endermanAllowGriefing = true; public boolean endermanDespawnEvenWithBlock = false; + public boolean endermanBypassMobGriefing = false; private void endermanSettings() { - endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable); - endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater); -@@ -881,6 +901,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth); +@@ -760,6 +780,7 @@ public class PurpurWorldConfig { endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth); endermanAllowGriefing = getBoolean("mobs.enderman.allow-griefing", endermanAllowGriefing); endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock); + endermanBypassMobGriefing = getBoolean("mobs.enderman.bypass-mob-griefing", endermanBypassMobGriefing); } - public boolean endermiteRidable = false; -@@ -903,6 +924,7 @@ public class PurpurWorldConfig { - public boolean evokerRidableInWater = true; - public boolean evokerControllable = true; + public double endermiteMaxHealth = 8.0D; +@@ -773,6 +794,7 @@ public class PurpurWorldConfig { + } + public double evokerMaxHealth = 24.0D; + public boolean evokerBypassMobGriefing = false; private void evokerSettings() { - evokerRidable = getBoolean("mobs.evoker.ridable", evokerRidable); - evokerRidableInWater = getBoolean("mobs.evoker.ridable-in-water", evokerRidableInWater); -@@ -913,6 +935,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.evoker.attributes.max-health", evokerMaxHealth); +@@ -780,11 +802,13 @@ public class PurpurWorldConfig { set("mobs.evoker.attributes.max_health", oldValue); } evokerMaxHealth = getDouble("mobs.evoker.attributes.max_health", evokerMaxHealth); + evokerBypassMobGriefing = getBoolean("mobs.evoker.bypass-mob-griefing", evokerBypassMobGriefing); } - public boolean foxRidable = false; -@@ -921,6 +944,7 @@ public class PurpurWorldConfig { public double foxMaxHealth = 10.0D; public boolean foxTypeChangesWithTulips = false; public int foxBreedingTicks = 6000; + public boolean foxBypassMobGriefing = false; private void foxSettings() { - foxRidable = getBoolean("mobs.fox.ridable", foxRidable); - foxRidableInWater = getBoolean("mobs.fox.ridable-in-water", foxRidableInWater); -@@ -933,6 +957,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.fox.attributes.max-health", foxMaxHealth); +@@ -794,6 +818,7 @@ public class PurpurWorldConfig { foxMaxHealth = getDouble("mobs.fox.attributes.max_health", foxMaxHealth); foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips); foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks); + foxBypassMobGriefing = getBoolean("mobs.fox.bypass-mob-griefing", foxBypassMobGriefing); } - public boolean frogRidable = false; -@@ -1380,6 +1405,7 @@ public class PurpurWorldConfig { - public boolean piglinRidableInWater = true; - public boolean piglinControllable = true; + public int frogBreedingTicks = 6000; +@@ -1114,6 +1139,7 @@ public class PurpurWorldConfig { + } + public double piglinMaxHealth = 16.0D; + public boolean piglinBypassMobGriefing = false; private void piglinSettings() { - piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable); - piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater); -@@ -1390,6 +1416,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.piglin.attributes.max-health", piglinMaxHealth); +@@ -1121,6 +1147,7 @@ public class PurpurWorldConfig { set("mobs.piglin.attributes.max_health", oldValue); } piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth); + piglinBypassMobGriefing = getBoolean("mobs.piglin.bypass-mob-griefing", piglinBypassMobGriefing); } - public boolean piglinBruteRidable = false; -@@ -1412,6 +1439,7 @@ public class PurpurWorldConfig { - public boolean pillagerRidableInWater = true; - public boolean pillagerControllable = true; + public double piglinBruteMaxHealth = 50.0D; +@@ -1134,6 +1161,7 @@ public class PurpurWorldConfig { + } + public double pillagerMaxHealth = 24.0D; + public boolean pillagerBypassMobGriefing = false; private void pillagerSettings() { - pillagerRidable = getBoolean("mobs.pillager.ridable", pillagerRidable); - pillagerRidableInWater = getBoolean("mobs.pillager.ridable-in-water", pillagerRidableInWater); -@@ -1422,6 +1450,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.pillager.attributes.max-health", pillagerMaxHealth); +@@ -1141,6 +1169,7 @@ public class PurpurWorldConfig { set("mobs.pillager.attributes.max_health", oldValue); } pillagerMaxHealth = getDouble("mobs.pillager.attributes.max_health", pillagerMaxHealth); + pillagerBypassMobGriefing = getBoolean("mobs.pillager.bypass-mob-griefing", pillagerBypassMobGriefing); } - public boolean polarBearRidable = false; -@@ -1468,6 +1497,7 @@ public class PurpurWorldConfig { + public double polarBearMaxHealth = 30.0D; +@@ -1174,6 +1203,7 @@ public class PurpurWorldConfig { public double rabbitNaturalToast = 0.0D; public double rabbitNaturalKiller = 0.0D; public int rabbitBreedingTicks = 6000; + public boolean rabbitBypassMobGriefing = false; private void rabbitSettings() { - rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable); - rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater); -@@ -1481,12 +1511,14 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.rabbit.attributes.max-health", rabbitMaxHealth); +@@ -1184,9 +1214,11 @@ 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); + rabbitBypassMobGriefing = getBoolean("mobs.rabbit.bypass-mob-griefing", rabbitBypassMobGriefing); } - public boolean ravagerRidable = false; - public boolean ravagerRidableInWater = false; - public boolean ravagerControllable = true; public double ravagerMaxHealth = 100.0D; + public boolean ravagerBypassMobGriefing = false; private void ravagerSettings() { - ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); - ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); -@@ -1497,6 +1529,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.ravager.attributes.max-health", ravagerMaxHealth); +@@ -1194,6 +1226,7 @@ public class PurpurWorldConfig { set("mobs.ravager.attributes.max_health", oldValue); } ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth); + ravagerBypassMobGriefing = getBoolean("mobs.ravager.bypass-mob-griefing", ravagerBypassMobGriefing); } - public boolean salmonRidable = false; -@@ -1518,6 +1551,7 @@ public class PurpurWorldConfig { - public boolean sheepControllable = true; + public double salmonMaxHealth = 3.0D; +@@ -1208,6 +1241,7 @@ public class PurpurWorldConfig { + public double sheepMaxHealth = 8.0D; public int sheepBreedingTicks = 6000; + public boolean sheepBypassMobGriefing = false; private void sheepSettings() { - sheepRidable = getBoolean("mobs.sheep.ridable", sheepRidable); - sheepRidableInWater = getBoolean("mobs.sheep.ridable-in-water", sheepRidableInWater); -@@ -1529,6 +1563,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth); +@@ -1216,6 +1250,7 @@ public class PurpurWorldConfig { } sheepMaxHealth = getDouble("mobs.sheep.attributes.max_health", sheepMaxHealth); sheepBreedingTicks = getInt("mobs.sheep.breeding-delay-ticks", sheepBreedingTicks); + sheepBypassMobGriefing = getBoolean("mobs.sheep.bypass-mob-griefing", sheepBypassMobGriefing); } - public boolean shulkerRidable = false; -@@ -1551,6 +1586,7 @@ public class PurpurWorldConfig { - public boolean silverfishRidableInWater = true; - public boolean silverfishControllable = true; + public double shulkerMaxHealth = 30.0D; +@@ -1229,6 +1264,7 @@ public class PurpurWorldConfig { + } + public double silverfishMaxHealth = 8.0D; + public boolean silverfishBypassMobGriefing = false; private void silverfishSettings() { - silverfishRidable = getBoolean("mobs.silverfish.ridable", silverfishRidable); - silverfishRidableInWater = getBoolean("mobs.silverfish.ridable-in-water", silverfishRidableInWater); -@@ -1561,6 +1597,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.silverfish.attributes.max-health", silverfishMaxHealth); +@@ -1236,6 +1272,7 @@ public class PurpurWorldConfig { set("mobs.silverfish.attributes.max_health", oldValue); } silverfishMaxHealth = getDouble("mobs.silverfish.attributes.max_health", silverfishMaxHealth); + silverfishBypassMobGriefing = getBoolean("mobs.silverfish.bypass-mob-griefing", silverfishBypassMobGriefing); } - public boolean skeletonRidable = false; -@@ -1637,6 +1674,7 @@ public class PurpurWorldConfig { + public double skeletonMaxHealth = 20.0D; +@@ -1293,6 +1330,7 @@ public class PurpurWorldConfig { public int snowGolemSnowBallMax = 20; public float snowGolemSnowBallModifier = 10.0F; public double snowGolemAttackDistance = 1.25D; + public boolean snowGolemBypassMobGriefing = false; private void snowGolemSettings() { - snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable); - snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater); -@@ -1654,6 +1692,7 @@ public class PurpurWorldConfig { + snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden); + if (PurpurConfig.version < 10) { +@@ -1307,6 +1345,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); + snowGolemBypassMobGriefing = getBoolean("mobs.snow_golem.bypass-mob-griefing", snowGolemBypassMobGriefing); } - public boolean snifferRidable = false; -@@ -1840,6 +1879,7 @@ public class PurpurWorldConfig { + public double snifferMaxHealth = 14.0D; +@@ -1429,6 +1468,7 @@ public class PurpurWorldConfig { + public boolean villagerCanBeLeashed = false; + public boolean villagerCanBreed = true; public int villagerBreedingTicks = 6000; - public boolean villagerClericsFarmWarts = false; - public boolean villagerClericFarmersThrowWarts = true; + public boolean villagerBypassMobGriefing = false; private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -1856,6 +1896,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.villager.attributes.max-health", villagerMaxHealth); +@@ -1440,6 +1480,7 @@ 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); - 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); } - public boolean vindicatorRidable = false; -@@ -1928,6 +1969,7 @@ public class PurpurWorldConfig { + public double vindicatorMaxHealth = 24.0D; +@@ -1481,6 +1522,7 @@ public class PurpurWorldConfig { public double witherMaxHealth = 300.0D; public float witherHealthRegenAmount = 1.0f; public int witherHealthRegenDelay = 20; + public boolean witherBypassMobGriefing = false; private void witherSettings() { - witherRidable = getBoolean("mobs.wither.ridable", witherRidable); - witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater); -@@ -1945,6 +1987,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 8) { + double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth); +@@ -1494,6 +1536,7 @@ public class PurpurWorldConfig { witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth); witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount); witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay); + witherBypassMobGriefing = getBoolean("mobs.wither.bypass-mob-griefing", witherBypassMobGriefing); } - public boolean witherSkeletonRidable = false; -@@ -2016,6 +2059,7 @@ public class PurpurWorldConfig { + public double witherSkeletonMaxHealth = 20.0D; +@@ -1544,6 +1587,7 @@ public class PurpurWorldConfig { public double zombieJockeyChance = 0.05D; public boolean zombieJockeyTryExistingChickens = true; public boolean zombieAggressiveTowardsVillagerWhenLagging = true; + public boolean zombieBypassMobGriefing = false; private void zombieSettings() { - zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); - zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -2031,6 +2075,7 @@ public class PurpurWorldConfig { + if (PurpurConfig.version < 10) { + double oldValue = getDouble("mobs.zombie.attributes.max-health", zombieMaxHealth); +@@ -1556,6 +1600,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); + zombieBypassMobGriefing = getBoolean("mobs.zombie.bypass-mob-griefing", zombieBypassMobGriefing); } - public boolean zombieHorseRidableInWater = false; + public double zombieHorseMaxHealthMin = 15.0D; diff --git a/patches/todo/server/0126-Config-to-allow-Note-Block-sounds-when-blocked.patch b/patches/server/0120-Config-to-allow-Note-Block-sounds-when-blocked.patch similarity index 82% rename from patches/todo/server/0126-Config-to-allow-Note-Block-sounds-when-blocked.patch rename to patches/server/0120-Config-to-allow-Note-Block-sounds-when-blocked.patch index 3fdfa15ce..9a77da807 100644 --- a/patches/todo/server/0126-Config-to-allow-Note-Block-sounds-when-blocked.patch +++ b/patches/server/0120-Config-to-allow-Note-Block-sounds-when-blocked.patch @@ -9,20 +9,20 @@ 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 42e8e2d9d673947ecbfb55e0f31fc22afe3223b6..0b5ce2db558e721807944d9d0f672a77ce2a7fe0 100644 +index 6bc29eeb5771a3dc9aa23c7d184c895717797b36..244857755f269eedd57d1c8d4657b4b4b75de2e5 100644 --- a/src/main/java/net/minecraft/world/level/block/NoteBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NoteBlock.java -@@ -91,7 +91,7 @@ public class NoteBlock extends Block { +@@ -87,7 +87,7 @@ public class NoteBlock extends Block { } private void playNote(@Nullable Entity entity, BlockState state, Level world, BlockPos pos) { -- if (!((NoteBlockInstrument) state.getValue(NoteBlock.INSTRUMENT)).requiresAirAbove() || world.getBlockState(pos.above()).isAir()) { -+ if (world.purpurConfig.noteBlockIgnoreAbove || !((NoteBlockInstrument) state.getValue(NoteBlock.INSTRUMENT)).requiresAirAbove() || world.getBlockState(pos.above()).isAir()) { // Purpur +- if (((NoteBlockInstrument) state.getValue(NoteBlock.INSTRUMENT)).worksAboveNoteBlock() || world.getBlockState(pos.above()).isAir()) { ++ if (world.purpurConfig.noteBlockIgnoreAbove || ((NoteBlockInstrument) state.getValue(NoteBlock.INSTRUMENT)).worksAboveNoteBlock() || world.getBlockState(pos.above()).isAir()) { // Purpur // CraftBukkit start // 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 a30ad2eb176b748f77dc396043b397f462027943..a5eb4756b750196847899b52cd390e8d1cbcbeeb 100644 +index 5c37a4221391f461d1d4b6bd8bed3a71d478c666..f8ff580c6cfccae2472a705d9a5f477cfe53e98f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -120,6 +120,7 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0127-Add-EntityTeleportHinderedEvent.patch b/patches/server/0121-Add-EntityTeleportHinderedEvent.patch similarity index 95% rename from patches/todo/server/0127-Add-EntityTeleportHinderedEvent.patch rename to patches/server/0121-Add-EntityTeleportHinderedEvent.patch index 9f344cbc8..192bdb058 100644 --- a/patches/todo/server/0127-Add-EntityTeleportHinderedEvent.patch +++ b/patches/server/0121-Add-EntityTeleportHinderedEvent.patch @@ -55,7 +55,7 @@ index a6ab0d0defc05e56a91084c49897059670a1324b..2c085c4a154cb0f8a1d38453f43474a7 EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ())); world.getCraftServer().getPluginManager().callEvent(event); diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java -index e9466871a329c47204b251263e3922b8f1f9c176..a4cd9869988f414ce1bf14d38442f78207e3f048 100644 +index 678c4527ddc7032a07e7d74cc160ddcb8810abbf..c370461d434005dc5394053713e039d9f6395bb0 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java @@ -179,6 +179,14 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { @@ -74,7 +74,7 @@ index e9466871a329c47204b251263e3922b8f1f9c176..a4cd9869988f414ce1bf14d38442f782 blockEntity.teleportCooldown = 100; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index a4644b1d9abb7ffeda89801e4562a078ffe43288..ef683027bc840999d70420b2d6c751ca07c168e9 100644 +index ea056babe2f8123f20dc608d8a636da1de634b8c..285d58cfa0ea899e2a7583d1ca308872e68f18c9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -586,6 +586,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -89,10 +89,10 @@ index a4644b1d9abb7ffeda89801e4562a078ffe43288..ef683027bc840999d70420b2d6c751ca } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index e323c7238e481e9e64748792f734a40dcab9e6f6..a87fc2fa8399a4f117ef966f482c693747d6b08b 100644 +index cf82afb7949a0031c1b656149e583c4075362211..d65147f864dc75475cbb893fdcc9b391538b7c3c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1363,6 +1363,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1336,6 +1336,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } if (entity.isVehicle() && !ignorePassengers) { // Paper - Teleport API @@ -104,7 +104,7 @@ index e323c7238e481e9e64748792f734a40dcab9e6f6..a87fc2fa8399a4f117ef966f482c6937 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a5eb4756b750196847899b52cd390e8d1cbcbeeb..8ef0190cbfc88cd74ea43cd5669b4dd1350a5df4 100644 +index f8ff580c6cfccae2472a705d9a5f477cfe53e98f..d43c3ed34d8d7a79f0260e9a83c0435365d65285 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 { diff --git a/patches/todo/server/0128-Farmland-trampling-changes.patch b/patches/server/0122-Farmland-trampling-changes.patch similarity index 93% rename from patches/todo/server/0128-Farmland-trampling-changes.patch rename to patches/server/0122-Farmland-trampling-changes.patch index 59316ab8b..65ca6f0b1 100644 --- a/patches/todo/server/0128-Farmland-trampling-changes.patch +++ b/patches/server/0122-Farmland-trampling-changes.patch @@ -12,10 +12,10 @@ 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 f66a556e93469204e19baa5bf2decbf974701a5d..eed062c9cf1103d7ac96695e3620d4276edcd2aa 100644 +index 090d232af0183c9c9ffeb4e75125514d827648f2..1064a13f37b991e60213b052e252a183b8340449 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -@@ -115,12 +115,20 @@ public class FarmBlock extends Block { +@@ -116,12 +116,20 @@ public class FarmBlock extends Block { } // Purpur start @@ -37,7 +37,7 @@ index f66a556e93469204e19baa5bf2decbf974701a5d..eed062c9cf1103d7ac96695e3620d427 if (CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.DIRT.defaultBlockState()).isCancelled()) { return; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8ef0190cbfc88cd74ea43cd5669b4dd1350a5df4..9336f5e5435e12f95c9e361a214a45584359ca56 100644 +index d43c3ed34d8d7a79f0260e9a83c0435365d65285..e4451d20bac90334ebe4b7ed4432c4f3208f1ba9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -463,10 +463,16 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0129-Movement-options-for-armor-stands.patch b/patches/server/0123-Movement-options-for-armor-stands.patch similarity index 91% rename from patches/todo/server/0129-Movement-options-for-armor-stands.patch rename to patches/server/0123-Movement-options-for-armor-stands.patch index 9e4044641..a8337217d 100644 --- a/patches/todo/server/0129-Movement-options-for-armor-stands.patch +++ b/patches/server/0123-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 d1d2c0ea830fc3e4b5ac1be59a70fd551ad8c9b3..c1112da2671095f0ebc69fcb28fff90cf1cd3025 100644 +index 091702e3946effa1177c1521f7c8c25f611e5c88..91962f4b2259d2ae6e1fcb149fc299f6e2875cf5 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1747,7 +1747,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1795,7 +1795,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return this.isInWater() || flag; } @@ -30,7 +30,7 @@ index d1d2c0ea830fc3e4b5ac1be59a70fd551ad8c9b3..c1112da2671095f0ebc69fcb28fff90c if (entity instanceof Boat) { 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 5b4523320de59167bd5864b2f17187590afb5ad6..88949e8ca7e4a5e74a8a365bb1aa6d466d3f8ddd 100644 +index 1406cdd79c7183522f1f5c0b0edc6166ff9d4ed9..cfe4c6f3316a9bcb3fb77bbb839525bed5527b17 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -99,10 +99,12 @@ public class ArmorStand extends LivingEntity { @@ -46,7 +46,7 @@ index 5b4523320de59167bd5864b2f17187590afb5ad6..88949e8ca7e4a5e74a8a365bb1aa6d46 this.handItems = NonNullList.withSize(2, ItemStack.EMPTY); this.armorItems = NonNullList.withSize(4, ItemStack.EMPTY); this.headPose = ArmorStand.DEFAULT_HEAD_POSE; -@@ -1007,4 +1009,18 @@ public class ArmorStand extends LivingEntity { +@@ -1006,4 +1008,18 @@ public class ArmorStand extends LivingEntity { } // Paper end // Paper end @@ -66,7 +66,7 @@ index 5b4523320de59167bd5864b2f17187590afb5ad6..88949e8ca7e4a5e74a8a365bb1aa6d46 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9336f5e5435e12f95c9e361a214a45584359ca56..24ce48b5aef4f1a59506f9a17af3a3333cb1ebbe 100644 +index e4451d20bac90334ebe4b7ed4432c4f3208f1ba9..06f3e9e32eec5cb7ea109b8bee3f99d2b7807f13 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -101,10 +101,16 @@ public class PurpurWorldConfig { diff --git a/patches/todo/server/0130-Fix-stuck-in-portals.patch b/patches/server/0124-Fix-stuck-in-portals.patch similarity index 84% rename from patches/todo/server/0130-Fix-stuck-in-portals.patch rename to patches/server/0124-Fix-stuck-in-portals.patch index 66c14693f..b5e444553 100644 --- a/patches/todo/server/0130-Fix-stuck-in-portals.patch +++ b/patches/server/0124-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 cbf30bd3fe91d2bc386af16a9322f50e12593c2b..cb12b41ec62e49c500491beaf3d7b49603ada88e 100644 +index 6ffa173574cd07e547c18ef89f0a733a526735eb..e81f439727dea8073044abec5f99fbe1220fb279 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -1230,6 +1230,7 @@ public class ServerPlayer extends Player { +@@ -1262,6 +1262,7 @@ public class ServerPlayer extends Player { playerlist.sendPlayerPermissionLevel(this); worldserver1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); + this.portalPos = io.papermc.paper.util.MCUtil.toBlockPosition(exit); // Purpur // CraftBukkit end - this.setLevel(worldserver); + this.setServerLevel(worldserver); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c1112da2671095f0ebc69fcb28fff90cf1cd3025..fa3258b69770d91aebbf181f5c19690e166f9df2 100644 +index 91962f4b2259d2ae6e1fcb149fc299f6e2875cf5..c6157d80118ad936d677651083dcde6724667434 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2939,12 +2939,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2981,12 +2981,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return Vec3.directionFromRotation(this.getRotationVector()); } @@ -30,14 +30,14 @@ index c1112da2671095f0ebc69fcb28fff90cf1cd3025..fa3258b69770d91aebbf181f5c19690e + if (!(level.purpurConfig.playerFixStuckPortal && this instanceof Player && !pos.equals(portalPos))) // Purpur this.setPortalCooldown(); } else if (level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer) { // Purpur - if (!this.level.isClientSide && !pos.equals(this.portalEntrancePos)) { + if (!this.level().isClientSide && !pos.equals(this.portalEntrancePos)) { this.portalEntrancePos = pos.immutable(); + portalPos = BlockPos.ZERO; // Purpur } this.isInsidePortal = true; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 24ce48b5aef4f1a59506f9a17af3a3333cb1ebbe..52049de384f22443f9ee106552cf8dc6c56e9a38 100644 +index 06f3e9e32eec5cb7ea109b8bee3f99d2b7807f13..f39c4a2acf8d6af849ce3c0ef319a58a203b08c1 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 {