From 2063f831309eb52858509289f45764ba3dda65a7 Mon Sep 17 00:00:00 2001 From: MrPowerGamerBR Date: Thu, 30 May 2024 20:21:34 -0300 Subject: [PATCH] Update to Paper 1.20.6 --- .github/workflows/build-without-pwt.yml | 2 +- .github/workflows/build.yml | 2 +- README.md | 2 +- build.gradle.kts | 28 +- gradle.properties | 6 +- gradle/wrapper/gradle-wrapper.properties | 2 +- ...atch => 0001-Parallel-world-ticking.patch} | 4 +- ...-Rebrand-to-SparklyPaper-and-Build-C.patch | 19 - ...-Rebrand-to-SparklyPaper-and-Build-C.patch | 19 - ...-Rebrand-to-SparklyPaper-and-Build-C.patch | 76 +--- .../0002-SparklyPaper-config-files.patch | 28 +- .../0003-Optimize-entity-coordinate-key.patch | 6 +- ...4-Rewrite-framed-map-tracker-ticking.patch | 66 ++- ...qr-call-in-ServerEntity-sendChanges-.patch | 4 +- ...ate-if-the-map-does-not-have-the-Cra.patch | 14 +- ...uler-s-executeTick-checks-if-there-i.patch | 10 +- .../0010-Blazingly-Simple-Farm-Checks.patch | 18 +- .../0011-Spooky-month-optimizations.patch | 30 +- ...-key-used-for-nearby-players-when-ti.patch | 10 +- .../server/0013-Optimize-canSee-checks.patch | 14 +- ...117075-Block-entity-unload-lag-spike.patch | 8 +- ...15-Fix-MC-117075-TE-Unload-Lag-Spike.patch | 8 +- .../0016-Optimize-tickBlockEntities.patch | 26 +- ...-Track-how-much-MSPT-each-world-used.patch | 8 +- .../server/0018-Parallel-world-ticking.patch | 408 ++++++++---------- settings.gradle.kts | 2 +- 26 files changed, 347 insertions(+), 473 deletions(-) rename patches/api/{0002-Parallel-world-ticking.patch => 0001-Parallel-world-ticking.patch} (95%) delete mode 100644 patches/api/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch delete mode 100644 patches/paper-api-generator/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch diff --git a/.github/workflows/build-without-pwt.yml b/.github/workflows/build-without-pwt.yml index b7d66f9..6e867a6 100644 --- a/.github/workflows/build-without-pwt.yml +++ b/.github/workflows/build-without-pwt.yml @@ -21,7 +21,7 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: '17' + java-version: '21' - name: Configure Git User Details run: git config --global user.email "actions@github.com" && git config --global user.name "Github Actions" - name: Grant execute permission for gradlew diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fa345f6..84ac800 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: '17' + java-version: '21' - name: Configure Git User Details run: git config --global user.email "actions@github.com" && git config --global user.name "Github Actions" - name: Grant execute permission for gradlew diff --git a/README.md b/README.md index 55db2cb..356e607 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

✨ SparklyPaper ✨

