diff --git a/gradle.properties b/gradle.properties
index 7fae0788..48f9930b 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,7 +1,7 @@
group = org.dreeam.leaf
version = 1.20.4-R0.1-SNAPSHOT
-galeCommit = 84c93452529ed1ff5e6ef78e01e38c843104bbad
+galeCommit = 377da10d2e1fdd3d1bbba68813dd1996dcdbfd09
org.gradle.caching = true
org.gradle.parallel = true
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index d64cd491..e6441136 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index a80b22ce..354bb4e9 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-rc-2-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/patches/api/0001-Leaf-config-files.patch b/patches/api/0001-Leaf-config-files.patch
index 2fb07fdc..f7226b4c 100644
--- a/patches/api/0001-Leaf-config-files.patch
+++ b/patches/api/0001-Leaf-config-files.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Leaf config files
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 6b7584082a12903184add379c3b1dddfcff015fc..8a161557cefd962f15f5138ffa1386c4134d557c 100644
+index bb73389fd8ffcc2fb89ece44e7704f87baa3058e..55830a5621b5f1b59dc7285425e1fd949a4aea83 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2267,6 +2267,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2282,6 +2282,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
// Paper end
diff --git a/patches/api/0003-Purpur-API-Changes.patch b/patches/api/0003-Purpur-API-Changes.patch
index 975dd30b..c133ff93 100644
--- a/patches/api/0003-Purpur-API-Changes.patch
+++ b/patches/api/0003-Purpur-API-Changes.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Purpur API Changes
Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
-Commit: 9cd8eb4fcbf703f1098ceb8be29830fd11a7a32f
+Commit: 642956fe6151a87488d861ccb98e4d46d355d599
Patches below are removed in this patch:
Pufferfish-API-Changes.patch
@@ -34,10 +34,10 @@ index a736d7bcdc5861a01b66ba36158db1c716339346..22fc165fd9c95f0f3ae1be7a0857e48c
@Override
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
-index 77696b5505e9c05753ec95050ec55878794fcf7c..202cd4918a1a0bb178d32305a3aff4dc64f54a04 100644
+index 12412ffbfa05f91d46509a90fe3af7085349eb63..69e1800274218115877870b43d44cecd77f27c83 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
-@@ -2929,4 +2929,127 @@ public final class Bukkit {
+@@ -2945,4 +2945,127 @@ public final class Bukkit {
public static Server.Spigot spigot() {
return server.spigot();
}
@@ -301,10 +301,10 @@ index f9af60356da4668cec8b24e73f5747ab82e35a91..b304ad1307cdd6785653b1eab9781e07
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/OfflinePlayer.java b/src/main/java/org/bukkit/OfflinePlayer.java
-index abb5109ed08a3a651c2c27d4d17a3d49eb06da1e..98308b759907e03b168f7e06704a91925ffcd3fd 100644
+index 30298a629b39bd43ce14b414fc697b2dfcbea89c..ce00af9121de7a910aaea4e0685a06d4cf31b4e3 100644
--- a/src/main/java/org/bukkit/OfflinePlayer.java
+++ b/src/main/java/org/bukkit/OfflinePlayer.java
-@@ -545,4 +545,106 @@ public interface OfflinePlayer extends ServerOperator, AnimalTamer, Configuratio
+@@ -557,4 +557,106 @@ public interface OfflinePlayer extends ServerOperator, AnimalTamer, Configuratio
*/
@Nullable
public Location getLocation();
@@ -412,10 +412,10 @@ index abb5109ed08a3a651c2c27d4d17a3d49eb06da1e..98308b759907e03b168f7e06704a9192
+ // Purpur end - OfflinePlayer API
}
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 8a161557cefd962f15f5138ffa1386c4134d557c..c0f2975cf31a32610950968a9420f659d44e16b5 100644
+index 55830a5621b5f1b59dc7285425e1fd949a4aea83..bba0c8d28b0d02bd85d279b74a83aa8bf66c37d4 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2267,6 +2267,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2282,6 +2282,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
// Paper end
@@ -434,7 +434,7 @@ index 8a161557cefd962f15f5138ffa1386c4134d557c..c0f2975cf31a32610950968a9420f659
// Leaf start
@NotNull
public org.bukkit.configuration.file.YamlConfiguration getLeafConfig()
-@@ -2584,4 +2596,111 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+@@ -2599,4 +2611,111 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
long getLastTickOversleepTime();
// Gale end - YAPFA - last tick time - API
@@ -996,10 +996,10 @@ index bc84b892cae5fe7019a3ad481e9da79956efa1fe..48eb5b00c460cccde29d327cef1d63fc
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index ad21ca6e9a2e77da185950a34f114480dddddec0..f42b134854201a94601f2660cb62a8211a8f49f7 100644
+index 019237c2e536a118f7cd3d81fc59b74f21c34609..a9f119ea2a006158429a90d67517ccc74a0027ac 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3697,4 +3697,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3721,4 +3721,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@Override
Spigot spigot();
// Spigot end
diff --git a/patches/api/0005-Bump-Dependencies.patch b/patches/api/0005-Bump-Dependencies.patch
index cc9481e2..ecaaa0b9 100644
--- a/patches/api/0005-Bump-Dependencies.patch
+++ b/patches/api/0005-Bump-Dependencies.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Bump Dependencies
diff --git a/build.gradle.kts b/build.gradle.kts
-index 1bbc94b97662aa0367c9b5bac19bec313f158c14..88929400dc1ea29c6924a153492f804c2ed3edf5 100644
+index 2ea90f77c8ad7a36c51df0dfe1d333b10a765255..a44f86f4be8db0c65de630d1bb2b1d47e6a8102f 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -9,11 +9,11 @@ java {
@@ -15,11 +15,11 @@ index 1bbc94b97662aa0367c9b5bac19bec313f158c14..88929400dc1ea29c6924a153492f804c
-val annotationsVersion = "24.0.1"
+val annotationsVersion = "24.1.0" // Leaf - Bump Dependencies
val bungeeCordChatVersion = "1.20-R0.2"
- val adventureVersion = "4.15.0"
+ val adventureVersion = "4.16.0"
-val slf4jVersion = "2.0.9"
-val log4jVersion = "2.17.1"
+val slf4jVersion = "2.0.12" // Leaf - Bump Dependencies
-+val log4jVersion = "2.22.1" // Leaf - Bump Dependencies
++val log4jVersion = "2.23.0" // Leaf - Bump Dependencies
val apiAndDocs: Configuration by configurations.creating {
attributes {
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION))
@@ -46,7 +46,7 @@ index 1bbc94b97662aa0367c9b5bac19bec313f158c14..88929400dc1ea29c6924a153492f804c
api("org.apache.logging.log4j:log4j-api:$log4jVersion")
api("org.slf4j:slf4j-api:$slf4jVersion")
- api("io.sentry:sentry:5.4.0") // Pufferfish
-+ api("io.sentry:sentry:7.3.0") // Pufferfish // Leaf - Bump Dependencies
++ api("io.sentry:sentry:7.5.0") // Pufferfish // Leaf - Bump Dependencies
- implementation("org.ow2.asm:asm:9.5")
- implementation("org.ow2.asm:asm-commons:9.5")
@@ -73,7 +73,7 @@ index 1bbc94b97662aa0367c9b5bac19bec313f158c14..88929400dc1ea29c6924a153492f804c
testImplementation("org.hamcrest:hamcrest:2.2")
- testImplementation("org.mockito:mockito-core:5.5.0")
- testImplementation("org.ow2.asm:asm-tree:9.5")
-+ testImplementation("org.mockito:mockito-core:5.10.0")
++ testImplementation("org.mockito:mockito-core:5.11.0")
+ testImplementation("org.ow2.asm:asm-tree:9.6")
+ // Leaf end
}
diff --git a/patches/api/0007-KeYi-Player-Skull-API.patch b/patches/api/0007-KeYi-Player-Skull-API.patch
index a71bdf0c..2873c0f2 100644
--- a/patches/api/0007-KeYi-Player-Skull-API.patch
+++ b/patches/api/0007-KeYi-Player-Skull-API.patch
@@ -7,7 +7,7 @@ Original license: MIT
Original project: https://github.com/KeYiMC/KeYi
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index f42b134854201a94601f2660cb62a8211a8f49f7..7d0dbadbc3010c3e348ba408c2e3fda8577d767f 100644
+index a9f119ea2a006158429a90d67517ccc74a0027ac..69ba1660dae4ac69ec4e92f94dd6f95e9f70427d 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
@@ -9,6 +9,10 @@ import java.util.Date;
@@ -21,7 +21,7 @@ index f42b134854201a94601f2660cb62a8211a8f49f7..7d0dbadbc3010c3e348ba408c2e3fda8
import org.bukkit.DyeColor;
import org.bukkit.Effect;
import org.bukkit.GameMode;
-@@ -3816,4 +3820,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3840,4 +3844,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
sendDeathScreen(message);
}
// Purpur end
diff --git a/patches/api/0008-Slice-Smooth-Teleports.patch b/patches/api/0008-Slice-Smooth-Teleports.patch
index a0eb5782..0f8d9512 100644
--- a/patches/api/0008-Slice-Smooth-Teleports.patch
+++ b/patches/api/0008-Slice-Smooth-Teleports.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/Cryptite/Slice
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 9c6b5799897237ce0095087fdc9eec446420cc1f..83f5565efe1d592a6d1b65000034ae8d695aea34 100644
+index 69ba1660dae4ac69ec4e92f94dd6f95e9f70427d..dbd5e9faaf92d718c20ceaf076f2afd867232116 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3564,6 +3564,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3588,6 +3588,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
String getClientBrandName();
// Paper end
diff --git a/patches/generated-api/0001-Purpur-generated-api-Changes.patch b/patches/generated-api/0001-Purpur-generated-api-Changes.patch
index da57d212..4a8d1e52 100644
--- a/patches/generated-api/0001-Purpur-generated-api-Changes.patch
+++ b/patches/generated-api/0001-Purpur-generated-api-Changes.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Purpur generated-api Changes
Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
-Commit: 9cd8eb4fcbf703f1098ceb8be29830fd11a7a32f
+Commit: 642956fe6151a87488d861ccb98e4d46d355d599
diff --git a/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/com/destroystokyo/paper/entity/ai/VanillaGoal.java
index 069f2668f5229b0368b796e65eef1648fba0a097..9b991201a2f6cc9feccccf7f4e7bcded64117764 100644
diff --git a/patches/server/0001-Rebrand.patch b/patches/server/0001-Rebrand.patch
index bd426901..c8a24a1b 100644
--- a/patches/server/0001-Rebrand.patch
+++ b/patches/server/0001-Rebrand.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Rebrand
diff --git a/build.gradle.kts b/build.gradle.kts
-index 362bbf070aabf5a8ac0233ce64f321c5dc1849fe..a8a720045804cded8f8dffc1bfdd20710b8f0c82 100644
+index c9784da0a87d61e80a41fb0358614053682e942b..960fe37a4cf0100b552401f835900c6d8b6af523 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -15,7 +15,7 @@ val alsoShade: Configuration by configurations.creating
@@ -17,7 +17,7 @@ index 362bbf070aabf5a8ac0233ce64f321c5dc1849fe..a8a720045804cded8f8dffc1bfdd2071
// Depend on Paper MojangAPI
implementation("io.papermc.paper:paper-mojangapi:${project.version}") {
exclude("io.papermc.paper", "paper-api")
-@@ -87,7 +87,7 @@ tasks.jar {
+@@ -88,7 +88,7 @@ tasks.jar {
attributes(
"Main-Class" to "org.bukkit.craftbukkit.Main",
"Implementation-Title" to "CraftBukkit",
@@ -86,7 +86,7 @@ index fbdc65a01b04abae4c3770666c6a77e0e85be502..9e7119152664e785e23f08e3a702f0bc
while (this.getRunningThread().isAlive()) {
this.getRunningThread().stop();
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 3eda41407dbd193ccad8f3d47700754f24bb358a..5ea33329ae1fe2fbbba20f25cd2dcfa64190df86 100644
+index 859d009003637ba701cd13031edf491b4420249a..8ecf6ffa93610261d27fafadfff016a2d6047c90 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -269,7 +269,7 @@ import javax.annotation.Nullable; // Paper
diff --git a/patches/server/0007-Pufferfish-Dynamic-Activation-of-Brain.patch b/patches/server/0007-Pufferfish-Dynamic-Activation-of-Brain.patch
index beca9cc1..c018df3c 100644
--- a/patches/server/0007-Pufferfish-Dynamic-Activation-of-Brain.patch
+++ b/patches/server/0007-Pufferfish-Dynamic-Activation-of-Brain.patch
@@ -30,7 +30,7 @@ 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/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 1591e201ebca4354d5912d3f803f59759af1ba6e..98e666c69b51f7b4fec040b7abd9667d293c9ccb 100644
+index 8d517617e38edf7b6cd49f32f404f2f80c014f66..1fe45a264032047c67d84ab387e230af2f0eff20 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -880,6 +880,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -42,10 +42,10 @@ index 1591e201ebca4354d5912d3f803f59759af1ba6e..98e666c69b51f7b4fec040b7abd9667d
if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed
entity.discard();
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 68fe93725a37cb0f52401038c1bda141ba0a4068..68b256e6b3086127ba440f348bcd9d5926e029af 100644
+index 4027ea7cb55dcb70c96cc2ada3b0da09c1dda8ad..1482310673c2c2ac9180ea80a96c24d4094e11c9 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -503,6 +503,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -504,6 +504,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
// Paper end - optimise entity tracking
@@ -70,10 +70,10 @@ index 09e8445a3f8c6b3ebc852a75a9a25b41a51ba659..d86c34111ede6a1454dde5e7223d7caf
private String descriptionId;
@Nullable
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 8f91e97240c50a6bbef6b7c71b5e3002a4ef79a8..b7d2d19f029c6fdc6091c9f60278a528885e17f8 100644
+index a676228a7f4d8d4b7e54a641c1df1f1b0d262f10..43beb25bb42f19832da83f6f7f022cb5c85830c1 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
-@@ -227,10 +227,10 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -228,10 +228,10 @@ public abstract class Mob extends LivingEntity implements Targeting {
@Override
public void inactiveTick() {
super.inactiveTick();
@@ -86,7 +86,7 @@ index 8f91e97240c50a6bbef6b7c71b5e3002a4ef79a8..b7d2d19f029c6fdc6091c9f60278a528
this.targetSelector.tick();
}
}
-@@ -905,10 +905,14 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -906,10 +906,14 @@ public abstract class Mob extends LivingEntity implements Targeting {
int i = this.level().getServer().getTickCount() + this.getId();
if (i % 2 != 0 && this.tickCount > 1) {
@@ -183,10 +183,10 @@ index 81e69ea2858228942177e54c92b50b2b908bc010..d1458cec0313f7317134e7eb8bdabc31
FrogAi.updateActivity(this);
super.customServerAiStep();
diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
-index 0f3a11203dd0353d74626a273e9003131356f5e1..c83dabddf93249a6477c10725622119c939db4d5 100644
+index 1ee12f16e7013521a288a3160dcc424c4e385204..257687004b03e17cf3f5c0ea4c4cfeb7f34033e4 100644
--- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
+++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
-@@ -77,8 +77,10 @@ public class Tadpole extends AbstractFish {
+@@ -80,8 +80,10 @@ public class Tadpole extends AbstractFish {
return SoundEvents.TADPOLE_FLOP;
}
@@ -260,10 +260,10 @@ index b73bccfcb1b94936f500926a06a28a6a134bbc33..5cad15c512919ce6b0cae9f45e9011dd
super.customServerAiStep();
if ((this.tickCount + this.getId()) % 120 == 0) {
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-index 5a9d567fdcaa02cf91dac889949f4428987f6fdd..e6b5b7c58505f021dc042c2c40733addcf286dcd 100644
+index d88cebe9a348ec99bff05c650d101c80cc38c747..34812d4ab115f31a6ad1cf8cbc345dda4339c075 100644
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-@@ -144,6 +144,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -145,6 +145,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
return holder.is(PoiTypes.MEETING);
});
@@ -272,7 +272,7 @@ index 5a9d567fdcaa02cf91dac889949f4428987f6fdd..e6b5b7c58505f021dc042c2c40733add
public Villager(EntityType extends Villager> entityType, Level world) {
this(entityType, world, VillagerType.PLAINS);
}
-@@ -247,6 +249,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -248,6 +250,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
// Spigot End
@@ -280,7 +280,7 @@ index 5a9d567fdcaa02cf91dac889949f4428987f6fdd..e6b5b7c58505f021dc042c2c40733add
@Override
@Deprecated // Paper
protected void customServerAiStep() {
-@@ -255,7 +258,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -256,7 +259,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
protected void customServerAiStep(final boolean inactive) {
// Paper end
diff --git a/patches/server/0008-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch b/patches/server/0008-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch
index 9e5dde50..aae6cf6a 100644
--- a/patches/server/0008-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch
+++ b/patches/server/0008-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch
@@ -7,10 +7,10 @@ Original license: GPL v3
Original project: https://github.com/pufferfish-gg/Pufferfish
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index b7d2d19f029c6fdc6091c9f60278a528885e17f8..11b1b96201af3ef4e88150411bcd9b95e75b3bfa 100644
+index 43beb25bb42f19832da83f6f7f022cb5c85830c1..1c729ea3e40b12ddb95294c666f1568bd69ce4c0 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
-@@ -223,11 +223,13 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -224,11 +224,13 @@ public abstract class Mob extends LivingEntity implements Targeting {
return this.lookControl;
}
diff --git a/patches/server/0009-Pufferfish-Entity-TTL.patch b/patches/server/0009-Pufferfish-Entity-TTL.patch
index 9db83094..f62c375e 100644
--- a/patches/server/0009-Pufferfish-Entity-TTL.patch
+++ b/patches/server/0009-Pufferfish-Entity-TTL.patch
@@ -7,16 +7,16 @@ Original license: GPL v3
Original project: https://github.com/pufferfish-gg/Pufferfish
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 68b256e6b3086127ba440f348bcd9d5926e029af..3f3ae7439bd2796870e7cdffa37b097d9c54cfd2 100644
+index 1482310673c2c2ac9180ea80a96c24d4094e11c9..f146fb4a599d36e0a9492936312e609cbbfed641 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -814,6 +814,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -827,6 +827,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public void tick() {
+ // Pufferfish start - entity TTL
+ if (type != EntityType.PLAYER && type.ttl >= 0 && this.tickCount >= type.ttl) {
-+ discard();
++ discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); // Purpur
+ return;
+ }
+ // Pufferfish end - entity TTL
diff --git a/patches/server/0010-Purpur-Server-Changes.patch b/patches/server/0010-Purpur-Server-Changes.patch
index e021b311..747fc9d1 100644
--- a/patches/server/0010-Purpur-Server-Changes.patch
+++ b/patches/server/0010-Purpur-Server-Changes.patch
@@ -6,12 +6,12 @@ Subject: [PATCH] Purpur Server Changes
Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
-Commit: 9cd8eb4fcbf703f1098ceb8be29830fd11a7a32f
+Commit: 642956fe6151a87488d861ccb98e4d46d355d599
Patches below are removed in this patch:
Metrics change in Purpur-config-files.patch
Brand change in Rebrand.patch
-Fix-pufferfish-issues.patch
+some code in Fix-pufferfish-issues.patch
Fix-decompile-errors.patch
Alternative-Keepalive-Handling.patch
Logger-settings-suppressing-pointless-logs.patch
@@ -30,7 +30,7 @@ MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch
Fire-Immunity-API.patch
diff --git a/build.gradle.kts b/build.gradle.kts
-index 58dceb971983db152b77932d4d6ac9cffceddfec..a850f63770e46293c0efe3ac03583bfcbc0ed946 100644
+index 6fbaa00e7bf665bab2c54e7b4c3e68a5cf14533d..54372661e263807e717e5cfdc395311486bbeaa5 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -66,6 +66,12 @@ dependencies {
@@ -46,7 +46,7 @@ index 58dceb971983db152b77932d4d6ac9cffceddfec..a850f63770e46293c0efe3ac03583bfc
testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
testImplementation("org.hamcrest:hamcrest:2.2")
-@@ -181,7 +187,7 @@ fun TaskContainer.registerRunTask(
+@@ -182,7 +188,7 @@ fun TaskContainer.registerRunTask(
name: String,
block: JavaExec.() -> Unit
): TaskProvider = register(name) {
@@ -1168,7 +1168,7 @@ index 04249a147f2c0a41499d1149a1f9749689074232..515e3f444e317de1d82421ad414c1ac1
public ServerEntity(ServerLevel worldserver, Entity entity, int i, boolean flag, Consumer> consumer, Set trackedPlayers) {
this.trackedPlayers = trackedPlayers;
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 98e666c69b51f7b4fec040b7abd9667d293c9ccb..a6a9a425aecdd58a65a926a22cd44f7a5c711007 100644
+index 1fe45a264032047c67d84ab387e230af2f0eff20..0c376236d0cbc6033865f25db592c42a0d3d30d7 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -214,6 +214,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1231,6 +1231,15 @@ index 98e666c69b51f7b4fec040b7abd9667d293c9ccb..a6a9a425aecdd58a65a926a22cd44f7a
// CraftBukkit start
j = this.levelData.getDayTime() + 24000L;
TimeSkipEvent event = new TimeSkipEvent(this.getWorld(), TimeSkipEvent.SkipReason.NIGHT_SKIP, (j - j % 24000L) - this.getDayTime());
+@@ -907,7 +928,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
+ final String msg = String.format("Entity threw exception at %s:%s,%s,%s", entity.level().getWorld().getName(), entity.getX(), entity.getY(), entity.getZ());
+ MinecraftServer.LOGGER.error(msg, throwable);
+ getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, throwable)));
+- entity.discard();
++ entity.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); // Purpur
+ // Paper end
+ }
+ // Gale end - Airplane - remove lambda from ticking guard - copied from guardEntityTick
@@ -938,6 +959,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.serverLevelData.setGameTime(i);
this.serverLevelData.getScheduledEvents().tick(this.server, i);
@@ -1696,7 +1705,7 @@ index d791c2f2facfc46d8664225c8b28f95f92df3413..61cd58a5bb3d228b29b9cc4db11be03d
try {
String channels = payload.toString(com.google.common.base.Charsets.UTF_8);
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index d8f012cb6b75384a042405f1903d9cd4858d6e94..a2a086dfd338574324368aa97a4297f899759101 100644
+index e71dfe3db4a2cf616d91c987a38da1509f379c88..fc57aad909a843a7ebd8490f125b424872f71ed5 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -335,6 +335,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
@@ -1926,7 +1935,7 @@ index d8f012cb6b75384a042405f1903d9cd4858d6e94..a2a086dfd338574324368aa97a4297f8
org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack, enumhand);
cancelled = event.useItemInHand() == Event.Result.DENY;
} else {
-@@ -2724,6 +2793,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -2728,6 +2797,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
AABB axisalignedbb = entity.getBoundingBox();
if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.getMaxInteractionDistanceSquared(this.player.level())) { // Gale - make max interaction distance configurable
@@ -1934,7 +1943,7 @@ index d8f012cb6b75384a042405f1903d9cd4858d6e94..a2a086dfd338574324368aa97a4297f8
packet.dispatch(new ServerboundInteractPacket.Handler() {
private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit
ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand);
-@@ -2737,6 +2807,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -2741,6 +2811,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event);
@@ -1943,7 +1952,7 @@ index d8f012cb6b75384a042405f1903d9cd4858d6e94..a2a086dfd338574324368aa97a4297f8
// Entity in bucket - SPIGOT-4048 and SPIGOT-6859a
if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) {
entity.getEntityData().resendPossiblyDesyncedEntity(player); // Paper - The entire mob gets deleted, so resend it.
-@@ -3311,6 +3383,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+@@ -3315,6 +3387,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
}
}
}
@@ -1970,10 +1979,10 @@ index e072edfb1f51f3e219e6deb10b19b4b2502ea87f..4bd1d7c4328e13ae3e173836ced22125
}
} catch (AuthenticationUnavailableException authenticationunavailableexception) {
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index a7949710cf082f8cbbe7ccd3c943ead2fe73e1ea..5748ada42d5039e8f2999f1ca0a74067a1dad08f 100644
+index 893e034895d7f49662720c4f76b2c37f70199e76..3c6002e33d1b86b60ccfa11ef615aa8f7adaf81b 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -502,6 +502,7 @@ public abstract class PlayerList {
+@@ -503,6 +503,7 @@ public abstract class PlayerList {
scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam);
}
// Paper end - Configurable player collision
@@ -1981,7 +1990,7 @@ index a7949710cf082f8cbbe7ccd3c943ead2fe73e1ea..5748ada42d5039e8f2999f1ca0a74067
if (GaleGlobalConfiguration.get().logToConsole.playerLoginLocations) { // Gale - JettPack - make logging login location configurable
PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), s1, player.getId(), worldserver1.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ());
// Gale start - JettPack - make logging login location configurable
-@@ -620,6 +621,7 @@ public abstract class PlayerList {
+@@ -621,6 +622,7 @@ public abstract class PlayerList {
}
public net.kyori.adventure.text.Component remove(ServerPlayer entityplayer, net.kyori.adventure.text.Component leaveMessage) {
// Paper end - Fix kick event leave message not being sent
@@ -1989,7 +1998,7 @@ index a7949710cf082f8cbbe7ccd3c943ead2fe73e1ea..5748ada42d5039e8f2999f1ca0a74067
ServerLevel worldserver = entityplayer.serverLevel();
entityplayer.awardStat(Stats.LEAVE_GAME);
-@@ -775,7 +777,7 @@ public abstract class PlayerList {
+@@ -776,7 +778,7 @@ public abstract class PlayerList {
event.disallow(PlayerLoginEvent.Result.KICK_BANNED, io.papermc.paper.adventure.PaperAdventure.asAdventure(ichatmutablecomponent)); // Paper - Adventure
} else {
// return this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameprofile) ? IChatBaseComponent.translatable("multiplayer.disconnect.server_full") : null;
@@ -1998,7 +2007,7 @@ index a7949710cf082f8cbbe7ccd3c943ead2fe73e1ea..5748ada42d5039e8f2999f1ca0a74067
event.disallow(PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure
}
}
-@@ -1127,6 +1129,20 @@ public abstract class PlayerList {
+@@ -1128,6 +1130,20 @@ public abstract class PlayerList {
}
// CraftBukkit end
@@ -2019,7 +2028,7 @@ index a7949710cf082f8cbbe7ccd3c943ead2fe73e1ea..5748ada42d5039e8f2999f1ca0a74067
public void broadcastAll(Packet> packet, ResourceKey dimension) {
Iterator iterator = this.players.iterator();
-@@ -1230,6 +1246,7 @@ public abstract class PlayerList {
+@@ -1231,6 +1247,7 @@ public abstract class PlayerList {
} else {
b0 = (byte) (24 + permissionLevel);
}
@@ -2027,7 +2036,7 @@ index a7949710cf082f8cbbe7ccd3c943ead2fe73e1ea..5748ada42d5039e8f2999f1ca0a74067
player.connection.send(new ClientboundEntityEventPacket(player, b0));
}
-@@ -1238,6 +1255,27 @@ public abstract class PlayerList {
+@@ -1239,6 +1256,27 @@ public abstract class PlayerList {
player.getBukkitEntity().recalculatePermissions(); // CraftBukkit
this.server.getCommands().sendCommands(player);
} // Paper - Add sendOpLevel API
@@ -2442,10 +2451,10 @@ index 1f9e0c139988c4c44a26552881647d36965aa4fa..b8d612d22aca74a08b53393c0723a2ae
@Override
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee85862930d6abf0e 100644
+index f146fb4a599d36e0a9492936312e609cbbfed641..679209274fbbf8e10498ecec852b0994af2a39e7 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -159,7 +159,7 @@ import org.bukkit.plugin.PluginManager;
+@@ -160,7 +160,7 @@ import org.bukkit.plugin.PluginManager;
// CraftBukkit end
public abstract class Entity implements Nameable, EntityAccess, CommandSource, ScoreHolder {
@@ -2454,7 +2463,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
// CraftBukkit start
private static final int CURRENT_LEVEL = 2;
public boolean preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported; keep initial motion on first setPositionRotation
-@@ -337,7 +337,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -338,7 +338,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
public double xOld;
public double yOld;
public double zOld;
@@ -2463,7 +2472,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
public boolean noPhysics;
public final RandomSource random;
public int tickCount;
-@@ -379,7 +379,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -380,7 +380,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
private final Set tags;
private final double[] pistonDeltas;
private long pistonDeltasGameTime;
@@ -2472,7 +2481,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
private float eyeHeight;
public boolean isInPowderSnow;
public boolean wasInPowderSnow;
-@@ -561,6 +561,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -562,6 +562,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return false;
}
@@ -2498,7 +2507,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
public final boolean hardCollides() {
return this.hardCollides;
}
-@@ -581,7 +600,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -582,7 +601,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.bb = Entity.INITIAL_AABB;
this.stuckSpeedMultiplier = Vec3.ZERO;
this.nextStep = 1.0F;
@@ -2507,7 +2516,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
this.remainingFireTicks = -this.getFireImmuneTicks();
this.fluidHeight = new Object2DoubleArrayMap(2);
this.fluidOnEyes = new HashSet();
-@@ -907,10 +926,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -920,10 +939,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
public void checkBelowWorld() {
// Paper start - Configurable nether ceiling damage
@@ -2520,7 +2529,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
this.onBelowWorld();
}
-@@ -1883,7 +1903,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -1896,7 +1916,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return this.isInWater() || flag;
}
@@ -2529,7 +2538,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
Entity entity = this.getVehicle();
if (entity instanceof Boat) {
-@@ -3034,6 +3054,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3050,6 +3070,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.passengers = ImmutableList.copyOf(list);
}
@@ -2543,7 +2552,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
this.gameEvent(GameEvent.ENTITY_MOUNT, passenger);
}
}
-@@ -3073,6 +3100,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3089,6 +3116,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return false;
}
// CraftBukkit end
@@ -2558,7 +2567,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
if (this.passengers.size() == 1 && this.passengers.get(0) == entity) {
this.passengers = ImmutableList.of();
} else {
-@@ -3152,12 +3187,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3168,12 +3203,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return Vec3.directionFromRotation(this.getRotationVector());
}
@@ -2575,16 +2584,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
}
this.isInsidePortal = true;
-@@ -3206,7 +3244,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
- }
-
- this.processPortalCooldown();
-- this.tickEndPortal(); // Paper - make end portalling safe
-+ if (this.level().purpurConfig.endPortalSafeTeleporting) this.tickEndPortal(); // Paper - make end portalling safe // Purpur
- }
- }
-
-@@ -3396,7 +3434,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3412,7 +3450,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public int getMaxAirSupply() {
@@ -2593,7 +2593,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
}
public int getAirSupply() {
-@@ -3861,7 +3899,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -3877,7 +3915,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
public boolean canChangeDimensions() {
@@ -2602,7 +2602,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
}
public float getBlockExplosionResistance(Explosion explosion, BlockGetter world, BlockPos pos, BlockState blockState, FluidState fluidState, float max) {
-@@ -4164,6 +4202,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4180,6 +4218,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return SlotAccess.NULL;
}
@@ -2623,7 +2623,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
@Override
public void sendSystemMessage(Component message) {}
-@@ -4441,6 +4493,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -4457,6 +4509,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
this.yRotO = this.getYRot();
}
@@ -2636,7 +2636,7 @@ index 3f3ae7439bd2796870e7cdffa37b097d9c54cfd2..6c70002119d40a0074319d2ee8586293
public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) {
if (false && this.touchingUnloadedChunk()) { // Gale - Airplane - reduce entity fluid lookups if no fluids - cost of a lookup here is the same cost as below, so skip
return false;
-@@ -5011,4 +5069,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -5035,4 +5093,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return ((net.minecraft.server.level.ServerChunkCache) level.getChunkSource()).isPositionTicking(this);
}
// Paper end - Expose entity id counter
@@ -2755,10 +2755,10 @@ index dc11683ee4d8a6b7a1c42bcae36dc6e8105cd994..a9e2a758669550530eb29475ba99fe42
}
diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
-index e814b2ef2577f032d6760de2f798d4fe18c67d0c..626a100bf1099a87a76eae72e2105c2ee21d34fe 100644
+index 36422fb394a158f36c84ba0ee03cc704956c91b2..9a3210e34decb4096533c58f36687e31330198c4 100644
--- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
+++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
-@@ -313,7 +313,7 @@ public class ExperienceOrb extends Entity {
+@@ -314,7 +314,7 @@ public class ExperienceOrb extends Entity {
public void playerTouch(Player player) {
if (!this.level().isClientSide) {
if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent
@@ -2767,7 +2767,7 @@ index e814b2ef2577f032d6760de2f798d4fe18c67d0c..626a100bf1099a87a76eae72e2105c2e
player.take(this, 1);
int i = this.repairPlayerItems(player, this.value);
-@@ -331,7 +331,7 @@ public class ExperienceOrb extends Entity {
+@@ -332,7 +332,7 @@ public class ExperienceOrb extends Entity {
}
private int repairPlayerItems(Player player, int amount) {
@@ -2776,7 +2776,7 @@ index e814b2ef2577f032d6760de2f798d4fe18c67d0c..626a100bf1099a87a76eae72e2105c2e
if (entry != null) {
ItemStack itemstack = (ItemStack) entry.getValue();
-@@ -359,13 +359,15 @@ public class ExperienceOrb extends Entity {
+@@ -360,13 +360,15 @@ public class ExperienceOrb extends Entity {
}
}
@@ -2839,10 +2839,10 @@ index 1bb8b6e91c44cd13411d96d749fa64835c75a267..b18cbe85330e26de6f6cbfcc3d51a741
protected ParticleOptions getInkParticle() {
return ParticleTypes.GLOW_SQUID_INK;
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253293d2d96 100644
+index 9e49ccc50ddd23c974dd0b82da538f8113820c84..dccb8934428b0c29e35f2bf9968fd32443dc11eb 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-@@ -217,9 +217,9 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -218,9 +218,9 @@ public abstract class LivingEntity extends Entity implements Attackable {
protected int deathScore;
public float lastHurt;
public boolean jumping;
@@ -2855,7 +2855,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
protected int lerpSteps;
protected double lerpX;
protected double lerpY;
-@@ -252,6 +252,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -253,6 +253,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
protected boolean skipDropExperience;
// CraftBukkit start
public int expToDrop;
@@ -2863,7 +2863,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
public boolean forceDrops;
public ArrayList drops = new ArrayList<>(); // Paper - Restore vanilla drops behavior
public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes;
-@@ -261,6 +262,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -262,6 +263,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
public org.bukkit.craftbukkit.entity.CraftLivingEntity getBukkitLivingEntity() { return (org.bukkit.craftbukkit.entity.CraftLivingEntity) super.getBukkitEntity(); } // Paper
public boolean silentDeath = false; // Paper - mark entity as dying silently for cancellable death event
public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
@@ -2871,7 +2871,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
@Override
public float getBukkitYaw() {
-@@ -285,7 +287,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -286,7 +288,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.effectsDirty = true;
this.useItem = ItemStack.EMPTY;
this.lastClimbablePos = Optional.empty();
@@ -2881,7 +2881,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
this.craftAttributes = new CraftAttributeMap(this.attributes); // CraftBukkit
// CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor
this.entityData.set(LivingEntity.DATA_HEALTH_ID, (float) this.getAttribute(Attributes.MAX_HEALTH).getValue());
-@@ -301,6 +304,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -302,6 +305,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.brain = this.makeBrain(new Dynamic(dynamicopsnbt, (Tag) dynamicopsnbt.createMap((Map) ImmutableMap.of(dynamicopsnbt.createString("memories"), (Tag) dynamicopsnbt.emptyMap()))));
}
@@ -2890,7 +2890,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
public Brain> getBrain() {
return this.brain;
}
-@@ -336,6 +341,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -337,6 +342,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
public static AttributeSupplier.Builder createLivingAttributes() {
return AttributeSupplier.builder().add(Attributes.MAX_HEALTH).add(Attributes.KNOCKBACK_RESISTANCE).add(Attributes.MOVEMENT_SPEED).add(Attributes.ARMOR).add(Attributes.ARMOR_TOUGHNESS).add(Attributes.MAX_ABSORPTION);
}
@@ -2898,7 +2898,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
@Override
protected void checkFallDamage(double heightDifference, boolean onGround, BlockState state, BlockPos landedPosition) {
-@@ -348,7 +354,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -349,7 +355,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.tryAddSoulSpeed();
}
@@ -2907,7 +2907,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
double d1 = this.getX();
double d2 = this.getY();
double d3 = this.getZ();
-@@ -363,7 +369,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -364,7 +370,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
d3 = (double) landedPosition.getZ() + 0.5D + d5 / d6 * 0.5D;
}
@@ -2916,7 +2916,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
double d7 = Math.min((double) (0.2F + f / 15.0F), 2.5D);
int i = (int) (150.0D * d7);
-@@ -423,6 +429,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -424,6 +430,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
double d1 = this.level().getWorldBorder().getDamagePerBlock();
if (d1 > 0.0D) {
@@ -2924,7 +2924,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
this.hurt(this.damageSources().outOfBorder(), (float) Math.max(1, Mth.floor(-d0 * d1)));
}
}
-@@ -434,7 +441,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -435,7 +442,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
if (flag1) {
this.setAirSupply(this.decreaseAirSupply(this.getAirSupply()));
@@ -2933,7 +2933,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
this.setAirSupply(0);
Vec3 vec3d = this.getDeltaMovement();
-@@ -446,7 +453,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -447,7 +454,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.level().addParticle(ParticleTypes.BUBBLE, this.getX() + d2, this.getY() + d3, this.getZ() + d4, vec3d.x, vec3d.y, vec3d.z);
}
@@ -2942,7 +2942,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
}
}
-@@ -796,6 +803,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -804,6 +811,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
dataresult.resultOrPartial(logger::error).ifPresent((nbtbase) -> {
nbt.put("Brain", nbtbase);
});
@@ -2950,7 +2950,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
}
@Override
-@@ -882,6 +890,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -890,6 +898,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.brain = this.makeBrain(new Dynamic(NbtOps.INSTANCE, nbt.get("Brain")));
}
@@ -2962,7 +2962,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
}
// CraftBukkit start
-@@ -1025,10 +1038,31 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -1033,10 +1046,31 @@ public abstract class LivingEntity extends Entity implements Attackable {
if (entity != null) {
EntityType> entitytypes = entity.getType();
@@ -2996,7 +2996,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
}
return d0;
-@@ -1088,6 +1122,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -1096,6 +1130,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
for (flag = false; iterator.hasNext(); flag = true) {
// CraftBukkit start
MobEffectInstance effect = (MobEffectInstance) iterator.next();
@@ -3004,7 +3004,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED);
if (event.isCancelled()) {
continue;
-@@ -1506,13 +1541,13 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -1514,13 +1549,13 @@ public abstract class LivingEntity extends Entity implements Attackable {
if (entity1 instanceof net.minecraft.world.entity.player.Player) {
net.minecraft.world.entity.player.Player entityhuman = (net.minecraft.world.entity.player.Player) entity1;
@@ -3020,7 +3020,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
LivingEntity entityliving2 = entitywolf.getOwner();
if (entityliving2 instanceof net.minecraft.world.entity.player.Player) {
-@@ -1620,6 +1655,18 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -1628,6 +1663,18 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
}
@@ -3039,7 +3039,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
org.bukkit.inventory.EquipmentSlot handSlot = (hand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand) : null;
EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot);
event.setCancelled(itemstack == null);
-@@ -1786,7 +1833,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -1794,7 +1841,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
boolean flag = false;
if (this.dead && adversary instanceof WitherBoss) { // Paper
@@ -3048,7 +3048,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
BlockPos blockposition = this.blockPosition();
BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState();
-@@ -1832,6 +1879,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -1840,6 +1887,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.dropEquipment(); // CraftBukkit - from below
if (this.shouldDropLoot() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) {
@@ -3056,7 +3056,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
this.dropFromLootTable(source, flag);
// Paper start
final boolean prev = this.clearEquipmentSlots;
-@@ -1840,6 +1888,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -1848,6 +1896,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
// Paper end
this.dropCustomDeathLoot(source, i, flag);
this.clearEquipmentSlots = prev; // Paper
@@ -3064,7 +3064,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
}
// CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment
org.bukkit.event.entity.EntityDeathEvent deathEvent = CraftEventFactory.callEntityDeathEvent(this, this.drops, () -> {
-@@ -2123,7 +2172,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -2131,7 +2180,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
MobEffectInstance mobeffect = this.getEffect(MobEffects.JUMP);
float f2 = mobeffect == null ? 0.0F : (float) (mobeffect.getAmplifier() + 1);
@@ -3073,7 +3073,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
}
}
-@@ -2346,6 +2395,20 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -2354,6 +2403,20 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
}
@@ -3094,7 +3094,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
if (f > 0 || !human) {
if (human) {
// PAIL: Be sure to drag all this code from the EntityHuman subclass each update.
-@@ -2566,7 +2629,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -2574,7 +2637,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@Override
protected void onBelowWorld() {
@@ -3103,7 +3103,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
}
protected void updateSwingTime() {
-@@ -2760,7 +2823,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -2768,7 +2831,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
protected long lastJumpTime = 0L; // Paper - Prevent excessive velocity through repeated crits
@@ -3112,7 +3112,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
Vec3 vec3d = this.getDeltaMovement();
// Paper start - Prevent excessive velocity through repeated crits
long time = System.nanoTime();
-@@ -2912,6 +2975,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -2920,6 +2983,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
if (f3 > 0.0F) {
this.playSound(this.getFallDamageSound((int) f3), 1.0F, 1.0F);
@@ -3120,7 +3120,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
this.hurt(this.damageSources().flyIntoWall(), f3);
}
}
-@@ -3522,8 +3586,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3530,8 +3594,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.pushEntities();
// Paper start - Add EntityMoveEvent
@@ -3133,7 +3133,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO);
Location to = new Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot());
io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent(this.getBukkitLivingEntity(), from, to.clone());
-@@ -3533,12 +3599,48 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3541,12 +3607,48 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.absMoveTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch());
}
}
@@ -3182,7 +3182,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
}
public boolean isSensitiveToWater() {
-@@ -3559,7 +3661,16 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -3567,7 +3669,16 @@ public abstract class LivingEntity extends Entity implements Attackable {
int j = i / 10;
if (j % 2 == 0) {
@@ -3201,7 +3201,7 @@ index 4f749c3634b63926a7672716481ae5a650040ab2..f70f58937eedd69ebb46fefb367ab253
});
}
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf06c67e3a 100644
+index 1c729ea3e40b12ddb95294c666f1568bd69ce4c0..70b5f3ce8d94765e84215015dd0c268f783990c9 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -66,6 +66,7 @@ import net.minecraft.world.item.ProjectileWeaponItem;
@@ -3212,7 +3212,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.Level;
-@@ -135,6 +136,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -136,6 +137,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
private BlockPos restrictCenter;
private float restrictRadius;
@@ -3220,7 +3220,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
public boolean aware = true; // CraftBukkit
protected Mob(EntityType extends Mob> type, Level world) {
-@@ -150,8 +152,8 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -151,8 +153,8 @@ public abstract class Mob extends LivingEntity implements Targeting {
this.goalSelector = new GoalSelector();
this.targetSelector = new GoalSelector();
// Gale end - Purpur - remove vanilla profiler
@@ -3231,7 +3231,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
this.jumpControl = new JumpControl(this);
this.bodyRotationControl = this.createBodyControl();
this.navigation = this.createNavigation(world);
-@@ -326,6 +328,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -327,6 +329,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
entityliving = null;
}
}
@@ -3239,7 +3239,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
this.target = entityliving;
return true;
// CraftBukkit end
-@@ -370,8 +373,28 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -371,8 +374,28 @@ public abstract class Mob extends LivingEntity implements Targeting {
this.resetAmbientSoundTime();
this.playAmbientSound();
}
@@ -3260,7 +3260,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
+ return; // mob persistent
+ }
+ if (this.ticksSinceLastInteraction > this.level().purpurConfig.entityLifeSpan) {
-+ this.discard();
++ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD);
+ }
+ }
+ // Purpur end
@@ -3268,7 +3268,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
@Override
protected void playHurtSound(DamageSource source) {
this.resetAmbientSoundTime();
-@@ -561,6 +584,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -562,6 +585,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
}
nbt.putBoolean("Bukkit.Aware", this.aware); // CraftBukkit
@@ -3276,7 +3276,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
}
@Override
-@@ -631,6 +655,11 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -632,6 +656,11 @@ public abstract class Mob extends LivingEntity implements Targeting {
this.aware = nbt.getBoolean("Bukkit.Aware");
}
// CraftBukkit end
@@ -3288,7 +3288,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
}
@Override
-@@ -674,7 +703,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -675,7 +704,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
@Override
public void aiStep() {
super.aiStep();
@@ -3297,7 +3297,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
Vec3i baseblockposition = this.getPickupReach();
List list = this.level().getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ()));
Iterator iterator = list.iterator();
-@@ -1158,6 +1187,12 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -1159,6 +1188,12 @@ public abstract class Mob extends LivingEntity implements Targeting {
}
@@ -3310,7 +3310,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
@Nullable
public static Item getEquipmentForSlot(EquipmentSlot equipmentSlot, int equipmentLevel) {
switch (equipmentSlot) {
-@@ -1252,7 +1287,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -1253,7 +1288,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));
@@ -3319,7 +3319,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
this.setLeftHanded(true);
} else {
this.setLeftHanded(false);
-@@ -1300,6 +1335,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -1301,6 +1336,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
if (!this.isAlive()) {
return InteractionResult.PASS;
} else if (this.getLeashHolder() == player) {
@@ -3327,7 +3327,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
// CraftBukkit start - fire PlayerUnleashEntityEvent
// Paper start - Expand EntityUnleashEvent
org.bukkit.event.player.PlayerUnleashEntityEvent event = CraftEventFactory.callPlayerUnleashEntityEvent(this, player, hand, !player.getAbilities().instabuild);
-@@ -1373,7 +1409,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -1374,7 +1410,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
protected void onOffspringSpawnedFromEgg(Player player, Mob child) {}
protected InteractionResult mobInteract(Player player, InteractionHand hand) {
@@ -3336,7 +3336,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
}
public boolean isWithinRestriction() {
-@@ -1684,6 +1720,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -1685,6 +1721,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
this.setLastHurtMob(target);
}
@@ -3344,7 +3344,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
return flag;
}
-@@ -1709,28 +1746,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -1710,28 +1747,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
// Gale end - JettPack - optimize sun burn tick - cache eye blockpos
public boolean isSunBurnTick() {
@@ -3374,7 +3374,7 @@ index 11b1b96201af3ef4e88150411bcd9b95e75b3bfa..2f06a3226f05797d6e2427e444a568bf
}
@Override
-@@ -1778,4 +1794,56 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -1779,4 +1795,56 @@ public abstract class Mob extends LivingEntity implements Targeting {
return itemmonsteregg == null ? null : new ItemStack(itemmonsteregg);
}
@@ -4610,7 +4610,7 @@ index 824e5e4fe7619ae46061c3c978c9a044db8c84ab..f0b6118a9995bb41836685bbf94d2e7f
public ItemStack getBucketItemStack() {
return new ItemStack(Items.COD_BUCKET);
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 3cdd9f379c7e2d46ea47c9ef55b121c93ec0bb4a..6d00b3cd4a9cb0fc8a9e9c27f37429a25fcf6e9d 100644
+index 3cdd9f379c7e2d46ea47c9ef55b121c93ec0bb4a..be4ccc42d6f598cbaaf39aafbd49b594ac7b06fe 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Cow.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Cow.java
@@ -2,6 +2,7 @@ package net.minecraft.world.entity.animal;
@@ -4790,7 +4790,7 @@ index 3cdd9f379c7e2d46ea47c9ef55b121c93ec0bb4a..6d00b3cd4a9cb0fc8a9e9c27f37429a2
+ return InteractionResult.PASS;
+ }
+ this.level().addFreshEntity(mooshroom);
-+ this.remove(RemovalReason.DISCARDED);
++ this.remove(RemovalReason.DISCARDED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD);
+ if (!player.getAbilities().instabuild) {
+ stack.shrink(1);
+ }
@@ -4804,10 +4804,10 @@ index 3cdd9f379c7e2d46ea47c9ef55b121c93ec0bb4a..6d00b3cd4a9cb0fc8a9e9c27f37429a2
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
-index 178e1e75fcd0e60a1dd2729a894df08cf4129526..3c1fb1c83fc318fc5ad62b02d9204079ff4eeeca 100644
+index 45646c69ea73936a8916756fde37dd3f39db0d04..61bb29de8f1eaa833db95fcc38ab6e18c1a2243c 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
-@@ -82,19 +82,104 @@ public class Dolphin extends WaterAnimal {
+@@ -83,19 +83,104 @@ public class Dolphin extends WaterAnimal {
public static final Predicate ALLOWED_ITEMS = (entityitem) -> {
return !entityitem.hasPickUpDelay() && entityitem.isAlive() && entityitem.isInWater();
};
@@ -4913,7 +4913,7 @@ index 178e1e75fcd0e60a1dd2729a894df08cf4129526..3c1fb1c83fc318fc5ad62b02d9204079
return super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityNbt);
}
-@@ -159,17 +244,21 @@ public class Dolphin extends WaterAnimal {
+@@ -160,17 +245,21 @@ public class Dolphin extends WaterAnimal {
protected void registerGoals() {
this.goalSelector.addGoal(0, new BreathAirGoal(this));
this.goalSelector.addGoal(0, new TryFindWaterGoal(this));
@@ -4936,7 +4936,7 @@ index 178e1e75fcd0e60a1dd2729a894df08cf4129526..3c1fb1c83fc318fc5ad62b02d9204079
}
public static AttributeSupplier.Builder createAttributes() {
-@@ -220,7 +309,7 @@ public class Dolphin extends WaterAnimal {
+@@ -221,7 +310,7 @@ public class Dolphin extends WaterAnimal {
@Override
protected boolean canRide(Entity entity) {
@@ -4945,7 +4945,7 @@ index 178e1e75fcd0e60a1dd2729a894df08cf4129526..3c1fb1c83fc318fc5ad62b02d9204079
}
@Override
-@@ -255,6 +344,11 @@ public class Dolphin extends WaterAnimal {
+@@ -256,6 +345,11 @@ public class Dolphin extends WaterAnimal {
@Override
public void tick() {
super.tick();
@@ -4957,7 +4957,7 @@ index 178e1e75fcd0e60a1dd2729a894df08cf4129526..3c1fb1c83fc318fc5ad62b02d9204079
if (this.isNoAi()) {
this.setAirSupply(this.getMaxAirSupply());
} else {
-@@ -400,6 +494,7 @@ public class Dolphin extends WaterAnimal {
+@@ -401,6 +495,7 @@ public class Dolphin extends WaterAnimal {
@Override
public boolean canUse() {
@@ -4966,7 +4966,7 @@ index 178e1e75fcd0e60a1dd2729a894df08cf4129526..3c1fb1c83fc318fc5ad62b02d9204079
}
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 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0b635fcdb 100644
+index f7a7810fdc2f74b79fa14470493485e4b74539ab..445c1993a18da93e89792b7953e5eb71777c7874 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Fox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Fox.java
@@ -36,6 +36,7 @@ import net.minecraft.util.RandomSource;
@@ -4977,7 +4977,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.Entity;
-@@ -144,6 +145,64 @@ public class Fox extends Animal implements VariantHolder {
+@@ -148,6 +149,64 @@ public class Fox extends Animal implements VariantHolder {
this.setCanPickUpLoot(true);
}
@@ -5042,7 +5042,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
@Override
protected void defineSynchedData() {
super.defineSynchedData();
-@@ -163,6 +222,7 @@ public class Fox extends Animal implements VariantHolder {
+@@ -167,6 +226,7 @@ public class Fox extends Animal implements VariantHolder {
return entityliving instanceof AbstractSchoolingFish;
});
this.goalSelector.addGoal(0, new Fox.FoxFloatGoal());
@@ -5050,7 +5050,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
this.goalSelector.addGoal(0, new ClimbOnTopOfPowderSnowGoal(this, this.level()));
this.goalSelector.addGoal(1, new Fox.FaceplantGoal());
this.goalSelector.addGoal(2, new Fox.FoxPanicGoal(2.2D));
-@@ -189,6 +249,7 @@ public class Fox extends Animal implements VariantHolder {
+@@ -193,6 +253,7 @@ public class Fox extends Animal implements VariantHolder {
this.goalSelector.addGoal(11, new Fox.FoxSearchForItemsGoal());
this.goalSelector.addGoal(12, new Fox.FoxLookAtPlayerGoal(this, Player.class, 24.0F));
this.goalSelector.addGoal(13, new Fox.PerchAndSearchGoal());
@@ -5058,7 +5058,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
this.targetSelector.addGoal(3, new Fox.DefendTrustedTargetGoal(LivingEntity.class, false, false, (entityliving) -> {
return Fox.TRUSTED_TARGET_SELECTOR.test(entityliving) && !this.trusts(entityliving.getUUID());
}));
-@@ -345,6 +406,11 @@ public class Fox extends Animal implements VariantHolder {
+@@ -349,6 +410,11 @@ public class Fox extends Animal implements VariantHolder {
}
private void setTargetGoals() {
@@ -5070,7 +5070,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
if (this.getVariant() == Fox.Type.RED) {
this.targetSelector.addGoal(4, this.landTargetGoal);
this.targetSelector.addGoal(4, this.turtleEggTargetGoal);
-@@ -378,6 +444,7 @@ public class Fox extends Animal implements VariantHolder {
+@@ -382,6 +448,7 @@ public class Fox extends Animal implements VariantHolder {
public void setVariant(Fox.Type variant) {
this.entityData.set(Fox.DATA_TYPE_ID, variant.getId());
@@ -5078,7 +5078,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
}
List getTrustedUUIDs() {
-@@ -724,6 +791,29 @@ public class Fox extends Animal implements VariantHolder {
+@@ -728,6 +795,29 @@ public class Fox extends Animal implements VariantHolder {
}
// Paper end
@@ -5108,7 +5108,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
@Override
// Paper start - Cancellable death event
protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(DamageSource source) {
-@@ -781,16 +871,16 @@ public class Fox extends Animal implements VariantHolder {
+@@ -785,16 +875,16 @@ public class Fox extends Animal implements VariantHolder {
return new Vec3(0.0D, (double) (0.55F * this.getEyeHeight()), (double) (this.getBbWidth() * 0.4F));
}
@@ -5128,7 +5128,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
}
}
-@@ -801,16 +891,16 @@ public class Fox extends Animal implements VariantHolder {
+@@ -805,16 +895,16 @@ public class Fox extends Animal implements VariantHolder {
}
}
@@ -5148,7 +5148,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
}
}
-@@ -928,8 +1018,10 @@ public class Fox extends Animal implements VariantHolder {
+@@ -932,8 +1022,10 @@ public class Fox extends Animal implements VariantHolder {
CriteriaTriggers.BRED_ANIMALS.trigger(entityplayer2, this.animal, this.partner, entityfox);
}
@@ -5161,7 +5161,7 @@ index 12b49510deb0494c4a70b63679f8818960f2af06..a8c54a3dcba027b3fb013b143c3f77d0
this.animal.resetLove();
this.partner.resetLove();
worldserver.addFreshEntityWithPassengers(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
-@@ -1315,7 +1407,7 @@ public class Fox extends Animal implements VariantHolder {
+@@ -1319,7 +1411,7 @@ public class Fox extends Animal implements VariantHolder {
}
protected void onReachedTarget() {
@@ -5283,10 +5283,10 @@ index 6cfe0d6c46caa122db107c607d27a2bdcd82f7a8..442eb602f5c82550a87e218e2013171b
}
}
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 63ddc9ebd1812239459d485cdf8ee048e5694334..caff8770f9c84efb2934a0cc6df65ebe0155e20b 100644
+index 6659abb4ab8a13a48c154d2e3f273eb13b202e7f..560981601c6a43fee99372eafd7bd746798845a6 100644
--- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
+++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
-@@ -63,6 +63,43 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder> optional = this.getEffectsFromItemStack(itemstack);
if (optional.isEmpty()) {
@@ -5353,7 +5353,7 @@ index 63ddc9ebd1812239459d485cdf8ee048e5694334..caff8770f9c84efb2934a0cc6df65ebe
}
if (!player.getAbilities().instabuild) {
-@@ -175,13 +212,13 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder>> SENSOR_TYPES = ImmutableList.of(SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_PLAYERS, SensorType.HURT_BY, SensorType.FROG_TEMPTATIONS);
protected static final ImmutableList> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.LOOK_TARGET, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.PATH, MemoryModuleType.NEAREST_VISIBLE_ADULT, MemoryModuleType.TEMPTATION_COOLDOWN_TICKS, MemoryModuleType.IS_TEMPTED, MemoryModuleType.TEMPTING_PLAYER, MemoryModuleType.BREED_TARGET, MemoryModuleType.IS_PANICKING);
public boolean ageLocked; // Paper
@@ -7317,7 +7317,7 @@ index c83dabddf93249a6477c10725622119c939db4d5..b2a92648490ac54cd6ecc3bbfb9740db
@Override
protected PathNavigation createNavigation(Level world) {
return new WaterBoundPathNavigation(this, world);
-@@ -80,8 +117,8 @@ public class Tadpole extends AbstractFish {
+@@ -83,8 +120,8 @@ public class Tadpole extends AbstractFish {
private int behaviorTick = 0; // Pufferfish
@Override
protected void customServerAiStep() {
@@ -7762,10 +7762,10 @@ index a6601f70890f90691923c0e6a9f10ea597ccabc2..42dcdbec69b052679e590a1ff932c619
protected SoundEvent getAmbientSound() {
return SoundEvents.MULE_AMBIENT;
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java
-index 41596d9c2e8e6c91f77b1bbe3ccf828708b6b970..64f0f486e29e0b63b024dd5c06738e12d0fb5b9a 100644
+index 184f508d19aad46267302a0e17f7cb9bdafce079..41c7e62dfb8cf40958bb98a244d8225690be7341 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/SkeletonHorse.java
-@@ -35,6 +35,43 @@ public class SkeletonHorse extends AbstractHorse {
+@@ -42,6 +42,43 @@ public class SkeletonHorse extends AbstractHorse {
super(type, world);
}
@@ -7807,21 +7807,24 @@ index 41596d9c2e8e6c91f77b1bbe3ccf828708b6b970..64f0f486e29e0b63b024dd5c06738e12
+ }
+
public static AttributeSupplier.Builder createAttributes() {
- return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0D).add(Attributes.MOVEMENT_SPEED, (double)0.2F);
+ return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0D).add(Attributes.MOVEMENT_SPEED, 0.20000000298023224D);
+ }
+@@ -59,7 +96,9 @@ public class SkeletonHorse extends AbstractHorse {
}
-@@ -54,6 +91,7 @@ public class SkeletonHorse extends AbstractHorse {
@Override
- protected void addBehaviourGoals() {
+- protected void addBehaviourGoals() {}
++ protected void addBehaviourGoals() {
+ if (level().purpurConfig.skeletonHorseCanSwim) goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this));
- }
++ }
@Override
+ protected SoundEvent getAmbientSound() {
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java
-index b016f53c6644c6411b3a91e09049892131187179..02e3adc9a55fa9cd2a418094eb206970faaf471b 100644
+index 038de19633002e8f7c4b1ead7438cef0163456ce..c80324d79b74fc620568347289f4e39629162409 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/TraderLlama.java
-@@ -27,6 +27,58 @@ public class TraderLlama extends Llama {
+@@ -30,6 +30,58 @@ public class TraderLlama extends Llama {
super(type, world);
}
@@ -8007,10 +8010,10 @@ index a6f3fba3b02b0b4d2a4e9e5205301c6f52d0188a..4eebfc27ded55e4d764d04f35d3e9c9e
protected void defineSynchedData() {
}
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
-index c99ab157e43fc990549fc06f5b6fb1e227014fde..5f1a643ce6fe4e3aa3026be8b2c961ffdbc5465d 100644
+index 036640d49a5e891e9a0f767abe33f1f51d6d4cde..fcca438db945c1c7327cf3a979de01f07fe453ea 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
-@@ -30,6 +30,12 @@ public class EndCrystal extends Entity {
+@@ -31,6 +31,12 @@ public class EndCrystal extends Entity {
private static final EntityDataAccessor DATA_SHOW_BOTTOM = SynchedEntityData.defineId(EndCrystal.class, EntityDataSerializers.BOOLEAN);
public int time;
public boolean generatedByDragonFight = false; // Paper - Fix invulnerable end crystals
@@ -8023,7 +8026,7 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..5f1a643ce6fe4e3aa3026be8b2c961ff
public EndCrystal(EntityType extends EndCrystal> type, Level world) {
super(type, world);
-@@ -42,6 +48,22 @@ public class EndCrystal extends Entity {
+@@ -43,6 +49,22 @@ public class EndCrystal extends Entity {
this.setPos(x, y, z);
}
@@ -8046,13 +8049,13 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..5f1a643ce6fe4e3aa3026be8b2c961ff
@Override
protected Entity.MovementEmission getMovementEmission() {
return Entity.MovementEmission.NONE;
-@@ -77,9 +99,53 @@ public class EndCrystal extends Entity {
+@@ -78,9 +100,53 @@ public class EndCrystal extends Entity {
}
}
// Paper end - Fix invulnerable end crystals
+ if (this.level().purpurConfig.endCrystalCramming > 0 && this.level().getEntitiesOfClass(EndCrystal.class, getBoundingBox()).size() > this.level().purpurConfig.endCrystalCramming) this.hurt(this.damageSources().cramming(), 6.0F); // Purpur
- }
-
++ }
++
+ // Purpur start
+ if (level().purpurConfig.phantomAttackedByCrystalRadius <= 0 || --idleCooldown > 0) {
+ return; // on cooldown
@@ -8080,7 +8083,7 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..5f1a643ce6fe4e3aa3026be8b2c961ff
+ } else {
+ forgetPhantom(); // attacked long enough
+ }
-+ }
+ }
+ }
+
+ private void attackPhantom(net.minecraft.world.entity.monster.Phantom phantom) {
@@ -8088,7 +8091,7 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..5f1a643ce6fe4e3aa3026be8b2c961ff
+ phantomBeamTicks = 60;
+ targetPhantom = phantom;
+ }
-+
+
+ private void forgetPhantom() {
+ targetPhantom = null;
+ setBeamTarget(null);
@@ -8101,8 +8104,8 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..5f1a643ce6fe4e3aa3026be8b2c961ff
@Override
protected void addAdditionalSaveData(CompoundTag nbt) {
@@ -124,16 +190,18 @@ public class EndCrystal extends Entity {
+ }
// CraftBukkit end
- this.remove(Entity.RemovalReason.KILLED);
if (!source.is(DamageTypeTags.IS_EXPLOSION)) {
+ if (shouldExplode()) {// Purpur
DamageSource damagesource1 = source.getEntity() != null ? this.damageSources().explosion(this, source.getEntity()) : null;
@@ -8111,21 +8114,21 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..5f1a643ce6fe4e3aa3026be8b2c961ff
- ExplosionPrimeEvent event = CraftEventFactory.callExplosionPrimeEvent(this, 6.0F, false);
+ ExplosionPrimeEvent event = CraftEventFactory.callExplosionPrimeEvent(this, getExplosionPower(), hasExplosionFire()); // Purpur
if (event.isCancelled()) {
- this.unsetRemoved();
return false;
}
+
+ this.remove(Entity.RemovalReason.KILLED, EntityRemoveEvent.Cause.EXPLODE); // CraftBukkit - add Bukkit remove cause
- this.level().explode(this, damagesource1, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.BLOCK);
+ this.level().explode(this, damagesource1, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), getExplosionEffect()); // Purpur
- // CraftBukkit end
+ } else this.unsetRemoved(); // Purpur
+ } else {
+ this.remove(Entity.RemovalReason.KILLED, EntityRemoveEvent.Cause.DEATH); // CraftBukkit - add Bukkit remove cause
}
-
- this.onDestroyedBy(source);
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 a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c9c53e32c 100644
+index 1df13af62af7d0bbd92c84d424a07da66bb8583f..ff4b188084d43af9e8ed60e6a77996018e589807 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
-@@ -107,6 +107,7 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -108,6 +108,7 @@ public class EnderDragon extends Mob implements Enemy {
@Nullable
private BlockPos podium;
// Paper end - Allow changing the EnderDragon podium
@@ -8133,7 +8136,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
public EnderDragon(EntityType extends EnderDragon> entitytypes, Level world) {
super(EntityType.ENDER_DRAGON, world);
-@@ -129,6 +130,37 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -130,6 +131,37 @@ public class EnderDragon extends Mob implements Enemy {
this.noCulling = true;
this.phaseManager = new EnderDragonPhaseManager(this);
this.explosionSource = new Explosion(world, this, null, null, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, Explosion.BlockInteraction.DESTROY, ParticleTypes.EXPLOSION, ParticleTypes.EXPLOSION_EMITTER, SoundEvents.GENERIC_EXPLODE); // CraftBukkit
@@ -8171,7 +8174,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
}
public void setDragonFight(EndDragonFight fight) {
-@@ -143,6 +175,27 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -144,6 +176,27 @@ public class EnderDragon extends Mob implements Enemy {
return this.fightOrigin;
}
@@ -8199,7 +8202,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
public static AttributeSupplier.Builder createAttributes() {
return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 200.0D);
}
-@@ -204,6 +257,37 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -205,6 +258,37 @@ public class EnderDragon extends Mob implements Enemy {
@Override
public void aiStep() {
@@ -8237,7 +8240,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
this.processFlappingMovement();
if (this.level().isClientSide) {
this.setHealth(this.getHealth());
-@@ -230,6 +314,8 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -231,6 +315,8 @@ public class EnderDragon extends Mob implements Enemy {
float f;
if (this.isDeadOrDying()) {
@@ -8246,7 +8249,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
float f1 = (this.random.nextFloat() - 0.5F) * 8.0F;
f = (this.random.nextFloat() - 0.5F) * 4.0F;
-@@ -242,9 +328,9 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -243,9 +329,9 @@ public class EnderDragon extends Mob implements Enemy {
f = 0.2F / ((float) vec3d.horizontalDistance() * 10.0F + 1.0F);
f *= (float) Math.pow(2.0D, vec3d.y);
@@ -8258,7 +8261,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
this.flapTime += f * 0.5F;
} else {
this.flapTime += f;
-@@ -278,7 +364,7 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -279,7 +365,7 @@ public class EnderDragon extends Mob implements Enemy {
}
this.phaseManager.getCurrentPhase().doClientTick();
@@ -8267,7 +8270,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
DragonPhaseInstance idragoncontroller = this.phaseManager.getCurrentPhase();
idragoncontroller.doServerTick();
-@@ -347,7 +433,7 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -348,7 +434,7 @@ public class EnderDragon extends Mob implements Enemy {
this.tickPart(this.body, (double) (f11 * 0.5F), 0.0D, (double) (-f12 * 0.5F));
this.tickPart(this.wing1, (double) (f12 * 4.5F), 2.0D, (double) (f11 * 4.5F));
this.tickPart(this.wing2, (double) (f12 * -4.5F), 2.0D, (double) (f11 * -4.5F));
@@ -8276,7 +8279,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
this.knockBack(this.level().getEntities((Entity) this, this.wing1.getBoundingBox().inflate(4.0D, 2.0D, 4.0D).move(0.0D, -2.0D, 0.0D), EntitySelector.NO_CREATIVE_OR_SPECTATOR));
this.knockBack(this.level().getEntities((Entity) this, this.wing2.getBoundingBox().inflate(4.0D, 2.0D, 4.0D).move(0.0D, -2.0D, 0.0D), EntitySelector.NO_CREATIVE_OR_SPECTATOR));
this.hurt(this.level().getEntities((Entity) this, this.head.getBoundingBox().inflate(1.0D), EntitySelector.NO_CREATIVE_OR_SPECTATOR));
-@@ -391,7 +477,7 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -392,7 +478,7 @@ public class EnderDragon extends Mob implements Enemy {
}
if (!this.level().isClientSide) {
@@ -8285,7 +8288,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
if (this.dragonFight != null) {
this.dragonFight.updateDragon(this);
}
-@@ -523,7 +609,7 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -524,7 +610,7 @@ public class EnderDragon extends Mob implements Enemy {
BlockState iblockdata = this.level().getBlockState(blockposition);
if (!iblockdata.isAir() && !iblockdata.is(BlockTags.DRAGON_TRANSPARENT)) {
@@ -8294,7 +8297,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
// CraftBukkit start - Add blocks to list rather than destroying them
// flag1 = this.level().removeBlock(blockposition, false) || flag1;
flag1 = true;
-@@ -667,7 +753,7 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -668,7 +754,7 @@ public class EnderDragon extends Mob implements Enemy {
boolean flag = this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT);
short short0 = 500;
@@ -8303,7 +8306,7 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
short0 = 12000;
}
-@@ -1103,6 +1189,7 @@ public class EnderDragon extends Mob implements Enemy {
+@@ -1104,6 +1190,7 @@ public class EnderDragon extends Mob implements Enemy {
@Override
protected boolean canRide(Entity entity) {
@@ -8312,10 +8315,10 @@ index a86ae40b945b1ecdf42a69d753d0412f39ee3001..54f89e785c2bf24457311aaba01d459c
}
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 ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b54ac6c46e 100644
+index 12440ee2dccc0a697fb403765f2e1b987ccc0283..736845ca1f7c184b89ddb418339ec3ad22c3447f 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
-@@ -84,20 +84,59 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -85,20 +85,59 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
return entityliving.getMobType() != MobType.UNDEAD && entityliving.attackable();
};
private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0D).selector(WitherBoss.LIVING_ENTITY_SELECTOR);
@@ -8376,7 +8379,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
@Override
protected PathNavigation createNavigation(Level world) {
FlyingPathNavigation navigationflying = new FlyingPathNavigation(this, world);
-@@ -108,13 +147,113 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -109,13 +148,113 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
return navigationflying;
}
@@ -8490,7 +8493,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
this.targetSelector.addGoal(1, new HurtByTargetGoal(this, new Class[0]));
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 0, false, false, WitherBoss.LIVING_ENTITY_SELECTOR));
}
-@@ -132,6 +271,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -133,6 +272,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
public void addAdditionalSaveData(CompoundTag nbt) {
super.addAdditionalSaveData(nbt);
nbt.putInt("Invul", this.getInvulnerableTicks());
@@ -8498,7 +8501,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
}
@Override
-@@ -141,6 +281,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -142,6 +282,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
if (this.hasCustomName()) {
this.bossEvent.setName(this.getDisplayName());
}
@@ -8506,7 +8509,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
}
-@@ -256,6 +397,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -257,6 +398,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
@Override
protected void customServerAiStep() {
@@ -8523,7 +8526,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
int i;
if (this.getInvulnerableTicks() > 0) {
-@@ -272,7 +423,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -273,7 +424,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
}
// CraftBukkit end
@@ -8532,7 +8535,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
// CraftBukkit start - Use relative location for far away sounds
// this.level().globalLevelEvent(1023, new BlockPosition(this), 0);
int viewDistance = ((ServerLevel) this.level()).getCraftServer().getViewDistance() * 16;
-@@ -297,7 +448,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -298,7 +449,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
this.setInvulnerableTicks(i);
if (this.tickCount % 10 == 0) {
@@ -8541,7 +8544,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
}
} else {
-@@ -357,7 +508,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -358,7 +509,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
if (this.destroyBlocksTick > 0) {
--this.destroyBlocksTick;
@@ -8550,7 +8553,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
i = Mth.floor(this.getY());
j = Mth.floor(this.getX());
int i1 = Mth.floor(this.getZ());
-@@ -390,8 +541,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -391,8 +542,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
}
}
@@ -8563,7 +8566,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
}
this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth());
-@@ -577,11 +730,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -578,11 +731,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
}
public int getAlternativeTarget(int headIndex) {
@@ -8577,7 +8580,7 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
}
@Override
-@@ -596,6 +749,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
+@@ -597,6 +750,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
@Override
protected boolean canRide(Entity entity) {
@@ -8586,10 +8589,10 @@ index ac9eaeaf7df1e84ee588f371628c0a10784d50bc..0003af3edd5cbef6d871ae9b8631a4b5
}
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 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..0f77af39df048682473950291bed5827ede0e1a7 100644
+index eadcebd7845ee716e33c0ac0544502da1a6c5941..8e71d4d3874ff154eae423a8fb8f15ae08143f4d 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 {
+@@ -100,10 +100,12 @@ public class ArmorStand extends LivingEntity {
private boolean noTickPoseDirty = false;
private boolean noTickEquipmentDirty = false;
// Paper end - Allow ArmorStands not to tick
@@ -8602,7 +8605,7 @@ index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..0f77af39df048682473950291bed5827
this.handItems = NonNullList.withSize(2, ItemStack.EMPTY);
this.armorItems = NonNullList.withSize(4, ItemStack.EMPTY);
this.headPose = ArmorStand.DEFAULT_HEAD_POSE;
-@@ -112,6 +114,7 @@ public class ArmorStand extends LivingEntity {
+@@ -113,6 +115,7 @@ public class ArmorStand extends LivingEntity {
this.leftLegPose = ArmorStand.DEFAULT_LEFT_LEG_POSE;
this.rightLegPose = ArmorStand.DEFAULT_RIGHT_LEG_POSE;
this.setMaxUpStep(0.0F);
@@ -8610,7 +8613,7 @@ index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..0f77af39df048682473950291bed5827
}
public ArmorStand(Level world, double x, double y, double z) {
-@@ -606,7 +609,7 @@ public class ArmorStand extends LivingEntity {
+@@ -607,7 +610,7 @@ public class ArmorStand extends LivingEntity {
private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(DamageSource damageSource) { // Paper
ItemStack itemstack = new ItemStack(Items.ARMOR_STAND);
@@ -8619,7 +8622,7 @@ index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..0f77af39df048682473950291bed5827
itemstack.setHoverName(this.getCustomName());
}
-@@ -677,6 +680,7 @@ public class ArmorStand extends LivingEntity {
+@@ -678,6 +681,7 @@ public class ArmorStand extends LivingEntity {
@Override
public void tick() {
@@ -8627,7 +8630,7 @@ index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..0f77af39df048682473950291bed5827
// Paper start - Allow ArmorStands not to tick
if (!this.canTick) {
if (this.noTickPoseDirty) {
-@@ -1004,4 +1008,18 @@ public class ArmorStand extends LivingEntity {
+@@ -1005,4 +1009,18 @@ public class ArmorStand extends LivingEntity {
}
}
// Paper end
@@ -8694,10 +8697,10 @@ index d9016807bc21c38a5c38170e1335c79b39355bcb..62cdc36a21c0203ed98d2946a1efdf54
}
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
-index a0f30f6dffac70fc7702f8f35addaa28e53cad80..2c19d6687e1554373e4c7f43a8fec8e770942f50 100644
+index 3b803ac2041b9f6bb6f016e58d95c0bf58fd9a8d..84712ae2d9f6024426fe4700f5539a5a33c2fc46 100644
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
-@@ -60,6 +60,12 @@ public class ItemEntity extends Entity implements TraceableEntity {
+@@ -61,6 +61,12 @@ public class ItemEntity extends Entity implements TraceableEntity {
public boolean canMobPickup = true; // Paper - Item#canEntityPickup
private int despawnRate = -1; // Paper - Alternative item-despawn-rate
public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
@@ -8710,7 +8713,7 @@ index a0f30f6dffac70fc7702f8f35addaa28e53cad80..2c19d6687e1554373e4c7f43a8fec8e7
public ItemEntity(EntityType extends ItemEntity> type, Level world) {
super(type, world);
-@@ -392,7 +398,16 @@ public class ItemEntity extends Entity implements TraceableEntity {
+@@ -393,7 +399,16 @@ public class ItemEntity extends Entity implements TraceableEntity {
@Override
public boolean hurt(DamageSource source, float amount) {
@@ -8728,7 +8731,7 @@ index a0f30f6dffac70fc7702f8f35addaa28e53cad80..2c19d6687e1554373e4c7f43a8fec8e7
return false;
} else if (!this.getItem().isEmpty() && this.getItem().is(Items.NETHER_STAR) && source.is(DamageTypeTags.IS_EXPLOSION)) {
return false;
-@@ -595,6 +610,12 @@ public class ItemEntity extends Entity implements TraceableEntity {
+@@ -596,6 +611,12 @@ public class ItemEntity extends Entity implements TraceableEntity {
public void setItem(ItemStack stack) {
this.getEntityData().set(ItemEntity.DATA_ITEM, stack);
this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate
@@ -8742,10 +8745,10 @@ index a0f30f6dffac70fc7702f8f35addaa28e53cad80..2c19d6687e1554373e4c7f43a8fec8e7
@Override
diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
-index cd7b955754b809826048b80723e2e9055b373a4a..b929bef749397797203eb6fb7a7e817d90ec310c 100644
+index e712bd07ea2946167782473a536e0c72fab4bccd..6d934405cd18d63943171448743cafd5c52026e2 100644
--- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
+++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java
-@@ -199,4 +199,29 @@ public class PrimedTnt extends Entity implements TraceableEntity {
+@@ -200,4 +200,29 @@ public class PrimedTnt extends Entity implements TraceableEntity {
return !level().paperConfig().fixes.preventTntFromMovingInWater && super.isPushedByFluid();
}
// Paper end - Option to prevent TNT from moving in water
@@ -9009,10 +9012,10 @@ index 70d25bb45ad603095a1f5812cc396dfc5f16a1e1..c9bd400473166999479f5eef1edad529
public boolean doHurtTarget(Entity target) {
if (super.doHurtTarget(target)) {
diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java
-index 6a91960f93e624a4b975c1cf76698eb45ceda838..8bbc11845d190b33296f61c503f54209d218bc85 100644
+index 9657796d08f4a102d9d5ff7685f2a152d1a87fda..54315fb84e3289f0ad8305c2c2cec980a5b2c627 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java
-@@ -59,21 +59,99 @@ public class Creeper extends Monster implements PowerableMob {
+@@ -60,21 +60,99 @@ public class Creeper extends Monster implements PowerableMob {
public int maxSwell = 30;
public int explosionRadius = 3;
private int droppedSkulls;
@@ -9112,7 +9115,7 @@ index 6a91960f93e624a4b975c1cf76698eb45ceda838..8bbc11845d190b33296f61c503f54209
this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true));
this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0]));
}
-@@ -173,6 +251,37 @@ public class Creeper extends Monster implements PowerableMob {
+@@ -174,6 +252,37 @@ public class Creeper extends Monster implements PowerableMob {
}
}
@@ -9150,7 +9153,7 @@ index 6a91960f93e624a4b975c1cf76698eb45ceda838..8bbc11845d190b33296f61c503f54209
@Override
protected SoundEvent getHurtSound(DamageSource source) {
return SoundEvents.CREEPER_HURT;
-@@ -264,15 +373,17 @@ public class Creeper extends Monster implements PowerableMob {
+@@ -265,15 +374,17 @@ public class Creeper extends Monster implements PowerableMob {
}
public void explodeCreeper() {
@@ -9167,10 +9170,10 @@ index 6a91960f93e624a4b975c1cf76698eb45ceda838..8bbc11845d190b33296f61c503f54209
this.dead = true;
- this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB); // CraftBukkit
+ this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), this.level().getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) && level().purpurConfig.creeperAllowGriefing ? Level.ExplosionInteraction.MOB : Level.ExplosionInteraction.NONE); // CraftBukkit // Purpur
- this.discard();
+ this.discard(EntityRemoveEvent.Cause.EXPLODE); // CraftBukkit - add Bukkit remove cause
this.spawnLingeringCloud();
// CraftBukkit start
-@@ -282,7 +393,7 @@ public class Creeper extends Monster implements PowerableMob {
+@@ -283,7 +394,7 @@ public class Creeper extends Monster implements PowerableMob {
}
// CraftBukkit end
}
@@ -9179,7 +9182,7 @@ index 6a91960f93e624a4b975c1cf76698eb45ceda838..8bbc11845d190b33296f61c503f54209
}
private void spawnLingeringCloud() {
-@@ -324,6 +435,7 @@ public class Creeper extends Monster implements PowerableMob {
+@@ -325,6 +436,7 @@ public class Creeper extends Monster implements PowerableMob {
com.destroystokyo.paper.event.entity.CreeperIgniteEvent event = new com.destroystokyo.paper.event.entity.CreeperIgniteEvent((org.bukkit.entity.Creeper) getBukkitEntity(), ignited);
if (event.callEvent()) {
this.entityData.set(Creeper.DATA_IS_IGNITED, event.isIgnited());
@@ -9512,11 +9515,11 @@ index 9898e05682c2d47953c95e355d51c701a3b0cc1b..d945b0d74a4f87e7eea6cc8625c0da47
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/Endermite.java b/src/main/java/net/minecraft/world/entity/monster/Endermite.java
-index 66b6c55f72aec7e4e9dfa5417a46ba68dbb16a83..20ca96baf8f73fd5835422c6551f515a394cb168 100644
+index b8ce2a9ad151b20f0f4e9e8e34a57069d8d77128..965362c281315c15fb70a83a6949d7825bebf15b 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Endermite.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Endermite.java
-@@ -32,20 +32,63 @@ import org.joml.Vector3f;
- public class Endermite extends Monster {
+@@ -37,20 +37,63 @@ public class Endermite extends Monster {
+
private static final int MAX_LIFE = 2400;
public int life;
+ private boolean isPlayerSpawned; // Purpur
@@ -9576,10 +9579,10 @@ index 66b6c55f72aec7e4e9dfa5417a46ba68dbb16a83..20ca96baf8f73fd5835422c6551f515a
this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 8.0F));
this.goalSelector.addGoal(8, new RandomLookAroundGoal(this));
+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur
- this.targetSelector.addGoal(1, (new HurtByTargetGoal(this)).setAlertOthers());
+ this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers());
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
}
-@@ -88,12 +131,14 @@ public class Endermite extends Monster {
+@@ -93,12 +136,14 @@ public class Endermite extends Monster {
public void readAdditionalSaveData(CompoundTag nbt) {
super.readAdditionalSaveData(nbt);
this.life = nbt.getInt("Lifetime");
@@ -10652,10 +10655,10 @@ index 187037c43ebb5b245ffa4b50163d443490668744..b70065edff5da1f564aae14b3032b249
list.sort(Comparator.comparing((Entity e) -> { return e.getY(); }).reversed()); // CraftBukkit - decompile error
Iterator iterator = list.iterator();
diff --git a/src/main/java/net/minecraft/world/entity/monster/Pillager.java b/src/main/java/net/minecraft/world/entity/monster/Pillager.java
-index cec545c3baa6599d47b9cf1a4b97de8771062a22..06d52d8b61abc4dbbdc953bfed2e688be377b3cc 100644
+index 05ed2f06a41f3b12e0432a37faf98d0b1fea7a8b..d5becd13774f9a2ead77d58e777ffc9aea10cb60 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Pillager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Pillager.java
-@@ -62,15 +62,49 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve
+@@ -66,15 +66,49 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve
super(type, world);
}
@@ -10702,7 +10705,7 @@ index cec545c3baa6599d47b9cf1a4b97de8771062a22..06d52d8b61abc4dbbdc953bfed2e688b
this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 15.0F, 1.0F));
this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 15.0F));
+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur
- this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, Raider.class)).setAlertOthers());
+ this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Raider.class})).setAlertOthers());
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false));
diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
@@ -10919,10 +10922,10 @@ index f3c2a2ffb74daa89a516db4c188ce675c79932bf..ab21a44905a4154013cd65acdecbf55b
public ShulkerLookControl(Mob entity) {
super(entity);
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 2c60a3765d22909e73b660492410ab8456304b68..dbc27afbccb027963ae3f035c268835adedbb933 100644
+index fcd5cc3ff8d4b38f4dea08f78723db3dac53ffde..931412a5ab315d4080a9f5209d3e85d78642f4c2 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java
-@@ -47,14 +47,48 @@ public class Silverfish extends Monster {
+@@ -48,14 +48,48 @@ public class Silverfish extends Monster {
super(type, world);
}
@@ -10971,7 +10974,7 @@ index 2c60a3765d22909e73b660492410ab8456304b68..dbc27afbccb027963ae3f035c268835a
this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers());
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
}
-@@ -186,7 +220,7 @@ public class Silverfish extends Monster {
+@@ -187,7 +221,7 @@ public class Silverfish extends Monster {
continue;
}
// CraftBukkit end
@@ -10980,7 +10983,7 @@ index 2c60a3765d22909e73b660492410ab8456304b68..dbc27afbccb027963ae3f035c268835a
world.destroyBlock(blockposition1, true, this.silverfish);
} else {
world.setBlock(blockposition1, ((InfestedBlock) block).hostStateByInfested(world.getBlockState(blockposition1)), 3);
-@@ -224,7 +258,7 @@ public class Silverfish extends Monster {
+@@ -225,7 +259,7 @@ public class Silverfish extends Monster {
} else {
RandomSource randomsource = this.mob.getRandom();
@@ -10990,7 +10993,7 @@ index 2c60a3765d22909e73b660492410ab8456304b68..dbc27afbccb027963ae3f035c268835a
BlockPos blockposition = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ()).relative(this.selectedDirection);
BlockState iblockdata = this.mob.level().getBlockState(blockposition);
diff --git a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java
-index 92974452d8f63fde8524cfac305ee2ef5212f840..6df5d100f21f26d88b3a36768bc9220f64d47cb8 100644
+index 92974452d8f63fde8524cfac305ee2ef5212f840..30ff77f5f137614b5d0d2df6dc90f47c97e8ab13 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Skeleton.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Skeleton.java
@@ -14,6 +14,16 @@ import net.minecraft.world.item.Items;
@@ -11103,7 +11106,7 @@ index 92974452d8f63fde8524cfac305ee2ef5212f840..6df5d100f21f26d88b3a36768bc9220f
+ }
+
+ this.level().addFreshEntity(skeleton);
-+ this.remove(RemovalReason.DISCARDED);
++ this.remove(RemovalReason.DISCARDED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD);
+ if (!player.getAbilities().instabuild) {
+ stack.shrink(1);
+ }
@@ -11118,10 +11121,10 @@ index 92974452d8f63fde8524cfac305ee2ef5212f840..6df5d100f21f26d88b3a36768bc9220f
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java
-index 2502cb476032c6a247132ce2e427721d6c9f8ce4..489c8cbec828318e5b84cb9eaf25733b39781927 100644
+index 3d9107d2c19a09215445aa0e0aacc32f9f82a536..0f77f00e9a02d1f982f285617604e7291b70a2a4 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Slime.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java
-@@ -61,6 +61,7 @@ public class Slime extends Mob implements Enemy {
+@@ -62,6 +62,7 @@ public class Slime extends Mob implements Enemy {
public float squish;
public float oSquish;
private boolean wasOnGround;
@@ -11129,7 +11132,7 @@ index 2502cb476032c6a247132ce2e427721d6c9f8ce4..489c8cbec828318e5b84cb9eaf25733b
public Slime(EntityType extends Slime> type, Level world) {
super(type, world);
-@@ -68,12 +69,89 @@ public class Slime extends Mob implements Enemy {
+@@ -69,12 +70,89 @@ public class Slime extends Mob implements Enemy {
this.moveControl = new Slime.SlimeMoveControl(this);
}
@@ -11219,7 +11222,7 @@ index 2502cb476032c6a247132ce2e427721d6c9f8ce4..489c8cbec828318e5b84cb9eaf25733b
this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entityliving) -> {
return Math.abs(entityliving.getY() - this.getY()) <= 4.0D;
}));
-@@ -98,9 +176,9 @@ public class Slime extends Mob implements Enemy {
+@@ -99,9 +177,9 @@ public class Slime extends Mob implements Enemy {
this.entityData.set(Slime.ID_SIZE, j);
this.reapplyPosition();
this.refreshDimensions();
@@ -11231,7 +11234,7 @@ index 2502cb476032c6a247132ce2e427721d6c9f8ce4..489c8cbec828318e5b84cb9eaf25733b
if (heal) {
this.setHealth(this.getMaxHealth());
}
-@@ -378,11 +456,12 @@ public class Slime extends Mob implements Enemy {
+@@ -386,11 +464,12 @@ public class Slime extends Mob implements Enemy {
}
@Override
@@ -11245,7 +11248,7 @@ index 2502cb476032c6a247132ce2e427721d6c9f8ce4..489c8cbec828318e5b84cb9eaf25733b
}
@Nullable
-@@ -416,7 +495,7 @@ public class Slime extends Mob implements Enemy {
+@@ -424,7 +503,7 @@ public class Slime extends Mob implements Enemy {
return super.getDimensions(pose).scale(0.255F * (float) this.getSize());
}
@@ -11254,7 +11257,7 @@ index 2502cb476032c6a247132ce2e427721d6c9f8ce4..489c8cbec828318e5b84cb9eaf25733b
private float yRot;
private int jumpDelay;
-@@ -435,21 +514,33 @@ public class Slime extends Mob implements Enemy {
+@@ -443,21 +522,33 @@ public class Slime extends Mob implements Enemy {
}
public void setWantedMovement(double speed) {
@@ -11291,7 +11294,7 @@ index 2502cb476032c6a247132ce2e427721d6c9f8ce4..489c8cbec828318e5b84cb9eaf25733b
if (this.jumpDelay-- <= 0) {
this.jumpDelay = this.slime.getJumpDelay();
if (this.isAggressive) {
-@@ -466,7 +557,7 @@ public class Slime extends Mob implements Enemy {
+@@ -474,7 +565,7 @@ public class Slime extends Mob implements Enemy {
this.mob.setSpeed(0.0F);
}
} else {
@@ -12315,10 +12318,10 @@ index 2eeb23ce4125b2538e92e19bf73f55398d2dbfc0..0127c4522a7656b7a3bdd967f946f2aa
protected boolean canReplaceCurrentItem(ItemStack stack) {
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java
-index fc93dc1c402c29dba7751c0f873a1e87d6abc358..1bdc64184cc801719b243c15633fe3770f12a2f0 100644
+index 4f4f557b7f4232ec3b90dda43c6bed30521318ba..dd4313e0507d3adda0ec84c79f1af13ecc2d7ef3 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinAi.java
-@@ -598,20 +598,33 @@ public class PiglinAi {
+@@ -599,20 +599,33 @@ public class PiglinAi {
Iterator iterator = iterable.iterator();
Item item;
@@ -12524,10 +12527,10 @@ index 5f407535298a31a34cfe114dd863fd6a9b977707..29c7e33fe961020e5a0007287fe9b663
}
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f433e0537 100644
+index 34812d4ab115f31a6ad1cf8cbc345dda4339c075..248ef4e472d569395eda57298298f788bf9db6f7 100644
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-@@ -145,6 +145,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -146,6 +146,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
});
public long nextGolemPanic = -1; // Pufferfish
@@ -12536,7 +12539,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
public Villager(EntityType extends Villager> entityType, Level world) {
this(entityType, world, VillagerType.PLAINS);
-@@ -157,6 +159,91 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -158,6 +160,91 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
this.getNavigation().setCanFloat(true);
this.setCanPickUpLoot(true);
this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE));
@@ -12628,7 +12631,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
}
@Override
-@@ -193,7 +280,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -194,7 +281,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
brain.addActivity(Activity.PLAY, VillagerGoalPackages.getPlayPackage(0.5F));
} else {
brain.setSchedule(Schedule.VILLAGER_DEFAULT);
@@ -12637,7 +12640,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
}
brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F));
-@@ -256,13 +343,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -257,13 +344,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
// Paper start
this.customServerAiStep(false);
}
@@ -12662,7 +12665,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
if (this.assignProfessionWhenSpawned) {
this.assignProfessionWhenSpawned = false;
}
-@@ -318,7 +413,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -319,7 +414,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
if (!itemstack.is(Items.VILLAGER_SPAWN_EGG) && this.isAlive() && !this.isTrading() && !this.isSleeping()) {
if (this.isBaby()) {
this.setUnhappy();
@@ -12671,7 +12674,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
} else {
boolean flag = this.getOffers().isEmpty();
-@@ -331,9 +426,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -332,9 +427,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
if (flag) {
@@ -12684,7 +12687,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
this.startTrading(player);
}
-@@ -502,7 +598,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -503,7 +599,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
while (iterator.hasNext()) {
MerchantOffer merchantrecipe = (MerchantOffer) iterator.next();
@@ -12693,7 +12696,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
}
}
-@@ -752,7 +848,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -753,7 +849,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@Override
public boolean canBreed() {
@@ -12702,7 +12705,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
}
private boolean hungry() {
-@@ -966,6 +1062,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -967,6 +1063,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
public boolean hasFarmSeeds() {
return this.getInventory().hasAnyMatching((itemstack) -> {
@@ -12714,7 +12717,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
return itemstack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS);
});
}
-@@ -1023,6 +1124,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -1024,6 +1125,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
public void spawnGolemIfNeeded(ServerLevel world, long time, int requiredCount) {
@@ -12722,7 +12725,7 @@ index e6b5b7c58505f021dc042c2c40733addcf286dcd..ef0f318227d2b9d0836f9f6d729add6f
if (this.wantsToSpawnGolem(time)) {
AABB axisalignedbb = this.getBoundingBox().inflate(10.0D, 10.0D, 10.0D);
List list = world.getEntitiesOfClass(Villager.class, axisalignedbb);
-@@ -1087,6 +1189,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -1088,6 +1190,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@Override
public void startSleeping(BlockPos pos) {
@@ -12749,10 +12752,10 @@ index 95197b601d93c30a7645d67c89c7608fc00a8de6..b571731bbce25f17568370bb523cb9b0
public static final VillagerProfession FISHERMAN = register("fisherman", PoiTypes.FISHERMAN, SoundEvents.VILLAGER_WORK_FISHERMAN);
public static final VillagerProfession FLETCHER = register("fletcher", PoiTypes.FLETCHER, SoundEvents.VILLAGER_WORK_FLETCHER);
diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
-index 1c89f20debfad9807c90a21cc336d5790294ebce..3f78ab74cd7706ad16f6d5a989803691c9842f9f 100644
+index 8d1cc1a644415be251f469ab1cb2ebc09fe5c3eb..b133c186d2d1412aa623ba3db68091bc69c282a5 100644
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
-@@ -70,6 +70,43 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
+@@ -71,6 +71,43 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
//this.setDespawnDelay(48000); // CraftBukkit - set default from MobSpawnerTrader // Paper - move back to MobSpawnerTrader - Vanilla behavior is that only traders spawned by it have this value set.
}
@@ -12796,7 +12799,7 @@ index 1c89f20debfad9807c90a21cc336d5790294ebce..3f78ab74cd7706ad16f6d5a989803691
@Override
protected void registerGoals() {
this.goalSelector.addGoal(0, new FloatGoal(this));
-@@ -77,7 +114,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
+@@ -78,7 +115,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
return this.canDrinkPotion && this.level().isNight() && !entityvillagertrader.isInvisible(); // Paper - Add more WanderingTrader API
}));
this.goalSelector.addGoal(0, new UseItemGoal<>(this, new ItemStack(Items.MILK_BUCKET), SoundEvents.WANDERING_TRADER_REAPPEARED, (entityvillagertrader) -> {
@@ -12805,7 +12808,7 @@ index 1c89f20debfad9807c90a21cc336d5790294ebce..3f78ab74cd7706ad16f6d5a989803691
}));
this.goalSelector.addGoal(1, new TradeWithPlayerGoal(this));
this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Zombie.class, 8.0F, 0.5D, 0.5D));
-@@ -90,6 +127,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
+@@ -91,6 +128,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
this.goalSelector.addGoal(1, new PanicGoal(this, 0.5D));
this.goalSelector.addGoal(1, new LookAtTradingPlayerGoal(this));
this.goalSelector.addGoal(2, new WanderingTrader.WanderToPositionGoal(this, 2.0D, 0.35D));
@@ -12813,7 +12816,7 @@ index 1c89f20debfad9807c90a21cc336d5790294ebce..3f78ab74cd7706ad16f6d5a989803691
this.goalSelector.addGoal(4, new MoveTowardsRestrictionGoal(this, 0.35D));
this.goalSelector.addGoal(8, new WaterAvoidingRandomStrollGoal(this, 0.35D));
this.goalSelector.addGoal(9, new InteractGoal(this, Player.class, 3.0F, 1.0F));
-@@ -117,9 +155,10 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
+@@ -118,9 +156,10 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill
}
if (this.getOffers().isEmpty()) {
@@ -12850,10 +12853,10 @@ index d7bddedb19c10f62fd1f7d3128453ad706ed16be..752b38d45d59d8b3cd492246e5aa4f37
if (NaturalSpawner.isSpawnPositionOk(SpawnPlacements.Type.ON_GROUND, world, blockposition2, EntityType.WANDERING_TRADER)) {
blockposition1 = blockposition2;
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 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6fae8fa07 100644
+index c300b272c820786c8c4b9d83e184c5969468e1e0..fc840fff5fe2dc33986f8e5d3a60c3c853fe6151 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
-@@ -185,11 +185,21 @@ public abstract class Player extends LivingEntity {
+@@ -186,11 +186,21 @@ public abstract class Player extends LivingEntity {
public float hurtDir; // Paper - protected -> public
public boolean affectsSpawning = true; // Paper - Affects Spawning API
public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage
@@ -12875,7 +12878,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
@Override
public CraftHumanEntity getBukkitEntity() {
return (CraftHumanEntity) super.getBukkitEntity();
-@@ -198,6 +208,19 @@ public abstract class Player extends LivingEntity {
+@@ -199,6 +209,19 @@ public abstract class Player extends LivingEntity {
public final int sendAllPlayerInfoBucketIndex; // Gale - Purpur - spread out sending all player info
@@ -12895,7 +12898,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
public Player(Level world, BlockPos pos, float yaw, GameProfile gameProfile) {
super(EntityType.PLAYER, world);
this.lastItemInMainHand = ItemStack.EMPTY;
-@@ -243,6 +266,12 @@ public abstract class Player extends LivingEntity {
+@@ -244,6 +267,12 @@ public abstract class Player extends LivingEntity {
@Override
public void tick() {
@@ -12908,7 +12911,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
this.noPhysics = this.isSpectator();
if (this.isSpectator()) {
this.setOnGround(false);
-@@ -357,6 +386,16 @@ public abstract class Player extends LivingEntity {
+@@ -358,6 +387,16 @@ public abstract class Player extends LivingEntity {
this.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 200, 0, false, false, true), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TURTLE_HELMET); // CraftBukkit
}
@@ -12925,7 +12928,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
}
protected ItemCooldowns createItemCooldowns() {
-@@ -447,7 +486,7 @@ public abstract class Player extends LivingEntity {
+@@ -448,7 +487,7 @@ public abstract class Player extends LivingEntity {
@Override
public int getPortalWaitTime() {
@@ -12934,7 +12937,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
}
@Override
-@@ -603,7 +642,7 @@ public abstract class Player extends LivingEntity {
+@@ -604,7 +643,7 @@ public abstract class Player extends LivingEntity {
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
@@ -12943,7 +12946,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
list1.add(entity);
} else if (!entity.isRemoved()) {
this.touch(entity);
-@@ -1294,7 +1333,7 @@ public abstract class Player extends LivingEntity {
+@@ -1295,7 +1334,7 @@ public abstract class Player extends LivingEntity {
flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits
flag2 = flag2 && !this.isSprinting();
if (flag2) {
@@ -12952,7 +12955,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
}
f += f1;
-@@ -1930,9 +1969,19 @@ public abstract class Player extends LivingEntity {
+@@ -1938,9 +1977,19 @@ public abstract class Player extends LivingEntity {
@Override
public int getExperienceReward() {
if (!this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) && !this.isSpectator()) {
@@ -12975,7 +12978,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
} else {
return 0;
}
-@@ -2008,6 +2057,11 @@ public abstract class Player extends LivingEntity {
+@@ -2016,6 +2065,11 @@ public abstract class Player extends LivingEntity {
return this.inventory.armor;
}
@@ -12987,7 +12990,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
public boolean setEntityOnShoulder(CompoundTag entityNbt) {
if (!this.isPassenger() && this.onGround() && !this.isInWater() && !this.isInPowderSnow) {
if (this.getShoulderEntityLeft().isEmpty()) {
-@@ -2288,7 +2342,7 @@ public abstract class Player extends LivingEntity {
+@@ -2296,7 +2350,7 @@ public abstract class Player extends LivingEntity {
public ItemStack eat(Level world, ItemStack stack) {
this.getFoodData().eat(stack.getItem(), stack);
this.awardStat(Stats.ITEM_USED.get(stack.getItem()));
@@ -12996,7 +12999,7 @@ index 89b999b587e81a4a8a6ef0d7ea39af8894e92ba9..1dfb82abc60dda860432bae316c7d7c6
if (this instanceof ServerPlayer) {
CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer) this, stack);
}
-@@ -2382,6 +2436,7 @@ public abstract class Player extends LivingEntity {
+@@ -2390,6 +2444,7 @@ public abstract class Player extends LivingEntity {
}
public static boolean isValidUsername(String name) {
@@ -13017,10 +13020,10 @@ index 9c7b05fec22a8b84c29d7210f1104030a20cc7aa..6f220fae380575622dee0d99d20704f0
public static int getStackingIndex(ItemStack stack) {
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 4ed35187a22c595db5a0986162e4b45c594e7c3e..c105e8d2ce2a27495ba7cae44de0629634911bcc 100644
+index 488a98e20b4f405d1ce4a224d2d2b5151dec369b..609695ef44fa46bd9a0418e9ac5fe3d105daa505 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
-@@ -74,6 +74,7 @@ public abstract class AbstractArrow extends Projectile {
+@@ -75,6 +75,7 @@ public abstract class AbstractArrow extends Projectile {
@Nullable
private List piercedAndKilledEntities;
public ItemStack pickupItemStack;
@@ -13028,7 +13031,7 @@ index 4ed35187a22c595db5a0986162e4b45c594e7c3e..c105e8d2ce2a27495ba7cae44de06296
// Spigot Start
@Override
-@@ -641,6 +642,12 @@ public abstract class AbstractArrow extends Projectile {
+@@ -642,6 +643,12 @@ public abstract class AbstractArrow extends Projectile {
this.knockback = punch;
}
@@ -13042,10 +13045,10 @@ index 4ed35187a22c595db5a0986162e4b45c594e7c3e..c105e8d2ce2a27495ba7cae44de06296
return this.knockback;
}
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 6b67eec90cd0dc1b20762514eac97f75fdbdf182..2dec28091d1816e9d4c749a5155e83031751cf50 100644
+index 9d89872c5958f3e8d6c1ef4fd93f9b8b85296851..6a94c86acce5afbf1e9c8e7d664b3eb2d79ab5ab 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 {
+@@ -19,20 +19,20 @@ public class LargeFireball extends Fireball {
public LargeFireball(EntityType extends LargeFireball> type, Level world) {
super(type, world);
@@ -13070,10 +13073,10 @@ index 6b67eec90cd0dc1b20762514eac97f75fdbdf182..2dec28091d1816e9d4c749a5155e8303
// 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/LlamaSpit.java b/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java
-index 0bbe853f7df93f9dcd2b21d762939f8b6be069aa..7db9844083703944f59e112c6dc5e1a5e062d31c 100644
+index 8f5376543cca9cbfb2a014f67ec373d984b0df64..3673d1442778331ece25f8faca95b3499cafe46e 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java
-@@ -26,6 +26,12 @@ public class LlamaSpit extends Projectile {
+@@ -29,6 +29,12 @@ public class LlamaSpit extends Projectile {
this.setPos(owner.getX() - (double) (owner.getBbWidth() + 1.0F) * 0.5D * (double) Mth.sin(owner.yBodyRot * 0.017453292F), owner.getEyeY() - 0.10000000149011612D, owner.getZ() + (double) (owner.getBbWidth() + 1.0F) * 0.5D * (double) Mth.cos(owner.yBodyRot * 0.017453292F));
}
@@ -13087,9 +13090,18 @@ index 0bbe853f7df93f9dcd2b21d762939f8b6be069aa..7db9844083703944f59e112c6dc5e1a5
public void tick() {
super.tick();
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 d3a055e221ec62070f6557d1686febadf1249402..33156c5613965d123d7758472a04a74656f46c03 100644
+index d3a055e221ec62070f6557d1686febadf1249402..4a3fe54e9b3af58cba9b09478f75ea788f4880f2 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java
+@@ -70,7 +70,7 @@ public abstract class Projectile extends Entity implements TraceableEntity {
+ int maxChunkLoadsPerProjectile = maxProjectileChunkLoadsConfig.perProjectile.max;
+ if (maxChunkLoadsPerProjectile >= 0 && this.chunksLoadedByProjectile >= maxChunkLoadsPerProjectile) {
+ if (maxProjectileChunkLoadsConfig.perProjectile.removeFromWorldAfterReachLimit) {
+- this.discard();
++ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); // Purpur
+ } else if (maxProjectileChunkLoadsConfig.perProjectile.resetMovementAfterReachLimit) {
+ this.setDeltaMovement(0, this.getDeltaMovement().y, 0);
+ }
@@ -343,7 +343,7 @@ public abstract class Projectile extends Entity implements TraceableEntity {
public boolean mayInteract(Level world, BlockPos pos) {
Entity entity = this.getOwner();
@@ -13100,10 +13112,10 @@ index d3a055e221ec62070f6557d1686febadf1249402..33156c5613965d123d7758472a04a746
public boolean mayBreak(Level world) {
diff --git a/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java b/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java
-index 9d43c8520953d6fe0d0948f9dbe14e0650ee01c2..deee9fffe6981d7e728621cc799a812d78000592 100644
+index 6724fe4470aeea338eb4cfd10a7e61fbcac1e5b7..dd38f32ac6a62905c9a79dacf85cf073fa6941b3 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 {
+@@ -27,7 +27,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) {
@@ -13113,16 +13125,17 @@ index 9d43c8520953d6fe0d0948f9dbe14e0650ee01c2..deee9fffe6981d7e728621cc799a812d
// CraftBukkit end
}
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 718e120c9768cf716b32d3d652f53f1dda925168..440d3d72d8b2dac14f83a83caa5ae9dbf3e979b6 100644
+index 5e82549ea2e80b3968b793b7b4b685c4891e9a91..bb61e1132c28274175215a679befdcfa2496b099 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java
-@@ -53,10 +53,40 @@ public class Snowball extends ThrowableItemProjectile {
+@@ -58,11 +58,41 @@ public class Snowball extends ThrowableItemProjectile {
protected void onHitEntity(EntityHitResult entityHitResult) {
super.onHitEntity(entityHitResult);
Entity entity = entityHitResult.getEntity();
- int i = entity instanceof Blaze ? 3 : 0;
+ int i = entity.level().purpurConfig.snowballDamage >= 0 ? entity.level().purpurConfig.snowballDamage : entity instanceof Blaze ? 3 : 0; // Purpur
- entity.hurt(this.damageSources().thrown(this, this.getOwner()), (float)i);
+
+ entity.hurt(this.damageSources().thrown(this, this.getOwner()), (float) i);
}
+ // Purpur start - borrowed and modified code from ThrownPotion#onHitBlock and ThrownPotion#dowseFire
@@ -13159,10 +13172,10 @@ index 718e120c9768cf716b32d3d652f53f1dda925168..440d3d72d8b2dac14f83a83caa5ae9db
protected void onHit(HitResult hitResult) {
super.onHit(hitResult);
diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
-index 3be611e7ae35b696ba44cd361042f79b69391815..0f0c27704c15fc287a4b54b6403c73660365c2e4 100644
+index 28690877c443ceb2bdf20e6d251c9d32f667814c..326d1db39e3d3cd46cb5a584e2a7b82dd46ff8fa 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
-@@ -70,10 +70,11 @@ public class ThrownEnderpearl extends ThrowableItemProjectile {
+@@ -71,10 +71,11 @@ public class ThrownEnderpearl extends ThrowableItemProjectile {
Bukkit.getPluginManager().callEvent(teleEvent);
if (!teleEvent.isCancelled() && entityplayer.connection.isAcceptingMessages()) {
@@ -13175,7 +13188,7 @@ index 3be611e7ae35b696ba44cd361042f79b69391815..0f0c27704c15fc287a4b54b6403c7366
entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot());
this.level().addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL);
}
-@@ -85,7 +86,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile {
+@@ -86,7 +87,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile {
entityplayer.connection.teleport(teleEvent.getTo());
entity.resetFallDistance();
@@ -13185,10 +13198,10 @@ index 3be611e7ae35b696ba44cd361042f79b69391815..0f0c27704c15fc287a4b54b6403c7366
// CraftBukkit end
this.level().playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.PLAYER_TELEPORT, SoundSource.PLAYERS);
diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java
-index 51931e5cecf4c9ed8442136b18a94c7da89cf77d..2e6817fc05fe92615842a29c3e0682306a6b3ec5 100644
+index 8ae7d62b72fb72d893e68b02b645d48374595ae6..2bd77524313ae7b32f710e7d197e81a2ddd12965 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java
-@@ -60,7 +60,7 @@ public class ThrownTrident extends AbstractArrow {
+@@ -63,7 +63,7 @@ public class ThrownTrident extends AbstractArrow {
Entity entity = this.getOwner();
byte b0 = (Byte) this.entityData.get(ThrownTrident.ID_LOYALTY);
@@ -13198,10 +13211,10 @@ index 51931e5cecf4c9ed8442136b18a94c7da89cf77d..2e6817fc05fe92615842a29c3e068230
if (!this.level().isClientSide && this.pickup == AbstractArrow.Pickup.ALLOWED) {
this.spawnAtLocation(this.getPickupItem(), 0.1F);
diff --git a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
-index 78dd3365dc4d1265fc2102f740d75a384f5df5c5..aa5ce9625bf23885a55521cbb4d994b684a5cf61 100644
+index 5c7a6fe97b1f0b55b4a5dddbb684e4424688f866..dba95e8fbe3e39869e1bbbcc75a010da5cf00262 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
-@@ -98,7 +98,7 @@ public class WitherSkull extends AbstractHurtingProjectile {
+@@ -99,7 +99,7 @@ public class WitherSkull extends AbstractHurtingProjectile {
if (!this.level().isClientSide) {
// CraftBukkit start
// this.level().explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, false, World.a.MOB);
@@ -13210,7 +13223,7 @@ index 78dd3365dc4d1265fc2102f740d75a384f5df5c5..aa5ce9625bf23885a55521cbb4d994b6
this.level().getCraftServer().getPluginManager().callEvent(event);
if (!event.isCancelled()) {
-@@ -110,6 +110,17 @@ public class WitherSkull extends AbstractHurtingProjectile {
+@@ -111,6 +111,17 @@ public class WitherSkull extends AbstractHurtingProjectile {
}
@@ -13229,10 +13242,10 @@ index 78dd3365dc4d1265fc2102f740d75a384f5df5c5..aa5ce9625bf23885a55521cbb4d994b6
public boolean isPickable() {
return false;
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 a71e6206c6a89708c5d312a73b1144c38f1271c8..24a06052f40a8bbb11e351490ecc65003f47f9a4 100644
+index 031355802d86f51489a58561b8806d7d672e4a3b..fb61df507e844a2eed27cbe295ab9378b5f780f5 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 {
+@@ -322,7 +322,7 @@ public abstract class Raider extends PatrollingMonster {
@Override
public boolean canUse() {
@@ -14884,7 +14897,7 @@ index aa784c1794b80b57fd9c1d738a744e0a8ab39d03..68fc000a76f62d764ee60f0f4e3af312
Set set = Sets.newHashSet();
boolean flag = true;
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index c5ee421f127ccd089c085f5fe7d314a8376d9882..765f7034d3b1da22dd81c4186649e06fa58e50a5 100644
+index 33cbba9f92cfbb6508dd8e2c5e35c63a49cdd85c..7583ce583b06306930cbae49b0386a6630bb916f 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
@@ -175,6 +175,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -14945,7 +14958,7 @@ index c5ee421f127ccd089c085f5fe7d314a8376d9882..765f7034d3b1da22dd81c4186649e06f
public CraftWorld getWorld() {
return this.world;
}
-@@ -224,6 +268,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -233,6 +277,8 @@ 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 - create paper world config
this.galeConfig = galeWorldConfigCreator.apply(this.spigotConfig); // Gale - Gale configuration
@@ -14954,7 +14967,7 @@ index c5ee421f127ccd089c085f5fe7d314a8376d9882..765f7034d3b1da22dd81c4186649e06f
this.generator = gen;
this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env);
-@@ -1911,4 +1957,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1920,4 +1966,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
return null;
}
// Paper end - optimize redstone (Alternate Current)
@@ -15659,7 +15672,7 @@ index 790cf30c2bfd4e2530ff563dfcf05e25554248b3..ba69e9b37ce9f2d8b439d471e6de770d
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
-index a0c1db8cfebaa0344012cc0af18d6231cdcdcbb8..f277a4a21b15627c45061e51c8f6c0812a176a10 100644
+index 4ba24bced9a2de4616a0418857d3738e0e322ea0..6660bea735dda46ab9493601f1f53b8e0075ca83 100644
--- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
@@ -54,6 +54,14 @@ public class EndPortalBlock extends BaseEntityBlock {
@@ -15677,29 +15690,6 @@ index a0c1db8cfebaa0344012cc0af18d6231cdcdcbb8..f277a4a21b15627c45061e51c8f6c081
ResourceKey resourcekey = world.getTypeKey() == LevelStem.END ? Level.OVERWORLD : Level.END; // CraftBukkit - SPIGOT-6152: send back to main overworld in custom ends
ServerLevel worldserver = ((ServerLevel) world).getServer().getLevel(resourcekey);
-@@ -61,6 +69,22 @@ public class EndPortalBlock extends BaseEntityBlock {
- // return; // CraftBukkit - always fire event in case plugins wish to change it
- }
-
-+ // Purpur start
-+ if (!world.purpurConfig.endPortalSafeTeleporting) {
-+ // CraftBukkit start - Entity in portal
-+ EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), pos.getX(), pos.getY(), pos.getZ()));
-+ world.getCraftServer().getPluginManager().callEvent(event);
-+
-+ if (entity instanceof ServerPlayer) {
-+ ((ServerPlayer) entity).changeDimension(worldserver, PlayerTeleportEvent.TeleportCause.END_PORTAL);
-+ return;
-+ }
-+ // CraftBukkit end
-+ entity.changeDimension(worldserver);
-+ return;
-+ }
-+ // Purpur end
-+
- // Paper start - move all of this logic into portal tick
- entity.portalWorld = ((ServerLevel)world);
- entity.portalBlock = pos.immutable();
diff --git a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java
index ddca14f1224327a738415fb8b37398d8df0aa9c8..fe3236295790b9e250486835176cae810160c33a 100644
--- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java
@@ -16605,10 +16595,10 @@ index 4b81b0180dfc96fc6a88646838a886ca5b5d301b..2c2e819fb8d92e2de0b4981333219ed5
BeaconBlockEntity.playSound(world, pos, SoundEvents.BEACON_AMBIENT);
}
diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java
-index 56b328c64bea0ffd51930d8ba15fb87a36e6d8a1..f9b4ac5acaf809e1eb9d10d87dd0e17c63d1e3c5 100644
+index 55b0e2bf98a285cdcd30e40d94192b7a1802efd8..7810d763841825f68c60b7471026d71d89726bf0 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java
-@@ -43,7 +43,7 @@ public class BeehiveBlockEntity extends BlockEntity {
+@@ -47,7 +47,7 @@ public class BeehiveBlockEntity extends BlockEntity {
private final List stored = Lists.newArrayList();
@Nullable
public BlockPos savedFlowerPos;
@@ -16617,7 +16607,7 @@ index 56b328c64bea0ffd51930d8ba15fb87a36e6d8a1..f9b4ac5acaf809e1eb9d10d87dd0e17c
public BeehiveBlockEntity(BlockPos pos, BlockState state) {
super(BlockEntityType.BEEHIVE, pos, state);
-@@ -130,6 +130,22 @@ public class BeehiveBlockEntity extends BlockEntity {
+@@ -134,6 +134,22 @@ public class BeehiveBlockEntity extends BlockEntity {
return list;
}
@@ -16640,7 +16630,7 @@ index 56b328c64bea0ffd51930d8ba15fb87a36e6d8a1..f9b4ac5acaf809e1eb9d10d87dd0e17c
public void addOccupant(Entity entity, boolean hasNectar) {
this.addOccupantWithPresetTicks(entity, hasNectar, 0);
}
-@@ -139,6 +155,12 @@ public class BeehiveBlockEntity extends BlockEntity {
+@@ -143,6 +159,12 @@ public class BeehiveBlockEntity extends BlockEntity {
return this.stored.size();
}
@@ -16653,7 +16643,7 @@ index 56b328c64bea0ffd51930d8ba15fb87a36e6d8a1..f9b4ac5acaf809e1eb9d10d87dd0e17c
// Paper start - Add EntityBlockStorage clearEntities
public void clearBees() {
this.stored.clear();
-@@ -203,7 +225,7 @@ public class BeehiveBlockEntity extends BlockEntity {
+@@ -207,7 +229,7 @@ public class BeehiveBlockEntity extends BlockEntity {
}
private static boolean releaseBee(Level world, BlockPos blockposition, BlockState iblockdata, BeehiveBlockEntity.BeeData tileentitybeehive_hivebee, @Nullable List list, BeehiveBlockEntity.BeeReleaseStatus tileentitybeehive_releasestatus, @Nullable BlockPos blockposition1, boolean force) {
@@ -16662,7 +16652,7 @@ index 56b328c64bea0ffd51930d8ba15fb87a36e6d8a1..f9b4ac5acaf809e1eb9d10d87dd0e17c
// CraftBukkit end
return false;
} else {
-@@ -425,9 +447,9 @@ public class BeehiveBlockEntity extends BlockEntity {
+@@ -429,9 +451,9 @@ public class BeehiveBlockEntity extends BlockEntity {
private BeeReleaseStatus() {}
}
@@ -16949,10 +16939,10 @@ index 927c7ea03560be0c86884cec70ee8e408e66cb07..93764bf849ad8e427bf119f6ff3dbcbc
public CompoundTag getUpdateTag() {
return this.saveWithoutMetadata();
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 cc558ca79c4f442ce7aa2ada941f781da21c9f30..72a69569fab9d62c27c3ea4005c4e24816bdc5cd 100644
+index 0d3242be8fe0201e9179a78bd122a2669c42fbc5..f5e9b99459c3e7d28272f0c2499794f9710f57ce 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
-@@ -178,6 +178,14 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity {
+@@ -179,6 +179,14 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity {
public static void teleportEntity(Level world, BlockPos pos, BlockState state, Entity entity, TheEndGatewayBlockEntity blockEntity) {
if (world instanceof ServerLevel && !blockEntity.isCoolingDown()) {
if (entity.level().galeConfig().gameplayMechanics.fixes.checkCanChangeDimensionsBeforeUseEndGateway && world.galeConfig().gameplayMechanics.fixes.checkCanChangeDimensionsBeforeUseEndGateway && !entity.canChangeDimensions()) return; // Gale - Purpur - end gateway should check if entity can use portal
@@ -17466,7 +17456,7 @@ index 4a875bce9563f3b9351ebecde9b0eb1287beb50e..d3fd9a8752e501f45c154e28d8ffd49b
+ // Purpur end - OfflinePlayer API
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 5ea33329ae1fe2fbbba20f25cd2dcfa64190df86..38e80348c9b31847b98fa290a6b03f4060951367 100644
+index 8ecf6ffa93610261d27fafadfff016a2d6047c90..f4fb23ebdd35e23b022bdd78421dec6d86342260 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -404,6 +404,20 @@ public final class CraftServer implements Server {
@@ -17570,7 +17560,7 @@ index 5ea33329ae1fe2fbbba20f25cd2dcfa64190df86..38e80348c9b31847b98fa290a6b03f40
@Override
public List getRecipesFor(ItemStack result) {
Preconditions.checkArgument(result != null, "ItemStack cannot be null");
-@@ -3030,6 +3096,18 @@ public final class CraftServer implements Server {
+@@ -3045,6 +3111,18 @@ public final class CraftServer implements Server {
}
// Gale end - Gale configuration - API
@@ -17589,7 +17579,7 @@ index 5ea33329ae1fe2fbbba20f25cd2dcfa64190df86..38e80348c9b31847b98fa290a6b03f40
@Override
public void restart() {
org.spigotmc.RestartCommand.restart();
-@@ -3316,4 +3394,15 @@ public final class CraftServer implements Server {
+@@ -3331,4 +3409,15 @@ public final class CraftServer implements Server {
}
// Gale end - YAPFA - last tick time - API
@@ -17844,10 +17834,10 @@ index d657fd2c507a5b215aeab0a5f3e9c2ee892a27c8..985e9ec21c60a1f47973bd5fc53b96a6
// Paper start
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index 8698104e3eb98e2cc5da5de87a8f538860c1d91d..9304a2d06400dfa244ddb4d9591de988b334c3cf 100644
+index 0b5a31477e3b76833fb97a455842316193663c8e..897f9f5d25c674f167530810c0b94bca83c3c3cc 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-@@ -83,6 +83,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
+@@ -84,6 +84,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
this.entityType = CraftEntityType.minecraftToBukkit(entity.getType());
}
@@ -17859,7 +17849,7 @@ index 8698104e3eb98e2cc5da5de87a8f538860c1d91d..9304a2d06400dfa244ddb4d9591de988
public static CraftEntity getEntity(CraftServer server, T entity) {
Preconditions.checkArgument(entity != null, "Unknown entity");
-@@ -252,6 +257,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
+@@ -253,6 +258,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
// Paper end
if ((!ignorePassengers && this.entity.isVehicle()) || this.entity.isRemoved()) { // Paper - Teleport passenger API
@@ -17870,7 +17860,7 @@ index 8698104e3eb98e2cc5da5de87a8f538860c1d91d..9304a2d06400dfa244ddb4d9591de988
return false;
}
-@@ -1227,4 +1236,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
+@@ -1228,4 +1237,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
return this.getHandle().getScoreboardName();
}
// Paper end - entity scoreboard name
@@ -17933,7 +17923,7 @@ index 63cae1a2e95d8da17c45c4404a8dd0ca6a413c39..966587c2788b5c93be83259ddc962a89
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
-index 832def3c518be8d6d81e71f6022566e6179e2d17..c853a2464bbab46cd3f30dc12e1096b1e39a438c 100644
+index 30d62ee4d5cd2ddacb8783b5bbbf475d592b3e02..9b1dd59df1f7faea2fc74d82d003bd442fd52248 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
@@ -151,4 +151,46 @@ public class CraftItem extends CraftEntity implements Item {
@@ -17984,7 +17974,7 @@ index 832def3c518be8d6d81e71f6022566e6179e2d17..c853a2464bbab46cd3f30dc12e1096b1
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
-index f1e4dfd203d455ec089cd2b5679c4083400dbc7f..0dd670c7734d9983532ef20e3293d2a8f7567d91 100644
+index 3f952d1409118535f325f614f1a6507c40efa4d6..fcb2687c7183114ecd36d4a190969f148f71ea8e 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -490,7 +490,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
@@ -18051,7 +18041,7 @@ index 0ad16ee7b33582d214dab41eeee378d52c8e38ed..16bd1294c219f15ada653ef810bc2d74
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 206520f6f20b2e48b1eefdd4edb26510b88e4c92..d6122c121d6e18d276fb78865c6a680e9afc3378 100644
+index 616d2e479d91673695ade0db151a0099b568904f..988cc1290200de629a4c24cc67a03e69c2fcc727 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -488,10 +488,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -18264,10 +18254,10 @@ index 38b6d2c377800134de592a780b737b45c8096a11..449acd9dc983be1cd51208bc8f8d843d
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index d677759ac6b6d3cfe5a2af76dc1f0034b216ac2d..b30d0d4d453252d1f5774f5155fb1ab61294d6be 100644
+index 4c2e8129481384a143384d327e14320023735b1a..94be4f367f4c6cb2386d0e59d0417f29fca1cec7 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-@@ -591,6 +591,15 @@ public class CraftEventFactory {
+@@ -592,6 +592,15 @@ public class CraftEventFactory {
// Paper end
craftServer.getPluginManager().callEvent(event);
@@ -18283,7 +18273,7 @@ index d677759ac6b6d3cfe5a2af76dc1f0034b216ac2d..b30d0d4d453252d1f5774f5155fb1ab6
return event;
}
-@@ -1124,7 +1133,7 @@ public class CraftEventFactory {
+@@ -1125,7 +1134,7 @@ public class CraftEventFactory {
return CraftEventFactory.callEntityDamageEvent(source.getDirectBlock(), entity, DamageCause.LAVA, bukkitDamageSource, modifiers, modifierFunctions, cancelled);
} else if (source.getDirectBlock() != null) {
DamageCause cause;
@@ -18292,7 +18282,7 @@ index d677759ac6b6d3cfe5a2af76dc1f0034b216ac2d..b30d0d4d453252d1f5774f5155fb1ab6
cause = DamageCause.CONTACT;
} else if (source.is(DamageTypes.HOT_FLOOR)) {
cause = DamageCause.HOT_FLOOR;
-@@ -1182,6 +1191,7 @@ public class CraftEventFactory {
+@@ -1183,6 +1192,7 @@ public class CraftEventFactory {
EntityDamageEvent event;
if (damager != null) {
event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, bukkitDamageSource, modifiers, modifierFunctions, critical);
@@ -19172,10 +19162,10 @@ index 0000000000000000000000000000000000000000..0c8bcfbe35f9133a32a31163e5bf2f04
+}
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
new file mode 100644
-index 0000000000000000000000000000000000000000..42a4684b185ad1c490715b43282a487ea8cd3d3f
+index 0000000000000000000000000000000000000000..7459ca7b724634a191498bf05e345c7e97fbe901
--- /dev/null
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-@@ -0,0 +1,3290 @@
+@@ -0,0 +1,3285 @@
+package org.purpurmc.purpur;
+
+import net.minecraft.core.registries.BuiltInRegistries;
@@ -20214,11 +20204,6 @@ index 0000000000000000000000000000000000000000..42a4684b185ad1c490715b43282a487e
+ furnaceUseLavaFromUnderneath = getBoolean("blocks.furnace.use-lava-from-underneath", furnaceUseLavaFromUnderneath);
+ }
+
-+ public boolean endPortalSafeTeleporting = true;
-+ private void endPortalSettings() {
-+ endPortalSafeTeleporting = getBoolean("blocks.end_portal.safe-teleporting", endPortalSafeTeleporting);
-+ }
-+
+ public boolean mobsSpawnOnPackedIce = true;
+ public boolean mobsSpawnOnBlueIce = true;
+ public boolean snowOnBlueIce = true;
@@ -23270,10 +23255,10 @@ index 0000000000000000000000000000000000000000..ba2a37dad43e238e54632975abea8ee6
+}
diff --git a/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java
new file mode 100644
-index 0000000000000000000000000000000000000000..92d562fa11f69bb6b841299aef257ea0c674ca1c
+index 0000000000000000000000000000000000000000..3e846f38902024875d1961b16a60c50201df309d
--- /dev/null
+++ b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java
-@@ -0,0 +1,106 @@
+@@ -0,0 +1,107 @@
+package org.purpurmc.purpur.entity;
+
+import net.minecraft.core.particles.ParticleTypes;
@@ -23292,6 +23277,7 @@ index 0000000000000000000000000000000000000000..92d562fa11f69bb6b841299aef257ea0
+import net.minecraft.world.phys.EntityHitResult;
+import net.minecraft.world.phys.HitResult;
+import net.minecraft.world.phys.Vec3;
++import org.bukkit.event.entity.EntityRemoveEvent;
+
+public class DolphinSpit extends LlamaSpit {
+ public LivingEntity dolphin;
@@ -23342,7 +23328,7 @@ index 0000000000000000000000000000000000000000..92d562fa11f69bb6b841299aef257ea0
+ }
+
+ if (++ticksLived > 20) {
-+ this.discard();
++ this.discard(EntityRemoveEvent.Cause.DISCARD);
+ } else {
+ this.setDeltaMovement(mot.scale(0.99D));
+ if (!this.isNoGravity()) {
@@ -23377,12 +23363,12 @@ index 0000000000000000000000000000000000000000..92d562fa11f69bb6b841299aef257ea0
+ }
+ BlockState state = this.level().getBlockState(blockHitResult.getBlockPos());
+ state.onProjectileHit(this.level(), state, blockHitResult, this);
-+ this.discard();
++ this.discard(EntityRemoveEvent.Cause.DISCARD);
+ }
+}
diff --git a/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java
new file mode 100644
-index 0000000000000000000000000000000000000000..d0d951f867390fa12cae2ba2a49212354b10d7b0
+index 0000000000000000000000000000000000000000..11825590af9346c61d5d15e5ef446b3c77b81b54
--- /dev/null
+++ b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java
@@ -0,0 +1,121 @@
@@ -23457,11 +23443,11 @@ index 0000000000000000000000000000000000000000..d0d951f867390fa12cae2ba2a4921235
+ }
+
+ if (++ticksLived > 20) {
-+ this.discard();
++ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD);
+ } else if (this.level().getBlockStates(this.getBoundingBox()).noneMatch(BlockBehaviour.BlockStateBase::isAir)) {
-+ this.discard();
++ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD);
+ } else if (this.isInWaterOrBubble()) {
-+ this.discard();
++ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD);
+ } else {
+ this.setDeltaMovement(mot.scale(0.99D));
+ if (!this.isNoGravity()) {
@@ -23504,7 +23490,7 @@ index 0000000000000000000000000000000000000000..d0d951f867390fa12cae2ba2a4921235
+ BlockState state = this.level().getBlockState(blockHitResult.getBlockPos());
+ state.onProjectileHit(this.level(), state, blockHitResult, this);
+ }
-+ this.discard();
++ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD);
+ }
+}
diff --git a/src/main/java/org/purpurmc/purpur/entity/PurpurStoredBee.java b/src/main/java/org/purpurmc/purpur/entity/PurpurStoredBee.java
diff --git a/patches/server/0013-Remove-Timings.patch b/patches/server/0013-Remove-Timings.patch
index b6f647e0..1ab0da95 100644
--- a/patches/server/0013-Remove-Timings.patch
+++ b/patches/server/0013-Remove-Timings.patch
@@ -829,7 +829,7 @@ index b66a7d4aab887309579154815a0d4abf9de506b0..78cb9d7da9bb025ea362028fdc9d0317
return executedUnloadTask | canSaveChunk | canSaveEntities | canSavePOI ? new SaveStat(executedUnloadTask || canSaveChunk, canSaveEntities, canSavePOI): null;
}
diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
-index d840237674c67c739e0f990a89f77a31cb706558..942c2a826f9a4f8c66f2dcd0e7f25432edc4e836 100644
+index 65a51d934a98fd296fd41482c4201b974305dadc..31f200a30cbaa37e6167d3e162cc3f5195af392e 100644
--- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
+++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
@@ -1,7 +1,7 @@
@@ -1163,7 +1163,7 @@ index 8749010decf3a7d9490762c7641530bd91f4e19c..4ba34682cf4f8e610d8d456785a0da55
// Paper start
if (waitableArray[0] != null) {
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index 42869d35abb8d006fb720ca7190a770ce5cbf778..2b9968a8a3d0d66d9db5a83dcf2a44767a9fe412 100644
+index de511a1d43aa78ec79c12d78635175336f77b62c..546028b42544bd62578e415faa245559a373a289 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -1,6 +1,5 @@
@@ -1346,7 +1346,7 @@ index 6587ce30d88983cb42822e6ff3e012047d3ce16d..93ec0bdece165e5a5058f9a7ed2fd67d
}
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index a6a9a425aecdd58a65a926a22cd44f7a5c711007..a3b9068efc38b3eb05e884bcc3fb13532e49308d 100644
+index 0c376236d0cbc6033865f25db592c42a0d3d30d7..165b9f9ede6eec3e5667a2e653988f0e69ddb09f 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -1,7 +1,6 @@
@@ -1364,8 +1364,8 @@ index a6a9a425aecdd58a65a926a22cd44f7a5c711007..a3b9068efc38b3eb05e884bcc3fb1353
- this.timings.scheduledBlocks.startTiming(); // Paper
if (!this.isDebug() && flag) {
j = this.getGameTime();
- this.blockTicks.tick(j, 65536, this::tickBlock);
- this.fluidTicks.tick(j, 65536, this::tickFluid);
+ this.blockTicks.tick(j, paperConfig().environment.maxBlockTicks, this::tickBlock); // Paper - configurable max block ticks
+ this.fluidTicks.tick(j, paperConfig().environment.maxFluidTicks, this::tickFluid); // Paper - configurable max fluid ticks
}
- this.timings.scheduledBlocks.stopTiming(); // Paper
@@ -1528,7 +1528,7 @@ index a6a9a425aecdd58a65a926a22cd44f7a5c711007..a3b9068efc38b3eb05e884bcc3fb1353
} else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index a2a086dfd338574324368aa97a4297f899759101..1d0c724137c002801b3dbb239278f2a1c82c1d77 100644
+index fc57aad909a843a7ebd8490f125b424872f71ed5..ac9a2b8ba9f7a858b356296296d7424c451b69fe 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -2483,7 +2483,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
@@ -1557,7 +1557,7 @@ index a2a086dfd338574324368aa97a4297f899759101..1d0c724137c002801b3dbb239278f2a1
}
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 5748ada42d5039e8f2999f1ca0a74067a1dad08f..6fe6126dd37272ddeac89087887d9fe688a6bfcc 100644
+index 3c6002e33d1b86b60ccfa11ef615aa8f7adaf81b..7d98ba26ccde1e57378253e03c437650051f7843 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -1,6 +1,5 @@
@@ -1567,7 +1567,7 @@ index 5748ada42d5039e8f2999f1ca0a74067a1dad08f..6fe6126dd37272ddeac89087887d9fe6
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
-@@ -1337,7 +1336,6 @@ public abstract class PlayerList {
+@@ -1338,7 +1337,6 @@ public abstract class PlayerList {
public void saveAll(int interval) {
io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main
@@ -1575,7 +1575,7 @@ index 5748ada42d5039e8f2999f1ca0a74067a1dad08f..6fe6126dd37272ddeac89087887d9fe6
int numSaved = 0;
long now = MinecraftServer.currentTick;
for (int i = 0; i < this.players.size(); ++i) {
-@@ -1348,7 +1346,6 @@ public abstract class PlayerList {
+@@ -1349,7 +1347,6 @@ public abstract class PlayerList {
}
// Paper end - Incremental chunk and player saving
}
@@ -1723,7 +1723,7 @@ index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..4de18d00cc464313b777874430da3f55
}
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index 765f7034d3b1da22dd81c4186649e06fa58e50a5..36a420f8cf463dcabe5717df1af59472db3142fc 100644
+index 7583ce583b06306930cbae49b0386a6630bb916f..ff05efe0b78defe3d25905b6a2984bdb646fcff3 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
@@ -176,7 +176,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -1734,7 +1734,7 @@ index 765f7034d3b1da22dd81c4186649e06fa58e50a5..36a420f8cf463dcabe5717df1af59472
public static BlockPos lastPhysicsProblem; // Spigot
private org.spigotmc.TickLimiter entityLimiter;
private org.spigotmc.TickLimiter tileLimiter;
-@@ -355,7 +354,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -364,7 +363,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
public void onBorderSetDamageSafeZOne(WorldBorder border, double safeZoneRadius) {}
});
// CraftBukkit end
@@ -1742,7 +1742,7 @@ index 765f7034d3b1da22dd81c4186649e06fa58e50a5..36a420f8cf463dcabe5717df1af59472
this.keepSpawnInMemory = this.paperConfig().spawn.keepSpawnLoaded; // Paper - Option to keep spawn chunks loaded
this.entityLimiter = new org.spigotmc.TickLimiter(this.spigotConfig.entityMaxTickTime);
this.tileLimiter = new org.spigotmc.TickLimiter(this.spigotConfig.tileMaxTickTime);
-@@ -1323,15 +1321,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1332,15 +1330,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
protected void tickBlockEntities() {
@@ -1758,7 +1758,7 @@ index 765f7034d3b1da22dd81c4186649e06fa58e50a5..36a420f8cf463dcabe5717df1af59472
// Spigot start
// Iterator iterator = this.blockEntityTickers.iterator();
boolean flag = this.tickRateManager().runsNormally();
-@@ -1360,9 +1355,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -1369,9 +1364,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
this.blockEntityTickers.removeAll(toRemove); // Paper - Fix MC-117075
@@ -1870,7 +1870,7 @@ index 3d0b8761866046ae7ee6b5777fb098ce786abd94..221a4a3fbeac621ec593c7ba44b83f4b
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 38e80348c9b31847b98fa290a6b03f4060951367..443e227ee762163fa19eefb3c554fa871ad07323 100644
+index f4fb23ebdd35e23b022bdd78421dec6d86342260..3c3b98d13587ce21bffa14a79aed963a7ce1f176 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -470,7 +470,6 @@ public final class CraftServer implements Server {
diff --git a/patches/server/0014-Bump-Dependencies.patch b/patches/server/0014-Bump-Dependencies.patch
index 38ac286b..66b55331 100644
--- a/patches/server/0014-Bump-Dependencies.patch
+++ b/patches/server/0014-Bump-Dependencies.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Bump Dependencies
diff --git a/build.gradle.kts b/build.gradle.kts
-index a850f63770e46293c0efe3ac03583bfcbc0ed946..607d6a73daba955734f651530e4d3db87110eb16 100644
+index 54372661e263807e717e5cfdc395311486bbeaa5..e83c550469dfc70a190c5daf2d4a918fa9048863 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -32,9 +32,9 @@ dependencies {
@@ -16,7 +16,7 @@ index a850f63770e46293c0efe3ac03583bfcbc0ed946..607d6a73daba955734f651530e4d3db8
+ implementation("org.jline:jline-terminal-jansi:3.25.1") // Leaf - Bump Dependencies
implementation("net.minecrell:terminalconsoleappender:1.3.0")
- implementation("net.kyori:adventure-text-serializer-ansi:4.14.0") // Keep in sync with adventureVersion from Paper-API build file
-+ implementation("net.kyori:adventure-text-serializer-ansi:4.15.0") // Keep in sync with adventureVersion from Paper-API build file // Leaf - Bump Dependencies
++ implementation("net.kyori:adventure-text-serializer-ansi:4.16.0") // Keep in sync with adventureVersion from Paper-API build file // Leaf - Bump Dependencies
implementation("net.kyori:ansi:1.0.3") // Manually bump beyond above transitive dep
/*
Required to add the missing Log4j2Plugins.dat file from log4j-core
@@ -27,8 +27,8 @@ index a850f63770e46293c0efe3ac03583bfcbc0ed946..607d6a73daba955734f651530e4d3db8
- implementation("org.apache.logging.log4j:log4j-core:2.19.0") // Paper - implementation
- log4jPlugins.annotationProcessorConfigurationName("org.apache.logging.log4j:log4j-core:2.19.0") // Paper - Needed to generate meta for our Log4j plugins
+ // Leaf start - Bump Dependencies
-+ implementation("org.apache.logging.log4j:log4j-core:2.22.1") // Paper - implementation
-+ log4jPlugins.annotationProcessorConfigurationName("org.apache.logging.log4j:log4j-core:2.22.1") // Paper - Needed to generate meta for our Log4j plugins
++ implementation("org.apache.logging.log4j:log4j-core:2.23.0") // Paper - implementation
++ log4jPlugins.annotationProcessorConfigurationName("org.apache.logging.log4j:log4j-core:2.23.0") // Paper - Needed to generate meta for our Log4j plugins
runtimeOnly(log4jPlugins.output)
alsoShade(log4jPlugins.output)
- implementation("io.netty:netty-codec-haproxy:4.1.97.Final") // Paper - Add support for proxy protocol
@@ -36,7 +36,7 @@ index a850f63770e46293c0efe3ac03583bfcbc0ed946..607d6a73daba955734f651530e4d3db8
// Paper end
- implementation("org.apache.logging.log4j:log4j-iostreams:2.19.0") // Paper - remove exclusion
- implementation("org.ow2.asm:asm-commons:9.5")
-+ implementation("org.apache.logging.log4j:log4j-iostreams:2.22.1") // Paper - remove exclusion
++ implementation("org.apache.logging.log4j:log4j-iostreams:2.23.0") // Paper - remove exclusion
+ implementation("org.ow2.asm:asm-commons:9.6")
implementation("org.spongepowered:configurate-yaml:4.2.0-SNAPSHOT") // Paper - config files
implementation("commons-lang:commons-lang:2.6")
@@ -57,18 +57,20 @@ index a850f63770e46293c0efe3ac03583bfcbc0ed946..607d6a73daba955734f651530e4d3db8
// Paper end - Use Velocity cipher
runtimeOnly("org.apache.maven:maven-resolver-provider:3.9.6")
-@@ -72,11 +74,15 @@ dependencies {
+@@ -72,12 +74,16 @@ dependencies {
implementation("dev.omega24:upnp4j:1.0")
// Purpur end
- testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test
- testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
+ // Leaf start - Bump Dependencies
-+ testImplementation("io.github.classgraph:classgraph:4.8.165") // Paper - mob goal test
++ testImplementation("io.github.classgraph:classgraph:4.8.167") // Paper - mob goal test
+ testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
testImplementation("org.hamcrest:hamcrest:2.2")
- testImplementation("org.mockito:mockito-core:5.5.0")
-+ testImplementation("org.mockito:mockito-core:5.10.0")
+- testImplementation("org.ow2.asm:asm-tree:9.5")
++ testImplementation("org.mockito:mockito-core:5.11.0")
++ testImplementation("org.ow2.asm:asm-tree:9.6")
testImplementation("org.junit-pioneer:junit-pioneer:2.2.0") // Paper - CartesianTest
+
+ implementation("io.netty:netty-all:4.1.107.Final")
@@ -76,7 +78,7 @@ index a850f63770e46293c0efe3ac03583bfcbc0ed946..607d6a73daba955734f651530e4d3db8
}
val craftbukkitPackageVersion = "1_20_R3" // Paper
-@@ -268,3 +274,7 @@ sourceSets {
+@@ -269,3 +275,7 @@ sourceSets {
}
}
// Gale end - package license into jar
diff --git a/patches/server/0020-KeYi-Disable-arrow-despawn-counter-by-default.patch b/patches/server/0020-KeYi-Disable-arrow-despawn-counter-by-default.patch
index b7cb752c..40b3f436 100644
--- a/patches/server/0020-KeYi-Disable-arrow-despawn-counter-by-default.patch
+++ b/patches/server/0020-KeYi-Disable-arrow-despawn-counter-by-default.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/KeYiMC/KeYi
diff --git a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
-index 5fe6f626b63274e33f7c8b46441d17cf4ff9d533..fcc5d94b52036eb7b6c5e5316eef0919e7f6ea08 100644
+index 633bc62a41b2bc34496a507da9fe0e2eec10468d..f1c76f96a845208a11e45988f59abf128df37f0d 100644
--- a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
+++ b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
-@@ -140,7 +140,7 @@ public class GaleWorldConfiguration extends ConfigurationPart {
+@@ -138,7 +138,7 @@ public class GaleWorldConfiguration extends ConfigurationPart {
public boolean loadPortalDestinationChunkBeforeEntityTeleport = false; // Gale - MultiPaper - load portal destination chunk before entity teleport
}
diff --git a/patches/server/0021-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch b/patches/server/0021-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch
index e2c845ad..4de227e2 100644
--- a/patches/server/0021-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch
+++ b/patches/server/0021-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/KeYiMC/KeYi
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
-index 2c19d6687e1554373e4c7f43a8fec8e770942f50..fbee057a90fb47f4b31388cdff052fbaf04b33d6 100644
+index 84712ae2d9f6024426fe4700f5539a5a33c2fc46..56f9b0c9277aeff3b2d3d7e44f8af6d8d6d23941 100644
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
-@@ -349,7 +349,7 @@ public class ItemEntity extends Entity implements TraceableEntity {
+@@ -350,7 +350,7 @@ public class ItemEntity extends Entity implements TraceableEntity {
ItemStack itemstack1 = other.getItem();
if (Objects.equals(this.target, other.target) && ItemEntity.areMergable(itemstack, itemstack1)) {
diff --git a/patches/server/0025-Akarin-Save-Json-list-asynchronously.patch b/patches/server/0025-Akarin-Save-Json-list-asynchronously.patch
index 0f6a72ce..3025050f 100644
--- a/patches/server/0025-Akarin-Save-Json-list-asynchronously.patch
+++ b/patches/server/0025-Akarin-Save-Json-list-asynchronously.patch
@@ -8,10 +8,10 @@ Original license: GPL v3
Original project: https://github.com/Akarin-project/Akarin
diff --git a/src/main/java/net/minecraft/server/players/StoredUserList.java b/src/main/java/net/minecraft/server/players/StoredUserList.java
-index 219e0059418e6d64f5b859ba253c3cf3e91713cf..ae5a8cd4d5a2d89918699f44b99f7332316553a0 100644
+index c524ca1eab9db011f8203835c43e244ff4101e87..b5a31105ca972f5b6a6b74786904631aa0998ce9 100644
--- a/src/main/java/net/minecraft/server/players/StoredUserList.java
+++ b/src/main/java/net/minecraft/server/players/StoredUserList.java
-@@ -23,6 +23,7 @@ import java.util.stream.Stream;
+@@ -22,6 +22,7 @@ import java.util.stream.Stream;
import javax.annotation.Nullable;
import me.titaniumtown.ArrayConstants;
diff --git a/patches/server/0026-Slice-Smooth-Teleports.patch b/patches/server/0026-Slice-Smooth-Teleports.patch
index b42fcb1a..f83c7785 100644
--- a/patches/server/0026-Slice-Smooth-Teleports.patch
+++ b/patches/server/0026-Slice-Smooth-Teleports.patch
@@ -19,10 +19,10 @@ index 0cc07f1df65a86cc4e2c0a254ea2cb782a797901..9950580f3d0387b142576bfdb6a8f743
// Paper start - replace player chunk loader
private final java.util.concurrent.atomic.AtomicReference viewDistances = new java.util.concurrent.atomic.AtomicReference<>(new io.papermc.paper.chunk.system.RegionizedPlayerChunkLoader.ViewDistances(-1, -1, -1));
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 6fe6126dd37272ddeac89087887d9fe688a6bfcc..8fd80d1167edea751fec1c14deabc427c221e98b 100644
+index 7d98ba26ccde1e57378253e03c437650051f7843..42e6754ae5432a41f54064961bd5d66891a30612 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -969,10 +969,10 @@ public abstract class PlayerList {
+@@ -970,10 +970,10 @@ public abstract class PlayerList {
ServerLevel worldserver2 = entityplayer1.serverLevel();
LevelData worlddata = worldserver2.getLevelData();
@@ -36,7 +36,7 @@ index 6fe6126dd37272ddeac89087887d9fe688a6bfcc..8fd80d1167edea751fec1c14deabc427
entityplayer1.connection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked()));
entityplayer1.connection.send(new ClientboundSetExperiencePacket(entityplayer1.experienceProgress, entityplayer1.totalExperience, entityplayer1.experienceLevel));
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index ce70f01611181e8f4c7324c7b9f9944a8605c710..a7a4f3eb95786e0a1e70df97d0fcd48b8b39c0fd 100644
+index 19d91e4a94527eea6dda8d9bdf782f14414be512..6fe50b6dcda8d5356fccc7f3d9e30f21e3c1bef3 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -1266,6 +1266,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
diff --git a/patches/server/0028-Leaves-Server-Utils.patch b/patches/server/0028-Leaves-Server-Utils.patch
index 613c473e..78b0a389 100644
--- a/patches/server/0028-Leaves-Server-Utils.patch
+++ b/patches/server/0028-Leaves-Server-Utils.patch
@@ -7,10 +7,10 @@ Original license: GPLv3
Original project: https://github.com/LeavesMC/Leaves
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 6c70002119d40a0074319d2ee85862930d6abf0e..3a1b8f57c74124dbb413651a099dbadbc2e28490 100644
+index 679209274fbbf8e10498ecec852b0994af2a39e7..ffb47d13563f0ff1f557dfe2ed53be7f170f12fa 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -424,6 +424,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -425,6 +425,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
private UUID originWorld;
public boolean freezeLocked = false; // Paper - Freeze Tick Lock API
public boolean fixedPose = false; // Paper - Expand Pose API
@@ -18,7 +18,7 @@ index 6c70002119d40a0074319d2ee85862930d6abf0e..3a1b8f57c74124dbb413651a099dbadb
public void setOrigin(@javax.annotation.Nonnull Location location) {
this.origin = location.toVector();
-@@ -2532,6 +2533,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -2548,6 +2549,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
nbttagcompound.putBoolean("Paper.FreezeLock", true);
}
// Paper end
@@ -26,7 +26,7 @@ index 6c70002119d40a0074319d2ee85862930d6abf0e..3a1b8f57c74124dbb413651a099dbadb
return nbttagcompound;
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT");
-@@ -2679,6 +2681,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -2695,6 +2697,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
freezeLocked = nbt.getBoolean("Paper.FreezeLock");
}
// Paper end
@@ -38,7 +38,7 @@ index 6c70002119d40a0074319d2ee85862930d6abf0e..3a1b8f57c74124dbb413651a099dbadb
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT");
-@@ -5110,4 +5117,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -5134,4 +5141,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
return false;
}
// Purpur end
diff --git a/patches/server/0029-Leaves-Protocol-Core.patch b/patches/server/0029-Leaves-Protocol-Core.patch
index 1a8ac971..770433f3 100644
--- a/patches/server/0029-Leaves-Protocol-Core.patch
+++ b/patches/server/0029-Leaves-Protocol-Core.patch
@@ -58,10 +58,10 @@ index 61cd58a5bb3d228b29b9cc4db11be03d4c833223..1610f21bbfbca0d12ca12373e56d90a5
} catch (Exception ex) {
ServerGamePacketListenerImpl.LOGGER.error("Couldn\'t register custom payload", ex);
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 8fd80d1167edea751fec1c14deabc427c221e98b..80db3fcf338846770e8c8ee6aa7635a68f2b6753 100644
+index 42e6754ae5432a41f54064961bd5d66891a30612..9a3dbd337728374e3adb1071769f7824c2698fe3 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -361,6 +361,7 @@ public abstract class PlayerList {
+@@ -362,6 +362,7 @@ public abstract class PlayerList {
}
player.didPlayerJoinEvent = true; // Gale - EMC - do not process chat/commands before player has joined
@@ -69,7 +69,7 @@ index 8fd80d1167edea751fec1c14deabc427c221e98b..80db3fcf338846770e8c8ee6aa7635a6
final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage();
-@@ -619,6 +620,7 @@ public abstract class PlayerList {
+@@ -620,6 +621,7 @@ public abstract class PlayerList {
return this.remove(entityplayer, net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, io.papermc.paper.configuration.GlobalConfiguration.get().messages.useDisplayNameInQuitMessage ? entityplayer.getBukkitEntity().displayName() : io.papermc.paper.adventure.PaperAdventure.asAdventure(entityplayer.getDisplayName())));
}
public net.kyori.adventure.text.Component remove(ServerPlayer entityplayer, net.kyori.adventure.text.Component leaveMessage) {
@@ -78,7 +78,7 @@ index 8fd80d1167edea751fec1c14deabc427c221e98b..80db3fcf338846770e8c8ee6aa7635a6
org.purpurmc.purpur.task.BossBarTask.removeFromAll(entityplayer.getBukkitEntity()); // Purpur
ServerLevel worldserver = entityplayer.serverLevel();
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 443e227ee762163fa19eefb3c554fa871ad07323..a1317e374066d2abe20064bc47e20f4b19db9705 100644
+index 3c3b98d13587ce21bffa14a79aed963a7ce1f176..db96be7e6f30ecab1349c1fe68fcdd2f4e27167d 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -482,6 +482,7 @@ public final class CraftServer implements Server {
@@ -117,19 +117,22 @@ index 0000000000000000000000000000000000000000..f884f54f5a1f0665c290e014f088aae8
+}
diff --git a/src/main/java/top/leavesmc/leaves/protocol/core/LeavesProtocolManager.java b/src/main/java/top/leavesmc/leaves/protocol/core/LeavesProtocolManager.java
new file mode 100644
-index 0000000000000000000000000000000000000000..26544936005d167f764a823faebc200f59b2e008
+index 0000000000000000000000000000000000000000..740039a14fe915e7edd30273de628efd92512e4a
--- /dev/null
+++ b/src/main/java/top/leavesmc/leaves/protocol/core/LeavesProtocolManager.java
-@@ -0,0 +1,339 @@
+@@ -0,0 +1,361 @@
+package top.leavesmc.leaves.protocol.core;
+
+import net.minecraft.network.FriendlyByteBuf;
++import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket;
+import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.server.level.ServerPlayer;
+import org.apache.commons.lang.ArrayUtils;
+import org.jetbrains.annotations.NotNull;
+
++import org.bukkit.event.player.PlayerKickEvent;
++
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
@@ -141,6 +144,7 @@ index 0000000000000000000000000000000000000000..26544936005d167f764a823faebc200f
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
++import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
@@ -265,6 +269,8 @@ index 0000000000000000000000000000000000000000..26544936005d167f764a823faebc200f
+ return map.get(receiver).newInstance(id, buf);
+ } catch (InvocationTargetException | InstantiationException | IllegalAccessException e) {
+ e.printStackTrace();
++ buf.readBytes(buf.readableBytes());
++ return new ErrorPayload(id, protocol.namespace(), receiver.payloadId());
+ }
+ }
+ }
@@ -273,6 +279,15 @@ index 0000000000000000000000000000000000000000..26544936005d167f764a823faebc200f
+ }
+
+ public static void handlePayload(ServerPlayer player, CustomPacketPayload payload) {
++ if (payload instanceof ServerboundCustomPayloadPacket.UnknownPayload) {
++ return;
++ }
++
++ if (payload instanceof ErrorPayload errorPayload) {
++ player.connection.disconnect("Payload " + Arrays.toString(errorPayload.packetID) + " from " + Arrays.toString(errorPayload.protocolID) + " error", PlayerKickEvent.Cause.INVALID_PAYLOAD);
++ return;
++ }
++
+ for (LeavesProtocol protocol : KNOW_RECEIVERS.keySet()) {
+ if (!ArrayUtils.contains(protocol.namespace(), payload.id().getNamespace())) {
+ continue;
@@ -437,6 +452,13 @@ index 0000000000000000000000000000000000000000..26544936005d167f764a823faebc200f
+ }
+ }
+
++ public record ErrorPayload(ResourceLocation id, String[] protocolID,
++ String[] packetID) implements CustomPacketPayload {
++ @Override
++ public void write(@NotNull FriendlyByteBuf buf) {
++ }
++ }
++
+ public record EmptyPayload(ResourceLocation id) implements CustomPacketPayload {
+
+ public EmptyPayload(ResourceLocation location, FriendlyByteBuf buf) {
diff --git a/patches/server/0030-Leaves-Jade-Protocol.patch b/patches/server/0030-Leaves-Jade-Protocol.patch
index 8d2645f3..f935385b 100644
--- a/patches/server/0030-Leaves-Jade-Protocol.patch
+++ b/patches/server/0030-Leaves-Jade-Protocol.patch
@@ -9,10 +9,10 @@ Original project: https://github.com/LeavesMC/Leaves
This patch is Powered by Jade(https://github.com/Snownee/Jade)
diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
-index b2a92648490ac54cd6ecc3bbfb9740db684284ce..1fbd034002fd5761011976510b9f9263ca0f5cac 100644
+index 93e321a0b8fdce12968f03b3cfe6724ae564b823..cd696f6bb7f77338dd289c7c2d6bdf23d79264aa 100644
--- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
+++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
-@@ -288,7 +288,7 @@ public class Tadpole extends AbstractFish {
+@@ -291,7 +291,7 @@ public class Tadpole extends AbstractFish {
}
diff --git a/patches/server/0032-Leaves-Xaero-Map-Protocol.patch b/patches/server/0032-Leaves-Xaero-Map-Protocol.patch
index 8fe7dabf..24e88b92 100644
--- a/patches/server/0032-Leaves-Xaero-Map-Protocol.patch
+++ b/patches/server/0032-Leaves-Xaero-Map-Protocol.patch
@@ -7,10 +7,10 @@ Original license: GPLv3
Original project: https://github.com/LeavesMC/Leaves
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 80db3fcf338846770e8c8ee6aa7635a68f2b6753..d9640b2a08101e9bd65323019c1de9c087822dde 100644
+index 9a3dbd337728374e3adb1071769f7824c2698fe3..e960528f7e261552b3936e596d0ff9c285a151ca 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -1375,6 +1375,7 @@ public abstract class PlayerList {
+@@ -1376,6 +1376,7 @@ public abstract class PlayerList {
player.connection.send(new ClientboundInitializeBorderPacket(worldborder));
player.connection.send(new ClientboundSetTimePacket(world.getGameTime(), world.getDayTime(), world.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)));
player.connection.send(new ClientboundSetDefaultSpawnPositionPacket(world.getSharedSpawnPos(), world.getSharedSpawnAngle()));
diff --git a/patches/server/0035-Leaves-Fix-vehicle-teleport-by-end-gateway.patch b/patches/server/0035-Leaves-Fix-vehicle-teleport-by-end-gateway.patch
index fa75ef11..5a36400a 100644
--- a/patches/server/0035-Leaves-Fix-vehicle-teleport-by-end-gateway.patch
+++ b/patches/server/0035-Leaves-Fix-vehicle-teleport-by-end-gateway.patch
@@ -7,10 +7,10 @@ Original license: GPLv3
Original project: https://github.com/LeavesMC/Leaves
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 72a69569fab9d62c27c3ea4005c4e24816bdc5cd..0c36da54212a7e5ccc2277539daa79e014e0b689 100644
+index f5e9b99459c3e7d28272f0c2499794f9710f57ce..fdfd3cb1d96da85b17139e8030040ce9aa5ae479 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
-@@ -107,7 +107,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity {
+@@ -108,7 +108,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity {
if (!list.isEmpty()) {
// Paper start - Ensure safe gateway teleport
for (Entity entity : list) {
diff --git a/patches/server/0038-Sync-with-Gale-s-Optimize-sun-burn-tick.patch.patch b/patches/server/0038-Sync-with-Gale-s-Optimize-sun-burn-tick.patch.patch
index f2918f72..8c5da90e 100644
--- a/patches/server/0038-Sync-with-Gale-s-Optimize-sun-burn-tick.patch.patch
+++ b/patches/server/0038-Sync-with-Gale-s-Optimize-sun-burn-tick.patch.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Sync with Gale's Optimize-sun-burn-tick.patch
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 3a1b8f57c74124dbb413651a099dbadbc2e28490..c2cd75fe46adaa59b8f25dbb5f29c66796e1b60e 100644
+index ffb47d13563f0ff1f557dfe2ed53be7f170f12fa..f9b0c49423ec9a66389f9f0e93e57ef7714cbe08 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -567,13 +567,29 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
+@@ -568,13 +568,29 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
}
// Purpur start - copied from Mob
@@ -42,10 +42,10 @@ index 3a1b8f57c74124dbb413651a099dbadbc2e28490..c2cd75fe46adaa59b8f25dbb5f29c667
}
}
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 2f06a3226f05797d6e2427e444a568bf06c67e3a..b0f151360a6263192aed9c1ff79c442bfe488483 100644
+index 70b5f3ce8d94765e84215015dd0c268f783990c9..ab442ad33124c75c261752d14d0ee209a673209e 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
-@@ -1740,11 +1740,6 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -1741,11 +1741,6 @@ public abstract class Mob extends LivingEntity implements Targeting {
}
diff --git a/patches/server/0039-Petal-Async-Pathfinding.patch b/patches/server/0039-Petal-Async-Pathfinding.patch
index 9f5d4d62..71dbf769 100644
--- a/patches/server/0039-Petal-Async-Pathfinding.patch
+++ b/patches/server/0039-Petal-Async-Pathfinding.patch
@@ -15,10 +15,10 @@ This patch was ported downstream from the Petal fork.
Makes most pathfinding-related work happen asynchronously
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index b0f151360a6263192aed9c1ff79c442bfe488483..6e3617696c50262574dfba2048f18edd1f7d88ef 100644
+index ab442ad33124c75c261752d14d0ee209a673209e..0f21e5d6c81203aff833d02e5cc3a43dadb876e2 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
-@@ -294,6 +294,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
+@@ -295,6 +295,7 @@ public abstract class Mob extends LivingEntity implements Targeting {
@Nullable
@Override
public LivingEntity getTarget() {
diff --git a/patches/server/0040-Petal-Multithreaded-Tracker.patch b/patches/server/0040-Petal-Multithreaded-Tracker.patch
index 48963af2..2016f8fc 100644
--- a/patches/server/0040-Petal-Multithreaded-Tracker.patch
+++ b/patches/server/0040-Petal-Multithreaded-Tracker.patch
@@ -65,10 +65,10 @@ index 0fd814f1d65c111266a2b20f86561839a4cef755..3fbf6eeb3e835269217a381f00b54a7e
protected final double maxFragFactor;
diff --git a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java
-index 66721a27cc9a373a12dffb72c4a403473377eff6..2fbab1b4d20c3ead0ed1a117b29679fae6776f22 100644
+index d8b22d51d28692182cd75affd6cb552971fed42f..63aa94b0004aa2ea5de5dce775453704e0fbc887 100644
--- a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java
+++ b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java
-@@ -36,7 +36,7 @@ public final class ChunkEntitySlices {
+@@ -37,7 +37,7 @@ public final class ChunkEntitySlices {
protected final EntityCollectionBySection allEntities;
protected final EntityCollectionBySection hardCollidingEntities;
protected final Reference2ObjectOpenHashMap, EntityCollectionBySection> entitiesByClass;
@@ -78,7 +78,7 @@ index 66721a27cc9a373a12dffb72c4a403473377eff6..2fbab1b4d20c3ead0ed1a117b29679fa
public FullChunkStatus status;
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index 2b9968a8a3d0d66d9db5a83dcf2a44767a9fe412..e95f6053982f9637c195243ceab37061b31355b5 100644
+index 546028b42544bd62578e415faa245559a373a289..29ea09f27f4b0a7f1ab6075e68c7379898ff2339 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -1128,8 +1128,35 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -262,7 +262,7 @@ index 515e3f444e317de1d82421ad414c1ac10d4668ab..60e8bfc89cfb92e2f7d4860b11c16b3b
set.clear();
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index a3b9068efc38b3eb05e884bcc3fb13532e49308d..f016b5e323f8167d058f61480095721684fd6e42 100644
+index 165b9f9ede6eec3e5667a2e653988f0e69ddb09f..0526ec7809f4937af85494679317f5fcbb6d8893 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -2633,7 +2633,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
diff --git a/patches/server/0044-Reduce-canSee-work.patch b/patches/server/0044-Reduce-canSee-work.patch
index a8a07420..7832a46f 100644
--- a/patches/server/0044-Reduce-canSee-work.patch
+++ b/patches/server/0044-Reduce-canSee-work.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Reduce canSee work
Credit by: Martijn Muijsers , MachineBreaker
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index 36a420f8cf463dcabe5717df1af59472db3142fc..3c5d8275782df8d9b3fb6e8047bfde02e26ca93f 100644
+index ff05efe0b78defe3d25905b6a2984bdb646fcff3..4c40245756cfbe4ba14069c58d615cea7e2fbf38 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
-@@ -383,17 +383,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
+@@ -392,17 +392,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
for (int i = 0, len = entities.size(); i < len; ++i) {
Entity entity = entities.get(i);
@@ -35,7 +35,7 @@ index 36a420f8cf463dcabe5717df1af59472db3142fc..3c5d8275782df8d9b3fb6e8047bfde02
if (net.minecraft.world.phys.shapes.Shapes.joinIsNotEmpty(voxelshape, net.minecraft.world.phys.shapes.Shapes.create(entity.getBoundingBox()), net.minecraft.world.phys.shapes.BooleanOp.AND)) {
return false;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index a7a4f3eb95786e0a1e70df97d0fcd48b8b39c0fd..2dc391fed96464ccecbd8adbd0795cdf61095aa2 100644
+index 6fe50b6dcda8d5356fccc7f3d9e30f21e3c1bef3..ad282ad487912c5687916b93be605b21a1ff8f15 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -555,6 +555,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
diff --git a/patches/server/0048-Fix-sprint-glitch.patch b/patches/server/0048-Fix-sprint-glitch.patch
index 8cdd3701..1d399895 100644
--- a/patches/server/0048-Fix-sprint-glitch.patch
+++ b/patches/server/0048-Fix-sprint-glitch.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Fix sprint glitch
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-index f70f58937eedd69ebb46fefb367ab253293d2d96..8dd11653a39ea94d6a4b307faebcbb3b4f3e33dd 100644
+index dccb8934428b0c29e35f2bf9968fd32443dc11eb..becdbc814361a7823657759087b2ffcbd778b0e4 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
-@@ -1431,7 +1431,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
+@@ -1439,7 +1439,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
player.setRealHealth(health);
}
diff --git a/patches/server/0050-Configurable-movement-speed-of-more-entities.patch b/patches/server/0050-Configurable-movement-speed-of-more-entities.patch
index d15460c2..719f01e7 100644
--- a/patches/server/0050-Configurable-movement-speed-of-more-entities.patch
+++ b/patches/server/0050-Configurable-movement-speed-of-more-entities.patch
@@ -113,10 +113,10 @@ index feba8a264bae656244f60296d0511a8046297f73..2a24928fc4509ac3603f7e5ce574fed8
@Override
protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) {
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95fe8eceb7 100644
+index cd73f0e40e5010e3069330ae66120dace63cde56..f6338904ca0961cfd67326908e9cf72e37c6e86e 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-@@ -1535,6 +1535,7 @@ public class PurpurWorldConfig {
+@@ -1530,6 +1530,7 @@ public class PurpurWorldConfig {
public boolean drownedTakeDamageFromWater = false;
public boolean drownedBreakDoors = false;
public boolean drownedAlwaysDropExp = false;
@@ -124,7 +124,7 @@ index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95
private void drownedSettings() {
drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable);
drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater);
-@@ -1552,6 +1553,7 @@ public class PurpurWorldConfig {
+@@ -1547,6 +1548,7 @@ public class PurpurWorldConfig {
drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater);
drownedBreakDoors = getBoolean("mobs.drowned.can-break-doors", drownedBreakDoors);
drownedAlwaysDropExp = getBoolean("mobs.drowned.always-drop-exp", drownedAlwaysDropExp);
@@ -132,7 +132,7 @@ index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95
}
public boolean elderGuardianRidable = false;
-@@ -1898,6 +1900,7 @@ public class PurpurWorldConfig {
+@@ -1893,6 +1895,7 @@ public class PurpurWorldConfig {
public boolean huskJockeyTryExistingChickens = true;
public boolean huskTakeDamageFromWater = false;
public boolean huskAlwaysDropExp = false;
@@ -140,7 +140,7 @@ index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95
private void huskSettings() {
huskRidable = getBoolean("mobs.husk.ridable", huskRidable);
huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater);
-@@ -1914,6 +1917,7 @@ public class PurpurWorldConfig {
+@@ -1909,6 +1912,7 @@ public class PurpurWorldConfig {
huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens);
huskTakeDamageFromWater = getBoolean("mobs.husk.takes-damage-from-water", huskTakeDamageFromWater);
huskAlwaysDropExp = getBoolean("mobs.husk.always-drop-exp", huskAlwaysDropExp);
@@ -148,7 +148,7 @@ index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95
}
public boolean illusionerRidable = false;
-@@ -3124,6 +3128,7 @@ public class PurpurWorldConfig {
+@@ -3119,6 +3123,7 @@ public class PurpurWorldConfig {
public boolean zombieTakeDamageFromWater = false;
public boolean zombieAlwaysDropExp = false;
public double zombieHeadVisibilityPercent = 0.5D;
@@ -156,7 +156,7 @@ index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95
private void zombieSettings() {
zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable);
zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater);
-@@ -3143,6 +3148,7 @@ public class PurpurWorldConfig {
+@@ -3138,6 +3143,7 @@ public class PurpurWorldConfig {
zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater);
zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp);
zombieHeadVisibilityPercent = getDouble("mobs.zombie.head-visibility-percent", zombieHeadVisibilityPercent);
@@ -164,7 +164,7 @@ index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95
}
public boolean zombieHorseRidable = false;
-@@ -3191,6 +3197,7 @@ public class PurpurWorldConfig {
+@@ -3186,6 +3192,7 @@ public class PurpurWorldConfig {
public int zombieVillagerCuringTimeMax = 6000;
public boolean zombieVillagerCureEnabled = true;
public boolean zombieVillagerAlwaysDropExp = false;
@@ -172,7 +172,7 @@ index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95
private void zombieVillagerSettings() {
zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable);
zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater);
-@@ -3210,6 +3217,7 @@ public class PurpurWorldConfig {
+@@ -3205,6 +3212,7 @@ public class PurpurWorldConfig {
zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax);
zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled);
zombieVillagerAlwaysDropExp = getBoolean("mobs.zombie_villager.always-drop-exp", zombieVillagerAlwaysDropExp);
@@ -180,7 +180,7 @@ index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95
}
public boolean zombifiedPiglinRidable = false;
-@@ -3223,6 +3231,7 @@ public class PurpurWorldConfig {
+@@ -3218,6 +3226,7 @@ public class PurpurWorldConfig {
public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true;
public boolean zombifiedPiglinTakeDamageFromWater = false;
public boolean zombifiedPiglinAlwaysDropExp = false;
@@ -188,7 +188,7 @@ index 8769b5b74ec14ddae8210008b84a9ca82b2aa6f1..a750e4e499a30499538072644c24cf95
private void zombifiedPiglinSettings() {
zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable);
zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater);
-@@ -3240,6 +3249,7 @@ public class PurpurWorldConfig {
+@@ -3235,6 +3244,7 @@ public class PurpurWorldConfig {
zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry);
zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater);
zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp);
diff --git a/patches/server/0051-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch b/patches/server/0051-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch
index 14dd991d..3c086630 100644
--- a/patches/server/0051-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch
+++ b/patches/server/0051-Fix-TerminalConsoleAppender-NPE-error-on-server-clos.patch
@@ -13,7 +13,7 @@ Fixed errors in console has no color,also fixed`Advanced terminal features are n
or `Unable to create terminal` like issues
diff --git a/build.gradle.kts b/build.gradle.kts
-index 607d6a73daba955734f651530e4d3db87110eb16..7953623fe9858b9d8996a73a2c0145a9d736337e 100644
+index e83c550469dfc70a190c5daf2d4a918fa9048863..b1fd42d66874f29428a22570059f07696b487d5e 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -33,7 +33,7 @@ dependencies {
@@ -22,7 +22,7 @@ index 607d6a73daba955734f651530e4d3db87110eb16..7953623fe9858b9d8996a73a2c0145a9
implementation("org.jline:jline-terminal-jansi:3.25.1") // Leaf - Bump Dependencies
- implementation("net.minecrell:terminalconsoleappender:1.3.0")
+ implementation("com.github.Dreeam-qwq:TerminalConsoleAppender:360a0759") // Leaf - Use own TerminalConsoleAppender fork to fix some issues under latest version of jline/log4j
- implementation("net.kyori:adventure-text-serializer-ansi:4.15.0") // Keep in sync with adventureVersion from Paper-API build file // Leaf - Bump Dependencies
+ implementation("net.kyori:adventure-text-serializer-ansi:4.16.0") // Keep in sync with adventureVersion from Paper-API build file // Leaf - Bump Dependencies
implementation("net.kyori:ansi:1.0.3") // Manually bump beyond above transitive dep
/*
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
diff --git a/patches/server/0053-Reduce-items-finding-hopper-nearby-check.patch b/patches/server/0053-Reduce-items-finding-hopper-nearby-check.patch
index be2cf7e1..bfd10a57 100644
--- a/patches/server/0053-Reduce-items-finding-hopper-nearby-check.patch
+++ b/patches/server/0053-Reduce-items-finding-hopper-nearby-check.patch
@@ -10,7 +10,7 @@ But still recommend to turn-off `checkForMinecartNearItemWhileActive`
Since `Reduce-hopper-item-checks.patch` will cause lag under massive dropped items
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
-index fbee057a90fb47f4b31388cdff052fbaf04b33d6..a68a6649d4ab40de1703ecc188566c9499ed4abc 100644
+index 56f9b0c9277aeff3b2d3d7e44f8af6d8d6d23941..35b15c6e7371b19876e138e033d42f1fcb412541 100644
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
@@ -1,7 +1,9 @@
@@ -23,8 +23,8 @@ index fbee057a90fb47f4b31388cdff052fbaf04b33d6..a68a6649d4ab40de1703ecc188566c94
import java.util.Objects;
import java.util.UUID;
import javax.annotation.Nullable;
-@@ -237,7 +239,9 @@ public class ItemEntity extends Entity implements TraceableEntity {
- this.discard();
+@@ -238,7 +240,9 @@ public class ItemEntity extends Entity implements TraceableEntity {
+ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
return; // Gale - EMC - reduce hopper item checks
}
- this.markNearbyHopperCartsAsImmune(); // Gale - EMC - reduce hopper item checks
@@ -34,7 +34,7 @@ index fbee057a90fb47f4b31388cdff052fbaf04b33d6..a68a6649d4ab40de1703ecc188566c94
}
}
-@@ -249,17 +253,53 @@ public class ItemEntity extends Entity implements TraceableEntity {
+@@ -250,17 +254,53 @@ public class ItemEntity extends Entity implements TraceableEntity {
if (config.interval <= 1) {
return;
}
@@ -89,7 +89,7 @@ index fbee057a90fb47f4b31388cdff052fbaf04b33d6..a68a6649d4ab40de1703ecc188566c94
@Override
public void inactiveTick() {
diff --git a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
-index fcc5d94b52036eb7b6c5e5316eef0919e7f6ea08..704791c80d42a653c8e02440d46cd96e6adb5fb5 100644
+index f1c76f96a845208a11e45988f59abf128df37f0d..53375e9509a0871f337eefc387d1d9cbb53f5c1a 100644
--- a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
+++ b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
@@ -76,10 +76,11 @@ public class GaleWorldConfiguration extends ConfigurationPart {
diff --git a/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch b/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch
index 85f364a5..a5f448b1 100644
--- a/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch
+++ b/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch
@@ -17,7 +17,7 @@ This format saves about 50% of disk space.
Documentation: https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools
diff --git a/build.gradle.kts b/build.gradle.kts
-index 7953623fe9858b9d8996a73a2c0145a9d736337e..8fd100c7caa71044fcfad0fe463862fb484327f3 100644
+index b1fd42d66874f29428a22570059f07696b487d5e..9d7cc530187263c6a4ed99df2c79d66d76749cc6 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -32,6 +32,8 @@ dependencies {
@@ -28,7 +28,7 @@ index 7953623fe9858b9d8996a73a2c0145a9d736337e..8fd100c7caa71044fcfad0fe463862fb
+ implementation("org.lz4:lz4-java:1.8.0") // LinearPurpur
implementation("org.jline:jline-terminal-jansi:3.25.1") // Leaf - Bump Dependencies
implementation("com.github.Dreeam-qwq:TerminalConsoleAppender:360a0759") // Leaf - Use own TerminalConsoleAppender fork to fix some issues under latest version of jline/log4j
- implementation("net.kyori:adventure-text-serializer-ansi:4.15.0") // Keep in sync with adventureVersion from Paper-API build file // Leaf - Bump Dependencies
+ implementation("net.kyori:adventure-text-serializer-ansi:4.16.0") // Keep in sync with adventureVersion from Paper-API build file // Leaf - Bump Dependencies
diff --git a/src/main/java/io/papermc/paper/chunk/system/io/RegionFileIOThread.java b/src/main/java/io/papermc/paper/chunk/system/io/RegionFileIOThread.java
index 2934f0cf0ef09c84739312b00186c2ef0019a165..e67543ef424d448096379bef118b8cb24b938964 100644
--- a/src/main/java/io/papermc/paper/chunk/system/io/RegionFileIOThread.java
@@ -140,7 +140,7 @@ index 6da8bd049f3a9838383864df03a042b996f8e8a9..754fff2c0305f2bf5ce1d080f0f0d912
return flag3;
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
-index af1cd2916a892b4c20ca26187a801ed713325a73..8fed9395a4c91d25781000478fb83763cae3a50c 100644
+index 80168d2a040c02504af3a4f3f68802afb327046d..fdd72e567a1a59153da2adb35a9605b828698535 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -246,7 +246,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -187,7 +187,7 @@ index af1cd2916a892b4c20ca26187a801ed713325a73..8fed9395a4c91d25781000478fb83763
regionFile.setStatus(chunkPos.x, chunkPos.z, ChunkSerializer.getStatus(compound));
}
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index f016b5e323f8167d058f61480095721684fd6e42..055d606db6a138754af22d1ffee2117cf47e6606 100644
+index 0526ec7809f4937af85494679317f5fcbb6d8893..005549acdd30c88d14df9051cbb732baf38282e5 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -419,8 +419,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -663,7 +663,7 @@ index 0c8bcfbe35f9133a32a31163e5bf2f04786c77a0..63b5a0993207c55357ac507c974dea77
private static void disableGiveCommandDrops() {
disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops);
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index a750e4e499a30499538072644c24cf95fe8eceb7..1487074c45dfce7c8b22efee339a2d6060bc6172 100644
+index f6338904ca0961cfd67326908e9cf72e37c6e86e..21c15670c0c9b988472ac8e875a1c0332060fac3 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
@@ -27,6 +27,7 @@ import java.util.Map;
diff --git a/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch b/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch
index f4b073dc..ffd71bc2 100644
--- a/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch
+++ b/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch
@@ -88,10 +88,10 @@ index 2957a7617acae18e23d8ffb90ed5c790681da9c1..4da22d7e536706f2ce892d15435b56a6
public int getPurpurBreedTime() {
diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
-index 1fbd034002fd5761011976510b9f9263ca0f5cac..a9d75fe602d0f946519582d2eaf2eb55db69e4b8 100644
+index cd696f6bb7f77338dd289c7c2d6bdf23d79264aa..5b333513bd618c9b108bae13299431bc4b66ad35 100644
--- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
+++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
-@@ -87,6 +87,23 @@ public class Tadpole extends AbstractFish {
+@@ -90,6 +90,23 @@ public class Tadpole extends AbstractFish {
protected void registerGoals() {
this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur
}
@@ -167,10 +167,10 @@ index df0d0868c11c26b2cadc1a07196a0191e16838a0..5ebef8ad47b8dc27de23b878eec86f51
@Override
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java b/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java
-index bc3fe45d12ffc2069a03d1587b7623d31130565a..fd574aed480b980a231a017bab262acb7c1870b6 100644
+index 58af87b8faf4f8d6bdb111c49a429466acface68..7ae4b748ee6c95feb64d514292e31bea8c52e29d 100644
--- a/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java
+++ b/src/main/java/net/minecraft/world/entity/vehicle/ChestBoat.java
-@@ -41,7 +41,7 @@ public class ChestBoat extends Boat implements HasCustomInventoryScreen, Contain
+@@ -43,7 +43,7 @@ public class ChestBoat extends Boat implements HasCustomInventoryScreen, Contain
public ChestBoat(EntityType extends Boat> type, Level world) {
super(type, world);
@@ -179,7 +179,7 @@ index bc3fe45d12ffc2069a03d1587b7623d31130565a..fd574aed480b980a231a017bab262acb
}
public ChestBoat(Level world, double d0, double d1, double d2) {
-@@ -161,7 +161,7 @@ public class ChestBoat extends Boat implements HasCustomInventoryScreen, Contain
+@@ -170,7 +170,7 @@ public class ChestBoat extends Boat implements HasCustomInventoryScreen, Contain
@Override
public int getContainerSize() {
@@ -209,10 +209,10 @@ index 63b5a0993207c55357ac507c974dea77206e80f4..e45c11bf2c42e6d57f803349d8ca6936
org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27);
enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows);
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-index 1487074c45dfce7c8b22efee339a2d6060bc6172..21fcfb68b3026e07bf332c802f23caa44894d583 100644
+index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf21ac5c6d 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
-@@ -1195,7 +1195,15 @@ public class PurpurWorldConfig {
+@@ -1190,7 +1190,15 @@ public class PurpurWorldConfig {
public boolean allayRidableInWater = true;
public boolean allayControllable = true;
public List allayRespectNBT = new ArrayList<>();
@@ -228,7 +228,7 @@ index 1487074c45dfce7c8b22efee339a2d6060bc6172..21fcfb68b3026e07bf332c802f23caa4
allayRidable = getBoolean("mobs.allay.ridable", allayRidable);
allayRidableInWater = getBoolean("mobs.allay.ridable-in-water", allayRidableInWater);
allayControllable = getBoolean("mobs.allay.controllable", allayControllable);
-@@ -1314,7 +1322,15 @@ public class PurpurWorldConfig {
+@@ -1309,7 +1317,15 @@ public class PurpurWorldConfig {
public double camelMovementSpeedMin = 0.09D;
public double camelMovementSpeedMax = 0.09D;
public int camelBreedingTicks = 6000;
@@ -244,7 +244,7 @@ index 1487074c45dfce7c8b22efee339a2d6060bc6172..21fcfb68b3026e07bf332c802f23caa4
camelRidableInWater = getBoolean("mobs.camel.ridable-in-water", camelRidableInWater);
camelMaxHealthMin = getDouble("mobs.camel.attributes.max_health.min", camelMaxHealthMin);
camelMaxHealthMax = getDouble("mobs.camel.attributes.max_health.max", camelMaxHealthMax);
-@@ -1744,7 +1760,15 @@ public class PurpurWorldConfig {
+@@ -1739,7 +1755,15 @@ public class PurpurWorldConfig {
public boolean frogControllable = true;
public float frogRidableJumpHeight = 0.65F;
public int frogBreedingTicks = 6000;
@@ -260,7 +260,7 @@ index 1487074c45dfce7c8b22efee339a2d6060bc6172..21fcfb68b3026e07bf332c802f23caa4
frogRidable = getBoolean("mobs.frog.ridable", frogRidable);
frogRidableInWater = getBoolean("mobs.frog.ridable-in-water", frogRidableInWater);
frogControllable = getBoolean("mobs.frog.controllable", frogControllable);
-@@ -2690,7 +2714,13 @@ public class PurpurWorldConfig {
+@@ -2685,7 +2709,13 @@ public class PurpurWorldConfig {
public boolean snifferControllable = true;
public double snifferMaxHealth = 14.0D;
public int snifferBreedingTicks = 6000;
@@ -274,7 +274,7 @@ index 1487074c45dfce7c8b22efee339a2d6060bc6172..21fcfb68b3026e07bf332c802f23caa4
snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable);
snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater);
snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable);
-@@ -2789,7 +2819,15 @@ public class PurpurWorldConfig {
+@@ -2784,7 +2814,15 @@ public class PurpurWorldConfig {
public boolean tadpoleRidable = false;
public boolean tadpoleRidableInWater = true;
public boolean tadpoleControllable = true;
@@ -290,7 +290,7 @@ index 1487074c45dfce7c8b22efee339a2d6060bc6172..21fcfb68b3026e07bf332c802f23caa4
tadpoleRidable = getBoolean("mobs.tadpole.ridable", tadpoleRidable);
tadpoleRidableInWater = getBoolean("mobs.tadpole.ridable-in-water", tadpoleRidableInWater);
tadpoleControllable = getBoolean("mobs.tadpole.controllable", tadpoleControllable);
-@@ -3001,7 +3039,15 @@ public class PurpurWorldConfig {
+@@ -2996,7 +3034,15 @@ public class PurpurWorldConfig {
public boolean wardenRidable = false;
public boolean wardenRidableInWater = true;
public boolean wardenControllable = true;
diff --git a/patches/server/0063-Polpot-Make-egg-and-snowball-can-knockback-player.patch b/patches/server/0063-Polpot-Make-egg-and-snowball-can-knockback-player.patch
index b3812770..aa5e064e 100644
--- a/patches/server/0063-Polpot-Make-egg-and-snowball-can-knockback-player.patch
+++ b/patches/server/0063-Polpot-Make-egg-and-snowball-can-knockback-player.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Polpot: Make egg and snowball can knockback player
Original project: https://github.com/PolpotMC/Polpot
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 440d3d72d8b2dac14f83a83caa5ae9dbf3e979b6..2aaa9458e5cef1a5b8c06e26ae8f61021d4bb4eb 100644
+index bb61e1132c28274175215a679befdcfa2496b099..8cc2c353334f6cfcadb8c12e96ad09f746b41bf8 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java
@@ -3,6 +3,7 @@ package net.minecraft.world.entity.projectile;
@@ -17,10 +17,10 @@ index 440d3d72d8b2dac14f83a83caa5ae9dbf3e979b6..2aaa9458e5cef1a5b8c06e26ae8f6102
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
-@@ -55,6 +56,12 @@ public class Snowball extends ThrowableItemProjectile {
- Entity entity = entityHitResult.getEntity();
+@@ -61,6 +62,12 @@ public class Snowball extends ThrowableItemProjectile {
int i = entity.level().purpurConfig.snowballDamage >= 0 ? entity.level().purpurConfig.snowballDamage : entity instanceof Blaze ? 3 : 0; // Purpur
- entity.hurt(this.damageSources().thrown(this, this.getOwner()), (float)i);
+
+ entity.hurt(this.damageSources().thrown(this, this.getOwner()), (float) i);
+ // Leaf start - Polpot - Make snowball can knockback player
+ if (org.dreeam.leaf.config.modules.gameplay.Knockback.snowballCanKnockback && entity instanceof ServerPlayer) {
+ entity.hurt(this.damageSources().thrown(this, this.getOwner()), 0.0000001F);
@@ -31,10 +31,10 @@ index 440d3d72d8b2dac14f83a83caa5ae9dbf3e979b6..2aaa9458e5cef1a5b8c06e26ae8f6102
// Purpur start - borrowed and modified code from ThrownPotion#onHitBlock and ThrownPotion#dowseFire
diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java
-index 785196e6f4677074890ca965e9add85ccfd0e6e3..6c9680bdac576b60124b30712c388626a70b1f0e 100644
+index 82bb8004635865f5202578d5a6f520048e7269d5..f1e2643926a020fd66967e64001f2987cfe334bf 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java
-@@ -45,7 +45,14 @@ public class ThrownEgg extends ThrowableItemProjectile {
+@@ -46,7 +46,14 @@ public class ThrownEgg extends ThrowableItemProjectile {
@Override
protected void onHitEntity(EntityHitResult entityHitResult) {
super.onHitEntity(entityHitResult);
diff --git a/patches/server/0065-Configurable-fix-tripwire-dupe.patch b/patches/server/0065-Configurable-fix-tripwire-dupe.patch
index aa5eb58b..00c99922 100644
--- a/patches/server/0065-Configurable-fix-tripwire-dupe.patch
+++ b/patches/server/0065-Configurable-fix-tripwire-dupe.patch
@@ -67,13 +67,13 @@ index 0000000000000000000000000000000000000000..6d4887d9a523086aabb33c6959d3821b
+ public static boolean enabled = true;
+}
diff --git a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
-index 704791c80d42a653c8e02440d46cd96e6adb5fb5..8226f1f9b21e97c882248bc7227861381b1e5a2f 100644
+index 53375e9509a0871f337eefc387d1d9cbb53f5c1a..d0cef36361c579570bb69ba6a7225a533e88be79 100644
--- a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
+++ b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
-@@ -109,7 +109,7 @@ public class GaleWorldConfiguration extends ConfigurationPart {
- public class Fixes extends ConfigurationPart {
+@@ -107,7 +107,7 @@ public class GaleWorldConfiguration extends ConfigurationPart {
- public boolean sandDuping = true; // Gale - Purpur - make sand duping fix configurable
+ public Fixes fixes;
+ public class Fixes extends ConfigurationPart {
- public boolean tripwireDuping = true; // Gale - Leaf - make tripwire duping fix configurable
+ //public boolean tripwireDuping = true; // Gale - Leaf - make tripwire duping fix configurable // Leaf - Move to leaf config
public boolean broadcastCritAnimationsAsTheEntityBeingCritted = false; // Gale - MultiPaper - broadcast crit animations as the entity being critted
diff --git a/patches/server/0068-Including-5s-in-getTPS.patch b/patches/server/0068-Including-5s-in-getTPS.patch
index e1d7e936..ac8bc55d 100644
--- a/patches/server/0068-Including-5s-in-getTPS.patch
+++ b/patches/server/0068-Including-5s-in-getTPS.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Including 5s in getTPS()
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index a1317e374066d2abe20064bc47e20f4b19db9705..9c447419c13c142731b6de0a88870eb2a991ddfb 100644
+index db96be7e6f30ecab1349c1fe68fcdd2f4e27167d..c7faba7ff1101f68fef4a67c502e45a66ec77b93 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -3137,6 +3137,8 @@ public final class CraftServer implements Server {
+@@ -3152,6 +3152,8 @@ public final class CraftServer implements Server {
@Override
public double[] getTPS() {
diff --git a/patches/server/0069-Remove-useless-creating-stats-json-bases-on-player-n.patch b/patches/server/0069-Remove-useless-creating-stats-json-bases-on-player-n.patch
index 53340457..8bc53867 100644
--- a/patches/server/0069-Remove-useless-creating-stats-json-bases-on-player-n.patch
+++ b/patches/server/0069-Remove-useless-creating-stats-json-bases-on-player-n.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Remove useless creating stats json bases on player name logic
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index d9640b2a08101e9bd65323019c1de9c087822dde..8b855d6c41654e9849dc8fc8f80cf5ea9c6c554e 100644
+index e960528f7e261552b3936e596d0ff9c285a151ca..25c7f47382f8a9949e2785c36f67dcf455d33f5a 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -1579,6 +1579,8 @@ public abstract class PlayerList {
+@@ -1580,6 +1580,8 @@ public abstract class PlayerList {
File file = this.server.getWorldPath(LevelResource.PLAYER_STATS_DIR).toFile();
File file1 = new File(file, uuid + ".json");
@@ -17,7 +17,7 @@ index d9640b2a08101e9bd65323019c1de9c087822dde..8b855d6c41654e9849dc8fc8f80cf5ea
if (!file1.exists()) {
File file2 = new File(file, displayName + ".json"); // CraftBukkit
Path path = file2.toPath();
-@@ -1587,6 +1589,8 @@ public abstract class PlayerList {
+@@ -1588,6 +1590,8 @@ public abstract class PlayerList {
file2.renameTo(file1);
}
}