diff --git a/.idea/runConfigurations/Run_Purpur_Paperclip_Jar.xml b/.idea/runConfigurations/Run_Purpur_Paperclip_Jar.xml
index 9e555a069..efed87f25 100644
--- a/.idea/runConfigurations/Run_Purpur_Paperclip_Jar.xml
+++ b/.idea/runConfigurations/Run_Purpur_Paperclip_Jar.xml
@@ -1,6 +1,6 @@
-
+
@@ -8,4 +8,4 @@
-
+
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 95018b8e9..42dda9d2a 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,8 +1,8 @@
group = org.purpurmc.purpur
-version = 1.21.9-pre4-R0.1-SNAPSHOT
+version = 1.21.9-rc1-R0.1-SNAPSHOT
-mcVersion = 1.21.9-pre4
-paperCommit = 037179fa883eccb48e6676d69dea8ba0cfbbbbbe
+mcVersion = 1.21.9-rc1
+paperCommit = 4055274204ce66ca66e8a551fef08b223ee3041d
org.gradle.configuration-cache = true
org.gradle.caching = true
diff --git a/purpur-api/build.gradle.kts.patch b/purpur-api/build.gradle.kts.patch
index 87f4211d4..d2df7c484 100644
--- a/purpur-api/build.gradle.kts.patch
+++ b/purpur-api/build.gradle.kts.patch
@@ -1,6 +1,6 @@
--- a/paper-api/build.gradle.kts
+++ b/paper-api/build.gradle.kts
-@@ -98,7 +_,7 @@
+@@ -90,7 +_,7 @@
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
@@ -9,7 +9,7 @@
idea {
module {
generatedSourceDirs.add(generatedDir.toFile())
-@@ -108,6 +_,18 @@
+@@ -100,6 +_,18 @@
main {
java {
srcDir(generatedDir)
@@ -28,7 +28,7 @@
}
}
}
-@@ -173,8 +_,9 @@
+@@ -165,8 +_,9 @@
val services = objects.newInstance()
tasks.withType().configureEach {
@@ -39,7 +39,7 @@
options.use()
options.isDocFilesSubDirs = true
options.links(
-@@ -207,11 +_,11 @@
+@@ -201,11 +_,11 @@
}
// workaround for https://github.com/gradle/gradle/issues/4046
diff --git a/purpur-server/build.gradle.kts.patch b/purpur-server/build.gradle.kts.patch
index aa3b7ad96..188f0829f 100644
--- a/purpur-server/build.gradle.kts.patch
+++ b/purpur-server/build.gradle.kts.patch
@@ -59,7 +59,7 @@
implementation("ca.spottedleaf:concurrentutil:0.0.5")
implementation("org.jline:jline-terminal-ffm:3.27.1") // use ffm on java 22+
implementation("org.jline:jline-terminal-jni:3.27.1") // fall back to jni on java 21
-@@ -157,6 +_,10 @@
+@@ -156,6 +_,10 @@
implementation("org.ow2.asm:asm-commons:9.8")
implementation("org.spongepowered:configurate-yaml:4.2.0")
@@ -70,7 +70,7 @@
// Deps that were previously in the API but have now been moved here for backwards compat, eventually to be removed
runtimeOnly("commons-lang:commons-lang:2.6")
runtimeOnly("org.xerial:sqlite-jdbc:3.49.1.0")
-@@ -201,14 +_,14 @@
+@@ -200,14 +_,14 @@
val gitBranch = git.exec(providers, "rev-parse", "--abbrev-ref", "HEAD").get().trim()
attributes(
"Main-Class" to "org.bukkit.craftbukkit.Main",
@@ -90,7 +90,7 @@
"Build-Number" to (build ?: ""),
"Build-Time" to buildTime.toString(),
"Git-Branch" to gitBranch,
-@@ -267,7 +_,7 @@
+@@ -266,7 +_,7 @@
jvmArgumentProviders.add(provider)
}
@@ -99,7 +99,7 @@
idea {
module {
generatedSourceDirs.add(generatedDir.toFile())
-@@ -359,7 +_,7 @@
+@@ -358,7 +_,7 @@
mainClass.set(null as String?)
}
@@ -108,7 +108,7 @@
project("paper")
versionFamily(paperweight.minecraftVersion.map { it.split(".", "-").takeWhile { part -> part.toIntOrNull() != null }.take(2).joinToString(".") })
version(paperweight.minecraftVersion)
-@@ -374,4 +_,44 @@
+@@ -373,4 +_,44 @@
}
}
}
diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch
index 986a4c9ff..a23152623 100644
--- a/purpur-server/minecraft-patches/features/0001-Ridables.patch
+++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch
@@ -18,7 +18,7 @@ index aa87e93ade4c25a575e7861fef45b70c3e4e3aeb..c92ffd8b2fe4945ccd552eb54154b7be
public boolean isClientAuthoritative() {
return false;
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
-index 26a663063ca056059e2a858aa2a54811a766cceb..8cf7be0184df48a4ceb85df88d7bb0d30b5e2ba2 100644
+index 5fec8ac15b16050baa533b73e33c899f4b08d23e..b44d17ee11b995720d6bc68b2db094ab88c0d53c 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
@@ -1683,6 +1683,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop brainProvider() {
return Brain.provider(MEMORY_TYPES, SENSOR_TYPES);
diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java
-index e63328db6af1e2a52c9ebfeefbceda1afd5edfcd..4bad786bee142bd1bc8fc76606829496ce44a455 100644
+index 1aeea30498e089d686b845f31b44aef0ff994c60..4f5d19c19887dc543c336bb72dac76c82503f792 100644
--- a/net/minecraft/world/entity/monster/Zombie.java
+++ b/net/minecraft/world/entity/monster/Zombie.java
-@@ -120,6 +120,14 @@ public class Zombie extends Monster {
+@@ -119,6 +119,14 @@ public class Zombie extends Monster {
}
// Purpur end - Ridables
@@ -1646,7 +1646,7 @@ index e63328db6af1e2a52c9ebfeefbceda1afd5edfcd..4bad786bee142bd1bc8fc76606829496
@Override
protected void registerGoals() {
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
-@@ -632,7 +640,7 @@ public class Zombie extends Monster {
+@@ -631,7 +639,7 @@ public class Zombie extends Monster {
}
protected void randomizeReinforcementsChance() {
@@ -1656,7 +1656,7 @@ index e63328db6af1e2a52c9ebfeefbceda1afd5edfcd..4bad786bee142bd1bc8fc76606829496
class ZombieAttackTurtleEggGoal extends RemoveBlockGoal {
diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java
-index 4a64ae41f5fa1df735ca62444c2b7bab2a1f4a8d..5a1ba4b80c104806ea8cff4242416951751ee919 100644
+index 454e2795e04c7b7cac88f782df3dfb4200b192fc..706c0cc803ede18f0790e94cfc989f0676199e7a 100644
--- a/net/minecraft/world/entity/monster/ZombieVillager.java
+++ b/net/minecraft/world/entity/monster/ZombieVillager.java
@@ -90,6 +90,18 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
@@ -1726,7 +1726,7 @@ index 982790edbd74bd80988df1400b0e67669bfd164c..c05d572fa2ab5a70c8825d2d2b6ffb36
protected BodyRotationControl createBodyControl() {
return new Creaking.CreakingBodyRotationControl(this);
diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
-index 2d9746a61d4733e5cf6150fec36217376d95461c..c74c6409ce61f9d4d728b6ce6693bb7ba665e474 100644
+index c3d08cfdb15602f6fbe2ac81c751e879668a4dd7..04eb22a9bbafb81f010a4413e653ae31426ba3e6 100644
--- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java
+++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
@@ -112,6 +112,14 @@ public class Hoglin extends Animal implements Enemy, HoglinBase {
@@ -1745,7 +1745,7 @@ index 2d9746a61d4733e5cf6150fec36217376d95461c..c74c6409ce61f9d4d728b6ce6693bb7b
public void setTimeInOverworld(int timeInOverworld) {
this.timeInOverworld = timeInOverworld;
diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java
-index 6d66f6b8a5dd616cb62af887b83576f268b24656..b8f994025c0511169174154a077d9e34eac2443a 100644
+index 8a7c6326e056772fb89ca73b20cc1d9d1a029db9..c44fd14350b2504fc38ae22a61029d5c44b60918 100644
--- a/net/minecraft/world/entity/monster/piglin/Piglin.java
+++ b/net/minecraft/world/entity/monster/piglin/Piglin.java
@@ -153,6 +153,14 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
@@ -1783,7 +1783,7 @@ index 4c8e49ba064241ec7ac505fa6f5df6d7f9c009b6..f52aba35ee7e202074cda8fb4dfd6a7d
return Monster.createMonsterAttributes()
.add(Attributes.MAX_HEALTH, 50.0)
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 94c0718ebc673827f0ba035be4617c64c46cd07d..b5dc02822ce6a82eb69fd7341c317fb1f7ee0a7f 100644
+index cf92712dbe0eee7296bd641e1acaf9000fca9189..aedcc54dcc370c00c1d7349e3a17358da5d6ca1d 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
@@ -271,6 +271,14 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
diff --git a/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch b/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch
index a328305d9..b983bf8bb 100644
--- a/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch
+++ b/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch
@@ -61,10 +61,10 @@ index 4a617bb6bc3675d8cb42be0b5ae19befd4b3176f..557b2d684936c15299d7082a92ec8b08
EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random
) {
diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java
-index 4bad786bee142bd1bc8fc76606829496ce44a455..604653d7748cc0f499071e04d396fef295bbdf9f 100644
+index 4f5d19c19887dc543c336bb72dac76c82503f792..73b6ffd6a1f27a5d49125b51d3396df5d84493f6 100644
--- a/net/minecraft/world/entity/monster/Zombie.java
+++ b/net/minecraft/world/entity/monster/Zombie.java
-@@ -128,6 +128,20 @@ public class Zombie extends Monster {
+@@ -127,6 +127,20 @@ public class Zombie extends Monster {
}
// Purpur end - Configurable entity base attributes
@@ -85,7 +85,7 @@ index 4bad786bee142bd1bc8fc76606829496ce44a455..604653d7748cc0f499071e04d396fef2
@Override
protected void registerGoals() {
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
-@@ -557,19 +571,18 @@ public class Zombie extends Monster {
+@@ -556,19 +570,18 @@ public class Zombie extends Monster {
}
if (spawnGroupData instanceof Zombie.ZombieGroupData zombieGroupData) {
@@ -111,7 +111,7 @@ index 4bad786bee142bd1bc8fc76606829496ce44a455..604653d7748cc0f499071e04d396fef2
Chicken chicken1 = EntityType.CHICKEN.create(this.level(), EntitySpawnReason.JOCKEY);
if (chicken1 != null) {
chicken1.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F);
-@@ -578,6 +591,7 @@ public class Zombie extends Monster {
+@@ -577,6 +590,7 @@ public class Zombie extends Monster {
this.startRiding(chicken1, false, false);
level.addFreshEntity(chicken1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit
}
@@ -120,7 +120,7 @@ index 4bad786bee142bd1bc8fc76606829496ce44a455..604653d7748cc0f499071e04d396fef2
}
}
diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java
-index 5a1ba4b80c104806ea8cff4242416951751ee919..04748820e2c78a6d0faa6c4fb4901c7d8b2a8760 100644
+index 706c0cc803ede18f0790e94cfc989f0676199e7a..1d01131dae3900280d5c9ce9899f4afa09acfd46 100644
--- a/net/minecraft/world/entity/monster/ZombieVillager.java
+++ b/net/minecraft/world/entity/monster/ZombieVillager.java
@@ -102,6 +102,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
diff --git a/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch b/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch
index 188bc1bff..2e16ccb0d 100644
--- a/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch
+++ b/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch
@@ -23,7 +23,7 @@ index 1896f91e10a5e17332836d5354813a18a4dfe6dc..1c446cec71aa163374ab9832c961a6b4
protected ParticleOptions getInkParticle() {
return ParticleTypes.GLOW_SQUID_INK;
diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java
-index c817947dcba66004216ac8f3b2cdd1e940ee6d03..eac9b5bcb5cfaa1fe4d1944a0e192a9e86f6f0d3 100644
+index c5d2997629db6da1bb883e9b778d9da34e57430f..7b6caaeb34c297f22206d0da0293a56594654657 100644
--- a/net/minecraft/world/entity/ambient/Bat.java
+++ b/net/minecraft/world/entity/ambient/Bat.java
@@ -111,6 +111,13 @@ public class Bat extends AmbientCreature {
@@ -41,7 +41,7 @@ index c817947dcba66004216ac8f3b2cdd1e940ee6d03..eac9b5bcb5cfaa1fe4d1944a0e192a9e
public boolean isFlapping() {
return !this.isResting() && this.tickCount % 10.0F == 0.0F;
diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java
-index a5e0edd6da8675643f3a4d63199e8cd865a6d836..57e465cea9da02af055ab99bd3ff41cc13939d47 100644
+index 68fecbd75d0243706f052f6f4cd654cf411a0782..980d3255d6dc7913fdb5437dafb702c2eff5d56f 100644
--- a/net/minecraft/world/entity/animal/Bee.java
+++ b/net/minecraft/world/entity/animal/Bee.java
@@ -184,7 +184,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
@@ -441,7 +441,7 @@ index 966f21d90996a9c162e3f60ff53edb53507645b3..6a52e549257582d09af824f4067c9113
this.homePos = homePos;
}
diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java
-index a56ff850de466a592855a9bf2bc395c2e4b97c17..ac56f22dc069ec7c4832024083b242f965c51c58 100644
+index a6145a24bffc1f56406cb9e57b15631ba82afe6a..4932668448a7346758983b647f4e508061297ba2 100644
--- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java
+++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java
@@ -153,6 +153,13 @@ public class Axolotl extends Animal implements Bucketable {
@@ -459,7 +459,7 @@ index a56ff850de466a592855a9bf2bc395c2e4b97c17..ac56f22dc069ec7c4832024083b242f9
public float getWalkTargetValue(BlockPos pos, LevelReader level) {
return 0.0F;
diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java
-index 52d35093b9fc84e27b4c4e62883a7e581e8c0f5b..c6a03e6f223010dbcf56719197f2dcc62916649b 100644
+index 0ec325f198d877057a9b497e667d1f3be40e683e..4e93554170d9c91a7d704b161b91ca28b19be73b 100644
--- a/net/minecraft/world/entity/animal/goat/Goat.java
+++ b/net/minecraft/world/entity/animal/goat/Goat.java
@@ -138,6 +138,13 @@ public class Goat extends Animal {
@@ -1025,7 +1025,7 @@ index 6f4aaeb645d9638764c3516d2f1501661ac56170..51714029d4ea5033014dcefd25f74cc0
protected void registerGoals() {
this.friendsGoal = new Silverfish.SilverfishWakeUpFriendsGoal(this);
diff --git a/net/minecraft/world/entity/monster/Skeleton.java b/net/minecraft/world/entity/monster/Skeleton.java
-index 430d9f67d76c5d4b8f0221ccbe6a8bc75dbbbbcf..cad46630ea1da0f77779f14a7882ae2f78700c51 100644
+index dc9a946b102e93a024130967b1eb1d5e78070b4d..4c625007fdfc7525036ec0c761400b07facbb43a 100644
--- a/net/minecraft/world/entity/monster/Skeleton.java
+++ b/net/minecraft/world/entity/monster/Skeleton.java
@@ -49,6 +49,13 @@ public class Skeleton extends AbstractSkeleton {
@@ -1209,10 +1209,10 @@ index f1d42c8ee4a23ba3485477632b51dd9bcf9db926..5ed357158eccc48b2d1e25e06c35b743
protected Brain.Provider brainProvider() {
return Brain.provider(MEMORY_TYPES, SENSOR_TYPES);
diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java
-index 604653d7748cc0f499071e04d396fef295bbdf9f..3c520bc7f53685d7a38238a35b0589aaf68e7906 100644
+index 73b6ffd6a1f27a5d49125b51d3396df5d84493f6..452fcb94b5d31e04bf3c96bd1b07ff9b54101595 100644
--- a/net/minecraft/world/entity/monster/Zombie.java
+++ b/net/minecraft/world/entity/monster/Zombie.java
-@@ -142,6 +142,13 @@ public class Zombie extends Monster {
+@@ -141,6 +141,13 @@ public class Zombie extends Monster {
}
// Purpur end - Configurable jockey options
@@ -1227,7 +1227,7 @@ index 604653d7748cc0f499071e04d396fef295bbdf9f..3c520bc7f53685d7a38238a35b0589aa
protected void registerGoals() {
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java
-index 04748820e2c78a6d0faa6c4fb4901c7d8b2a8760..a75452d77c48a09e9cea2ca2e94745d02e618a12 100644
+index 1d01131dae3900280d5c9ce9899f4afa09acfd46..31d8feaf5e2b84bee72796fd96502a862e573f52 100644
--- a/net/minecraft/world/entity/monster/ZombieVillager.java
+++ b/net/minecraft/world/entity/monster/ZombieVillager.java
@@ -119,6 +119,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
@@ -1263,7 +1263,7 @@ index 325d0f32fd8824dc1c7067eb9c303bdfc122c706..3e262c6919287ad981b1d36b7f96dd14
public void setPersistentAngerTarget(@Nullable UUID target) {
this.persistentAngerTarget = target;
diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
-index b19717af413f739abf632050409db25e2e85e0c6..55a802d5a4480b09f8564949b4b04fb8e43fe8bd 100644
+index 05cfdeb5afaad609ae873bb31ca411c4d6759a3f..a98de218d58361cce3f0cde21fbffbe9c1584701 100644
--- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java
+++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
@@ -127,6 +127,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase {
@@ -1281,7 +1281,7 @@ index b19717af413f739abf632050409db25e2e85e0c6..55a802d5a4480b09f8564949b4b04fb8
public void setTimeInOverworld(int timeInOverworld) {
this.timeInOverworld = timeInOverworld;
diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java
-index 033e619f91fe3010a8056974d812351494c65f72..f9247771363ed1ccca775f23212eb402612c896d 100644
+index 1d9dc37055a2a9f41945b39812e1be15a8eb57e5..6eb4a5d752835110b7ff7c817bb31f027074c6db 100644
--- a/net/minecraft/world/entity/monster/piglin/Piglin.java
+++ b/net/minecraft/world/entity/monster/piglin/Piglin.java
@@ -161,6 +161,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
@@ -1317,7 +1317,7 @@ index f52aba35ee7e202074cda8fb4dfd6a7d9ded1f09..f4893cc54d7f144025da0057beedb3a9
return Monster.createMonsterAttributes()
.add(Attributes.MAX_HEALTH, 50.0)
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 23f7032a044c61b7d541fbe7609449ecede23258..5919135e4766e5e252aa07f9ff1170d92b9d839f 100644
+index 9f8fd64a3812e6d6bfefb21dd793aae9ad2bcd94..08f6c4ca51177290bc80103d8ebd7087c41be954 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
@@ -281,6 +281,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
diff --git a/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch b/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch
index a1d3f8a5e..afae6c7ec 100644
--- a/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch
+++ b/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] API for any mob to burn daylight
Co-authored by: Encode42
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
-index 0dc4962cae6fa15b4cfbfa2938e271f5303cf2bb..c5bf15d4c526e9eebaf3485baf9ac34dd1d1d806 100644
+index ef77be60df1cf44088e684c21dbcaf3032bb3ad6..92292ae5a313e85a3238427e7ab19c73e31f0ecb 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -544,6 +544,24 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name
@@ -35,7 +35,7 @@ index 0dc4962cae6fa15b4cfbfa2938e271f5303cf2bb..c5bf15d4c526e9eebaf3485baf9ac34d
this.type = entityType;
this.level = level;
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
-index de18e6ac0c4336b089a2c40660256488c9d042d5..b758b62ea666b18cf2a8d52651901173410abac6 100644
+index 7113d74f4684313d67d64a9449424c6e6243ce1f..173647156cf97a476931fc8b59be4c988b7107ce 100644
--- a/net/minecraft/world/entity/LivingEntity.java
+++ b/net/minecraft/world/entity/LivingEntity.java
@@ -287,6 +287,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
@@ -96,7 +96,7 @@ index de18e6ac0c4336b089a2c40660256488c9d042d5..b758b62ea666b18cf2a8d52651901173
protected void applyInput() {
diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java
-index b43145dad28a5ee58eaa4559ac5bd462466c114d..e7b29ba441b16661ad4d5f535b481980408ac2e2 100644
+index 8f58641132231f450d0fb0c1fa61559c6cef8dcf..b9659c11204f632f42bc776453fcf5ce1eb09073 100644
--- a/net/minecraft/world/entity/Mob.java
+++ b/net/minecraft/world/entity/Mob.java
@@ -1589,19 +1589,8 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
@@ -280,10 +280,10 @@ index e0193db5ce783b4ab2b8afaeaeffde8ac8bc8a71..aa292ec60655cc9419da2a744c8cb841
}
diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java
-index 3c520bc7f53685d7a38238a35b0589aaf68e7906..fab34ee698752b4f0c79f143efac98f134b5276b 100644
+index 452fcb94b5d31e04bf3c96bd1b07ff9b54101595..6e3ae67dbb9a60177f26d075d42aacce580ff956 100644
--- a/net/minecraft/world/entity/monster/Zombie.java
+++ b/net/minecraft/world/entity/monster/Zombie.java
-@@ -92,11 +92,12 @@ public class Zombie extends Monster {
+@@ -91,11 +91,12 @@ public class Zombie extends Monster {
private boolean canBreakDoors = false;
private int inWaterTime = 0;
public int conversionTime;
@@ -297,7 +297,7 @@ index 3c520bc7f53685d7a38238a35b0589aaf68e7906..fab34ee698752b4f0c79f143efac98f1
}
public Zombie(Level level) {
-@@ -293,29 +294,7 @@ public class Zombie extends Monster {
+@@ -292,29 +293,7 @@ public class Zombie extends Monster {
@Override
public void aiStep() {
@@ -328,7 +328,7 @@ index 3c520bc7f53685d7a38238a35b0589aaf68e7906..fab34ee698752b4f0c79f143efac98f1
super.aiStep();
}
-@@ -374,6 +353,7 @@ public class Zombie extends Monster {
+@@ -373,6 +352,7 @@ public class Zombie extends Monster {
// CraftBukkit end
}
@@ -336,7 +336,7 @@ index 3c520bc7f53685d7a38238a35b0589aaf68e7906..fab34ee698752b4f0c79f143efac98f1
public boolean isSunSensitive() {
return this.shouldBurnInDay; // Paper - Add more Zombie API
}
-@@ -511,7 +491,7 @@ public class Zombie extends Monster {
+@@ -510,7 +490,7 @@ public class Zombie extends Monster {
output.putBoolean("CanBreakDoors", this.canBreakDoors());
output.putInt("InWaterTime", this.isInWater() ? this.inWaterTime : -1);
output.putInt("DrownedConversionTime", this.isUnderWaterConverting() ? this.conversionTime : -1);
@@ -345,7 +345,7 @@ index 3c520bc7f53685d7a38238a35b0589aaf68e7906..fab34ee698752b4f0c79f143efac98f1
}
@Override
-@@ -526,7 +506,7 @@ public class Zombie extends Monster {
+@@ -525,7 +505,7 @@ public class Zombie extends Monster {
} else {
this.getEntityData().set(DATA_DROWNED_CONVERSION_ID, false);
}
diff --git a/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch b/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch
index ad98b7a73..bb7b116cb 100644
--- a/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch
+++ b/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch
@@ -23,7 +23,7 @@ index 1c446cec71aa163374ab9832c961a6b4c3fc534b..86a694b94045b47f6e98c480645f7573
protected ParticleOptions getInkParticle() {
return ParticleTypes.GLOW_SQUID_INK;
diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java
-index eac9b5bcb5cfaa1fe4d1944a0e192a9e86f6f0d3..507e048e8a54964e330642009f2c75261c06ea0d 100644
+index 7b6caaeb34c297f22206d0da0293a56594654657..6ef5a4804032945c7ededa2eee1ae0ae4417019b 100644
--- a/net/minecraft/world/entity/ambient/Bat.java
+++ b/net/minecraft/world/entity/ambient/Bat.java
@@ -118,6 +118,13 @@ public class Bat extends AmbientCreature {
@@ -41,7 +41,7 @@ index eac9b5bcb5cfaa1fe4d1944a0e192a9e86f6f0d3..507e048e8a54964e330642009f2c7526
public boolean isFlapping() {
return !this.isResting() && this.tickCount % 10.0F == 0.0F;
diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java
-index 57e465cea9da02af055ab99bd3ff41cc13939d47..b6e109ecbe3fa5afaaadc22ece6447ea6202ff96 100644
+index 980d3255d6dc7913fdb5437dafb702c2eff5d56f..a520052f0feae97c5ed8eb4af4fb48cdf56d6550 100644
--- a/net/minecraft/world/entity/animal/Bee.java
+++ b/net/minecraft/world/entity/animal/Bee.java
@@ -497,6 +497,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
@@ -437,7 +437,7 @@ index 6a52e549257582d09af824f4067c91130f35cf8a..bb2f87ee973ad4163a7d130d607e6efa
this.homePos = homePos;
}
diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java
-index ac56f22dc069ec7c4832024083b242f965c51c58..c349bc41bb3aa464918eae445c297a24bf67756d 100644
+index 4932668448a7346758983b647f4e508061297ba2..08fb591e860b7b2b93b42bfc7a91d63999567dc6 100644
--- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java
+++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java
@@ -160,6 +160,13 @@ public class Axolotl extends Animal implements Bucketable {
@@ -455,7 +455,7 @@ index ac56f22dc069ec7c4832024083b242f965c51c58..c349bc41bb3aa464918eae445c297a24
public float getWalkTargetValue(BlockPos pos, LevelReader level) {
return 0.0F;
diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java
-index c6a03e6f223010dbcf56719197f2dcc62916649b..500ffed7cff5dd66cb7182e16cc0a723f9f5bfd6 100644
+index 4e93554170d9c91a7d704b161b91ca28b19be73b..99980c9a69b51f81a9cd4429d59fab9497d79656 100644
--- a/net/minecraft/world/entity/animal/goat/Goat.java
+++ b/net/minecraft/world/entity/animal/goat/Goat.java
@@ -145,6 +145,13 @@ public class Goat extends Animal {
@@ -995,7 +995,7 @@ index 51714029d4ea5033014dcefd25f74cc0c9a72dbd..bcae390578519fef362a126fbcf2b5cf
protected void registerGoals() {
this.friendsGoal = new Silverfish.SilverfishWakeUpFriendsGoal(this);
diff --git a/net/minecraft/world/entity/monster/Skeleton.java b/net/minecraft/world/entity/monster/Skeleton.java
-index cad46630ea1da0f77779f14a7882ae2f78700c51..be15358828c6b89214d304b193e4a8c1305f3e5f 100644
+index 4c625007fdfc7525036ec0c761400b07facbb43a..44260780b36e5a20314ba4622c2a877f60df78c5 100644
--- a/net/minecraft/world/entity/monster/Skeleton.java
+++ b/net/minecraft/world/entity/monster/Skeleton.java
@@ -56,6 +56,13 @@ public class Skeleton extends AbstractSkeleton {
@@ -1175,10 +1175,10 @@ index 5ed357158eccc48b2d1e25e06c35b7436086e7c5..e0ee4f71786dce5690cf75bb55def05c
protected Brain.Provider brainProvider() {
return Brain.provider(MEMORY_TYPES, SENSOR_TYPES);
diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java
-index fab34ee698752b4f0c79f143efac98f134b5276b..3c7d9bfc57c68f58466f64cd5d51e08635d8657b 100644
+index 6e3ae67dbb9a60177f26d075d42aacce580ff956..63b29933e262115062a082dcaed0d16146a181bd 100644
--- a/net/minecraft/world/entity/monster/Zombie.java
+++ b/net/minecraft/world/entity/monster/Zombie.java
-@@ -150,6 +150,13 @@ public class Zombie extends Monster {
+@@ -149,6 +149,13 @@ public class Zombie extends Monster {
}
// Purpur end - Toggle for water sensitive mob damage
@@ -1193,7 +1193,7 @@ index fab34ee698752b4f0c79f143efac98f134b5276b..3c7d9bfc57c68f58466f64cd5d51e086
protected void registerGoals() {
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables
diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java
-index a75452d77c48a09e9cea2ca2e94745d02e618a12..30107b919a467f233a27c0f29ab7a35d1dd4d7e7 100644
+index 31d8feaf5e2b84bee72796fd96502a862e573f52..f21f2c45edb5dc51154649b4406601c3c9840dfd 100644
--- a/net/minecraft/world/entity/monster/ZombieVillager.java
+++ b/net/minecraft/world/entity/monster/ZombieVillager.java
@@ -126,6 +126,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
@@ -1229,7 +1229,7 @@ index 3e262c6919287ad981b1d36b7f96dd14cae8e190..1955ea6cff628234342989249de6efd1
public void setPersistentAngerTarget(@Nullable UUID target) {
this.persistentAngerTarget = target;
diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
-index 55a802d5a4480b09f8564949b4b04fb8e43fe8bd..12c4c7dfa5a22283c5179ae2c1c94d9580cd2c43 100644
+index a98de218d58361cce3f0cde21fbffbe9c1584701..08c3372555d098b62465437798bf6cbd08e73ec5 100644
--- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java
+++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
@@ -134,6 +134,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase {
@@ -1247,7 +1247,7 @@ index 55a802d5a4480b09f8564949b4b04fb8e43fe8bd..12c4c7dfa5a22283c5179ae2c1c94d95
public void setTimeInOverworld(int timeInOverworld) {
this.timeInOverworld = timeInOverworld;
diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java
-index f9247771363ed1ccca775f23212eb402612c896d..69633aa1a457a936a53d873f478113a5ae71dbd5 100644
+index 6eb4a5d752835110b7ff7c817bb31f027074c6db..000391f95bf2881765c304aecb013eb313d55ba1 100644
--- a/net/minecraft/world/entity/monster/piglin/Piglin.java
+++ b/net/minecraft/world/entity/monster/piglin/Piglin.java
@@ -168,6 +168,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento
@@ -1283,7 +1283,7 @@ index f4893cc54d7f144025da0057beedb3a974c80dc1..70ee15527fa6f30783d6a58bb767b181
return Monster.createMonsterAttributes()
.add(Attributes.MAX_HEALTH, 50.0)
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 5919135e4766e5e252aa07f9ff1170d92b9d839f..0b8697459de698e152e1b4c0dc78c63339a48b17 100644
+index 08f6c4ca51177290bc80103d8ebd7087c41be954..dda4563b0f0d6f0d1a0ccd64a4ec787bf27abf2d 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
@@ -288,6 +288,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch
index 3b3848532..74464ee28 100644
--- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch
+++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch
@@ -196,7 +196,7 @@
this.serverLevelData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents
// CraftBukkit start
// If we stop due to everyone sleeping we should reset the weather duration to some other random value.
-@@ -2793,7 +_,7 @@
+@@ -2797,7 +_,7 @@
// Spigot start
if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message
// Paper start - Fix merchant inventory not closing on entity removal
diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Zombie.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Zombie.java.patch
index c07653823..ab0f726fc 100644
--- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Zombie.java.patch
+++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Zombie.java.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/monster/Zombie.java
+++ b/net/minecraft/world/entity/monster/Zombie.java
-@@ -117,7 +_,19 @@
+@@ -116,7 +_,19 @@
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers(ZombifiedPiglin.class));
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
@@ -21,7 +21,7 @@
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true));
this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR));
}
-@@ -551,10 +_,7 @@
+@@ -550,10 +_,7 @@
}
if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) {
diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch
index 37bcb8e5d..1db2d8c1b 100644
--- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch
+++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch
@@ -4,13 +4,13 @@
return;
}
// CraftBukkit end
-- if (this.random.nextFloat() < 0.05F && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) {
-+ if (this.random.nextFloat() < serverLevel.purpurConfig.enderPearlEndermiteChance && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { // Purpur - Configurable Ender Pearl RNG
+- if (this.random.nextFloat() < 0.05F && serverLevel.isSpawningMonsters()) {
++ if (this.random.nextFloat() < serverLevel.purpurConfig.enderPearlEndermiteChance && serverLevel.isSpawningMonsters()) { // Purpur - Configurable Ender Pearl RNG
Endermite endermite = EntityType.ENDERMITE.create(serverLevel, EntitySpawnReason.TRIGGERED);
if (endermite != null) {
+ endermite.setPlayerSpawned(true); // Purpur - Add back player spawned endermite API
endermite.snapTo(preTeleportX, preTeleportY, preTeleportZ, preTeleportYRot, preTeleportXRot); // Paper - spawn endermite at pre teleport position as teleport has been moved up
- serverLevel.addFreshEntity(endermite, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.ENDER_PEARL);
+ serverLevel.addFreshEntity(endermite, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.ENDER_PEARL); // Paper - add reason
}
@@ -136,7 +_,7 @@
if (serverPlayer1 != null) {
diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/NetherPortalBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/NetherPortalBlock.java.patch
index f3f45c58f..f6cfd250a 100644
--- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/NetherPortalBlock.java.patch
+++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/NetherPortalBlock.java.patch
@@ -3,7 +3,7 @@
@@ -67,7 +_,7 @@
protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
if (level.spigotConfig.enableZombiePigmenPortalSpawns && level.dimensionType().natural() // Spigot
- && level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)
+ && level.isSpawningMonsters()
- && random.nextInt(2000) < level.getDifficulty().getId()
+ && random.nextInt(level.purpurConfig.piglinPortalSpawnModifier) < level.getDifficulty().getId() // Purpur - Piglin portal spawn modifier
&& level.anyPlayerCloseEnoughForSpawning(pos)) {