diff --git a/gradle.properties b/gradle.properties index 7cfafcd..2501200 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,8 @@ version = 1.20.4-R0.1-SNAPSHOT mcVersion = 1.20.4 -paperCommit = 1ed50dade82437bf45fe74833d7e6ac2961842a2 -purpurCommit = eab2140f5e34a97dc95ae692ee71b622b848b577 +paperCommit = 681bbff110d9a56152ae898c4dfe1c0356b40e69 +purpurCommit = 1083e45074966cc634f23f0a92506fb7d3685874 group = org.plazmamc.plazma org.gradle.caching = true diff --git a/libs/api.versions.toml b/libs/api.versions.toml index e012682..4c8ac03 100644 --- a/libs/api.versions.toml +++ b/libs/api.versions.toml @@ -6,7 +6,7 @@ sentry = "5.4.0" fastutil = "8.5.6" findbugs = "1.3.9" slf4j-api = "2.0.9" -bungeechat = "1.20-R0.1-deprecated+build.14" +bungeechat = "1.20-R0.2" json-simple = "1.1.1" annotations = "24.0.1" checkerqual = "3.21.0" diff --git a/libs/common.versions.toml b/libs/common.versions.toml index 6c60d3b..2d917a1 100644 --- a/libs/common.versions.toml +++ b/libs/common.versions.toml @@ -9,7 +9,7 @@ adventure = "4.15.0" commons-lang2 = "2.6" commons-lang3 = "3.12.0" maven-provider = "3.9.6" -maven-resolver = "1.7.3" +maven-resolver = "1.9.18" [libraries] mockito = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } @@ -40,6 +40,6 @@ adventure-serializer-legacy = { group = "net.kyori", name = "adventure-text-seri [bundles] asm = [ "asm-head", "asm-commons" ] -test = [ "jupiter", "hamcrest", "mockito" ] +test = [ "jupiter", "hamcrest", "mockito", "asm-tree" ] maven = [ "maven-connector", "maven-transport" ] adventure = [ "adventure-api", "adventure-slf4j", "adventure-minimessage", "adventure-serializer-gson", "adventure-serializer-plain", "adventure-serializer-legacy" ] diff --git a/libs/server.versions.toml b/libs/server.versions.toml index 4758b33..d8aed57 100644 --- a/libs/server.versions.toml +++ b/libs/server.versions.toml @@ -4,6 +4,7 @@ jansi = "3.21.0" rhino = "1.7.14" mysql = "8.2.0" sqlite = "3.42.0.1" +pioneer = "2.2.0" haproxy = "4.1.97.Final" velocity = "3.1.2-SNAPSHOT" disruptor = "3.4.4" @@ -18,6 +19,7 @@ ansi = { group = "net.kyori", name = "ansi", version.ref = "ansi" } mysql = { group = "com.mysql", name = "mysql-connector-j", version.ref = "mysql" } jansi = { group = "org.jline", name = "jline-terminal-jansi", version.ref = "jansi" } sqlite = { group = "org.xerial", name = "sqlite-jdbc", version.ref = "sqlite" } +pioneer = { group = "org.junit-pioneer", name = "junit-pioneer", version.ref = "pioneer" } haproxy = { group = "io.netty", name = "netty-codec-haproxy", version.ref = "haproxy" } velocity = { group = "com.velocitypowered", name = "velocity-native", version.ref = "velocity" } disruptor = { group = "com.lmax", name = "disruptor", version.ref = "disruptor" } @@ -33,3 +35,4 @@ terminal-appender = { group = "net.minecrell", name = "terminalconsoleappender", [bundles] runtime = [ "sqlite", "mysql", "disruptor" ] implementation = [ "jansi", "terminal-appender", "ansi", "haproxy", "configurate", "mappingio", "rhino-engine", "rhino-runtime" ] +test = [ "classgraph", "pioneer" ] diff --git a/patches/api/0002-Purpur-API-Changes.patch b/patches/api/0002-Purpur-API-Changes.patch index a4e098c..b806ca4 100644 --- a/patches/api/0002-Purpur-API-Changes.patch +++ b/patches/api/0002-Purpur-API-Changes.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: granny -Date: Fri, 26 Jan 2024 13:54:27 +0900 +Date: Sun, 25 Feb 2024 11:53:25 +0900 Subject: [PATCH] Purpur API Changes PurpurMC @@ -25,7 +25,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/build.gradle.kts b/build.gradle.kts -index 80833c13a2d19e31d6f648e7ef5b3456025e767e..0a33275fdf16bda47771bab9ddfeb2bf8616c2dc 100644 +index 28a3ee2f2df6f93a894793abc03d357a9010a399..0588b113b02a05e946dd92fce489662bc01a41eb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -129,6 +129,8 @@ tasks.jar { @@ -186,10 +186,10 @@ index a736d7bcdc5861a01b66ba36158db1c716339346..22fc165fd9c95f0f3ae1be7a0857e48c @Override diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 2d53675907f411046978b0a234c0b6f33c909973..2bb2b9ba757d18510e3f45304cfbb56c28113ed7 100644 +index ca27559cf4aa1c2e44fdca2022e213b1b1c80f4e..d218cd30fc0733a83e3e0ba3279eb21561b0b08e 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2842,4 +2842,127 @@ public final class Bukkit { +@@ -2862,4 +2862,127 @@ public final class Bukkit { public static Server.Spigot spigot() { return server.spigot(); } @@ -453,13 +453,13 @@ index f9af60356da4668cec8b24e73f5747ab82e35a91..b304ad1307cdd6785653b1eab9781e07 + // Purpur end } diff --git a/src/main/java/org/bukkit/OfflinePlayer.java b/src/main/java/org/bukkit/OfflinePlayer.java -index bce07d84cafca677bb6fad78c21b82097f06430c..4ef0fa4f1ef72bb784674671473c6a322acadecc 100644 +index abb5109ed08a3a651c2c27d4d17a3d49eb06da1e..98308b759907e03b168f7e06704a91925ffcd3fd 100644 --- a/src/main/java/org/bukkit/OfflinePlayer.java +++ b/src/main/java/org/bukkit/OfflinePlayer.java -@@ -522,4 +522,114 @@ public interface OfflinePlayer extends ServerOperator, AnimalTamer, Configuratio +@@ -545,4 +545,106 @@ public interface OfflinePlayer extends ServerOperator, AnimalTamer, Configuratio */ @Nullable - public Location getLastDeathLocation(); + public Location getLocation(); + + // Purpur start - OfflinePlayer API + /** @@ -527,14 +527,6 @@ index bce07d84cafca677bb6fad78c21b82097f06430c..4ef0fa4f1ef72bb784674671473c6a32 + public float getWalkSpeed(); + + /** -+ * Gets the entity's current position -+ * -+ * @return a new copy of Location containing the position of this offline player -+ */ -+ @Nullable -+ public Location getLocation(); -+ -+ /** + * Sets OfflinePlayer's location. If player is online, it falls back to the Player#teleport implementation. + * + * @param destination @@ -572,10 +564,10 @@ index bce07d84cafca677bb6fad78c21b82097f06430c..4ef0fa4f1ef72bb784674671473c6a32 + // Purpur end - OfflinePlayer API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 9af4bc16da09e59009c47911219e99450cdf2aa5..529fb1beadefc79ce6bf5755d5223301b9933152 100644 +index b4f8281d3797ec825a7671f38077cd65d5a1d76e..be0e4c789a02d67160287c39cf6bdf8ef2229afc 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2198,6 +2198,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2214,6 +2214,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi } // Paper end @@ -594,7 +586,7 @@ index 9af4bc16da09e59009c47911219e99450cdf2aa5..529fb1beadefc79ce6bf5755d5223301 /** * Sends the component to the player * -@@ -2481,4 +2493,105 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2497,4 +2509,105 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ boolean isOwnedByCurrentRegion(@NotNull Entity entity); // Paper end - Folia region threading API @@ -701,10 +693,10 @@ index 9af4bc16da09e59009c47911219e99450cdf2aa5..529fb1beadefc79ce6bf5755d5223301 + // Purpur end } diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index efa2043e044b0e461780e808c347d6ec00f6da0a..3d4481ea5328735357a7c60c99e5b3a073e7aa0f 100644 +index c5fe36050eeaff80cfb989fe2f38370215af6fe5..565ce4b0c5eb300953aaefa786b9f8938c771f2a 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java -@@ -4172,6 +4172,86 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient +@@ -4213,6 +4213,86 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient @Nullable public DragonBattle getEnderDragonBattle(); @@ -954,10 +946,10 @@ index 138d2530de2410f4a9424dabd3e5ce0cd1c1dcd2..10a8d64ad2da0be2c14f34c3e7d1957c // Paper start /** diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java -index 6ace3581f8d0c2a1b7e2188d5b6af5c984b74a0e..7dac01adb01fc5f37b55cf239883a96a51b68de1 100644 +index d9929d9311e4b2b0ae13a8f6f13563257263f298..a36fc32dd83339b6939cb4046538ec6285042397 100644 --- a/src/main/java/org/bukkit/entity/Entity.java +++ b/src/main/java/org/bukkit/entity/Entity.java -@@ -1107,4 +1107,55 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent +@@ -1104,4 +1104,55 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent */ @NotNull String getScoreboardEntryName(); // Paper end - entity scoreboard name @@ -1106,10 +1098,10 @@ index bcc6ba95bd21c7972865838c636a03f50b6c1f1a..c3fcd8dd7dbb1e1a18e17c014c1e6411 + // Purpur end } diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java -index 0f0b965ce48d13a64b5546a0abcfb45c4f5f4722..76c8601c1563c28cfce00f461c99805187db5178 100644 +index e67455efc84f1e06d3396291d104ce65fee4591b..744b869c028324d5de30d2d64ab080b050fa3c47 100644 --- a/src/main/java/org/bukkit/entity/LivingEntity.java +++ b/src/main/java/org/bukkit/entity/LivingEntity.java -@@ -1276,4 +1276,41 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource +@@ -1310,4 +1310,41 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource */ void setBodyYaw(float bodyYaw); // Paper end @@ -1177,10 +1169,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 815631a6157b87a9ead270fe0b11ac3892a3fbf4..48ef9837cc26313e76678555d7187eb3b9c8e4d7 100644 +index 254a02ddb5dc867c9dd6c2086791f7ab94247fd3..6dc63bfe85d83a7cff369f06c57ebe0aa04c63a3 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3578,4 +3578,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3687,4 +3687,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @Override Spigot spigot(); // Spigot end @@ -1398,6 +1390,20 @@ index 84db38388bf7a58e66d6cd29620b4fe64b0a897e..82ebd99549ce9f9e6427a50cef424e90 + public void setRabid(boolean rabid); + // Purpur end } +diff --git a/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java b/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java +index 446b3ffd5caca5344be1c250475679834cd0d4a2..3da8d3d8925cd7a111c0c357bceecfd3a801c8eb 100644 +--- a/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java ++++ b/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java +@@ -303,7 +303,8 @@ public class EntityDamageEvent extends EntityEvent implements Cancellable { + WORLD_BORDER, + /** + * Damage caused when an entity contacts a block such as a Cactus, +- * Dripstone (Stalagmite) or Berry Bush. ++ * Dripstone (Stalagmite) or Berry Bush. (Stonecutters too if you ++ * have the Stonecutter damage Purpur feature enabled) + *

+ * Damage: variable + */ diff --git a/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java b/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java index c9f395064656dd0126410eb3c6e197baa450c063..13156a12e5df50cdc1e465dc0bd9d94108275629 100644 --- a/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java @@ -1467,7 +1473,7 @@ index f680545b6b59bf8d2ad154b0472dda4cba42a162..58a62ba0635f9158bf18043da89aba75 + // Purpur end } diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java -index 36e3fbc727cd748aa138f52976154ba32954cd87..9ecfc504df089a74add168cd5a8376d7d6b8ea0e 100644 +index 245a730a54c4b241a9a67eccceefafd2763bd238..54dd0bd043a37f6519fc8a318856a4825d389669 100644 --- a/src/main/java/org/bukkit/inventory/ItemStack.java +++ b/src/main/java/org/bukkit/inventory/ItemStack.java @@ -17,6 +17,18 @@ import org.bukkit.inventory.meta.ItemMeta; @@ -1489,10 +1495,10 @@ index 36e3fbc727cd748aa138f52976154ba32954cd87..9ecfc504df089a74add168cd5a8376d7 /** * Represents a stack of items. -@@ -1005,4 +1017,635 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat - return type.isAir() || amount <= 0; +@@ -1033,4 +1045,635 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, Translat + return Bukkit.getUnsafe().computeTooltipLines(this, tooltipContext, player); } - // Paper end + // Paper end - expose itemstack tooltip lines + + // Purpur start + /** diff --git a/patches/api/0003-Use-Gradle-Version-Catalogs.patch b/patches/api/0003-Use-Gradle-Version-Catalogs.patch index 0f05940..1726c9d 100644 --- a/patches/api/0003-Use-Gradle-Version-Catalogs.patch +++ b/patches/api/0003-Use-Gradle-Version-Catalogs.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Use Gradle Version Catalogs diff --git a/build.gradle.kts b/build.gradle.kts -index 0a33275fdf16bda47771bab9ddfeb2bf8616c2dc..033d510a10a630259e142b8a7bdfa57e7c22bb90 100644 +index 0588b113b02a05e946dd92fce489662bc01a41eb..83f574f2314f11425eb9c4b11e8873c048f404ca 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,11 +9,13 @@ java { @@ -14,7 +14,7 @@ index 0a33275fdf16bda47771bab9ddfeb2bf8616c2dc..033d510a10a630259e142b8a7bdfa57e +/* // Plazma - Use Gradle Version Catalogs val annotationsVersion = "24.0.1" - val bungeeCordChatVersion = "1.20-R0.1" + val bungeeCordChatVersion = "1.20-R0.2" val adventureVersion = "4.15.0" val slf4jVersion = "2.0.9" val log4jVersion = "2.17.1" @@ -22,23 +22,33 @@ index 0a33275fdf16bda47771bab9ddfeb2bf8616c2dc..033d510a10a630259e142b8a7bdfa57e val apiAndDocs: Configuration by configurations.creating { attributes { attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) -@@ -28,6 +30,7 @@ configurations.api { +@@ -27,6 +29,7 @@ configurations.api { + } dependencies { - // api dependencies are listed transitively to API consumers + /* // Plazma - Use Gradle Version Catalogs + // api dependencies are listed transitively to API consumers api("com.google.guava:guava:32.1.2-jre") api("com.google.code.gson:gson:2.10.1") - // Paper start - adventure -@@ -38,9 +41,35 @@ dependencies { - api("org.yaml:snakeyaml:2.2") +@@ -39,8 +42,34 @@ dependencies { api("org.joml:joml:1.10.5") // Paper start -- api("com.googlecode.json-simple:json-simple:1.1.1") { + api("com.googlecode.json-simple:json-simple:1.1.1") { + // Plazma start - Use Gradle Version Catalogs + */ + implementation(common.bundles.asm) + ++ api(api.bundles.api) ++ api(common.snakeyaml) ++ api(common.log4j.api) ++ api(common.maven.provider) ++ api(api.jsonsimple) { + isTransitive = false // includes junit + } ++ ++ apiAndDocs(common.bundles.adventure) ++ apiAndDocs(platform(common.adventure.bom)) ++ + compileOnly(api.findbugs) + compileOnly(api.annotations) + compileOnly(common.bundles.maven) @@ -50,20 +60,8 @@ index 0a33275fdf16bda47771bab9ddfeb2bf8616c2dc..033d510a10a630259e142b8a7bdfa57e + testImplementation(common.commons.lang3) + + testCompileOnly(api.bundles.annotations) -+ -+ api(api.bundles.api) -+ api(common.snakeyaml) -+ api(common.log4j.api) -+ api(common.maven.provider) -+ -+ apiAndDocs(common.bundles.adventure) -+ apiAndDocs(platform(common.adventure.bom)) -+ -+ api(api.jsonsimple) { ++ /* + // Plazma end - Use Gradle Version Catalogs - isTransitive = false // includes junit - } -+ /* // Plazma - Use Gradle Version Catalogs api("it.unimi.dsi:fastutil:8.5.6") apiAndDocs(platform("net.kyori:adventure-bom:$adventureVersion")) apiAndDocs("net.kyori:adventure-api") diff --git a/patches/api/0004-Plazma-Configurations.patch b/patches/api/0004-Plazma-Configurations.patch index f6b8ec5..46bba27 100644 --- a/patches/api/0004-Plazma-Configurations.patch +++ b/patches/api/0004-Plazma-Configurations.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Plazma Configurations diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 529fb1beadefc79ce6bf5755d5223301b9933152..682d520df3beacd65c7e792bac0d469e0083267f 100644 +index be0e4c789a02d67160287c39cf6bdf8ef2229afc..2b3786560d8fb93b9899ebc1e0a7c96a808268d0 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2210,6 +2210,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2226,6 +2226,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi } // Purpur end diff --git a/patches/server/0001-Pufferfish-Server-Changes.patch b/patches/server/0001-Pufferfish-Server-Changes.patch index bbdddc1..d9e6f4f 100644 --- a/patches/server/0001-Pufferfish-Server-Changes.patch +++ b/patches/server/0001-Pufferfish-Server-Changes.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Kevin Raneri -Date: Fri, 26 Jan 2024 13:54:26 +0900 +Date: Sun, 25 Feb 2024 11:53:24 +0900 Subject: [PATCH] Pufferfish Server Changes Pufferfish @@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/build.gradle.kts b/build.gradle.kts -index 376e8983fdfdbb6c3e5fd8ad0f6a05e655b622bf..658e9b4590a82d179907feea04e129fdba9a2f42 100644 +index 241808d8619e17c0681f79acbbc98af5bf52dd89..12b774464e8de3a07993be23e233d31e11ede7b1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,8 +13,12 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) { @@ -52,7 +52,7 @@ index 376e8983fdfdbb6c3e5fd8ad0f6a05e655b622bf..658e9b4590a82d179907feea04e129fd 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") -@@ -57,6 +68,14 @@ dependencies { +@@ -59,6 +70,14 @@ dependencies { } val craftbukkitPackageVersion = "1_20_R3" // Paper @@ -67,7 +67,7 @@ index 376e8983fdfdbb6c3e5fd8ad0f6a05e655b622bf..658e9b4590a82d179907feea04e129fd tasks.jar { archiveClassifier.set("dev") -@@ -69,7 +88,7 @@ tasks.jar { +@@ -71,7 +90,7 @@ tasks.jar { attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", "Implementation-Title" to "CraftBukkit", @@ -76,7 +76,7 @@ index 376e8983fdfdbb6c3e5fd8ad0f6a05e655b622bf..658e9b4590a82d179907feea04e129fd "Implementation-Vendor" to date, // Paper "Specification-Title" to "Bukkit", "Specification-Version" to project.version, -@@ -209,7 +228,5 @@ val runtimeClasspathForRunDev = sourceSets.main.flatMap { src -> +@@ -211,7 +230,5 @@ val runtimeClasspathForRunDev = sourceSets.main.flatMap { src -> } tasks.registerRunTask("runDev") { description = "Spin up a non-relocated Mojang-mapped test server" @@ -625,7 +625,7 @@ index 0000000000000000000000000000000000000000..020368da69b9a492155f6de6297f7473 +} diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..ad368b58005b6b0453b709c2ef0ea23bca53d34a +index 0000000000000000000000000000000000000000..f6a3364175476c57a7763a087ff55e1689474800 --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java @@ -0,0 +1,301 @@ @@ -921,13 +921,13 @@ index 0000000000000000000000000000000000000000..ad368b58005b6b0453b709c2ef0ea23b + "the ender dragon whenever a player places an end crystal."); + } + -+ public static boolean disableMethodProfiler; ++ public static boolean disableMethodProfiler; + public static boolean disableOutOfOrderChat; -+ private static void miscSettings() { ++ private static void miscSettings() { + disableMethodProfiler = getBoolean("misc.disable-method-profiler", true); + disableOutOfOrderChat = getBoolean("misc.disable-out-of-order-chat", false); -+ setComment("misc", "Settings for things that don't belong elsewhere"); -+ } ++ setComment("misc", "Settings for things that don't belong elsewhere"); ++ } + +} diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java @@ -1471,7 +1471,7 @@ index 0000000000000000000000000000000000000000..facd55463d44cb7e3d2ca6892982f549 + } +} diff --git a/src/main/java/io/papermc/paper/util/MCUtil.java b/src/main/java/io/papermc/paper/util/MCUtil.java -index 200ed770b57e1a9240abf0473968d4b85cbefe3c..0acc7cfc0fb0264dd76a58f7582e79d83fa040eb 100644 +index 850f75172e9efa72cabb8e5bd124b96a0b1a945f..3db1de70c76e1427e257d988d1a7f26e986b5617 100644 --- a/src/main/java/io/papermc/paper/util/MCUtil.java +++ b/src/main/java/io/papermc/paper/util/MCUtil.java @@ -212,7 +212,7 @@ public final class MCUtil { @@ -1497,19 +1497,18 @@ index ba12919c3f9aec34a9e64993b143ae92be5eb172..9efeab9078e2d08903e482718b840797 } else { this.lastTimeStamp = body.timeStamp(); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index fa2b4cdd4c4e2c1df3e378a7c706f06c3361ad53..5b6771cc925d29c26ea0cfcf0f72184f96e3eade 100644 +index d06185566b447c432d4dc2e3ba04d121bcdbc71b..d1c21d36de331905aedb08b0a8d4fbf97e100a13 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -313,6 +313,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { AtomicReference atomicreference = new AtomicReference(); - Thread thread = new io.papermc.paper.util.TickThread(() -> { // Paper - rewrite chunk system -@@ -1218,6 +1220,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Paper ++ return "Pufferfish"; // Pufferfish > // Paper } public SystemReport fillSystemReport(SystemReport details) { -@@ -2441,6 +2449,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop tag, double speed) { @@ -1983,7 +1979,7 @@ index 2c06f3ebf7e1069727387bfc60db30c958c14b5a..00b26925b9e0ef7290f904273da87560 double d1 = 0.0D; boolean flag = this.isPushedByFluid(); boolean flag1 = false; -@@ -4419,14 +4433,61 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4438,14 +4449,61 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S int k1 = 0; BlockPos.MutableBlockPos blockposition_mutableblockposition = new BlockPos.MutableBlockPos(); @@ -2051,7 +2047,7 @@ index 2c06f3ebf7e1069727387bfc60db30c958c14b5a..00b26925b9e0ef7290f904273da87560 if (d2 >= axisalignedbb.minY) { flag1 = true; -@@ -4448,9 +4509,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4467,9 +4525,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S // CraftBukkit end } } @@ -2065,7 +2061,7 @@ index 2c06f3ebf7e1069727387bfc60db30c958c14b5a..00b26925b9e0ef7290f904273da87560 if (vec3d.length() > 0.0D) { if (k1 > 0) { diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index edc723ea5ca3a325106e7af38c60dbf9f0f5fb77..ab6cd363231a668c9b16df825a72d3205746ee49 100644 +index 09e8445a3f8c6b3ebc852a75a9a25b41a51ba659..dc11683ee4d8a6b7a1c42bcae36dc6e8105cd994 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java @@ -305,6 +305,8 @@ public class EntityType implements FeatureElement, EntityTypeT @@ -2078,10 +2074,10 @@ index edc723ea5ca3a325106e7af38c60dbf9f0f5fb77..ab6cd363231a668c9b16df825a72d320 private String descriptionId; @Nullable diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 6071451339080bbdd98fb634791a56988984c8bc..5641bc7f50cef7819ddaeb76a4a4f9c80f473d31 100644 +index 23570a0b1227a840b9c1e6ae326827ea655bb5f7..25e30408c964b5257f1cf945892bd668df38252b 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -142,7 +142,6 @@ import org.bukkit.event.entity.EntityTeleportEvent; +@@ -143,7 +143,6 @@ import org.bukkit.event.entity.EntityTeleportEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; // CraftBukkit end @@ -2089,7 +2085,7 @@ index 6071451339080bbdd98fb634791a56988984c8bc..5641bc7f50cef7819ddaeb76a4a4f9c8 public abstract class LivingEntity extends Entity implements Attackable { -@@ -413,7 +412,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -414,7 +413,7 @@ public abstract class LivingEntity extends Entity implements Attackable { boolean flag = this instanceof net.minecraft.world.entity.player.Player; if (!this.level().isClientSide) { @@ -2098,7 +2094,7 @@ index 6071451339080bbdd98fb634791a56988984c8bc..5641bc7f50cef7819ddaeb76a4a4f9c8 this.hurt(this.damageSources().inWall(), 1.0F); } else if (flag && !this.level().getWorldBorder().isWithinBounds(this.getBoundingBox())) { double d0 = this.level().getWorldBorder().getDistanceToBorder(this) + this.level().getWorldBorder().getDamageSafeZone(); -@@ -1409,6 +1408,19 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1418,6 +1417,19 @@ public abstract class LivingEntity extends Entity implements Attackable { return this.getHealth() <= 0.0F; } @@ -2118,7 +2114,7 @@ index 6071451339080bbdd98fb634791a56988984c8bc..5641bc7f50cef7819ddaeb76a4a4f9c8 @Override public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { -@@ -2002,6 +2014,20 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2024,6 +2036,20 @@ public abstract class LivingEntity extends Entity implements Attackable { return this.lastClimbablePos; } @@ -2140,10 +2136,10 @@ index 6071451339080bbdd98fb634791a56988984c8bc..5641bc7f50cef7819ddaeb76a4a4f9c8 if (this.isSpectator()) { return false; diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 24629412d2b4acaa81788ce70412b03387cc777c..a181a298334212847166409a2121476ba5871cb2 100644 +index 2439f8d48daca7329049436414f06a36b4b79029..4cf2963fdbe9003fd18ac8c2035ccded57c02abd 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -221,14 +221,16 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -222,14 +222,16 @@ public abstract class Mob extends LivingEntity implements Targeting { return this.lookControl; } @@ -2162,7 +2158,7 @@ index 24629412d2b4acaa81788ce70412b03387cc777c..a181a298334212847166409a2121476b this.targetSelector.tick(); } } -@@ -912,16 +914,20 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -913,16 +915,20 @@ public abstract class Mob extends LivingEntity implements Targeting { if (i % 2 != 0 && this.tickCount > 1) { this.level().getProfiler().push("targetSelector"); @@ -2262,7 +2258,7 @@ index 07519c817cc6de04a98198c43a0c2b02ba3141eb..ee66be6e5aa45ec8448b6d30785a6e71 this.blockPos = mutableBlockPos; this.mob.movingTarget = mutableBlockPos == BlockPos.ZERO ? null : mutableBlockPos.immutable(); // Paper diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -index c8a80c1b2fedff22e8a877d466062375ffb2f0d7..3c4f4af85a3f2d4f9f52827164e63727b916c33a 100644 +index c8a80c1b2fedff22e8a877d466062375ffb2f0d7..931cbbe41905d7ed3fd46c53d3ddd06a6b9a7c8a 100644 --- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java +++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java @@ -75,9 +75,18 @@ public class TargetingConditions { @@ -2281,7 +2277,7 @@ index c8a80c1b2fedff22e8a877d466062375ffb2f0d7..3c4f4af85a3f2d4f9f52827164e63727 + } + + double d = this.testInvisible ? targetEntity.getVisibilityPercent(baseEntity) : 1.0D; -+ double e = Math.max((followRangeRaw) * d, 2.0D); // Paper ++ double e = Math.max((followRangeRaw) * d, 2.0D); // Paper - Fix MC-145656 + // Pufferfish end if (f > e * e) { return false; @@ -2363,10 +2359,10 @@ index 295769d039f2a1e4f48912a60f9dbe267d8992c1..e88b058c0734e436ef24bab6364b206c this.level().getProfiler().pop(); this.level().getProfiler().push("frogActivityUpdate"); 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 4aeab90e778629c355189dfe79c39c4b21f5f5ac..6ed4ac06c76b8d0d6e8db778cade15dbd1e3e5f5 100644 +index 958816ce2166248b542c96c10c398a52d769b4db..415afe3473d9f8a50b1edab8cfda6158e59836e6 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,9 +77,11 @@ public class Tadpole extends AbstractFish { +@@ -80,9 +80,11 @@ public class Tadpole extends AbstractFish { return SoundEvents.TADPOLE_FLOP; } @@ -2395,10 +2391,10 @@ index 5d247ac38fe8a61603b3d934f3000bcda773142b..2e4177cfb02616ef6fa689f6d378976e this.level().getProfiler().pop(); this.level().getProfiler().push("goatActivityUpdate"); 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..ea8883b0661e894a466eca24bfc247ac37f40a81 100644 +index 12440ee2dccc0a697fb403765f2e1b987ccc0283..de2471cfa96a23944f229f33ffdff88b6b7756e4 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 -@@ -150,6 +150,13 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -151,6 +151,13 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob this.bossEvent.setName(this.getDisplayName()); } @@ -2487,10 +2483,10 @@ index 937f81a859953498abe73bea560c86e6560e1c33..0a151c679b0dc943598180942d6d4b38 this.level().getProfiler().pop(); super.customServerAiStep(); 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 1aae466e3e334d7f4bbb3ea9365a255afcc3dd3a..b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d 100644 +index 24044795d8e0f1fb15a4f2f5401f44897092f2a3..96ca567af2d8fb2ba39f995be80b935344550124 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -142,6 +142,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -143,6 +143,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler return holder.is(PoiTypes.MEETING); }); @@ -2499,7 +2495,7 @@ index 1aae466e3e334d7f4bbb3ea9365a255afcc3dd3a..b1fa6e102a694b63f2aa9660b9e6b649 public Villager(EntityType entityType, Level world) { this(entityType, world, VillagerType.PLAINS); } -@@ -245,6 +247,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -246,6 +248,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } // Spigot End @@ -2507,7 +2503,7 @@ index 1aae466e3e334d7f4bbb3ea9365a255afcc3dd3a..b1fa6e102a694b63f2aa9660b9e6b649 @Override @Deprecated // Paper protected void customServerAiStep() { -@@ -254,7 +257,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -255,7 +258,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected void customServerAiStep(final boolean inactive) { // Paper end this.level().getProfiler().push("villagerBrain"); @@ -2594,10 +2590,10 @@ index 156809090f1f83ad68e7e2477a3cfddac5757a8e..837f68825f601971f374be47952b2310 if (entity != null) { this.ownerUUID = entity.getUUID(); diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -index 6d23c39e4eadf23616080d6d08672e13b5d3c37d..e7115f1635821e0aab32e8aeea6914388dc24639 100644 +index 756d0434472921992c9d84597d7c9c824e93614c..38c573d440946ca7ee6016ef92e9c1605031e611 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -@@ -27,7 +27,10 @@ import org.bukkit.inventory.InventoryHolder; +@@ -28,7 +28,10 @@ import org.bukkit.inventory.InventoryHolder; public abstract class AbstractMinecartContainer extends AbstractMinecart implements ContainerEntity { @@ -2608,7 +2604,7 @@ index 6d23c39e4eadf23616080d6d08672e13b5d3c37d..e7115f1635821e0aab32e8aeea691438 @Nullable public ResourceLocation lootTable; public long lootTableSeed; -@@ -89,12 +92,18 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme +@@ -90,12 +93,18 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme protected AbstractMinecartContainer(EntityType type, Level world) { super(type, world); @@ -2629,7 +2625,7 @@ index 6d23c39e4eadf23616080d6d08672e13b5d3c37d..e7115f1635821e0aab32e8aeea691438 } @Override -@@ -156,6 +165,10 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme +@@ -164,6 +173,10 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme protected void readAdditionalSaveData(CompoundTag nbt) { super.readAdditionalSaveData(nbt); this.lootableData.loadNbt(nbt); // Paper @@ -2701,10 +2697,10 @@ index 27b0a79f7a7c47047216aae42944bac2a2151181..a097cfc528f709c80575f35483b68783 autorecipestackmanager.initialize(this); // Paper - better exact choice recipes int i = 0; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index b33bb001a48788e727e2f01788a6163024121bf3..763fe7d1e8334441a5db2285bd4424d165e1c945 100644 +index f476ba6c97944bdffae5aacae2e285d17541f46e..506100b02e7e9a3eabfde6b1f93858c4cc048524 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -212,6 +212,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -207,6 +207,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public abstract ResourceKey getTypeKey(); @@ -2713,7 +2709,7 @@ index b33bb001a48788e727e2f01788a6163024121bf3..763fe7d1e8334441a5db2285bd4424d1 protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - create paper world config; Async-Anti-Xray: Pass executor 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 -@@ -1317,13 +1319,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1308,14 +1310,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { try { tickConsumer.accept(entity); MinecraftServer.getServer().executeMidTickTasks(); // Paper - execute chunk tasks mid tick @@ -2723,13 +2719,15 @@ index b33bb001a48788e727e2f01788a6163024121bf3..763fe7d1e8334441a5db2285bd4424d1 // Paper start - Prevent block entity and entity crashes 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 ServerExceptionEvent(new ServerInternalException(msg, throwable))); // Paper - ServerExceptionEvent -- entity.discard(); -+ entity.discard(); // Pufferfish - diff on change ServerLevel.tick - // Paper end - Prevent block entity and entity crashes + getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, throwable))); // Paper - ServerExceptionEvent +- entity.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); +- // Paper end - Prevent block entity and entity crashes ++ entity.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); // Pufferfish - diff on change ServerLevel.tick ++ // Paper end } } -@@ -1797,6 +1799,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + // Paper start - Option to prevent armor stands from doing entity lookups +@@ -1788,6 +1790,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public ProfilerFiller getProfiler() { @@ -2738,10 +2736,10 @@ index b33bb001a48788e727e2f01788a6163024121bf3..763fe7d1e8334441a5db2285bd4424d1 } diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 17e9f3a30e287faf210e08dc7eb177a70f049f43..96fc603c2fccc1d9610248b2116d35696bc65e4e 100644 +index da7489986848316fed029b71d1bc4e1248c9c9a8..661acdf4b1f33d150b0caf179e925d3162d7be35 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -@@ -429,12 +429,12 @@ public final class NaturalSpawner { +@@ -425,12 +425,12 @@ public final class NaturalSpawner { } } @@ -2886,10 +2884,10 @@ index 9b1243d96e0694c62fc9e82e9be540bce0d2b3ad..3514022d898a24052c917ebf55dcef3e @Override diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index a61d7cd2b078fe511ff00344197b6ea11feebfb2..7041394d366e6145369d032a0a14f0478af4679f 100644 +index 757edf74751dc7183454656fda9cecc4eb601e4c..9e577408d8e794c40bf34bc800cd0920856a5d2b 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -47,7 +47,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -48,7 +48,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen public static final int MOVE_ITEM_SPEED = 8; public static final int HOPPER_CONTAINER_SIZE = 5; @@ -2900,7 +2898,7 @@ index a61d7cd2b078fe511ff00344197b6ea11feebfb2..7041394d366e6145369d032a0a14f047 private int cooldownTime; private long tickedGameTime; -@@ -83,14 +86,37 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -84,14 +87,37 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen public HopperBlockEntity(BlockPos pos, BlockState state) { super(BlockEntityType.HOPPER, pos, state); @@ -2940,7 +2938,7 @@ index a61d7cd2b078fe511ff00344197b6ea11feebfb2..7041394d366e6145369d032a0a14f047 if (!this.tryLoadLootTable(nbt)) { ContainerHelper.loadAllItems(nbt, this.items); } -@@ -491,6 +517,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -492,6 +518,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } private static boolean isFullContainer(Container inventory, Direction direction) { @@ -2948,7 +2946,7 @@ index a61d7cd2b078fe511ff00344197b6ea11feebfb2..7041394d366e6145369d032a0a14f047 // Paper start - Perf: Optimize Hoppers if (inventory instanceof WorldlyContainer worldlyContainer) { for (final int slot : worldlyContainer.getSlotsForFace(direction)) { -@@ -513,7 +540,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -514,7 +541,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } private static boolean isEmptyContainer(Container inv, Direction facing) { @@ -2960,7 +2958,7 @@ index a61d7cd2b078fe511ff00344197b6ea11feebfb2..7041394d366e6145369d032a0a14f047 } public static boolean suckInItems(Level world, Hopper hopper) { -@@ -713,7 +743,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -714,7 +744,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen if (HopperBlockEntity.canPlaceItemInContainer(to, stack, slot, side)) { boolean flag = false; @@ -2969,7 +2967,7 @@ index a61d7cd2b078fe511ff00344197b6ea11feebfb2..7041394d366e6145369d032a0a14f047 if (itemstack1.isEmpty()) { // Spigot start - SPIGOT-6693, InventorySubcontainer#setItem -@@ -908,7 +938,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -909,7 +939,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen @Override protected void setItems(NonNullList list) { @@ -2982,7 +2980,7 @@ index a61d7cd2b078fe511ff00344197b6ea11feebfb2..7041394d366e6145369d032a0a14f047 public static void entityInside(Level world, BlockPos pos, BlockState state, Entity entity, HopperBlockEntity blockEntity) { diff --git a/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java -index a94300a457b25f0e33a8eeabba6dd5720ca9ab1e..b41635dd0569ff7df909df492d3e850aef7214be 100644 +index f52ccd4f3e062af3c7cc6eaea5b074a3bbd21690..a5cd70b6ada2b44f64db0985483ee5eadc67003f 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java @@ -94,12 +94,7 @@ public abstract class RandomizableContainerBlockEntity extends BaseContainerBloc @@ -3273,10 +3271,10 @@ index ebe65474a4a05ff1637d7f37ebcfe690af59def5..42142c512b12e5b269c19f1e821c50e7 @Nullable diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 25f41119bcc19bab7cd2fdb044147b3f78a8ef1c..5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0 100644 +index 9f7ed337463cc9bb370a5541d9de5cd8f9c1a78a..9f5a6398a7dca841570a895054cee969dc96bca4 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -264,7 +264,7 @@ import javax.annotation.Nullable; // Paper +@@ -266,7 +266,7 @@ import javax.annotation.Nullable; // Paper import javax.annotation.Nonnull; // Paper public final class CraftServer implements Server { @@ -3285,7 +3283,7 @@ index 25f41119bcc19bab7cd2fdb044147b3f78a8ef1c..5b01cd1b9a07fc8600fddb9d9e0aea3a private final String serverVersion; private final String bukkitVersion = Versioning.getBukkitVersion(); private final Logger logger = Logger.getLogger("Minecraft"); -@@ -1120,6 +1120,11 @@ public final class CraftServer implements Server { +@@ -1137,6 +1137,11 @@ public final class CraftServer implements Server { plugin.getPluginMeta().getDisplayName(), "This plugin is not properly shutting down its async tasks when it is being shut down. This task may throw errors during the final shutdown logs and might not complete before process dies." )); @@ -3310,10 +3308,10 @@ index 96d772eb02f79f8c478f5e6f065e387aa7665b18..c5ce412f321b8b4f31cc042893659e21 } } diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index 4e1390b9244aeb745ffd3fd1257bc74248722515..e04d721765648a2b5f5bf1f2053e344bfb92f0f4 100644 +index 1324f05de8106032ce290e928cf106fb4f450517..0493e0cf3fac2d4e065118f60f1d7b19751b467f 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -482,7 +482,7 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -497,7 +497,7 @@ public final class CraftMagicNumbers implements UnsafeValues { @Override public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { diff --git a/patches/server/0002-Purpur-Server-Changes.patch b/patches/server/0002-Purpur-Server-Changes.patch index f68565a..ebdee41 100644 --- a/patches/server/0002-Purpur-Server-Changes.patch +++ b/patches/server/0002-Purpur-Server-Changes.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: granny -Date: Fri, 26 Jan 2024 13:54:27 +0900 +Date: Sun, 25 Feb 2024 11:53:25 +0900 Subject: [PATCH] Purpur Server Changes PurpurMC @@ -25,7 +25,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/build.gradle.kts b/build.gradle.kts -index 658e9b4590a82d179907feea04e129fdba9a2f42..0c92d10f334f82d196e065c0811d0c1f48887377 100644 +index 12b774464e8de3a07993be23e233d31e11ede7b1..32366253c04c493135f2b22d1940f83669104723 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,12 +13,12 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) { @@ -56,7 +56,7 @@ index 658e9b4590a82d179907feea04e129fdba9a2f42..0c92d10f334f82d196e065c0811d0c1f 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") -@@ -88,7 +92,7 @@ tasks.jar { +@@ -90,7 +94,7 @@ tasks.jar { attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", "Implementation-Title" to "CraftBukkit", @@ -65,7 +65,7 @@ index 658e9b4590a82d179907feea04e129fdba9a2f42..0c92d10f334f82d196e065c0811d0c1f "Implementation-Vendor" to date, // Paper "Specification-Title" to "Bukkit", "Specification-Version" to project.version, -@@ -172,7 +176,7 @@ fun TaskContainer.registerRunTask( +@@ -174,7 +178,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { @@ -74,7 +74,7 @@ index 658e9b4590a82d179907feea04e129fdba9a2f42..0c92d10f334f82d196e065c0811d0c1f mainClass.set("org.bukkit.craftbukkit.Main") standardInput = System.`in` workingDir = rootProject.layout.projectDirectory -@@ -228,5 +232,7 @@ val runtimeClasspathForRunDev = sourceSets.main.flatMap { src -> +@@ -230,5 +234,7 @@ val runtimeClasspathForRunDev = sourceSets.main.flatMap { src -> } tasks.registerRunTask("runDev") { description = "Spin up a non-relocated Mojang-mapped test server" @@ -342,7 +342,7 @@ index 039a86034928a5eb7aaa2d7ca76a7bddcca346bd..308f67d0616e2d6bb135258f1fda53cc } diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -index ad368b58005b6b0453b709c2ef0ea23bca53d34a..ebbd115686de7a87dd422e8d2d92abcf953358a7 100644 +index f6a3364175476c57a7763a087ff55e1689474800..3fea9b69f4cfc94e7f01d4e3ca4ce7506a8e5d5c 100644 --- a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java +++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java @@ -28,6 +28,7 @@ public class PufferfishConfig { @@ -558,12 +558,12 @@ index a8e813ca89b033f061e695288b3383bdcf128531..1ab65af9359d19530bba7f985a604d2a } if (SysoutCatcher.NAG_INTERVAL > 0 || SysoutCatcher.NAG_TIMEOUT > 0) { diff --git a/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java b/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java -index 89bf48fd581ee6580b91e2eb31dd532cb622df5e..e35da199be67e04c34df6bc09afd8d8122cb0487 100644 +index 708e5bb9bbf0476fcc2c4b92c6830b094703b43e..6141f716b15ad47ac2ac4c9ce92a3897b3ad8807 100644 --- a/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java +++ b/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java -@@ -102,6 +102,7 @@ public class PluginInitializerManager { - java.util.List files = (java.util.List) optionSet.valuesOf("add-plugin"); - // Register plugins from the flag +@@ -104,6 +104,7 @@ public class PluginInitializerManager { + @SuppressWarnings("unchecked") + java.util.List files = ((java.util.List) optionSet.valuesOf("add-plugin")).stream().map(File::toPath).toList(); io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.PluginFlagProviderSource.INSTANCE, files); + io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.SparkProviderSource.INSTANCE, new File("cache", "spark.jar").toPath()); // Purpur } @@ -571,10 +571,10 @@ index 89bf48fd581ee6580b91e2eb31dd532cb622df5e..e35da199be67e04c34df6bc09afd8d81 // This will be the end of me... diff --git a/src/main/java/io/papermc/paper/plugin/provider/source/SparkProviderSource.java b/src/main/java/io/papermc/paper/plugin/provider/source/SparkProviderSource.java new file mode 100644 -index 0000000000000000000000000000000000000000..a7d1ae53eac94bc2dcf8bc78ef1da0d3b8554736 +index 0000000000000000000000000000000000000000..cb78dac8e072b5cb3c6e52e17c9ecdf708aeedc1 --- /dev/null +++ b/src/main/java/io/papermc/paper/plugin/provider/source/SparkProviderSource.java -@@ -0,0 +1,102 @@ +@@ -0,0 +1,115 @@ +package io.papermc.paper.plugin.provider.source; + +import com.mojang.logging.LogUtils; @@ -596,26 +596,23 @@ index 0000000000000000000000000000000000000000..a7d1ae53eac94bc2dcf8bc78ef1da0d3 +import org.bukkit.plugin.java.JavaPlugin; +import org.slf4j.Logger; + -+public class SparkProviderSource extends FileProviderSource { -+ public static final SparkProviderSource INSTANCE = new SparkProviderSource(); ++public class SparkProviderSource implements ProviderSource { + ++ public static final SparkProviderSource INSTANCE = new SparkProviderSource(); ++ private static final FileProviderSource FILE_PROVIDER_SOURCE = new FileProviderSource("File '%s' specified by Purpur"::formatted); + private static final Logger LOGGER = LogUtils.getClassLogger(); + -+ public SparkProviderSource() { -+ super("File '%s' specified by Purpur"::formatted); -+ } -+ + @Override -+ public void registerProviders(EntrypointHandler entrypointHandler, Path context) throws Exception { ++ public Path prepareContext(Path context) { + // first, check if user doesn't want spark at all + if (Boolean.getBoolean("Purpur.IReallyDontWantSpark")) { -+ return; // boo! ++ return null; // boo! + } + + // second, check if user has their own spark + if (hasSpark()) { + LOGGER.info("Purpur: Using user-provided spark plugin instead of our own."); -+ return; // let's hope it's at least the modern version :3 ++ return null; // let's hope it's at least the modern version :3 + } + + // you can't have errors in your code if you wrap the entire codebase in a try/catch block @@ -661,11 +658,27 @@ index 0000000000000000000000000000000000000000..a7d1ae53eac94bc2dcf8bc78ef1da0d3 + } + + // register the spark, newly downloaded or existing -+ super.registerProviders(entrypointHandler, context); ++ return FILE_PROVIDER_SOURCE.prepareContext(context); + + } catch (Throwable e) { + LOGGER.error("Purpur: Failed to download and install spark plugin", e); + } ++ return null; ++ } ++ ++ @Override ++ public void registerProviders(final EntrypointHandler entrypointHandler, final Path context) { ++ if (context == null) { ++ return; ++ } ++ ++ try { ++ FILE_PROVIDER_SOURCE.registerProviders(entrypointHandler, context); ++ } catch (IllegalArgumentException ignored) { ++ // Ignore illegal argument exceptions from jar checking ++ } catch (Exception e) { ++ LOGGER.error("Error loading our spark plugin: " + e.getMessage(), e); ++ } + } + + private static boolean hasSpark() { @@ -678,7 +691,7 @@ index 0000000000000000000000000000000000000000..a7d1ae53eac94bc2dcf8bc78ef1da0d3 + } +} diff --git a/src/main/java/net/minecraft/CrashReport.java b/src/main/java/net/minecraft/CrashReport.java -index e047dee632022abfe05865d1e71838be8d5d053a..888e31a0454888c36cb27602a28619f1f6dbf2c0 100644 +index 99c5038672b09d0874125e3df280174c1e8151e6..f91ea723a1c85f6cf8c4f6dd7f182b948c2f2e81 100644 --- a/src/main/java/net/minecraft/CrashReport.java +++ b/src/main/java/net/minecraft/CrashReport.java @@ -125,6 +125,10 @@ public class CrashReport { @@ -748,7 +761,7 @@ index f341813e9713e39bfe142ca34b751de3d8efd25b..546ff84046856ecfe0f2a07d3ba3f886 boolean flag1 = this.source.acceptsSuccess() && !this.silent; boolean flag2 = broadcastToOps && this.source.shouldInformAdmins() && !this.silent; diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index b7f338e982d0dcab99137ab6dc200b82ac6b7cba..b6cc108c2d4361e6f415cfc3ff8c7699a8e222f4 100644 +index b7f338e982d0dcab99137ab6dc200b82ac6b7cba..b203394ed62807e7d5df433830993f1d2ee14939 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java @@ -165,7 +165,7 @@ public class Commands { @@ -760,6 +773,17 @@ index b7f338e982d0dcab99137ab6dc200b82ac6b7cba..b6cc108c2d4361e6f415cfc3ff8c7699 DefaultGameModeCommands.register(this.dispatcher); DifficultyCommand.register(this.dispatcher); EffectCommands.register(this.dispatcher, commandRegistryAccess); +@@ -221,8 +221,8 @@ public class Commands { + JfrCommand.register(this.dispatcher); + } + +- if (SharedConstants.IS_RUNNING_IN_IDE) { +- TestCommand.register(this.dispatcher); ++ if (org.purpurmc.purpur.PurpurConfig.registerMinecraftDebugCommands || SharedConstants.IS_RUNNING_IN_IDE) { // Purpur ++ if (!org.purpurmc.purpur.PurpurConfig.registerMinecraftDebugCommands) TestCommand.register(this.dispatcher); // Purpur + ResetChunksCommand.register(this.dispatcher); + RaidCommand.register(this.dispatcher); + DebugPathCommand.register(this.dispatcher); @@ -250,6 +250,14 @@ public class Commands { SetPlayerIdleTimeoutCommand.register(this.dispatcher); StopCommand.register(this.dispatcher); @@ -971,10 +995,10 @@ index 2a9fc1f1dfc0c5894c1e74dad5a79ae9b02ac74f..f27fe4370cb027df4fce239eccde28bd throw new IllegalStateException("Unable to get CCW facing of " + this); } diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java -index 1fb809486ee56efd3d0ef3fa02503ba9be459f68..0e2d15d23799a11e592010da98cdc151e427dd4e 100644 +index e2e1273d787536d2fe1bdbbf8af36eb5ac220599..a3fe92e1db6755a9111ab58e84d61f429d72010f 100644 --- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java -@@ -1194,6 +1194,23 @@ public interface DispenseItemBehavior { +@@ -1203,6 +1203,23 @@ public interface DispenseItemBehavior { } } }); @@ -1012,7 +1036,7 @@ index 8d65cdb013706a932c2c73231108b2810b99e1c7..5b1938fc849db743e65cd7eed0f83ba0 // Paper end - Add drops to shear events continue; diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index b189aeb8646b5385c7cca0c4babfcb071a642220..c4e611e7ece504a1ccfa2e3a9d963dbe5917389d 100644 +index 4716f8bd8a64d4f20f0d5957c1e7fabf63020f43..b41cab778f446434b788946ea9d3e02c152e570e 100644 --- a/src/main/java/net/minecraft/network/Connection.java +++ b/src/main/java/net/minecraft/network/Connection.java @@ -569,11 +569,20 @@ public class Connection extends SimpleChannelInboundHandler> { @@ -1093,8 +1117,23 @@ index 9ec6145fe04ec64bbee8ec6a837719caebdbc6f5..358d610ad020cada1bb83e393deeeaae public ClientboundSetTimePacket(long time, long timeOfDay, boolean doDaylightCycle) { this.gameTime = time; +diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java +index 61840cfd64caba6595dfc99c91c76a195638d4ee..b4a009a1108758110181af3321a91b3ec9cf74dc 100644 +--- a/src/main/java/net/minecraft/server/Main.java ++++ b/src/main/java/net/minecraft/server/Main.java +@@ -141,6 +141,10 @@ public class Main { + // Paper start - load config files early for access below if needed + org.bukkit.configuration.file.YamlConfiguration bukkitConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionset.valueOf("bukkit-settings")); + org.bukkit.configuration.file.YamlConfiguration spigotConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionset.valueOf("spigot-settings")); ++ // Purpur start ++ org.bukkit.configuration.file.YamlConfiguration purpurConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionset.valueOf("purpur-settings")); ++ org.purpurmc.purpur.PurpurConfig.registerMinecraftDebugCommands = purpurConfiguration.getBoolean("settings.register-minecraft-debug-commands"); ++ // Purpur end + // Paper end - load config files early for access below if needed + + if (optionset.has("initSettings")) { // CraftBukkit diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 5b6771cc925d29c26ea0cfcf0f72184f96e3eade..2b53c6fb21b08f04c378278f1a5e78e1e4b276d7 100644 +index d1c21d36de331905aedb08b0a8d4fbf97e100a13..b1dd8d66a524254a270a725f5f7a46f28e13b749 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -293,6 +293,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - BlockPhysicsEvent - net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent + net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers + worldserver.updateLagCompensationTick(); // Paper - lag compensation + worldserver.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur - this.profiler.push(() -> { @@ -1534,8 +1573,8 @@ index 5b6771cc925d29c26ea0cfcf0f72184f96e3eade..2b53c6fb21b08f04c378278f1a5e78e1 @DontObfuscate public String getServerModName() { -- return "Pufferfish"; // Pufferfish - Pufferfish > // Paper -+ return org.purpurmc.purpur.PurpurConfig.serverModName; // Purpur - Purpur > // Pufferfish - Pufferfish > // Paper +- return "Pufferfish"; // Pufferfish > // Paper ++ return org.purpurmc.purpur.PurpurConfig.serverModName; // Purpur - Purpur > // Pufferfish > // Paper } public SystemReport fillSystemReport(SystemReport details) { @@ -1769,7 +1808,7 @@ index 1b459a8ee8a6bc039e742d65796bc76660a1c765..599172b994d75484f7c7e0ce6d3d3d77 itemstack1.setCount(1); entityitem = entityplayer.drop(itemstack1, false, false, false); // CraftBukkit - SPIGOT-2942: Add boolean to call event diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index c5f92c80d7ca1e1c7f5b9304a5a1173ebfd9c269..043a48d8c90e2e008b06fb5a643378a0fa948aaa 100644 +index 435b129c433704c24828d8fb57e14333c9423207..5ca6af93362d205438f8321ee2461ae7f8160df1 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -99,6 +99,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -1799,8 +1838,8 @@ index c5f92c80d7ca1e1c7f5b9304a5a1173ebfd9c269..043a48d8c90e2e008b06fb5a643378a0 gg.pufferfish.pufferfish.PufferfishConfig.load(); // Pufferfish gg.pufferfish.pufferfish.PufferfishCommand.init(); // Pufferfish -@@ -269,6 +280,30 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - DedicatedServer.LOGGER.warn("Perhaps a server is already running on that port?"); +@@ -270,6 +281,30 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface + if (true) throw new IllegalStateException("Failed to bind to port", ioexception); // Paper - Propagate failed to bind to port error return false; } + // Purpur start @@ -1830,16 +1869,16 @@ index c5f92c80d7ca1e1c7f5b9304a5a1173ebfd9c269..043a48d8c90e2e008b06fb5a643378a0 // CraftBukkit start // this.setPlayerList(new DedicatedPlayerList(this, this.registries(), this.playerDataStorage)); // Spigot - moved up -@@ -341,6 +376,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -342,6 +377,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface } if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncMobSpawning) mobSpawnExecutor.start(); // Pufferfish + org.purpurmc.purpur.task.BossBarTask.startAll(); // Purpur -+ org.purpurmc.purpur.task.BeehiveTask.instance().register(); // Purpur ++ if (org.purpurmc.purpur.PurpurConfig.beeCountPayload) org.purpurmc.purpur.task.BeehiveTask.instance().register(); // Purpur return true; } } -@@ -487,7 +524,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -488,7 +525,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface } public void handleConsoleInputs() { @@ -1848,7 +1887,7 @@ index c5f92c80d7ca1e1c7f5b9304a5a1173ebfd9c269..043a48d8c90e2e008b06fb5a643378a0 // Paper start - Perf: use proper queue ConsoleInput servercommand; while ((servercommand = this.serverCommandQueue.poll()) != null) { -@@ -504,7 +541,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -505,7 +542,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface // CraftBukkit end } @@ -2020,7 +2059,7 @@ index 38fe7e5014332f45e41a3d5d91c28dd0acfdc3b0..479657ddef21f0279b361117b82549f7 this.values[this.vp++ & 255] = (int)(l * 100L / Runtime.getRuntime().maxMemory()); this.repaint(); diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 28d05b46952397bb664a1c8dae71816cafee89ce..06554a000da1f6ba7360fa907deeead7341b09ea 100644 +index 1081e9df44bb24b2c51ebd9364c21c7b2a3a205a..bb412ca874b85d777c0e3565fcefcee15b23182b 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -538,20 +538,20 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider @@ -2112,7 +2151,7 @@ index 28d05b46952397bb664a1c8dae71816cafee89ce..06554a000da1f6ba7360fa907deeead7 } diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 097f6eb96c2df203565a0c50aba6221e67a7e026..897ad16faffcf10a352a49c87d1d5f44f59d5491 100644 +index 1cf8c819c0d7776c3b33d6594ca81abe3c2a719d..6167ffb1263a1a65b582b7d295d1d77ef38c3ee3 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java @@ -264,16 +264,16 @@ public class ServerChunkCache extends ChunkSource { @@ -2298,7 +2337,7 @@ index 097f6eb96c2df203565a0c50aba6221e67a7e026..897ad16faffcf10a352a49c87d1d5f44 + //gameprofilerfiller.pop(); // Purpur + //gameprofilerfiller.pop(); // Purpur } - + // Pufferfish start - optimize mob spawning @@ -893,7 +893,7 @@ public class ServerChunkCache extends ChunkSource { @@ -2323,7 +2362,7 @@ index db55ad9aaabfa1ea998754f3ac352d1698936696..04b98e23eed926d8473cc2464e04a5b9 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 dbe612427b894df9da1335b94163ba9b89b090c0..75b3de5c1e26815aa04dba3f09f2ef7807767154 100644 +index 531c9ef0d6504fc1632b83bd93b9cf76e91377e8..fb6b762bac4d36b2e307b5343988884fa339d001 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -215,6 +215,8 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -2502,7 +2541,12 @@ index dbe612427b894df9da1335b94163ba9b89b090c0..75b3de5c1e26815aa04dba3f09f2ef78 // Pufferfish start - copied from this.guardEntityTick try { this.tickNonPassenger(entity); // Pufferfish - changed -@@ -928,20 +949,19 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -924,24 +945,23 @@ 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 } // Pufferfish end @@ -2827,7 +2871,7 @@ index dbe612427b894df9da1335b94163ba9b89b090c0..75b3de5c1e26815aa04dba3f09f2ef78 } // Paper end - Fix merchant inventory not closing on entity removal diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 0dba30c41affafe7b1d585b515925043b37712fa..352eb214013111e199fff43ded3a7a617fc90c66 100644 +index 58591bf2f63b9c5e97d9ce4188dff3366968a178..36b7686fdfeaab13cb1be9610ddc76fc70f6f6e5 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -281,6 +281,10 @@ public class ServerPlayer extends Player { @@ -3124,7 +3168,7 @@ index 0dba30c41affafe7b1d585b515925043b37712fa..352eb214013111e199fff43ded3a7a61 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java -index cfd4ac06a9af6bf3fac293110482e1df690e075e..ac325b200bf5091d190f6c1a97caa3dc0434a707 100644 +index a7b217ddbcbf92513bd38101fdfca2075505e267..f8edb6b0d119582cf404b9931adc09484465fc9d 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java @@ -397,6 +397,7 @@ public class ServerPlayerGameMode { @@ -3143,7 +3187,7 @@ index cfd4ac06a9af6bf3fac293110482e1df690e075e..ac325b200bf5091d190f6c1a97caa3dc BlockPos blockposition = hitResult.getBlockPos(); BlockState iblockdata = world.getBlockState(blockposition); InteractionResult enuminteractionresult = InteractionResult.PASS; -@@ -579,7 +581,7 @@ public class ServerPlayerGameMode { +@@ -577,7 +579,7 @@ public class ServerPlayerGameMode { boolean flag1 = player.isSecondaryUseActive() && flag; ItemStack itemstack1 = stack.copy(); @@ -3152,7 +3196,7 @@ index cfd4ac06a9af6bf3fac293110482e1df690e075e..ac325b200bf5091d190f6c1a97caa3dc enuminteractionresult = iblockdata.use(world, player, hand, hitResult); if (enuminteractionresult.consumesAction()) { -@@ -620,4 +622,18 @@ public class ServerPlayerGameMode { +@@ -618,4 +620,18 @@ public class ServerPlayerGameMode { public void setLevel(ServerLevel world) { this.level = world; } @@ -3271,10 +3315,10 @@ index 0306771b8f90dcdd77f151c19c6c2d75c41f8feb..02e65b0bd212d46855baee48fab35dc9 public void suspendFlushing() { diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f0024bf3a06 100644 +index 601ac8738a775eafde2c9e237feb596a9a47ba89..ae5a2152cde8922deeb8d1d8a85bf39518ccd759 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -325,6 +325,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -324,6 +324,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl private boolean justTeleported = false; // CraftBukkit end @@ -3295,7 +3339,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 @Override public void tick() { if (this.ackBlockChangesUpTo > -1) { -@@ -392,6 +406,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -391,6 +405,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 && Util.getMillis() - this.player.getLastActionTime() > (long) this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits @@ -3308,7 +3352,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854 this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause } -@@ -639,6 +659,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -638,6 +658,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -3317,7 +3361,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -712,6 +734,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -711,6 +733,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (packet.getId() == this.awaitingTeleport) { if (this.awaitingPositionFromClient == null) { this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause @@ -3325,7 +3369,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 return; } -@@ -1129,10 +1152,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1143,10 +1166,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl int maxBookPageSize = io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.pageMax; double multiplier = Math.max(0.3D, Math.min(1D, io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier)); long byteAllowed = maxBookPageSize; @@ -3341,7 +3385,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1156,6 +1184,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1170,6 +1198,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (byteTotal > byteAllowed) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); @@ -3349,7 +3393,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1209,13 +1238,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1223,13 +1252,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl itemstack1.setTag(nbttagcompound.copy()); } @@ -3369,7 +3413,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 this.updateBookPages(pages, (s) -> { return Component.Serializer.toJson(Component.literal(s)); -@@ -1227,10 +1259,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1241,10 +1273,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl private void updateBookPages(List list, UnaryOperator unaryoperator, ItemStack itemstack, int slot, ItemStack handItem) { // CraftBukkit ListTag nbttaglist = new ListTag(); @@ -3385,7 +3429,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 Objects.requireNonNull(nbttaglist); stream.forEach(nbttaglist::add); -@@ -1240,11 +1275,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1254,11 +1289,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl for (int j = list.size(); i < j; ++i) { FilteredText filteredtext = (FilteredText) list.get(i); @@ -3399,7 +3443,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 } } -@@ -1257,6 +1292,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1271,6 +1306,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.getInventory().setItem(slot, CraftEventFactory.handleEditBookEvent(this.player, slot, handItem, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent) } @@ -3416,7 +3460,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 @Override public void handleEntityTagQuery(ServerboundEntityTagQuery packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); -@@ -1306,8 +1351,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1320,8 +1365,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); @@ -3434,7 +3478,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 } else { ServerLevel worldserver = this.player.serverLevel(); -@@ -1491,7 +1544,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1505,7 +1558,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl if (!event.isAllowed()) { movedWrongly = true; if (event.getLogWarning()) @@ -3443,7 +3487,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 } } -@@ -1558,6 +1611,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1572,6 +1625,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -3452,7 +3496,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -1593,6 +1648,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1607,6 +1662,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.resetFallDistance(); } @@ -3466,7 +3510,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5); this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); -@@ -1632,6 +1694,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1646,6 +1708,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl return false; } // Paper end - optimise out extra getCubes @@ -3480,7 +3524,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 private boolean isPlayerCollidingWithAnythingNew(LevelReader world, AABB box, double newX, double newY, double newZ) { AABB axisalignedbb1 = this.player.getBoundingBox().move(newX - this.player.getX(), newY - this.player.getY(), newZ - this.player.getZ()); Iterable iterable = world.getCollisions(this.player, axisalignedbb1.deflate(9.999999747378752E-6D)); -@@ -1642,7 +1711,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1656,7 +1725,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl do { if (!iterator.hasNext()) { @@ -3489,7 +3533,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 } voxelshape1 = (VoxelShape) iterator.next(); -@@ -1977,6 +2046,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1991,6 +2060,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl boolean cancelled; if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) { @@ -3497,7 +3541,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack, enumhand); cancelled = event.useItemInHand() == Event.Result.DENY; } else { -@@ -2381,7 +2451,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2395,7 +2465,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl public void handleCommand(String s) { // Paper - private -> public org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher @@ -3506,7 +3550,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s); -@@ -2391,7 +2461,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2405,7 +2475,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -3515,7 +3559,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 return; } -@@ -2404,7 +2474,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2418,7 +2488,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); return; } finally { @@ -3524,7 +3568,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 } } // CraftBukkit end -@@ -2691,6 +2761,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2709,6 +2779,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl AABB axisalignedbb = entity.getBoundingBox(); if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.MAX_INTERACTION_DISTANCE) { @@ -3532,7 +3576,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 packet.dispatch(new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand); -@@ -2704,6 +2775,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2722,6 +2793,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); @@ -3541,7 +3585,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 // 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. -@@ -3289,6 +3362,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -3296,6 +3369,12 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } } } @@ -3555,7 +3599,7 @@ index 7b74541d648de48579221945e4bab963882cc1f2..a56628fb04ccd5a2df4cb98bb4054f00 boolean flag1 = packet.getSlotNum() >= 1 && packet.getSlotNum() <= 45; boolean flag2 = itemstack.isEmpty() || itemstack.getDamageValue() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty(); diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index f92d240e2984b0b49d09662ff33f5c524605ed47..33a0584dae444045749639acdf2bc21a56ca1893 100644 +index c5fa9f4d28f9a7f64a50a902ee5e631bfc00119c..8b62f992ec61d0a66a3856b4928ee2d705548291 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java @@ -270,7 +270,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, @@ -3600,10 +3644,10 @@ index 9ddbfcf80d9a381dace78a62880f85a4d767e0eb..7383c7d3820dce06108eaafd236a7c6c } diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index e0ee45036b9bf14a6e2013fe291cde0402b85b1f..b230739cf929c8f2b51a812fffe54be343ce3e05 100644 +index 1e5f709115007ff19901c0a6c3cf884d9e4d3a6c..ac1e0c66f167218306504db6037cc1d6509072a0 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -486,6 +486,7 @@ public abstract class PlayerList { +@@ -487,6 +487,7 @@ public abstract class PlayerList { scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); } // Paper end - Configurable player collision @@ -3611,7 +3655,7 @@ index e0ee45036b9bf14a6e2013fe291cde0402b85b1f..b230739cf929c8f2b51a812fffe54be3 PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), s1, player.getId(), worldserver1.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ()); } -@@ -598,6 +599,7 @@ public abstract class PlayerList { +@@ -599,6 +600,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 @@ -3619,7 +3663,7 @@ index e0ee45036b9bf14a6e2013fe291cde0402b85b1f..b230739cf929c8f2b51a812fffe54be3 ServerLevel worldserver = entityplayer.serverLevel(); entityplayer.awardStat(Stats.LEAVE_GAME); -@@ -752,7 +754,7 @@ public abstract class PlayerList { +@@ -753,7 +755,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; @@ -3628,7 +3672,7 @@ index e0ee45036b9bf14a6e2013fe291cde0402b85b1f..b230739cf929c8f2b51a812fffe54be3 event.disallow(PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure } } -@@ -1063,6 +1065,20 @@ public abstract class PlayerList { +@@ -1064,6 +1066,20 @@ public abstract class PlayerList { } // CraftBukkit end @@ -3649,7 +3693,7 @@ index e0ee45036b9bf14a6e2013fe291cde0402b85b1f..b230739cf929c8f2b51a812fffe54be3 public void broadcastAll(Packet packet, ResourceKey dimension) { Iterator iterator = this.players.iterator(); -@@ -1166,6 +1182,7 @@ public abstract class PlayerList { +@@ -1167,6 +1183,7 @@ public abstract class PlayerList { } else { b0 = (byte) (24 + permissionLevel); } @@ -3657,7 +3701,7 @@ index e0ee45036b9bf14a6e2013fe291cde0402b85b1f..b230739cf929c8f2b51a812fffe54be3 player.connection.send(new ClientboundEntityEventPacket(player, b0)); } -@@ -1174,6 +1191,27 @@ public abstract class PlayerList { +@@ -1175,6 +1192,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper - Add sendOpLevel API @@ -3685,7 +3729,7 @@ index e0ee45036b9bf14a6e2013fe291cde0402b85b1f..b230739cf929c8f2b51a812fffe54be3 } public boolean isWhiteListed(GameProfile profile) { -@@ -1235,7 +1273,7 @@ public abstract class PlayerList { +@@ -1236,7 +1274,7 @@ public abstract class PlayerList { public void saveAll(int interval) { io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main @@ -3694,7 +3738,7 @@ index e0ee45036b9bf14a6e2013fe291cde0402b85b1f..b230739cf929c8f2b51a812fffe54be3 int numSaved = 0; long now = MinecraftServer.currentTick; for (int i = 0; i < this.players.size(); ++i) { -@@ -1246,7 +1284,7 @@ public abstract class PlayerList { +@@ -1247,7 +1285,7 @@ public abstract class PlayerList { } // Paper end - Incremental chunk and player saving } @@ -3941,7 +3985,7 @@ index ccbfcef3e83b1bef364447657bfd08a92d615cf6..aa2331c6df4e79d4bb0add071a0b11d2 } } diff --git a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java -index 9c99b2e365aacb8309f29acb9025faccd2c676b3..6e8d9be28c5908fb12c44c0ecb0e02180601371a 100644 +index 9c99b2e365aacb8309f29acb9025faccd2c676b3..1653d154edb38a6450ee51cb5e5b8e3d37a1784e 100644 --- a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java +++ b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java @@ -59,7 +59,7 @@ public class CombatTracker { @@ -3958,9 +4002,9 @@ index 9c99b2e365aacb8309f29acb9025faccd2c676b3..6e8d9be28c5908fb12c44c0ecb0e0218 return Component.translatable(string + ".message", this.mob.getDisplayName(), component); } else { + // Purpur start -+ if (damageSource.isScissors) { ++ if (damageSource.isScissors()) { + return damageSource.getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgRunWithScissors, this.mob); -+ } else if (damageSource.isStoneCutter) { ++ } else if (damageSource.isStonecutter()) { + return damageSource.getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgStonecutter, this.mob); + } + // Purpur end @@ -3968,21 +4012,55 @@ index 9c99b2e365aacb8309f29acb9025faccd2c676b3..6e8d9be28c5908fb12c44c0ecb0e0218 } } diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -index fc6903b20a6e084729306fc960a6fc80e094f76c..5b121a3cc6b9790fa80074181dc4cb9c14946f4b 100644 +index 1561b85a45f52a8162f43553f8485bfe084b8f1f..ba4466c49a7c1713007140efdc2eb805e2516b4c 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java -@@ -54,6 +54,10 @@ public class DamageSource { - // CraftBukkit end - public @Nullable org.bukkit.block.BlockState explodedBlockState; // Paper - add exploded state +@@ -27,6 +27,8 @@ public class DamageSource { + private boolean withSweep = false; + private boolean melting = false; + private boolean poison = false; ++ private boolean scissors = false; // Purpur ++ private boolean stonecutter = false; // Purpur + private Entity customCausingEntity = null; // This field is a helper for when causing entity damage is not set by vanilla -+ public boolean isScissors; // Purpur -+ -+ public boolean isStoneCutter; // Purpur -+ - public String toString() { - return "DamageSource (" + this.type().msgId() + ")"; + public DamageSource sweep() { +@@ -56,6 +58,26 @@ public class DamageSource { + return this.poison; } -@@ -122,10 +126,19 @@ public class DamageSource { + ++ // Purpur start ++ public DamageSource scissors() { ++ this.scissors = true; ++ return this; ++ } ++ ++ public boolean isScissors() { ++ return this.scissors; ++ } ++ ++ public DamageSource stonecutter() { ++ this.stonecutter = true; ++ return this; ++ } ++ ++ public boolean isStonecutter() { ++ return this.stonecutter; ++ } ++ // Purpur end ++ + public Entity getCausingEntity() { + return (this.customCausingEntity != null) ? this.customCausingEntity : this.causingEntity; + } +@@ -94,6 +116,8 @@ public class DamageSource { + damageSource.withSweep = this.isSweep(); + damageSource.poison = this.isPoison(); + damageSource.melting = this.isMelting(); ++ damageSource.scissors = this.isScissors(); // Purpur ++ damageSource.stonecutter = this.isStonecutter(); // Purpur + return damageSource; + } + // CraftBukkit end +@@ -166,10 +190,19 @@ public class DamageSource { ItemStack itemstack1 = itemstack; @@ -4004,27 +4082,41 @@ index fc6903b20a6e084729306fc960a6fc80e094f76c..5b121a3cc6b9790fa80074181dc4cb9c return this.type().msgId(); } diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSources.java b/src/main/java/net/minecraft/world/damagesource/DamageSources.java -index f339475185645f7be30963e4f980ce81a6f7e536..530a180a607636265c1b1244f05a772f7adfe7b6 100644 +index a47473c9875c70c52b9a61e0156e55961f34c694..2c1fdc031bcfc8f39692312e9ce9c5a3cf987349 100644 --- a/src/main/java/net/minecraft/world/damagesource/DamageSources.java +++ b/src/main/java/net/minecraft/world/damagesource/DamageSources.java -@@ -267,4 +267,17 @@ public class DamageSources { - public DamageSource genericKill() { - return this.genericKill; +@@ -44,11 +44,15 @@ public class DamageSources { + // CraftBukkit start + private final DamageSource melting; + private final DamageSource poison; ++ private final DamageSource scissors; // Purpur ++ private final DamageSource stonecutter; // Purpur + + public DamageSources(RegistryAccess registryManager) { + this.damageTypes = registryManager.registryOrThrow(Registries.DAMAGE_TYPE); + this.melting = this.source(DamageTypes.ON_FIRE).melting(); + this.poison = this.source(DamageTypes.MAGIC).poison(); ++ this.scissors = this.source(DamageTypes.MAGIC).scissors(); // Purpur ++ this.stonecutter = this.source(DamageTypes.MAGIC).stonecutter(); // Purpur + // CraftBukkit end + this.inFire = this.source(DamageTypes.IN_FIRE); + this.lightningBolt = this.source(DamageTypes.LIGHTNING_BOLT); +@@ -97,6 +101,15 @@ public class DamageSources { } + // CraftBukkit end + + // Purpur start + public DamageSource scissors() { -+ DamageSource source = new DamageSource(this.damageTypes.getHolderOrThrow(DamageTypes.MAGIC)); -+ source.isScissors = true; -+ return source; ++ return this.scissors; + } -+ + public DamageSource stonecutter() { -+ DamageSource source = new DamageSource(this.damageTypes.getHolderOrThrow(DamageTypes.MAGIC)); -+ source.isStoneCutter = true; -+ return source; ++ return this.stonecutter; + } + // Purpur end - } ++ + public DamageSource inFire() { + return this.inFire; + } diff --git a/src/main/java/net/minecraft/world/effect/HungerMobEffect.java b/src/main/java/net/minecraft/world/effect/HungerMobEffect.java index 3aad6bd0a1fb7bb3f9b7dab2c10c875864900750..31bd845130e363dd11c225dfd1e9dd896aea8aac 100644 --- a/src/main/java/net/minecraft/world/effect/HungerMobEffect.java @@ -4186,7 +4278,7 @@ index bf304db1f9506d3e83d16cd632b9155c39346634..d94497083f3da89dbef6479ef8f70591 @Override diff --git a/src/main/java/net/minecraft/world/effect/PoisonMobEffect.java b/src/main/java/net/minecraft/world/effect/PoisonMobEffect.java -index f8a8b825d21a7223a9839abda20825702985b7ad..41a853cd0f7d9aaa3d23df1c49a30fb29f19d14e 100644 +index 196204a8661c7750408997e052ec706f44161fc6..393cd9fac5b2fd39e4248d0abd4930e6b2ff73a4 100644 --- a/src/main/java/net/minecraft/world/effect/PoisonMobEffect.java +++ b/src/main/java/net/minecraft/world/effect/PoisonMobEffect.java @@ -11,8 +11,8 @@ class PoisonMobEffect extends MobEffect { @@ -4194,9 +4286,9 @@ index f8a8b825d21a7223a9839abda20825702985b7ad..41a853cd0f7d9aaa3d23df1c49a30fb2 public void applyEffectTick(LivingEntity entity, int amplifier) { super.applyEffectTick(entity, amplifier); - if (entity.getHealth() > 1.0F) { -- entity.hurt(entity.damageSources().poison, 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON +- entity.hurt(entity.damageSources().poison(), 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON + if (entity.getHealth() > entity.level().purpurConfig.entityMinimalHealthPoison) { // Purpur -+ entity.hurt(entity.damageSources().poison, entity.level().purpurConfig.entityPoisonDegenerationAmount); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON // Purpur ++ entity.hurt(entity.damageSources().poison(), entity.level().purpurConfig.entityPoisonDegenerationAmount); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON // Purpur } } @@ -4240,10 +4332,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 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518ef0916439 100644 +index 098c410f0285948d7ac48835c352f9c97742c5c7..2092ede561d14ace1c003ced051cd4967bb41beb 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 { @@ -4252,7 +4344,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e // 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 -@@ -336,7 +336,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -337,7 +337,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public double xOld; public double yOld; public double zOld; @@ -4261,7 +4353,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e public boolean noPhysics; public final RandomSource random; public int tickCount; -@@ -378,7 +378,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -379,7 +379,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S private final Set tags; private final double[] pistonDeltas; private long pistonDeltasGameTime; @@ -4270,15 +4362,15 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e private float eyeHeight; public boolean isInPowderSnow; public boolean wasInPowderSnow; -@@ -423,6 +423,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 +@@ -427,6 +427,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S + public boolean activatedPriorityReset = false; // Pufferfish - DAB + public int activatedPriority = gg.pufferfish.pufferfish.PufferfishConfig.maximumActivationPrio; // Pufferfish - DAB (golf score) + public final BlockPos.MutableBlockPos cachedBlockPos = new BlockPos.MutableBlockPos(); // Pufferfish - reduce entity allocations + public @Nullable Boolean immuneToFire = null; // Purpur - Fire immune API public void setOrigin(@javax.annotation.Nonnull Location location) { this.origin = location.toVector(); -@@ -560,6 +561,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -558,6 +559,25 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } @@ -4304,7 +4396,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e public final boolean hardCollides() { return this.hardCollides; } -@@ -580,7 +600,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -578,7 +598,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.bb = Entity.INITIAL_AABB; this.stuckSpeedMultiplier = Vec3.ZERO; this.nextStep = 1.0F; @@ -4313,7 +4405,16 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e this.remainingFireTicks = -this.getFireImmuneTicks(); this.fluidHeight = new Object2DoubleArrayMap(2); this.fluidOnEyes = new HashSet(); -@@ -832,7 +852,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -825,7 +845,7 @@ 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 +@@ -842,7 +862,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S // CraftBukkit end public void baseTick() { @@ -4322,7 +4423,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e if (firstTick && this instanceof net.minecraft.world.entity.NeutralMob neutralMob) neutralMob.tickInitialPersistentAnger(level); // Paper - Prevent entity loading causing async lookups this.feetBlockState = null; if (this.isPassenger() && this.getVehicle().isRemoved()) { -@@ -893,7 +913,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -903,7 +923,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } this.firstTick = false; @@ -4331,7 +4432,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } public void setSharedFlagOnFire(boolean onFire) { -@@ -902,10 +922,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -912,10 +932,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public void checkBelowWorld() { // Paper start - Configurable nether ceiling damage @@ -4344,7 +4445,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e this.onBelowWorld(); } -@@ -1113,7 +1134,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1122,7 +1143,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } } @@ -4353,7 +4454,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e if (this.stuckSpeedMultiplier.lengthSqr() > 1.0E-7D) { movement = movement.multiply(this.stuckSpeedMultiplier); this.stuckSpeedMultiplier = Vec3.ZERO; -@@ -1122,7 +1143,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1131,7 +1152,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S // Paper start - ignore movement changes while inactive. if (isTemporarilyActive && !(this instanceof ItemEntity || this instanceof net.minecraft.world.entity.vehicle.AbstractMinecart) && movement == getDeltaMovement() && movementType == MoverType.SELF) { setDeltaMovement(Vec3.ZERO); @@ -4362,7 +4463,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e return; } // Paper end -@@ -1143,8 +1164,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1152,8 +1173,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.setPos(this.getX() + vec3d1.x, this.getY() + vec3d1.y, this.getZ() + vec3d1.z); } @@ -4373,7 +4474,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e boolean flag = !Mth.equal(movement.x, vec3d1.x); boolean flag1 = !Mth.equal(movement.z, vec3d1.z); -@@ -1163,7 +1184,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1172,7 +1193,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.checkFallDamage(vec3d1.y, this.onGround(), iblockdata, blockposition); if (this.isRemoved()) { @@ -4382,7 +4483,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } else { if (this.horizontalCollision) { Vec3 vec3d2 = this.getDeltaMovement(); -@@ -1301,7 +1322,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1310,7 +1331,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.setRemainingFireTicks(-this.getFireImmuneTicks()); } @@ -4391,7 +4492,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } } // Paper start - detailed watchdog information -@@ -1799,7 +1820,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1808,7 +1829,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } public boolean fireImmune() { @@ -4400,7 +4501,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { -@@ -1872,7 +1893,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -1881,7 +1902,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return this.isInWater() || flag; } @@ -4409,7 +4510,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e Entity entity = this.getVehicle(); if (entity instanceof Boat) { -@@ -2488,6 +2509,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2505,6 +2526,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S nbttagcompound.putBoolean("Paper.FreezeLock", true); } // Paper end @@ -4421,7 +4522,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e return nbttagcompound; } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT"); -@@ -2635,6 +2661,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2652,6 +2678,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S freezeLocked = nbt.getBoolean("Paper.FreezeLock"); } // Paper end @@ -4433,7 +4534,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT"); -@@ -3010,6 +3041,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3027,6 +3058,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.passengers = ImmutableList.copyOf(list); } @@ -4447,7 +4548,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e this.gameEvent(GameEvent.ENTITY_MOUNT, passenger); } } -@@ -3049,6 +3087,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3066,6 +3104,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return false; } // CraftBukkit end @@ -4462,7 +4563,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); } else { -@@ -3128,12 +3174,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3145,12 +3191,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return Vec3.directionFromRotation(this.getRotationVector()); } @@ -4479,7 +4580,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } this.isInsidePortal = true; -@@ -3151,7 +3200,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3168,7 +3217,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S ServerLevel worldserver1 = minecraftserver.getLevel(resourcekey); if (true && !this.isPassenger() && this.portalTime++ >= i) { // CraftBukkit @@ -4488,7 +4589,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e this.portalTime = i; // Paper start - Add EntityPortalReadyEvent io.papermc.paper.event.entity.EntityPortalReadyEvent event = new io.papermc.paper.event.entity.EntityPortalReadyEvent(this.getBukkitEntity(), worldserver1 == null ? null : worldserver1.getWorld(), org.bukkit.PortalType.NETHER); -@@ -3169,7 +3218,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3186,7 +3235,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } } // Paper - Add EntityPortalReadyEvent // CraftBukkit end @@ -4497,7 +4598,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } this.isInsidePortal = false; -@@ -3184,7 +3233,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3201,7 +3250,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } this.processPortalCooldown(); @@ -4506,7 +4607,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } } -@@ -3374,7 +3423,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3391,7 +3440,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } public int getMaxAirSupply() { @@ -4515,7 +4616,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } public int getAirSupply() { -@@ -3644,14 +3693,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3660,14 +3709,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } // Paper end - Fix item duplication and teleport issues if (this.level() instanceof ServerLevel && !this.isRemoved()) { @@ -4532,7 +4633,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e PortalInfo shapedetectorshape = (location == null) ? this.findDimensionEntryPoint(worldserver) : new PortalInfo(new Vec3(location.x(), location.y(), location.z()), Vec3.ZERO, this.yRot, this.xRot, worldserver, null); // CraftBukkit if (shapedetectorshape == null) { -@@ -3690,7 +3739,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3706,7 +3755,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.unRide(); // CraftBukkit end @@ -4541,7 +4642,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e // Paper start - Fix item duplication and teleport issues if (this instanceof Mob) { ((Mob) this).dropLeash(true, true); // Paper drop lead -@@ -3717,10 +3766,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3733,10 +3782,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } this.removeAfterChangingDimensions(); @@ -4554,7 +4655,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e return entity; } } else { -@@ -3838,7 +3887,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -3854,7 +3903,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S } public boolean canChangeDimensions() { @@ -4563,7 +4664,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e } public float getBlockExplosionResistance(Explosion explosion, BlockGetter world, BlockPos pos, BlockState blockState, FluidState fluidState, float max) { -@@ -4136,6 +4185,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4152,6 +4201,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S return SlotAccess.NULL; } @@ -4584,7 +4685,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e @Override public void sendSystemMessage(Component message) {} -@@ -4413,6 +4476,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4429,6 +4492,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S this.yRotO = this.getYRot(); } @@ -4597,7 +4698,7 @@ index 00b26925b9e0ef7290f904273da875603b6ce11b..e3322c3263280a8e206af7a84db3518e public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) { if (false && this.touchingUnloadedChunk()) { // Pufferfish - cost of a lookup here is the same cost as below, so skip return false; -@@ -4973,4 +5042,44 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4997,4 +5066,44 @@ 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 @@ -4655,7 +4756,7 @@ index d8cc5614502db7025349e085381b6b32ad32296a..f1b9e83206cc67e6ef29ebe088351b0a private EntitySelector() {} // Paper start - Affects Spawning API diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index ab6cd363231a668c9b16df825a72d3205746ee49..c001f74cc7477320952872302f50380fd9f403e1 100644 +index dc11683ee4d8a6b7a1c42bcae36dc6e8105cd994..a9e2a758669550530eb29475ba99fe42e520f6ae 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java @@ -313,13 +313,24 @@ public class EntityType implements FeatureElement, EntityTypeT @@ -4684,7 +4785,7 @@ index ab6cd363231a668c9b16df825a72d3205746ee49..c001f74cc7477320952872302f50380f public static ResourceLocation getKey(EntityType type) { return BuiltInRegistries.ENTITY_TYPE.getKey(type); } -@@ -535,6 +546,16 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -531,6 +542,16 @@ public class EntityType implements FeatureElement, EntityTypeT return this.category; } @@ -4701,7 +4802,7 @@ index ab6cd363231a668c9b16df825a72d3205746ee49..c001f74cc7477320952872302f50380f public String getDescriptionId() { if (this.descriptionId == null) { this.descriptionId = Util.makeDescriptionId("entity", BuiltInRegistries.ENTITY_TYPE.getKey(this)); -@@ -602,6 +623,12 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -598,6 +619,12 @@ public class EntityType implements FeatureElement, EntityTypeT entity.load(nbt); }, () -> { EntityType.LOGGER.warn("Skipping Entity with id {}", nbt.getString("id")); @@ -4715,10 +4816,10 @@ index ab6cd363231a668c9b16df825a72d3205746ee49..c001f74cc7477320952872302f50380f } 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 @@ -4727,7 +4828,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) { @@ -4736,7 +4837,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 { } } @@ -4799,10 +4900,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 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf2a3d5c09 100644 +index 25e30408c964b5257f1cf945892bd668df38252b..bfa69b2c37f07132f8b31c12d26f4ceb074901a5 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; @@ -4815,7 +4916,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf 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; @@ -4823,7 +4924,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf 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 @@ -4831,7 +4932,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf @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(); @@ -4841,7 +4942,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf 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())))); } @@ -4850,7 +4951,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf 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); } @@ -4858,7 +4959,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf @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(); } @@ -4867,7 +4968,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf 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; } @@ -4876,7 +4977,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf double d7 = Math.min((double) (0.2F + f / 15.0F), 2.5D); int i = (int) (150.0D * d7); -@@ -403,7 +409,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -404,7 +410,7 @@ public abstract class LivingEntity extends Entity implements Attackable { } super.baseTick(); @@ -4885,7 +4986,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf if (this.fireImmune() || this.level().isClientSide) { this.clearFire(); } -@@ -421,6 +427,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -422,6 +428,7 @@ public abstract class LivingEntity extends Entity implements Attackable { double d1 = this.level().getWorldBorder().getDamagePerBlock(); if (d1 > 0.0D) { @@ -4893,7 +4994,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf this.hurt(this.damageSources().outOfBorder(), (float) Math.max(1, Mth.floor(-d0 * d1))); } } -@@ -432,7 +439,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -433,7 +440,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (flag1) { this.setAirSupply(this.decreaseAirSupply(this.getAirSupply())); @@ -4902,7 +5003,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf this.setAirSupply(0); Vec3 vec3d = this.getDeltaMovement(); -@@ -444,7 +451,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -445,7 +452,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); } @@ -4911,7 +5012,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf } } -@@ -505,7 +512,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -506,7 +513,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.yHeadRotO = this.yHeadRot; this.yRotO = this.getYRot(); this.xRotO = this.getXRot(); @@ -4920,7 +5021,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf } public boolean canSpawnSoulSpeedParticle() { -@@ -797,6 +804,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -805,6 +812,7 @@ public abstract class LivingEntity extends Entity implements Attackable { dataresult.resultOrPartial(logger::error).ifPresent((nbtbase) -> { nbt.put("Brain", nbtbase); }); @@ -4928,7 +5029,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf } @Override -@@ -882,6 +890,11 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -891,6 +899,11 @@ public abstract class LivingEntity extends Entity implements Attackable { this.brain = this.makeBrain(new Dynamic(NbtOps.INSTANCE, nbt.get("Brain"))); } @@ -4940,7 +5041,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf } // CraftBukkit start -@@ -1027,9 +1040,31 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1036,9 +1049,31 @@ public abstract class LivingEntity extends Entity implements Attackable { ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD); EntityType entitytypes = entity.getType(); @@ -4974,7 +5075,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf } return d0; -@@ -1089,6 +1124,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1098,6 +1133,7 @@ public abstract class LivingEntity extends Entity implements Attackable { for (flag = false; iterator.hasNext(); flag = true) { // CraftBukkit start MobEffectInstance effect = (MobEffectInstance) iterator.next(); @@ -4982,7 +5083,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED); if (event.isCancelled()) { continue; -@@ -1511,13 +1547,13 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1520,13 +1556,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; @@ -4998,7 +5099,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf LivingEntity entityliving2 = entitywolf.getOwner(); if (entityliving2 instanceof net.minecraft.world.entity.player.Player) { -@@ -1625,6 +1661,18 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1634,6 +1670,18 @@ public abstract class LivingEntity extends Entity implements Attackable { } } @@ -5017,7 +5118,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf 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); -@@ -1790,7 +1838,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1800,7 +1848,7 @@ public abstract class LivingEntity extends Entity implements Attackable { boolean flag = false; if (this.dead && adversary instanceof WitherBoss) { // Paper @@ -5026,7 +5127,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf BlockPos blockposition = this.blockPosition(); BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); -@@ -1836,6 +1884,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1846,6 +1894,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.dropEquipment(); // CraftBukkit - from below if (this.shouldDropLoot() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { @@ -5034,7 +5135,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf this.dropFromLootTable(source, flag); // Paper start final boolean prev = this.clearEquipmentSlots; -@@ -1844,6 +1893,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1854,6 +1903,7 @@ public abstract class LivingEntity extends Entity implements Attackable { // Paper end this.dropCustomDeathLoot(source, i, flag); this.clearEquipmentSlots = prev; // Paper @@ -5042,7 +5143,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf } // 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, () -> { -@@ -2091,7 +2141,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2113,7 +2163,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); @@ -5051,7 +5152,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf } } -@@ -2314,6 +2364,20 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2336,6 +2386,20 @@ public abstract class LivingEntity extends Entity implements Attackable { } } @@ -5072,7 +5173,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf if (f > 0 || !human) { if (human) { // PAIL: Be sure to drag all this code from the EntityHuman subclass each update. -@@ -2534,7 +2598,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2556,7 +2620,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @Override protected void onBelowWorld() { @@ -5081,7 +5182,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf } protected void updateSwingTime() { -@@ -2728,7 +2792,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2750,7 +2814,7 @@ public abstract class LivingEntity extends Entity implements Attackable { } protected long lastJumpTime = 0L; // Paper - Prevent excessive velocity through repeated crits @@ -5090,7 +5191,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf Vec3 vec3d = this.getDeltaMovement(); // Paper start - Prevent excessive velocity through repeated crits long time = System.nanoTime(); -@@ -2880,6 +2944,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2902,6 +2966,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (f3 > 0.0F) { this.playSound(this.getFallDamageSound((int) f3), 1.0F, 1.0F); @@ -5098,7 +5199,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf this.hurt(this.damageSources().flyIntoWall(), f3); } } -@@ -3101,10 +3166,10 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3123,10 +3188,10 @@ public abstract class LivingEntity extends Entity implements Attackable { } this.run += (f3 - this.run) * 0.3F; @@ -5112,7 +5213,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf // Paper start - stop large pitch and yaw changes from crashing the server this.yRotO += Math.round((this.getYRot() - this.yRotO) / 360.0F) * 360.0F; -@@ -3116,7 +3181,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3138,7 +3203,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.yHeadRotO += Math.round((this.yHeadRot - this.yHeadRotO) / 360.0F) * 360.0F; // Paper end @@ -5121,7 +5222,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf this.animStep += f2; if (this.isFallFlying()) { ++this.fallFlyTicks; -@@ -3411,19 +3476,19 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3433,19 +3498,19 @@ public abstract class LivingEntity extends Entity implements Attackable { } this.setDeltaMovement(d0, d1, d2); @@ -5146,7 +5247,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf if (this.jumping && this.isAffectedByFluids()) { double d3; -@@ -3450,8 +3515,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3472,8 +3537,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.noJumpDelay = 0; } @@ -5157,7 +5258,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf this.xxa *= 0.98F; this.zza *= 0.98F; this.updateFallFlying(); -@@ -3478,8 +3543,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3500,8 +3565,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.travel(vec3d1); } @@ -5168,7 +5269,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf if (!this.level().isClientSide && !this.isDeadOrDying() && !this.freezeLocked) { // Paper - Freeze Tick Lock API int i = this.getTicksFrozen(); -@@ -3496,18 +3561,20 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3518,18 +3583,20 @@ public abstract class LivingEntity extends Entity implements Attackable { this.hurt(this.damageSources().freeze(), 1.0F); } @@ -5192,9 +5293,9 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf + if (((ServerLevel) this.level()).hasEntityMoveEvent && !(this instanceof net.minecraft.world.entity.player.Player)) { + // Purpur end 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()); + 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()); -@@ -3517,12 +3584,48 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3539,12 +3606,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()); } } @@ -5243,7 +5344,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf } public boolean isSensitiveToWater() { -@@ -3543,7 +3646,16 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3565,7 +3668,16 @@ public abstract class LivingEntity extends Entity implements Attackable { int j = i / 10; if (j % 2 == 0) { @@ -5262,7 +5363,7 @@ index 5641bc7f50cef7819ddaeb76a4a4f9c80f473d31..1824ef51279af511f6ab2cb22b4991bf }); } diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c224647915d3ee7b 100644 +index 4cf2963fdbe9003fd18ac8c2035ccded57c02abd..1d1688fafc438a5957096118790d44fbd55476bb 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; @@ -5273,7 +5374,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 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; @@ -5281,7 +5382,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 public boolean aware = true; // CraftBukkit protected Mob(EntityType type, Level world) { -@@ -148,8 +150,8 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -149,8 +151,8 @@ public abstract class Mob extends LivingEntity implements Targeting { this.restrictRadius = -1.0F; this.goalSelector = new GoalSelector(world.getProfilerSupplier()); this.targetSelector = new GoalSelector(world.getProfilerSupplier()); @@ -5292,7 +5393,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 this.jumpControl = new JumpControl(this); this.bodyRotationControl = this.createBodyControl(); this.navigation = this.createNavigation(world); -@@ -324,6 +326,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -325,6 +327,7 @@ public abstract class Mob extends LivingEntity implements Targeting { entityliving = null; } } @@ -5300,7 +5401,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 this.target = entityliving; return true; // CraftBukkit end -@@ -364,15 +367,35 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -365,15 +368,35 @@ public abstract class Mob extends LivingEntity implements Targeting { @Override public void baseTick() { super.baseTick(); @@ -5330,7 +5431,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 + return; // mob persistent + } + if (this.ticksSinceLastInteraction > this.level().purpurConfig.entityLifeSpan) { -+ this.discard(); ++ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); + } + } + // Purpur end @@ -5338,7 +5439,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 @Override protected void playHurtSound(DamageSource source) { this.resetAmbientSoundTime(); -@@ -562,6 +585,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -563,6 +586,7 @@ public abstract class Mob extends LivingEntity implements Targeting { } nbt.putBoolean("Bukkit.Aware", this.aware); // CraftBukkit @@ -5346,7 +5447,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 } @Override -@@ -632,6 +656,11 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -633,6 +657,11 @@ public abstract class Mob extends LivingEntity implements Targeting { this.aware = nbt.getBoolean("Bukkit.Aware"); } // CraftBukkit end @@ -5358,7 +5459,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 } @Override -@@ -675,8 +704,8 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -676,8 +705,8 @@ public abstract class Mob extends LivingEntity implements Targeting { @Override public void aiStep() { super.aiStep(); @@ -5369,7 +5470,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 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(); -@@ -695,7 +724,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -696,7 +725,7 @@ public abstract class Mob extends LivingEntity implements Targeting { } } @@ -5378,7 +5479,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 } protected Vec3i getPickupReach() { -@@ -907,46 +936,46 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -908,46 +937,46 @@ public abstract class Mob extends LivingEntity implements Targeting { return; } // Paper end - Allow nerfed mobs to jump and float @@ -5445,7 +5546,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 this.sendDebugPackets(); } -@@ -1175,6 +1204,12 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1183,6 +1212,12 @@ public abstract class Mob extends LivingEntity implements Targeting { } @@ -5458,7 +5559,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 @Nullable public static Item getEquipmentForSlot(EquipmentSlot equipmentSlot, int equipmentLevel) { switch (equipmentSlot) { -@@ -1269,7 +1304,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1277,7 +1312,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)); @@ -5467,7 +5568,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 this.setLeftHanded(true); } else { this.setLeftHanded(false); -@@ -1317,6 +1352,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1325,6 +1360,7 @@ public abstract class Mob extends LivingEntity implements Targeting { if (!this.isAlive()) { return InteractionResult.PASS; } else if (this.getLeashHolder() == player) { @@ -5475,7 +5576,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 // CraftBukkit start - fire PlayerUnleashEntityEvent // Paper start - Expand EntityUnleashEvent org.bukkit.event.player.PlayerUnleashEntityEvent event = CraftEventFactory.callPlayerUnleashEntityEvent(this, player, hand, !player.getAbilities().instabuild); -@@ -1390,7 +1426,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1398,7 +1434,7 @@ public abstract class Mob extends LivingEntity implements Targeting { protected void onOffspringSpawnedFromEgg(Player player, Mob child) {} protected InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -5484,7 +5585,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 } public boolean isWithinRestriction() { -@@ -1701,6 +1737,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1709,6 +1745,7 @@ public abstract class Mob extends LivingEntity implements Targeting { this.setLastHurtMob(target); } @@ -5492,7 +5593,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 return flag; } -@@ -1721,17 +1758,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1729,17 +1766,7 @@ public abstract class Mob extends LivingEntity implements Targeting { } public boolean isSunBurnTick() { @@ -5511,7 +5612,7 @@ index a181a298334212847166409a2121476ba5871cb2..11062e250657cb839ca046d6c2246479 } @Override -@@ -1779,4 +1806,56 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1787,4 +1814,56 @@ public abstract class Mob extends LivingEntity implements Targeting { return itemmonsteregg == null ? null : new ItemStack(itemmonsteregg); } @@ -6227,7 +6328,7 @@ index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..7094701d213c73ba47ace806962244c1 } diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -index 3c4f4af85a3f2d4f9f52827164e63727b916c33a..aa4dec55c1d4cd9796587ea3a3343131a4d2f0a4 100644 +index 931cbbe41905d7ed3fd46c53d3ddd06a6b9a7c8a..d8642979b7296737d08529f6db4f64e463d9f936 100644 --- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java +++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java @@ -64,6 +64,10 @@ public class TargetingConditions { @@ -6915,7 +7016,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; @@ -7095,7 +7196,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); + } @@ -7109,10 +7210,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(); }; @@ -7218,7 +7319,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)); @@ -7241,7 +7342,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) { @@ -7250,7 +7351,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(); @@ -7262,7 +7363,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() { @@ -7271,7 +7372,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 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d2ab93faf 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; @@ -7282,7 +7383,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d 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); } @@ -7347,7 +7448,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d @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()); @@ -7355,7 +7456,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d 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()); @@ -7363,7 +7464,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d 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() { @@ -7375,7 +7476,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d 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()); @@ -7383,9 +7484,9 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d } List getTrustedUUIDs() { -@@ -717,6 +784,29 @@ public class Fox extends Animal implements VariantHolder { - return this.getTrustedUUIDs().contains(uuid); +@@ -728,6 +795,29 @@ public class Fox extends Animal implements VariantHolder { } + // Paper end + // Purpur start + @Override @@ -7413,7 +7514,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d @Override // Paper start - Cancellable death event protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(DamageSource source) { -@@ -769,16 +859,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)); } @@ -7433,7 +7534,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d } } -@@ -789,16 +879,16 @@ public class Fox extends Animal implements VariantHolder { +@@ -805,16 +895,16 @@ public class Fox extends Animal implements VariantHolder { } } @@ -7453,7 +7554,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d } } -@@ -916,8 +1006,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); } @@ -7466,7 +7567,7 @@ index 287e52dc844c2a64dac74dad117b775f46631157..c763fae0ac4e914305b3d3754aee3d8d this.animal.resetLove(); this.partner.resetLove(); worldserver.addFreshEntityWithPassengers(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason -@@ -1303,7 +1395,7 @@ public class Fox extends Animal implements VariantHolder { +@@ -1319,7 +1411,7 @@ public class Fox extends Animal implements VariantHolder { } protected void onReachedTarget() { @@ -7588,10 +7689,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 7a82ba6e29fde33841c049e8520300aa66608f34..3f00d40125b63a76ed549755d4c9d9a2ff2d4adf 100644 +index 161c128d27f50f145f88142191f1a5c93649ea65..21632120b52e4d594153ebe057a14afa74c3f4eb 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()) { @@ -7658,7 +7759,7 @@ index 7a82ba6e29fde33841c049e8520300aa66608f34..3f00d40125b63a76ed549755d4c9d9a2 } if (!player.getAbilities().instabuild) { -@@ -175,13 +212,13 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder CraftEventFactory.MELTING + this.hurt(this.damageSources().melting(), 1.0F); // CraftBukkit - DamageSources.ON_FIRE -> CraftEventFactory.MELTING } - if (!this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { @@ -8902,7 +9003,7 @@ index b05b560b7570e97bc234b75f26233909fcf575b3..87b6f6b10ba6e3d9c6a42298a2019a52 return "entity.minecraft.tropical_fish.predefined." + variant; } diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java -index f97bdfbd07db000845d3b791de64056c3c23f7ba..19578b2880530da71a22ba0847e0cc23ed6bd168 100644 +index dbdb6c432448b151fa4421f14235f8bad23dc720..6bf8ed96eaed4a500164f21cb5ead32a7e5a224d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java +++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java @@ -86,6 +86,43 @@ public class Turtle extends Animal { @@ -8957,7 +9058,7 @@ index f97bdfbd07db000845d3b791de64056c3c23f7ba..19578b2880530da71a22ba0847e0cc23 this.goalSelector.addGoal(0, new Turtle.TurtlePanicGoal(this, 1.2D)); this.goalSelector.addGoal(1, new Turtle.TurtleBreedGoal(this, 1.0D)); this.goalSelector.addGoal(1, new Turtle.TurtleLayEggGoal(this, 1.0D)); -@@ -346,13 +384,15 @@ public class Turtle extends Animal { +@@ -344,13 +382,15 @@ public class Turtle extends Animal { return new Vector3f(0.0F, dimensions.height + (this.isBaby() ? 0.0F : 0.15625F) * scaleFactor, -0.25F * scaleFactor); } @@ -8974,7 +9075,7 @@ index f97bdfbd07db000845d3b791de64056c3c23f7ba..19578b2880530da71a22ba0847e0cc23 } private void updateSpeed() { -@@ -372,7 +412,7 @@ public class Turtle extends Animal { +@@ -370,7 +410,7 @@ public class Turtle extends Animal { } @Override @@ -8983,7 +9084,7 @@ index f97bdfbd07db000845d3b791de64056c3c23f7ba..19578b2880530da71a22ba0847e0cc23 this.updateSpeed(); if (this.operation == MoveControl.Operation.MOVE_TO && !this.turtle.getNavigation().isDone()) { double d0 = this.wantedX - this.turtle.getX(); -@@ -388,7 +428,7 @@ public class Turtle extends Animal { +@@ -386,7 +426,7 @@ public class Turtle extends Animal { this.turtle.setYRot(this.rotlerp(this.turtle.getYRot(), f, 90.0F)); this.turtle.yBodyRot = this.turtle.getYRot(); @@ -9474,7 +9575,7 @@ index 33c160994f70f71446d665e7487913437c9f9db4..472b76d6ec721fa46857097589aa879f } diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java -index f693d4d6a6a3c3d31c2d85ceb5b5b01366c970a1..fb50a3f3665cca4bb2e586fbd73c580a5d691f69 100644 +index 1f09d47b0ffb07b49b4d8bd79a371dd61f1c2a92..41773acc8e8e27daa1fe43726939b2d95da92c30 100644 --- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java +++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java @@ -86,6 +86,17 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Saddl @@ -9641,10 +9742,10 @@ index e88b058c0734e436ef24bab6364b206c13e5a9c2..d6340d0a1308bafd3ba176562bf08dca super(entity); } 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 6ed4ac06c76b8d0d6e8db778cade15dbd1e3e5f5..14135dac80dec4224715e21cef6556d22e569026 100644 +index 415afe3473d9f8a50b1edab8cfda6158e59836e6..2a9c2a69a0589e4e7b7c79d3716376b360a2eba1 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 -@@ -45,13 +45,50 @@ public class Tadpole extends AbstractFish { +@@ -48,13 +48,50 @@ public class Tadpole extends AbstractFish { protected static final ImmutableList>> 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 @@ -9696,7 +9797,7 @@ index 6ed4ac06c76b8d0d6e8db778cade15dbd1e3e5f5..14135dac80dec4224715e21cef6556d2 @Override protected PathNavigation createNavigation(Level world) { return new WaterBoundPathNavigation(this, world); -@@ -80,13 +117,12 @@ public class Tadpole extends AbstractFish { +@@ -83,13 +120,12 @@ public class Tadpole extends AbstractFish { private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep() { @@ -10159,10 +10260,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); } @@ -10204,21 +10305,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); } @@ -10419,10 +10523,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..01e957b04e4975e51f1395e0d1820a4520149d85 100644 +index 036640d49a5e891e9a0f767abe33f1f51d6d4cde..34f5006f72ec357c474a19f22ee339e3a1dc786f 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 @@ -10435,7 +10539,7 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..01e957b04e4975e51f1395e0d1820a45 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); } @@ -10458,39 +10562,13 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..01e957b04e4975e51f1395e0d1820a45 @Override protected Entity.MovementEmission getMovementEmission() { return Entity.MovementEmission.NONE; -@@ -77,6 +99,7 @@ public class EndCrystal extends Entity { +@@ -78,8 +100,52 @@ 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 - } - - } -@@ -124,16 +147,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; - - // CraftBukkit start -- ExplosionPrimeEvent event = CraftEventFactory.callExplosionPrimeEvent(this, 6.0F, false); -+ ExplosionPrimeEvent event = CraftEventFactory.callExplosionPrimeEvent(this, getExplosionPower(), hasExplosionFire()); // Purpur - if (event.isCancelled()) { - this.unsetRemoved(); - return false; - } -- 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 - } - - this.onDestroyedBy(source); -@@ -158,6 +183,49 @@ public class EndCrystal extends Entity { - } - } - ++ } ++ + // Purpur start + if (level().purpurConfig.phantomAttackedByCrystalRadius <= 0 || --idleCooldown > 0) { + return; // on cooldown @@ -10518,7 +10596,7 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..01e957b04e4975e51f1395e0d1820a45 + } else { + forgetPhantom(); // attacked long enough + } -+ } + } + } + + private void attackPhantom(net.minecraft.world.entity.monster.Phantom phantom) { @@ -10526,7 +10604,7 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..01e957b04e4975e51f1395e0d1820a45 + phantomBeamTicks = 60; + targetPhantom = phantom; + } -+ + + private void forgetPhantom() { + targetPhantom = null; + setBeamTarget(null); @@ -10536,12 +10614,33 @@ index c99ab157e43fc990549fc06f5b6fb1e227014fde..01e957b04e4975e51f1395e0d1820a45 + // Purpur end } - public void setBeamTarget(@Nullable BlockPos beamTarget) { + @Override +@@ -124,16 +190,18 @@ public class EndCrystal extends Entity { + } + // CraftBukkit end + if (!source.is(DamageTypeTags.IS_EXPLOSION)) { ++ if (shouldExplode()) {// Purpur + DamageSource damagesource1 = source.getEntity() != null ? this.damageSources().explosion(this, source.getEntity()) : null; + + // CraftBukkit start +- ExplosionPrimeEvent event = CraftEventFactory.callExplosionPrimeEvent(this, 6.0F, false); ++ ExplosionPrimeEvent event = CraftEventFactory.callExplosionPrimeEvent(this, getExplosionPower(), hasExplosionFire()); // Purpur + if (event.isCancelled()) { + 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 ++ } else this.unsetRemoved(); // Purpur + } else { + this.remove(Entity.RemovalReason.KILLED, EntityRemoveEvent.Cause.DEATH); // CraftBukkit - add Bukkit remove cause + } 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 dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad594cfc6f5 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 @@ -10549,7 +10648,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 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 @@ -10587,7 +10686,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 } 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; } @@ -10615,7 +10714,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 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() { @@ -10653,7 +10752,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 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()) { @@ -10662,7 +10761,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 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); @@ -10674,7 +10773,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 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(); @@ -10683,7 +10782,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 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)); @@ -10692,7 +10791,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 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) { @@ -10701,7 +10800,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 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)) { @@ -10710,7 +10809,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 // 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; @@ -10719,7 +10818,7 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 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) { @@ -10728,10 +10827,10 @@ index dd9800094b132954f0677eb6610fe27db4cec711..0050e314162f912449e0c01995ca1ad5 } 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 ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc85804112d87c 100644 +index de2471cfa96a23944f229f33ffdff88b6b7756e4..1d896c6c49705acd87416dc11a1d8ce205f7844e 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); @@ -10792,7 +10891,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 @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; } @@ -10906,7 +11005,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 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()); @@ -10914,7 +11013,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 } @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()); } @@ -10922,7 +11021,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 } -@@ -263,6 +404,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -264,6 +405,16 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @Override protected void customServerAiStep() { @@ -10939,7 +11038,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 int i; if (this.getInvulnerableTicks() > 0) { -@@ -279,7 +430,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -280,7 +431,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } // CraftBukkit end @@ -10948,7 +11047,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 // 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; -@@ -304,7 +455,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -305,7 +456,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob this.setInvulnerableTicks(i); if (this.tickCount % 10 == 0) { @@ -10957,7 +11056,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 } } else { -@@ -364,7 +515,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -365,7 +516,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob if (this.destroyBlocksTick > 0) { --this.destroyBlocksTick; @@ -10966,7 +11065,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 i = Mth.floor(this.getY()); j = Mth.floor(this.getX()); int i1 = Mth.floor(this.getZ()); -@@ -397,8 +548,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -398,8 +549,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } } @@ -10979,7 +11078,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 } this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth()); -@@ -584,11 +737,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -585,11 +738,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob } public int getAlternativeTarget(int headIndex) { @@ -10993,7 +11092,7 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 } @Override -@@ -603,6 +756,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -604,6 +757,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @Override protected boolean canRide(Entity entity) { @@ -11002,10 +11101,10 @@ index ea8883b0661e894a466eca24bfc247ac37f40a81..a8314521dd5d17fcf3ff1de4f6fc8580 } 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..04261213860c7122a63d2ac6a57781a5b0e62b39 100644 +index eadcebd7845ee716e33c0ac0544502da1a6c5941..fef18455da5ae020f9875663984b26e54a1c4bf7 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 @@ -11018,7 +11117,7 @@ index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..04261213860c7122a63d2ac6a57781a5 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); @@ -11026,7 +11125,7 @@ index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..04261213860c7122a63d2ac6a57781a5 } 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); @@ -11035,7 +11134,7 @@ index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..04261213860c7122a63d2ac6a57781a5 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() { @@ -11043,7 +11142,7 @@ index 94a30a0c1266bf919d1dc4ca2b19489edd54a7fa..04261213860c7122a63d2ac6a57781a5 // 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 @@ -11110,10 +11209,10 @@ index d9016807bc21c38a5c38170e1335c79b39355bcb..62cdc36a21c0203ed98d2946a1efdf54 } diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java -index 9daf8aa557d9f4fdbcc138a47892ea5a061dd877..3a25741693a8fd08ac4308da3f178155c28bf46b 100644 +index 0aef6a8d51cb1351daaea16022f5cbb27ceaff0d..65cb5994142351e2b19f6d4ff2963f9ae7752205 100644 --- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java -@@ -133,7 +133,7 @@ public class FallingBlockEntity extends Entity { +@@ -134,7 +134,7 @@ public class FallingBlockEntity extends Entity { @Override public void tick() { // Paper start - fix sand duping @@ -11122,7 +11221,7 @@ index 9daf8aa557d9f4fdbcc138a47892ea5a061dd877..3a25741693a8fd08ac4308da3f178155 return; } // Paper end - fix sand duping -@@ -149,7 +149,7 @@ public class FallingBlockEntity extends Entity { +@@ -150,7 +150,7 @@ public class FallingBlockEntity extends Entity { this.move(MoverType.SELF, this.getDeltaMovement()); // Paper start - fix sand duping @@ -11132,10 +11231,10 @@ index 9daf8aa557d9f4fdbcc138a47892ea5a061dd877..3a25741693a8fd08ac4308da3f178155 } // Paper end - fix sand duping 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 eb0d6238588efa35fa868f26290547574a08eca2..633c2b7b02873f83c488a286acda34937ce0b496 100644 +index c7f06c3cfb737bd17a706798bf9cf0e1af5f0cc0..3cac817351a149935df75ef23d9f9417f6502016 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -@@ -58,6 +58,12 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -59,6 +59,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 @@ -11148,7 +11247,7 @@ index eb0d6238588efa35fa868f26290547574a08eca2..633c2b7b02873f83c488a286acda3493 public ItemEntity(EntityType type, Level world) { super(type, world); -@@ -364,7 +370,16 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -365,7 +371,16 @@ public class ItemEntity extends Entity implements TraceableEntity { @Override public boolean hurt(DamageSource source, float amount) { @@ -11166,7 +11265,7 @@ index eb0d6238588efa35fa868f26290547574a08eca2..633c2b7b02873f83c488a286acda3493 return false; } else if (!this.getItem().isEmpty() && this.getItem().is(Items.NETHER_STAR) && source.is(DamageTypeTags.IS_EXPLOSION)) { return false; -@@ -567,6 +582,12 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -568,6 +583,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 @@ -11180,10 +11279,10 @@ index eb0d6238588efa35fa868f26290547574a08eca2..633c2b7b02873f83c488a286acda3493 @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 @@ -11468,10 +11567,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; @@ -11571,7 +11670,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 { } } @@ -11609,7 +11708,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() { @@ -11626,10 +11725,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 } @@ -11638,7 +11737,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()); @@ -11789,7 +11888,7 @@ index 01897af1e6253b987734a24c052daf2ce1314092..7600e747d91ae888eb801cfafcb09bff } diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -index 6d4810626980ce46e02042a5660f615c58d0d5fd..93e51be1ad77a5ae57e4bd92ba1b4535d9ea37d8 100644 +index 91ff663b2260d1cdd1388c93068e4cd9d0331aea..cb189457305916f509d624beb303feff35d0c358 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java @@ -36,6 +36,33 @@ public class ElderGuardian extends Guardian { @@ -11971,11 +12070,11 @@ index 6563e625ebae47fc68e5010d36bd4b4d327c07b7..13bc6389652f8868d7539676ee6d85f3 @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 @@ -12035,10 +12134,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"); @@ -13112,10 +13211,10 @@ index 187037c43ebb5b245ffa4b50163d443490668744..44a24707530ca46a6a42e8a4d9049e75 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); } @@ -13162,7 +13261,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 @@ -13252,7 +13351,7 @@ index 151acc43c96b4545ce92d3d559d8e1591874b4b5..2d834e57253f666f04f8e0b47c8b8a45 if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state continue; diff --git a/src/main/java/net/minecraft/world/entity/monster/Shulker.java b/src/main/java/net/minecraft/world/entity/monster/Shulker.java -index b73dac8f68041f8a2e0752d70cc9d08b5cfd1cde..8a52c1ad5e2872e4b484eebc834fa42fd1930481 100644 +index f3c2a2ffb74daa89a516db4c188ce675c79932bf..ab21a44905a4154013cd65acdecbf55b741da086 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Shulker.java +++ b/src/main/java/net/minecraft/world/entity/monster/Shulker.java @@ -22,6 +22,8 @@ import net.minecraft.tags.DamageTypeTags; @@ -13360,7 +13459,7 @@ index b73dac8f68041f8a2e0752d70cc9d08b5cfd1cde..8a52c1ad5e2872e4b484eebc834fa42f if (entityshulker != null) { entityshulker.setVariant(this.getVariant()); -@@ -586,7 +646,7 @@ public class Shulker extends AbstractGolem implements VariantHolder getVariant() { @@ -13369,7 +13468,7 @@ index b73dac8f68041f8a2e0752d70cc9d08b5cfd1cde..8a52c1ad5e2872e4b484eebc834fa42f } @Nullable -@@ -596,7 +656,7 @@ public class Shulker extends AbstractGolem implements VariantHolder(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 @@ -13440,7 +13539,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(); @@ -13450,7 +13549,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; @@ -13563,7 +13662,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); + } @@ -13578,10 +13677,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; @@ -13589,7 +13688,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); } @@ -13679,7 +13778,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(); @@ -13691,7 +13790,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 @@ -13705,7 +13804,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()); } @@ -13714,7 +13813,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) { @@ -13751,7 +13850,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 { @@ -13953,7 +14052,7 @@ index 61162ecd43dc5e6f7898daecdec49f444e6d869b..2f49b528601a1feb7246fe7a9b83ce82 if (flag && !this.isSilent()) { this.level().playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.STRIDER_EAT, this.getSoundSource(), 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F); diff --git a/src/main/java/net/minecraft/world/entity/monster/Vex.java b/src/main/java/net/minecraft/world/entity/monster/Vex.java -index 30ea3f64234fd1fda8dada3c7fb12be0730322a8..44fe951f0297c0efa5169c8972c05eaf90d49edf 100644 +index f443006c1e32feee97b32312814e2447a50c45e2..834abf1160034543fe3e89fa1c8d4bb55ffc5dc1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vex.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vex.java @@ -63,6 +63,65 @@ public class Vex extends Monster implements TraceableEntity { @@ -14145,7 +14244,7 @@ index a6af5ac9d09834940d3dd4c80b16450b90484edb..ee9d5933f74584452a1b27a392e7d36d } diff --git a/src/main/java/net/minecraft/world/entity/monster/Witch.java b/src/main/java/net/minecraft/world/entity/monster/Witch.java -index 02386e7eabc6669296ce35158fa35a3c88c6b563..97a6dfe7bb29dcb04a4ec3f082755be90e121548 100644 +index f9ffc5f4cbfdcf5c7351a883d2e5c26492175283..4af36f8d0647f881a842e248d02d747115e1cc70 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Witch.java +++ b/src/main/java/net/minecraft/world/entity/monster/Witch.java @@ -59,6 +59,38 @@ public class Witch extends Raider implements RangedAttackMob { @@ -14839,10 +14938,10 @@ index 83d83e3f84bb6bd58761671c6cd4c8683545ff4c..1422c0f4ff6a3e61f229574cd7b50971 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; @@ -15075,10 +15174,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 b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2fe3617fd7 100644 +index 96ca567af2d8fb2ba39f995be80b935344550124..50202286a0d83f7fe5331eb669d999718a9082cf 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -141,6 +141,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -142,6 +142,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler }, MemoryModuleType.MEETING_POINT, (entityvillager, holder) -> { return holder.is(PoiTypes.MEETING); }); @@ -15087,7 +15186,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f public long nextGolemPanic = -1; // Pufferfish -@@ -155,6 +157,91 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -156,6 +158,91 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.getNavigation().setCanFloat(true); this.setCanPickUpLoot(true); this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); @@ -15179,7 +15278,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f } @Override -@@ -191,7 +278,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -192,7 +279,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler brain.addActivity(Activity.PLAY, VillagerGoalPackages.getPlayPackage(0.5F)); } else { brain.setSchedule(Schedule.VILLAGER_DEFAULT); @@ -15188,7 +15287,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -254,15 +341,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -255,15 +342,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler // Paper start this.customServerAiStep(false); } @@ -15217,7 +15316,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f if (this.assignProfessionWhenSpawned) { this.assignProfessionWhenSpawned = false; } -@@ -318,7 +411,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -319,7 +412,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(); @@ -15226,7 +15325,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f } else { boolean flag = this.getOffers().isEmpty(); -@@ -331,9 +424,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -332,9 +425,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (flag) { @@ -15239,7 +15338,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f this.startTrading(player); } -@@ -502,7 +596,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -503,7 +597,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler while (iterator.hasNext()) { MerchantOffer merchantrecipe = (MerchantOffer) iterator.next(); @@ -15248,7 +15347,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f } } -@@ -752,7 +846,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -753,7 +847,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { @@ -15257,7 +15356,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f } private boolean hungry() { -@@ -945,6 +1039,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -946,6 +1040,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean hasFarmSeeds() { return this.getInventory().hasAnyMatching((itemstack) -> { @@ -15269,7 +15368,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f return itemstack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS); }); } -@@ -1002,6 +1101,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1003,6 +1102,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public void spawnGolemIfNeeded(ServerLevel world, long time, int requiredCount) { @@ -15277,7 +15376,7 @@ index b1fa6e102a694b63f2aa9660b9e6b649bcae9a7d..18f92478f07de7c941ff8bbe0ec2ef2f if (this.wantsToSpawnGolem(time)) { AABB axisalignedbb = this.getBoundingBox().inflate(10.0D, 10.0D, 10.0D); List list = world.getEntitiesOfClass(Villager.class, axisalignedbb); -@@ -1066,6 +1166,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1067,6 +1167,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public void startSleeping(BlockPos pos) { @@ -15304,10 +15403,10 @@ index ac70c2c03241e73943bd517a8c69dd05e0873634..0318663a824d2a9515f867a075d148c3 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. } @@ -15351,7 +15450,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) -> { @@ -15360,7 +15459,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)); @@ -15368,7 +15467,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()) { @@ -15405,10 +15504,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 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372ef67f20d 100644 +index 567704f61034363e48ef2a5b5566ebdc91682297..43199815ffe3d666577390b96187aa898ceb910e 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java -@@ -181,17 +181,40 @@ public abstract class Player extends LivingEntity { +@@ -183,17 +183,40 @@ 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 @@ -15449,7 +15548,7 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 public Player(Level world, BlockPos pos, float yaw, GameProfile gameProfile) { super(EntityType.PLAYER, world); this.lastItemInMainHand = ItemStack.EMPTY; -@@ -236,6 +259,12 @@ public abstract class Player extends LivingEntity { +@@ -238,6 +261,12 @@ public abstract class Player extends LivingEntity { @Override public void tick() { @@ -15462,7 +15561,7 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 this.noPhysics = this.isSpectator(); if (this.isSpectator()) { this.setOnGround(false); -@@ -344,6 +373,16 @@ public abstract class Player extends LivingEntity { +@@ -348,6 +377,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 } @@ -15479,7 +15578,7 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 } protected ItemCooldowns createItemCooldowns() { -@@ -434,7 +473,7 @@ public abstract class Player extends LivingEntity { +@@ -438,7 +477,7 @@ public abstract class Player extends LivingEntity { @Override public int getPortalWaitTime() { @@ -15488,7 +15587,7 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 } @Override -@@ -590,7 +629,7 @@ public abstract class Player extends LivingEntity { +@@ -594,7 +633,7 @@ public abstract class Player extends LivingEntity { while (iterator.hasNext()) { Entity entity = (Entity) iterator.next(); @@ -15497,7 +15596,7 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 list1.add(entity); } else if (!entity.isRemoved()) { this.touch(entity); -@@ -1281,7 +1320,7 @@ public abstract class Player extends LivingEntity { +@@ -1285,7 +1324,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) { @@ -15506,7 +15605,7 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 } f += f1; -@@ -1912,9 +1951,19 @@ public abstract class Player extends LivingEntity { +@@ -1923,9 +1962,19 @@ public abstract class Player extends LivingEntity { @Override public int getExperienceReward() { if (!this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) && !this.isSpectator()) { @@ -15529,7 +15628,7 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 } else { return 0; } -@@ -1990,6 +2039,11 @@ public abstract class Player extends LivingEntity { +@@ -2001,6 +2050,11 @@ public abstract class Player extends LivingEntity { return this.inventory.armor; } @@ -15541,7 +15640,7 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 public boolean setEntityOnShoulder(CompoundTag entityNbt) { if (!this.isPassenger() && this.onGround() && !this.isInWater() && !this.isInPowderSnow) { if (this.getShoulderEntityLeft().isEmpty()) { -@@ -2270,7 +2324,7 @@ public abstract class Player extends LivingEntity { +@@ -2281,7 +2335,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())); @@ -15550,7 +15649,7 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 if (this instanceof ServerPlayer) { CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer) this, stack); } -@@ -2364,6 +2418,7 @@ public abstract class Player extends LivingEntity { +@@ -2375,6 +2429,7 @@ public abstract class Player extends LivingEntity { } public static boolean isValidUsername(String name) { @@ -15559,10 +15658,10 @@ index 44a17a8e763455e834dcf488044a0f4907ce346e..208189cec91b298b5843473f065c5372 if (name == null || name.isEmpty() || name.length() > 16) { return false; 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 d14eab0d83d629a4522bf3f7d789d2853eb84f06..fd1d6c4c3f78b610282318e98ba3742f8bf6e20e 100644 +index e8faca6e443239968f0111519f9e5cd018ed3297..a9289c4179a78862361be87aaa83f49d6bf60714 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; @@ -15570,7 +15669,7 @@ index d14eab0d83d629a4522bf3f7d789d2853eb84f06..fd1d6c4c3f78b610282318e98ba3742f // Spigot Start @Override -@@ -319,7 +320,7 @@ public abstract class AbstractArrow extends Projectile { +@@ -320,7 +321,7 @@ public abstract class AbstractArrow extends Projectile { Vec3 vec3d = this.getDeltaMovement(); this.setDeltaMovement(vec3d.multiply((double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F))); @@ -15579,7 +15678,7 @@ index d14eab0d83d629a4522bf3f7d789d2853eb84f06..fd1d6c4c3f78b610282318e98ba3742f } @Override -@@ -641,6 +642,12 @@ public abstract class AbstractArrow extends Projectile { +@@ -642,6 +643,12 @@ public abstract class AbstractArrow extends Projectile { this.knockback = punch; } @@ -15593,10 +15692,10 @@ index d14eab0d83d629a4522bf3f7d789d2853eb84f06..fd1d6c4c3f78b610282318e98ba3742f 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); @@ -15621,10 +15720,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)); } @@ -15638,9 +15737,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 837f68825f601971f374be47952b23108bf66ba6..422145f30b7c8e11366705cd9b974a5a89ba5e10 100644 +index 837f68825f601971f374be47952b23108bf66ba6..577df1ad8eb57ae7a53c9931c379824a6882fa5f 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +@@ -64,7 +64,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { + if (!isLoaded) { + if (Projectile.loadedThisTick > gg.pufferfish.pufferfish.PufferfishConfig.maxProjectileLoadsPerTick) { + if (++this.loadedLifetime > gg.pufferfish.pufferfish.PufferfishConfig.maxProjectileLoadsPerProjectile) { +- this.discard(); ++ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); // Purpur + } + return; + } @@ -334,7 +334,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner(); @@ -15651,10 +15759,10 @@ index 837f68825f601971f374be47952b23108bf66ba6..422145f30b7c8e11366705cd9b974a5a 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) { @@ -15664,16 +15772,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 @@ -15710,10 +15819,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 af4da25c9b13c114179fab3254aea5323210d7da..59cc9e9a56898c7bdc5474842c31d2fbe6a81897 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()) { @@ -15727,19 +15836,19 @@ index af4da25c9b13c114179fab3254aea5323210d7da..59cc9e9a56898c7bdc5474842c31d2fb this.level().addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); } @@ -86,7 +87,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { + entityplayer.connection.teleport(teleEvent.getTo()); entity.resetFallDistance(); - CraftEventFactory.entityDamage = this; -- entity.hurt(this.damageSources().fall(), 5.0F); -+ entity.hurt(this.damageSources().fall(), this.level().purpurConfig.enderPearlDamage); // Purpur - CraftEventFactory.entityDamage = null; +- entity.hurt(this.damageSources().fall().customCausingEntity(this), 5.0F); // CraftBukkit ++ entity.hurt(this.damageSources().fall().customCausingEntity(this), this.level().purpurConfig.enderPearlDamage); // CraftBukkit // Purpur } // 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); @@ -15749,10 +15858,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 35e76fc8667d9fde5a8fc426699a617fb0a08e4b..beaa7e817fb923b9cb1a9df63ddce3fe9e087061 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); @@ -15761,7 +15870,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 { } @@ -15780,10 +15889,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 226fb5c88dd43c8008c5237299ef80db9e847af7..2da00acac01e333c23f7d155594011dceeb50f64 100644 +index 93bbf7556f9599e9dd90761085a57d78bd521867..b3912881892b4f1bca577761083c5da1568c8187 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() { @@ -16475,10 +16584,10 @@ index 4703f23316f82a1a942907b46d2d6dcb7d70ec37..162798f57a05b78121fa6c4fadf5adee this.activeChest = blockEntity; } diff --git a/src/main/java/net/minecraft/world/item/ArmorItem.java b/src/main/java/net/minecraft/world/item/ArmorItem.java -index 42d87800a328f71c5127ce5599ca4c71cc9bb1cd..7868c2f7b563792f8902d9a77dca46e0dcb82194 100644 +index 6b81be03f87967124b046708557e05d519aa79e4..b47cc957f9e4936b15b80a6f685ddddb5b289298 100644 --- a/src/main/java/net/minecraft/world/item/ArmorItem.java +++ b/src/main/java/net/minecraft/world/item/ArmorItem.java -@@ -61,7 +61,7 @@ public class ArmorItem extends Item implements Equipable { +@@ -67,7 +67,7 @@ public class ArmorItem extends Item implements Equipable { return false; } else { LivingEntity entityliving = (LivingEntity) list.get(0); @@ -16702,7 +16811,7 @@ index 6371f326fc86cfc53e39bf8ed13b646f7705fbbc..3dec0c5fc8dece5341634eaf8e94fe19 return true; diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java -index 06689ee8799079510a1a4e7b68029b9629e318fb..62f291abef664d8bccd682db9de8d0ae6fe2b9bd 100644 +index f3a428f80c265639250114498b10067b4bf1ada1..211d8e59a9b3460b346e5f8cf581df70b05d1b8f 100644 --- a/src/main/java/net/minecraft/world/item/CrossbowItem.java +++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java @@ -64,7 +64,7 @@ public class CrossbowItem extends ProjectileWeaponItem implements Vanishable { @@ -16907,10 +17016,10 @@ index 180aec596110309aade13d2080f8824d152b07cb..552c31c0f3746dd35388395036e70a92 return InteractionResult.PASS; } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index ed27a963223bfe18310ad5adabf461b5e307ef9c..361e0d5ec35219c2706c7344efc25ee6d50a2460 100644 +index 1ad126d992d95062a3db08374db7a927f23a0cac..f6664447c45b1d6f3371af7bed8b1175b17f25e2 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -453,6 +453,7 @@ public final class ItemStack { +@@ -454,6 +454,7 @@ public final class ItemStack { world.preventPoiUpdated = true; // CraftBukkit - SPIGOT-5710 for (BlockState blockstate : blocks) { blockstate.update(true, false); @@ -16918,7 +17027,7 @@ index ed27a963223bfe18310ad5adabf461b5e307ef9c..361e0d5ec35219c2706c7344efc25ee6 } world.preventPoiUpdated = false; -@@ -484,6 +485,7 @@ public final class ItemStack { +@@ -485,6 +486,7 @@ public final class ItemStack { if (!(block.getBlock() instanceof BaseEntityBlock)) { // Containers get placed automatically block.getBlock().onPlace(block, world, newblockposition, oldBlock, true, context); // Paper - pass context } @@ -16926,7 +17035,7 @@ index ed27a963223bfe18310ad5adabf461b5e307ef9c..361e0d5ec35219c2706c7344efc25ee6 world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block, world.getBlockState(newblockposition), updateFlag, 512); // send null chunk as chunk.k() returns false by this point } -@@ -612,6 +614,16 @@ public final class ItemStack { +@@ -613,6 +615,16 @@ public final class ItemStack { return this.isDamageableItem() && this.getDamageValue() > 0; } @@ -16943,7 +17052,7 @@ index ed27a963223bfe18310ad5adabf461b5e307ef9c..361e0d5ec35219c2706c7344efc25ee6 public int getDamageValue() { return this.tag == null ? 0 : this.tag.getInt("Damage"); } -@@ -631,7 +643,7 @@ public final class ItemStack { +@@ -632,7 +644,7 @@ public final class ItemStack { int j; if (amount > 0) { @@ -16952,7 +17061,7 @@ index ed27a963223bfe18310ad5adabf461b5e307ef9c..361e0d5ec35219c2706c7344efc25ee6 int k = 0; for (int l = 0; j > 0 && l < amount; ++l) { -@@ -686,6 +698,12 @@ public final class ItemStack { +@@ -687,6 +699,12 @@ public final class ItemStack { if (this.hurt(amount, entity.getRandom(), entity /*instanceof ServerPlayer ? (ServerPlayer) entity : null*/)) { // Paper - Add EntityDamageItemEvent breakCallback.accept(entity); Item item = this.getItem(); @@ -16965,7 +17074,7 @@ index ed27a963223bfe18310ad5adabf461b5e307ef9c..361e0d5ec35219c2706c7344efc25ee6 // CraftBukkit start - Check for item breaking if (this.count == 1 && entity instanceof net.minecraft.world.entity.player.Player) { org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((net.minecraft.world.entity.player.Player) entity, this); -@@ -1216,7 +1234,7 @@ public final class ItemStack { +@@ -1217,7 +1235,7 @@ public final class ItemStack { ListTag nbttaglist = this.tag.getList("Enchantments", 10); @@ -16974,7 +17083,7 @@ index ed27a963223bfe18310ad5adabf461b5e307ef9c..361e0d5ec35219c2706c7344efc25ee6 processEnchantOrder(this.tag); // Paper } -@@ -1224,6 +1242,12 @@ public final class ItemStack { +@@ -1225,6 +1243,12 @@ public final class ItemStack { return this.tag != null && this.tag.contains("Enchantments", 9) ? !this.tag.getList("Enchantments", 10).isEmpty() : false; } @@ -17083,16 +17192,16 @@ index 3aa73cd44aa8c86b78c35bc1788e4f83018c49ed..66a8b28275619079e3bcbcc460146976 } } diff --git a/src/main/java/net/minecraft/world/item/NameTagItem.java b/src/main/java/net/minecraft/world/item/NameTagItem.java -index d12b3fb8b5e28ba4524d163878be978b1b42d019..f570ad65b746b596479c987f2fdf37d1ae94ab47 100644 +index a0b3c2d3b3f86ecd6cb80ff767839d29ca4f4f68..61b4430d6dd73b5406c4879e41ff80a1b6f67f84 100644 --- a/src/main/java/net/minecraft/world/item/NameTagItem.java +++ b/src/main/java/net/minecraft/world/item/NameTagItem.java @@ -20,6 +20,7 @@ public class NameTagItem extends Item { if (!event.callEvent()) return InteractionResult.PASS; - LivingEntity newEntityLiving = ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getEntity()).getHandle(); - newEntityLiving.setCustomName(event.getName() != null ? io.papermc.paper.adventure.PaperAdventure.asVanilla(event.getName()) : null); + LivingEntity newEntity = ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getEntity()).getHandle(); + newEntity.setCustomName(event.getName() != null ? io.papermc.paper.adventure.PaperAdventure.asVanilla(event.getName()) : null); + if (user.level().purpurConfig.armorstandFixNametags && entity instanceof net.minecraft.world.entity.decoration.ArmorStand) entity.setCustomNameVisible(true); // Purpur - if (event.isPersistent() && newEntityLiving instanceof Mob) { - ((Mob) newEntityLiving).setPersistenceRequired(); + if (event.isPersistent() && newEntity instanceof Mob) { + ((Mob) newEntity).setPersistenceRequired(); // Paper end - Add PlayerNameEntityEvent diff --git a/src/main/java/net/minecraft/world/item/ShovelItem.java b/src/main/java/net/minecraft/world/item/ShovelItem.java index 21212462e6b415e96536a27b2c009d1562f18946..193bcb12152347f5f02ce18b01ba918e5e838f30 100644 @@ -17368,7 +17477,7 @@ index 02feea12c998f37098b72becf6bfaf6b27d155de..9c89a85d934955c9388cfe1361f13e70 public ItemStack assemble() { diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java -index f936f4664584f19bc6720c664035747721ea8231..2c36aca7a4d21a5c8663dc9736bc837cdfe69d72 100644 +index 65c3e91ac4541c0150057dc9f012eb1ee566516e..40c199812ecf7b16fe5a17c18cb0d6d3ce258910 100644 --- a/src/main/java/net/minecraft/world/level/BaseSpawner.java +++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java @@ -57,6 +57,7 @@ public abstract class BaseSpawner { @@ -17393,7 +17502,7 @@ index ed84c87a3f76bc0254c1abb189e6b8b808823465..5bc68b1ef33f297e9a4b1bdd7d69f86a if (range < 0.0D || d < range * range) { return true; diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 28ef910885dbd48965fba6f08cec412697b1b7f0..9c62187b9c716c49db4bb39781df1bfb38db4030 100644 +index b678da2cbb93cea7971bc3c4d324cfca18b0bc97..059e545fd04b7919fb0cc86797b636e3cda61027 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -97,7 +97,7 @@ public class Explosion { @@ -17434,7 +17543,7 @@ index 28ef910885dbd48965fba6f08cec412697b1b7f0..9c62187b9c716c49db4bb39781df1bfb this.level.gameEvent(this.source, GameEvent.EXPLODE, new Vec3(this.x, this.y, this.z)); Set set = Sets.newHashSet(); boolean flag = true; -@@ -659,7 +676,7 @@ public class Explosion { +@@ -675,7 +692,7 @@ public class Explosion { } if (flag1) { @@ -17443,7 +17552,7 @@ index 28ef910885dbd48965fba6f08cec412697b1b7f0..9c62187b9c716c49db4bb39781df1bfb List> list = new ArrayList(); Util.shuffle(this.toBlow, this.level.random); -@@ -735,7 +752,7 @@ public class Explosion { +@@ -751,7 +768,7 @@ public class Explosion { Block.popResource(this.level, (BlockPos) pair.getSecond(), (ItemStack) pair.getFirst()); } @@ -17453,10 +17562,10 @@ index 28ef910885dbd48965fba6f08cec412697b1b7f0..9c62187b9c716c49db4bb39781df1bfb if (this.fire) { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0894f7896 100644 +index 506100b02e7e9a3eabfde6b1f93858c4cc048524..67a26f22d4eb7eaeee7900e6f4de421d0bfd5612 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -178,6 +178,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -173,6 +173,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { // Paper end - add paper world config public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray @@ -17464,7 +17573,7 @@ index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0 public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; -@@ -195,6 +196,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -190,6 +191,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } // Paper end - fix and optimise world upgrading @@ -17514,7 +17623,7 @@ index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0 public CraftWorld getWorld() { return this.world; } -@@ -212,11 +256,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -207,11 +251,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public abstract ResourceKey getTypeKey(); @@ -17529,7 +17638,7 @@ index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0 this.generator = gen; this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); -@@ -1268,18 +1314,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1259,18 +1305,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } protected void tickBlockEntities() { @@ -17553,7 +17662,7 @@ index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0 // Spigot start // Iterator iterator = this.blockEntityTickers.iterator(); boolean flag = this.tickRateManager().runsNormally(); -@@ -1308,10 +1354,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1299,10 +1345,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } this.blockEntityTickers.removeAll(toRemove); // Paper - Fix MC-117075 @@ -17566,7 +17675,7 @@ index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0 this.spigotConfig.currentPrimedTnt = 0; // Spigot } -@@ -1521,7 +1567,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1512,7 +1558,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Override public List getEntities(@Nullable Entity except, AABB box, Predicate predicate) { @@ -17575,7 +17684,7 @@ index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0 List list = Lists.newArrayList(); ((ServerLevel)this).getEntityLookup().getEntities(except, box, list, predicate); // Paper - optimise this call return list; -@@ -1540,7 +1586,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1531,7 +1577,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public void getEntities(EntityTypeTest filter, AABB box, Predicate predicate, List result, int limit) { @@ -17584,7 +17693,7 @@ index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0 // Paper start - optimise this call //TODO use limit if (filter instanceof net.minecraft.world.entity.EntityType entityTypeTest) { -@@ -1799,7 +1845,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1790,7 +1836,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public ProfilerFiller getProfiler() { @@ -17593,7 +17702,7 @@ index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0 return (ProfilerFiller) this.profiler.get(); } -@@ -1909,4 +1955,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1900,4 +1946,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { return null; } // Paper end - optimize redstone (Alternate Current) @@ -17608,7 +17717,7 @@ index 763fe7d1e8334441a5db2285bd4424d165e1c945..4779fd92a88c3d485ab3282ab63158f0 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 96fc603c2fccc1d9610248b2116d35696bc65e4e..4d9e831f08cd3ed3765560964e88a412962a760b 100644 +index 661acdf4b1f33d150b0caf179e925d3162d7be35..a2026900948e9157cb35ba0183dc3af20c63214f 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -132,8 +132,8 @@ public final class NaturalSpawner { @@ -17739,7 +17848,7 @@ index 2a65c7b859b1126dbac9819a01ca2652e20498a9..3192edee23b899107b17e354ddfb3159 return true; } else { diff --git a/src/main/java/net/minecraft/world/level/block/BedBlock.java b/src/main/java/net/minecraft/world/level/block/BedBlock.java -index 8677dc684bd2e0bb3cf5f77b659ce02b79627e76..59438af88fd7e83cc9a878d43084f954f030607d 100644 +index 38fcde81d797dc46409f5a9ed426fe296d79bdfa..83fa72b5a8fde431e7035fe5cacc50e33ae506bf 100644 --- a/src/main/java/net/minecraft/world/level/block/BedBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BedBlock.java @@ -106,7 +106,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock @@ -17783,7 +17892,7 @@ index 0d92bd6f1e4f3470a62f573add3490220e60ef7a..2e89b22de852f43f2694be52043799f0 if (i != -1) { world.scheduleTick(blockposition, (Block) this, i); diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java -index 73d6f881a7d4d8ff96040d34ac502e5b0937d577..d807bba62ff10aa3c491fc8e47dfa131ae19298e 100644 +index 22036ed3ea0629bc12981a8d91a03e55cc2117d6..284149925440f413d23a9ec3ce704e70a74f4c08 100644 --- a/src/main/java/net/minecraft/world/level/block/Block.java +++ b/src/main/java/net/minecraft/world/level/block/Block.java @@ -63,6 +63,13 @@ import net.minecraft.world.phys.shapes.Shapes; @@ -17820,16 +17929,16 @@ index 73d6f881a7d4d8ff96040d34ac502e5b0937d577..d807bba62ff10aa3c491fc8e47dfa131 }); state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true); } -@@ -338,7 +349,7 @@ public class Block extends BlockBehaviour implements ItemLike { - event.setExpToDrop(block.getExpDrop(state, (ServerLevel) world, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping +@@ -339,7 +350,7 @@ public class Block extends BlockBehaviour implements ItemLike { + event.setExpToDrop(block.getExpDrop(state, serverLevel, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping event.callEvent(); - for (var drop : event.getDrops()) { -- popResource(world.getMinecraftWorld(), pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop)); -+ popResource(world.getMinecraftWorld(), pos, applyDisplayNameAndLoreFromTile(org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop), blockEntity)); // Purpur + for (org.bukkit.inventory.ItemStack drop : event.getDrops()) { +- popResource(serverLevel, pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop)); ++ popResource(serverLevel, pos, applyDisplayNameAndLoreFromTile(org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop), blockEntity)); // Purpur } - state.spawnAfterBreak(world.getMinecraftWorld(), pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping - block.popExperience((ServerLevel) world, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping -@@ -355,13 +366,53 @@ public class Block extends BlockBehaviour implements ItemLike { + state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping + block.popExperience(serverLevel, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping +@@ -356,13 +367,53 @@ public class Block extends BlockBehaviour implements ItemLike { // Paper end - Properly handle xp dropping if (world instanceof ServerLevel) { Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, tool).forEach((itemstack1) -> { @@ -17884,7 +17993,7 @@ index 73d6f881a7d4d8ff96040d34ac502e5b0937d577..d807bba62ff10aa3c491fc8e47dfa131 public static void popResource(Level world, BlockPos pos, ItemStack stack) { double d0 = (double) EntityType.ITEM.getHeight() / 2.0D; double d1 = (double) pos.getX() + 0.5D + Mth.nextDouble(world.random, -0.25D, 0.25D); -@@ -445,7 +496,17 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -446,7 +497,17 @@ public class Block extends BlockBehaviour implements ItemLike { } // Paper - fix drops not preventing stats/food exhaustion } @@ -17903,7 +18012,7 @@ index 73d6f881a7d4d8ff96040d34ac502e5b0937d577..d807bba62ff10aa3c491fc8e47dfa131 public boolean isPossibleToRespawnInThis(BlockState state) { return !state.isSolid() && !state.liquid(); -@@ -464,7 +525,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -465,7 +526,7 @@ public class Block extends BlockBehaviour implements ItemLike { } public void fallOn(Level world, BlockState state, BlockPos pos, Entity entity, float fallDistance) { @@ -17966,7 +18075,7 @@ index bed3d9c781c7d3ca260027b4737970889a54689c..db1941ed32d141327a8b11e54b3ff990 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -index c5a0cefc6b7e19d8a277dbc59e54f465a994a858..a9bab8914ef9b1d329eac87775a9c503ab4e3819 100644 +index ba4aaf850af36a84517c70581e141157c4f15b99..02ea708a5b5df9f753194cdc9312fc830af85c68 100644 --- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java @@ -23,7 +23,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; @@ -17987,7 +18096,7 @@ index c5a0cefc6b7e19d8a277dbc59e54f465a994a858..a9bab8914ef9b1d329eac87775a9c503 return false; } -@@ -136,4 +136,34 @@ public class CactusBlock extends Block { +@@ -134,4 +134,34 @@ public class CactusBlock extends Block { public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } @@ -18023,10 +18132,10 @@ index c5a0cefc6b7e19d8a277dbc59e54f465a994a858..a9bab8914ef9b1d329eac87775a9c503 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/CampfireBlock.java b/src/main/java/net/minecraft/world/level/block/CampfireBlock.java -index 20dbfeb68ac33ee8ba8214edcca0d7f7ce1be58e..7496da8b914fbf540bfb1c5800ddda1d6ec66f4e 100644 +index 9c7ee02d3aa3c33b45db4dc5c079495a69d60b15..5eed401d3d722c6553240aba4a8e2337ee32b263 100644 --- a/src/main/java/net/minecraft/world/level/block/CampfireBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CampfireBlock.java -@@ -138,7 +138,7 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB +@@ -133,7 +133,7 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB BlockPos blockposition = ctx.getClickedPos(); boolean flag = world.getFluidState(blockposition).getType() == Fluids.WATER; @@ -18129,7 +18238,7 @@ index 305bce4d833116cc21e64fdcdfe13f03e94ff4ba..58838f3c443f80eb53c33f8aa7646452 return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); diff --git a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -index d78fe4081bc2938326066e0afddb4a6c833a4bf7..70fbe678b27656f07b1048ab9ddfd755a64e0328 100644 +index f9084e2605d7403721fe6b714bfad051f932aaef..47b7baa41f341087bcd5dfec1d2a13b96f8357ca 100644 --- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java @@ -236,20 +236,28 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { @@ -18591,7 +18700,7 @@ index 9b3dcf1a4d4cece92a629506d341f6bfe79d13d0..0ed39daf88a98f7fa887fb45d4f7c034 } diff --git a/src/main/java/net/minecraft/world/level/block/MagmaBlock.java b/src/main/java/net/minecraft/world/level/block/MagmaBlock.java -index 10f5ffacc72a5e0116e2599ca83ee57a5b1ce0eb..31e6468f639de3ed0b25c3bc4ee09333c2150e1b 100644 +index 746c211b575ca588deadbbcd5c55b614e8660ba8..2f38bac9efc224084505e802546623260830b6d4 100644 --- a/src/main/java/net/minecraft/world/level/block/MagmaBlock.java +++ b/src/main/java/net/minecraft/world/level/block/MagmaBlock.java @@ -29,7 +29,7 @@ public class MagmaBlock extends Block { @@ -18600,9 +18709,9 @@ index 10f5ffacc72a5e0116e2599ca83ee57a5b1ce0eb..31e6468f639de3ed0b25c3bc4ee09333 public void stepOn(Level world, BlockPos pos, BlockState state, Entity entity) { - if (!entity.isSteppingCarefully() && entity instanceof LivingEntity && !EnchantmentHelper.hasFrostWalker((LivingEntity) entity)) { + if ((!entity.isSteppingCarefully() || world.purpurConfig.magmaBlockDamageWhenSneaking) && entity instanceof LivingEntity && (world.purpurConfig.magmaBlockDamageWithFrostWalker || !EnchantmentHelper.hasFrostWalker((LivingEntity) entity))) { // Purpur - org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); // CraftBukkit - entity.hurt(world.damageSources().hotFloor(), 1.0F); - org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; // CraftBukkit + entity.hurt(world.damageSources().hotFloor().directBlock(world, pos), 1.0F); // CraftBukkit + } + diff --git a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java index 1b5cc5d6aa0b4313da980ce175c54145852d0db0..f7b724696151b73343feac1ce406fca9377f2508 100644 --- a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java @@ -18703,10 +18812,10 @@ index 713352b68f82d4c4a19a712d5207de0f99456713..d056e80c98973e9ba64adc5a8554acc8 } diff --git a/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java b/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java -index e310abaca79615caaa75d92183a57242734266a3..05718dcb69ea3632914b4183bfc38964c4813e55 100644 +index 5835872df922b859a31b44e3723c67097f21a641..ecb595ddf21b593175c27d59fd9587e7f2d56517 100644 --- a/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java +++ b/src/main/java/net/minecraft/world/level/block/PointedDripstoneBlock.java -@@ -195,7 +195,7 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate +@@ -189,7 +189,7 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate @VisibleForTesting public static void maybeTransferFluid(BlockState state, ServerLevel world, BlockPos pos, float dripChance) { @@ -18715,7 +18824,7 @@ index e310abaca79615caaa75d92183a57242734266a3..05718dcb69ea3632914b4183bfc38964 if (PointedDripstoneBlock.isStalactiteStartPos(state, world, pos)) { Optional optional = PointedDripstoneBlock.getFluidAboveStalactite(world, pos, state); -@@ -204,13 +204,13 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate +@@ -198,13 +198,13 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate float f1; if (fluidtype == Fluids.WATER) { @@ -18937,10 +19046,10 @@ index 8f3cca228f8ec1ea9379fa43af4baa7b18012dd2..7e87b4299979c9e46abb582da7a8e54a if (!iblockdata.is(Blocks.KELP) && !iblockdata.is(Blocks.KELP_PLANT) && !iblockdata.is(Blocks.SEAGRASS) && !iblockdata.is(Blocks.TALL_SEAGRASS)) { return false; diff --git a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java -index 77ae7b8ab24935d046cce1f8f7f476310876f9df..b683f3c2fcd37b17a732802738cd14be87065e54 100644 +index 77ae7b8ab24935d046cce1f8f7f476310876f9df..579abfbe791052507b15c14d8c81e39b2fdd6520 100644 --- a/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/StonecutterBlock.java -@@ -99,4 +99,16 @@ public class StonecutterBlock extends Block { +@@ -99,4 +99,14 @@ public class StonecutterBlock extends Block { public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } @@ -18949,16 +19058,14 @@ index 77ae7b8ab24935d046cce1f8f7f476310876f9df..b683f3c2fcd37b17a732802738cd14be + @Override + public void stepOn(Level level, BlockPos pos, BlockState state, net.minecraft.world.entity.Entity entity) { + if (level.purpurConfig.stonecutterDamage > 0.0F && entity instanceof net.minecraft.world.entity.LivingEntity) { -+ org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); -+ entity.hurt(entity.damageSources().stonecutter(), level.purpurConfig.stonecutterDamage); -+ org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; ++ entity.hurt(entity.damageSources().stonecutter().directBlock(level, pos), level.purpurConfig.stonecutterDamage); + } + super.stepOn(level, pos, state, entity); + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java -index e4a9ddf77d36f2d6df55c666c16677adb2e4fbe7..ee6ff90ab06d9d681e0e182327d64626eebbe7c9 100644 +index 04957d461d0e968d443737068aaeec1d0bce78b2..7a283fbe4663cb321739f8e42ade4039d84e462b 100644 --- a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java @@ -20,7 +20,7 @@ import net.minecraft.world.level.material.FluidState; @@ -19096,7 +19203,7 @@ index fb180f0bcd20e51d41cfc924029c0b23d3d26258..688d161cd6725f494366c23668ebd6ff if (!world.addFreshEntity(entitywither, SpawnReason.BUILD_WITHER)) { return; diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index d04fc84eef11adb5ea64077f48794b6ed7fb3ada..1d179e9485df78657ce67ab7ca4c4b1bcaf6c4ea 100644 +index 89d06253b00604114e543ebbe12a9993ae95dc41..5a3a619c4b936a4d186c0593f5af7b2493b85825 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java @@ -44,6 +44,7 @@ import net.minecraft.world.level.Level; @@ -19130,7 +19237,7 @@ index d04fc84eef11adb5ea64077f48794b6ed7fb3ada..1d179e9485df78657ce67ab7ca4c4b1b // CraftBukkit start - add fields and methods private int maxStack = MAX_STACK; public List transaction = new java.util.ArrayList(); -@@ -325,6 +342,21 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit +@@ -330,6 +347,21 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit } ItemStack itemstack = (ItemStack) blockEntity.items.get(1); @@ -19152,7 +19259,7 @@ index d04fc84eef11adb5ea64077f48794b6ed7fb3ada..1d179e9485df78657ce67ab7ca4c4b1b boolean flag2 = !((ItemStack) blockEntity.items.get(0)).isEmpty(); boolean flag3 = !itemstack.isEmpty(); -@@ -410,6 +442,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit +@@ -415,6 +447,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit setChanged(world, pos, state); } @@ -19219,7 +19326,7 @@ index 416aa989ebb18a8741cc9d605a1180ab830f6643..e38a0adf5463c48311ad08b8d2e5b5c2 @Override diff --git a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -index bfcf9e0c342f255d285b1ef7f88d71efed653ecd..1bf9dd1da1b448fb6a20105edc499f67b7a476e6 100644 +index 4b81b0180dfc96fc6a88646838a886ca5b5d301b..428773361d12ecbcf3a6bf790aedfe12a384f511 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BeaconBlockEntity.java @@ -88,6 +88,16 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name @@ -19267,10 +19374,10 @@ index bfcf9e0c342f255d285b1ef7f88d71efed653ecd..1bf9dd1da1b448fb6a20105edc499f67 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; @@ -19279,7 +19386,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; } @@ -19302,7 +19409,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(); } @@ -19315,7 +19422,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) { @@ -19324,7 +19431,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() {} } @@ -19429,10 +19536,10 @@ index 9ea74d37cd951e0dc76d20ed8234b5871035566c..e9701ed4e5b35ace1accd2b46f082191 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/block/entity/ConduitBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ConduitBlockEntity.java -index 963a596154091b79ca139af6274aa323518ad1ad..4dcac3899a500d8586580bcfd5b4516e1dcdcd4a 100644 +index 37e0b762b86e74f607a4541ecb7b24ad7a591d0e..7e3edd41f3a39ef14382e18b20af21e63ce0677b 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/ConduitBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/ConduitBlockEntity.java -@@ -171,7 +171,7 @@ public class ConduitBlockEntity extends BlockEntity { +@@ -167,7 +167,7 @@ public class ConduitBlockEntity extends BlockEntity { if ((l > 1 || i1 > 1 || j1 > 1) && (i == 0 && (i1 == 2 || j1 == 2) || j == 0 && (l == 2 || j1 == 2) || k == 0 && (l == 2 || i1 == 2))) { BlockPos blockposition2 = pos.offset(i, j, k); BlockState iblockdata = world.getBlockState(blockposition2); @@ -19441,16 +19548,16 @@ index 963a596154091b79ca139af6274aa323518ad1ad..4dcac3899a500d8586580bcfd5b4516e int k1 = ablock.length; for (int l1 = 0; l1 < k1; ++l1) { -@@ -191,7 +191,7 @@ public class ConduitBlockEntity extends BlockEntity { +@@ -187,7 +187,7 @@ public class ConduitBlockEntity extends BlockEntity { private static void applyEffects(Level world, BlockPos pos, List activatingBlocks) { int i = activatingBlocks.size(); -- int j = i / 7 * 16; -+ int j = i / 7 * world.purpurConfig.conduitDistance; // Purpur +- int j = i / 7 * 16; // Paper - Conduit API; diff on change ++ int j = i / 7 * world.purpurConfig.conduitDistance; // Paper - Conduit API; diff on change // Purpur int k = pos.getX(); int l = pos.getY(); int i1 = pos.getZ(); -@@ -222,21 +222,21 @@ public class ConduitBlockEntity extends BlockEntity { +@@ -218,20 +218,20 @@ public class ConduitBlockEntity extends BlockEntity { blockEntity.destroyTarget = ConduitBlockEntity.findDestroyTarget(world, pos, blockEntity.destroyTargetUUID); blockEntity.destroyTargetUUID = null; } else if (blockEntity.destroyTarget == null) { @@ -19469,13 +19576,12 @@ index 963a596154091b79ca139af6274aa323518ad1ad..4dcac3899a500d8586580bcfd5b4516e if (blockEntity.destroyTarget != null) { // CraftBukkit start - CraftEventFactory.blockDamage = CraftBlock.at(world, pos); -- if (blockEntity.destroyTarget.hurt(world.damageSources().magic(), 4.0F)) { -+ if (blockEntity.destroyTarget.hurt(world.damageSources().magic(), world.purpurConfig.conduitDamageAmount)) { // Purpur - world.playSound((Player) null, blockEntity.destroyTarget.getX(), blockEntity.destroyTarget.getY(), blockEntity.destroyTarget.getZ(), SoundEvents.CONDUIT_ATTACK_TARGET, SoundSource.BLOCKS, 1.0F, 1.0F); +- if (blockEntity.destroyTarget.hurt(world.damageSources().magic().directBlock(world, pos), 4.0F)) { // CraftBukkit ++ if (blockEntity.destroyTarget.hurt(world.damageSources().magic().directBlock(world, pos), world.purpurConfig.conduitDamageAmount)) { // CraftBukkit // Purpur + world.playSound(null, blockEntity.destroyTarget.getX(), blockEntity.destroyTarget.getY(), blockEntity.destroyTarget.getZ(), SoundEvents.CONDUIT_ATTACK_TARGET, SoundSource.BLOCKS, 1.0F, 1.0F); } - CraftEventFactory.blockDamage = null; -@@ -262,16 +262,22 @@ public class ConduitBlockEntity extends BlockEntity { + // CraftBukkit end +@@ -256,16 +256,22 @@ public class ConduitBlockEntity extends BlockEntity { } private static AABB getDestroyRangeAABB(BlockPos pos) { @@ -19544,7 +19650,7 @@ index 65e1381bb2d10bd212463feb602c60f8fdb9ade1..b7370e64fd0d50e8725d7d5afc30af2e + // Purpur } diff --git a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java -index 979a8f472f866130a3abb10f535df757eaa50c20..dbe5d7394ef9db7195cb3d8f8f77ce47e9fbf323 100644 +index 927c7ea03560be0c86884cec70ee8e408e66cb07..93764bf849ad8e427bf119f6ff3dbcbcc4c2415e 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java @@ -200,16 +200,31 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C @@ -19611,10 +19717,10 @@ index 979a8f472f866130a3abb10f535df757eaa50c20..dbe5d7394ef9db7195cb3d8f8f77ce47 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 d0e8842a2c4f7dbd0d6ac3694b2a6a5395d8a542..c3d25a26883f7cbe7106c2f3415af0b18f534ee2 100644 +index 54f7bdd0e003ed170d739593199a2bb8ff0bbd68..1b150b9fc444a248f6c01572447c7bb8eecfc76e 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 -@@ -177,6 +177,15 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { +@@ -178,6 +178,15 @@ 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()) { @@ -19662,10 +19768,10 @@ index 744d91546d1a810f60a43c15ed74b4158f341a4a..354538daefa603f6df5a139b6bff87db } diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -index 97a9fbbe6d8435e88e5fe716770e4034ab0db7a7..5607f3ed88270bee4c8f0901b561ff03ca96d500 100644 +index 2892e586146cbc560f0bcf4b9af6d0575cb0a82e..d38d8fc7ef22fb68e867cc29dab1171c9aa6ac35 100644 --- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -85,7 +85,7 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -84,7 +84,7 @@ public abstract class BlockBehaviour implements FeatureElement { protected static final Direction[] UPDATE_SHAPE_ORDER = new Direction[]{Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.DOWN, Direction.UP}; public final boolean hasCollision; @@ -19674,7 +19780,7 @@ index 97a9fbbe6d8435e88e5fe716770e4034ab0db7a7..5607f3ed88270bee4c8f0901b561ff03 protected final boolean isRandomlyTicking; protected final SoundType soundType; protected final float friction; -@@ -93,7 +93,7 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -92,7 +92,7 @@ public abstract class BlockBehaviour implements FeatureElement { protected final float jumpFactor; protected final boolean dynamicShape; protected final FeatureFlagSet requiredFeatures; @@ -19926,10 +20032,10 @@ index 70c7c735fdd0c1b66243915622e47eab8a57e7cc..996bd26e95e766ce4ca7e61d060881fe return BlockPathTypes.STICKY_HONEY; } else if (blockState.is(Blocks.COCOA)) { diff --git a/src/main/java/net/minecraft/world/level/portal/PortalShape.java b/src/main/java/net/minecraft/world/level/portal/PortalShape.java -index 39321dd4e60be218cb839a89f6cdf32702b72939..913f598e9c75d39adb8f557ff5c184b7450e06ad 100644 +index 912cee9ec45876f831ca230b59a1be3b48ce6aa5..46910a3bdacc9df1835e16b300f9e107744d2660 100644 --- a/src/main/java/net/minecraft/world/level/portal/PortalShape.java +++ b/src/main/java/net/minecraft/world/level/portal/PortalShape.java -@@ -34,7 +34,7 @@ public class PortalShape { +@@ -33,7 +33,7 @@ public class PortalShape { private static final int MIN_HEIGHT = 3; public static final int MAX_HEIGHT = 21; private static final BlockBehaviour.StatePredicate FRAME = (iblockdata, iblockaccess, blockposition) -> { @@ -20017,10 +20123,52 @@ index 1d7c663fa0e550bd0cfb9a4b83ccd7e2968666f0..0043c0087896a6df6910b0500da37d84 this.rescheduleLeftoverContainers(); } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java -index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..91fbc0cfc84045e32a4ee16fba8164de7901c7e6 100644 +index 4a875bce9563f3b9351ebecde9b0eb1287beb50e..42d83cfd9318d6ebe9a5392edef3b667c9e4dac0 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java -@@ -567,4 +567,213 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa +@@ -335,14 +335,26 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa + + @Override + public Location getLocation() { ++ // Purpur start ++ if (this.isOnline()) { ++ return this.getPlayer().getLocation(); ++ } ++ // Purpur end ++ + CompoundTag data = this.getData(); + if (data == null) { + return null; + } + +- if (data.contains("Pos") && data.contains("Rotation")) { +- ListTag position = (ListTag) data.get("Pos"); +- ListTag rotation = (ListTag) data.get("Rotation"); ++ // Purpur start - OfflinePlayer API ++ //if (data.contains("Pos") && data.contains("Rotation")) { ++ ListTag position = data.getList("Pos", net.minecraft.nbt.Tag.TAG_DOUBLE); ++ ListTag rotation = data.getList("Rotation", net.minecraft.nbt.Tag.TAG_FLOAT); ++ ++ if (position.isEmpty() && rotation.isEmpty()) { ++ return null; ++ } ++ // Purpur end - OfflinePlayer API + + UUID uuid = new UUID(data.getLong("WorldUUIDMost"), data.getLong("WorldUUIDLeast")); + +@@ -353,9 +365,9 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa + rotation.getFloat(0), + rotation.getFloat(1) + ); +- } ++ //} // Purpur - OfflinePlayer API + +- return null; ++ //return null; // Purpur - OfflinePlayer API + } + + @Override +@@ -598,4 +610,191 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa manager.save(); } } @@ -20141,28 +20289,6 @@ index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..91fbc0cfc84045e32a4ee16fba8164de + } + + @Override -+ public Location getLocation() { -+ if (this.isOnline()) { -+ return this.getPlayer().getLocation(); -+ } else { -+ CompoundTag data = this.getData(); -+ if (data == null) return null; -+ long worldUUIDMost = data.getLong("WorldUUIDMost"); -+ long worldUUIDLeast = data.getLong("WorldUUIDLeast"); -+ net.minecraft.nbt.ListTag position = data.getList("Pos", org.bukkit.craftbukkit.util.CraftMagicNumbers.NBT.TAG_DOUBLE); -+ net.minecraft.nbt.ListTag rotation = data.getList("Rotation", org.bukkit.craftbukkit.util.CraftMagicNumbers.NBT.TAG_FLOAT); -+ UUID worldUuid = new UUID(worldUUIDMost, worldUUIDLeast); -+ org.bukkit.World world = server.getWorld(worldUuid); -+ double x = position.getDouble(0); -+ double y = position.getDouble(1); -+ double z = position.getDouble(2); -+ float yaw = rotation.getFloat(0); -+ float pitch = rotation.getFloat(1); -+ return new Location(world, x, y, z, yaw, pitch); -+ } -+ } -+ -+ @Override + public boolean teleportOffline(Location destination) { + if (this.isOnline()) { + return this.getPlayer().teleport(destination); @@ -20235,10 +20361,10 @@ index 2bbc39c257965ad91ee360cdfcd3538a0f041c7e..91fbc0cfc84045e32a4ee16fba8164de + // 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 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f98d1ab37a 100644 +index 9f5a6398a7dca841570a895054cee969dc96bca4..0a5867b01c1ebf21d9add1d4a2843d15b8e1acb7 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -264,7 +264,7 @@ import javax.annotation.Nullable; // Paper +@@ -266,7 +266,7 @@ import javax.annotation.Nullable; // Paper import javax.annotation.Nonnull; // Paper public final class CraftServer implements Server { @@ -20247,7 +20373,7 @@ index 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f9 private final String serverVersion; private final String bukkitVersion = Versioning.getBukkitVersion(); private final Logger logger = Logger.getLogger("Minecraft"); -@@ -398,6 +398,20 @@ public final class CraftServer implements Server { +@@ -400,6 +400,20 @@ public final class CraftServer implements Server { this.serverTickManager = new CraftServerTickManager(console.tickRateManager()); Bukkit.setServer(this); @@ -20268,7 +20394,7 @@ index 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f9 CraftRegistry.setMinecraftRegistry(console.registryAccess()); -@@ -1037,6 +1051,7 @@ public final class CraftServer implements Server { +@@ -1054,6 +1068,7 @@ public final class CraftServer implements Server { org.spigotmc.SpigotConfig.init((File) this.console.options.valueOf("spigot-settings")); // Spigot this.console.paperConfigurations.reloadConfigs(this.console); @@ -20276,7 +20402,7 @@ index 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f9 for (ServerLevel world : this.console.getAllLevels()) { // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters, config.spawnAnimals); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) -@@ -1052,6 +1067,7 @@ public final class CraftServer implements Server { +@@ -1069,6 +1084,7 @@ public final class CraftServer implements Server { } } world.spigotConfig.init(); // Spigot @@ -20284,7 +20410,7 @@ index 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f9 } Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper -@@ -1067,6 +1083,7 @@ public final class CraftServer implements Server { +@@ -1084,6 +1100,7 @@ public final class CraftServer implements Server { this.reloadData(); org.spigotmc.SpigotConfig.registerCommands(); // Spigot io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper @@ -20292,7 +20418,7 @@ index 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f9 this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -1569,6 +1586,55 @@ public final class CraftServer implements Server { +@@ -1586,6 +1603,55 @@ public final class CraftServer implements Server { return true; } @@ -20348,7 +20474,7 @@ index 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f9 @Override public List getRecipesFor(ItemStack result) { Preconditions.checkArgument(result != null, "ItemStack cannot be null"); -@@ -3003,6 +3069,18 @@ public final class CraftServer implements Server { +@@ -3018,6 +3084,18 @@ public final class CraftServer implements Server { return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console); } @@ -20367,7 +20493,7 @@ index 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f9 @Override public void restart() { org.spigotmc.RestartCommand.restart(); -@@ -3032,6 +3110,7 @@ public final class CraftServer implements Server { +@@ -3047,6 +3125,7 @@ public final class CraftServer implements Server { @Override public double[] getTPS() { return new double[] { @@ -20375,7 +20501,7 @@ index 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f9 net.minecraft.server.MinecraftServer.getServer().tps1.getAverage(), net.minecraft.server.MinecraftServer.getServer().tps5.getAverage(), net.minecraft.server.MinecraftServer.getServer().tps15.getAverage() -@@ -3234,4 +3313,16 @@ public final class CraftServer implements Server { +@@ -3249,4 +3328,16 @@ public final class CraftServer implements Server { } // Paper end @@ -20393,10 +20519,10 @@ index 5b01cd1b9a07fc8600fddb9d9e0aea3ac5a288f0..7db5fb71e8ffdc9291eadceb2682f7f9 + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index a139601888b88e8580bdb9c2469386a94abae975..9f2d1e3bc19ef541550e4d088343d10ea641cd23 100644 +index bfb178c69026e9759e9afaebb9da141b62d1f144..69f0c853ed7287c5a93b0a67e266255090e2a9ca 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2375,6 +2375,48 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2388,6 +2388,48 @@ public class CraftWorld extends CraftRegionAccessor implements World { return (this.getHandle().getDragonFight() == null) ? null : new CraftDragonBattle(this.getHandle().getDragonFight()); } @@ -20443,8 +20569,8 @@ index a139601888b88e8580bdb9c2469386a94abae975..9f2d1e3bc19ef541550e4d088343d10e + // Purpur end + @Override - public PersistentDataContainer getPersistentDataContainer() { - return this.persistentDataContainer; + public Collection getStructures(int x, int z) { + return this.getStructures(x, z, struct -> true); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java index ce341f42b3a5e17fb6d1f7de8057e73137ae2a6e..146f229b8e8888e2c0256c007c71c675c27e71a5 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java @@ -20564,6 +20690,19 @@ index 2e51fab98d95c93d2095f7be6dbb5d5474158bfb..32285c8e0f42897793759fba85a1e865 } // Paper end } +diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java b/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java +index f0b0348e105fb27c829ec29e638433c57bfd5f64..57ce4b7c5fcfe7a88928cd4124f29af39e117ed9 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java +@@ -29,7 +29,7 @@ public class CraftConduit extends CraftBlockEntityState impl + @Override + public int getRange() { + requirePlaced(); +- return this.getTileEntity().effectBlocks.size() / 7 * 16; ++ return this.getTileEntity().effectBlocks.size() / 7 * this.world.getHandle().purpurConfig.conduitDistance; // Purpur + } + + @Override diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java index 4e56018b64d11f76c8da43fd8f85c6de72204e36..9607675e6c5bff2183c4420d11fc63eeb5747fb6 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java @@ -20592,10 +20731,10 @@ index 4e56018b64d11f76c8da43fd8f85c6de72204e36..9607675e6c5bff2183c4420d11fc63ee @Override diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java -index 92465b2a9f1483be76004c9f80a1fe15913b3b8b..593e7fc97559e18df13bece888616d03bd534971 100644 +index 5b7579395e61684592758f408d61cffe57f8b21d..015ea2ecac493c88f45d6ad66c2ef346252b4ec8 100644 --- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java -@@ -80,6 +80,8 @@ public class CraftEnchantment extends Enchantment { +@@ -71,6 +71,8 @@ public class CraftEnchantment extends Enchantment implements Handleable EnchantmentTarget.TRIDENT; case CROSSBOW -> EnchantmentTarget.CROSSBOW; case VANISHABLE -> EnchantmentTarget.VANISHABLE; @@ -20624,10 +20763,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..aa6872290bcab8d7dc58f5714f5f5d4289759880 100644 +index 0b5a31477e3b76833fb97a455842316193663c8e..50364ab478ae5ec016fc2318483920e2e849b8ba 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -83,6 +83,21 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -84,6 +84,21 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { this.entityType = CraftEntityType.minecraftToBukkit(entity.getType()); } @@ -20649,7 +20788,7 @@ index 8698104e3eb98e2cc5da5de87a8f538860c1d91d..aa6872290bcab8d7dc58f5714f5f5d42 public static CraftEntity getEntity(CraftServer server, T entity) { Preconditions.checkArgument(entity != null, "Unknown entity"); -@@ -252,6 +267,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -253,6 +268,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { // Paper end if ((!ignorePassengers && this.entity.isVehicle()) || this.entity.isRemoved()) { // Paper - Teleport passenger API @@ -20660,7 +20799,7 @@ index 8698104e3eb98e2cc5da5de87a8f538860c1d91d..aa6872290bcab8d7dc58f5714f5f5d42 return false; } -@@ -1227,4 +1246,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -1228,4 +1247,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return this.getHandle().getScoreboardName(); } // Paper end - entity scoreboard name @@ -20723,7 +20862,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..480adbfdd084a6291ee0108e5350ea418e08ff6f 100644 +index 30d62ee4d5cd2ddacb8783b5bbbf475d592b3e02..5c1cda88080850314dac196dbe71ff12e48a8aca 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java @@ -151,4 +151,51 @@ public class CraftItem extends CraftEntity implements Item { @@ -20779,10 +20918,10 @@ index 832def3c518be8d6d81e71f6022566e6179e2d17..480adbfdd084a6291ee0108e5350ea41 + // 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 4afc1c9d2a7638e84a55fe30932dc36db465c31a..cab9c8ccdd7c5b76962fae2929d1484eb1cb3d0b 100644 +index 3f952d1409118535f325f614f1a6507c40efa4d6..e3f724a19ab2f9821d84f9b03acf7c925c88f455 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -@@ -452,7 +452,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -490,7 +490,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { net.minecraft.server.level.ServerPlayer entityPlayer = killer == null ? null : ((CraftPlayer) killer).getHandle(); getHandle().lastHurtByPlayer = entityPlayer; getHandle().lastHurtByMob = entityPlayer; @@ -20791,7 +20930,7 @@ index 4afc1c9d2a7638e84a55fe30932dc36db465c31a..cab9c8ccdd7c5b76962fae2929d1484e } // Paper end -@@ -915,7 +915,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -953,7 +953,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { return EntityCategory.WATER; } @@ -20800,7 +20939,7 @@ index 4afc1c9d2a7638e84a55fe30932dc36db465c31a..cab9c8ccdd7c5b76962fae2929d1484e } @Override -@@ -1118,4 +1118,32 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -1156,4 +1156,32 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { getHandle().knockback(strength, directionX, directionZ); }; // Paper end @@ -20855,10 +20994,10 @@ 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 5c1e016de183933c5458deaae257b978e6350307..137595efe9e828810cf1f006027ac96606ad8821 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 -@@ -482,10 +482,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -488,10 +488,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setPlayerListName(String name) { @@ -20875,7 +21014,7 @@ index 5c1e016de183933c5458deaae257b978e6350307..137595efe9e828810cf1f006027ac966 for (ServerPlayer player : (List) this.server.getHandle().players) { if (player.getBukkitEntity().canSee(this)) { player.connection.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME, this.getHandle())); -@@ -1321,6 +1326,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1351,6 +1356,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } if (entity.isVehicle() && !ignorePassengers) { // Paper - Teleport API @@ -20886,7 +21025,7 @@ index 5c1e016de183933c5458deaae257b978e6350307..137595efe9e828810cf1f006027ac966 return false; } -@@ -2595,6 +2604,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2661,6 +2670,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this.getHandle().getAbilities().walkingSpeed * 2f; } @@ -20915,7 +21054,7 @@ index 5c1e016de183933c5458deaae257b978e6350307..137595efe9e828810cf1f006027ac966 private void validateSpeed(float value) { Preconditions.checkArgument(value <= 1f && value >= -1f, "Speed value (%s) need to be between -1f and 1f", value); } -@@ -3361,4 +3392,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3427,4 +3458,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void setSendViewDistance(final int viewDistance) { this.getHandle().setSendViewDistance(viewDistance); } @@ -21068,10 +21207,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 b9e90f589749dfc9324c4aa2062c505fbd4447bc..118483d7342117c4bc172db89df9fab391f30378 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); @@ -21087,29 +21226,22 @@ index b9e90f589749dfc9324c4aa2062c505fbd4447bc..118483d7342117c4bc172db89df9fab3 return event; } -@@ -1068,6 +1077,7 @@ public class CraftEventFactory { - damageCause = DamageCause.ENTITY_EXPLOSION; - } - event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), entity.getBukkitEntity(), damageCause, modifiers, modifierFunctions, source.isCritical()); // Paper - add critical damage API -+ damager.processClick(InteractionHand.MAIN_HAND); // Purpur - } - event.setCancelled(cancelled); - -@@ -1182,6 +1192,7 @@ public class CraftEventFactory { - } else { - entity.lastDamageCancelled = true; // SPIGOT-5339, SPIGOT-6252, SPIGOT-6777: Keep track if the event was canceled - } -+ damager.getHandle().processClick(InteractionHand.MAIN_HAND); // Purpur - return event; - } - -@@ -1245,6 +1256,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; +- if (source.is(DamageTypes.CACTUS) || source.is(DamageTypes.SWEET_BERRY_BUSH) || source.is(DamageTypes.STALAGMITE) || source.is(DamageTypes.FALLING_STALACTITE) || source.is(DamageTypes.FALLING_ANVIL)) { ++ if (source.is(DamageTypes.CACTUS) || source.is(DamageTypes.SWEET_BERRY_BUSH) || source.is(DamageTypes.STALAGMITE) || source.is(DamageTypes.FALLING_STALACTITE) || source.is(DamageTypes.FALLING_ANVIL) || source.isStonecutter()) { // Purpur + cause = DamageCause.CONTACT; + } else if (source.is(DamageTypes.HOT_FLOOR)) { + cause = DamageCause.HOT_FLOOR; +@@ -1183,6 +1192,7 @@ public class CraftEventFactory { EntityDamageEvent event; if (damager != null) { - event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, modifiers, modifierFunctions, critical); // Paper - add critical damage API + event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, bukkitDamageSource, modifiers, modifierFunctions, critical); + damager.processClick(InteractionHand.MAIN_HAND); // Purpur } else { - event = new EntityDamageEvent(damagee.getBukkitEntity(), cause, modifiers, modifierFunctions); + event = new EntityDamageEvent(damagee.getBukkitEntity(), cause, bukkitDamageSource, modifiers, modifierFunctions); } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java index 977b77547f7ba62cef3640cf8d4f1c8e7cded53a..beae43e9b6fe447e7515d878ac175f461968768a 100644 @@ -21321,10 +21453,10 @@ index e938255fcc5db0c289d3e132175a541187e4a748..f7a747ea73a80c97d863e0fd3772a0c3 public static boolean equals(MobEffect mobEffect, PotionEffectType type) { diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java -index 700932b65e4fda560d684b0aa079bcee3923f73e..7902c649a54fccbb13531c01e052df87ec4a424a 100644 +index e85b9bb3f9c225d289a4959921970b9963881199..ca8ae8e1c51b937dac916e0b0dc94b5e2e61efeb 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java -@@ -501,7 +501,7 @@ public class CraftScheduler implements BukkitScheduler { +@@ -503,7 +503,7 @@ public class CraftScheduler implements BukkitScheduler { this.parsePending(); } else { // this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper @@ -21333,7 +21465,7 @@ index 700932b65e4fda560d684b0aa079bcee3923f73e..7902c649a54fccbb13531c01e052df87 // We don't need to parse pending // (async tasks must live with race-conditions if they attempt to cancel between these few lines of code) } -@@ -513,10 +513,10 @@ public class CraftScheduler implements BukkitScheduler { +@@ -515,10 +515,10 @@ public class CraftScheduler implements BukkitScheduler { this.runners.remove(task.getTaskId()); } } @@ -21346,7 +21478,7 @@ index 700932b65e4fda560d684b0aa079bcee3923f73e..7902c649a54fccbb13531c01e052df87 //this.debugHead = this.debugHead.getNextHead(currentTick); // Paper } -@@ -559,7 +559,7 @@ public class CraftScheduler implements BukkitScheduler { +@@ -561,7 +561,7 @@ public class CraftScheduler implements BukkitScheduler { } void parsePending() { // Paper @@ -21355,7 +21487,7 @@ index 700932b65e4fda560d684b0aa079bcee3923f73e..7902c649a54fccbb13531c01e052df87 CraftTask head = this.head; CraftTask task = head.getNext(); CraftTask lastTask = head; -@@ -578,7 +578,7 @@ public class CraftScheduler implements BukkitScheduler { +@@ -580,7 +580,7 @@ public class CraftScheduler implements BukkitScheduler { task.setNext(null); } this.head = lastTask; @@ -21407,10 +21539,10 @@ index b3e1adeb932da9b3bed16acd94e2f16da48a7c72..d3ec817e95628f1fc8be4a29c9a0f13c // Paper end - add timings for scoreboard search } diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index e04d721765648a2b5f5bf1f2053e344bfb92f0f4..fda1016052dfbedcc5486d716fa2fb13d14af2df 100644 +index 0493e0cf3fac2d4e065118f60f1d7b19751b467f..d5f642e4b1c1ede7e9d2dea072aa5f22c73b5c23 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -482,7 +482,7 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -497,7 +497,7 @@ public final class CraftMagicNumbers implements UnsafeValues { @Override public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { @@ -21455,10 +21587,10 @@ index dd95b3bfe59f2bb635afe92317288efcd2986326..11f43f44f359ce57d3a8f3322e58b9f5 DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "seed", "Allows the user to view the seed of the world", PermissionDefault.OP, commands); diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..e9fc2b4661f5275b93db5d3fdf25a8bdc3b38920 +index 0000000000000000000000000000000000000000..efe25d3894f3ad000257c72d9a5e06ef22446d41 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -@@ -0,0 +1,655 @@ +@@ -0,0 +1,665 @@ +package org.purpurmc.purpur; + +import com.google.common.base.Throwables; @@ -21922,6 +22054,11 @@ index 0000000000000000000000000000000000000000..e9fc2b4661f5275b93db5d3fdf25a8bd + allowWaterPlacementInTheEnd = getBoolean("settings.allow-water-placement-in-the-end", allowWaterPlacementInTheEnd); + } + ++ public static boolean beeCountPayload = false; ++ private static void beeCountPayload() { ++ beeCountPayload = getBoolean("settings.bee-count-payload", beeCountPayload); ++ } ++ + public static boolean loggerSuppressInitLegacyMaterialError = false; + public static boolean loggerSuppressIgnoredAdvancementWarnings = false; + public static boolean loggerSuppressUnrecognizedRecipeErrors = false; @@ -22113,10 +22250,15 @@ index 0000000000000000000000000000000000000000..e9fc2b4661f5275b93db5d3fdf25a8bd + private static void playerDeathsAlwaysShowItem() { + playerDeathsAlwaysShowItem = getBoolean("settings.player-deaths-always-show-item", playerDeathsAlwaysShowItem); + } ++ ++ public static boolean registerMinecraftDebugCommands = false; ++ private static void registerMinecraftDebugCommands() { ++ registerMinecraftDebugCommands = getBoolean("settings.register-minecraft-debug-commands", registerMinecraftDebugCommands); ++ } +} 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..a78173ac1a8a71048bd6dbad84c0163e51cd150f +index 0000000000000000000000000000000000000000..65ac86d07aeabb019132e180e5ed6b197e9ccad3 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -0,0 +1,3304 @@ @@ -23267,9 +23409,9 @@ index 0000000000000000000000000000000000000000..a78173ac1a8a71048bd6dbad84c0163e + stonecutterDamage = (float) getDouble("blocks.stonecutter.damage", stonecutterDamage); + } + -+ public boolean turtleEggsBreakFromExpOrbs = true; -+ public boolean turtleEggsBreakFromItems = true; -+ public boolean turtleEggsBreakFromMinecarts = true; ++ public boolean turtleEggsBreakFromExpOrbs = false; ++ public boolean turtleEggsBreakFromItems = false; ++ public boolean turtleEggsBreakFromMinecarts = false; + public boolean turtleEggsBypassMobGriefing = false; + public int turtleEggsRandomTickCrackChance = 500; + public boolean turtleEggsTramplingFeatherFalling = false; @@ -26228,10 +26370,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; @@ -26250,6 +26392,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; @@ -26300,7 +26443,7 @@ index 0000000000000000000000000000000000000000..92d562fa11f69bb6b841299aef257ea0 + } + + if (++ticksLived > 20) { -+ this.discard(); ++ this.discard(EntityRemoveEvent.Cause.DISCARD); + } else { + this.setDeltaMovement(mot.scale(0.99D)); + if (!this.isNoGravity()) { @@ -26335,12 +26478,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 @@ @@ -26415,11 +26558,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()) { @@ -26462,7 +26605,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 @@ -26964,10 +27107,10 @@ index 0000000000000000000000000000000000000000..d6cc7e434cb2bacc00e4cad9e1f4be7f +} diff --git a/src/main/java/org/purpurmc/purpur/task/BeehiveTask.java b/src/main/java/org/purpurmc/purpur/task/BeehiveTask.java new file mode 100644 -index 0000000000000000000000000000000000000000..8a5faed6c1ac6850b87405e774e4393877d61c92 +index 0000000000000000000000000000000000000000..15e760d5c0465b24969df3e25bf8409faab8b62e --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/task/BeehiveTask.java -@@ -0,0 +1,92 @@ +@@ -0,0 +1,96 @@ +package org.purpurmc.purpur.task; + +import com.google.common.io.ByteArrayDataInput; @@ -27026,6 +27169,10 @@ index 0000000000000000000000000000000000000000..8a5faed6c1ac6850b87405e774e43938 + + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + ++ // targeted block info max range specified in client at net.minecraft.client.gui.hud.DebugHud#render ++ if (!pos.getCenter().closerThan(serverPlayer.position(), 20)) return; // Targeted Block info max range is 20 ++ if (serverPlayer.level().getChunkIfLoaded(pos) == null) return; ++ + BlockEntity blockEntity = serverPlayer.level().getBlockEntity(pos); + if (!(blockEntity instanceof BeehiveBlockEntity beehive)) { + return; diff --git a/patches/server/0003-Build-system-changes.patch b/patches/server/0003-Use-Gradle-Version-Catalogs.patch similarity index 69% rename from patches/server/0003-Build-system-changes.patch rename to patches/server/0003-Use-Gradle-Version-Catalogs.patch index 51d0af6..3718487 100644 --- a/patches/server/0003-Build-system-changes.patch +++ b/patches/server/0003-Use-Gradle-Version-Catalogs.patch @@ -1,14 +1,14 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: AlphaKR93 Date: Sun, 14 Jan 2024 19:51:19 +0900 -Subject: [PATCH] Build system changes +Subject: [PATCH] Use Gradle Version Catalogs diff --git a/build.gradle.kts b/build.gradle.kts -index 0c92d10f334f82d196e065c0811d0c1f48887377..9118c9ee41eac40662c352ebd71941ddee31d9a0 100644 +index 32366253c04c493135f2b22d1940f83669104723..be06b9b282c53bc135963447e19185d9ff41d19a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -19,6 +19,8 @@ dependencies { +@@ -19,21 +19,37 @@ dependencies { exclude("io.papermc.paper", "paper-api") } // Purpur end @@ -17,8 +17,14 @@ index 0c92d10f334f82d196e065c0811d0c1f48887377..9118c9ee41eac40662c352ebd71941dd // Paper start implementation("org.jline:jline-terminal-jansi:3.21.0") implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -32,8 +34,28 @@ dependencies { - */ + implementation("net.kyori:adventure-text-serializer-ansi:4.14.0") // Keep in sync with adventureVersion from Paper-API build file + implementation("net.kyori:ansi:1.0.3") // Manually bump beyond above transitive dep +- /* +- Required to add the missing Log4j2Plugins.dat file from log4j-core +- which has been removed by Mojang. Without it, log4j has to classload +- all its classes to check if they are plugins. +- Scanning takes about 1-2 seconds so adding this speeds up the server start. +- */ 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 + */ @@ -41,31 +47,29 @@ index 0c92d10f334f82d196e065c0811d0c1f48887377..9118c9ee41eac40662c352ebd71941dd alsoShade(log4jPlugins.output) + + testImplementation(common.bundles.test) -+ testImplementation(server.classgraph) ++ testImplementation(server.bundles.test) + /* implementation("io.netty:netty-codec-haproxy:4.1.97.Final") // Paper - Add support for proxy protocol // Paper end implementation("org.apache.logging.log4j:log4j-iostreams:2.19.0") // Paper - remove exclusion -@@ -44,31 +66,37 @@ dependencies { - runtimeOnly("org.xerial:sqlite-jdbc:3.42.0.1") - runtimeOnly("com.mysql:mysql-connector-j:8.2.0") +@@ -46,10 +62,13 @@ dependencies { runtimeOnly("com.lmax:disruptor:3.4.4") // Paper -+ */ // Paper start - Use Velocity cipher -- implementation("com.velocitypowered:velocity-native:3.1.2-SNAPSHOT") { + implementation("com.velocitypowered:velocity-native:3.1.2-SNAPSHOT") { ++ */ + implementation(server.velocity) { isTransitive = false } // Paper end - Use Velocity cipher -+ /* ++ /* runtimeOnly("org.apache.maven:maven-resolver-provider:3.9.6") runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18") runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.18") - +@@ -57,20 +76,25 @@ dependencies { // Pufferfish start implementation("org.yaml:snakeyaml:1.32") -- implementation ("com.github.carleslc.Simple-YAML:Simple-Yaml:1.8.4") { + implementation ("com.github.carleslc.Simple-YAML:Simple-Yaml:1.8.4") { + */ + implementation(server.simpleyaml) { exclude(group="org.yaml", module="snakeyaml") @@ -74,8 +78,8 @@ index 0c92d10f334f82d196e065c0811d0c1f48887377..9118c9ee41eac40662c352ebd71941dd - implementation("org.mozilla:rhino-runtime:1.7.14") // Purpur - implementation("org.mozilla:rhino-engine:1.7.14") // Purpur -+ // implementation("org.mozilla:rhino-runtime:1.7.14") // Purpur -+ // implementation("org.mozilla:rhino-engine:1.7.14") // Purpur ++ //implementation("org.mozilla:rhino-runtime:1.7.14") // Purpur ++ //implementation("org.mozilla:rhino-engine:1.7.14") // Purpur implementation("dev.omega24:upnp4j:1.0") // Purpur + /* @@ -83,8 +87,10 @@ index 0c92d10f334f82d196e065c0811d0c1f48887377..9118c9ee41eac40662c352ebd71941dd testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") testImplementation("org.hamcrest:hamcrest:2.2") testImplementation("org.mockito:mockito-core:5.5.0") + testImplementation("org.ow2.asm:asm-tree:9.5") + testImplementation("org.junit-pioneer:junit-pioneer:2.2.0") // Paper - CartesianTest + */ -+ // Plazma end - Use Gradle version catalogs ++ // Plazma end - Use Gradle Version Catalogs } val craftbukkitPackageVersion = "1_20_R3" // Paper diff --git a/patches/server/0005-Rebrand.patch b/patches/server/0005-Rebrand.patch index ee99905..d734f1a 100644 --- a/patches/server/0005-Rebrand.patch +++ b/patches/server/0005-Rebrand.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Rebrand diff --git a/build.gradle.kts b/build.gradle.kts -index 9118c9ee41eac40662c352ebd71941ddee31d9a0..3edbcb7a68b1969687c27725be98b69537fb64c2 100644 +index be06b9b282c53bc135963447e19185d9ff41d19a..47eea572566d7ec26459403cd02aa4442ae969d7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ val alsoShade: Configuration by configurations.creating @@ -17,7 +17,7 @@ index 9118c9ee41eac40662c352ebd71941ddee31d9a0..3edbcb7a68b1969687c27725be98b695 implementation("io.papermc.paper:paper-mojangapi:${project.version}") { exclude("io.papermc.paper", "paper-api") } -@@ -120,7 +120,7 @@ tasks.jar { +@@ -118,7 +118,7 @@ tasks.jar { attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", "Implementation-Title" to "CraftBukkit", @@ -135,7 +135,7 @@ index 3cb56595822799926a8141e60a42f5d1edfc6de5..3e32c28e1d4c157a2f00dbc6d6e9d71c .completer(new ConsoleCommandCompleter(this.server)) .option(LineReader.Option.COMPLETE_IN_WORD, true); diff --git a/src/main/java/net/minecraft/CrashReport.java b/src/main/java/net/minecraft/CrashReport.java -index 888e31a0454888c36cb27602a28619f1f6dbf2c0..315ac3baecf1e29fd49c4c52e2d914d9a726540f 100644 +index f91ea723a1c85f6cf8c4f6dd7f182b948c2f2e81..c5a3f9c2daf3da135cccecb757353534e1688821 100644 --- a/src/main/java/net/minecraft/CrashReport.java +++ b/src/main/java/net/minecraft/CrashReport.java @@ -37,7 +37,7 @@ public class CrashReport { @@ -157,7 +157,7 @@ index 888e31a0454888c36cb27602a28619f1f6dbf2c0..315ac3baecf1e29fd49c4c52e2d914d9 stringbuilder.append("// "); stringbuilder.append(CrashReport.getErrorComment()); diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java -index 61840cfd64caba6595dfc99c91c76a195638d4ee..b94f711b8bd56d159745b59f8b842d192a9d0293 100644 +index b4a009a1108758110181af3321a91b3ec9cf74dc..3e1079e9af85c62684ce19a7afaac5adc2167cb6 100644 --- a/src/main/java/net/minecraft/server/Main.java +++ b/src/main/java/net/minecraft/server/Main.java @@ -105,6 +105,18 @@ public class Main { @@ -171,19 +171,19 @@ index 61840cfd64caba6595dfc99c91c76a195638d4ee..b94f711b8bd56d159745b59f8b842d19 + \033[38;2;236;61;151m┃\033[38;2;236;61;157m┗\033[38;2;237;62;163m━\033[38;2;237;62;169m━\033[38;2;238;62;175m━\033[38;2;238;63;181m┛\033[38;2;239;63;187m┏\033[38;2;239;63;193m┛\033[38;2;239;64;200m┃\033[38;2;240;64;206m \033[38;2;240;64;212m┃\033[38;2;241;65;218m \033[38;2;241;65;224m \033[38;2;242;65;230m \033[38;2;242;66;236m \033[38;2;242;66;242m \033[38;2;237;66;243m┃\033[38;2;232;67;243m \033[38;2;227;67;244m┗\033[38;2;221;67;244m━\033[38;2;216;68;244m━\033[38;2;211;68;245m┛\033[38;2;205;69;245m \033[38;2;200;69;246m┃\033[38;2;195;69;246m \033[38;2;189;70;246m \033[38;2;184;70;247m┏\033[38;2;179;70;247m┛\033[38;2;173;71;247m \033[38;2;168;71;248m┏\033[38;2;163;72;248m┛\033[38;2;157;72;249m \033[38;2;152;72;249m┃\033[38;2;147;73;249m \033[38;2;141;73;250m┏\033[38;2;136;74;250m┓\033[38;2;131;74;250m┗\033[38;2;125;74;251m━\033[38;2;120;75;251m┛\033[38;2;115;75;251m┏\033[38;2;109;76;252m┓\033[38;2;104;76;252m \033[38;2;99;77;252m┃\033[38;2;94;77;253m┃\033[38;2;88;77;253m \033[38;2;83;78;253m┗\033[38;2;78;79;254m━\033[38;2;79;85;254m━\033[38;2;79;91;254m┛\033[38;2;80;97;255m \033[38;2;80;103;255m┃ + \033[38;2;236;61;151m┃\033[38;2;236;61;157m \033[38;2;237;62;163m┏\033[38;2;237;62;169m━\033[38;2;238;62;175m━\033[38;2;238;63;181m━\033[38;2;239;63;187m┛\033[38;2;239;63;193m \033[38;2;239;64;200m┃\033[38;2;240;64;206m \033[38;2;240;64;212m┃\033[38;2;241;65;218m \033[38;2;241;65;224m \033[38;2;242;65;230m \033[38;2;242;66;236m \033[38;2;242;66;242m \033[38;2;237;66;243m┃\033[38;2;232;67;243m \033[38;2;227;67;244m┏\033[38;2;221;67;244m━\033[38;2;216;68;244m━\033[38;2;211;68;245m┓\033[38;2;205;69;245m \033[38;2;200;69;246m┃\033[38;2;195;69;246m \033[38;2;189;70;246m┏\033[38;2;184;70;247m┛\033[38;2;179;70;247m \033[38;2;173;71;247m┏\033[38;2;168;71;248m┛\033[38;2;163;72;248m \033[38;2;157;72;249m \033[38;2;152;72;249m┃\033[38;2;147;73;249m \033[38;2;141;73;250m┃\033[38;2;136;74;250m┗\033[38;2;131;74;250m┓\033[38;2;125;74;251m \033[38;2;120;75;251m┏\033[38;2;115;75;251m┛\033[38;2;109;76;252m┃\033[38;2;104;76;252m \033[38;2;99;77;252m┃\033[38;2;94;77;253m┃\033[38;2;88;77;253m \033[38;2;83;78;253m┏\033[38;2;78;79;254m━\033[38;2;79;85;254m━\033[38;2;79;91;254m┓\033[38;2;80;97;255m \033[38;2;80;103;255m┃ + \033[38;2;236;61;151m┃\033[38;2;236;61;157m \033[38;2;237;62;163m┃\033[38;2;237;62;169m \033[38;2;238;62;175m \033[38;2;238;63;181m \033[38;2;239;63;187m \033[38;2;239;63;193m \033[38;2;239;64;200m┃\033[38;2;240;64;206m \033[38;2;240;64;212m┗\033[38;2;241;65;218m━\033[38;2;241;65;224m━\033[38;2;242;65;230m━\033[38;2;242;66;236m━\033[38;2;242;66;242m┓\033[38;2;237;66;243m┃\033[38;2;232;67;243m \033[38;2;227;67;244m┃\033[38;2;221;67;244m \033[38;2;216;68;244m \033[38;2;211;68;245m┃\033[38;2;205;69;245m \033[38;2;200;69;246m┃\033[38;2;195;69;246m┏\033[38;2;189;70;246m┛\033[38;2;184;70;247m \033[38;2;179;70;247m \033[38;2;173;71;247m┗\033[38;2;168;71;248m━\033[38;2;163;72;248m━\033[38;2;157;72;249m┓\033[38;2;152;72;249m┃\033[38;2;147;73;249m \033[38;2;141;73;250m┃\033[38;2;136;74;250m \033[38;2;131;74;250m┗\033[38;2;125;74;251m━\033[38;2;120;75;251m┛\033[38;2;115;75;251m \033[38;2;109;76;252m┃\033[38;2;104;76;252m \033[38;2;99;77;252m┃\033[38;2;94;77;253m┃\033[38;2;88;77;253m \033[38;2;83;78;253m┃\033[38;2;78;79;254m \033[38;2;79;85;254m \033[38;2;79;91;254m┃\033[38;2;80;97;255m \033[38;2;80;103;255m┃ -+ \033[38;2;236;61;151m┗\033[38;2;236;61;157m━\033[38;2;237;62;163m┛\033[38;2;237;62;169m \033[38;2;238;62;175m \033[38;2;238;63;181m \033[38;2;239;63;187m \033[38;2;239;63;193m \033[38;2;239;64;200m┗\033[38;2;240;64;206m━\033[38;2;240;64;212m━\033[38;2;241;65;218m━\033[38;2;241;65;224m━\033[38;2;242;65;230m━\033[38;2;242;66;236m━\033[38;2;242;66;242m┛\033[38;2;237;66;243m┗\033[38;2;232;67;243m━\033[38;2;227;67;244m┛\033[38;2;221;67;244m \033[38;2;216;68;244m \033[38;2;211;68;245m┗\033[38;2;205;69;245m━\033[38;2;200;69;246m┛\033[38;2;195;69;246m┗\033[38;2;189;70;246m━\033[38;2;184;70;247m━\033[38;2;179;70;247m━\033[38;2;173;71;247m━\033[38;2;168;71;248m━\033[38;2;163;72;248m━\033[38;2;157;72;249m┛\033[38;2;152;72;249m┗\033[38;2;147;73;249m━\033[38;2;141;73;250m┛\033[38;2;136;74;250m \033[38;2;131;74;250m \033[38;2;125;74;251m \033[38;2;120;75;251m \033[38;2;115;75;251m \033[38;2;109;76;252m┗\033[38;2;104;76;252m━\033[38;2;99;77;252m┛\033[38;2;94;77;253m┗\033[38;2;88;77;253m━\033[38;2;83;78;253m┛\033[38;2;78;79;254m \033[38;2;79;85;254m \033[38;2;79;91;254m┗\033[38;2;80;97;255m━\033[38;2;80;103;255m┛ ++ \033[38;2;236;61;151m┗\033[38;2;236;61;157m━\033[38;2;237;62;163m┛\033[38;2;237;62;169m \033[38;2;238;62;175m \033[38;2;238;63;181m \033[38;2;239;63;187m \033[38;2;239;63;193m \033[38;2;239;64;200m┗\033[38;2;240;64;206m━\033[38;2;240;64;212m━\033[38;2;241;65;218m━\033[38;2;241;65;224m━\033[38;2;242;65;230m━\033[38;2;242;66;236m━\033[38;2;242;66;242m┛\033[38;2;237;66;243m┗\033[38;2;232;67;243m━\033[38;2;227;67;244m┛\033[38;2;221;67;244m \033[38;2;216;68;244m \033[38;2;211;68;245m┗\033[38;2;205;69;245m━\033[38;2;200;69;246m┛\033[38;2;195;69;246m┗\033[38;2;189;70;246m━\033[38;2;184;70;247m━\033[38;2;179;70;247m━\033[38;2;173;71;247m━\033[38;2;168;71;248m━\033[38;2;163;72;248m━\033[38;2;157;72;249m┛\033[38;2;152;72;249m┗\033[38;2;147;73;249m━\033[38;2;141;73;250m┛\033[38;2;136;74;250m \033[38;2;131;74;250m \033[38;2;125;74;251m \033[38;2;120;75;251m \033[38;2;115;75;251m \033[38;2;109;76;252m┗\033[38;2;104;76;252m━\033[38;2;99;77;252m┛\033[38;2;94;77;253m┗\033[38;2;88;77;253m━\033[38;2;83;78;253m┛\033[38;2;78;79;254m \033[38;2;79;85;254m \033[38;2;79;91;254m┗\033[38;2;80;97;255m━\033[38;2;80;103;255m┛\033[0m + """); -+ if (org.plazmamc.plazma.Options.iKnowWhatIAmDoing) ++ if (!org.plazmamc.plazma.Options.iKnowWhatIAmDoing) + LOGGER.warn("Warning! Plazma may cause unexpected problems, so be sure to test it thoroughly before using it on a public server."); + // Plazma end // Paper start if (Boolean.getBoolean("Paper.isRunDev")) { net.minecraft.server.packs.VanillaPackResourcesBuilder.developmentConfig = builder -> { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 2b53c6fb21b08f04c378278f1a5e78e1e4b276d7..bdb69f65757ed32ef2cd55fd7afd7fc281373797 100644 +index b1dd8d66a524254a270a725f5f7a46f28e13b749..c7d748675b51ea69f31d87c74e4125a48a62ef48 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -957,7 +957,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop new io.papermc.paper.util.EmptyTag()); // paper end - testing additions diff --git a/patches/server/0011-Always-agree-EULA-on-development-mode.patch b/patches/server/0011-Always-agree-EULA-on-development-mode.patch index fcb587b..296289a 100644 --- a/patches/server/0011-Always-agree-EULA-on-development-mode.patch +++ b/patches/server/0011-Always-agree-EULA-on-development-mode.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Always agree EULA on development mode diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java -index b94f711b8bd56d159745b59f8b842d192a9d0293..0f7ce26f2db698814dfd766dadca5bfa53a63eb6 100644 +index 3e1079e9af85c62684ce19a7afaac5adc2167cb6..60382055ccb199e32fb201fddfe34f05bf919195 100644 --- a/src/main/java/net/minecraft/server/Main.java +++ b/src/main/java/net/minecraft/server/Main.java -@@ -175,6 +175,7 @@ public class Main { +@@ -179,6 +179,7 @@ public class Main { // Spigot Start boolean eulaAgreed = Boolean.getBoolean( "com.mojang.eula.agree" ); diff --git a/patches/server/0013-Optimize-default-configurations.patch b/patches/server/0013-Optimize-default-configurations.patch index 831f4f4..ff2514e 100644 --- a/patches/server/0013-Optimize-default-configurations.patch +++ b/patches/server/0013-Optimize-default-configurations.patch @@ -9,7 +9,7 @@ Subject: [PATCH] Optimize default configurations - YouHaveTrouble/minecraft-exploits-and-how-to-fix-them diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -index ebbd115686de7a87dd422e8d2d92abcf953358a7..65de112fedeed8623186a778d791a6cdc4d284f6 100644 +index 3fea9b69f4cfc94e7f01d4e3ca4ce7506a8e5d5c..5a88d2e4c7a533e420cef33830a0cc6484bfd979 100644 --- a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java +++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java @@ -64,7 +64,7 @@ public class PufferfishConfig { @@ -338,10 +338,10 @@ index 24763d3d270c29c95e0b3e85111145234f660a62..80ddc627e02e3c749e6b074afa93d357 } diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java -index 0f7ce26f2db698814dfd766dadca5bfa53a63eb6..e12dd19afff4a8249fc7c5aa5e12215f8fc30c14 100644 +index 60382055ccb199e32fb201fddfe34f05bf919195..d83bd5774f49af33119ea5224a2300d435898095 100644 --- a/src/main/java/net/minecraft/server/Main.java +++ b/src/main/java/net/minecraft/server/Main.java -@@ -160,7 +160,7 @@ public class Main { +@@ -164,7 +164,7 @@ public class Main { File configFile = (File) optionset.valueOf("bukkit-settings"); YamlConfiguration configuration = YamlConfiguration.loadConfiguration(configFile); configuration.options().copyDefaults(true); @@ -383,10 +383,10 @@ index a66dcea06424518290576c7647ae0717040586f9..41d5d15dfa2affdee68501efb2447a20 this.enableStatus = this.get("enable-status", true); this.hideOnlinePlayers = this.get("hide-online-players", false); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 35212e2418d0b5ac6813a778071368748fd6b926..a6d4859e25ec85ca62f8568b50ec2b0997438b80 100644 +index 30729e47d546b9bf18f15024516c2ebcb3b722e5..2d3f8bb3954d552d4bbcc9ec7286845a8d76da8a 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -424,7 +424,7 @@ public final class CraftServer implements Server { +@@ -426,7 +426,7 @@ public final class CraftServer implements Server { this.configuration = YamlConfiguration.loadConfiguration(this.getConfigFile()); this.configuration.options().copyDefaults(true); @@ -407,7 +407,7 @@ index a858b7ddef7f6877c0b92f4150e0dd37bea121aa..eab5ea835a524482f8cc043c7be190a8 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index c65f68359edfc01bca2c9fd98812d69346631746..bdc0377822ee29abd941b2ac47adaa9b5a4a3770 100644 +index a937993f318ef5703420f57fe65c5d990ce2c4dd..65b9e4fc073d0e97c6f90587d20e3ecbdaaf2c71 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -49,6 +49,7 @@ public class PurpurConfig { @@ -427,7 +427,7 @@ index c65f68359edfc01bca2c9fd98812d69346631746..bdc0377822ee29abd941b2ac47adaa9b private static void useAlternateKeepAlive() { useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive); } -@@ -481,7 +482,7 @@ public class PurpurConfig { +@@ -486,7 +487,7 @@ public class PurpurConfig { } public static boolean useUPnP = false; @@ -437,7 +437,7 @@ index c65f68359edfc01bca2c9fd98812d69346631746..bdc0377822ee29abd941b2ac47adaa9b private static void networkSettings() { useUPnP = getBoolean("settings.network.upnp-port-forwarding", useUPnP); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a78173ac1a8a71048bd6dbad84c0163e51cd150f..394ef5df7b1b56369d97c7cb36bc2440edac1a2f 100644 +index 65ac86d07aeabb019132e180e5ed6b197e9ccad3..213559bdf83c5a07b4f7c0e32f425c2e17dc3db4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -425,7 +425,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0014-Tweak-console-logging.patch b/patches/server/0014-Tweak-console-logging.patch index 17828fb..c5833b7 100644 --- a/patches/server/0014-Tweak-console-logging.patch +++ b/patches/server/0014-Tweak-console-logging.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Tweak console logging diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index d2ea4c6470706138a1e6cebb8c591abb14c96a18..84cf2b2e289af0a43c9cc64a9c7e045ffaf9c62b 100644 +index b7709cbb1a78eb1daac2112cb9fbf5d379aaa662..2a73508dd8a59c6af8b65ab2db97b6e20b104c57 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -180,16 +180,6 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -43,7 +43,7 @@ index d2ea4c6470706138a1e6cebb8c591abb14c96a18..84cf2b2e289af0a43c9cc64a9c7e045f // Paper start - fix converting txt to json file; convert old users earlier after PlayerList creation but before file load/save if (this.convertOldUsers()) { this.getProfileCache().save(false); // Paper -@@ -319,6 +320,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -320,6 +321,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface String proxyFlavor = (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.velocity.enabled) ? "Velocity" : "BungeeCord"; String proxyLink = (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.velocity.enabled) ? "https://docs.papermc.io/velocity/security" : "http://www.spigotmc.org/wiki/firewall-guide/"; // Paper end - Add Velocity IP Forwarding Support @@ -51,7 +51,7 @@ index d2ea4c6470706138a1e6cebb8c591abb14c96a18..84cf2b2e289af0a43c9cc64a9c7e045f if (!this.usesAuthentication()) { DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); DedicatedServer.LOGGER.warn("The server will make no attempt to authenticate usernames. Beware."); -@@ -332,7 +334,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -333,7 +335,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface DedicatedServer.LOGGER.warn("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose."); } // Spigot end @@ -61,10 +61,10 @@ index d2ea4c6470706138a1e6cebb8c591abb14c96a18..84cf2b2e289af0a43c9cc64a9c7e045f diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index b230739cf929c8f2b51a812fffe54be343ce3e05..75866d30b82dbe931de3a1990fe1fe0a40426574 100644 +index ac1e0c66f167218306504db6037cc1d6509072a0..ef4b1fb1532e1939d9a7e5337edc80b334b78318 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1467,6 +1467,7 @@ public abstract class PlayerList { +@@ -1468,6 +1468,7 @@ public abstract class PlayerList { public void broadcastChatMessage(PlayerChatMessage message, Predicate shouldSendFiltered, @Nullable ServerPlayer sender, ChatType.Bound params, @Nullable Function unsignedFunction) { // Paper end boolean flag = this.verifyChatTrusted(message); diff --git a/patches/server/0015-Add-missing-purpur-configuration-options.patch b/patches/server/0015-Add-missing-purpur-configuration-options.patch index 298508f..55dde0e 100644 --- a/patches/server/0015-Add-missing-purpur-configuration-options.patch +++ b/patches/server/0015-Add-missing-purpur-configuration-options.patch @@ -33,7 +33,7 @@ index c783ce59ea766e6c46a3313628b961f27e01ee8b..8adcffc1e6434e06ca52d119a7326a12 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java -index fb50a3f3665cca4bb2e586fbd73c580a5d691f69..61d4a78bde54dd90fc7a207f88709be25593c9f4 100644 +index 41773acc8e8e27daa1fe43726939b2d95da92c30..7574da6cb1844305f965f9725c7d8cb91c92cbd7 100644 --- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java +++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java @@ -95,6 +95,18 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Saddl @@ -84,10 +84,10 @@ index d6340d0a1308bafd3ba176562bf08dcadec02b34..e079f0994c81561510e5d223d2203e34 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 14135dac80dec4224715e21cef6556d22e569026..60db005620f01cf5f3bc912993c79585c2f5d65a 100644 +index 2a9c2a69a0589e4e7b7c79d3716376b360a2eba1..630eaae555403db79f4e16880ca443904b9254ab 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 } @@ -163,10 +163,10 @@ index bf7ef72a7d92db8f11789a69583270644de0dac7..1f476a4fd148ac9a4c9ad5d12de46a16 @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..e11a04e037a18aab942a16ed455b7d3475c7e073 100644 +index 58af87b8faf4f8d6bdb111c49a429466acface68..22cc678f9bd39acc27ba2d2e7981f9e8026440d4 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); @@ -175,7 +175,7 @@ index bc3fe45d12ffc2069a03d1587b7623d31130565a..e11a04e037a18aab942a16ed455b7d34 } 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() { @@ -185,7 +185,7 @@ index bc3fe45d12ffc2069a03d1587b7623d31130565a..e11a04e037a18aab942a16ed455b7d34 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java -index bdc0377822ee29abd941b2ac47adaa9b5a4a3770..8d7bc4bb2bc28e962e300232eb5c6f41ce8c7351 100644 +index 65b9e4fc073d0e97c6f90587d20e3ecbdaaf2c71..fc48ff9270e32c3b3dbf7ffd310cab7c33d459c0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java @@ -329,6 +329,7 @@ public class PurpurConfig { @@ -205,7 +205,7 @@ index bdc0377822ee29abd941b2ac47adaa9b5a4a3770..8d7bc4bb2bc28e962e300232eb5c6f41 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 394ef5df7b1b56369d97c7cb36bc2440edac1a2f..7ee419c39fe8295ef21993d621699573b80427cc 100644 +index 213559bdf83c5a07b4f7c0e32f425c2e17dc3db4..c7d8f22ecaf22232aef015da5a330dc39db4b695 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1180,7 +1180,15 @@ public class PurpurWorldConfig { diff --git a/patches/server/0017-Completely-remove-Mojang-Profiler.patch b/patches/server/0017-Completely-remove-Mojang-Profiler.patch index eb6d6ae..bd45af2 100644 --- a/patches/server/0017-Completely-remove-Mojang-Profiler.patch +++ b/patches/server/0017-Completely-remove-Mojang-Profiler.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Completely remove Mojang Profiler diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index b6cc108c2d4361e6f415cfc3ff8c7699a8e222f4..bc1128be130b452160167f0b38586a402c5f1a27 100644 +index b203394ed62807e7d5df433830993f1d2ee14939..e86d6dc83f77ef17c0e4458470009e5ca642f583 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java @@ -434,7 +434,7 @@ public class Commands { @@ -65,7 +65,7 @@ index 38854a047c6da7e2551f206478d17628e765168d..c989f0ddca966cb522fca68734baa5cc public int forkLimit() { return this.forkLimit; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 3815df35f3cabbe0f238f4333d908c8fe8ee1078..a801db24aaa6b16e16831147129dc7020127794d 100644 +index c81695902775f345d77154ea309bb71d34d08175..c153becedc7c8573dc1d8a736581db2a31a8d4f5 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -113,16 +113,18 @@ import net.minecraft.util.Unit; @@ -205,7 +205,7 @@ index 5dd0dcb47211cec69189115bf4eab1dffc3ca8cf..1b54ec6a39f40f3334b49348941290b5 public class ServerFunctionManager { diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 06554a000da1f6ba7360fa907deeead7341b09ea..69bccd2d35af4dae43ce77da1f0b0a436da1ad3e 100644 +index bb412ca874b85d777c0e3565fcefcee15b23182b..d1056b1c91edc3ec06c78e65c8fa2dd1f000c43f 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -68,7 +68,7 @@ import net.minecraft.server.level.progress.ChunkProgressListener; @@ -218,7 +218,7 @@ index 06554a000da1f6ba7360fa907deeead7341b09ea..69bccd2d35af4dae43ce77da1f0b0a43 import net.minecraft.util.thread.ProcessorHandle; import net.minecraft.util.thread.ProcessorMailbox; diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 897ad16faffcf10a352a49c87d1d5f44f59d5491..2d73cf04b20fa1edea350a704f8502e35d3117c5 100644 +index 6167ffb1263a1a65b582b7d295d1d77ef38c3ee3..37f14f17b50d1ea23c859858d2dbdfcf56c125af 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java @@ -23,7 +23,7 @@ import net.minecraft.core.SectionPos; @@ -231,7 +231,7 @@ index 897ad16faffcf10a352a49c87d1d5f44f59d5491..2d73cf04b20fa1edea350a704f8502e3 import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ai.village.poi.PoiManager; diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index ac7fcbc10f6b971621b5aae31aee467ed6cd8458..4247a66f621bbe8e02493aea714094c424eb6fcb 100644 +index 08a5afa3b0f9729bc0883054e2255dee4d9ed815..611916db3f9a6d2fbfa720e883fb03973b4a65c2 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -78,7 +78,7 @@ import net.minecraft.util.Mth; @@ -804,10 +804,10 @@ index f012d23b22b1a9d1acb6c020c66dc727f7fe9e1a..23cf0ff4c86c3d05668b1ed176364606 + */ // Plazma - Completely remove Mojang Profiler } diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 11062e250657cb839ca046d6c224647915d3ee7b..27c7263cabaa7bbd2ca371627ed9235ae5c5ff41 100644 +index 1d1688fafc438a5957096118790d44fbd55476bb..546b14cc2cf0c4145a059142aa33ad113d7479bf 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -148,8 +148,8 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -149,8 +149,8 @@ public abstract class Mob extends LivingEntity implements Targeting { this.pathfindingMalus = Maps.newEnumMap(BlockPathTypes.class); this.restrictCenter = BlockPos.ZERO; this.restrictRadius = -1.0F; @@ -875,10 +875,10 @@ index d87124f5356180a37e581febc6141fdc5f1395a7..681e3fcd759a26578e054f88e8048e39 // CraftBukkit start - SPIGOT-5667 make sure all types are populated and mutable Map, Object2ObjectLinkedOpenHashMap>> map1 = Maps.newHashMap(); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 93ba0cef1d55b2ded2cb4bdf0518c976ca92bf8d..dec7350a665af5dd7077629a2a573e9becd8419a 100644 +index c4bfdf19651a3c8ef66795a6c7f5a29c72f9ee2d..4eb8cab1f7f2d3d2dcba15bb0bd64b60c027882a 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -41,7 +41,7 @@ import net.minecraft.sounds.SoundSource; +@@ -36,7 +36,7 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.AbortableIterationConsumer; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; @@ -887,7 +887,7 @@ index 93ba0cef1d55b2ded2cb4bdf0518c976ca92bf8d..dec7350a665af5dd7077629a2a573e9b import net.minecraft.world.DifficultyInstance; import net.minecraft.world.TickRateManager; import net.minecraft.world.damagesource.DamageSource; -@@ -140,7 +140,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -135,7 +135,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { private final ResourceKey dimensionTypeId; private final Holder dimensionTypeRegistration; public final WritableLevelData levelData; @@ -896,7 +896,7 @@ index 93ba0cef1d55b2ded2cb4bdf0518c976ca92bf8d..dec7350a665af5dd7077629a2a573e9b public final boolean isClientSide; private final WorldBorder worldBorder; private final BiomeManager biomeManager; -@@ -263,7 +263,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -258,7 +258,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { //protected final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(java.util.concurrent.ThreadLocalRandom.current().nextLong()); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - move thread unsafe random initialization // Pufferfish - getter // Purpur - dont break ABI @@ -905,7 +905,7 @@ index 93ba0cef1d55b2ded2cb4bdf0518c976ca92bf8d..dec7350a665af5dd7077629a2a573e9b 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.plazmaConfig = plazmaWorldConfigurationCreator.apply(this.spigotConfig); // Plazma - Configurable Plazma -@@ -280,7 +280,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -275,7 +275,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } // CraftBukkit end @@ -914,7 +914,7 @@ index 93ba0cef1d55b2ded2cb4bdf0518c976ca92bf8d..dec7350a665af5dd7077629a2a573e9b this.levelData = worlddatamutable; this.dimensionTypeRegistration = holder; this.dimensionTypeId = (ResourceKey) holder.unwrapKey().orElseThrow(() -> { -@@ -1850,6 +1850,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1841,6 +1841,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { return false; } @@ -922,7 +922,7 @@ index 93ba0cef1d55b2ded2cb4bdf0518c976ca92bf8d..dec7350a665af5dd7077629a2a573e9b public ProfilerFiller getProfiler() { if (true || gg.pufferfish.pufferfish.PufferfishConfig.disableMethodProfiler) return net.minecraft.util.profiling.InactiveProfiler.INSTANCE; // Pufferfish // Purpur return (ProfilerFiller) this.profiler.get(); -@@ -1858,6 +1859,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1849,6 +1850,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public Supplier getProfilerSupplier() { return this.profiler; } diff --git a/patches/server/0018-Add-option-to-change-nether-portal-size.patch b/patches/server/0018-Add-option-to-change-nether-portal-size.patch index 5f08253..2891b89 100644 --- a/patches/server/0018-Add-option-to-change-nether-portal-size.patch +++ b/patches/server/0018-Add-option-to-change-nether-portal-size.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add option to change nether portal size diff --git a/src/main/java/net/minecraft/world/level/portal/PortalShape.java b/src/main/java/net/minecraft/world/level/portal/PortalShape.java -index 913f598e9c75d39adb8f557ff5c184b7450e06ad..c6a721ac2e8675b0183f584c232efce22e5f7766 100644 +index 46910a3bdacc9df1835e16b300f9e107744d2660..9b372b494b831c374bab478267309544b4b31748 100644 --- a/src/main/java/net/minecraft/world/level/portal/PortalShape.java +++ b/src/main/java/net/minecraft/world/level/portal/PortalShape.java -@@ -100,7 +100,7 @@ public class PortalShape { +@@ -99,7 +99,7 @@ public class PortalShape { private int calculateWidth() { int i = this.getDistanceUntilEdgeAboveFrame(this.bottomLeft, this.rightDir); @@ -17,7 +17,7 @@ index 913f598e9c75d39adb8f557ff5c184b7450e06ad..c6a721ac2e8675b0183f584c232efce2 } private int getDistanceUntilEdgeAboveFrame(BlockPos pos, Direction direction) { -@@ -133,7 +133,7 @@ public class PortalShape { +@@ -132,7 +132,7 @@ public class PortalShape { BlockPos.MutableBlockPos blockposition_mutableblockposition = new BlockPos.MutableBlockPos(); int i = this.getDistanceUntilTop(blockposition_mutableblockposition); @@ -26,7 +26,7 @@ index 913f598e9c75d39adb8f557ff5c184b7450e06ad..c6a721ac2e8675b0183f584c232efce2 } private boolean hasTopFrame(BlockPos.MutableBlockPos pos, int height) { -@@ -187,7 +187,7 @@ public class PortalShape { +@@ -186,7 +186,7 @@ public class PortalShape { } public boolean isValid() { diff --git a/patches/server/0019-Reduce-create-random-instance.patch b/patches/server/0019-Reduce-create-random-instance.patch index ab3d7ce..4209074 100644 --- a/patches/server/0019-Reduce-create-random-instance.patch +++ b/patches/server/0019-Reduce-create-random-instance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Reduce create random instance diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index a801db24aaa6b16e16831147129dc7020127794d..2ab66feae898d7316e8a5d0a3103d462e93c81b6 100644 +index c153becedc7c8573dc1d8a736581db2a31a8d4f5..fcc197256be00621bb3875c20849fe083a453c5c 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -236,6 +236,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop type, Level world, int luckOfTheSeaLevel, int lureLevel) { super(type, world); @@ -178,7 +178,7 @@ index 849b6a30d412d10f1e2e6e88f2d8d990e4a720e4..5534c8c65588724f2c6f178caacc2dda this.costs = new int[3]; this.enchantClue = new int[]{-1, -1, -1}; diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 9c62187b9c716c49db4bb39781df1bfb38db4030..6965a7ae47aec6d0b9dff1d4bbb90cf330265c09 100644 +index 059e545fd04b7919fb0cc86797b636e3cda61027..8c90c4ff41b2a12cb6ba70d0bc80755ba8246872 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -92,7 +92,7 @@ public class Explosion { @@ -191,10 +191,10 @@ index 9c62187b9c716c49db4bb39781df1bfb38db4030..6965a7ae47aec6d0b9dff1d4bbb90cf3 this.hitPlayers = Maps.newHashMap(); this.level = world; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index dec7350a665af5dd7077629a2a573e9becd8419a..974a15d9eaf1267e2303a0eba3a68377ecc3bfec 100644 +index 4eb8cab1f7f2d3d2dcba15bb0bd64b60c027882a..11c864f3947b93f0ebeae8c6fd006a5891162b44 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -127,16 +127,16 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -122,16 +122,16 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public final Thread thread; private final boolean isDebug; private int skyDarken; @@ -227,10 +227,10 @@ index b7370e64fd0d50e8725d7d5afc30af2e8bc8455d..9ec2a60c8240f7a3e4cd7944d070156d private int lapis = 0; // Purpur 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 c3d25a26883f7cbe7106c2f3415af0b18f534ee2..5cf35474d2f55c3a70f8f40e423f9388669ba40d 100644 +index 1b150b9fc444a248f6c01572447c7bb8eecfc76e..9579f730c8de447bed6634d0e2af85547949698b 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 -@@ -368,7 +368,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { +@@ -369,7 +369,7 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { } private static void spawnGatewayPortal(ServerLevel world, BlockPos pos, EndGatewayConfiguration config) { @@ -253,20 +253,20 @@ index 798e22fb4d685b5845ebf687e8004e94f13a9751..189f425565c9c38b29031ae26de66742 // Paper start - Add missing structure set seed configs if (this.conf.strongholdSeed != null && structureSetEntry.is(net.minecraft.world.level.levelgen.structure.BuiltinStructureSets.STRONGHOLDS)) { diff --git a/src/main/java/net/minecraft/world/level/dimension/end/DragonRespawnAnimation.java b/src/main/java/net/minecraft/world/level/dimension/end/DragonRespawnAnimation.java -index 18fce94f0d4b9d28e3afec61c7578f672973a71f..c98d65c146213bdf530916b8ec371e0b0b8f23e7 100644 +index 7bbe93966fa00b7001da53bf2f22f4d942b7cc22..6c5eececc83571b0f60e7f672ed185e1d262e99c 100644 --- a/src/main/java/net/minecraft/world/level/dimension/end/DragonRespawnAnimation.java +++ b/src/main/java/net/minecraft/world/level/dimension/end/DragonRespawnAnimation.java -@@ -62,7 +62,7 @@ public enum DragonRespawnAnimation { +@@ -81,7 +81,7 @@ public enum DragonRespawnAnimation { + world.explode((Entity) null, (double) ((float) worldgenender_spike.getCenterX() + 0.5F), (double) worldgenender_spike.getHeight(), (double) ((float) worldgenender_spike.getCenterZ() + 0.5F), 5.0F, Level.ExplosionInteraction.BLOCK); + SpikeConfiguration worldgenfeatureendspikeconfiguration = new SpikeConfiguration(true, ImmutableList.of(worldgenender_spike), new BlockPos(0, 128, 0)); - world.explode((Entity)null, (double)((float)endSpike.getCenterX() + 0.5F), (double)endSpike.getHeight(), (double)((float)endSpike.getCenterZ() + 0.5F), 5.0F, Level.ExplosionInteraction.BLOCK); - SpikeConfiguration spikeConfiguration = new SpikeConfiguration(true, ImmutableList.of(endSpike), new BlockPos(0, 128, 0)); -- Feature.END_SPIKE.place(spikeConfiguration, world, world.getChunkSource().getGenerator(), RandomSource.create(), new BlockPos(endSpike.getCenterX(), 45, endSpike.getCenterZ())); -+ Feature.END_SPIKE.place(spikeConfiguration, world, world.getChunkSource().getGenerator(), (world.plazmaConfig().misc.reduceRandom ? world.getRandom() : RandomSource.create()), new BlockPos(endSpike.getCenterX(), 45, endSpike.getCenterZ())); // Plazma - Reduce create random instance +- Feature.END_SPIKE.place(worldgenfeatureendspikeconfiguration, world, world.getChunkSource().getGenerator(), RandomSource.create(), new BlockPos(worldgenender_spike.getCenterX(), 45, worldgenender_spike.getCenterZ())); ++ Feature.END_SPIKE.place(worldgenfeatureendspikeconfiguration, world, world.getChunkSource().getGenerator(), (world.plazmaConfig().misc.reduceRandom ? world.getRandom() : RandomSource.create()), new BlockPos(worldgenender_spike.getCenterX(), 45, worldgenender_spike.getCenterZ())); // Plazma - Reduce create random instance } - } else if (bl) { - fight.setRespawnStage(SUMMONING_DRAGON); + } else if (flag1) { + fight.setRespawnStage(SUMMONING_DRAGON); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java -index 4d2ec3b14ed3b6c527745111950bbdf111129c41..49d671be728a80d0712aa0c612e52ab4532290b0 100644 +index d4f903c402765c6e8e1db99e148613748f530726..c8d76fdee94a0ffb76fcb476ca386acf154dda28 100644 --- a/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java +++ b/src/main/java/net/minecraft/world/level/dimension/end/EndDragonFight.java @@ -472,7 +472,7 @@ public class EndDragonFight { diff --git a/patches/server/0020-Apply-various-optimizations.patch b/patches/server/0020-Apply-various-optimizations.patch index 6c67bf8..28e343f 100644 --- a/patches/server/0020-Apply-various-optimizations.patch +++ b/patches/server/0020-Apply-various-optimizations.patch @@ -7,10 +7,10 @@ Subject: [PATCH] Apply various optimizations Akarin - Swaps the predicate order of collision diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index e3322c3263280a8e206af7a84db3518ef0916439..dc0d312a41e80a757e58168005cda60ae7351d3e 100644 +index 2092ede561d14ace1c003ced051cd4967bb41beb..0cf2180519457817a5985cf34e5564cd0ec1b1a2 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2145,8 +2145,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2154,8 +2154,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S public void playerTouch(Player player) {} public void push(Entity entity) { @@ -21,7 +21,7 @@ index e3322c3263280a8e206af7a84db3518ef0916439..dc0d312a41e80a757e58168005cda60a if (this.level.paperConfig().collisions.onlyPlayersCollide && !(entity instanceof ServerPlayer || this instanceof ServerPlayer)) return; // Paper - Collision option for requiring a player participant double d0 = entity.getX() - this.getX(); double d1 = entity.getZ() - this.getZ(); -@@ -2174,8 +2175,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -2183,8 +2184,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S entity.push(d0, 0.0D, d1); } } diff --git a/patches/server/0024-Add-option-to-disable-moved-to-quickly-check-for-spe.patch b/patches/server/0024-Add-option-to-disable-moved-to-quickly-check-for-spe.patch index 786fa5e..d0b7818 100644 --- a/patches/server/0024-Add-option-to-disable-moved-to-quickly-check-for-spe.patch +++ b/patches/server/0024-Add-option-to-disable-moved-to-quickly-check-for-spe.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Add option to disable moved to quickly check for specific diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a56628fb04ccd5a2df4cb98bb4054f0024bf3a06..64666af7f8c4e2ad9a47e20131b4654fabae9cc5 100644 +index ae5a2152cde8922deeb8d1d8a85bf39518ccd759..d4672d73df93c597a19e98e5d9b7dfa377b3f200 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1458,6 +1458,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1472,6 +1472,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } // Paper end - Prevent moving into unloaded chunks diff --git a/patches/server/0025-Implement-No-Chat-Reports.patch b/patches/server/0025-Implement-No-Chat-Reports.patch index 6d16b8c..0d4297d 100644 --- a/patches/server/0025-Implement-No-Chat-Reports.patch +++ b/patches/server/0025-Implement-No-Chat-Reports.patch @@ -82,10 +82,10 @@ index 9d6db4a378036559efab91c8b7dcf2a6b0c2cce6..587d89d67afe9108b5e810463fb3cb21 } } diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 84cf2b2e289af0a43c9cc64a9c7e045ffaf9c62b..3b7a0e6220e93157b171d227676147b0cb481d97 100644 +index 2a73508dd8a59c6af8b65ab2db97b6e20b104c57..eb6bcea28df735efe53ed62080bb726f7314c280 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -681,6 +681,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -682,6 +682,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @Override public boolean enforceSecureProfile() { @@ -130,10 +130,10 @@ index 02e65b0bd212d46855baee48fab35dc95a88b43f..59c96512dcdac551e9919c3893e1340f if (packet == null || this.processedDisconnect) { // Spigot return; diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 75866d30b82dbe931de3a1990fe1fe0a40426574..c9e1f0d3dce8c0124f100818dab054ca728b341a 100644 +index ef4b1fb1532e1939d9a7e5337edc80b334b78318..f3b081abd82036c928655923c44a62a0e9889031 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1498,6 +1498,7 @@ public abstract class PlayerList { +@@ -1499,6 +1499,7 @@ public abstract class PlayerList { } public boolean verifyChatTrusted(PlayerChatMessage message) { // Paper - private -> public diff --git a/patches/server/0028-Configurable-entity-sensor-tick.patch b/patches/server/0028-Configurable-entity-sensor-tick.patch index a6c25b0..5073163 100644 --- a/patches/server/0028-Configurable-entity-sensor-tick.patch +++ b/patches/server/0028-Configurable-entity-sensor-tick.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable entity sensor tick diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 27c7263cabaa7bbd2ca371627ed9235ae5c5ff41..0991e62d7d4dc2de03c0e6ca8a6cf62c0bd3d59b 100644 +index 546b14cc2cf0c4145a059142aa33ad113d7479bf..0c1e3cb455d2a184ab9f0084d10bd7cde83f9027 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -937,10 +937,11 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -938,10 +938,11 @@ public abstract class Mob extends LivingEntity implements Targeting { } // Paper end - Allow nerfed mobs to jump and float //this.level().getProfiler().push("sensing"); // Purpur diff --git a/patches/server/0035-Add-entity-spawn-deadlock-timer.patch b/patches/server/0035-Add-entity-spawn-deadlock-timer.patch index bb8d72d..d16cb35 100644 --- a/patches/server/0035-Add-entity-spawn-deadlock-timer.patch +++ b/patches/server/0035-Add-entity-spawn-deadlock-timer.patch @@ -7,7 +7,7 @@ Subject: [PATCH] Add entity spawn deadlock timer - AbsolemJackdaw/FixMySpawnR diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java -index 2c36aca7a4d21a5c8663dc9736bc837cdfe69d72..cef4abeba32012c3d813fd6d1af284d0fd91762b 100644 +index 40c199812ecf7b16fe5a17c18cb0d6d3ce258910..f01390790cab0425e5d702d93b6755be41e94313 100644 --- a/src/main/java/net/minecraft/world/level/BaseSpawner.java +++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java @@ -48,6 +48,8 @@ public abstract class BaseSpawner { @@ -37,7 +37,7 @@ index 2c36aca7a4d21a5c8663dc9736bc837cdfe69d72..cef4abeba32012c3d813fd6d1af284d0 if (spawnCount <= 0 || maxNearbyEntities <= 0) return; // Paper - Ignore impossible spawn tick // Paper start - Configurable mob spawner tick rate if (spawnDelay > 0 && --tickDelay > 0) return; -@@ -287,6 +300,12 @@ public abstract class BaseSpawner { +@@ -280,6 +293,12 @@ public abstract class BaseSpawner { if (nbt.contains("SpawnRange", 99)) { this.spawnRange = nbt.getShort("SpawnRange"); } @@ -50,7 +50,7 @@ index 2c36aca7a4d21a5c8663dc9736bc837cdfe69d72..cef4abeba32012c3d813fd6d1af284d0 this.displayEntity = null; } -@@ -316,6 +335,8 @@ public abstract class BaseSpawner { +@@ -309,6 +328,8 @@ public abstract class BaseSpawner { })); } diff --git a/patches/server/0036-Reduce-allocations.patch b/patches/server/0036-Reduce-allocations.patch index 0db58e3..52b3c56 100644 --- a/patches/server/0036-Reduce-allocations.patch +++ b/patches/server/0036-Reduce-allocations.patch @@ -123,19 +123,19 @@ index ae60bd96b5284d54676d8e7e4dd5d170b526ec1e..359c4b080bd47234e569dce7055da03d return true; } diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java -index 04efba1517e2bde8ecced31ab2eb669b2e84a28c..55504d54a1eab004e76f19b57186f807f522bbba 100644 +index eedbf46e04b5ae420f9bedcbc2bbb10643ba7e22..1ac70b965f5dd9441658156e19a38419cbcc47d6 100644 --- a/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java -@@ -48,6 +48,8 @@ class PaperPluginInstanceManager { +@@ -47,6 +47,8 @@ import java.util.logging.Level; + class PaperPluginInstanceManager { private static final FileProviderSource FILE_PROVIDER_SOURCE = new FileProviderSource("File '%s'"::formatted); - private static final DirectoryProviderSource DIRECTORY_PROVIDER_SOURCE = new DirectoryProviderSource(); ++ private static final JavaPlugin[] EMPTY_JPLUGIN = new JavaPlugin[0]; // Plazma - Reduce allocations + private static final Plugin[] EMPTY_PLUGIN = new Plugin[0]; // Plazma - Reduce allocations -+ private static final JavaPlugin[] EMPTY_JAVA_PLUGIN = new JavaPlugin[0]; // Plazma - Reduce allocations private final List plugins = new ArrayList<>(); private final Map lookupNames = new HashMap<>(); -@@ -69,7 +71,7 @@ class PaperPluginInstanceManager { +@@ -68,7 +70,7 @@ class PaperPluginInstanceManager { } public @NotNull Plugin[] getPlugins() { @@ -144,12 +144,12 @@ index 04efba1517e2bde8ecced31ab2eb669b2e84a28c..55504d54a1eab004e76f19b57186f807 } public boolean isPluginEnabled(@NotNull String name) { -@@ -138,7 +140,7 @@ class PaperPluginInstanceManager { +@@ -136,7 +138,7 @@ class PaperPluginInstanceManager { this.server.getLogger().log(Level.SEVERE, "Unknown error occurred while loading plugins through PluginManager.", e); } - return runtimePluginEntrypointHandler.getPluginProviderStorage().getLoaded().toArray(new JavaPlugin[0]); -+ return runtimePluginEntrypointHandler.getPluginProviderStorage().getLoaded().toArray(EMPTY_JAVA_PLUGIN); // Plazma - Reduce allocations ++ return runtimePluginEntrypointHandler.getPluginProviderStorage().getLoaded().toArray(EMPTY_JPLUGIN); // Plazma - Reduce allocations } // Plugins are disabled in order like this inorder to "rougly" prevent @@ -167,20 +167,38 @@ index ee0331a6bc40cdde08d926fd8eb1dc642630c2e5..bafa781ea77afa159576afca3449bacb private static int[] getIndices(final int length) { diff --git a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java -index 7e8dc9e8f381abfdcce2746edc93122d623622d1..bf882040399015b38b917c7982f01e74137945f7 100644 +index c78cbec447032de9fe69748591bef6be300160ed..8ca248e844e73685a8d44a966144657315a799aa 100644 --- a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java +++ b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java -@@ -303,7 +303,7 @@ public final class ChunkEntitySlices { +@@ -304,7 +304,7 @@ public final class ChunkEntitySlices { protected static final class BasicEntityList { - protected static final Entity[] EMPTY = new Entity[0]; -+ protected static final Entity[] EMPTY = org.plazmamc.plazma.constants.Empty.ENTITY; // Plazma - Reduce allocations ++ //protected static final Entity[] EMPTY = new Entity[0]; // Plazma - Reduce allocations protected static final int DEFAULT_CAPACITY = 4; protected E[] storage; +@@ -315,7 +315,7 @@ public final class ChunkEntitySlices { + } + + public BasicEntityList(final int cap) { +- this.storage = (E[])(cap <= 0 ? EMPTY : new Entity[cap]); ++ this.storage = (E[])(cap <= 0 ? org.plazmamc.plazma.constants.Empty.ENTITY : new Entity[cap]); + } + + public boolean isEmpty() { +@@ -327,7 +327,7 @@ public final class ChunkEntitySlices { + } + + private void resize() { +- if (this.storage == EMPTY) { ++ if (this.storage == org.plazmamc.plazma.constants.Empty.ENTITY) { + this.storage = (E[])new Entity[DEFAULT_CAPACITY]; + } else { + this.storage = Arrays.copyOf(this.storage, this.storage.length * 2); diff --git a/src/main/java/net/minecraft/CrashReport.java b/src/main/java/net/minecraft/CrashReport.java -index 315ac3baecf1e29fd49c4c52e2d914d9a726540f..7259d86b568b38112ab420ea2b28f29e4ffcae71 100644 +index c5a3f9c2daf3da135cccecb757353534e1688821..e5585c6befeef62ecf130e8dabbe6b78f9e90a65 100644 --- a/src/main/java/net/minecraft/CrashReport.java +++ b/src/main/java/net/minecraft/CrashReport.java @@ -30,7 +30,7 @@ public class CrashReport { @@ -339,7 +357,7 @@ index a2920b8a9eff77d9c5d1d7f70ad3abdacba8f0fa..70d776d5cfdb0612f65d92333d6f872a protected CipherBase(Cipher cipher) { this.cipher = cipher; diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index c4e611e7ece504a1ccfa2e3a9d963dbe5917389d..1592ecd2fedf2ecfdff7165617119c55394bdb45 100644 +index b41cab778f446434b788946ea9d3e02c152e570e..1c71cea8554a055973bb85c7a8181f08e3246148 100644 --- a/src/main/java/net/minecraft/network/Connection.java +++ b/src/main/java/net/minecraft/network/Connection.java @@ -321,7 +321,7 @@ public class Connection extends SimpleChannelInboundHandler> { @@ -374,7 +392,7 @@ index d3a80d0a23be762c05931ae8001d98e43cab2b4a..a94feef330b1836a2fc009405c529455 static MutableComponent translatableWithFallback(String key, @Nullable String fallback, Object... args) { diff --git a/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java b/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java -index d45e39bc009281c298f3dfae113dc87f2b3b1fbd..d9deb14896c62c35ccc5758df1419e5307702a2d 100644 +index 084ffde43447f6ff5e45e9fe3fc6a86bde65fd5a..2e7b3260085986e26567e50a0c42feb121dba4cd 100644 --- a/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java +++ b/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java @@ -28,7 +28,7 @@ import net.minecraft.util.ExtraCodecs; @@ -411,7 +429,7 @@ index ccdc2345465313991f065e1176b58fb7d5e8722f..bb50e69a4d84e4753db77be071cc6fc7 // Paper end - Multi Block Change API diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 2ab66feae898d7316e8a5d0a3103d462e93c81b6..6ad66f23c80181bb8e6da0e1d07f3acf22f82847 100644 +index fcc197256be00621bb3875c20849fe083a453c5c..2ce7351231aa921604698d45220d7e3e34289b62 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1505,13 +1505,10 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamLimit) { -- this.server.scheduleOnMain(() -> this.disconnect(net.minecraft.network.chat.Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause -+ this.server.scheduleOnMain(() -> this.disconnect(net.minecraft.network.chat.Component.translatable("disconnect.spam"/*, new Object[0]*/), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause // Plazma - Reduce allocations - return; - } - } diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index 8757db8c7f9dc4fbdaf2324f6da639cbf1514b5d..3a995fb30a00b313d9b4de52ad11eac5a8c351eb 100644 +index 01069a21857f9f3b7905861ee38c3891903af3b8..d45a435a3aa8fc5b8f028e0455c3789b36cbdf12 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java @@ -138,8 +138,8 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, @@ -558,23 +563,31 @@ index 8757db8c7f9dc4fbdaf2324f6da639cbf1514b5d..3a995fb30a00b313d9b4de52ad11eac5 ServerConfigurationPacketListenerImpl serverconfigurationpacketlistenerimpl = new ServerConfigurationPacketListenerImpl(this.server, this.connection, commonlistenercookie, this.player); // CraftBukkit diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index c9e1f0d3dce8c0124f100818dab054ca728b341a..71c49f7458a1b54cda9a7e07162de981e7a53bb2 100644 +index f3b081abd82036c928655923c44a62a0e9889031..0250b9a90e62ca5a9a7172f6e1012e89514fd6e6 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -715,7 +715,7 @@ public abstract class PlayerList { - while (iterator.hasNext()) { - entityplayer = (ServerPlayer) iterator.next(); - this.save(entityplayer); // CraftBukkit - Force the player's inventory to be saved -- entityplayer.connection.disconnect(Component.translatable("multiplayer.disconnect.duplicate_login", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.DUPLICATE_LOGIN); // Paper - kick event cause -+ entityplayer.connection.disconnect(Component.translatable("multiplayer.disconnect.duplicate_login"/*, new Object[0]*/), org.bukkit.event.player.PlayerKickEvent.Cause.DUPLICATE_LOGIN); // Paper - kick event cause // Plazma - Reduce allocations - } +@@ -133,6 +133,7 @@ public abstract class PlayerList { + private static final Logger LOGGER = LogUtils.getLogger(); + private static final int SEND_PLAYER_INFO_INTERVAL = 600; + private static final SimpleDateFormat BAN_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); ++ private static final org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag[] EMPTY_FLAG = new org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag[0]; // Plazma - Reduce allocations + private final MinecraftServer server; + public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety + private final Map playersByUUID = Maps.newHashMap(); +@@ -816,7 +817,7 @@ public abstract class PlayerList { - // Instead of kicking then returning, we need to store the kick reason + public ServerPlayer respawn(ServerPlayer entityplayer, ServerLevel worldserver, boolean flag, Location location, boolean avoidSuffocation, RespawnReason reason) { + // Paper start - Expand PlayerRespawnEvent +- return respawn(entityplayer, worldserver, flag, location, avoidSuffocation, reason, new org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag[0]); ++ return respawn(entityplayer, worldserver, flag, location, avoidSuffocation, reason, EMPTY_FLAG); // Plazma - Reduce allocations + } + + public ServerPlayer respawn(ServerPlayer entityplayer, ServerLevel worldserver, boolean flag, Location location, boolean avoidSuffocation, RespawnReason reason, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag...respawnFlags) { diff --git a/src/main/java/net/minecraft/server/players/StoredUserList.java b/src/main/java/net/minecraft/server/players/StoredUserList.java -index 35f973cc2c0989256fa21abaf0327c2f36dbe4c9..2e7ef69361ec8e5c2e9c03653beb945fbd5877a1 100644 +index 7e133752ccb1ea7c0b4fa781feb1a88e2cfdcf6d..1289e8e9c54a584f5037ea8e852df37376af093d 100644 --- a/src/main/java/net/minecraft/server/players/StoredUserList.java +++ b/src/main/java/net/minecraft/server/players/StoredUserList.java -@@ -77,7 +77,7 @@ public abstract class StoredUserList> { +@@ -76,7 +76,7 @@ public abstract class StoredUserList> { } public String[] getUserList() { @@ -635,10 +648,10 @@ index 442eb602f5c82550a87e218e2013171b718abd62..b68f7d1fba18cf08a1844a179f07cb6d this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Mob.class, 5, false, false, (entityliving) -> { return entityliving instanceof Enemy && !(entityliving instanceof Creeper); diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java -index 588048ad83486adc7e798fba6dbbfe9f4926d7b0..8568ff3d5790ac47d7332b9f132af8839e7a2829 100644 +index adfa18c941b5070692ed855d1d609993ca49a01d..b44e752b4fa18d25ca7ac989b1eaacc138512848 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Panda.java +++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -339,7 +339,7 @@ public class Panda extends Animal { +@@ -340,7 +340,7 @@ public class Panda extends Animal { this.goalSelector.addGoal(13, new FollowParentGoal(this, 1.25D)); this.goalSelector.addGoal(14, new WaterAvoidingRandomStrollGoal(this, 1.0D)); this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -687,10 +700,10 @@ index 8adcffc1e6434e06ca52d119a7326a1272897307..a6a697868b22224a26d6c39e594533c3 private final DynamicGameEventListener dynamicVibrationListener; private VibrationSystem.Data vibrationData; 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 a8314521dd5d17fcf3ff1de4f6fc85804112d87c..7277022e1205185ad6b43e87820c733d9bb5c67d 100644 +index 1d896c6c49705acd87416dc11a1d8ce205f7844e..6d5c60cf9851fc358f29d25bf5d0de98ff7aeb40 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 -@@ -254,7 +254,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob +@@ -255,7 +255,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -713,10 +726,10 @@ index a00646bc8a9caefe56e48b7682e8fb0c464b81fa..a2b5d2f1be493148a0ed102f10fd8b76 this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); 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 8bbc11845d190b33296f61c503f54209d218bc85..ca3b1acf17c0a414db414a59c13a33ab86938a7b 100644 +index 54315fb84e3289f0ad8305c2c2cec980a5b2c627..5adcb3cb643025de833935ad0b962cf557d354aa 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -153,7 +153,7 @@ public class Creeper extends Monster implements PowerableMob { +@@ -154,7 +154,7 @@ public class Creeper extends Monster implements PowerableMob { this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); @@ -739,10 +752,10 @@ index 13bc6389652f8868d7539676ee6d85f37ba78f67..6e4dca9074132fc0fb8c90878bf50287 this.targetSelector.addGoal(4, new ResetUniversalAngerTargetGoal<>(this, false)); } 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 dbc27afbccb027963ae3f035c268835adedbb933..320916acbf22cd5d9a7aff7d3550de756bafeccd 100644 +index 931412a5ab315d4080a9f5209d3e85d78642f4c2..0678c916eb6c7fe4a96d6716980892f80e77b3d8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -@@ -89,7 +89,7 @@ public class Silverfish extends Monster { +@@ -90,7 +90,7 @@ public class Silverfish extends Monster { this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, false)); this.goalSelector.addGoal(5, new Silverfish.SilverfishMergeWithStoneGoal(this)); this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur @@ -812,7 +825,7 @@ index a097cfc528f709c80575f35483b6878314ea2717..61840d78c4e99e706de56613d13d5741 inventory: for (int index = 0; index < inventory.getContainerSize(); index++) { ItemStack itemStack = inventory.getItem(index); diff --git a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -index 70fbe678b27656f07b1048ab9ddfd755a64e0328..0ec803e0b476199617d7c6c961e0f2f4a204a51c 100644 +index 47b7baa41f341087bcd5dfec1d2a13b96f8357ca..72e410ad6bed528b7a1febd30079ab39e10fd5ed 100644 --- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java @@ -62,6 +62,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { @@ -1001,10 +1014,10 @@ index 16d2aa4556bc9f32a2def7f9ca282aa3fa23fb87..8514da343ce287298477f2c977e49491 @Nullable diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 137595efe9e828810cf1f006027ac96606ad8821..3f13abec289e53990b0dd6a04cab4cf07adf1dd9 100644 +index 988cc1290200de629a4c24cc67a03e69c2fcc727..eb709829d84a4536208b39572e265ffb230ddd8a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -420,7 +420,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -426,7 +426,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void sendTitle(Title title) { Preconditions.checkNotNull(title, "Title is null"); setTitleTimes(title.getFadeIn(), title.getStay(), title.getFadeOut()); @@ -1014,10 +1027,10 @@ index 137595efe9e828810cf1f006027ac96606ad8821..3f13abec289e53990b0dd6a04cab4cf0 } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java -index 6d85237b21650edf1d2dc71abaf0edbe7a8aef6b..be71bfb63970d21e9b79f6b1b26138d5cd4ca0b1 100644 +index c5d1ba7a1be3f102edcdfdc05fc50b30ef1f775b..66006d9ff581ac96f13389261de0cd647279b98a 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java -@@ -609,7 +609,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta { +@@ -610,7 +610,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta { throw new IllegalArgumentException("Invalid page number " + page + "/" + CraftMetaBook.this.getPageCount()); } @@ -1026,7 +1039,7 @@ index 6d85237b21650edf1d2dc71abaf0edbe7a8aef6b..be71bfb63970d21e9b79f6b1b26138d5 CraftMetaBook.this.pages.set(page - 1, this.componentsToPage(newText)); } -@@ -622,7 +622,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta { +@@ -623,7 +623,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta { public void addPage(final BaseComponent[]... pages) { for (BaseComponent[] page : pages) { if (page == null) { diff --git a/patches/server/0038-Improve-SwingTime-ticking.patch b/patches/server/0038-Improve-SwingTime-ticking.patch index 22562f1..74c6101 100644 --- a/patches/server/0038-Improve-SwingTime-ticking.patch +++ b/patches/server/0038-Improve-SwingTime-ticking.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Improve SwingTime ticking diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 1824ef51279af511f6ab2cb22b4991bf2a3d5c09..6f08deff6a2cb6a1878cb087cbd8d866e0e9a6a8 100644 +index bfa69b2c37f07132f8b31c12d26f4ceb074901a5..61cf0db77966e35da9ca30718b7e667f4c8a9297 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -2602,6 +2602,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2624,6 +2624,7 @@ public abstract class LivingEntity extends Entity implements Attackable { } protected void updateSwingTime() { diff --git a/patches/server/0039-Save-Json-list-asynchronously.patch b/patches/server/0039-Save-Json-list-asynchronously.patch index 572523c..660fc61 100644 --- a/patches/server/0039-Save-Json-list-asynchronously.patch +++ b/patches/server/0039-Save-Json-list-asynchronously.patch @@ -36,10 +36,10 @@ index 1c9cf5e1c4ee05724ffcdbd77a19bca1ab2be4d3..bc3b251a3f8ad345bdaaf67be59ff2c1 } diff --git a/src/main/java/net/minecraft/server/players/StoredUserList.java b/src/main/java/net/minecraft/server/players/StoredUserList.java -index 2e7ef69361ec8e5c2e9c03653beb945fbd5877a1..43680e141f08ba8359401a17f2e2fe59fca12dfa 100644 +index 1289e8e9c54a584f5037ea8e852df37376af093d..2014e0c4f412bead5881de588ec941a9a5ae3565 100644 --- a/src/main/java/net/minecraft/server/players/StoredUserList.java +++ b/src/main/java/net/minecraft/server/players/StoredUserList.java -@@ -44,11 +44,11 @@ public abstract class StoredUserList> { +@@ -43,11 +43,11 @@ public abstract class StoredUserList> { public void add(V entry) { this.map.put(this.getKeyForUser(entry.getUser()), entry); @@ -54,7 +54,7 @@ index 2e7ef69361ec8e5c2e9c03653beb945fbd5877a1..43680e141f08ba8359401a17f2e2fe59 } -@@ -64,11 +64,11 @@ public abstract class StoredUserList> { +@@ -63,11 +63,11 @@ public abstract class StoredUserList> { public void remove(K key) { this.map.remove(this.getKeyForUser(key));