-![Minecraft Version](https://badgen.now.sh/badge/minecraft%20version/1.20.4/blue) ![Blazing Fast](https://badgen.now.sh/badge/speed/blazing%20%F0%9F%94%A5/green) +![Minecraft Version](https://badgen.now.sh/badge/minecraft%20version/1.20.6/blue) ![Blazing Fast](https://badgen.now.sh/badge/speed/blazing%20%F0%9F%94%A5/green) SparklyPower's Paper fork, making large servers snappier with high-performance optimizations and improvements! Focused on performance improvements for Survival servers with high player counts. diff --git a/build.gradle.kts b/build.gradle.kts index 744c3f1..0d89067 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,11 +2,8 @@ plugins { java `maven-publish` - // Nothing special about this, just keep it up to date - id("com.github.johnrengelman.shadow") version "8.1.1" apply false - // In general, keep this version in sync with upstream. Sometimes a newer version than upstream might work, but an older version is extremely likely to break. - id("io.papermc.paperweight.patcher") version "1.5.11" + id("io.papermc.paperweight.patcher") version "1.7.1" } val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" @@ -19,8 +16,8 @@ repositories { } dependencies { - remapper("net.fabricmc:tiny-remapper:0.8.10:fat") // Must be kept in sync with upstream - decompiler("net.minecraftforge:forgeflower:2.0.627.2") // Must be kept in sync with upstream + remapper("net.fabricmc:tiny-remapper:0.10.2:fat") // Must be kept in sync with upstream + decompiler("org.vineflower:vineflower:1.10.1") // Must be kept in sync with upstream paperclip("io.papermc:paperclip:3.0.3") // You probably want this to be kept in sync with upstream } @@ -30,7 +27,7 @@ allprojects { java { toolchain { - languageVersion.set(JavaLanguageVersion.of(17)) + languageVersion.set(JavaLanguageVersion.of(21)) } } } @@ -38,7 +35,7 @@ allprojects { subprojects { tasks.withType { options.encoding = Charsets.UTF_8.name() - options.release.set(17) + options.release.set(21) } tasks.withType { options.encoding = Charsets.UTF_8.name() @@ -67,15 +64,11 @@ paperweight { serverPatchDir.set(layout.projectDirectory.dir("patches/server")) serverOutputDir.set(layout.projectDirectory.dir("sparklypaper-server")) } - - // Paper API requires this - patchTasks { - register("PaperApiGenerator") { - isBareDirectory.set(true) - upstreamDirPath.set("paper-api-generator") - patchDir.set(layout.projectDirectory.dir("patches/paper-api-generator")) - outputDir.set(layout.projectDirectory.dir("sparklypaper-api-generator")) - } + patchTasks.register("generatedApi") { + isBareDirectory = true + upstreamDirPath = "paper-api-generator/generated" + patchDir = layout.projectDirectory.dir("patches/generatedApi") + outputDir = layout.projectDirectory.dir("paper-api-generator/generated") } } } @@ -86,7 +79,6 @@ paperweight { tasks.generateDevelopmentBundle { apiCoordinates.set("net.sparklypower.sparklypaper:sparklypaper-api") - mojangApiCoordinates.set("io.papermc.paper:paper-mojangapi") libraryRepositories.set( listOf( "https://repo.maven.apache.org/maven2/", diff --git a/gradle.properties b/gradle.properties index 1c19442..3dc3435 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,8 @@ group=net.sparklypower.sparklypaper -version=1.20.4-R0.1-SNAPSHOT +version=1.20.6-R0.1-SNAPSHOT -mcVersion=1.20.4 -paperRef=3b078f822a46039edbf8f9bdf078b28e35b57ca2 +mcVersion=1.20.6 +paperRef=06e69c8991b8c5022a319e4415ebd7822b5d1fb8 org.gradle.caching=true org.gradle.parallel=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3fa8f86..b82aa23 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/patches/api/0002-Parallel-world-ticking.patch b/patches/api/0001-Parallel-world-ticking.patch similarity index 95% rename from patches/api/0002-Parallel-world-ticking.patch rename to patches/api/0001-Parallel-world-ticking.patch index 5056bc4..fb1defb 100644 --- a/patches/api/0002-Parallel-world-ticking.patch +++ b/patches/api/0001-Parallel-world-ticking.patch @@ -65,10 +65,10 @@ index 9812d668ad945aba486fbf6d5bf83c4292cb5d03..c82b9188c79a0671ca9d09d7cd31e63d *

Sets whether or not the Timings should monitor at Verbose level.

* diff --git a/src/main/java/org/bukkit/command/SimpleCommandMap.java b/src/main/java/org/bukkit/command/SimpleCommandMap.java -index ac9a28922f8a556944a4c3649d74c32c622f0cb0..374fa246b0f72e588d9e8082759876d2a8ca5695 100644 +index c3a9cf65db73ed534bf20996c7f05b5eb0aaebe1..4c5673f795ce905f8cba4a1f204c9d17b7d84830 100644 --- a/src/main/java/org/bukkit/command/SimpleCommandMap.java +++ b/src/main/java/org/bukkit/command/SimpleCommandMap.java -@@ -34,7 +34,7 @@ public class SimpleCommandMap implements CommandMap { +@@ -38,7 +38,7 @@ public class SimpleCommandMap implements CommandMap { register("bukkit", new VersionCommand("version")); register("bukkit", new ReloadCommand("reload")); //register("bukkit", new PluginsCommand("plugins")); // Paper diff --git a/patches/api/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch b/patches/api/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch deleted file mode 100644 index a9fa055..0000000 --- a/patches/api/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MrPowerGamerBR -Date: Sat, 25 Nov 2023 21:36:16 -0300 -Subject: [PATCH] new fork who dis - Rebrand to SparklyPaper and Build Changes - - -diff --git a/build.gradle.kts b/build.gradle.kts -index 3e3ea0e4e4ceb3283ad2b99957e3795d66a9a716..44e1bab2017e596fe822d561323f6e5870cae40b 100644 ---- a/build.gradle.kts -+++ b/build.gradle.kts -@@ -78,7 +78,7 @@ dependencies { - } - - // Paper start --val generatedApiPath: java.nio.file.Path = rootProject.projectDir.toPath().resolve("paper-api-generator/generated") -+val generatedApiPath: java.nio.file.Path = rootProject.projectDir.toPath().resolve("sparklypaper-api-generator/generated") // SparklyPaper - idea { - module { - generatedSourceDirs.add(generatedApiPath.toFile()) diff --git a/patches/paper-api-generator/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch b/patches/paper-api-generator/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch deleted file mode 100644 index 4835cb2..0000000 --- a/patches/paper-api-generator/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MrPowerGamerBR -Date: Sat, 25 Nov 2023 21:42:37 -0300 -Subject: [PATCH] new fork who dis - Rebrand to SparklyPaper and Build Changes - - -diff --git a/build.gradle.kts b/build.gradle.kts -index 3b86451bdc939aec0ec6b4bf82a789cab38345b4..32fa3dbf6975b1435bbfc7bbd1094687b7e882f7 100644 ---- a/build.gradle.kts -+++ b/build.gradle.kts -@@ -20,7 +20,7 @@ minecraft { - - dependencies { - implementation("com.squareup:javapoet:1.13.0") -- implementation(project(":paper-api")) -+ implementation(project(":sparklypaper-api")) // SparklyPaper - implementation("io.github.classgraph:classgraph:4.8.47") - } - diff --git a/patches/server/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch b/patches/server/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch index c62780e..18e191a 100644 --- a/patches/server/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch +++ b/patches/server/0001-new-fork-who-dis-Rebrand-to-SparklyPaper-and-Build-C.patch @@ -5,43 +5,39 @@ Subject: [PATCH] new fork who dis - Rebrand to SparklyPaper and Build Changes diff --git a/build.gradle.kts b/build.gradle.kts -index bcfe59b6efb628ee1e7f9d60667360d4d885fb6a..fad6e6cbbd1e7ea3bb83374cb7e7a1bfac46ead1 100644 +index 4998aff0b7cb084dcda15c6a18bbe45e99b6000a..260a00dc826dcb5132d620ac324c44079436cdff 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -3,6 +3,8 @@ import io.papermc.paperweight.util.* +@@ -3,6 +3,8 @@ import java.time.Instant + plugins { java ++ kotlin("jvm") version "2.0.0" ++ kotlin("plugin.serialization") version "2.0.0" `maven-publish` -+ kotlin("jvm") version "1.9.10" -+ kotlin("plugin.serialization") version "1.9.10" - id("com.github.johnrengelman.shadow") } -@@ -13,8 +15,15 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) { +@@ -13,7 +15,12 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) { val alsoShade: Configuration by configurations.creating dependencies { - implementation(project(":paper-api")) -- implementation(project(":paper-mojangapi")) + // SparklyPaper start + implementation(project(":sparklypaper-api")) + implementation(kotlin("reflect")) -+ implementation("io.papermc.paper:paper-mojangapi:1.20.4-R0.1-SNAPSHOT") { -+ exclude("io.papermc.paper", "paper-api") -+ } -+ implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") ++ implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") + implementation("com.charleskorn.kaml:kaml:0.55.0") + // SparklyPaper end // Paper start implementation("org.jline:jline-terminal-jansi:3.21.0") implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -65,13 +74,18 @@ tasks.jar { - manifest { - val git = Git(rootProject.layout.projectDirectory.path) +@@ -75,7 +82,12 @@ tasks.jar { + val mcVersion = rootProject.providers.gradleProperty("mcVersion").get() + val build = System.getenv("BUILD_NUMBER") ?: null val gitHash = git("rev-parse", "--short=7", "HEAD").getText().trim() -- val implementationVersion = System.getenv("BUILD_NUMBER") ?: "\"$gitHash\"" +- val implementationVersion = "$mcVersion-${build ?: "DEV"}-$gitHash" + // SparklyPaper start -+ var implementationVersion = System.getenv("BUILD_NUMBER") ?: "\"$gitHash\"" ++ var implementationVersion = "$mcVersion-${build ?: "DEV"}-$gitHash" + if (project.hasProperty("sparklypaperImplementationVersionSuffix")) { + implementationVersion += "/${project.property("sparklypaperImplementationVersionSuffix")}" + } @@ -49,50 +45,8 @@ index bcfe59b6efb628ee1e7f9d60667360d4d885fb6a..fad6e6cbbd1e7ea3bb83374cb7e7a1bf val date = git("show", "-s", "--format=%ci", gitHash).getText().trim() // Paper val gitBranch = git("rev-parse", "--abbrev-ref", "HEAD").getText().trim() // Paper attributes( - "Main-Class" to "org.bukkit.craftbukkit.Main", - "Implementation-Title" to "CraftBukkit", -- "Implementation-Version" to "git-Paper-$implementationVersion", -+ "Implementation-Version" to "git-SparklyPaper-$implementationVersion", // SparklyPaper - "Implementation-Vendor" to date, // Paper - "Specification-Title" to "Bukkit", - "Specification-Version" to project.version, -@@ -150,7 +164,7 @@ fun TaskContainer.registerRunTask( - name: String, - block: JavaExec.() -> Unit - ): TaskProvider = register(name) { -- group = "paper" -+ group = "paperweight" // SparklyPaper - mainClass.set("org.bukkit.craftbukkit.Main") - standardInput = System.`in` - workingDir = rootProject.layout.projectDirectory -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 2dc07e5ef249636e85ad9c78e3729e9e066a8fe8..9a36662c8db97ad66e4d0528fa7651356e412757 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1865,7 +1865,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 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 @@ -116,18 +116,18 @@ index 0000000000000000000000000000000000000000..bc0ec96f91f7c9ab9f9a865a50f69707 + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 73e765b5b1e38dfaafa323cf4e419ba0a5e34705..c03009cc333f72245429f2448b3a2b0605c38615 100644 +index 94a31c8f903eb61eb6d203e8e6fe8fb0beca28b1..40b397c0e0487b4b17edd95075a9572065527b4e 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -112,6 +112,7 @@ import net.minecraft.world.level.storage.PrimaryLevelData; - import net.minecraft.world.level.storage.loot.LootDataManager; +@@ -110,6 +110,7 @@ import net.minecraft.world.level.storage.PlayerDataStorage; + import net.minecraft.world.level.storage.PrimaryLevelData; import net.minecraft.world.level.validation.ContentValidationException; import net.minecraft.world.phys.Vec3; +import net.sparklypower.sparklypaper.configs.SparklyPaperConfigUtils; import org.bukkit.BanList; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -@@ -1054,6 +1055,7 @@ public final class CraftServer implements Server { +@@ -1033,6 +1034,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); @@ -135,7 +135,7 @@ index 73e765b5b1e38dfaafa323cf4e419ba0a5e34705..c03009cc333f72245429f2448b3a2b06 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)) -@@ -1069,6 +1071,7 @@ public final class CraftServer implements Server { +@@ -1048,6 +1050,7 @@ public final class CraftServer implements Server { } } world.spigotConfig.init(); // Spigot @@ -143,7 +143,7 @@ index 73e765b5b1e38dfaafa323cf4e419ba0a5e34705..c03009cc333f72245429f2448b3a2b06 } Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper -@@ -1084,6 +1087,7 @@ public final class CraftServer implements Server { +@@ -1064,6 +1067,7 @@ public final class CraftServer implements Server { this.reloadData(); org.spigotmc.SpigotConfig.registerCommands(); // Spigot io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper @@ -152,10 +152,10 @@ index 73e765b5b1e38dfaafa323cf4e419ba0a5e34705..c03009cc333f72245429f2448b3a2b06 this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index 8d626fadcd4743b6472a2954d2b1b2ec89669814..1349df0a0f59977cb4ddf694b771707a03a70793 100644 +index e02102280ed1dc300191d19bbca8f00e17701753..7ad7af170760878883f3f10f30d28be0bb632383 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java -@@ -174,6 +174,14 @@ public class Main { +@@ -176,6 +176,14 @@ public class Main { .describedAs("Jar file"); // Paper end diff --git a/patches/server/0003-Optimize-entity-coordinate-key.patch b/patches/server/0003-Optimize-entity-coordinate-key.patch index a192ebb..9f04fc4 100644 --- a/patches/server/0003-Optimize-entity-coordinate-key.patch +++ b/patches/server/0003-Optimize-entity-coordinate-key.patch @@ -11,7 +11,7 @@ data is already available in the blockPosition struct, so we use that instead of re-doing the casting. diff --git a/src/main/java/io/papermc/paper/util/MCUtil.java b/src/main/java/io/papermc/paper/util/MCUtil.java -index e028353e0261310afc42ca0454b723d9f1ffc131..2222625a515d9ae6c3e9c92fc4d4a5bf974af5f8 100644 +index 1d6b3fe2ce240af4ede61588795456b046eee6c9..cdcb1bff7913bfe86fed008271016a3175b6df90 100644 --- a/src/main/java/io/papermc/paper/util/MCUtil.java +++ b/src/main/java/io/papermc/paper/util/MCUtil.java @@ -215,7 +215,7 @@ public final class MCUtil { @@ -24,10 +24,10 @@ index e028353e0261310afc42ca0454b723d9f1ffc131..2222625a515d9ae6c3e9c92fc4d4a5bf public static long getCoordinateKey(final ChunkPos pair) { diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index f5a86c0fb1a7a313afc4c56ffc445a7fe7821428..023d1dccc23efbb862c923b925b798ac415d0401 100644 +index 4ee843dfd826772c9157ca421d8fe1f36f814b51..41ce41e92f3722e7ffb3423c90663d7a677bf277 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -309,7 +309,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -311,7 +311,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess public double yo; public double zo; private Vec3 position; diff --git a/patches/server/0004-Rewrite-framed-map-tracker-ticking.patch b/patches/server/0004-Rewrite-framed-map-tracker-ticking.patch index e36483a..8afd12e 100644 --- a/patches/server/0004-Rewrite-framed-map-tracker-ticking.patch +++ b/patches/server/0004-Rewrite-framed-map-tracker-ticking.patch @@ -11,31 +11,29 @@ now is just updating dirty map/decoration data. When no bukkit renderers are added to the map, we also re-use the same packet for all players who are tracking it which avoids a lot of work. diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index 529ab44baaf573b97cf7e89560c548642733188f..7ee0335b02741f6b06d0c697a19faf479db2ae4b 100644 +index a2279262c93408c11f5d2290b48fd794975e8cfe..7392a058bab0eca23cb82392d5b5cc50e8601499 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -111,29 +111,42 @@ public class ServerEntity { +@@ -120,27 +120,40 @@ public class ServerEntity { Entity entity = this.entity; -- if (!this.trackedPlayers.isEmpty() && entity instanceof ItemFrame) { // Paper - Perf: Only tick item frames if players can see it -+ if (!this.trackedPlayers.isEmpty() && entity instanceof ItemFrame frame && frame.cachedMapId != null) { // Paper - Perf: Only tick item frames if players can see it // Paper - ItemFrame entityitemframe = (ItemFrame) entity; - +- if (!this.trackedPlayers.isEmpty() && entity instanceof ItemFrame entityitemframe) { // Paper - Perf: Only tick item frames if players can see it ++ if (!this.trackedPlayers.isEmpty() && entity instanceof ItemFrame entityitemframe && entityitemframe.cachedMapId != null) { // Paper - Perf: Only tick item frames if players can see it // Paper if (true || this.tickCount % 10 == 0) { // CraftBukkit - Moved below, should always enter this block - ItemStack itemstack = entityitemframe.getItem(); + //ItemStack itemstack = entityitemframe.getItem(); // Paper - skip redundant getItem - if (this.level.paperConfig().maps.itemFrameCursorUpdateInterval > 0 && this.tickCount % this.level.paperConfig().maps.itemFrameCursorUpdateInterval == 0 && itemstack.getItem() instanceof MapItem) { // CraftBukkit - Moved this.tickCounter % 10 logic here so item frames do not enter the other blocks // Paper - Make item frame map cursor update interval configurable + if (this.level.paperConfig().maps.itemFrameCursorUpdateInterval > 0 && this.tickCount % this.level.paperConfig().maps.itemFrameCursorUpdateInterval == 0 /*&& itemstack.getItem() instanceof MapItem*/) { // CraftBukkit - Moved this.tickCounter % 10 logic here so item frames do not enter the other blocks // Paper - Make item frame map cursor update interval configurable // Paper - skip redundant getItem - Integer integer = entityitemframe.cachedMapId; // Paper - Perf: Cache map ids on item frames - MapItemSavedData worldmap = MapItem.getSavedData(integer, this.level); + MapId mapid = entityitemframe.cachedMapId; // Paper - Perf: Cache map ids on item frames + MapItemSavedData worldmap = MapItem.getSavedData(mapid, this.level); if (worldmap != null) { + // Paper start - re-use the same update packet when possible + if (!worldmap.hasContextualRenderer) { + // Pass in a "random" player when a non-contextual plugin renderer is added to make sure its called -+ final Packet updatePacket = worldmap.framedUpdatePacket(integer, worldmap.hasPluginRenderer ? com.google.common.collect.Iterables.getFirst(this.trackedPlayers, null).getPlayer() : null); ++ final Packet updatePacket = worldmap.framedUpdatePacket(mapid, worldmap.hasPluginRenderer ? com.google.common.collect.Iterables.getFirst(this.trackedPlayers, null).getPlayer() : null); + + if (updatePacket != null) { + for (ServerPlayerConnection connection : this.trackedPlayers) { @@ -50,9 +48,9 @@ index 529ab44baaf573b97cf7e89560c548642733188f..7ee0335b02741f6b06d0c697a19faf47 ServerPlayer entityplayer = iterator.next().getPlayer(); // CraftBukkit - worldmap.tickCarriedBy(entityplayer, itemstack); -- Packet packet = worldmap.getUpdatePacket(integer, entityplayer); +- Packet packet = worldmap.getUpdatePacket(mapid, entityplayer); + //worldmap.tickCarriedBy(entityplayer, itemstack); // Paper -+ Packet packet = worldmap.framedUpdatePacket(integer, entityplayer); // Paper ++ Packet packet = worldmap.framedUpdatePacket(mapid, entityplayer); // Paper if (packet != null) { entityplayer.connection.send(packet); @@ -62,7 +60,7 @@ index 529ab44baaf573b97cf7e89560c548642733188f..7ee0335b02741f6b06d0c697a19faf47 } } -@@ -372,6 +385,19 @@ public class ServerEntity { +@@ -382,6 +395,19 @@ public class ServerEntity { } } @@ -83,10 +81,10 @@ index 529ab44baaf573b97cf7e89560c548642733188f..7ee0335b02741f6b06d0c697a19faf47 private void sendDirtyEntityData() { diff --git a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -index 80303f9466b8c7097151be313afc9a383693d18a..4ddcda7783750e485e283a7f7df3f52c9bed5c45 100644 +index da0d1c9a1c4ae081bff9ca4230c9a1503885c354..c6f6e3588f7cb966af6d67dcec765b041869baae 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ItemFrame.java -@@ -483,6 +483,16 @@ public class ItemFrame extends HangingEntity { +@@ -461,6 +461,16 @@ public class ItemFrame extends HangingEntity { } this.setItem(ItemStack.fromBukkitCopy(event.getItemStack())); // Paper end - Add PlayerItemFrameChangeEvent @@ -101,13 +99,13 @@ index 80303f9466b8c7097151be313afc9a383693d18a..4ddcda7783750e485e283a7f7df3f52c + } + // Paper end this.gameEvent(GameEvent.BLOCK_CHANGE, player); - if (!player.getAbilities().instabuild) { - itemstack.shrink(1); + itemstack.consume(1, player); + } diff --git a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java -index 45269115e63cfc3bd7dc740a5694e2cc7c35bcb1..ad0c4660dd15a7dc6cf3639223dda5d704f96a4c 100644 +index cf8ae635fce7ea66d4e1ab1dc05575f035fa95ef..6e3eb9a28b6c190acfe37a03efce573da2da2749 100644 --- a/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java +++ b/src/main/java/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java -@@ -67,6 +67,16 @@ public class MapItemSavedData extends SavedData { +@@ -79,6 +79,16 @@ public class MapItemSavedData extends SavedData { private final Map frameMarkers = Maps.newHashMap(); private int trackedDecorationCount; private org.bukkit.craftbukkit.map.RenderData vanillaRender = new org.bukkit.craftbukkit.map.RenderData(); // Paper @@ -124,23 +122,23 @@ index 45269115e63cfc3bd7dc740a5694e2cc7c35bcb1..ad0c4660dd15a7dc6cf3639223dda5d7 // CraftBukkit start public final CraftMapView mapView; -@@ -332,6 +342,7 @@ public class MapItemSavedData extends SavedData { +@@ -351,6 +361,7 @@ public class MapItemSavedData extends SavedData { } this.setDecorationsDirty(); + if (mapicon != null && mapicon.renderOnFrame()) this.dirtyFrameDecorations = true; // Paper } - public static void addTargetDecoration(ItemStack stack, BlockPos pos, String id, MapDecoration.Type type) { -@@ -427,6 +438,7 @@ public class MapItemSavedData extends SavedData { + public static void addTargetDecoration(ItemStack stack, BlockPos pos, String id, Holder decorationType) { +@@ -432,6 +443,7 @@ public class MapItemSavedData extends SavedData { } this.setDecorationsDirty(); -+ if (type.isRenderedOnFrame() || (mapicon1 != null && mapicon.type().isRenderedOnFrame())) this.dirtyFrameDecorations = true; // Paper ++ if (mapicon.renderOnFrame()) this.dirtyFrameDecorations = true; // Paper } } -@@ -440,6 +452,20 @@ public class MapItemSavedData extends SavedData { +@@ -445,6 +457,20 @@ public class MapItemSavedData extends SavedData { public void setColorsDirty(int x, int z) { this.setDirty(); @@ -161,7 +159,7 @@ index 45269115e63cfc3bd7dc740a5694e2cc7c35bcb1..ad0c4660dd15a7dc6cf3639223dda5d7 Iterator iterator = this.carriedBy.iterator(); while (iterator.hasNext()) { -@@ -522,6 +548,7 @@ public class MapItemSavedData extends SavedData { +@@ -527,6 +553,7 @@ public class MapItemSavedData extends SavedData { public void removedFromFrame(BlockPos pos, int id) { this.removeDecoration("frame-" + id); this.frameMarkers.remove(MapFrame.frameId(pos)); @@ -169,20 +167,20 @@ index 45269115e63cfc3bd7dc740a5694e2cc7c35bcb1..ad0c4660dd15a7dc6cf3639223dda5d7 } public boolean updateColor(int x, int z, byte color) { -@@ -579,6 +606,93 @@ public class MapItemSavedData extends SavedData { - return this.trackedDecorationCount >= iconCount; +@@ -584,6 +611,93 @@ public class MapItemSavedData extends SavedData { + return this.trackedDecorationCount >= decorationCount; } + // Paper start -+ public final @Nullable Packet framedUpdatePacket(int id, @Nullable Player player) { ++ public final @Nullable Packet framedUpdatePacket(MapId id, @Nullable Player player) { + return createUpdatePacket(id, player, false); + } + -+ public final @Nullable Packet fullUpdatePacket(int id, @Nullable Player player) { ++ public final @Nullable Packet fullUpdatePacket(MapId id, @Nullable Player player) { + return createUpdatePacket(id, player, true); + } + -+ public final @Nullable Packet createUpdatePacket(int id, @Nullable Player player, boolean full) { ++ public final @Nullable Packet createUpdatePacket(MapId id, @Nullable Player player, boolean full) { + if (!dirtyColorData && !dirtyFrameDecorations && (player == null || server.getCurrentTick() % 5 != 0) && !full) // Periodically send update packets if a renderer is added + return null; + @@ -217,7 +215,7 @@ index 45269115e63cfc3bd7dc740a5694e2cc7c35bcb1..ad0c4660dd15a7dc6cf3639223dda5d7 + + for (final org.bukkit.map.MapCursor cursor : render.cursors) { + if (cursor.isVisible()) { -+ decorations.add(new MapDecoration(MapDecoration.Type.byIcon(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection(), PaperAdventure.asVanilla(cursor.caption()))); // Paper - Adventure ++ decorations.add(new MapDecoration(CraftMapCursor.CraftType.bukkitToMinecraftHolder(cursor.getType()), cursor.getX(), cursor.getY(), cursor.getDirection(), Optional.ofNullable(PaperAdventure.asVanilla(cursor.caption())))); // Paper - Adventure + } + } + } @@ -246,7 +244,7 @@ index 45269115e63cfc3bd7dc740a5694e2cc7c35bcb1..ad0c4660dd15a7dc6cf3639223dda5d7 + return; + + MapFrame mapFrame = new MapFrame(frame.getPos(), frame.getDirection().get2DDataValue() * 90, frame.getId()); -+ this.addDecoration(MapDecoration.Type.FRAME, frame.level(), "frame-" + frame.getId(), frame.getPos().getX(), frame.getPos().getZ(), mapFrame.getRotation(), (Component) null); ++ this.addDecoration(MapDecorationTypes.FRAME, frame.level(), "frame-" + frame.getId(), frame.getPos().getX(), frame.getPos().getZ(), mapFrame.getRotation(), (Component) null); + this.frameMarkers.put(mapFrame.getId(), mapFrame); + } + @@ -264,10 +262,10 @@ index 45269115e63cfc3bd7dc740a5694e2cc7c35bcb1..ad0c4660dd15a7dc6cf3639223dda5d7 // Paper start diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java -index c3266c43a073cb7d7eff10d1a1b15f0a2265b859..4d69e345117556bac2126edc5169ab01eed97377 100644 +index a15cdf64575841edfe30f2b2c522f8fdfe2caae3..ce20060e48226cc1cbe476a404ef6e1f6bdb9137 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java -@@ -108,6 +108,10 @@ public final class CraftMapView implements MapView { +@@ -101,6 +101,10 @@ public final class CraftMapView implements MapView { this.renderers.add(renderer); this.canvases.put(renderer, new HashMap()); renderer.initialize(this); @@ -278,7 +276,7 @@ index c3266c43a073cb7d7eff10d1a1b15f0a2265b859..4d69e345117556bac2126edc5169ab01 } } -@@ -123,6 +127,17 @@ public final class CraftMapView implements MapView { +@@ -116,6 +120,17 @@ public final class CraftMapView implements MapView { } } this.canvases.remove(renderer); diff --git a/patches/server/0005-Skip-distanceToSqr-call-in-ServerEntity-sendChanges-.patch b/patches/server/0005-Skip-distanceToSqr-call-in-ServerEntity-sendChanges-.patch index ce4da52..d248d89 100644 --- a/patches/server/0005-Skip-distanceToSqr-call-in-ServerEntity-sendChanges-.patch +++ b/patches/server/0005-Skip-distanceToSqr-call-in-ServerEntity-sendChanges-.patch @@ -9,10 +9,10 @@ The "distanceToSqr" call is a bit expensive, so avoiding it is pretty nice, arou We could also check if the x,y,z coordinates are equal, but for now, let's just keep the identity check, which also helps us since Minecraft's code does reuse the original delta movement Vec3 object diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index 7ee0335b02741f6b06d0c697a19faf479db2ae4b..056b3dd172a7b8d1bf5ac76d88d373fae0b85a8f 100644 +index 7392a058bab0eca23cb82392d5b5cc50e8601499..072aa9f0cd26602c0251819fd02711078382f9da 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -221,12 +221,14 @@ public class ServerEntity { +@@ -228,12 +228,14 @@ public class ServerEntity { if ((this.trackDelta || this.entity.hasImpulse || this.entity instanceof LivingEntity && ((LivingEntity) this.entity).isFallFlying()) && this.tickCount > 0) { Vec3 vec3d1 = this.entity.getDeltaMovement(); diff --git a/patches/server/0006-Skip-MapItem-update-if-the-map-does-not-have-the-Cra.patch b/patches/server/0006-Skip-MapItem-update-if-the-map-does-not-have-the-Cra.patch index b2a7801..fd2105c 100644 --- a/patches/server/0006-Skip-MapItem-update-if-the-map-does-not-have-the-Cra.patch +++ b/patches/server/0006-Skip-MapItem-update-if-the-map-does-not-have-the-Cra.patch @@ -9,15 +9,15 @@ Optimizes "image in map" maps, without requiring the map to be locked, which som This has the disadvantage that the vanilla map data will never be updated while the CraftMapRenderer is not present, but that's not a huuuge problem for us diff --git a/src/main/java/net/minecraft/world/item/MapItem.java b/src/main/java/net/minecraft/world/item/MapItem.java -index 797415866a7f182d804f6b8e57ceb07a6ac2a20a..fc824f471e5d814cb3eee48516731c2b001fb54e 100644 +index ce461b1a8d7fab87ae28e30205f6fab67f1808b6..7891187eb974c3fb5ebe831ab01db6ab4c5be3bf 100644 --- a/src/main/java/net/minecraft/world/item/MapItem.java +++ b/src/main/java/net/minecraft/world/item/MapItem.java -@@ -324,7 +324,7 @@ public class MapItem extends ComplexItem { - worldmap.tickCarriedBy(entityhuman, stack); +@@ -276,7 +276,7 @@ public class MapItem extends ComplexItem { + mapItemSavedData.tickCarriedBy(player, stack); } -- if (!worldmap.locked && (selected || entity instanceof Player && ((Player) entity).getOffhandItem() == stack)) { -+ if (!worldmap.locked && (!world.sparklyPaperConfig.getSkipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer() || worldmap.mapView.getRenderers().stream().anyMatch(mapRenderer -> mapRenderer.getClass() == org.bukkit.craftbukkit.map.CraftMapRenderer.class)) && (selected || entity instanceof Player && ((Player) entity).getOffhandItem() == stack)) { // SparklyPaper - don't update maps if they don't have the CraftMapRenderer in the render list - this.update(world, entity, worldmap); +- if (!mapItemSavedData.locked && (selected || entity instanceof Player && ((Player)entity).getOffhandItem() == stack)) { ++ if (!mapItemSavedData.locked && (!world.sparklyPaperConfig.getSkipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer() || mapItemSavedData.mapView.getRenderers().stream().anyMatch(mapRenderer -> mapRenderer.getClass() == org.bukkit.craftbukkit.map.CraftMapRenderer.class)) && (selected || entity instanceof Player && ((Player)entity).getOffhandItem() == stack)) { // SparklyPaper - don't update maps if they don't have the CraftMapRenderer in the render list + this.update(world, entity, mapItemSavedData); } - + } diff --git a/patches/server/0009-Skip-EntityScheduler-s-executeTick-checks-if-there-i.patch b/patches/server/0009-Skip-EntityScheduler-s-executeTick-checks-if-there-i.patch index 82e19ff..bea7c09 100644 --- a/patches/server/0009-Skip-EntityScheduler-s-executeTick-checks-if-there-i.patch +++ b/patches/server/0009-Skip-EntityScheduler-s-executeTick-checks-if-there-i.patch @@ -73,10 +73,10 @@ index 62484ebf4550b05182f693a3180bbac5d5fd906d..67800e426445060a8343e27a7452b8d7 throw new IllegalStateException("Ticking retired scheduler"); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 2ed30382cb42c1957e6666a2320a4b013acd3b02..e4c7e4d996285447e78b2c6f3638fae5ffceb013 100644 +index 0ed42fa899721f83b598db05be1b5f321af3614a..1148b3ab0a582fff17f0101516df4b5037b49aba 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -312,7 +312,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 -@@ -1647,6 +1648,18 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { for (final Entity entity : level.getEntityLookup().getAllCopy()) { // Paper - rewrite chunk system if (entity.isRemoved()) { -@@ -1658,6 +1671,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop entitiesWithScheduledTasks = java.util.concurrent.ConcurrentHashMap.newKeySet(); // SparklyPaper - skip EntityScheduler's executeTick checks if there isn't any tasks to be run (concurrent because plugins may schedule tasks async) @@ -18,7 +18,7 @@ index 3aab37ae2ef5a359b09c885f0988aa7be84b0159..ccf79aef050e2ef1ece1631e5bb165ef AtomicReference atomicreference = new AtomicReference(); Thread thread = new io.papermc.paper.util.TickThread(() -> { // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java -index 5b96d1ae4bd8546311e986bc312b1f85883a67f4..ec20b138642b080c9d0050cbdb8c6d593264ecd5 100644 +index 112d2feba5f75a2a873b595617780515945c10e4..d19d6e0082c3dba2581aab4911cfe9d36dc22453 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java @@ -81,6 +81,57 @@ public class CropBlock extends BushBlock implements BonemealableBlock { @@ -89,12 +89,12 @@ index 5b96d1ae4bd8546311e986bc312b1f85883a67f4..ec20b138642b080c9d0050cbdb8c6d59 } diff --git a/src/main/java/net/minecraft/world/level/block/FarmBlock.java b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -index 6e4c852c93f2418ea69e485ed3a10cbe3a6e3bd2..fc2703fcf1639a85518330e4ffcd0c23fd6e118f 100644 +index d59e33e7326489c6d55d316d0130f22235f4c63c..3a2c875f8131fc4a30807a69f426b6acb5deb557 100644 --- a/src/main/java/net/minecraft/world/level/block/FarmBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FarmBlock.java -@@ -92,6 +92,19 @@ public class FarmBlock extends Block { +@@ -93,6 +93,19 @@ public class FarmBlock extends Block { @Override - public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { + protected void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { int i = (Integer) state.getValue(FarmBlock.MOISTURE); + // SparklyPaper start - Blazingly simple farm checks + if (world.sparklyPaperConfig.getBlazinglySimpleFarmChecks().getEnabled()) { @@ -112,7 +112,7 @@ index 6e4c852c93f2418ea69e485ed3a10cbe3a6e3bd2..fc2703fcf1639a85518330e4ffcd0c23 if (i > 0 && world.paperConfig().tickRates.wetFarmland != 1 && (world.paperConfig().tickRates.wetFarmland < 1 || (net.minecraft.server.MinecraftServer.currentTick + pos.hashCode()) % world.paperConfig().tickRates.wetFarmland != 0)) { return; } // Paper - Configurable random tick rates for blocks if (i == 0 && world.paperConfig().tickRates.dryFarmland != 1 && (world.paperConfig().tickRates.dryFarmland < 1 || (net.minecraft.server.MinecraftServer.currentTick + pos.hashCode()) % world.paperConfig().tickRates.dryFarmland != 0)) { return; } // Paper - Configurable random tick rates for blocks -@@ -150,7 +163,7 @@ public class FarmBlock extends Block { +@@ -151,7 +164,7 @@ public class FarmBlock extends Block { return world.getBlockState(pos.above()).is(BlockTags.MAINTAINS_FARMLAND); } @@ -122,12 +122,12 @@ index 6e4c852c93f2418ea69e485ed3a10cbe3a6e3bd2..fc2703fcf1639a85518330e4ffcd0c23 int xOff = pos.getX(); int yOff = pos.getY(); diff --git a/src/main/java/net/minecraft/world/level/block/StemBlock.java b/src/main/java/net/minecraft/world/level/block/StemBlock.java -index 121a872cd750a87b779895687ae1abf5bb77b088..a5d1931dc80febe74601d7a8f2d975c702b357aa 100644 +index 924d80eb41d9a71d1e521c40742557251cf51832..e79ab379ac4ed5cde82a144a83c0326c8b3a6349 100644 --- a/src/main/java/net/minecraft/world/level/block/StemBlock.java +++ b/src/main/java/net/minecraft/world/level/block/StemBlock.java @@ -73,6 +73,56 @@ public class StemBlock extends BushBlock implements BonemealableBlock { @Override - public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { + protected void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { if (world.getRawBrightness(pos, 0) >= 9) { + // SparklyPaper start - Blazingly simple farm checks + if (world.sparklyPaperConfig.getBlazinglySimpleFarmChecks().getEnabled()) { diff --git a/patches/server/0011-Spooky-month-optimizations.patch b/patches/server/0011-Spooky-month-optimizations.patch index 308e30c..05803d8 100644 --- a/patches/server/0011-Spooky-month-optimizations.patch +++ b/patches/server/0011-Spooky-month-optimizations.patch @@ -10,10 +10,10 @@ Caches when Bat's spooky season starts and ends, and when Skeleton and Zombies h Avoids unnecessary date checks, even tho that this shouldn't really improve performance that much... unless you have a lot of bats/zombies/skeletons spawning. diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index ccf79aef050e2ef1ece1631e5bb165ef7fe3bca6..f2edb992729325140d4b2f6f347c3bd8c6394a77 100644 +index 9bcd4069eed4fcfce82cab01a7c116dfe0cd8911..b635a473d2a19bbefc24e86455ec6735b9a8c9cc 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -313,6 +313,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop entitiesWithScheduledTasks = java.util.concurrent.ConcurrentHashMap.newKeySet(); // SparklyPaper - skip EntityScheduler's executeTick checks if there isn't any tasks to be run (concurrent because plugins may schedule tasks async) @@ -22,10 +22,10 @@ index ccf79aef050e2ef1ece1631e5bb165ef7fe3bca6..f2edb992729325140d4b2f6f347c3bd8 public static S spin(Function serverFactory) { AtomicReference atomicreference = new AtomicReference(); diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index d61cf0d713dcdef5a7081142838ee6960593fe95..4c549a2656183e4e4bbaf3f7d5169f3d258e81ce 100644 +index ac8565be2334efe48d5bdc3f58bf60fb9f715da7..859faaf21635caca2a2ab471ac3d4569f04ba69b 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -228,6 +228,10 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -241,6 +241,10 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface } net.sparklypower.sparklypaper.SparklyPaperCommands.INSTANCE.registerCommands(this); // SparklyPaper end @@ -34,13 +34,13 @@ index d61cf0d713dcdef5a7081142838ee6960593fe95..4c549a2656183e4e4bbaf3f7d5169f3d + halloweenManager.waitUntilEpochHasBeenUpdated(); + // SparklyPaper end com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now - io.papermc.paper.brigadier.PaperBrigadierProviderImpl.INSTANCE.getClass(); // Paper - init PaperBrigadierProvider + this.setPvpAllowed(dedicatedserverproperties.pvp); diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 44fa2d4f90389f5526746bd94a2450c03340bd0b..ed4e7673bfcc02d077b61cab5898f4199ada4d03 100644 +index dc27ddf5131e7398a5390a5187261d4c7fb6ccaa..6c8664c9cf75a88007e43348059fad7e5c60f963 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -@@ -231,7 +231,7 @@ public class Bat extends AmbientCreature { +@@ -229,7 +229,7 @@ public class Bat extends AmbientCreature { int i = world.getMaxLocalRawBrightness(pos); byte b0 = 4; @@ -49,7 +49,7 @@ index 44fa2d4f90389f5526746bd94a2450c03340bd0b..ed4e7673bfcc02d077b61cab5898f419 b0 = 7; } else if (random.nextBoolean()) { return false; -@@ -241,6 +241,8 @@ public class Bat extends AmbientCreature { +@@ -239,6 +239,8 @@ public class Bat extends AmbientCreature { } } @@ -58,19 +58,19 @@ index 44fa2d4f90389f5526746bd94a2450c03340bd0b..ed4e7673bfcc02d077b61cab5898f419 private static boolean isHalloween() { LocalDate localdate = LocalDate.now(); int i = localdate.get(ChronoField.DAY_OF_MONTH); -@@ -248,6 +250,7 @@ public class Bat extends AmbientCreature { +@@ -246,6 +248,7 @@ public class Bat extends AmbientCreature { return j == 10 && i >= 20 || j == 11 && i <= 3; } + */ - @Override - protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { + private void setupAnimationStates() { + if (this.isResting()) { diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java -index 586e3e92ccc275446df6dbbff9bf010a37a9aa8f..aaab68a2e5f28b4da0cb5bb7bca42ac08fa9d7bb 100644 +index 0c5fe46d2da113beff3e220843593d616e37d4ca..26b81b6a0111e2149020b8a8f934f2660f59780e 100644 --- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java +++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java -@@ -162,10 +162,12 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo +@@ -154,10 +154,12 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo this.setCanPickUpLoot(this.level().paperConfig().entities.behavior.mobsCanAlwaysPickUpLoot.skeletons || randomsource.nextFloat() < 0.55F * difficulty.getSpecialMultiplier()); // Paper - Add world settings for mobs picking up loot if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { LocalDate localdate = LocalDate.now(); @@ -87,10 +87,10 @@ index 586e3e92ccc275446df6dbbff9bf010a37a9aa8f..aaab68a2e5f28b4da0cb5bb7bca42ac0 this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F; } diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 5c40e994007dbf46ebc12c1e6a6ca90379471b74..5a7919f05f0f4785d3ac98df067a53c53a7d4f73 100644 +index e42dfc62bb179be1ab01b0096c05c6549d38abbc..14292ee06e065b0043f5cb087072e3d0fa11291a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -553,10 +553,11 @@ public class Zombie extends Monster { +@@ -542,10 +542,11 @@ public class Zombie extends Monster { if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { LocalDate localdate = LocalDate.now(); diff --git a/patches/server/0012-Cache-coordinate-key-used-for-nearby-players-when-ti.patch b/patches/server/0012-Cache-coordinate-key-used-for-nearby-players-when-ti.patch index 198d40f..023254b 100644 --- a/patches/server/0012-Cache-coordinate-key-used-for-nearby-players-when-ti.patch +++ b/patches/server/0012-Cache-coordinate-key-used-for-nearby-players-when-ti.patch @@ -30,10 +30,10 @@ index f164256d59b761264876ca0c85f812d101bfd5de..10465a33d90a1e43b9dbd7764c895dd3 final TrackedChunk chunk = this.byChunk.get(CoordinateUtils.getChunkKey(chunkX, chunkZ)); diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 366c0c9b45a819f7f94ebe3e49b8ab7f9edf9ce7..53bce70f5cc14672d41618747d3919429896001f 100644 +index b99f50604bafecbc68835974c9ed0caa91911a40..07fa0b2c43f395a5d9a8f90d5b517e2eb39ce4ba 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -609,7 +609,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -607,7 +607,7 @@ public class ServerChunkCache extends ChunkSource { // Paper start - optimise chunk tick iteration com.destroystokyo.paper.util.maplist.ReferenceList playersNearby @@ -43,10 +43,10 @@ index 366c0c9b45a819f7f94ebe3e49b8ab7f9edf9ce7..53bce70f5cc14672d41618747d391942 continue; } diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java -index f7e5e016a7028a9196e689e950805b0d5b31fe38..d0285843920f78e05ce07b1b0b2d8ce97ec8041e 100644 +index 1aac95b03a9e2e37c24f2a30bcb259c1424e1c78..1ac1af72a71bbf402f0d1633a4b8c9a408917d73 100644 --- a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java +++ b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java -@@ -62,7 +62,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom +@@ -65,7 +65,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom protected final ShortList[] postProcessing; protected volatile boolean unsaved; private volatile boolean isLightCorrect; @@ -55,7 +55,7 @@ index f7e5e016a7028a9196e689e950805b0d5b31fe38..d0285843920f78e05ce07b1b0b2d8ce9 private long inhabitedTime; /** @deprecated */ @Nullable -@@ -136,7 +136,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom +@@ -139,7 +139,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom } // Paper end - rewrite light engine this.locX = pos.x; this.locZ = pos.z; // Paper - reduce need for field lookups diff --git a/patches/server/0013-Optimize-canSee-checks.patch b/patches/server/0013-Optimize-canSee-checks.patch index cdb9b39..64855ac 100644 --- a/patches/server/0013-Optimize-canSee-checks.patch +++ b/patches/server/0013-Optimize-canSee-checks.patch @@ -14,10 +14,10 @@ This seems stupid, but it does seem that it improves the performance a bit, and We also create a "canSee" method tailored for "ChunkMap#updatePlayer()", a method without the equals check (the "updatePlayer()" already checks if the entity is the same entity) because the CraftPlayer's `equals()` check is a *bit* expensive compared to only checking the object's identity, and because the identity has already been check, we don't need to check it twice. diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 5a7278b093e37b95fb005ad5cc3cac90ac36f8fb..6f886a44c4320df46c86f62ce2d6f070a9ca877f 100644 +index 7fb9ba3dadb1eca4a1000ea8cf4d13fed2b7db1e..b1301d9b6467ba8700e4d86a8fe83fa48ec829e0 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java -@@ -1425,7 +1425,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1439,7 +1439,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider // Paper end - Configurable entity tracking range by Y // CraftBukkit start - respect vanish API @@ -27,10 +27,10 @@ index 5a7278b093e37b95fb005ad5cc3cac90ac36f8fb..6f886a44c4320df46c86f62ce2d6f070 } // CraftBukkit end diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 206520f6f20b2e48b1eefdd4edb26510b88e4c92..715d9811a58a9224c72a923e4a74c76bd2b1e5f0 100644 +index 7e6116963d835d4606ef3d93b69d3e44b61288e1..9930168187d5fd50f1567e29dd35b27bc15542e8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -187,7 +187,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -198,7 +198,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private boolean hasPlayedBefore = false; private final ConversationTracker conversationTracker = new ConversationTracker(); private final Set channels = new HashSet(); @@ -39,7 +39,7 @@ index 206520f6f20b2e48b1eefdd4edb26510b88e4c92..715d9811a58a9224c72a923e4a74c76b private final Set unlistedEntities = new HashSet<>(); // Paper - Add Listing API for Player private static final WeakHashMap> pluginWeakReferences = new WeakHashMap<>(); private int hash = 0; -@@ -2141,9 +2141,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2228,9 +2228,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean canSee(org.bukkit.entity.Entity entity) { @@ -54,6 +54,6 @@ index 206520f6f20b2e48b1eefdd4edb26510b88e4c92..715d9811a58a9224c72a923e4a74c76b + } + // SparklyPaper end + - public boolean canSee(UUID uuid) { + public boolean canSeePlayer(UUID uuid) { org.bukkit.entity.Entity entity = this.getServer().getPlayer(uuid); - if (entity == null) { + diff --git a/patches/server/0014-Revert-Fix-MC-117075-Block-entity-unload-lag-spike.patch b/patches/server/0014-Revert-Fix-MC-117075-Block-entity-unload-lag-spike.patch index 843cc92..a0e95b3 100644 --- a/patches/server/0014-Revert-Fix-MC-117075-Block-entity-unload-lag-spike.patch +++ b/patches/server/0014-Revert-Fix-MC-117075-Block-entity-unload-lag-spike.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Revert "Fix MC-117075: Block entity unload lag spike" This reverts commit f3453b204569ea865cc1d1302edb6d125e7f0cb3. diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index a246c6781a16d0cf9097a0589b1287110750a258..d75c9d7766ca1f85821abb8caade5e71be17b51c 100644 +index 5ff499481583d4cb68297b8600d5ea210eceece9..2144ffc34b2fc233f85c8ff56eefefde2a4b16ef 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1285,8 +1285,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1268,8 +1268,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { boolean flag = this.tickRateManager().runsNormally(); int tilesThisCycle = 0; @@ -18,7 +18,7 @@ index a246c6781a16d0cf9097a0589b1287110750a258..d75c9d7766ca1f85821abb8caade5e71 for (tileTickPosition = 0; tileTickPosition < this.blockEntityTickers.size(); tileTickPosition++) { // Paper - Disable tick limiters this.tileTickPosition = (this.tileTickPosition < this.blockEntityTickers.size()) ? this.tileTickPosition : 0; TickingBlockEntity tickingblockentity = (TickingBlockEntity) this.blockEntityTickers.get(this.tileTickPosition); -@@ -1295,7 +1293,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1278,7 +1276,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { if (tickingblockentity.isRemoved()) { // Spigot start tilesThisCycle--; @@ -27,7 +27,7 @@ index a246c6781a16d0cf9097a0589b1287110750a258..d75c9d7766ca1f85821abb8caade5e71 // Spigot end } else if (flag && this.shouldTickBlocksAt(tickingblockentity.getPos())) { tickingblockentity.tick(); -@@ -1306,7 +1304,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1289,7 +1287,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable { // Paper end - execute chunk tasks during tick } } diff --git a/patches/server/0015-Fix-MC-117075-TE-Unload-Lag-Spike.patch b/patches/server/0015-Fix-MC-117075-TE-Unload-Lag-Spike.patch index 98c9ee5..c8a41cd 100644 --- a/patches/server/0015-Fix-MC-117075-TE-Unload-Lag-Spike.patch +++ b/patches/server/0015-Fix-MC-117075-TE-Unload-Lag-Spike.patch @@ -8,10 +8,10 @@ We replaced the `blockEntityTickers` list with a custom list based on fastutil's This is WAY FASTER than using `removeAll` with a list of entries to be removed, because we don't need to calculate the identity of each block entity to be removed, and we can jump directly to where the search should begin, giving a performance boost for small removals (because we don't need to loop thru the entire list to find what element should be removed) and a performance boost for big removals (no need to calculate the identity of each block entity). diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index d75c9d7766ca1f85821abb8caade5e71be17b51c..aa92150c67240ff99b7903072518ed0628c394ae 100644 +index 2144ffc34b2fc233f85c8ff56eefefde2a4b16ef..65d1d84bf4c381492d394bb61055cfa308ce24f7 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -115,7 +115,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -114,7 +114,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public static final int TICKS_PER_DAY = 24000; public static final int MAX_ENTITY_SPAWN_Y = 20000000; public static final int MIN_ENTITY_SPAWN_Y = -20000000; @@ -20,7 +20,7 @@ index d75c9d7766ca1f85821abb8caade5e71be17b51c..aa92150c67240ff99b7903072518ed06 protected final NeighborUpdater neighborUpdater; private final List pendingBlockEntityTickers = Lists.newArrayList(); private boolean tickingBlockEntities; -@@ -1293,7 +1293,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1276,7 +1276,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { if (tickingblockentity.isRemoved()) { // Spigot start tilesThisCycle--; @@ -29,7 +29,7 @@ index d75c9d7766ca1f85821abb8caade5e71be17b51c..aa92150c67240ff99b7903072518ed06 // Spigot end } else if (flag && this.shouldTickBlocksAt(tickingblockentity.getPos())) { tickingblockentity.tick(); -@@ -1304,7 +1304,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1287,7 +1287,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { // Paper end - execute chunk tasks during tick } } diff --git a/patches/server/0016-Optimize-tickBlockEntities.patch b/patches/server/0016-Optimize-tickBlockEntities.patch index 08a3e17..44ac47e 100644 --- a/patches/server/0016-Optimize-tickBlockEntities.patch +++ b/patches/server/0016-Optimize-tickBlockEntities.patch @@ -12,10 +12,10 @@ But here's the thing: We don't care if we have a small performance penalty if th And finally, we also cache the chunk's coordinate key when creating the block entity, which is actually "free" because we just reuse the already cached chunk coordinate key from the chunk! diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 0bccd7c93aaaac1f8441065361546062f3a6b962..fcb7c4937fc7684c0f5d9677af9c276fedb20361 100644 +index 65d1d84bf4c381492d394bb61055cfa308ce24f7..6ed4efec4eda74af9472e6e3fc637251f9c2a21c 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1285,6 +1285,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1268,6 +1268,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable { boolean flag = this.tickRateManager().runsNormally(); int tilesThisCycle = 0; @@ -26,7 +26,7 @@ index 0bccd7c93aaaac1f8441065361546062f3a6b962..fcb7c4937fc7684c0f5d9677af9c276f for (tileTickPosition = 0; tileTickPosition < this.blockEntityTickers.size(); tileTickPosition++) { // Paper - Disable tick limiters this.tileTickPosition = (this.tileTickPosition < this.blockEntityTickers.size()) ? this.tileTickPosition : 0; TickingBlockEntity tickingblockentity = (TickingBlockEntity) this.blockEntityTickers.get(this.tileTickPosition); -@@ -1295,13 +1299,25 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1278,13 +1282,25 @@ public abstract class Level implements LevelAccessor, AutoCloseable { tilesThisCycle--; this.blockEntityTickers.markAsRemoved(this.tileTickPosition); // this.blockEntityTickers.remove(this.tileTickPosition--); // SparklyPaper - optimize block entity removals // Spigot end @@ -65,10 +65,10 @@ index 28e3b73507b988f7234cbf29c4024c88180d0aef..427cf73383155c52bca8fb4b32f43029 + long getChunkCoordinateKey(); // SparklyPaper - optimize tickBlockEntities } diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index 465458e8a7dbaf9afb32709a71c7b2620d1e1fd2..5fc876f1fa9a64eb2fcc33b48c0f8bdf82bd2c24 100644 +index 14ee7b5b9b804bebd4e2a846b238547a28a36035..9af0da6c3a9805542b1b31fb32f0b3bcb1efe1c8 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -73,6 +73,13 @@ public class LevelChunk extends ChunkAccess { +@@ -75,6 +75,13 @@ public class LevelChunk extends ChunkAccess { public String getType() { return ""; } @@ -82,7 +82,7 @@ index 465458e8a7dbaf9afb32709a71c7b2620d1e1fd2..5fc876f1fa9a64eb2fcc33b48c0f8bdf }; private final Map tickersInLevel; public boolean loaded; -@@ -1089,7 +1096,7 @@ public class LevelChunk extends ChunkAccess { +@@ -1087,7 +1094,7 @@ public class LevelChunk extends ChunkAccess { } private TickingBlockEntity createTicker(T blockEntity, BlockEntityTicker blockEntityTicker) { @@ -91,9 +91,9 @@ index 465458e8a7dbaf9afb32709a71c7b2620d1e1fd2..5fc876f1fa9a64eb2fcc33b48c0f8bdf } @FunctionalInterface -@@ -1140,6 +1147,13 @@ public class LevelChunk extends ChunkAccess { +@@ -1138,6 +1145,13 @@ public class LevelChunk extends ChunkAccess { public String toString() { - return this.ticker + " "; + return String.valueOf(this.ticker) + " "; } + + // SparklyPaper start - optimize tickBlockEntities @@ -105,23 +105,23 @@ index 465458e8a7dbaf9afb32709a71c7b2620d1e1fd2..5fc876f1fa9a64eb2fcc33b48c0f8bdf } private class BoundTickingBlockEntity implements TickingBlockEntity { -@@ -1147,10 +1161,12 @@ public class LevelChunk extends ChunkAccess { +@@ -1145,10 +1159,12 @@ public class LevelChunk extends ChunkAccess { private final T blockEntity; private final BlockEntityTicker ticker; private boolean loggedInvalidBlockState; + private final long chunkCoordinateKey; // SparklyPaper - optimize tickBlockEntities -- BoundTickingBlockEntity(BlockEntity tileentity, BlockEntityTicker blockentityticker) { -+ BoundTickingBlockEntity(BlockEntity tileentity, BlockEntityTicker blockentityticker, long chunkCoordinateKey) { // SparklyPaper - optimize tickBlockEntities +- BoundTickingBlockEntity(final BlockEntity tileentity, final BlockEntityTicker blockentityticker) { ++ BoundTickingBlockEntity(final BlockEntity tileentity, final BlockEntityTicker blockentityticker, long chunkCoordinateKey) { // SparklyPaper - optimize tickBlockEntities this.blockEntity = (T) tileentity; // CraftBukkit - decompile error this.ticker = blockentityticker; + this.chunkCoordinateKey = chunkCoordinateKey; // SparklyPaper - optimize tickBlockEntities } @Override -@@ -1218,5 +1234,12 @@ public class LevelChunk extends ChunkAccess { +@@ -1216,5 +1232,12 @@ public class LevelChunk extends ChunkAccess { - return "Level ticker for " + s + "@" + this.getPos(); + return "Level ticker for " + s + "@" + String.valueOf(this.getPos()); } + + // SparklyPaper start - optimize tickBlockEntities diff --git a/patches/server/0017-Track-how-much-MSPT-each-world-used.patch b/patches/server/0017-Track-how-much-MSPT-each-world-used.patch index dbbb140..dafa2ee 100644 --- a/patches/server/0017-Track-how-much-MSPT-each-world-used.patch +++ b/patches/server/0017-Track-how-much-MSPT-each-world-used.patch @@ -56,10 +56,10 @@ index 8b5293b0c696ef21d0101493ffa41b60bf0bc86b..601198a33adb29316b0617d5390d1620 } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index d091b58f74e08ee164a44c74326b2902282bdf2a..3a1802c5b759604782fd7fcdf434a4c310c4455c 100644 +index b635a473d2a19bbefc24e86455ec6735b9a8c9cc..8394e89af7b8aa2638a6ccf711897470484b47ef 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1737,7 +1737,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { @@ -494,7 +463,7 @@ index e2e1273d787536d2fe1bdbbf8af36eb5ac220599..2daeee929592c64a9a12a2b2fe34f516 Location location = CraftLocation.toBukkit(blockposition, worldserver.getWorld()); List blocks = new java.util.ArrayList<>(worldserver.capturedBlockStates.values()); worldserver.capturedBlockStates.clear(); -@@ -899,7 +899,7 @@ public interface DispenseItemBehavior { +@@ -685,7 +685,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D)); @@ -503,7 +472,7 @@ index e2e1273d787536d2fe1bdbbf8af36eb5ac220599..2daeee929592c64a9a12a2b2fe34f516 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -956,7 +956,7 @@ public interface DispenseItemBehavior { +@@ -742,7 +742,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -512,7 +481,7 @@ index e2e1273d787536d2fe1bdbbf8af36eb5ac220599..2daeee929592c64a9a12a2b2fe34f516 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -1005,7 +1005,7 @@ public interface DispenseItemBehavior { +@@ -791,7 +791,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - single item in event BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -521,7 +490,7 @@ index e2e1273d787536d2fe1bdbbf8af36eb5ac220599..2daeee929592c64a9a12a2b2fe34f516 worldserver.getCraftServer().getPluginManager().callEvent(event); } -@@ -1078,7 +1078,7 @@ public interface DispenseItemBehavior { +@@ -864,7 +864,7 @@ public interface DispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack.copyWithCount(1)); // Paper - only single item in event BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); @@ -530,11 +499,33 @@ index e2e1273d787536d2fe1bdbbf8af36eb5ac220599..2daeee929592c64a9a12a2b2fe34f516 worldserver.getCraftServer().getPluginManager().callEvent(event); } +@@ -946,7 +946,7 @@ public interface DispenseItemBehavior { + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) list.get(0).getBukkitEntity()); +- if (!DispenserBlock.eventFired) { ++ if (!DispenserBlock.eventFired.get()) { + world.getCraftServer().getPluginManager().callEvent(event); + } + +diff --git a/src/main/java/net/minecraft/core/dispenser/ProjectileDispenseBehavior.java b/src/main/java/net/minecraft/core/dispenser/ProjectileDispenseBehavior.java +index e37d2d29f3ba67cfe28abe4847a3dca07121f0be..1635ae6106ee751704cbaaddcd7b3ad606fa6ae9 100644 +--- a/src/main/java/net/minecraft/core/dispenser/ProjectileDispenseBehavior.java ++++ b/src/main/java/net/minecraft/core/dispenser/ProjectileDispenseBehavior.java +@@ -45,7 +45,7 @@ public class ProjectileDispenseBehavior extends DefaultDispenseItemBehavior { + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + + BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) enumdirection.getStepX(), (double) enumdirection.getStepY(), (double) enumdirection.getStepZ())); +- if (!DispenserBlock.eventFired) { ++ if (!DispenserBlock.eventFired.get()) { + worldserver.getCraftServer().getPluginManager().callEvent(event); + } + diff --git a/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java -index 8d65cdb013706a932c2c73231108b2810b99e1c7..77741616d3b208c55d84a2246dbaf6cc16180187 100644 +index a024c697a65bbab27408da1d6a75e531d9719b47..8799ad0371c371396605e8ee4c1dd4066e07144a 100644 --- a/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java +++ b/src/main/java/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java -@@ -40,7 +40,7 @@ public class ShearsDispenseItemBehavior extends OptionalDispenseItemBehavior { +@@ -41,7 +41,7 @@ public class ShearsDispenseItemBehavior extends OptionalDispenseItemBehavior { CraftItemStack craftItem = CraftItemStack.asCraftMirror(stack); // Paper - ignore stack size on damageable items BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); @@ -557,10 +548,10 @@ index cb308808906a8cdb127df8284e106e00553473ca..323d41e2bed5e83a26dfe4c88dfce7ed } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index aaf5efbb3bfe8159e92dce551b7aa36c97c3d463..0f1ffeabbac92e7500ed07914dbbf338abfb1eef 100644 +index 8394e89af7b8aa2638a6ccf711897470484b47ef..b4f8e97e837983f68fa01a6dcea9794d84db6cf5 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -314,6 +314,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop entitiesWithScheduledTasks = java.util.concurrent.ConcurrentHashMap.newKeySet(); // SparklyPaper - skip EntityScheduler's executeTick checks if there isn't any tasks to be run (concurrent because plugins may schedule tasks async) public net.sparklypower.sparklypaper.HalloweenManager halloweenManager = new net.sparklypower.sparklypaper.HalloweenManager(); // SparklyPaper - Spooky month optimizations @@ -570,7 +561,16 @@ index aaf5efbb3bfe8159e92dce551b7aa36c97c3d463..0f1ffeabbac92e7500ed07914dbbf338 public static S spin(Function serverFactory) { AtomicReference atomicreference = new AtomicReference(); -@@ -1715,55 +1718,116 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 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 -- -- this.profiler.push(() -> { -- return worldserver + " " + worldserver.dimension().location(); -- }); -- /* Drop global time updates -- if (this.tickCount % 20 == 0) { -- this.profiler.push("timeSync"); -- this.synchronizeTime(worldserver); -- this.profiler.pop(); -- } -- // CraftBukkit end */ + // SparklyPaper start - parallel world ticking + java.util.ArrayDeque> tasks = new java.util.ArrayDeque<>(); -+ // while (iterator.hasNext()) { -+ // ServerLevel worldserver = (ServerLevel) iterator.next(); -+ // worldserver.hasPhysicsEvent = org.bukkit.event.block.BlockPhysicsEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - BlockPhysicsEvent -+ // 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 -+ // -+ // this.profiler.push(() -> { -+ // return worldserver + " " + worldserver.dimension().location(); -+ // }); -+ // /* Drop global time updates -+ // if (this.tickCount % 20 == 0) { -+ // this.profiler.push("timeSync"); -+ // this.synchronizeTime(worldserver); -+ // this.profiler.pop(); -+ // } -+ // // CraftBukkit end */ -+ // -+ // this.profiler.push("tick"); -+ // -+ // try { -+ // worldserver.timings.doTick.startTiming(); // Spigot -+ // long i = Util.getNanos(); // SparklyPaper - track world's MSPT -+ // worldserver.tick(shouldKeepTicking); -+ // // SparklyPaper start - track world's MSPT -+ // long j = Util.getNanos() - i; -+ // -+ // // These are from the "tickServer" function -+ // worldserver.tickTimes5s.add(this.tickCount, j); -+ // worldserver.tickTimes10s.add(this.tickCount, j); -+ // worldserver.tickTimes60s.add(this.tickCount, j); -+ // // SparklyPaper end -+ // // Paper start -+ // for (final io.papermc.paper.chunk.SingleThreadChunkRegionManager regionManager : worldserver.getChunkSource().chunkMap.regionManagers) { -+ // regionManager.recalculateRegions(); -+ // } -+ // // Paper end -+ // worldserver.timings.doTick.stopTiming(); // Spigot -+ // } catch (Throwable throwable) { -+ // CrashReport crashreport = CrashReport.forThrowable(throwable, "Exception ticking world"); -+ // -+ // worldserver.fillReportDetails(crashreport); -+ // throw new ReportedException(crashreport); -+ // } -+ // -+ // this.profiler.pop(); -+ // this.profiler.pop(); -+ // worldserver.explosionDensityCache.clear(); // Paper - Optimize explosions -+ // } + try { + while (iterator.hasNext()) { + ServerLevel worldserver = (ServerLevel) iterator.next(); @@ -654,20 +594,40 @@ index aaf5efbb3bfe8159e92dce551b7aa36c97c3d463..0f1ffeabbac92e7500ed07914dbbf338 + tasks.add( + worldserver.tickExecutor.submit(() -> { + try { -+ io.papermc.paper.util.TickThread.ServerLevelTickThread currentThread = (io.papermc.paper.util.TickThread.ServerLevelTickThread) Thread.currentThread(); ++ io.papermc.paper.util.TickThread.ServerLevelTickThread ++ currentThread = (io.papermc.paper.util.TickThread.ServerLevelTickThread) Thread.currentThread(); + currentThread.currentlyTickingServerLevel = worldserver; + + long i = Util.getNanos(); // SparklyPaper - track world's MSPT + worldserver.tick(shouldKeepTicking); ++ + for (final io.papermc.paper.chunk.SingleThreadChunkRegionManager regionManager : worldserver.getChunkSource().chunkMap.regionManagers) { + regionManager.recalculateRegions(); + +- this.profiler.push(() -> { +- String s = String.valueOf(worldserver); + } + worldserver.explosionDensityCache.clear(); // Paper - Optimize explosions -- this.profiler.push("tick"); +- return s + " " + String.valueOf(worldserver.dimension().location()); +- }); +- /* Drop global time updates +- if (this.tickCount % 20 == 0) { +- this.profiler.push("timeSync"); +- this.synchronizeTime(worldserver); +- this.profiler.pop(); +- } +- // CraftBukkit end */ + // SparklyPaper start - track world's MSPT + long j = Util.getNanos() - i; +- this.profiler.push("tick"); ++ // These are from the "tickServer" function ++ worldserver.tickTimes5s.add(this.tickCount, j); ++ worldserver.tickTimes10s.add(this.tickCount, j); ++ worldserver.tickTimes60s.add(this.tickCount, j); ++ // SparklyPaper end + - try { - worldserver.timings.doTick.startTiming(); // Spigot - long i = Util.getNanos(); // SparklyPaper - track world's MSPT @@ -688,20 +648,16 @@ index aaf5efbb3bfe8159e92dce551b7aa36c97c3d463..0f1ffeabbac92e7500ed07914dbbf338 - worldserver.timings.doTick.stopTiming(); // Spigot - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.forThrowable(throwable, "Exception ticking world"); -+ // These are from the "tickServer" function -+ worldserver.tickTimes5s.add(this.tickCount, j); -+ worldserver.tickTimes10s.add(this.tickCount, j); -+ worldserver.tickTimes60s.add(this.tickCount, j); -+ // SparklyPaper end ++ currentThread.currentlyTickingServerLevel = null; // Reset current ticking level - worldserver.fillReportDetails(crashreport); - throw new ReportedException(crashreport); -+ currentThread.currentlyTickingServerLevel = null; // Reset current ticking level + } catch (Throwable throwable) { + // Spigot Start + CrashReport crashreport; + try { + crashreport = CrashReport.forThrowable(throwable, "Exception ticking world"); ++ + } catch (Throwable t) { + if (throwable instanceof ThreadDeath) { + throw (ThreadDeath) throwable; @@ -713,11 +669,12 @@ index aaf5efbb3bfe8159e92dce551b7aa36c97c3d463..0f1ffeabbac92e7500ed07914dbbf338 + throw new ReportedException(crashreport); + } finally { + serverLevelTickingSemaphore.release(); ++ + } + }, worldserver) + ); } -- + - this.profiler.pop(); - this.profiler.pop(); - worldserver.explosionDensityCache.clear(); // Paper - Optimize explosions @@ -731,8 +688,17 @@ index aaf5efbb3bfe8159e92dce551b7aa36c97c3d463..0f1ffeabbac92e7500ed07914dbbf338 this.isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked this.profiler.popPush("connection"); +@@ -2958,7 +2978,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { return this.getChunk(x, z, leastStatus, create); }, this.mainThreadProcessor).join(); -@@ -300,7 +309,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -294,7 +303,7 @@ public class ServerChunkCache extends ChunkSource { @Nullable @Override public LevelChunk getChunkNow(int chunkX, int chunkZ) { @@ -800,16 +766,16 @@ index 53bce70f5cc14672d41618747d3919429896001f..ec27e20d661ecde3992a4b4366cf19b2 return null; } else { return this.getChunkAtIfLoadedMainThread(chunkX, chunkZ); // Paper - Perf: Optimise getChunkAt calls for loaded chunks -@@ -314,7 +323,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -308,7 +317,7 @@ public class ServerChunkCache extends ChunkSource { } - public CompletableFuture> getChunkFuture(int chunkX, int chunkZ, ChunkStatus leastStatus, boolean create) { + public CompletableFuture> getChunkFuture(int chunkX, int chunkZ, ChunkStatus leastStatus, boolean create) { - boolean flag1 = io.papermc.paper.util.TickThread.isTickThread(); // Paper - rewrite chunk system + boolean flag1 = io.papermc.paper.util.TickThread.isTickThreadFor(level, chunkX, chunkZ); // Paper - rewrite chunk system // SparklyPaper - parallel world ticking CompletableFuture completablefuture; if (flag1) { -@@ -638,7 +647,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -636,7 +645,7 @@ public class ServerChunkCache extends ChunkSource { if (true || this.level.shouldTickBlocksAt(chunkcoordintpair.toLong())) { // Paper - optimise chunk tick iteration this.level.tickChunk(chunk1, l); @@ -819,10 +785,10 @@ index 53bce70f5cc14672d41618747d3919429896001f..ec27e20d661ecde3992a4b4366cf19b2 } } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc64353e334e0e 100644 +index 172e835359ffa12abbc887d12be5af7403dae5ab..6070d3160ac4f43304bebbe87b6b3d9b15d57c07 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -217,6 +217,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -222,6 +222,7 @@ public class ServerLevel extends Level implements WorldGenLevel { private final boolean tickTime; private final RandomSequences randomSequences; public long lastMidTickExecuteFailure; // Paper - execute chunk tasks mid tick @@ -830,7 +796,7 @@ index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc6435 // CraftBukkit start public final LevelStorageSource.LevelStorageAccess convertable; -@@ -704,7 +705,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -709,7 +710,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.uuid = WorldUUID.getUUID(convertable_conversionsession.levelDirectory.path().toFile()); // CraftBukkit end this.players = Lists.newArrayList(); @@ -838,8 +804,8 @@ index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc6435 + this.entityTickList = new EntityTickList(this); this.blockTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded, this.getProfilerSupplier()); this.fluidTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded, this.getProfilerSupplier()); - this.navigatingMobs = new ObjectOpenHashSet(); -@@ -775,6 +776,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + this.pathTypesByPosCache = new PathTypeCache(); +@@ -781,6 +782,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.chunkTaskScheduler = new io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler(this, io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.workerThreads); // Paper - rewrite chunk system this.entityLookup = new io.papermc.paper.chunk.system.entity.EntityLookup(this, new EntityCallbacks()); // Paper - rewrite chunk system @@ -847,7 +813,7 @@ index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc6435 } // Paper start -@@ -1352,7 +1354,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1358,7 +1360,7 @@ public class ServerLevel extends Level implements WorldGenLevel { if (fluid1.is(fluid)) { fluid1.tick(this, pos); } @@ -856,7 +822,7 @@ index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc6435 } -@@ -1362,7 +1364,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1368,7 +1370,7 @@ public class ServerLevel extends Level implements WorldGenLevel { if (iblockdata.is(block)) { iblockdata.tick(this, pos, this.random); } @@ -865,7 +831,7 @@ index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc6435 } -@@ -1380,7 +1382,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1386,7 +1388,7 @@ public class ServerLevel extends Level implements WorldGenLevel { public void tickNonPassenger(Entity entity) { // Paper start - log detailed entity tick information @@ -874,7 +840,7 @@ index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc6435 try { if (currentlyTickingEntity.get() == null) { currentlyTickingEntity.lazySet(entity); -@@ -1668,6 +1670,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1674,6 +1676,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } private void addPlayer(ServerPlayer player) { @@ -882,7 +848,7 @@ index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc6435 Entity entity = (Entity) this.getEntities().get(player.getUUID()); if (entity != null) { -@@ -1681,7 +1684,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1687,7 +1690,7 @@ public class ServerLevel extends Level implements WorldGenLevel { // CraftBukkit start private boolean addEntity(Entity entity, CreatureSpawnEvent.SpawnReason spawnReason) { @@ -891,7 +857,7 @@ index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc6435 entity.generation = false; // Paper - Don't fire sync event during generation; Reset flag if it was added during a ServerLevel generation process // Paper start - extra debug info if (entity.valid) { -@@ -2663,6 +2666,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -2614,6 +2617,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @Override public void close() throws IOException { super.close(); @@ -900,10 +866,10 @@ index de4c3d7ef499d5053b53f71c2a205d77a8312d3f..9d0fdae79cc5808a14c0a4a376dc6435 } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index b3781efbd3edcf102fe1bda5d6149915dc1127c6..afd1d612412f183a5098da555e75719bff34e6bf 100644 +index 6a4637eef14cbd84bbe26ef16f004b8f93367a3d..f359ecb161024ad8a6de6d20e9d6de51d29f1611 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -328,6 +328,7 @@ public class ServerPlayer extends Player { +@@ -345,6 +345,7 @@ public class ServerPlayer extends Player { // Paper start - optimise chunk tick iteration public double lastEntitySpawnRadiusSquared = -1.0; // Paper end - optimise chunk tick iteration @@ -911,7 +877,7 @@ index b3781efbd3edcf102fe1bda5d6149915dc1127c6..afd1d612412f183a5098da555e75719b public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile, ClientInformation clientOptions) { super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); -@@ -717,6 +718,7 @@ public class ServerPlayer extends Player { +@@ -768,6 +769,7 @@ public class ServerPlayer extends Player { @Override public void tick() { @@ -919,7 +885,7 @@ index b3781efbd3edcf102fe1bda5d6149915dc1127c6..afd1d612412f183a5098da555e75719b // CraftBukkit start if (this.joining) { this.joining = false; -@@ -1185,6 +1187,7 @@ public class ServerPlayer extends Player { +@@ -1263,6 +1265,7 @@ public class ServerPlayer extends Player { ResourceKey resourcekey = worldserver1.getTypeKey(); // CraftBukkit if (resourcekey == LevelStem.END && worldserver != null && worldserver.getTypeKey() == LevelStem.OVERWORLD) { // CraftBukkit @@ -927,7 +893,7 @@ index b3781efbd3edcf102fe1bda5d6149915dc1127c6..afd1d612412f183a5098da555e75719b this.isChangingDimension = true; // CraftBukkit - Moved down from above this.unRide(); this.serverLevel().removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); -@@ -1197,6 +1200,10 @@ public class ServerPlayer extends Player { +@@ -1275,6 +1278,10 @@ public class ServerPlayer extends Player { return this; } else { @@ -938,7 +904,7 @@ index b3781efbd3edcf102fe1bda5d6149915dc1127c6..afd1d612412f183a5098da555e75719b // CraftBukkit start /* WorldData worlddata = worldserver.getLevelData(); -@@ -1605,6 +1612,12 @@ public class ServerPlayer extends Player { +@@ -1700,6 +1707,12 @@ public class ServerPlayer extends Player { return OptionalInt.empty(); } else { // CraftBukkit start @@ -951,7 +917,7 @@ index b3781efbd3edcf102fe1bda5d6149915dc1127c6..afd1d612412f183a5098da555e75719b this.containerMenu = container; if (!this.isImmobile()) this.connection.send(new ClientboundOpenScreenPacket(container.containerId, container.getType(), Objects.requireNonNullElseGet(title, container::getTitle))); // Paper - Add titleOverride to InventoryOpenEvent // CraftBukkit end -@@ -1666,6 +1679,11 @@ public class ServerPlayer extends Player { +@@ -1761,6 +1774,11 @@ public class ServerPlayer extends Player { } @Override public void closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) { @@ -964,10 +930,10 @@ index b3781efbd3edcf102fe1bda5d6149915dc1127c6..afd1d612412f183a5098da555e75719b // Paper end - Inventory close reason this.connection.send(new ClientboundContainerClosePacket(this.containerMenu.containerId)); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 1e5f709115007ff19901c0a6c3cf884d9e4d3a6c..5d1b1da365a8a932094dfc3419019df6fd25ed5b 100644 +index a2142930b4d4b05987c90496fb9d733d99040aa0..3a3519403fab0b83aa98f95155c323c9079a8a3b 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -135,7 +135,7 @@ public abstract class PlayerList { +@@ -137,7 +137,7 @@ public abstract class PlayerList { private static final SimpleDateFormat BAN_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); private final MinecraftServer server; public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety @@ -976,7 +942,7 @@ index 1e5f709115007ff19901c0a6c3cf884d9e4d3a6c..5d1b1da365a8a932094dfc3419019df6 private final UserBanList bans; private final IpBanList ipBans; private final ServerOpList ops; -@@ -156,7 +156,7 @@ public abstract class PlayerList { +@@ -158,7 +158,7 @@ public abstract class PlayerList { // CraftBukkit start private CraftServer cserver; @@ -985,7 +951,7 @@ index 1e5f709115007ff19901c0a6c3cf884d9e4d3a6c..5d1b1da365a8a932094dfc3419019df6 public @Nullable String collideRuleTeamName; // Paper - Configurable player collision public PlayerList(MinecraftServer server, LayeredRegistryAccess registryManager, PlayerDataStorage saveHandler, int maxPlayers) { -@@ -180,6 +180,7 @@ public abstract class PlayerList { +@@ -182,6 +182,7 @@ public abstract class PlayerList { abstract public void loadAndSaveFiles(); // Paper - fix converting txt to json file; moved from DedicatedPlayerList constructor public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie clientData) { @@ -993,7 +959,7 @@ index 1e5f709115007ff19901c0a6c3cf884d9e4d3a6c..5d1b1da365a8a932094dfc3419019df6 player.isRealPlayer = true; // Paper player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed GameProfile gameprofile = player.getGameProfile(); -@@ -818,6 +819,8 @@ public abstract class PlayerList { +@@ -817,6 +818,8 @@ public abstract class PlayerList { } public ServerPlayer respawn(ServerPlayer entityplayer, ServerLevel worldserver, boolean flag, Location location, boolean avoidSuffocation, RespawnReason reason, org.bukkit.event.player.PlayerRespawnEvent.RespawnFlag...respawnFlags) { @@ -1002,7 +968,7 @@ index 1e5f709115007ff19901c0a6c3cf884d9e4d3a6c..5d1b1da365a8a932094dfc3419019df6 // Paper end - Expand PlayerRespawnEvent entityplayer.stopRiding(); // CraftBukkit this.players.remove(entityplayer); -@@ -842,6 +845,7 @@ public abstract class PlayerList { +@@ -841,6 +844,7 @@ public abstract class PlayerList { ServerPlayer entityplayer1 = entityplayer; org.bukkit.World fromWorld = entityplayer.getBukkitEntity().getWorld(); entityplayer.wonGame = false; @@ -1011,10 +977,10 @@ index 1e5f709115007ff19901c0a6c3cf884d9e4d3a6c..5d1b1da365a8a932094dfc3419019df6 entityplayer1.connection = entityplayer.connection; diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 3586eaffcb97cbae27bf9882e59e4d581ae294b8..c956f57da4f1b307784ec5c871aa5dae58dbd216 100644 +index 41ce41e92f3722e7ffb3423c90663d7a677bf277..d406db61eb8de56e6d921265a6dc7dce906c7592 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -826,7 +826,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -869,7 +869,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess // CraftBukkit start public void postTick() { // No clean way to break out of ticking once the entity has been copied to a new world, so instead we move the portalling later in the tick cycle @@ -1023,7 +989,7 @@ index 3586eaffcb97cbae27bf9882e59e4d581ae294b8..c956f57da4f1b307784ec5c871aa5dae this.handleNetherPortal(); } } -@@ -3976,6 +3976,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S +@@ -4030,6 +4030,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.teleportPassengers(); this.setYHeadRot(yaw); } else { @@ -1032,7 +998,7 @@ index 3586eaffcb97cbae27bf9882e59e4d581ae294b8..c956f57da4f1b307784ec5c871aa5dae Entity entity = this.getType().create(world); diff --git a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java -index 48f634a7521d31c1e9dfd3cfc83139d428dbd37a..072dfc7355f0fade0b007c800fb633dd4739adb5 100644 +index 32910f677b0522ac8ec513fa0d00b714b52cfae4..864bf4aa487372733da05a58be2c5b61fce18df5 100644 --- a/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/src/main/java/net/minecraft/world/inventory/AbstractContainerMenu.java @@ -102,8 +102,14 @@ public abstract class AbstractContainerMenu { @@ -1051,10 +1017,10 @@ index 48f634a7521d31c1e9dfd3cfc83139d428dbd37a..072dfc7355f0fade0b007c800fb633dd this.remoteSlots = NonNullList.create(); this.remoteDataSlots = new IntArrayList(); diff --git a/src/main/java/net/minecraft/world/item/ArmorItem.java b/src/main/java/net/minecraft/world/item/ArmorItem.java -index 6b81be03f87967124b046708557e05d519aa79e4..f9a4e71f1bdd59256bceb7af92a53e435feea55e 100644 +index 786e4a8700cb84b16dd9b8892a0d1d5803924d81..a54754c4ff7bfb5101d362bc3a8b3073bcc6efd9 100644 --- a/src/main/java/net/minecraft/world/item/ArmorItem.java +++ b/src/main/java/net/minecraft/world/item/ArmorItem.java -@@ -75,7 +75,7 @@ public class ArmorItem extends Item implements Equipable { +@@ -77,7 +77,7 @@ public class ArmorItem extends Item implements Equipable { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseArmorEvent event = new BlockDispenseArmorEvent(block, craftItem.clone(), (org.bukkit.craftbukkit.entity.CraftLivingEntity) entityliving.getBukkitEntity()); @@ -1064,10 +1030,10 @@ index 6b81be03f87967124b046708557e05d519aa79e4..f9a4e71f1bdd59256bceb7af92a53e43 } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 1ad126d992d95062a3db08374db7a927f23a0cac..a75fa6301d597b5f295ea8ba82ce011dda159d16 100644 +index 58c38bc4361ddf24716f326b0c6fc626d434756e..45fc0a8c20eb549d51a7dc90e64bff59a8617fa3 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -400,8 +400,8 @@ public final class ItemStack { +@@ -421,8 +421,8 @@ public final class ItemStack implements DataComponentHolder { if (enuminteractionresult.consumesAction() && world.captureTreeGeneration && world.capturedBlockStates.size() > 0) { world.captureTreeGeneration = false; Location location = CraftLocation.toBukkit(blockposition, world.getWorld()); @@ -1079,10 +1045,10 @@ index 1ad126d992d95062a3db08374db7a927f23a0cac..a75fa6301d597b5f295ea8ba82ce011d world.capturedBlockStates.clear(); StructureGrowEvent structureEvent = null; diff --git a/src/main/java/net/minecraft/world/item/MinecartItem.java b/src/main/java/net/minecraft/world/item/MinecartItem.java -index 3aa73cd44aa8c86b78c35bc1788e4f83018c49ed..eac9b4148d0951f7c54ce4ad8ab4d97eb5f74578 100644 +index d524fcc191cb95d6ec7f12ae7fceeb8077bb08fc..451e5719613fc31bacf49c37978d4e49ea2dfad5 100644 --- a/src/main/java/net/minecraft/world/item/MinecartItem.java +++ b/src/main/java/net/minecraft/world/item/MinecartItem.java -@@ -70,7 +70,7 @@ public class MinecartItem extends Item { +@@ -71,7 +71,7 @@ public class MinecartItem extends Item { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); BlockDispenseEvent event = new BlockDispenseEvent(block2, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); @@ -1092,7 +1058,7 @@ index 3aa73cd44aa8c86b78c35bc1788e4f83018c49ed..eac9b4148d0951f7c54ce4ad8ab4d97e } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994aa3ef206 100644 +index 6ed4efec4eda74af9472e6e3fc637251f9c2a21c..b51b3ae0774229d3b31471860b3a522ffdb4f5a2 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -10,6 +10,8 @@ import java.util.function.Consumer; @@ -1104,7 +1070,7 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; import net.minecraft.ReportedException; -@@ -174,6 +176,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -172,6 +174,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray public net.sparklypower.sparklypaper.configs.SparklyPaperWorldConfig sparklyPaperConfig; // SparklyPaper @@ -1112,7 +1078,7 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; -@@ -829,7 +832,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -814,7 +817,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public final LevelChunk getChunk(int chunkX, int chunkZ) { // Paper - final to help inline // Paper start - Perf: make sure loaded chunks get the inlined variant of this function net.minecraft.server.level.ServerChunkCache cps = ((ServerLevel)this).getChunkSource(); @@ -1121,7 +1087,7 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 LevelChunk ifLoaded = cps.getChunkAtIfLoadedMainThread(chunkX, chunkZ); if (ifLoaded != null) { return ifLoaded; -@@ -913,6 +916,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -898,6 +901,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Override public boolean setBlock(BlockPos pos, BlockState state, int flags, int maxUpdateDepth) { @@ -1129,7 +1095,7 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 // CraftBukkit start - tree generation if (this.captureTreeGeneration) { // Paper start - Protect Bedrock and End Portal/Frames from being destroyed -@@ -1314,7 +1318,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1297,7 +1301,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { tickingblockentity.tick(); // Paper start - execute chunk tasks during tick if ((this.tileTickPosition & 7) == 0) { @@ -1138,7 +1104,7 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 } // Paper end - execute chunk tasks during tick } // SparklyPaper end -@@ -1331,7 +1335,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1314,7 +1318,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public void guardEntityTick(Consumer tickConsumer, T entity) { try { tickConsumer.accept(entity); @@ -1147,7 +1113,7 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 } catch (Throwable throwable) { if (throwable instanceof ThreadDeath) throw throwable; // Paper // Paper start - Prevent block entity and entity crashes -@@ -1438,6 +1442,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1426,6 +1430,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Nullable public BlockEntity getBlockEntity(BlockPos blockposition, boolean validate) { @@ -1155,7 +1121,7 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 // Paper start - Perf: Optimize capturedTileEntities lookup net.minecraft.world.level.block.entity.BlockEntity blockEntity; if (!this.capturedTileEntities.isEmpty() && (blockEntity = this.capturedTileEntities.get(blockposition)) != null) { -@@ -1445,10 +1450,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1433,10 +1438,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } // Paper end - Perf: Optimize capturedTileEntities lookup // CraftBukkit end @@ -1168,7 +1134,7 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 BlockPos blockposition = blockEntity.getBlockPos(); if (!this.isOutsideBuildHeight(blockposition)) { -@@ -1534,6 +1540,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1522,6 +1528,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Override public List getEntities(@Nullable Entity except, AABB box, Predicate predicate) { @@ -1176,7 +1142,7 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 this.getProfiler().incrementCounter("getEntities"); List list = Lists.newArrayList(); ((ServerLevel)this).getEntityLookup().getEntities(except, box, list, predicate); // Paper - optimise this call -@@ -1800,8 +1807,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1784,8 +1791,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public final BlockPos.MutableBlockPos getRandomBlockPosition(int x, int y, int z, int l, BlockPos.MutableBlockPos out) { // Paper end @@ -1187,11 +1153,11 @@ index fcb7c4937fc7684c0f5d9677af9c276fedb20361..6e08d81482de0564981a8f354d576994 out.set(x + (i1 & 15), y + (i1 >> 16 & l), z + (i1 >> 8 & 15)); // Paper - change to setValues call return out; // Paper diff --git a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java -index 644e64850479cea20a98b8a65503ccf3a34fd32a..9013711498a96d8d680e62ee2a3b7ac91c355ab8 100644 +index f6edfea463b3725d3a79aca38825e86dbf82175c..c62d576a94308dece71eaef451280456dd87861c 100644 --- a/src/main/java/net/minecraft/world/level/block/DispenserBlock.java +++ b/src/main/java/net/minecraft/world/level/block/DispenserBlock.java -@@ -49,7 +49,8 @@ public class DispenserBlock extends BaseEntityBlock { - object2objectopenhashmap.defaultReturnValue(new DefaultDispenseItemBehavior()); +@@ -51,7 +51,8 @@ public class DispenserBlock extends BaseEntityBlock { + object2objectopenhashmap.defaultReturnValue(DispenserBlock.DEFAULT_BEHAVIOR); }); private static final int TRIGGER_DURATION = 4; - public static boolean eventFired = false; // CraftBukkit @@ -1200,7 +1166,7 @@ index 644e64850479cea20a98b8a65503ccf3a34fd32a..9013711498a96d8d680e62ee2a3b7ac9 @Override public MapCodec codec() { -@@ -105,7 +106,7 @@ public class DispenserBlock extends BaseEntityBlock { +@@ -111,7 +112,7 @@ public class DispenserBlock extends BaseEntityBlock { if (idispensebehavior != DispenseItemBehavior.NOOP) { if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockPreDispenseEvent(world, pos, itemstack, i)) return; // Paper - Add BlockPreDispenseEvent @@ -1210,7 +1176,7 @@ index 644e64850479cea20a98b8a65503ccf3a34fd32a..9013711498a96d8d680e62ee2a3b7ac9 } diff --git a/src/main/java/net/minecraft/world/level/block/FungusBlock.java b/src/main/java/net/minecraft/world/level/block/FungusBlock.java -index 50d7235cf2ef036451db708c45a063d037051ae9..ff9b3d7cbf4ffcc81b4837da0c4eb0d54a52508b 100644 +index 454f95ba814b375e97189430b498c0e7486fbd94..8f5dc8a06a4d58cbc5f5ee27e0d0b384405e2c94 100644 --- a/src/main/java/net/minecraft/world/level/block/FungusBlock.java +++ b/src/main/java/net/minecraft/world/level/block/FungusBlock.java @@ -76,9 +76,9 @@ public class FungusBlock extends BushBlock implements BonemealableBlock { @@ -1226,7 +1192,7 @@ index 50d7235cf2ef036451db708c45a063d037051ae9..ff9b3d7cbf4ffcc81b4837da0c4eb0d5 // CraftBukkit end ((ConfiguredFeature) holder.value()).place(world, world.getChunkSource().getGenerator(), random, pos); diff --git a/src/main/java/net/minecraft/world/level/block/MushroomBlock.java b/src/main/java/net/minecraft/world/level/block/MushroomBlock.java -index 1f27ae8abd5891a0b8057b454f2210b088b4e95a..7549cdc77c7738d3aba753c51a11e5a6997bd1d8 100644 +index 1172d85c5c26ab2142343d91149766e5993cb36a..54a5533761329237c3bf4304e2b0b652e62f5877 100644 --- a/src/main/java/net/minecraft/world/level/block/MushroomBlock.java +++ b/src/main/java/net/minecraft/world/level/block/MushroomBlock.java @@ -105,7 +105,7 @@ public class MushroomBlock extends BushBlock implements BonemealableBlock { @@ -1239,10 +1205,10 @@ index 1f27ae8abd5891a0b8057b454f2210b088b4e95a..7549cdc77c7738d3aba753c51a11e5a6 return true; } else { diff --git a/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java b/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java -index b5a71fd4e2f55bf036c2c697da5d50cc90fc657c..16759699834b6318927538e6d46e2f300156fc4f 100644 +index c131734cad123a35456d18f8a161f77a4ac9ac99..b55be930980864ac7d8fdc44384b0106a6ca3619 100644 --- a/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java +++ b/src/main/java/net/minecraft/world/level/block/RedStoneWireBlock.java -@@ -261,7 +261,7 @@ public class RedStoneWireBlock extends Block { +@@ -260,7 +260,7 @@ public class RedStoneWireBlock extends Block { // Paper start - Optimize redstone (Eigencraft) // The bulk of the new functionality is found in RedstoneWireTurbo.java @@ -1251,7 +1217,7 @@ index b5a71fd4e2f55bf036c2c697da5d50cc90fc657c..16759699834b6318927538e6d46e2f30 /* * Modified version of pre-existing updateSurroundingRedstone, which is called from -@@ -270,7 +270,7 @@ public class RedStoneWireBlock extends Block { +@@ -269,7 +269,7 @@ public class RedStoneWireBlock extends Block { */ private void updateSurroundingRedstone(Level worldIn, BlockPos pos, BlockState state, BlockPos source) { if (worldIn.paperConfig().misc.redstoneImplementation == io.papermc.paper.configuration.WorldConfiguration.Misc.RedstoneImplementation.EIGENCRAFT) { @@ -1260,7 +1226,7 @@ index b5a71fd4e2f55bf036c2c697da5d50cc90fc657c..16759699834b6318927538e6d46e2f30 return; } updatePowerStrength(worldIn, pos, state); -@@ -361,7 +361,7 @@ public class RedStoneWireBlock extends Block { +@@ -360,7 +360,7 @@ public class RedStoneWireBlock extends Block { // [Space Walker] suppress shape updates and emit those manually to // bypass the new neighbor update stack. if (worldIn.setBlock(pos1, state, Block.UPDATE_KNOWN_SHAPE | Block.UPDATE_CLIENTS)) @@ -1270,7 +1236,7 @@ index b5a71fd4e2f55bf036c2c697da5d50cc90fc657c..16759699834b6318927538e6d46e2f30 } diff --git a/src/main/java/net/minecraft/world/level/block/SaplingBlock.java b/src/main/java/net/minecraft/world/level/block/SaplingBlock.java -index 3ff0d08e4964aae82d8e51d3b8bf9aa002096f81..069f669a31b8ac5b90341c7ef066b3a32f75fc3c 100644 +index d262a5a6da57ef9ba9a6fe0dfbc88f577105e74f..15db3fb971a944e856b3cde86035d290673c0c1a 100644 --- a/src/main/java/net/minecraft/world/level/block/SaplingBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SaplingBlock.java @@ -35,7 +35,7 @@ public class SaplingBlock extends BushBlock implements BonemealableBlock { @@ -1294,10 +1260,10 @@ index 3ff0d08e4964aae82d8e51d3b8bf9aa002096f81..069f669a31b8ac5b90341c7ef066b3a3 java.util.List blocks = new java.util.ArrayList<>(world.capturedBlockStates.values()); world.capturedBlockStates.clear(); diff --git a/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java -index b8b4d74076fa5ed6eb3b2045384db77e165931b2..331c156c915d47fae67003bd650738ea00492bd3 100644 +index 15fd1fe1b55b6421d2c09e8385c9f69fa0152e56..0b6918cbeb39c50efc550b9c46e0da9a65e45a98 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java -@@ -78,6 +78,12 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co +@@ -82,6 +82,12 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co return canUnlock(player, lock, containerName, null); } public static boolean canUnlock(Player player, LockCode lock, Component containerName, @Nullable BlockEntity blockEntity) { @@ -1311,10 +1277,10 @@ index b8b4d74076fa5ed6eb3b2045384db77e165931b2..331c156c915d47fae67003bd650738ea final org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(blockEntity.getLevel(), blockEntity.getBlockPos()); net.kyori.adventure.text.Component lockedMessage = net.kyori.adventure.text.Component.translatable("container.isLocked", io.papermc.paper.adventure.PaperAdventure.asAdventure(containerName)); diff --git a/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java -index 83481539e058e5f428d9951e409fed62ef159e5c..c4165376eda073add2a267b737a676123e63a197 100644 +index 81dd0aa6a90fd9dda9e7752f85b9cf4568e3b575..951bf47de0397b44cbe6a2c00a6675608dbdc122 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java -@@ -43,9 +43,9 @@ public class SculkCatalystBlockEntity extends BlockEntity implements GameEventLi +@@ -45,9 +45,9 @@ public class SculkCatalystBlockEntity extends BlockEntity implements GameEventLi // Paper end - Fix NPE in SculkBloomEvent world access public static void serverTick(Level world, BlockPos pos, BlockState state, SculkCatalystBlockEntity blockEntity) { @@ -1327,10 +1293,10 @@ index 83481539e058e5f428d9951e409fed62ef159e5c..c4165376eda073add2a267b737a67612 @Override diff --git a/src/main/java/net/minecraft/world/level/block/grower/TreeGrower.java b/src/main/java/net/minecraft/world/level/block/grower/TreeGrower.java -index 8cb822fed0cda4268f288feae1079a3dc4dc103e..1bac955a0b734689cc66b1a61e58fcde4cc3f15b 100644 +index 5803a6731d1d35afc3df316546519fa0d423af6e..e0af7ef398c1315575108d8313127b19df38dfa9 100644 --- a/src/main/java/net/minecraft/world/level/block/grower/TreeGrower.java +++ b/src/main/java/net/minecraft/world/level/block/grower/TreeGrower.java -@@ -175,51 +175,53 @@ public final class TreeGrower { +@@ -174,51 +174,53 @@ public final class TreeGrower { // CraftBukkit start private void setTreeType(Holder> holder) { ResourceKey> worldgentreeabstract = holder.unwrapKey().get(); @@ -1406,7 +1372,7 @@ index 8cb822fed0cda4268f288feae1079a3dc4dc103e..1bac955a0b734689cc66b1a61e58fcde // CraftBukkit end diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index 5fc876f1fa9a64eb2fcc33b48c0f8bdf82bd2c24..ba88eca71b57b20666c02e69757a5287108ba99b 100644 +index 9af0da6c3a9805542b1b31fb32f0b3bcb1efe1c8..20a30a79f9412746a1b727730ddf3975affb25a0 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java @@ -419,6 +419,7 @@ public class LevelChunk extends ChunkAccess { @@ -1460,10 +1426,10 @@ index 83a39f900551e39d5af6f17a339a386ddee4feef..1f3ae0cc95a7e9ca9380493315ace4e1 // To ensure nothing weird happens with dimension travelling, do not iterate over new entries... // (by dfl iterator() is configured to not iterate over new entries) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 01797d9791f19dfda4b168218eadeaae97f11eab..b5e4413aae97e5c103c88c5d61347199974e1168 100644 +index f2b20ed5063a293f0b464548f590d652170cd1d8..bc4d4e8e7accaf8edfbb6a6c0d1cb37d8e2d0c31 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -441,7 +441,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -449,7 +449,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { } private boolean unloadChunk0(int x, int z, boolean save) { @@ -1472,7 +1438,7 @@ index 01797d9791f19dfda4b168218eadeaae97f11eab..b5e4413aae97e5c103c88c5d61347199 if (!this.isChunkLoaded(x, z)) { return true; } -@@ -456,7 +456,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -464,7 +464,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean regenerateChunk(int x, int z) { @@ -1481,7 +1447,7 @@ index 01797d9791f19dfda4b168218eadeaae97f11eab..b5e4413aae97e5c103c88c5d61347199 warnUnsafeChunk("regenerating a faraway chunk", x, z); // Paper // Paper start - implement regenerateChunk method final ServerLevel serverLevel = this.world; -@@ -519,6 +519,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -529,6 +529,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean refreshChunk(int x, int z) { @@ -1489,7 +1455,7 @@ index 01797d9791f19dfda4b168218eadeaae97f11eab..b5e4413aae97e5c103c88c5d61347199 ChunkHolder playerChunk = this.world.getChunkSource().chunkMap.getVisibleChunkIfPresent(ChunkPos.asLong(x, z)); if (playerChunk == null) return false; -@@ -554,7 +555,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -564,7 +565,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean loadChunk(int x, int z, boolean generate) { @@ -1498,7 +1464,7 @@ index 01797d9791f19dfda4b168218eadeaae97f11eab..b5e4413aae97e5c103c88c5d61347199 warnUnsafeChunk("loading a faraway chunk", x, z); // Paper // Paper start - Optimize this method ChunkPos chunkPos = new ChunkPos(x, z); -@@ -833,6 +834,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -843,6 +844,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { @@ -1506,13 +1472,15 @@ index 01797d9791f19dfda4b168218eadeaae97f11eab..b5e4413aae97e5c103c88c5d61347199 this.world.captureTreeGeneration = true; this.world.captureBlockStates = true; boolean grownTree = this.generateTree(loc, type); -@@ -943,11 +945,13 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -953,6 +955,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source) { + io.papermc.paper.util.TickThread.ensureTickThread(this.world, x, z, "Cannot create explosion asynchronously"); // SparklyPaper - parallel world ticking (additional concurrency issues logs) - return !this.world.explode(source == null ? null : ((CraftEntity) source).getHandle(), x, y, z, power, setFire, breakBlocks ? net.minecraft.world.level.Level.ExplosionInteraction.MOB : net.minecraft.world.level.Level.ExplosionInteraction.NONE).wasCanceled; - } + net.minecraft.world.level.Level.ExplosionInteraction explosionType; + if (!breakBlocks) { + explosionType = net.minecraft.world.level.Level.ExplosionInteraction.NONE; // Don't break blocks +@@ -967,6 +970,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start @Override public boolean createExplosion(Entity source, Location loc, float power, boolean setFire, boolean breakBlocks) { @@ -1520,7 +1488,7 @@ index 01797d9791f19dfda4b168218eadeaae97f11eab..b5e4413aae97e5c103c88c5d61347199 return !world.explode(source != null ? ((org.bukkit.craftbukkit.entity.CraftEntity) source).getHandle() : null, loc.getX(), loc.getY(), loc.getZ(), power, setFire, breakBlocks ? net.minecraft.world.level.Level.ExplosionInteraction.MOB : net.minecraft.world.level.Level.ExplosionInteraction.NONE).wasCanceled; } // Paper end -@@ -1024,6 +1028,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1043,6 +1047,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getHighestBlockYAt(int x, int z, org.bukkit.HeightMap heightMap) { @@ -1528,7 +1496,7 @@ index 01797d9791f19dfda4b168218eadeaae97f11eab..b5e4413aae97e5c103c88c5d61347199 warnUnsafeChunk("getting a faraway chunk", x >> 4, z >> 4); // Paper // Transient load for this tick return this.world.getChunk(x >> 4, z >> 4).getHeight(CraftHeightMap.toNMS(heightMap), x, z); -@@ -1054,6 +1059,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1073,6 +1078,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void setBiome(int x, int y, int z, Holder bb) { BlockPos pos = new BlockPos(x, 0, z); @@ -1536,15 +1504,15 @@ index 01797d9791f19dfda4b168218eadeaae97f11eab..b5e4413aae97e5c103c88c5d61347199 if (this.world.hasChunkAt(pos)) { net.minecraft.world.level.chunk.LevelChunk chunk = this.world.getChunkAt(pos); -@@ -2359,6 +2365,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2367,6 +2373,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public void sendGameEvent(Entity sourceEntity, org.bukkit.GameEvent gameEvent, Vector position) { + io.papermc.paper.util.TickThread.ensureTickThread(this.world, position.getX(), position.getZ(), "Cannot send game event asynchronously"); // SparklyPaper - parallel world ticking (additional concurrency issues logs) - getHandle().gameEvent(sourceEntity != null ? ((CraftEntity) sourceEntity).getHandle(): null, net.minecraft.core.registries.BuiltInRegistries.GAME_EVENT.get(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(gameEvent.getKey())), org.bukkit.craftbukkit.util.CraftVector.toBlockPos(position)); + getHandle().gameEvent(sourceEntity != null ? ((CraftEntity) sourceEntity).getHandle(): null, net.minecraft.core.registries.BuiltInRegistries.GAME_EVENT.getHolder(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(gameEvent.getKey())).orElseThrow(), org.bukkit.craftbukkit.util.CraftVector.toBlockPos(position)); } // Paper end -@@ -2479,7 +2486,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -2495,7 +2502,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { // Paper start public java.util.concurrent.CompletableFuture getChunkAtAsync(int x, int z, boolean gen, boolean urgent) { warnUnsafeChunk("getting a faraway chunk async", x, z); // Paper @@ -1724,10 +1692,10 @@ index ac11f18690434922179b61ffcc3036dea025b0cb..f6470c32af48f73c2668d2014e736d82 this.getNMS().tick(level, this.position, level.random); } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java -index 7cd0fae59c497861063827eda4243cc6c11e7cff..8d2f84442b8872224a0b3701dbd9876f54890efb 100644 +index 2c61e8d5bbab59c691f4cb003041e7e50e406b85..42404dd4566bda457cbad31f31c8ef2624cc235a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java -@@ -18,7 +18,7 @@ public abstract class CraftBlockEntityState extends Craft +@@ -25,7 +25,7 @@ public abstract class CraftBlockEntityState extends Craft private final T tileEntity; private final T snapshot; public boolean snapshotDisabled; // Paper @@ -1736,7 +1704,7 @@ index 7cd0fae59c497861063827eda4243cc6c11e7cff..8d2f84442b8872224a0b3701dbd9876f public CraftBlockEntityState(World world, T tileEntity) { super(world, tileEntity.getBlockPos(), tileEntity.getBlockState()); -@@ -27,8 +27,8 @@ public abstract class CraftBlockEntityState extends Craft +@@ -34,8 +34,8 @@ public abstract class CraftBlockEntityState extends Craft try { // Paper - Show blockstate location if we failed to read it // Paper start @@ -1748,10 +1716,10 @@ index 7cd0fae59c497861063827eda4243cc6c11e7cff..8d2f84442b8872224a0b3701dbd9876f } else { this.snapshot = this.createSnapshot(tileEntity); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -index 2cfaa59a0bb6b5253b5a8dcc38ae65e0f085fd3f..d7bcf51c68b6fa03a136e4a6472b1b1cc2dae045 100644 +index fa63a6cfcfcc4eee4503a82d85333c139c8c8b2b..1f784235d3471acbf0a3ffe3ab551d7fd899e9ef 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java -@@ -210,6 +210,12 @@ public class CraftBlockState implements BlockState { +@@ -215,6 +215,12 @@ public class CraftBlockState implements BlockState { LevelAccessor access = this.getWorldHandle(); CraftBlock block = this.getBlock(); @@ -1764,7 +1732,7 @@ index 2cfaa59a0bb6b5253b5a8dcc38ae65e0f085fd3f..d7bcf51c68b6fa03a136e4a6472b1b1c if (block.getType() != this.getType()) { if (!force) { return false; -@@ -340,6 +346,7 @@ public class CraftBlockState implements BlockState { +@@ -350,6 +356,7 @@ public class CraftBlockState implements BlockState { @Override public java.util.Collection getDrops(org.bukkit.inventory.ItemStack item, org.bukkit.entity.Entity entity) { @@ -1773,10 +1741,10 @@ index 2cfaa59a0bb6b5253b5a8dcc38ae65e0f085fd3f..d7bcf51c68b6fa03a136e4a6472b1b1c net.minecraft.world.item.ItemStack nms = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(item); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java -index 8afc396c162d928902a9d9beb9f039b06630f755..4cde4be86dc03ebbfb5c12a910acbf9978fd42d4 100644 +index b7ff7af2513204b151340538d50a65c850bdb75f..45f9b2594e449926d7f00f64bf12fef2ea0a1393 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java -@@ -242,8 +242,8 @@ public final class CraftBlockStates { +@@ -247,8 +247,8 @@ public final class CraftBlockStates { net.minecraft.world.level.block.state.BlockState blockData = craftBlock.getNMS(); BlockEntity tileEntity = craftBlock.getHandle().getBlockEntity(blockPosition); // Paper start - block state snapshots @@ -1787,7 +1755,7 @@ index 8afc396c162d928902a9d9beb9f039b06630f755..4cde4be86dc03ebbfb5c12a910acbf99 try { // Paper end CraftBlockState blockState = CraftBlockStates.getBlockState(world, blockPosition, blockData, tileEntity); -@@ -251,7 +251,7 @@ public final class CraftBlockStates { +@@ -256,7 +256,7 @@ public final class CraftBlockStates { return blockState; // Paper start } finally { @@ -1797,10 +1765,10 @@ index 8afc396c162d928902a9d9beb9f039b06630f755..4cde4be86dc03ebbfb5c12a910acbf99 // Paper end } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index c0823c612de9dc2a64cc797f061eef25c5f31359..a32d6756e62f6b6d7d3412f9773bd9639dad5c3e 100644 +index 1a737167757891794b40575a5db48b0667e23a6b..bc8ff1ac0141185ef8531938dfefe95b9aa88bcd 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -943,7 +943,7 @@ public class CraftEventFactory { +@@ -942,7 +942,7 @@ public class CraftEventFactory { return CraftEventFactory.handleBlockSpreadEvent(world, source, target, block, 2); } @@ -1809,7 +1777,7 @@ index c0823c612de9dc2a64cc797f061eef25c5f31359..a32d6756e62f6b6d7d3412f9773bd963 public static boolean handleBlockSpreadEvent(LevelAccessor world, BlockPos source, BlockPos target, net.minecraft.world.level.block.state.BlockState block, int flag) { // Suppress during worldgen -@@ -955,7 +955,7 @@ public class CraftEventFactory { +@@ -954,7 +954,7 @@ public class CraftEventFactory { CraftBlockState state = CraftBlockStates.getBlockState(world, target, flag); state.setData(block); @@ -1818,7 +1786,7 @@ index c0823c612de9dc2a64cc797f061eef25c5f31359..a32d6756e62f6b6d7d3412f9773bd963 Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { -@@ -2146,7 +2146,7 @@ public class CraftEventFactory { +@@ -2140,7 +2140,7 @@ public class CraftEventFactory { CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemStack.copyWithCount(1)); org.bukkit.event.block.BlockDispenseEvent event = new org.bukkit.event.block.BlockDispenseEvent(bukkitBlock, craftItem.clone(), CraftVector.toBukkit(to)); diff --git a/settings.gradle.kts b/settings.gradle.kts index 7a78ef4..37d6034 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,4 +11,4 @@ plugins { rootProject.name = "SparklyPaper" -include("sparklypaper-api-generator", "sparklypaper-api", "sparklypaper-server") +include("sparklypaper-api", "sparklypaper-server")