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 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 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 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 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 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 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 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 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 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); } }