diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8c4d4f267..3d1b55d40 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,10 +12,10 @@ jobs: steps: - name: Get repository uses: actions/checkout@v4 - - name: Get JDK 21 + - name: Get JDK 25 uses: actions/setup-java@v4 with: - java-version: "21" + java-version: "25" distribution: "zulu" - name: Setup Gradle uses: gradle/actions/setup-gradle@v4 @@ -29,7 +29,7 @@ jobs: - name: Apply Patches run: ./gradlew applyAllPatches - name: Create Leavesclip Jar - run: ./gradlew createMojmapLeavesclipJar + run: ./gradlew createLeavesclipJar - name: Move Jar run: | prop() { @@ -37,7 +37,7 @@ jobs: } jarName="leaves-$(prop mcVersion).jar" - mv leaves-server/build/libs/leaves-leavesclip-"$(prop version)"-mojmap.jar "$jarName" + mv leaves-server/build/libs/leaves-leavesclip-"$(prop version)".jar "$jarName" echo "jar=$jarName" >> "$GITHUB_ENV" - name: Upload Artifact uses: actions/upload-artifact@v4 diff --git a/build.gradle.kts b/build.gradle.kts index 65198a697..25b38568a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ import java.util.Locale plugins { java - id("org.leavesmc.leavesweight.patcher") version "2.1.0-SNAPSHOT" + id("org.leavesmc.leavesweight.patcher") version "2.2.0-SNAPSHOT" // Leaves - 26.1 line uses leavesweight 2.2.0 } subprojects { @@ -13,8 +13,7 @@ subprojects { extensions.configure { toolchain { - languageVersion = JavaLanguageVersion.of(21) - vendor = JvmVendorSpec.ADOPTIUM + languageVersion = JavaLanguageVersion.of(25) } } @@ -32,9 +31,10 @@ subprojects { } tasks.withType { options.encoding = Charsets.UTF_8.name() - options.release = 21 + options.release = 25 options.isFork = true options.forkOptions.memoryMaximumSize = "6g" + options.compilerArgs.addAll(listOf("-Xlint:-deprecation", "-Xlint:-removal", "-Xmaxerrs", "500")) } tasks.withType { options.encoding = Charsets.UTF_8.name() diff --git a/gradle.properties b/gradle.properties index c0dda2a54..138b7e26c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,13 +1,14 @@ group=org.leavesmc.leaves -version=1.21.11-R0.1-SNAPSHOT -mcVersion=1.21.11 -paperRef=c5a2736aaa33a6447badd2ed294fbf5940cb014b +version=26.1.2-R0.1-SNAPSHOT +mcVersion=26.1.2 +paperRef=10a73fe40f39d51e6a35e55154229bc9508a16d1 +channel=STABLE preVersion=true paper.runDisableWatchdog=true # This is the current API version for use in (paper-/leaves-)plugin.yml files # During snapshot cycles this should be the anticipated version of the release target -apiVersion=1.21.11 +apiVersion=26.1.2 org.gradle.configuration-cache=false org.gradle.caching=true diff --git a/leaves-api/build.gradle.kts.patch b/leaves-api/build.gradle.kts.patch index 5f611ce9d..190765a2d 100644 --- a/leaves-api/build.gradle.kts.patch +++ b/leaves-api/build.gradle.kts.patch @@ -1,7 +1,7 @@ --- a/paper-api/build.gradle.kts +++ b/paper-api/build.gradle.kts @@ -91,19 +_,33 @@ - testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testRuntimeOnly("org.junit.platform:junit-platform-launcher:6.0.3") } -val generatedDir: java.nio.file.Path = layout.projectDirectory.dir("src/generated/java").asFile.toPath() @@ -17,28 +17,30 @@ java { srcDir(generatedDir) + srcDir(file("../paper-api/src/main/java")) -+ } + } + resources { + srcDir(file("../paper-api/src/main/resources")) + } -+ } + } + test { + java { + srcDir(file("../paper-api/src/test/java")) + } + resources { + srcDir(file("../paper-api/src/test/resources")) - } - } ++ } ++ } } +// Leaves end - build change val outgoingVariants = arrayOf("runtimeElements", "apiElements", "sourcesElements", "javadocElements") val mainCapability = "${project.group}:${project.name}:${project.version}" -@@ -138,6 +_,16 @@ - } - } - +@@ -164,7 +_,17 @@ + outputFile.set(layout.buildDirectory.file("apiVersioning.json")) + projectVersion.set(project.version.toString()) + apiVersion.set(rootProject.providers.gradleProperty("apiVersion")) ++} ++ +// Leaves start - hide irrelevant compilation warnings +tasks.withType { + val compilerArgs = options.compilerArgs @@ -46,12 +48,11 @@ + compilerArgs.add("-Xlint:-removal") + compilerArgs.add("-Xlint:-dep-ann") + compilerArgs.add("--add-modules=jdk.incubator.vector") // Leaves - SIMD support -+} + } +// Leaves end - hide irrelevant compilation warnings -+ - abstract class GenerateApiVersioningFile : DefaultTask() { - @get:OutputFile - abstract val outputFile: RegularFileProperty + + tasks.jar { + from(generateApiVersioningFile.flatMap { it.outputFile }) @@ -183,7 +_,7 @@ tasks.withType().configureEach { diff --git a/leaves-api/paper-patches/features/0001-Delete-Timings.patch b/leaves-api/paper-patches/features/0001-Delete-Timings.patch index 92813ef96..543222dca 100644 --- a/leaves-api/paper-patches/features/0001-Delete-Timings.patch +++ b/leaves-api/paper-patches/features/0001-Delete-Timings.patch @@ -730,7 +730,7 @@ index 199789d56d22fcb1b77ebd56805cc28aa5a5ab0a..00000000000000000000000000000000 -} diff --git a/src/main/java/co/aikar/timings/TimingHistory.java b/src/main/java/co/aikar/timings/TimingHistory.java deleted file mode 100644 -index 143fb3623a3fcf4be2d30dafb330584cb61ffe50..0000000000000000000000000000000000000000 +index 89bd9555d0c96b7bc1703b522cf4ee8d259131e6..0000000000000000000000000000000000000000 --- a/src/main/java/co/aikar/timings/TimingHistory.java +++ /dev/null @@ -1,356 +0,0 @@ @@ -870,7 +870,7 @@ index 143fb3623a3fcf4be2d30dafb330584cb61ffe50..00000000000000000000000000000000 - } - } - return pair( -- worldMap.get(world.getName()), +- worldMap.get(world.key().asString()), - toArrayMapper(regions.values(),new Function() { - @NotNull - @Override diff --git a/leaves-api/paper-patches/features/0003-Add-fakeplayer-api.patch b/leaves-api/paper-patches/features/0003-Add-fakeplayer-api.patch index 4d3785373..0fe3471e3 100644 --- a/leaves-api/paper-patches/features/0003-Add-fakeplayer-api.patch +++ b/leaves-api/paper-patches/features/0003-Add-fakeplayer-api.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add fakeplayer api diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 14d81c7b138ebf999d5812d26fbf869209c100f3..3b0513fbbf46e7cbb1790264eebaed9862d48eb5 100644 +index 77473d9de8283a557ca061b0429dee9312de7d6b..9c5038e5dca41f9e77eba999dbc1dd839162281e 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -3003,4 +3003,15 @@ public final class Bukkit { @@ -25,10 +25,10 @@ index 14d81c7b138ebf999d5812d26fbf869209c100f3..3b0513fbbf46e7cbb1790264eebaed98 + // Leaves end - Bot API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 0ec885b97d655c03371840d739b47063494ed36f..bc9bdaadf6b6bb7cc7a8cf2d4e9b8e7724f36445 100644 +index dd8ad5976eb413f049245a4f37bd94b3e41829de..1a81b53408cd20af750d507fab8d037de389f450 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2761,4 +2761,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2780,4 +2780,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ void allowPausing(@NotNull org.bukkit.plugin.Plugin plugin, boolean value); // Paper end - API to check if the server is sleeping diff --git a/leaves-api/paper-patches/features/0004-Replay-Mod-API.patch b/leaves-api/paper-patches/features/0004-Replay-Mod-API.patch index d285ac1fa..5bed41c28 100644 --- a/leaves-api/paper-patches/features/0004-Replay-Mod-API.patch +++ b/leaves-api/paper-patches/features/0004-Replay-Mod-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Replay Mod API diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 3b0513fbbf46e7cbb1790264eebaed9862d48eb5..44ee8036e2f813e947c2c166e1876030cabf86ff 100644 +index 9c5038e5dca41f9e77eba999dbc1dd839162281e..4e1c97d828d7d4d3ba42e28dec8aa1ec6e96420d 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -3014,4 +3014,10 @@ public final class Bukkit { @@ -20,13 +20,15 @@ index 3b0513fbbf46e7cbb1790264eebaed9862d48eb5..44ee8036e2f813e947c2c166e1876030 + // Leaves end - Photographer API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index bc9bdaadf6b6bb7cc7a8cf2d4e9b8e7724f36445..f2d616b896ac7998c75c9ded8dd28cf2b49dd416 100644 +index 1a81b53408cd20af750d507fab8d037de389f450..e0e6161524fc5ced6704d8effec0a87009241f25 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2770,4 +2770,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2789,4 +2789,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ @NotNull org.leavesmc.leaves.entity.bot.BotManager getBotManager(); // Leaves end - Bot API + -+ @NotNull org.leavesmc.leaves.entity.photographer.PhotographerManager getPhotographerManager(); // Leaves - Photographer API ++ // Leaves start - Photographer API ++ @NotNull org.leavesmc.leaves.entity.photographer.PhotographerManager getPhotographerManager(); ++ // Leaves end - Photographer API } diff --git a/leaves-api/paper-patches/features/0005-Bytebuf-API.patch b/leaves-api/paper-patches/features/0005-Bytebuf-API.patch index 815a8644b..3ebbdcfb6 100644 --- a/leaves-api/paper-patches/features/0005-Bytebuf-API.patch +++ b/leaves-api/paper-patches/features/0005-Bytebuf-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Bytebuf API diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 44ee8036e2f813e947c2c166e1876030cabf86ff..29570b8bcf34806af2f8d3dfdd656319176a61e5 100644 +index 4e1c97d828d7d4d3ba42e28dec8aa1ec6e96420d..089d2e862d3683f6749ed7bc1c2f35778fd41e88 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -3020,4 +3020,10 @@ public final class Bukkit { @@ -20,26 +20,28 @@ index 44ee8036e2f813e947c2c166e1876030cabf86ff..29570b8bcf34806af2f8d3dfdd656319 + // Leaves end - Bytebuf API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index f2d616b896ac7998c75c9ded8dd28cf2b49dd416..9544b376e457b3b62f6c025bd31f2bb2a5318269 100644 +index e0e6161524fc5ced6704d8effec0a87009241f25..1b11ff184f91eb6923b79e5d6462d945ae8a0f42 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2772,4 +2772,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi - // Leaves end - Bot API - - @NotNull org.leavesmc.leaves.entity.photographer.PhotographerManager getPhotographerManager(); // Leaves - Photographer API +@@ -2793,4 +2793,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi + // Leaves start - Photographer API + @NotNull org.leavesmc.leaves.entity.photographer.PhotographerManager getPhotographerManager(); + // Leaves end - Photographer API + -+ org.leavesmc.leaves.bytebuf.BytebufAllocator getBytebufAllocator(); // Leaves - Bytebuf API ++ // Leaves start - Bytebuf API ++ org.leavesmc.leaves.bytebuf.BytebufAllocator getBytebufAllocator(); ++ // Leaves end - Bytebuf API } diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 26d9139886d851824829734228e0bcceabba92d5..3b3a5072fda47ee483e6e7c73263ffc321ea9a6b 100644 +index c5af83a9e4e619d32378a7bf361b5b4f05b6e147..b1edc65eb9b65108caf31fc8efe312c97ea44ed5 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -66,7 +66,7 @@ import org.jspecify.annotations.Nullable; +@@ -69,7 +69,7 @@ import org.jspecify.annotations.Nullable; * Represents a player, connected or not */ @NullMarked -public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified, net.kyori.adventure.bossbar.BossBarViewer, com.destroystokyo.paper.network.NetworkClient { // Paper +public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginMessageRecipient, net.kyori.adventure.identity.Identified, net.kyori.adventure.bossbar.BossBarViewer, com.destroystokyo.paper.network.NetworkClient, org.leavesmc.leaves.bytebuf.PacketAudience { // Paper // Leaves - Bytbuf API - + // Paper start @Override diff --git a/leaves-api/paper-patches/features/0008-Leaves-Config-API.patch b/leaves-api/paper-patches/features/0008-Leaves-Config-API.patch index 6a9e3307d..cc15c30e4 100644 --- a/leaves-api/paper-patches/features/0008-Leaves-Config-API.patch +++ b/leaves-api/paper-patches/features/0008-Leaves-Config-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Leaves Config API diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 29570b8bcf34806af2f8d3dfdd656319176a61e5..786546ba9503a6fc7762589059b998afc62d8e22 100644 +index 089d2e862d3683f6749ed7bc1c2f35778fd41e88..3f5962acf1b7df1b4147e9fd1a91fc2ab5f8d817 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -3026,4 +3026,10 @@ public final class Bukkit { @@ -20,13 +20,15 @@ index 29570b8bcf34806af2f8d3dfdd656319176a61e5..786546ba9503a6fc7762589059b998af + // Leaves end - Config API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 9544b376e457b3b62f6c025bd31f2bb2a5318269..bd84c7725effc55b00510d0b7a050343e2ff0361 100644 +index 1b11ff184f91eb6923b79e5d6462d945ae8a0f42..c73d0a80153b3a5206159574dba553975a7daea9 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2774,4 +2774,6 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi - @NotNull org.leavesmc.leaves.entity.photographer.PhotographerManager getPhotographerManager(); // Leaves - Photographer API - - org.leavesmc.leaves.bytebuf.BytebufAllocator getBytebufAllocator(); // Leaves - Bytebuf API +@@ -2797,4 +2797,8 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi + // Leaves start - Bytebuf API + org.leavesmc.leaves.bytebuf.BytebufAllocator getBytebufAllocator(); + // Leaves end - Bytebuf API + -+ org.leavesmc.leaves.config.LeavesConfigProvider getLeavesConfig(); // Leaves - Config API ++ // Leaves start - Config API ++ org.leavesmc.leaves.config.LeavesConfigProvider getLeavesConfig(); ++ // Leaves End - Config API } diff --git a/leaves-api/paper-patches/features/0009-Leaves-Plugin.patch b/leaves-api/paper-patches/features/0009-Leaves-Plugin.patch index d0d4134bd..eb62f807c 100644 --- a/leaves-api/paper-patches/features/0009-Leaves-Plugin.patch +++ b/leaves-api/paper-patches/features/0009-Leaves-Plugin.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Leaves Plugin This patch is licensed under the MIT license. diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 5cc913f9e903ea5ef51c2e2b8cc18fdad8838c1e..554b8977c9b358f177e29907bcebaed8ab2100fc 100644 +index 3f5962acf1b7df1b4147e9fd1a91fc2ab5f8d817..3a9c06e71d6a3e429e256e291fdf594c994b419b 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -3004,6 +3004,12 @@ public final class Bukkit { @@ -23,10 +23,10 @@ index 5cc913f9e903ea5ef51c2e2b8cc18fdad8838c1e..554b8977c9b358f177e29907bcebaed8 /** * Returns a bot manager. diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 0a52d9cffa58c922079bf97deb32dd4f057da097..23b878d9cfe4bdc0ddbd1d2d0663efecc7e5e8fb 100644 +index c73d0a80153b3a5206159574dba553975a7daea9..ca445ab0892a9ac4f8ef3228d8b28a9d0d12667e 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2762,6 +2762,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2781,6 +2781,10 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi void allowPausing(@NotNull org.bukkit.plugin.Plugin plugin, boolean value); // Paper end - API to check if the server is sleeping diff --git a/leaves-server/build.gradle.kts.patch b/leaves-server/build.gradle.kts.patch index c750453b0..a9b636ef0 100644 --- a/leaves-server/build.gradle.kts.patch +++ b/leaves-server/build.gradle.kts.patch @@ -10,16 +10,16 @@ `maven-publish` idea - id("io.papermc.paperweight.core") -- id("io.papermc.fill.gradle") version "1.0.10" +- id("io.papermc.fill.gradle") version "1.0.11" + id("org.leavesmc.leavesweight.core") // Leaves - build change } val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" -+val leavesMavenPublicUrl = "https://repo.leavesmc.com/snapshots/" // Leaves - build change ++val leavesMavenPublicUrl = "https://repo.leavesmc.org/snapshots/" // Leaves - build change dependencies { - mache("io.papermc:mache:1.21.11+build.1") -- paperclip("io.papermc:paperclip:3.0.3") + mache("io.papermc:mache:26.1.2+build.2") +- paperclip("io.papermc:paperclip:3.0.4") + leavesclip("org.leavesmc:leavesclip:3.0.10") // Leaves - build change } @@ -40,20 +40,10 @@ + activeFork = leaves + // Leaves end - build change + - spigot { - enabled = true - buildDataRef = "17f77cee7117ab9d6175f088ae8962bfd04e61a9" -@@ -39,16 +_,13 @@ - "org.bukkit.craftbukkit", - "org.spigotmc", - ) -- -- updatingMinecraft { -- // oldPaperCommit = "c82b438b5b4ea0b230439b8e690e34708cd11ab3" -- } - } - - tasks.generateDevelopmentBundle { + updatingMinecraft { + // oldPaperCommit = "711c5de2b05df39b72c44ff54e9f9381f8d153cb" + } +@@ -31,6 +_,7 @@ libraryRepositories.addAll( "https://repo.maven.apache.org/maven2/", paperMavenPublicUrl, @@ -61,7 +51,7 @@ ) } -@@ -104,7 +_,21 @@ +@@ -86,7 +_,21 @@ } } @@ -81,18 +71,20 @@ + java { srcDir("../paper-server/src/log4jPlugins/java") } +} +// Leaves end - build change ++ configurations.named(log4jPlugins.compileClasspathConfigurationName) { extendsFrom(configurations.compileClasspath.get()) } -@@ -127,7 +_,18 @@ +@@ -109,7 +_,19 @@ } dependencies { - implementation(project(":paper-api")) + implementation(project(":leaves-api")) // Leaves - build change ++ implementation("commons-lang:commons-lang:2.6") // Leaves - build change + // Leaves start - linear + implementation("com.github.luben:zstd-jni:1.5.4-1") -+ implementation("at.yawk.lz4:lz4-java:1.8.1") ++ // lz4-java is provided by mache (at.yawk.lz4:lz4-java) since Paper 26.1 - Leaves + implementation("net.openhft:zero-allocation-hashing:0.16") + // Leaves end - linear + // Leaves start - leaves plugin @@ -101,10 +93,18 @@ + exclude(group = "com.google.guava", module = "guava") + } + // Leaves end - leaves plugin - implementation("ca.spottedleaf:concurrentutil:0.0.8") + implementation("ca.spottedleaf:concurrentutil:0.0.10") implementation("org.jline:jline-terminal-ffm:3.27.1") // use ffm on java 22+ implementation("org.jline:jline-terminal-jni:3.27.1") // fall back to jni on java 21 -@@ -186,26 +_,36 @@ +@@ -136,7 +_,6 @@ + implementation("org.spongepowered:configurate-yaml:4.2.0") + + // Deps that were previously in the API but have now been moved here for backwards compat, eventually to be removed +- runtimeOnly("commons-lang:commons-lang:2.6") + runtimeOnly("org.xerial:sqlite-jdbc:3.49.1.0") + runtimeOnly("com.mysql:mysql-connector-j:9.2.0") + runtimeOnly("com.lmax:disruptor:3.4.4") +@@ -159,26 +_,36 @@ implementation("me.lucko:spark-paper:1.10.152") } @@ -147,7 +147,7 @@ "Build-Number" to (build ?: ""), "Build-Time" to buildTime.toString(), "Git-Branch" to gitBranch, -@@ -264,7 +_,7 @@ +@@ -237,7 +_,7 @@ jvmArgumentProviders.add(provider) } @@ -156,7 +156,7 @@ idea { module { generatedSourceDirs.add(generatedDir.toFile()) -@@ -301,6 +_,10 @@ +@@ -275,6 +_,10 @@ } args("--nogui") @@ -167,55 +167,42 @@ systemProperty("net.kyori.adventure.text.warnWhenLegacyFormattingDetected", true) if (providers.gradleProperty("paper.runDisableWatchdog").getOrElse("false") == "true") { systemProperty("disable.watchdog", true) -@@ -345,30 +_,24 @@ - classpath(tasks.createReobfBundlerJar.flatMap { it.outputZip }) +@@ -309,25 +_,20 @@ + classpath(tasks.createBundlerJar.flatMap { it.outputZip }) mainClass.set(null as String?) } -tasks.registerRunTask("runPaperclip") { - description = "Spin up a test server from the Mojang mapped Paperclip jar" -- classpath(tasks.createMojmapPaperclipJar.flatMap { it.outputZip }) -- mainClass.set(null as String?) --} --tasks.registerRunTask("runReobfPaperclip") { -- description = "Spin up a test server from the reobf Paperclip jar" -- classpath(tasks.createReobfPaperclipJar.flatMap { it.outputZip }) -- mainClass.set(null as String?) --} -- +- classpath(tasks.createPaperclipJar.flatMap { it.outputZip }) ++ ++// Leaves start - build change ++tasks.registerRunTask("runLeavesclip") { ++ description = "Spin up a test server from the Mojang mapped Leavesclip jar" ++ systemProperty("leavesclip.enable.mixin", true) ++ classpath(tasks.createLeavesclipJar.flatMap { it.outputZip }) + mainClass.set(null as String?) + } ++// Leaves end - build change + -fill { - project("paper") - versionFamily(paperweight.minecraftVersion.map { it.split(".", "-").takeWhile { part -> part.toIntOrNull() != null }.take(2).joinToString(".") }) - version(paperweight.minecraftVersion) - - build { -- channel = BuildChannel.STABLE +- channel = providers.gradleProperty("channel").map { BuildChannel.valueOf(it.uppercase()) } - - downloads { - register("server:default") { -- file = tasks.createMojmapPaperclipJar.flatMap { it.outputZip } +- file = tasks.createPaperclipJar.flatMap { it.outputZip } - nameResolver.set { project, _, version, build -> "$project-$version-$build.jar" } - } - } - } --} -+// Leaves start - build change -+tasks.registerRunTask("runLeavesclip") { -+ description = "Spin up a test server from the Mojang mapped Leavesclip jar" -+ systemProperty("leavesclip.enable.mixin", true) -+ classpath(tasks.createMojmapLeavesclipJar.flatMap { it.outputZip }) -+ mainClass.set(null as String?) -+} -+tasks.registerRunTask("runReobfLeavesclip") { -+ description = "Spin up a test server from the reobf Leavesclip jar" -+ systemProperty("leavesclip.enable.mixin", true) -+ classpath(tasks.createMojmapLeavesclipJar.flatMap { it.outputZip }) -+ mainClass.set(null as String?) -+} -+// Leaves end - build change +// Leaves start - create config file +tasks.registerRunTask("createLeavesConfig") { + description = "Create a new leaves.yml" + mainClass = "org.leavesmc.leaves.config.GlobalConfigCreator" + classpath(sourceSets.main.map { it.runtimeClasspath }) -+} + } +// Leaves end - create config file diff --git a/leaves-server/minecraft-patches/features/0001-Build-changes.patch b/leaves-server/minecraft-patches/features/0001-Build-changes.patch index 00e0b0427..c724b1fe5 100644 --- a/leaves-server/minecraft-patches/features/0001-Build-changes.patch +++ b/leaves-server/minecraft-patches/features/0001-Build-changes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Build changes diff --git a/ca/spottedleaf/moonrise/paper/PaperHooks.java b/ca/spottedleaf/moonrise/paper/PaperHooks.java -index 31e34721f48a5d88379f50104abcf0fc63ebd194..e1f7e61fb9b6075d933fac5995236db4e1912b25 100644 +index 4a3f07daad8b48eaf3bea02bdacbfb0670dddf90..e1e032e709193b5a8008d69b748bc54bc660eb64 100644 --- a/ca/spottedleaf/moonrise/paper/PaperHooks.java +++ b/ca/spottedleaf/moonrise/paper/PaperHooks.java @@ -29,7 +29,7 @@ import net.minecraft.world.phys.AABB; @@ -18,10 +18,10 @@ index 31e34721f48a5d88379f50104abcf0fc63ebd194..e1f7e61fb9b6075d933fac5995236db4 private static final org.slf4j.Logger LOGGER = com.mojang.logging.LogUtils.getLogger(); diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index ca2caace6aab0dfcb0ab7a0fd28e66555c62fdc5..501e3ba63c0c262028aade6ee802a71cbe14c9fe 100644 +index cc35c6271c98615a486422d0490145227626bd85..0cb304ea1f1a232c0fd714d15417e0e674e5bcc6 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1279,7 +1279,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { - io.papermc.paper.command.brigadier.PaperBrigadier.moveBukkitCommands(this.resources.managers().getCommands(), reloadableResources.managers().commands); // Paper -+ org.leavesmc.leaves.command.RootNode.reloadLeavesCommands(); // Leaves - command - this.resources.close(); - this.resources = reloadableResources; - this.packRepository.setSelected(selectedIds, false); // Paper - add pendingReload flag to determine required pack loading - false as this is *after* a reload (see above) +@@ -2332,6 +2332,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { + io.papermc.paper.command.brigadier.PaperBrigadier.moveBukkitCommands(this.resources.managers().getCommands(), newResources.managers().commands); // Paper ++ org.leavesmc.leaves.command.RootNode.reloadLeavesCommands(); // Leaves - command + this.resources.close(); + this.resources = newResources; + this.packRepository.setSelected(packsToEnable, false); // Paper - add pendingReload flag to determine required pack loading - false as this is *after* a reload (see above) diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index 2fbc8efbd12e9adbabc47b9f81a71271e0daeca1..2e6af078b8713cccf4dd51df53ce580a26553ae1 100644 +index 6a5d404e570ede5d49c82bccc30aa75ddd58983b..84684c28756629b428e764d38c84b71c9c103f8f 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -274,6 +274,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -288,6 +288,9 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface + consoleThread.start(); // Paper - Enhance console tab completions for brigadier commands; start console thread after MinecraftServer.console & PaperConfig are initialized + io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command this.server.spark.registerCommandBeforePlugins(this.server); // Paper - spark - com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now - ++ + org.leavesmc.leaves.LeavesConfig.init((java.io.File) options.valueOf("leaves-settings")); // Leaves - Server Config + - com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics // Leaves - down + com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics + com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now - // this.worldData.setGameType(properties.gameMode.get()); // CraftBukkit - moved to world loading diff --git a/leaves-server/minecraft-patches/features/0003-Leaves-Utils.patch b/leaves-server/minecraft-patches/features/0003-Leaves-Utils.patch index 1173e8d35..7f1813328 100644 --- a/leaves-server/minecraft-patches/features/0003-Leaves-Utils.patch +++ b/leaves-server/minecraft-patches/features/0003-Leaves-Utils.patch @@ -5,38 +5,47 @@ Subject: [PATCH] Leaves Utils diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 3bf618f1d756bad7755a87803132bd731e7c41be..bbf0100341dfd50cfe76bf4f47225e6b43dc17bd 100644 +index 74a2b3dcd303b25e9c26f3e4d4220b390b32f1d5..5e2d8efd30e57eaf5481a3986cac28ddc5e4c6d8 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -374,6 +374,8 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -387,6 +387,7 @@ public abstract class Entity + public long activatedTick = Integer.MIN_VALUE; public boolean isTemporarilyActive; public long activatedImmunityTick = Integer.MIN_VALUE; - + private net.minecraft.nbt.CompoundTag leavesData = new net.minecraft.nbt.CompoundTag(); // Leaves - Leaves ex data -+ + public void inactiveTick() { } - // Paper end - EAR 2 -@@ -2659,6 +2661,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -2679,6 +2680,7 @@ public abstract class Entity output.putBoolean("Paper.FreezeLock", true); } // Paper end + output.store("Leaves.Data", net.minecraft.nbt.CompoundTag.CODEC, leavesData); // Leaves - leaves ex data - } catch (Throwable var7) { - CrashReport crashReport = CrashReport.forThrowable(var7, "Saving entity NBT"); - CrashReportCategory crashReportCategory = crashReport.addCategory("Entity being saved"); -@@ -2779,6 +2782,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name + } catch (Throwable t) { + CrashReport report = CrashReport.forThrowable(t, "Saving entity NBT"); + CrashReportCategory category = report.addCategory("Entity being saved"); +@@ -2802,6 +2804,7 @@ public abstract class Entity } freezeLocked = input.getBooleanOr("Paper.FreezeLock", false); // Paper end + leavesData = input.read("Leaves.Data", net.minecraft.nbt.CompoundTag.CODEC).orElse(new net.minecraft.nbt.CompoundTag()); - } catch (Throwable var7) { - CrashReport crashReport = CrashReport.forThrowable(var7, "Loading entity NBT"); - CrashReportCategory crashReportCategory = crashReport.addCategory("Entity being loaded"); -@@ -5429,4 +5433,9 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name + } catch (Throwable t) { + CrashReport report = CrashReport.forThrowable(t, "Loading entity NBT"); + CrashReportCategory category = report.addCategory("Entity being loaded"); +@@ -4581,7 +4584,7 @@ public abstract class Entity + return this.is(EntityTypeTags.DEFLECTS_PROJECTILES) ? ProjectileDeflection.REVERSE : ProjectileDeflection.NONE; + } + +- public @Nullable LivingEntity getControllingPassenger() { ++ public @org.jetbrains.annotations.NotNull LivingEntity getControllingPassenger() { // Leaves - notnull + return null; + } + +@@ -5385,4 +5388,10 @@ public abstract class Entity return ((ServerLevel) this.level()).isPositionEntityTicking(this.blockPosition()); } // Paper end - Expose entity id counter ++ + // Leaves start - leaves ex data + public net.minecraft.nbt.CompoundTag getLeavesData() { + return leavesData; @@ -44,23 +53,23 @@ index 3bf618f1d756bad7755a87803132bd731e7c41be..bbf0100341dfd50cfe76bf4f47225e6b + // Leaves end - leaves ex data } diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 579bbba4e823d4d0318e58759ca732b7c8e4d865..ac1ca945fcea0997d837e7c5586d86a709f52d47 100644 +index 56659181dc817ea028428eabf5937308c04b8cc5..9f7a08a3b19d1f494ff1bfbaaf4b853b0e0df315 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -969,7 +969,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -922,7 +922,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } - // Paper start - if loaded -- @Nullable -+ @org.jetbrains.annotations.NotNull // Leaves - notnull @Override - public final ChunkAccess getChunkIfLoadedImmediately(int x, int z) { - return ((ServerLevel)this).chunkSource.getChunkAtIfLoadedImmediately(x, z); +- public @Nullable MinecraftServer getServer() { ++ public @org.jetbrains.annotations.NotNull MinecraftServer getServer() { // Leaves - notnull + return null; + } + diff --git a/net/minecraft/world/level/LevelAccessor.java b/net/minecraft/world/level/LevelAccessor.java -index 21d5042282a4eeaadfbb1057f5995e90acc7388e..b3af6fa78eaca16f094e404bf86c05d496b6a5f1 100644 +index a82be0511b6381a2e9ee32f9f5ba1cca123b0835..ecb3073113bdef133932df14ae67d20f34e248ef 100644 --- a/net/minecraft/world/level/LevelAccessor.java +++ b/net/minecraft/world/level/LevelAccessor.java -@@ -42,7 +42,7 @@ public interface LevelAccessor extends CommonLevelAccessor, LevelReader, Schedul +@@ -42,7 +42,7 @@ public interface LevelAccessor extends CommonLevelAccessor, ScheduledTickAccess return this.getLevelData().getGameTime(); } @@ -70,10 +79,10 @@ index 21d5042282a4eeaadfbb1057f5995e90acc7388e..b3af6fa78eaca16f094e404bf86c05d4 default Difficulty getDifficulty() { return this.getLevelData().getDifficulty(); diff --git a/net/minecraft/world/level/block/Block.java b/net/minecraft/world/level/block/Block.java -index 94b4143449c99ee35db44ab8e2a766d924aa6410..6d0cdbd52a3bb4e09fd480fa08fa825e987d2a2c 100644 +index a8625939a4220050990b09097d5e3bfd2d8473d5..70960c3c280eedc3624f20139a52d5d4961d6217 100644 --- a/net/minecraft/world/level/block/Block.java +++ b/net/minecraft/world/level/block/Block.java -@@ -659,6 +659,13 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -699,6 +699,13 @@ public class Block extends BlockBehaviour implements ItemLike { } // CraftBukkit end @@ -84,19 +93,19 @@ index 94b4143449c99ee35db44ab8e2a766d924aa6410..6d0cdbd52a3bb4e09fd480fa08fa825e + } + // Leaves end - reset push reaction + - record ShapePairKey(VoxelShape first, VoxelShape second) { + private record ShapePairKey(VoxelShape first, VoxelShape second) { @Override - public boolean equals(Object other) { + public boolean equals(final Object o) { diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java -index c5953d5751e655e121e459aaab35e7719948e69e..b1f1ea03072c63bc3032c9f023a8fb4ede34b34b 100644 +index 7093613a09a79d7ffce34f1cb54ec2605c5af384..6be4d5c7801937e865788e08789de2814c6fa19d 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -762,7 +762,7 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -785,7 +785,7 @@ public abstract class BlockBehaviour implements FeatureElement { } public PushReaction getPistonPushReaction() { - return !this.isDestroyable() ? PushReaction.BLOCK : this.pushReaction; // Paper - Protect Bedrock and End Portal/Frames from being destroyed -+ return !this.isDestroyable() ? PushReaction.BLOCK : this.getBlock().getResetPushReaction() == null ? this.pushReaction : this.getBlock().getResetPushReaction(); // Paper - Protect Bedrock and End Portal/Frames from being destroyed // Leaves - reset push reaction ++ return !this.isDestroyable() ? PushReaction.BLOCK : this.getBlock().getResetPushReaction() == null ? this.pushReaction : this.getBlock().getResetPushReaction(); // Paper - Protect Bedrock // Leaves - reset push reaction } public boolean isSolidRender() { diff --git a/leaves-server/minecraft-patches/features/0004-Leaves-Protocol-Core.patch b/leaves-server/minecraft-patches/features/0004-Leaves-Protocol-Core.patch index 890257943..ce9120618 100644 --- a/leaves-server/minecraft-patches/features/0004-Leaves-Protocol-Core.patch +++ b/leaves-server/minecraft-patches/features/0004-Leaves-Protocol-Core.patch @@ -5,59 +5,59 @@ Subject: [PATCH] Leaves Protocol Core diff --git a/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java b/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java -index 1da034752064312962a4144f91be5265a9a08997..081ca42b6a6644eb8c2b5ac9105fecf8ad39d501 100644 +index 812649b85290068af1ccea2ca69afa1817e14427..3e471fcd63c6e79546a7a29f331c8249ef09bef8 100644 --- a/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java +++ b/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java @@ -40,13 +40,22 @@ public interface CustomPacketPayload { @Override - public void encode(B buffer, CustomPacketPayload value) { + public void encode(final B output, final CustomPacketPayload value) { + // Leaves start - protocol core + if (value instanceof org.leavesmc.leaves.protocol.core.LeavesCustomPayload payload) { -+ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.encode(buffer, payload); ++ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.encode(output, payload); + return; + } + // Leaves end - protocol core - this.writeCap(buffer, value.type(), value); + this.writeCap(output, value.type(), value); } @Override - public CustomPacketPayload decode(B buffer) { - Identifier identifier = buffer.readIdentifier(); -- return (CustomPacketPayload)this.findCodec(identifier).decode(buffer); + public CustomPacketPayload decode(final B input) { + Identifier identifier = input.readIdentifier(); +- return (CustomPacketPayload)this.findCodec(identifier).decode(input); + // Leaves start - protocol core -+ var payload = org.leavesmc.leaves.protocol.core.LeavesProtocolManager.decode(identifier, buffer); -+ return java.util.Objects.requireNonNullElseGet(payload, () -> this.findCodec(identifier).decode(buffer)); ++ var payload = org.leavesmc.leaves.protocol.core.LeavesProtocolManager.decode(identifier, input); ++ return java.util.Objects.requireNonNullElseGet(payload, () -> (CustomPacketPayload) this.findCodec(identifier).decode(input)); + // Leaves end - protocol core } }; } diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index ec2a71fce91b9897bda2686d187c71c10fb9500c..d3a128db1e2a91111a6fd736f0b9ff5e5ee5ee31 100644 +index 8e0701df2968cadbf7836f150306ab5209497fd3..7a33035594fda3374d8789ca50c7139d5172c99b 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1842,6 +1842,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop pluginMessagerChannels; // Paper end - retain certain values + public final GameProfile profile; // Leaves - protocol core - public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie) { + public ServerCommonPacketListenerImpl(final MinecraftServer server, final Connection connection, final CommonListenerCookie cookie) { this.server = server; -@@ -71,6 +72,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -70,6 +71,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack this.pluginMessagerChannels = cookie.channels(); this.keepAlive = cookie.keepAlive(); // Paper end @@ -65,10 +65,10 @@ index b8a4b4cc02a2fc6b70f4b840796eed501aad6239..8bacc1779e540c32dad9c547f941c576 } // Paper start - configuration phase API -@@ -150,6 +152,18 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -143,6 +145,18 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack @Override - public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { + public void handleCustomPayload(final ServerboundCustomPayloadPacket packet) { + // Leaves start - protocol + if (packet.payload() instanceof org.leavesmc.leaves.protocol.core.LeavesCustomPayload leavesPayload) { + org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePayload(org.leavesmc.leaves.protocol.core.ProtocolUtils.createSelector(this), leavesPayload); @@ -84,7 +84,7 @@ index b8a4b4cc02a2fc6b70f4b840796eed501aad6239..8bacc1779e540c32dad9c547f941c576 // Paper start if (!(packet.payload() instanceof final net.minecraft.network.protocol.common.custom.DiscardedPayload discardedPayload)) { return; -@@ -209,10 +223,11 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -202,6 +216,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack final String channel = new String(data, from, length, java.nio.charset.StandardCharsets.US_ASCII); if (register) { bridge.addChannel(channel); @@ -92,63 +92,30 @@ index b8a4b4cc02a2fc6b70f4b840796eed501aad6239..8bacc1779e540c32dad9c547f941c576 } else { bridge.removeChannel(channel); } -- // Paper end -+ // Paper end - } - - @Override -@@ -380,9 +395,9 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack - net.minecraft.server.level.ServerPlayer player = serverGamePacketListener.player; - org.bukkit.event.player.PlayerKickEvent.Cause cause = disconnectionDetails.disconnectionReason().orElseThrow().game().orElse(org.bukkit.event.player.PlayerKickEvent.Cause.UNKNOWN); - org.bukkit.event.player.PlayerKickEvent event = new org.bukkit.event.player.PlayerKickEvent( -- player.getBukkitEntity(), -- io.papermc.paper.adventure.PaperAdventure.asAdventure(disconnectionDetails.reason()), -- rawLeaveMessage, cause -+ player.getBukkitEntity(), -+ io.papermc.paper.adventure.PaperAdventure.asAdventure(disconnectionDetails.reason()), -+ rawLeaveMessage, cause - - ); - -@@ -415,10 +430,10 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack - - private void disconnect0(DisconnectionDetails disconnectionDetails) { - this.connection -- .send( -- new ClientboundDisconnectPacket(disconnectionDetails.reason()), -- PacketSendListener.thenRun(() -> this.connection.disconnect(disconnectionDetails)) -- ); -+ .send( -+ new ClientboundDisconnectPacket(disconnectionDetails.reason()), -+ PacketSendListener.thenRun(() -> this.connection.disconnect(disconnectionDetails)) -+ ); - this.onDisconnect(disconnectionDetails); - this.connection.setReadOnly(); - // CraftBukkit - Don't wait diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 989ac565c47a70c7947cb7315d0f5c2cfecd0363..d9c49cb3394891b824dc2a77c5e8d50366643fef 100644 +index 5bea5dcdaf8ee0a38cd8587a55845e940d8f4cac..bb49f5914b4a3d686821f1989af7a44c4e256c92 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -244,6 +244,8 @@ public abstract class PlayerList { +@@ -245,6 +245,8 @@ public abstract class PlayerList { return; } -+ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); ++ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); // Leaves - protocol + final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure -@@ -430,6 +432,7 @@ public abstract class PlayerList { +@@ -431,6 +433,7 @@ public abstract class PlayerList { return this.remove(player, net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, io.papermc.paper.configuration.GlobalConfiguration.get().messages.useDisplayNameInQuitMessage ? player.getBukkitEntity().displayName() : io.papermc.paper.adventure.PaperAdventure.asAdventure(player.getDisplayName()))); } - public net.kyori.adventure.text.@Nullable Component remove(ServerPlayer player, net.kyori.adventure.text.Component leaveMessage) { + public net.kyori.adventure.text.@Nullable Component remove(final ServerPlayer player, final net.kyori.adventure.text.Component leaveMessage) { + org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerLeave(player); // Leaves - protocol // Paper end - Fix kick event leave message not being sent - ServerLevel serverLevel = player.level(); + ServerLevel level = player.level(); player.awardStat(Stats.LEAVE_GAME); -@@ -1286,6 +1289,7 @@ public abstract class PlayerList { - serverPlayer.connection.send(clientboundUpdateRecipesPacket); - serverPlayer.getRecipeBook().sendInitialRecipeBook(serverPlayer); +@@ -1288,6 +1291,7 @@ public abstract class PlayerList { + player.connection.send(recipes); + player.getRecipeBook().sendInitialRecipeBook(player); } + org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handleDataPackReload(); // Leaves - protocol core } diff --git a/leaves-server/minecraft-patches/features/0005-Configurable-void-trade.patch b/leaves-server/minecraft-patches/features/0005-Configurable-void-trade.patch index f0b47954f..ace859268 100644 --- a/leaves-server/minecraft-patches/features/0005-Configurable-void-trade.patch +++ b/leaves-server/minecraft-patches/features/0005-Configurable-void-trade.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable void trade diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index dc65503a2d785d64d37b76b0303f51cf66d9769a..9cb40d4f0ceabadb95f473e96029bd57a2b09204 100644 +index 229ff740e0418a05d824a67401ae6f105b4c3642..7e90784a38bccfe6707ea7e10946c39db995f969 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -2846,7 +2846,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2914,7 +2914,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet // Spigot start if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message // Paper start - Fix merchant inventory not closing on entity removal @@ -18,26 +18,26 @@ index dc65503a2d785d64d37b76b0303f51cf66d9769a..9cb40d4f0ceabadb95f473e96029bd57 } // Paper end - Fix merchant inventory not closing on entity removal diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index d9c49cb3394891b824dc2a77c5e8d50366643fef..c5dac6310dc82d4e5d9cc9df79f943bfb235c083 100644 +index bb49f5914b4a3d686821f1989af7a44c4e256c92..8ef8cc7a33ea8e2d368a273000b157958ad19ccb 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -474,7 +474,7 @@ public abstract class PlayerList { player.stopRiding(); - rootVehicle.getPassengersAndSelf().forEach(entity -> { + vehicle.getPassengersAndSelf().forEach(e -> { // Paper start - Fix villager boat exploit -- if (entity instanceof net.minecraft.world.entity.npc.villager.AbstractVillager villager) { -+ if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.voidTrade && entity instanceof net.minecraft.world.entity.npc.villager.AbstractVillager villager) { // Leaves - configurable void trade +- if (e instanceof net.minecraft.world.entity.npc.villager.AbstractVillager villager) { ++ if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.voidTrade && e instanceof net.minecraft.world.entity.npc.villager.AbstractVillager villager) { // Leaves - Configurable trading with the void final net.minecraft.world.entity.player.Player human = villager.getTradingPlayer(); if (human != null) { villager.setTradingPlayer(null); diff --git a/net/minecraft/world/inventory/MerchantMenu.java b/net/minecraft/world/inventory/MerchantMenu.java -index 6dfee62a46a5882df7f405e59d762647289d7866..ade7732b638b30ad0ae50605793cbf75754aad0e 100644 +index 1dd82dfa739957f00d51c8b987289a002815f622..7fcc2c2ad603699e176bb95559e51134174ecc20 100644 --- a/net/minecraft/world/inventory/MerchantMenu.java +++ b/net/minecraft/world/inventory/MerchantMenu.java @@ -74,6 +74,7 @@ public class MerchantMenu extends AbstractContainerMenu { @Override - public boolean stillValid(Player player) { + public boolean stillValid(final Player player) { + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.voidTrade) return this.trader.getTradingPlayer() == player; // Leaves - Configurable trading with the void if (!checkReachable) return true; // Paper - checkReachable return this.trader.stillValid(player); diff --git a/leaves-server/minecraft-patches/features/0006-Make-snowball-and-egg-can-knockback-player.patch b/leaves-server/minecraft-patches/features/0006-Make-snowball-and-egg-can-knockback-player.patch index 399277dfd..af26c4f0e 100644 --- a/leaves-server/minecraft-patches/features/0006-Make-snowball-and-egg-can-knockback-player.patch +++ b/leaves-server/minecraft-patches/features/0006-Make-snowball-and-egg-can-knockback-player.patch @@ -5,13 +5,13 @@ Subject: [PATCH] Make snowball and egg can knockback player diff --git a/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java b/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java -index 89a061cd0a2b39fc05ea96ac0f5d5a8c26582f97..ce57bc82ff31f50d86a5707de3957b10435937b7 100644 +index 6e828818909df2b31349398639257b7a6f89fcd5..e57f447054cd553257e4f8bceb924b48551050d2 100644 --- a/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java +++ b/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java -@@ -55,6 +55,12 @@ public class Snowball extends ThrowableItemProjectile { - Entity entity = result.getEntity(); - int i = entity instanceof Blaze ? 3 : 0; - entity.hurt(this.damageSources().thrown(this, this.getOwner()), i); +@@ -56,6 +56,12 @@ public class Snowball extends ThrowableItemProjectile { + Entity entity = hitResult.getEntity(); + int damage = entity instanceof Blaze ? 3 : 0; + entity.hurt(this.damageSources().thrown(this, this.getOwner()), damage); + // Leaves start - make snowball can knockback player + if (org.leavesmc.leaves.LeavesConfig.modify.snowballAndEggCanKnockback && entity instanceof net.minecraft.server.level.ServerPlayer player) { + player.hurt(this.damageSources().thrown(this, this.getOwner()), 0.0000001F); @@ -22,15 +22,15 @@ index 89a061cd0a2b39fc05ea96ac0f5d5a8c26582f97..ce57bc82ff31f50d86a5707de3957b10 @Override diff --git a/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEgg.java b/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEgg.java -index c7db74ccc3f8c46e97c24857f297fe5fb5f45e36..44d9fe980a8ab0b747626f12c23d44e0360a5059 100644 +index 55d97e1a69d17308196938398ab5a34bcca44e46..5c8ff14ccbe6e7dd6aac01ad1b50faf5af46db7a 100644 --- a/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEgg.java +++ b/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEgg.java -@@ -56,6 +56,12 @@ public class ThrownEgg extends ThrowableItemProjectile { - protected void onHitEntity(EntityHitResult result) { - super.onHitEntity(result); - result.getEntity().hurt(this.damageSources().thrown(this, this.getOwner()), 0.0F); +@@ -60,6 +60,12 @@ public class ThrownEgg extends ThrowableItemProjectile { + protected void onHitEntity(final EntityHitResult hitResult) { + super.onHitEntity(hitResult); + hitResult.getEntity().hurt(this.damageSources().thrown(this, this.getOwner()), 0.0F); + // Leaves start - make egg can knockback player -+ if (org.leavesmc.leaves.LeavesConfig.modify.snowballAndEggCanKnockback && result.getEntity() instanceof net.minecraft.server.level.ServerPlayer player) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.snowballAndEggCanKnockback && hitResult.getEntity() instanceof net.minecraft.server.level.ServerPlayer player) { + player.hurt(this.damageSources().thrown(this, this.getOwner()), 0.0000001F); + player.knockback(0.4000000059604645D, this.getX() - player.getX(), this.getZ() - player.getZ(), this, io.papermc.paper.event.entity.EntityKnockbackEvent.Cause.DAMAGE); + } diff --git a/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch b/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch index 919bffe63..d0c1a2dad 100644 --- a/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch +++ b/leaves-server/minecraft-patches/features/0007-Leaves-Fakeplayer.patch @@ -5,22 +5,22 @@ Subject: [PATCH] Leaves Fakeplayer diff --git a/net/minecraft/advancements/criterion/SimpleCriterionTrigger.java b/net/minecraft/advancements/criterion/SimpleCriterionTrigger.java -index 368a9d33f93c2e85abe4cf10df5a85c09fb03dd6..2b78040daeb3b09c08494cbc1d4a9d36080895f9 100644 +index 1c299b55e24e87dd1346357954e0f9e52026a1c0..b301eabea6c61eaf205bf48b9fe5ac6bf5ef7d03 100644 --- a/net/minecraft/advancements/criterion/SimpleCriterionTrigger.java +++ b/net/minecraft/advancements/criterion/SimpleCriterionTrigger.java -@@ -39,6 +39,7 @@ public abstract class SimpleCriterionTrigger testTrigger) { + protected void trigger(final ServerPlayer player, final Predicate matcher) { + if (player instanceof org.leavesmc.leaves.bot.ServerBot) return; // Leaves - bot skip PlayerAdvancements advancements = player.getAdvancements(); - Set> set = (Set) advancements.criterionData.get(this); // Paper - fix PlayerAdvancements leak - if (set != null && !set.isEmpty()) { + Set> allListeners = (Set) advancements.criterionData.get(this); // Paper - fix PlayerAdvancements leak + if (allListeners != null && !allListeners.isEmpty()) { diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java -index 19ec939529eb638bdc4d7fd9260f161fae118314..ab6255937577008689c25ba1474ecc2c961079da 100644 +index 0f06d509125e72ec11d263d0d5c2179d65f6d8dd..5d3403d53a87435a0d13694533c7f68d56175451 100644 --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java -@@ -74,7 +74,7 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -73,7 +73,7 @@ public class Connection extends SimpleChannelInboundHandler> { public boolean preparing = true; // Spigot end private volatile @Nullable PacketListener disconnectListener; @@ -30,19 +30,19 @@ index 19ec939529eb638bdc4d7fd9260f161fae118314..ab6255937577008689c25ba1474ecc2c private boolean encrypted; private boolean disconnectionHandled; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index d3a128db1e2a91111a6fd736f0b9ff5e5ee5ee31..f45ad308fc4bcf5647580ad3d46de9a966985790 100644 +index 7a33035594fda3374d8789ca50c7139d5172c99b..606640a1a70d88e48c7e45aa6336635c21c415b0 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -382,6 +382,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function threadFunction) { + public static S spin(final Function factory) { ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system - AtomicReference atomicReference = new AtomicReference<>(); -@@ -1014,6 +1016,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop serverReference = new AtomicReference<>(); +@@ -1047,6 +1049,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { + if (emptyTickThreshold > 0) { - if (this.playerList.getPlayerCount() == 0 && !this.tickRateManager.isSprinting() && this.pluginsBlockingSleep.isEmpty()) { // Paper - API to allow/disallow tick sleeping + if (this.playerList.getPlayerCount() == 0 && this.botList.bots.isEmpty() && !this.tickRateManager.isSprinting() && this.pluginsBlockingSleep.isEmpty()) { // Paper - API to allow/disallow tick sleeping // Leaves - fakeplayer this.emptyTicks++; } else { this.emptyTicks = 0; -@@ -1627,6 +1630,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0) { this.playerList.saveAll(playerSaveInterval); + org.leavesmc.leaves.bot.BotList.INSTANCE.saveAllResumeBots(playerSaveInterval); // Leaves - resident fakeplayer } - for (final ServerLevel level : this.getAllLevels()) { - if (level.paperConfig().chunks.autoSaveInterval.value() > 0) { -@@ -1870,6 +1874,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop players, @Nullable Component reason) throws CommandSyntaxException { - UserBanList bans = source.getServer().getPlayerList().getBans(); - int i = 0; +@@ -38,8 +38,15 @@ public class BanPlayerCommands { + private static int banPlayers(final CommandSourceStack source, final Collection players, final @Nullable Component reason) throws CommandSyntaxException { + UserBanList list = source.getServer().getPlayerList().getBans(); + int count = 0; - + boolean hasBot = false; // Leaves - disable kick - for (NameAndId nameAndId : players) { + for (NameAndId player : players) { + // Leaves start - disable ban -+ if (nameAndId.isBot()) { ++ if (player.isBot()) { + source.sendFailure(Component.literal("Permission denied")); + hasBot = true; + continue; + } + // Leaves end - disable ban - if (!bans.isBanned(nameAndId)) { - UserBanListEntry userBanListEntry = new UserBanListEntry( - nameAndId, null, source.getTextName(), null, reason == null ? null : reason.getString() -@@ -63,7 +70,13 @@ public class BanPlayerCommands { + if (!list.isBanned(player)) { + UserBanListEntry entry = new UserBanListEntry(player, null, source.getTextName(), null, reason == null ? null : reason.getString()); + list.add(entry); +@@ -53,7 +60,13 @@ public class BanPlayerCommands { } - if (i == 0) { + if (count == 0) { - throw ERROR_ALREADY_BANNED.create(); + // Leaves start - disable kick + if (hasBot) { -+ return i; ++ return count; + } else { + throw ERROR_ALREADY_BANNED.create(); + } + // Leaves end - disable kick } else { - return i; + return count; } diff --git a/net/minecraft/server/commands/KickCommand.java b/net/minecraft/server/commands/KickCommand.java -index 5f78d629bab84acb2fa43a9fcc1cec52b4e91ae3..1c6059bd23afdd555d2dc8c533a5b027957c7b3a 100644 +index 808c36bd2324c7b956cf1f32d9a4dac0ce4ad828..fc28d71048224180b6d0a60bfb7b758db8f5a728 100644 --- a/net/minecraft/server/commands/KickCommand.java +++ b/net/minecraft/server/commands/KickCommand.java -@@ -46,9 +46,17 @@ public class KickCommand { - if (!source.getServer().isPublished()) { +@@ -39,9 +39,17 @@ public class KickCommand { throw ERROR_SINGLEPLAYER.create(); - } else { -+ boolean hasBot = false; // Leaves - disable kick - int i = 0; - - for (ServerPlayer serverPlayer : players) { -+ // Leaves start - disable kick -+ if (serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot) { -+ source.sendFailure(Component.literal("Permission denied")); -+ hasBot = true; -+ continue; -+ } -+ // Leaves end - disable kick - if (!source.getServer().isSingleplayerOwner(serverPlayer.nameAndId())) { - serverPlayer.connection.disconnect(reason, org.bukkit.event.player.PlayerKickEvent.Cause.KICK_COMMAND); // Paper - kick event cause - source.sendSuccess(() -> Component.translatable("commands.kick.success", serverPlayer.getDisplayName(), reason), true); -@@ -57,7 +65,13 @@ public class KickCommand { - } + } - if (i == 0) { -- throw ERROR_KICKING_OWNER.create(); -+ // Leaves start - disable kick -+ if (hasBot) { -+ return i; -+ } else { -+ throw ERROR_KICKING_OWNER.create(); -+ } -+ // Leaves end - disable kick - } else { - return i; - } ++ boolean hasBot = false; // Leaves - disable kick + int count = 0; + + for (ServerPlayer player : players) { ++ // Leaves start - disable kick ++ if (player instanceof org.leavesmc.leaves.bot.ServerBot) { ++ source.sendFailure(Component.literal("Permission denied")); ++ hasBot = true; ++ continue; ++ } ++ // Leaves end - disable kick + if (!source.getServer().isSingleplayerOwner(player.nameAndId())) { + player.connection.disconnect(reason, org.bukkit.event.player.PlayerKickEvent.Cause.KICK_COMMAND); // Paper - kick event cause + source.sendSuccess(() -> Component.translatable("commands.kick.success", player.getDisplayName(), reason), true); +@@ -50,7 +58,13 @@ public class KickCommand { + } + + if (count == 0) { +- throw ERROR_KICKING_OWNER.create(); ++ // Leaves start - disable kick ++ if (hasBot) { ++ return count; ++ } else { ++ throw ERROR_KICKING_OWNER.create(); ++ } ++ // Leaves end - disable kick + } else { + return count; + } diff --git a/net/minecraft/server/commands/OpCommand.java b/net/minecraft/server/commands/OpCommand.java -index 07332a86e6e0441bafacb020f27ec36a277f1486..590891d70a71ab30ceae3a3cf1923745e7c20b26 100644 +index 636f56bfc0e9075b257e2eb14e858975bdedd801..20cbc0e65fea3fc2d0033259c2f35e158ea81926 100644 --- a/net/minecraft/server/commands/OpCommand.java +++ b/net/minecraft/server/commands/OpCommand.java -@@ -43,6 +43,7 @@ public class OpCommand { - int i = 0; - - for (NameAndId nameAndId : players) { -+ if (nameAndId.isBot()) continue; // Leaves - disable op - if (!playerList.isOp(nameAndId)) { - playerList.op(nameAndId); - i++; +@@ -39,6 +39,7 @@ public class OpCommand { + int count = 0; + + for (NameAndId player : players) { ++ if (player.isBot()) continue; // Leaves - disable op + if (!list.isOp(player)) { + list.op(player); + count++; diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index 2e6af078b8713cccf4dd51df53ce580a26553ae1..6817fe059655ea93030aea69dfbe4fd6714fe1e4 100644 +index 84684c28756629b428e764d38c84b71c9c103f8f..254aeaf65cc75fed4b734d7dbc86f960ee9b3bc3 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -252,6 +252,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -269,6 +269,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface } // Spigot start @@ -222,24 +222,24 @@ index 2e6af078b8713cccf4dd51df53ce580a26553ae1..6817fe059655ea93030aea69dfbe4fd6 this.setPlayerList(new DedicatedPlayerList(this, this.registries(), this.playerDataStorage)); org.spigotmc.SpigotConfig.init((java.io.File) this.options.valueOf("spigot-settings")); org.spigotmc.SpigotConfig.registerCommands(); -@@ -275,6 +276,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now +@@ -290,6 +291,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface + this.server.spark.registerCommandBeforePlugins(this.server); // Paper - spark org.leavesmc.leaves.LeavesConfig.init((java.io.File) options.valueOf("leaves-settings")); // Leaves - Server Config + this.getBotList().loadResumeBotInfo(); // Leaves - load resident bot info - com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics // Leaves - down - + com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics + com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java -index ab8893163ac85971a470e4a4d6fa76bd174e2bae..03aaf6d85f578f1a73dfe41d1d9fb49c7b16aa2f 100644 +index 42ec67c53c35189838ce4767c2be620e05108159..2e44b338893aaf30ba36eace5796971f52012e19 100644 --- a/net/minecraft/server/level/ChunkMap.java +++ b/net/minecraft/server/level/ChunkMap.java -@@ -1398,6 +1398,13 @@ public class ChunkMap extends SimpleRegionStorage implements ChunkHolder.PlayerP +@@ -1396,6 +1396,13 @@ public class ChunkMap extends SimpleRegionStorage implements ChunkHolder.PlayerP } } else { this.removePlayer(player); + // Leaves start - render bot -+ if (entity instanceof org.leavesmc.leaves.bot.ServerBot bot) { ++ if (this.entity instanceof org.leavesmc.leaves.bot.ServerBot bot) { + if (bot.needSendFakeData(player)) { + bot.sendFakeData(player.connection, false); + } @@ -249,10 +249,10 @@ index ab8893163ac85971a470e4a4d6fa76bd174e2bae..03aaf6d85f578f1a73dfe41d1d9fb49c } } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 9cb40d4f0ceabadb95f473e96029bd57a2b09204..1d5a815b87b2ec9d535658f9e5ad8febbfa9b19a 100644 +index 7e90784a38bccfe6707ea7e10946c39db995f969..189dbd2c332dd706900448c300bb6db5ed652012 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -228,6 +228,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -234,6 +234,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) @@ -260,7 +260,7 @@ index 9cb40d4f0ceabadb95f473e96029bd57a2b09204..1d5a815b87b2ec9d535658f9e5ad8feb @Override public @Nullable LevelChunk getChunkIfLoaded(int x, int z) { -@@ -709,6 +710,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -738,6 +739,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet this.chunkDataController = new ca.spottedleaf.moonrise.patches.chunk_system.io.datacontroller.ChunkDataController((ServerLevel)(Object)this, this.chunkTaskScheduler); // Paper end - rewrite chunk system this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit @@ -268,7 +268,7 @@ index 9cb40d4f0ceabadb95f473e96029bd57a2b09204..1d5a815b87b2ec9d535658f9e5ad8feb } // Paper start -@@ -2310,6 +2312,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2374,6 +2376,12 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet return this.players; } @@ -279,37 +279,37 @@ index 9cb40d4f0ceabadb95f473e96029bd57a2b09204..1d5a815b87b2ec9d535658f9e5ad8feb + // Leaves end - fakeplayer skip + @Override - public void updatePOIOnBlockStateChange(BlockPos pos, BlockState oldState, BlockState newState) { - Optional> optional = PoiTypes.forState(oldState); -@@ -2780,6 +2788,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + public void updatePOIOnBlockStateChange(final BlockPos pos, final BlockState oldState, final BlockState newState) { + Optional> oldType = PoiTypes.forState(oldState); +@@ -2848,6 +2856,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet // ServerLevel.this.getChunkSource().addEntity(entity); // Paper - ignore and warn about illegal addEntity calls instead of crashing server; moved down below valid=true - if (entity instanceof ServerPlayer serverPlayer) { - ServerLevel.this.players.add(serverPlayer); + if (entity instanceof ServerPlayer player) { + ServerLevel.this.players.add(player); + // Leaves start - skip -+ if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot)) { -+ ServerLevel.this.realPlayers.add(serverPlayer); ++ if (!(player instanceof org.leavesmc.leaves.bot.ServerBot)) { ++ ServerLevel.this.realPlayers.add(player); + } + // Leaves end - skip - if (serverPlayer.isReceivingWaypoints()) { - ServerLevel.this.getWaypointManager().addPlayer(serverPlayer); + if (player.isReceivingWaypoints()) { + ServerLevel.this.getWaypointManager().addPlayer(player); } -@@ -2858,6 +2871,11 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2926,6 +2939,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet ServerLevel.this.getChunkSource().removeEntity(entity); - if (entity instanceof ServerPlayer serverPlayer) { - ServerLevel.this.players.remove(serverPlayer); + if (entity instanceof ServerPlayer player) { + ServerLevel.this.players.remove(player); + // Leaves start - skip -+ if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot)) { -+ ServerLevel.this.realPlayers.remove(serverPlayer); ++ if (!(player instanceof org.leavesmc.leaves.bot.ServerBot)) { ++ ServerLevel.this.realPlayers.remove(player); + } + // Leaves end - skip - ServerLevel.this.getWaypointManager().removePlayer(serverPlayer); + ServerLevel.this.getWaypointManager().removePlayer(player); ServerLevel.this.updateSleepingPlayerList(); } diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 79c804245c7f41a5a7f062e1c5e01760adde7d84..8c38a1b97203661454c099746472206a7954b5bc 100644 +index 60ff8173750b57aa05bb19a3dd1c744f870f59a5..c869682651fe3479aafcf4632a4f203b88ef9e95 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -227,7 +227,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -228,7 +228,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc private static final boolean DEFAULT_SPAWN_EXTRA_PARTICLES_ON_FALL = false; public ServerGamePacketListenerImpl connection; private final MinecraftServer server; @@ -318,7 +318,7 @@ index 79c804245c7f41a5a7f062e1c5e01760adde7d84..8c38a1b97203661454c099746472206a private final PlayerAdvancements advancements; private final ServerStatsCounter stats; private float lastRecordedHealthAndAbsorption = Float.MIN_VALUE; -@@ -247,7 +247,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -248,7 +248,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc private @Nullable Entity camera; public boolean isChangingDimension; public boolean seenCredits = false; @@ -327,7 +327,7 @@ index 79c804245c7f41a5a7f062e1c5e01760adde7d84..8c38a1b97203661454c099746472206a private @Nullable Vec3 levitationStartPos; private int levitationStartTime; private boolean disconnected; -@@ -1247,7 +1247,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1243,7 +1243,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.connection.markClientUnloadedAfterDeath(); } @@ -336,37 +336,37 @@ index 79c804245c7f41a5a7f062e1c5e01760adde7d84..8c38a1b97203661454c099746472206a AABB aabb = new AABB(this.blockPosition()).inflate(32.0, 10.0, 32.0); this.level() .getEntitiesOfClass(Mob.class, aabb, EntitySelector.NO_SPECTATORS) -@@ -1560,6 +1560,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - this.lastSentHealth = -1.0F; - this.lastSentFood = -1; - this.teleportSpectators(teleportTransition, serverLevel); -+ // Leaves start - bot support -+ if (org.leavesmc.leaves.LeavesConfig.modify.fakeplayer.enable) { -+ this.server.getBotList().bots.forEach(bot -> bot.sendFakeDataIfNeed(this, true)); // Leaves - render bot -+ } -+ // Leaves end - bot support - // CraftBukkit start - org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), serverLevel.getWorld()); - this.level().getCraftServer().getPluginManager().callEvent(changeEvent); +@@ -1568,6 +1568,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + this.lastSentHealth = -1.0F; + this.lastSentFood = -1; + this.teleportSpectators(transition, oldLevel); ++ // Leaves start - bot support ++ if (org.leavesmc.leaves.LeavesConfig.modify.fakeplayer.enable) { ++ this.server.getBotList().bots.forEach(bot -> bot.sendFakeDataIfNeed(this, true)); // Leaves - render bot ++ } ++ // Leaves end - bot support + // CraftBukkit start + org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), oldLevel.getWorld()); + this.level().getCraftServer().getPluginManager().callEvent(changeEvent); diff --git a/net/minecraft/server/players/CachedUserNameToIdResolver.java b/net/minecraft/server/players/CachedUserNameToIdResolver.java -index 6d3f496881492ac67465746984d6ef8302750305..da1344437875f38a77d85cc6f255ff855957efaa 100644 +index ce26768b951a5cd3e3337ef5347ce1537d593486..437c3bf4ee59801e2b04ea2b0a78a6dd83e49d66 100644 --- a/net/minecraft/server/players/CachedUserNameToIdResolver.java +++ b/net/minecraft/server/players/CachedUserNameToIdResolver.java @@ -122,6 +122,12 @@ public class CachedUserNameToIdResolver implements UserNameToIdResolver { @Override - public Optional get(String name) { + public Optional get(final String name) { + // Leaves start - fix bot + org.leavesmc.leaves.bot.ServerBot bot = org.leavesmc.leaves.bot.BotList.INSTANCE.getBotByName(name); + if (bot != null) { + return Optional.of(bot.nameAndId()); + } + // Leaves end - fix bot - String string = name.toLowerCase(Locale.ROOT); + String userName = name.toLowerCase(Locale.ROOT); boolean stateLocked = true; try { this.stateLock.lock(); // Paper - Fix GameProfileCache concurrency - CachedUserNameToIdResolver.GameProfileInfo gameProfileInfo = this.profilesByName.get(string); + CachedUserNameToIdResolver.GameProfileInfo profileInfo = this.profilesByName.get(userName); diff --git a/net/minecraft/server/players/NameAndId.java b/net/minecraft/server/players/NameAndId.java -index 05b4a75f6597e8613c91344d100bb7f005d169a7..9a5006362c12e972d031c48be4d30362d88d1c00 100644 +index 12190f2a2856b0d0cf95144d0b1622f1b9600bf6..be01f06d4ee02854345842c97382e8b6401ab948 100644 --- a/net/minecraft/server/players/NameAndId.java +++ b/net/minecraft/server/players/NameAndId.java @@ -8,18 +8,22 @@ import java.util.UUID; @@ -376,50 +376,50 @@ index 05b4a75f6597e8613c91344d100bb7f005d169a7..9a5006362c12e972d031c48be4d30362 -public record NameAndId(UUID id, String name) { +public record NameAndId(UUID id, String name, boolean isBot) { // Leaves - fakeplayer public static final Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group(UUIDUtil.STRING_CODEC.fieldOf("id").forGetter(NameAndId::id), Codec.STRING.fieldOf("name").forGetter(NameAndId::name)) - .apply(instance, NameAndId::new) + i -> i.group(UUIDUtil.STRING_CODEC.fieldOf("id").forGetter(NameAndId::id), Codec.STRING.fieldOf("name").forGetter(NameAndId::name)) + .apply(i, NameAndId::new) ); - public NameAndId(GameProfile profile) { + public NameAndId(final GameProfile profile) { - this(profile.id(), profile.name()); + this(profile.id(), profile.name(), com.google.common.collect.Iterables.getFirst(profile.properties().get("is_bot"), "false").equals("true")); // Leaves - fakeplayer } - public NameAndId(com.mojang.authlib.yggdrasil.response.NameAndId nameAndId) { -- this(nameAndId.id(), nameAndId.name()); -+ this(nameAndId.id(), nameAndId.name(), false); // Leaves - fakeplayer + public NameAndId(final com.mojang.authlib.yggdrasil.response.NameAndId profile) { +- this(profile.id(), profile.name()); ++ this(profile.id(), profile.name(), false); // Leaves - fakeplayer + } + + public NameAndId(UUID uuid, String name) { + this(uuid, name, false); // Leaves - fakeplayer } - public static @Nullable NameAndId fromJson(JsonObject json) { + public static @Nullable NameAndId fromJson(final JsonObject object) { @@ -33,7 +37,7 @@ public record NameAndId(UUID id, String name) { return null; } -- return new NameAndId(uuid, json.get("name").getAsString()); -+ return new NameAndId(uuid, json.get("name").getAsString(), false); // Leaves - fakeplayer +- return new NameAndId(uuid, object.get("name").getAsString()); ++ return new NameAndId(uuid, object.get("name").getAsString(), false); // Leaves - fakeplayer } else { return null; } @@ -46,7 +50,7 @@ public record NameAndId(UUID id, String name) { - public static NameAndId createOffline(String name) { - UUID uuid = UUIDUtil.createOfflinePlayerUUID(name); -- return new NameAndId(uuid, name); -+ return new NameAndId(uuid, name, false); // Leaves - fakeplayer + public static NameAndId createOffline(final String name) { + UUID id = UUIDUtil.createOfflinePlayerUUID(name); +- return new NameAndId(id, name); ++ return new NameAndId(id, name, false); // Leaves - fakeplayer } // Paper start - utility method for common conversion back to the game profile diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index c5dac6310dc82d4e5d9cc9df79f943bfb235c083..8baca1186179d49e1f8dc0e3acb39816bd61967d 100644 +index 8ef8cc7a33ea8e2d368a273000b157958ad19ccb..adc1e97353b59dd79574d83a0a3d5ae41c06749c 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -246,6 +246,19 @@ public abstract class PlayerList { +@@ -247,6 +247,19 @@ public abstract class PlayerList { - org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); + org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); // Leaves - protocol + // Leaves start - bot support + if (org.leavesmc.leaves.LeavesConfig.modify.fakeplayer.enable) { @@ -437,76 +437,77 @@ index c5dac6310dc82d4e5d9cc9df79f943bfb235c083..8baca1186179d49e1f8dc0e3acb39816 final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure -@@ -706,6 +719,12 @@ public abstract class PlayerList { +@@ -704,6 +717,11 @@ public abstract class PlayerList { respawnReason ).callEvent(); // Paper end + // Leaves start - bot support + if (org.leavesmc.leaves.LeavesConfig.modify.fakeplayer.enable) { -+ this.server.getBotList().bots.forEach(bot -> bot.sendFakeDataIfNeed(serverPlayer, true)); // Leaves - render bot ++ this.server.getBotList().bots.forEach(bot -> bot.sendFakeDataIfNeed(player, true)); // Leaves - render bot + } + // Leaves end - bot support -+ - return serverPlayer; + return player; } -@@ -808,11 +827,16 @@ public abstract class PlayerList { +@@ -806,11 +824,16 @@ public abstract class PlayerList { } public String[] getPlayerNamesArray() { -- String[] strings = new String[this.players.size()]; -+ String[] strings = new String[this.players.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support +- String[] names = new String[this.players.size()]; ++ String[] names = new String[this.players.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support for (int i = 0; i < this.players.size(); i++) { - strings[i] = this.players.get(i).getGameProfile().name(); + names[i] = this.players.get(i).getGameProfile().name(); } + // Leaves start - fakeplayer support -+ for (int i = this.players.size(); i < strings.length; ++i) { -+ strings[i] = this.server.getBotList().bots.get(i - this.players.size()).getGameProfile().getName(); ++ for (int i = this.players.size(); i < names.length; ++i) { ++ names[i] = this.server.getBotList().bots.get(i - this.players.size()).gameProfile.name(); + } + // Leaves end - fakeplayer support - return strings; + return names; } -@@ -922,7 +946,14 @@ public abstract class PlayerList { +@@ -919,8 +942,15 @@ public abstract class PlayerList { + || this.allowCommandsForAllPlayers; } - public @Nullable ServerPlayer getPlayerByName(String username) { -- return this.playersByName.get(username.toLowerCase(java.util.Locale.ROOT)); // Spigot +- public @Nullable ServerPlayer getPlayerByName(final String name) { +- return this.playersByName.get(name.toLowerCase(java.util.Locale.ROOT)); // Spigot ++ public @Nullable ServerPlayer getPlayerByName(String name) { + // Leaves start - fakeplayer support -+ username = username.toLowerCase(java.util.Locale.ROOT); -+ ServerPlayer player = this.playersByName.get(username); ++ name = name.toLowerCase(java.util.Locale.ROOT); ++ ServerPlayer player = this.playersByName.get(name); + if (player == null) { -+ player = this.server.getBotList().getBotByName(username); ++ player = this.server.getBotList().getBotByName(name); + } + return player; // Spigot + // Leaves end - fakeplayer support } - public void broadcast(@Nullable Player except, double x, double y, double z, double radius, ResourceKey dimension, Packet packet) { -@@ -1234,7 +1265,13 @@ public abstract class PlayerList { + public void broadcast( +@@ -1236,7 +1266,13 @@ public abstract class PlayerList { } - public @Nullable ServerPlayer getPlayer(UUID playerUUID) { -- return this.playersByUUID.get(playerUUID); + public @Nullable ServerPlayer getPlayer(final UUID uuid) { +- return this.playersByUUID.get(uuid); + // Leaves start - fakeplayer support -+ ServerPlayer player = this.playersByUUID.get(playerUUID); ++ ServerPlayer player = this.playersByUUID.get(uuid); + if (player == null) { -+ player = this.server.getBotList().getBot(playerUUID); ++ player = this.server.getBotList().getBot(uuid); + } + return player; + // Leaves start - fakeplayer support } - public @Nullable ServerPlayer getPlayer(String name) { + public @Nullable ServerPlayer getPlayer(final String playerName) { diff --git a/net/minecraft/server/waypoints/ServerWaypointManager.java b/net/minecraft/server/waypoints/ServerWaypointManager.java -index 471e558a609c9e457720660b90fe57322b860461..ac09b59b9b49badcec0922e3013809f041cc2919 100644 +index b9748a392c9f76e61a1b673085b4dd74c007c70d..654e7956e7d540842a16d797247b6aa1d5bcd280 100644 --- a/net/minecraft/server/waypoints/ServerWaypointManager.java +++ b/net/minecraft/server/waypoints/ServerWaypointManager.java -@@ -22,6 +22,11 @@ public class ServerWaypointManager implements WaypointManager public +- private Vec3 collide(final Vec3 movement) { ++ public Vec3 collide(final Vec3 movement) { // Leaves - private -> public + // Paper start - optimise collisions final boolean xZero = movement.x == 0.0; final boolean yZero = movement.y == 0.0; - final boolean zZero = movement.z == 0.0; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 6f49b5e5888a6296b929e465a5ef87dc49bd4516..8968ca0dffc42bd74c5159e5d602361dd016ef88 100644 +index 358ff4330102a058c86d8209374d8cb9dd18b6ad..3e9c25b7ac2ef0512ef8749f0de84a9d7fd59da9 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3222,7 +3222,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - private void travelRidden(Player player, Vec3 travelVector) { - Vec3 riddenInput = this.getRiddenInput(player, travelVector); - this.tickRidden(player, riddenInput); +@@ -3272,7 +3272,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + private void travelRidden(final Player controller, final Vec3 selfInput) { + Vec3 riddenInput = this.getRiddenInput(controller, selfInput); + this.tickRidden(controller, riddenInput); - if (this.canSimulateMovement()) { + if (this.canSimulateMovement() || this.getControllingPassenger() instanceof org.leavesmc.leaves.bot.ServerBot) { // Leaves - Fakeplayer - this.setSpeed(this.getRiddenSpeed(player)); + this.setSpeed(this.getRiddenSpeed(controller)); this.travel(riddenInput); } else { -@@ -4130,7 +4130,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -4196,7 +4196,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin // Paper start - lag compensate eating // we add 1 to the expected time to avoid lag compensating when we should not final boolean shouldLagCompensate = this.useItem.has(DataComponents.FOOD) && this.eatStartTime != -1 && (System.nanoTime() - this.eatStartTime) > ((1L + this.totalEatTimeTicks) * 50L * (1000L * 1000L)); -- if ((--this.useItemRemaining == 0 || shouldLagCompensate) && !this.level().isClientSide() && !usingItem.useOnRelease()) { -+ if ((--this.useItemRemaining == 0 || shouldLagCompensate) && !(this instanceof org.leavesmc.leaves.bot.ServerBot) && !this.level().isClientSide() && !usingItem.useOnRelease()) { +- if ((--this.useItemRemaining == 0 || shouldLagCompensate) && !this.level().isClientSide() && !useItem.useOnRelease()) { ++ if ((--this.useItemRemaining == 0 || shouldLagCompensate) && !(this instanceof org.leavesmc.leaves.bot.ServerBot) && !this.level().isClientSide() && !useItem.useOnRelease()) { this.useItemRemaining = 0; // Paper end - lag compensate eating this.completeUsingItem(); -@@ -4315,6 +4315,23 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -4385,6 +4385,23 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.stopUsingItem(); } @@ -594,22 +595,22 @@ index 6f49b5e5888a6296b929e465a5ef87dc49bd4516..8968ca0dffc42bd74c5159e5d602361d + public void stopUsingItem() { if (!this.level().isClientSide()) { - boolean isUsingItem = this.isUsingItem(); + boolean wasUsingItem = this.isUsingItem(); diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index e4240fa38fb8513c7e320a4b30e6dcbb7e015310..54bf31d2f6ac925abd6c13756eba05301343ac3f 100644 +index e34b050cfeb9d9afa1869b19ff862627d27d60f7..b75702a359cef9ecbf92c7c4f0c8eae1e8020d10 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -168,7 +168,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -166,7 +166,7 @@ public abstract class Player extends Avatar implements ContainerUser { private int lastLevelUpTime; public GameProfile gameProfile; private boolean reducedDebugInfo; - private ItemStack lastItemInMainHand = ItemStack.EMPTY; -+ protected ItemStack lastItemInMainHand = ItemStack.EMPTY; ++ protected ItemStack lastItemInMainHand = ItemStack.EMPTY; // Leaves - fakeplayer private final ItemCooldowns cooldowns = this.createItemCooldowns(); private Optional lastDeathLocation = Optional.empty(); public @Nullable FishingHook fishing; -@@ -309,6 +309,12 @@ public abstract class Player extends Avatar implements ContainerUser { - } +@@ -303,6 +303,12 @@ public abstract class Player extends Avatar implements ContainerUser { + this.updatePlayerPose(); } + // Leaves start - fakeplayer @@ -621,26 +622,26 @@ index e4240fa38fb8513c7e320a4b30e6dcbb7e015310..54bf31d2f6ac925abd6c13756eba0530 @Override protected float getMaxHeadRotationRelativeToBody() { return this.isBlocking() ? 15.0F : super.getMaxHeadRotationRelativeToBody(); -@@ -534,7 +540,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -528,7 +534,7 @@ public abstract class Player extends Avatar implements ContainerUser { public void removeEntitiesOnShoulder() { } -- private void touch(Entity entity) { -+ public void touch(Entity entity) { // Leaves - private -> public +- private void touch(final Entity entity) { ++ public void touch(final Entity entity) { // Leaves - private -> public entity.playerTouch(this); } -@@ -1211,7 +1217,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -1215,7 +1221,7 @@ public abstract class Player extends Avatar implements ContainerUser { // Paper end - Configurable sprint interruption on attack } -- if (target instanceof ServerPlayer && target.hurtMarked) { -+ if ((target instanceof ServerPlayer && !(target instanceof org.leavesmc.leaves.bot.ServerBot)) && target.hurtMarked) { // Leaves - bot knockback +- if (entity instanceof ServerPlayer && entity.hurtMarked) { ++ if ((entity instanceof ServerPlayer && !(entity instanceof org.leavesmc.leaves.bot.ServerBot)) && entity.hurtMarked) { // Leaves - bot knockback // CraftBukkit start - Add Velocity Event boolean cancelled = false; - org.bukkit.entity.Player player = (org.bukkit.entity.Player) target.getBukkitEntity(); + org.bukkit.entity.Player player = (org.bukkit.entity.Player) entity.getBukkitEntity(); diff --git a/net/minecraft/world/entity/projectile/FishingHook.java b/net/minecraft/world/entity/projectile/FishingHook.java -index 4a7abf4ae0c1f4c22c1c77d5ce9e67418b274365..30e3c19adcdc55fa468257037ca49275c09de324 100644 +index 3e29bd82521b18a493f9b5b5b23cdb9c03cc94ba..2d79dbb3e9667e810004cab440c7027800434c84 100644 --- a/net/minecraft/world/entity/projectile/FishingHook.java +++ b/net/minecraft/world/entity/projectile/FishingHook.java @@ -58,7 +58,7 @@ public class FishingHook extends Projectile { @@ -653,7 +654,7 @@ index 4a7abf4ae0c1f4c22c1c77d5ce9e67418b274365..30e3c19adcdc55fa468257037ca49275 public int timeUntilHooked; public float fishAngle; diff --git a/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java b/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java -index 6b337848d91cc4f24655d053bc69b0cd22447dda..cc16a8a2fd05d472d777b7a5f812d900b49e57ed 100644 +index 84c97b21400d642e225e30f882fbd6a58684496a..d1ad1804db0de29ced18b38b44a779ea04872cc2 100644 --- a/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java +++ b/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java @@ -270,6 +270,11 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { @@ -683,23 +684,23 @@ index 6b337848d91cc4f24655d053bc69b0cd22447dda..cc16a8a2fd05d472d777b7a5f812d900 return switch (this.getStatus()) { case IN_WATER, UNDER_WATER, UNDER_FLOWING_WATER -> SoundEvents.BOAT_PADDLE_WATER; diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java -index f51dbc45204c2727122aeb6b5002216e3200680d..b5837ee5e291ae23bd8613c4c1856c14dd9e152b 100644 +index 9f5da4dc6033e60915e8566852c1983ca562301a..ded1c27b2083aea24525ffe42ad0e9cc263cbcdb 100644 --- a/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/net/minecraft/world/inventory/AbstractContainerMenu.java -@@ -397,6 +397,7 @@ public abstract class AbstractContainerMenu { +@@ -398,6 +398,7 @@ public abstract class AbstractContainerMenu { - private void doClick(int slotIndex, int button, ClickType clickType, Player player) { + private void doClick(final int slotIndex, final int buttonNum, final ContainerInput containerInput, final Player player) { Inventory inventory = player.getInventory(); -+ if (!doClickCheck(slotIndex, button, clickType, player)) return; // Leaves - doClick check - if (clickType == ClickType.QUICK_CRAFT) { - int i = this.quickcraftStatus; - this.quickcraftStatus = getQuickcraftHeader(button); -@@ -671,6 +672,22 @@ public abstract class AbstractContainerMenu { ++ if (!doClickCheck(slotIndex, buttonNum, containerInput, player)) return; // Leaves - doClick check + if (containerInput == ContainerInput.QUICK_CRAFT) { + int expectedStatus = this.quickcraftStatus; + this.quickcraftStatus = getQuickcraftHeader(buttonNum); +@@ -672,6 +673,22 @@ public abstract class AbstractContainerMenu { } } + // Leaves start - doClick check -+ private boolean doClickCheck(int slotIndex, int button, ClickType actionType, Player player) { ++ private boolean doClickCheck(int slotIndex, int buttonNum, ContainerInput containerInput, Player player) { + if (slotIndex < 0) { + return true; + } @@ -714,23 +715,23 @@ index f51dbc45204c2727122aeb6b5002216e3200680d..b5837ee5e291ae23bd8613c4c1856c14 + } + // Leaves end - doClick check + - private boolean tryItemClickBehaviourOverride(Player player, ClickAction action, Slot slot, ItemStack clickedItem, ItemStack carriedItem) { - FeatureFlagSet featureFlagSet = player.level().enabledFeatures(); - return carriedItem.isItemEnabled(featureFlagSet) && carriedItem.overrideStackedOnOther(slot, action, player) + private boolean tryItemClickBehaviourOverride( + final Player player, final ClickAction clickAction, final Slot slot, final ItemStack clicked, final ItemStack carried + ) { diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index ed06cffe8a5eba2ca4a34ade81f8185e21d7b651..3a719a98118c275422f4fc61b07d471dd503656f 100644 +index 1d08ac66271a441811a157ed6619b14bf58c403f..f21148d51f52674a3b6f82f510d05be83b676123 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -448,7 +448,7 @@ public final class ItemStack implements DataComponentHolder { - placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(serverLevel, player, hand, blocks.getFirst(), clickedPos); - } +@@ -445,7 +445,7 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { + placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(level, player, hand, blocks.getFirst(), pos); + } -- if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { -+ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild()) && (!(player instanceof org.leavesmc.leaves.bot.ServerBot))) { // Leaves - Fakeplayer skip this check - interactionResult = InteractionResult.FAIL; // cancel placement - // PAIL: Remove this when MC-99075 fixed - player.containerMenu.forceHeldSlot(hand); -@@ -979,6 +979,20 @@ public final class ItemStack implements DataComponentHolder { +- if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { ++ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild()) && (!(player instanceof org.leavesmc.leaves.bot.ServerBot))) { // Leaves - Fakeplayer skip this check + result = InteractionResult.FAIL; // cancel placement + // PAIL: Remove this when MC-99075 fixed + player.containerMenu.forceHeldSlot(hand); +@@ -981,6 +981,20 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { } } @@ -752,44 +753,31 @@ index ed06cffe8a5eba2ca4a34ade81f8185e21d7b651..3a719a98118c275422f4fc61b07d471d return this.getItem().useOnRelease(this); } diff --git a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -index bc42a6c678987a39b0a70a1a3e96eb90340ffea5..7223cd393c4ef9408ab22c2e4d16458c19f29423 100644 +index c5c0b01c41055a82e49c1546d4525da0acce13a4..65f332462cdd60fb00f4dd7be4fccd250bfc69d9 100644 --- a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java +++ b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -@@ -135,7 +135,7 @@ public class PistonMovingBlockEntity extends BlockEntity { +@@ -142,7 +142,7 @@ public class PistonMovingBlockEntity extends BlockEntity { break; } - if (!(entity instanceof ServerPlayer)) { + if (!(entity instanceof ServerPlayer) || (entity instanceof org.leavesmc.leaves.bot.ServerBot)) { // Leaves - bot slime block Vec3 deltaMovement = entity.getDeltaMovement(); - double d1 = deltaMovement.x; - double d2 = deltaMovement.y; + double dx = deltaMovement.x; + double dy = deltaMovement.y; diff --git a/net/minecraft/world/level/levelgen/PhantomSpawner.java b/net/minecraft/world/level/levelgen/PhantomSpawner.java -index 135e8cc1b423d5a2a96ede693a306534ea45686b..7ac57cdaa05e9ccf053a7060b42e91904bb9ad2b 100644 +index dfec8a0dfac93d98a69f9d1516f0436feb7b0777..574bf8e4c75eeb8b6d9f54583e610dd13eb7bc25 100644 --- a/net/minecraft/world/level/levelgen/PhantomSpawner.java +++ b/net/minecraft/world/level/levelgen/PhantomSpawner.java @@ -48,6 +48,11 @@ public class PhantomSpawner implements CustomSpawner { - ServerStatsCounter stats = serverPlayer.getStats(); - int i = Mth.clamp(stats.getValue(Stats.CUSTOM.get(Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE); - int i1 = 24000; + ServerStatsCounter stats = player.getStats(); + int value = Mth.clamp(stats.getValue(Stats.CUSTOM.get(Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE); + int dayLength = 24000; + // Leaves start - fakeplayer spawn -+ if (serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot bot && bot.getConfigValue(org.leavesmc.leaves.bot.agent.Configs.SPAWN_PHANTOM)) { -+ i1 = Math.max(bot.notSleepTicks, 1); ++ if (player instanceof org.leavesmc.leaves.bot.ServerBot bot && bot.getConfigValue(org.leavesmc.leaves.bot.agent.Configs.SPAWN_PHANTOM)) { ++ dayLength = Math.max(bot.notSleepTicks, 1); + } + // Leaves end - fakeplayer spawn - if (randomSource.nextInt(i) >= 72000) { - BlockPos blockPos1 = blockPos.above(20 + randomSource.nextInt(15)) - .east(-10 + randomSource.nextInt(21)) -diff --git a/net/minecraft/world/level/storage/LevelResource.java b/net/minecraft/world/level/storage/LevelResource.java -index bef794c3f58c41d910aa0bcc63fbdeea7225fddf..a601da588e6973cc5b87d3e3eeba49b53f6d9a6d 100644 ---- a/net/minecraft/world/level/storage/LevelResource.java -+++ b/net/minecraft/world/level/storage/LevelResource.java -@@ -15,7 +15,7 @@ public class LevelResource { - public static final LevelResource ROOT = new LevelResource("."); - private final String id; - -- private LevelResource(String id) { -+ public LevelResource(String id) { // Leaves - private -> public - this.id = id; - } - + if (random.nextInt(value) >= level.paperConfig().entities.behavior.playerInsomniaStartTicks) { // Paper - Ability to control player's insomnia and phantoms + BlockPos spawnPos = playerPos.above(20 + random.nextInt(15)) + .east(-10 + random.nextInt(21)) diff --git a/leaves-server/minecraft-patches/features/0008-Make-shears-in-dispenser-can-unlimited-use.patch b/leaves-server/minecraft-patches/features/0008-Make-shears-in-dispenser-can-unlimited-use.patch index b27ab73a9..5354a7408 100644 --- a/leaves-server/minecraft-patches/features/0008-Make-shears-in-dispenser-can-unlimited-use.patch +++ b/leaves-server/minecraft-patches/features/0008-Make-shears-in-dispenser-can-unlimited-use.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Make shears in dispenser can unlimited use diff --git a/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java b/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java -index 7d8f8ab3657e4a872e64176f89eca54d09c71ef1..6d3c6506ed82f24090496189402ff8946b960325 100644 +index 9be83df28d72c7952916e31540d4d9d7e56c0546..1471628bd6374d40d6fb96c6ae44da0526925d1e 100644 --- a/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java +++ b/net/minecraft/core/dispenser/ShearsDispenseItemBehavior.java @@ -45,7 +45,7 @@ public class ShearsDispenseItemBehavior extends OptionalDispenseItemBehavior { - BlockPos blockPos = blockSource.pos().relative(blockSource.state().getValue(DispenserBlock.FACING)); - this.setSuccess(tryShearBeehive(serverLevel, item, blockPos) || tryShearEntity(serverLevel, blockPos, item, bukkitBlock, craftItem)); // CraftBukkit + BlockPos pos = source.pos().relative(source.state().getValue(DispenserBlock.FACING)); + this.setSuccess(tryShearBeehive(level, dispensed, pos) || tryShearEntity(level, pos, dispensed, bukkitBlock, craftItem)); // CraftBukkit if (this.isSuccess()) { -- item.hurtAndBreak(1, serverLevel, null, item1 -> {}); -+ item.hurtAndBreak(1, serverLevel, null, item1 -> { if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.shearsInDispenserCanZeroAmount) item.grow(1); }); // Leaves - Make shears in dispenser can unlimited use +- dispensed.hurtAndBreak(1, level, null, item -> {}); ++ dispensed.hurtAndBreak(1, level, null, item -> { if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.shearsInDispenserCanZeroAmount) dispensed.grow(1); }); // Leaves - Make shears in dispenser can unlimited use } } diff --git a/leaves-server/minecraft-patches/features/0009-Redstone-Shears-Wrench.patch b/leaves-server/minecraft-patches/features/0009-Redstone-Shears-Wrench.patch index f1a1e6960..febeb880c 100644 --- a/leaves-server/minecraft-patches/features/0009-Redstone-Shears-Wrench.patch +++ b/leaves-server/minecraft-patches/features/0009-Redstone-Shears-Wrench.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Redstone Shears Wrench diff --git a/net/minecraft/world/item/ShearsItem.java b/net/minecraft/world/item/ShearsItem.java -index 5e25ddf78f72ada318ef28d29199de9b93fe667e..6f48162a25e20d2439935e8995cede9497626322 100644 +index c9ecf7347f568b455c31e0a0f6d679e1a460e9bf..009054403ac445a6510a2d216d658b71663f80df 100644 --- a/net/minecraft/world/item/ShearsItem.java +++ b/net/minecraft/world/item/ShearsItem.java @@ -80,7 +80,10 @@ public class ShearsItem extends Item { @@ -14,7 +14,7 @@ index 5e25ddf78f72ada318ef28d29199de9b93fe667e..6f48162a25e20d2439935e8995cede94 } else { - return super.useOn(context); + // Leaves start - shears wrench -+ InteractionResult result = org.leavesmc.leaves.util.ShearsWrenchUtil.tryApplyRotate(context, blockState); ++ InteractionResult result = org.leavesmc.leaves.util.ShearsWrenchUtil.tryApplyRotate(context, state); + return result == null ? super.useOn(context) : result; + // Leaves end - shears wrench } diff --git a/leaves-server/minecraft-patches/features/0010-Add-isShrink-to-EntityResurrectEvent.patch b/leaves-server/minecraft-patches/features/0010-Add-isShrink-to-EntityResurrectEvent.patch index 430aad72b..60e07ce71 100644 --- a/leaves-server/minecraft-patches/features/0010-Add-isShrink-to-EntityResurrectEvent.patch +++ b/leaves-server/minecraft-patches/features/0010-Add-isShrink-to-EntityResurrectEvent.patch @@ -5,23 +5,23 @@ Subject: [PATCH] Add isShrink to EntityResurrectEvent diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 8968ca0dffc42bd74c5159e5d602361dd016ef88..96b9e04867a44a2f92120ab69562b956c8c021b7 100644 +index 3e9c25b7ac2ef0512ef8749f0de84a9d7fd59da9..6b85bde2b145e54135c1ce1100df3b605f2e9f1a 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1752,14 +1752,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - } +@@ -1755,14 +1755,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + } - final org.bukkit.inventory.EquipmentSlot handSlot = (hand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand) : null; -- final EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); + final org.bukkit.inventory.EquipmentSlot handSlot = (usedHand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(usedHand) : null; +- final EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); + final EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot, true); // Leaves - can dont shrink - event.setCancelled(itemStack == null); - this.level().getCraftServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - // Set death protection to null as the event was cancelled. Prevent any attempt at resurrection. - deathProtection = null; - } else { -- if (!itemInHand.isEmpty() && itemStack != null) { // Paper - only reduce item if actual totem was found -+ if (!itemInHand.isEmpty() && itemStack != null && event.isShrink()) { // Paper - only reduce item if actual totem was found // Leaves - can dont shrink - itemInHand.shrink(1); - } - // Paper start - fix NPE when pre-cancelled EntityResurrectEvent is uncancelled + event.setCancelled(protectionItem == null); + this.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + // Set death protection to null as the event was cancelled. Prevent any attempt at resurrection. + protection = null; + } else { +- if (!itemStack.isEmpty() && protectionItem != null) { // Paper - only reduce item if actual totem was found ++ if (!itemStack.isEmpty() && protectionItem != null && event.isShrink()) { // Paper - only reduce item if actual totem was found // Leaves - can dont shrink + itemStack.shrink(1); + } + // Paper start - fix NPE when pre-cancelled EntityResurrectEvent is uncancelled diff --git a/leaves-server/minecraft-patches/features/0011-Movable-Budding-Amethyst.patch b/leaves-server/minecraft-patches/features/0011-Movable-Budding-Amethyst.patch index 4972d201f..6b86cd5c1 100644 --- a/leaves-server/minecraft-patches/features/0011-Movable-Budding-Amethyst.patch +++ b/leaves-server/minecraft-patches/features/0011-Movable-Budding-Amethyst.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Movable Budding Amethyst diff --git a/net/minecraft/world/level/block/BuddingAmethystBlock.java b/net/minecraft/world/level/block/BuddingAmethystBlock.java -index 02326847187f5940751fda00a03856060ae8ae29..bb728c904bd401c2a681ca5d02d246b777ad8053 100644 +index eccc42d8a27bf8eba4e2c25ba5e2918c50939c5d..bb94004a9e9798961dabf27eb74e82c568a30e33 100644 --- a/net/minecraft/world/level/block/BuddingAmethystBlock.java +++ b/net/minecraft/world/level/block/BuddingAmethystBlock.java @@ -58,4 +58,12 @@ public class BuddingAmethystBlock extends AmethystBlock { - public static boolean canClusterGrowAtState(BlockState state) { - return state.isAir() || state.is(Blocks.WATER) && state.getFluidState().getAmount() == 8; + public static boolean canClusterGrowAtState(final BlockState state) { + return state.isAir() || state.is(Blocks.WATER) && state.getFluidState().isFull(); } + + // Leaves start - budding amethyst can push by piston diff --git a/leaves-server/minecraft-patches/features/0012-Spectator-dont-get-Advancement.patch b/leaves-server/minecraft-patches/features/0012-Spectator-dont-get-Advancement.patch index 277974c6c..d592c215b 100644 --- a/leaves-server/minecraft-patches/features/0012-Spectator-dont-get-Advancement.patch +++ b/leaves-server/minecraft-patches/features/0012-Spectator-dont-get-Advancement.patch @@ -5,18 +5,18 @@ Subject: [PATCH] Spectator dont get Advancement diff --git a/net/minecraft/server/PlayerAdvancements.java b/net/minecraft/server/PlayerAdvancements.java -index cd968c6971d054d9b66a0eaea4753a51ebb75b02..80d7227cb889fd3ef5d8563a00af5f3219b4496a 100644 +index f2536d631b041c01b98fa60c50cffbe1623ca327..562b444743c3cdcb9f27f55627d5e0eff5717f67 100644 --- a/net/minecraft/server/PlayerAdvancements.java +++ b/net/minecraft/server/PlayerAdvancements.java -@@ -166,6 +166,11 @@ public class PlayerAdvancements { - } - - public boolean award(AdvancementHolder advancement, String criterionKey) { +@@ -173,6 +173,11 @@ public class PlayerAdvancements { + return false; + } + // Leaves end - bot can't get advancement + // Leaves start - spectator don't get advancement + if (org.leavesmc.leaves.LeavesConfig.modify.spectatorDontGetAdvancement && player.gameMode.getGameModeForPlayer() == net.minecraft.world.level.GameType.SPECTATOR) { + return false; + } + // Leaves end - spectator don't get advancement - // Leaves start - bot can't get advancement - if (player instanceof org.leavesmc.leaves.bot.ServerBot) { - return false; + boolean result = false; + AdvancementProgress progress = this.getOrStartProgress(holder); + boolean wasDone = progress.isDone(); diff --git a/leaves-server/minecraft-patches/features/0013-Stick-can-change-ArmorStand-arm-status.patch b/leaves-server/minecraft-patches/features/0013-Stick-can-change-ArmorStand-arm-status.patch index 361a3eba2..6f05208a3 100644 --- a/leaves-server/minecraft-patches/features/0013-Stick-can-change-ArmorStand-arm-status.patch +++ b/leaves-server/minecraft-patches/features/0013-Stick-can-change-ArmorStand-arm-status.patch @@ -5,20 +5,20 @@ Subject: [PATCH] Stick can change ArmorStand arm status diff --git a/net/minecraft/world/entity/decoration/ArmorStand.java b/net/minecraft/world/entity/decoration/ArmorStand.java -index 79ae039d1908830e81912d230b3540a4920e2017..a35415dced4c15ece829cea74010f42f0cb00441 100644 +index f42fd10847a1dfbcbb2790aa90da4a49585e25a8..11f15d4c9a0c4e9e4fd115bddcd947e8b5fa5b47 100644 --- a/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/net/minecraft/world/entity/decoration/ArmorStand.java -@@ -229,6 +229,13 @@ public class ArmorStand extends LivingEntity { - return InteractionResult.SUCCESS_SERVER; - } - } else { +@@ -236,6 +236,13 @@ public class ArmorStand extends LivingEntity { + return InteractionResult.SUCCESS_SERVER; + } + } else { + // Leaves start - stick can change ArmorStand arm status -+ if (org.leavesmc.leaves.LeavesConfig.modify.stickChangeArmorStandArmStatus && itemInHand.is(Items.STICK) && player.isShiftKeyDown()) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.stickChangeArmorStandArmStatus && itemStack.is(Items.STICK) && player.isShiftKeyDown()) { + setShowArms(!showArms()); + return InteractionResult.FAIL; + } + // Leaves end - stick can change ArmorStand arm status + - if (this.isDisabled(equipmentSlotForItem)) { - return InteractionResult.FAIL; - } + if (this.isDisabled(itemInHandSlot)) { + return InteractionResult.FAIL; + } diff --git a/leaves-server/minecraft-patches/features/0014-Configurable-MC-59471.patch b/leaves-server/minecraft-patches/features/0014-Configurable-MC-59471.patch index 9f1a03e6f..84a4a3e47 100644 --- a/leaves-server/minecraft-patches/features/0014-Configurable-MC-59471.patch +++ b/leaves-server/minecraft-patches/features/0014-Configurable-MC-59471.patch @@ -5,26 +5,23 @@ Subject: [PATCH] Configurable MC-59471 diff --git a/net/minecraft/world/level/block/TripWireHookBlock.java b/net/minecraft/world/level/block/TripWireHookBlock.java -index 292fe41967db74884e5937cb125f1e022ccfb6bd..599f62a108a943f4f4d566ebefa3647515f74c50 100644 +index ad7a8c082c20b1ad30c520a94e9f902986ed6030..cf6dcbffcef94bed19b89c252b602dd04d646d84 100644 --- a/net/minecraft/world/level/block/TripWireHookBlock.java +++ b/net/minecraft/world/level/block/TripWireHookBlock.java -@@ -199,10 +199,17 @@ public class TripWireHookBlock extends Block { - BlockPos blockPos1 = pos.relative(direction, i2); - BlockState blockState2 = blockStates[i2]; - if (blockState2 != null) { -- BlockState blockState3 = level.getBlockState(blockPos1); -- if (blockState3.is(Blocks.TRIPWIRE) || blockState3.is(Blocks.TRIPWIRE_HOOK)) { -- if (!io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates || !blockState3.is(Blocks.TRIPWIRE)) level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, flag2), Block.UPDATE_ALL); // Paper - prevent tripwire from updating +@@ -200,10 +200,17 @@ public class TripWireHookBlock extends Block { + BlockPos testPos = pos.relative(direction, i); + BlockState wireData = wireStates[i]; + if (wireData != null) { + // Leaves start - MC-59471 + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.tripwire.stringTripwireHookDuplicate) { -+ level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, flag2), Block.UPDATE_ALL); -+ level.getBlockState(blockPos1); ++ level.setBlock(testPos, wireData.trySetValue(ATTACHED, attached), Block.UPDATE_ALL); ++ level.getBlockState(testPos); + } else { -+ BlockState blockState3 = level.getBlockState(blockPos1); -+ if (blockState3.is(Blocks.TRIPWIRE) || blockState3.is(Blocks.TRIPWIRE_HOOK)) { -+ if (!io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates || !blockState3.is(Blocks.TRIPWIRE)) level.setBlock(blockPos1, blockState2.trySetValue(ATTACHED, flag2), Block.UPDATE_ALL); // Paper - prevent tripwire from updating -+ } + BlockState testPosState = level.getBlockState(testPos); + if (testPosState.is(Blocks.TRIPWIRE) || testPosState.is(Blocks.TRIPWIRE_HOOK)) { + if (!io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates || !testPosState.is(Blocks.TRIPWIRE)) level.setBlock(testPos, wireData.trySetValue(ATTACHED, attached), Block.UPDATE_ALL); // Paper - prevent tripwire from updating } ++ } + // Leaves end - MC-59471 } } diff --git a/leaves-server/minecraft-patches/features/0015-No-chat-sign.patch b/leaves-server/minecraft-patches/features/0015-No-chat-sign.patch index 46170fdf7..d72a14c23 100644 --- a/leaves-server/minecraft-patches/features/0015-No-chat-sign.patch +++ b/leaves-server/minecraft-patches/features/0015-No-chat-sign.patch @@ -5,7 +5,7 @@ Subject: [PATCH] No chat sign diff --git a/net/minecraft/commands/arguments/ArgumentSignatures.java b/net/minecraft/commands/arguments/ArgumentSignatures.java -index b61d120f112be90d94e9c545f26c4941a1a49d7d..58a92516bf540d1cd909d6a52a3b130a8ca09af8 100644 +index 042fec0c893c34c99edda17274a59e44c041c5d4..5048b4b92805bfaf01e3341d9cefac6e03b26e3e 100644 --- a/net/minecraft/commands/arguments/ArgumentSignatures.java +++ b/net/minecraft/commands/arguments/ArgumentSignatures.java @@ -13,10 +13,17 @@ public record ArgumentSignatures(List entries) { @@ -13,39 +13,39 @@ index b61d120f112be90d94e9c545f26c4941a1a49d7d..58a92516bf540d1cd909d6a52a3b130a private static final int MAX_ARGUMENT_NAME_LENGTH = 16; + // Leaves start - no chat sign - public ArgumentSignatures(FriendlyByteBuf buffer) { -- this(buffer.readCollection(FriendlyByteBuf.>limitValue(ArrayList::new, 8), ArgumentSignatures.Entry::new)); -+ this(readSign(buffer)); + public ArgumentSignatures(final FriendlyByteBuf input) { +- this(input.readCollection(FriendlyByteBuf.>limitValue(ArrayList::new, 8), ArgumentSignatures.Entry::new)); ++ this(readSign(input)); } -+ private static List readSign(FriendlyByteBuf buf) { ++ private static List readSign(final FriendlyByteBuf buf) { + var entries = buf.readCollection(FriendlyByteBuf.>limitValue(ArrayList::new, 8), ArgumentSignatures.Entry::new); + return org.leavesmc.leaves.LeavesConfig.mics.noChatSign ? List.of() : entries; + } + // Leaves end - no chat sign + - public void write(FriendlyByteBuf buffer) { - buffer.writeCollection(this.entries, (buffer1, entry) -> entry.write(buffer1)); + public void write(final FriendlyByteBuf output) { + output.writeCollection(this.entries, (out, entry) -> entry.write(out)); } diff --git a/net/minecraft/network/protocol/game/ServerboundChatPacket.java b/net/minecraft/network/protocol/game/ServerboundChatPacket.java -index 11d18c1c13e25c01c5e8f2e3363932d1fce16236..3b51297de087c52d92fa8457bb0792e3a4f436e2 100644 +index c9623b551609c77e8f143e492fe07f80b5a07dc0..f6c589f13abebe9f8dd0063f55164671f6fd17c2 100644 --- a/net/minecraft/network/protocol/game/ServerboundChatPacket.java +++ b/net/minecraft/network/protocol/game/ServerboundChatPacket.java @@ -16,7 +16,7 @@ public record ServerboundChatPacket(String message, Instant timeStamp, long salt ); - private ServerboundChatPacket(FriendlyByteBuf buffer) { -- this(buffer.readUtf(256), buffer.readInstant(), buffer.readLong(), buffer.readNullable(MessageSignature::read), new LastSeenMessages.Update(buffer)); -+ this(buffer.readUtf(256), buffer.readInstant(), buffer.readLong(), buffer.readNullable(ServerboundChatPacket::readSign), new LastSeenMessages.Update(buffer)); // Leaves - no chat sign + private ServerboundChatPacket(final FriendlyByteBuf input) { +- this(input.readUtf(256), input.readInstant(), input.readLong(), input.readNullable(MessageSignature::read), new LastSeenMessages.Update(input)); ++ this(input.readUtf(256), input.readInstant(), input.readLong(), input.readNullable(ServerboundChatPacket::readSign), new LastSeenMessages.Update(input)); // Leaves - no chat sign } - private void write(FriendlyByteBuf buffer) { + private void write(final FriendlyByteBuf output) { @@ -27,6 +27,14 @@ public record ServerboundChatPacket(String message, Instant timeStamp, long salt - this.lastSeenMessages.write(buffer); + this.lastSeenMessages.write(output); } + // Leaves start - no chat sign -+ private static MessageSignature readSign(FriendlyByteBuf buf) { ++ private static MessageSignature readSign(final FriendlyByteBuf buf) { + byte[] bs = new byte[256]; + buf.readBytes(bs); + return org.leavesmc.leaves.LeavesConfig.mics.noChatSign ? null : new MessageSignature(bs); @@ -56,23 +56,23 @@ index 11d18c1c13e25c01c5e8f2e3363932d1fce16236..3b51297de087c52d92fa8457bb0792e3 public PacketType type() { return GamePacketTypes.SERVERBOUND_CHAT; diff --git a/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java b/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java -index 1df628ac0b414511aaed6e09d78f884c4170f730..b92081d70ffeec47c304e553ce1aea0a8980752d 100644 +index a3dc386fb5900f24d9eb3a84ad24e60fa0328bd6..eb00b83be6f2c0fe1fed5e5858ef4488847670a1 100644 --- a/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java +++ b/net/minecraft/network/protocol/game/ServerboundChatSessionUpdatePacket.java @@ -26,6 +26,11 @@ public record ServerboundChatSessionUpdatePacket(RemoteChatSession.Data chatSess @Override - public void handle(ServerGamePacketListener handler) { + public void handle(final ServerGamePacketListener listener) { + // Leaves start - no chat report + if (org.leavesmc.leaves.LeavesConfig.mics.noChatSign) { + return; + } + // Leaves end - no chat report - handler.handleChatSessionUpdate(this); + listener.handleChatSessionUpdate(this); } } diff --git a/net/minecraft/network/protocol/status/ServerStatus.java b/net/minecraft/network/protocol/status/ServerStatus.java -index 88447fc2108126ccfad2fb7eb79ac94537f132d3..1bca4150c63da064bd2d1ee8f504f2ebbc9d96a0 100644 +index 5eb7d46bf0d84720662125711fa7b544e9299446..d0c9d71b6bb05ae6d5b463f4d0847a75205b6c0c 100644 --- a/net/minecraft/network/protocol/status/ServerStatus.java +++ b/net/minecraft/network/protocol/status/ServerStatus.java @@ -19,7 +19,8 @@ public record ServerStatus( @@ -84,7 +84,7 @@ index 88447fc2108126ccfad2fb7eb79ac94537f132d3..1bca4150c63da064bd2d1ee8f504f2eb + boolean preventsChatReports // Leaves - no chat sign ) { public static final Codec CODEC = RecordCodecBuilder.create( - instance -> instance.group( + i -> i.group( @@ -27,11 +28,18 @@ public record ServerStatus( ServerStatus.Players.CODEC.lenientOptionalFieldOf("players").forGetter(ServerStatus::players), ServerStatus.Version.CODEC.lenientOptionalFieldOf("version").forGetter(ServerStatus::version), @@ -93,11 +93,11 @@ index 88447fc2108126ccfad2fb7eb79ac94537f132d3..1bca4150c63da064bd2d1ee8f504f2eb + Codec.BOOL.lenientOptionalFieldOf("enforcesSecureChat", false).forGetter(ServerStatus::enforcesSecureChat), // Leaves - no chat sign + Codec.BOOL.lenientOptionalFieldOf("preventsChatReports", false).forGetter(ServerStatus::preventsChatReports) // Leaves - no chat sign ) - .apply(instance, ServerStatus::new) + .apply(i, ServerStatus::new) ); + // Leaves start - no chat sign -+ public ServerStatus(Component description, Optional players, Optional version, Optional favicon, boolean enforcesSecureChat) { ++ public ServerStatus(final Component description, final Optional players, final Optional version, final Optional favicon, final boolean enforcesSecureChat) { + this(description, players, version, favicon, enforcesSecureChat, org.leavesmc.leaves.LeavesConfig.mics.noChatSign); + } + // Leaves end - no chat sign @@ -106,10 +106,10 @@ index 88447fc2108126ccfad2fb7eb79ac94537f132d3..1bca4150c63da064bd2d1ee8f504f2eb private static final String PREFIX = "data:image/png;base64,"; public static final Codec CODEC = Codec.STRING.comapFlatMap(string -> { diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index 6817fe059655ea93030aea69dfbe4fd6714fe1e4..16ea8a00470943904ae167b7a670cd26c599f024 100644 +index 254aeaf65cc75fed4b734d7dbc86f960ee9b3bc3..c251bb40f9e2b370d38f1b4f0b8f7b18f88d2470 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -772,7 +772,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -806,7 +806,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface // Paper start - Add setting for proxy online mode status return properties.enforceSecureProfile && io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() @@ -119,42 +119,45 @@ index 6817fe059655ea93030aea69dfbe4fd6714fe1e4..16ea8a00470943904ae167b7a670cd26 } diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index 8bacc1779e540c32dad9c547f941c5767729420c..cb9a4f669ae2ff772206bffde9255d239f47e1ea 100644 +index e9fdf2db4a41eaa268252ce5d2f8a7e1a553e06d..5cf25ed690dc06a60a95116b755b590274ea954f 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -323,10 +323,24 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -316,10 +316,25 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } - public void send(Packet packet) { + public void send(final Packet packet) { +- this.send(packet, null); + // Leaves start - rebuild ClientboundPlayerChatPacket ++ Packet sendPacket = packet; + if (org.leavesmc.leaves.LeavesConfig.mics.noChatSign) { -+ if (this instanceof ServerGamePacketListenerImpl && packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) { -+ packet = new net.minecraft.network.protocol.game.ClientboundSystemChatPacket(chat.chatType().decorate(chat.unsignedContent() != null ? chat.unsignedContent() : Component.literal(chat.body().content())), false); ++ if (this instanceof ServerGamePacketListenerImpl && sendPacket instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat) { ++ sendPacket = new net.minecraft.network.protocol.game.ClientboundSystemChatPacket(chat.chatType().decorate(chat.unsignedContent() != null ? chat.unsignedContent() : net.minecraft.network.chat.Component.literal(chat.body().content())), false); + } + } + // Leaves end - rebuild ClientboundPlayerChatPacket - this.send(packet, null); ++ this.send(sendPacket, null); } - public void send(Packet packet, @Nullable ChannelFutureListener sendListener) { +- public void send(final Packet packet, final @Nullable ChannelFutureListener listener) { ++ public void send(final Packet packet, @Nullable ChannelFutureListener listener) { // Leaves - remove final on listener + // Leaves start - no ClientboundPlayerChatHeaderPacket and rebuild ClientboundPlayerChatPacket + if (org.leavesmc.leaves.LeavesConfig.mics.noChatSign) { -+ if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket && sendListener != null) { -+ sendListener = null; ++ if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket && listener != null) { ++ listener = null; + } + } + // Leaves end - no ClientboundPlayerChatHeaderPacket and rebuild ClientboundPlayerChatPacket // CraftBukkit start - if (packet == null || this.processedDisconnect) { // Spigot + if (packet == null) { return; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 8baca1186179d49e1f8dc0e3acb39816bd61967d..ffc04a2e30b407df64bba4a887b14932c02c0caa 100644 +index adc1e97353b59dd79574d83a0a3d5ae41c06749c..174443a3abca82b09ae2a0dd4dc55743607b1716 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1187,7 +1187,7 @@ public abstract class PlayerList { +@@ -1188,7 +1188,7 @@ public abstract class PlayerList { } - public boolean verifyChatTrusted(PlayerChatMessage message) { + public boolean verifyChatTrusted(final PlayerChatMessage message) { - return message.hasSignature() && !message.hasExpiredServer(Instant.now()); + return org.leavesmc.leaves.LeavesConfig.mics.noChatSign || (message.hasSignature() && !message.hasExpiredServer(Instant.now())); // Leaves - No Not Secure } diff --git a/leaves-server/minecraft-patches/features/0016-Dont-send-useless-entity-packets.patch b/leaves-server/minecraft-patches/features/0016-Dont-send-useless-entity-packets.patch index c94e64c9b..f247eaf5d 100644 --- a/leaves-server/minecraft-patches/features/0016-Dont-send-useless-entity-packets.patch +++ b/leaves-server/minecraft-patches/features/0016-Dont-send-useless-entity-packets.patch @@ -3,30 +3,29 @@ From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Sun, 14 Aug 2022 00:00:51 +0800 Subject: [PATCH] Dont send useless entity packets -This patch is Powered by Purpur(https://github.com/PurpurMC/Purpur) diff --git a/net/minecraft/server/level/ServerEntity.java b/net/minecraft/server/level/ServerEntity.java -index 3a817c92147bb78c60238f3ddc1644b721aed7a2..8f6b7ec2f2294ac5845b8f6fb94959e9a11d6329 100644 +index 5fad52157fc22755196ce9eaddaa2bc23c5bb86b..3e0c75b8006ee939115556ed09554ae5a007a272 100644 --- a/net/minecraft/server/level/ServerEntity.java +++ b/net/minecraft/server/level/ServerEntity.java -@@ -188,6 +188,11 @@ public class ServerEntity { - } else if (flag) { - packet = new ClientboundMoveEntityPacket.Rot(this.entity.getId(), b, b1, this.entity.onGround()); - flag4 = true; -+ // Leaves start - dont send useless entity packets -+ if (org.leavesmc.leaves.LeavesConfig.performance.dontSendUselessEntityPackets && isUselessPacket(packet)) { -+ packet = null; -+ } -+ // Leaves end - dont send useless entity packets - } - } else { - packet = new ClientboundMoveEntityPacket.PosRot(this.entity.getId(), (short)l, (short)l1, (short)l2, b, b1, this.entity.onGround()); +@@ -194,6 +194,11 @@ public class ServerEntity { + sentPosition = true; + sentRotation = true; + } ++ // Leaves start - dont send useless entity packets ++ if (packet != null && org.leavesmc.leaves.LeavesConfig.performance.dontSendUselessEntityPackets && this.isUselessPacket(packet)) { ++ packet = null; ++ } ++ // Leaves end - dont send useless entity packets + + if (this.entity.needsSync || this.trackDelta || this.entity instanceof LivingEntity && ((LivingEntity)this.entity).isFallFlying()) { + Vec3 movement = this.entity.getDeltaMovement(); @@ -300,6 +305,21 @@ public class ServerEntity { this.positionCodec.setBase(this.entity.position()); } + // Leaves start - dont send useless entity packets -+ private boolean isUselessPacket(Packet possibleUselessPacket) { ++ private boolean isUselessPacket(final Packet possibleUselessPacket) { + if (possibleUselessPacket instanceof ClientboundMoveEntityPacket packet) { + if (possibleUselessPacket instanceof ClientboundMoveEntityPacket.Pos) { + return packet.getXa() == 0 && packet.getYa() == 0 && packet.getZa() == 0; @@ -40,6 +39,6 @@ index 3a817c92147bb78c60238f3ddc1644b721aed7a2..8f6b7ec2f2294ac5845b8f6fb94959e9 + } + // Leaves end - dont send useless entity packets + - public void removePairing(ServerPlayer player) { + public void removePairing(final ServerPlayer player) { this.entity.stopSeenByPlayer(player); player.connection.send(new ClientboundRemoveEntitiesPacket(this.entity.getId())); diff --git a/leaves-server/minecraft-patches/features/0017-Optimize-suffocation.patch b/leaves-server/minecraft-patches/features/0017-Optimize-suffocation.patch index 7c80615c9..a38c73335 100644 --- a/leaves-server/minecraft-patches/features/0017-Optimize-suffocation.patch +++ b/leaves-server/minecraft-patches/features/0017-Optimize-suffocation.patch @@ -6,19 +6,19 @@ Subject: [PATCH] Optimize suffocation This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 96b9e04867a44a2f92120ab69562b956c8c021b7..7620938ea69b6a77a8ff6a64661658a7c52ac760 100644 +index 6b85bde2b145e54135c1ce1100df3b605f2e9f1a..5e312db025ff9b1c9b69eb65adebb2ec16aaa467 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -440,7 +440,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - profilerFiller.push("livingEntityBaseTick"); - if (this.isAlive() && this.level() instanceof ServerLevel serverLevel1) { - boolean flag = this instanceof Player; +@@ -434,7 +434,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + profiler.push("livingEntityBaseTick"); + if (this.isAlive() && this.level() instanceof ServerLevel level) { + boolean isPlayer = this instanceof Player; - if (this.isInWall()) { + if ((!org.leavesmc.leaves.LeavesConfig.performance.enableSuffocationOptimization || this instanceof WitherBoss || (tickCount % 10 == 0 && couldPossiblyBeHurt(1.0F))) && this.isInWall()) { // Leaves - optimize suffocation - this.hurtServer(serverLevel1, this.damageSources().inWall(), 1.0F); - } else if (flag && !serverLevel1.getWorldBorder().isWithinBounds(this.getBoundingBox())) { - double d = serverLevel1.getWorldBorder().getDistanceToBorder(this) + serverLevel1.getWorldBorder().getSafeZone(); -@@ -1423,6 +1423,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + this.hurtServer(level, this.damageSources().inWall(), 1.0F); + } else if (isPlayer && !level.getWorldBorder().isWithinBounds(this.getBoundingBox())) { + double dist = level.getWorldBorder().getDistanceToBorder(this) + level.getWorldBorder().getSafeZone(); +@@ -1420,6 +1420,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin return this.getHealth() <= 0.0F; } @@ -29,5 +29,5 @@ index 96b9e04867a44a2f92120ab69562b956c8c021b7..7620938ea69b6a77a8ff6a64661658a7 + // Leaves end - optimize suffocation + @Override - public boolean hurtServer(ServerLevel level, DamageSource damageSource, float amount) { - if (this.isInvulnerableTo(level, damageSource)) { + public boolean hurtServer(final ServerLevel level, final DamageSource source, float damage) { + if (this.isInvulnerableTo(level, source)) { diff --git a/leaves-server/minecraft-patches/features/0018-Config-to-disable-method-profiler.patch b/leaves-server/minecraft-patches/features/0018-Config-to-disable-method-profiler.patch index e5820e0cd..094b5a06a 100644 --- a/leaves-server/minecraft-patches/features/0018-Config-to-disable-method-profiler.patch +++ b/leaves-server/minecraft-patches/features/0018-Config-to-disable-method-profiler.patch @@ -3,23 +3,22 @@ From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Mon, 15 Aug 2022 10:18:36 +0800 Subject: [PATCH] Config to disable method profiler -This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index f45ad308fc4bcf5647580ad3d46de9a966985790..98f5813f404874a861b31758e74072c31dc2fef2 100644 +index 606640a1a70d88e48c7e45aa6336635c21c415b0..d7d878a2d35ad40d4315aab15a466f2543906430 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1334,7 +1334,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop, AttributeInstance> createInstance; // Leaves - reduce entity allocations - public AttributeMap(AttributeSupplier supplier) { + public AttributeMap(final AttributeSupplier supplier) { this.supplier = supplier; + this.createInstance = attribute -> this.supplier.createInstance(this::onAttributeModified, attribute); } - private void onAttributeModified(AttributeInstance instance) { + private void onAttributeModified(final AttributeInstance attributeInstance) { @@ -43,7 +45,13 @@ public class AttributeMap { } - public @Nullable AttributeInstance getInstance(Holder attribute) { -- return this.attributes.computeIfAbsent(attribute, holder -> this.supplier.createInstance(this::onAttributeModified, (Holder)holder)); + public @Nullable AttributeInstance getInstance(final Holder attribute) { +- return this.attributes.computeIfAbsent(attribute, key -> this.supplier.createInstance(this::onAttributeModified, (Holder)key)); + // Leaves start - cache lambda, as for some reason java allocates it anyways + if (org.leavesmc.leaves.LeavesConfig.performance.reduceEntityAllocations) { + return this.attributes.computeIfAbsent(attribute, this.createInstance); + } else { -+ return this.attributes.computeIfAbsent(attribute, holder -> this.supplier.createInstance(this::onAttributeModified, (Holder)holder)); ++ return this.attributes.computeIfAbsent(attribute, key -> this.supplier.createInstance(this::onAttributeModified, (Holder)key)); + } + // Leaves end - cache lambda, as for some reason java allocates it anyways } - public boolean hasAttribute(Holder attribute) { + public boolean hasAttribute(final Holder attribute) { diff --git a/leaves-server/minecraft-patches/features/0021-Remove-lambda-from-ticking-guard.patch b/leaves-server/minecraft-patches/features/0021-Remove-lambda-from-ticking-guard.patch index d6a7b6306..31b64491a 100644 --- a/leaves-server/minecraft-patches/features/0021-Remove-lambda-from-ticking-guard.patch +++ b/leaves-server/minecraft-patches/features/0021-Remove-lambda-from-ticking-guard.patch @@ -6,13 +6,13 @@ Subject: [PATCH] Remove lambda from ticking guard This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 1d5a815b87b2ec9d535658f9e5ad8febbfa9b19a..b00a8b969c273001c9eabe2409239dce9bd1896f 100644 +index 189dbd2c332dd706900448c300bb6db5ed652012..ec52dbde19377ad2f8aa6b9c5849b9bb7263e664 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -853,7 +853,24 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -887,7 +887,24 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet } - profilerFiller.push("tick"); + profiler.push("tick"); - this.guardEntityTick(this::tickNonPassenger, entity); + // Leaves start - copied from this.guardEntityTick + if (org.leavesmc.leaves.LeavesConfig.performance.remove.tickGuardLambda) { @@ -32,6 +32,6 @@ index 1d5a815b87b2ec9d535658f9e5ad8febbfa9b19a..b00a8b969c273001c9eabe2409239dce + this.guardEntityTick(this::tickNonPassenger, entity); + } + // Leaves end - copied from this.guardEntityTick - profilerFiller.pop(); + profiler.pop(); } } diff --git a/leaves-server/minecraft-patches/features/0022-Cache-climbing-check-for-activation.patch b/leaves-server/minecraft-patches/features/0022-Cache-climbing-check-for-activation.patch deleted file mode 100644 index 3d95e2de9..000000000 --- a/leaves-server/minecraft-patches/features/0022-Cache-climbing-check-for-activation.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Thu, 18 Aug 2022 16:31:08 +0800 -Subject: [PATCH] Cache climbing check for activation - -This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) - -diff --git a/io/papermc/paper/entity/activation/ActivationRange.java b/io/papermc/paper/entity/activation/ActivationRange.java -index c18823746ab2edcab536cb1589b7720e3af07e0f..e2af98578ad100a121fac6bb1ebde963d666161e 100644 ---- a/io/papermc/paper/entity/activation/ActivationRange.java -+++ b/io/papermc/paper/entity/activation/ActivationRange.java -@@ -221,7 +221,7 @@ public final class ActivationRange { - } - // special cases. - if (entity instanceof final LivingEntity living) { -- if (living.onClimbable() || living.jumping || living.hurtTime > 0 || !living.activeEffects.isEmpty() || living.isFreezing()) { -+ if (living.onClimableCached() || living.jumping || living.hurtTime > 0 || !living.activeEffects.isEmpty() || living.isFreezing()) { // Leaves - use cached - return 1; - } - if (entity instanceof final Mob mob && mob.getTarget() != null) { -diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 7620938ea69b6a77a8ff6a64661658a7c52ac760..6657cc6dd1fa32aafa65e79a2b2b439ffba889c6 100644 ---- a/net/minecraft/world/entity/LivingEntity.java -+++ b/net/minecraft/world/entity/LivingEntity.java -@@ -2179,6 +2179,22 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - return this.lastClimbablePos; - } - -+ // Leaves start - cache climbing check -+ private boolean cachedOnClimable = false; -+ private BlockPos lastClimbingPosition = null; -+ -+ public boolean onClimableCached() { -+ if (!org.leavesmc.leaves.LeavesConfig.performance.cacheClimbCheck) { -+ return this.onClimbable(); -+ } -+ if (!this.blockPosition().equals(this.lastClimbingPosition)) { -+ this.cachedOnClimable = this.onClimbable(); -+ this.lastClimbingPosition = this.blockPosition(); -+ } -+ return this.cachedOnClimable; -+ } -+ // Leaves end - cache climbing check -+ - public boolean onClimbable() { - if (this.isSpectator()) { - return false; diff --git a/leaves-server/minecraft-patches/features/0022-Reduce-chunk-loading-lookups.patch b/leaves-server/minecraft-patches/features/0022-Reduce-chunk-loading-lookups.patch new file mode 100644 index 000000000..b4ae7bee0 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0022-Reduce-chunk-loading-lookups.patch @@ -0,0 +1,43 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Sun, 21 Aug 2022 08:29:15 +0800 +Subject: [PATCH] Reduce chunk loading & lookups + +This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) + +diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java +index 9b4ae8afda1f2202761cb49bc4f1181ce4eb55d5..33d1e88f19bfcaeba58a433361975c0a934cc495 100644 +--- a/net/minecraft/world/entity/monster/EnderMan.java ++++ b/net/minecraft/world/entity/monster/EnderMan.java +@@ -298,11 +298,27 @@ public class EnderMan extends Monster implements NeutralMob { + private boolean teleport(final double x, final double y, final double z) { + BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(x, y, z); + +- while (pos.getY() > this.level().getMinY() && !this.level().getBlockState(pos).blocksMotion()) { +- pos.move(Direction.DOWN); +- } ++ // Leaves start - single chunk lookup ++ BlockState blockState; ++ if (org.leavesmc.leaves.LeavesConfig.performance.reduceChuckLoadAndLookup) { ++ net.minecraft.world.level.chunk.LevelChunk chunk = this.level().getChunkIfLoaded(pos); ++ if (chunk == null) { ++ return false; ++ } ++ ++ while (pos.getY() > this.level().getMinY() && !chunk.getBlockState(pos).blocksMotion()) { ++ pos.move(Direction.DOWN); ++ } + +- BlockState blockState = this.level().getBlockState(pos); ++ blockState = chunk.getBlockState(pos); ++ } else { ++ while (pos.getY() > this.level().getMinY() && !this.level().getBlockState(pos).blocksMotion()) { ++ pos.move(Direction.DOWN); ++ } ++ ++ blockState = this.level().getBlockState(pos); ++ } ++ // Leaves end - single chunk lookup + boolean couldStandOn = blockState.blocksMotion(); + boolean isWet = blockState.getFluidState().is(FluidTags.WATER); + if (couldStandOn && !isWet) { diff --git a/leaves-server/minecraft-patches/features/0024-InstantBlockUpdater-Reintroduced.patch b/leaves-server/minecraft-patches/features/0023-InstantBlockUpdater-Reintroduced.patch similarity index 83% rename from leaves-server/minecraft-patches/features/0024-InstantBlockUpdater-Reintroduced.patch rename to leaves-server/minecraft-patches/features/0023-InstantBlockUpdater-Reintroduced.patch index 70dd94df2..6c25e777e 100644 --- a/leaves-server/minecraft-patches/features/0024-InstantBlockUpdater-Reintroduced.patch +++ b/leaves-server/minecraft-patches/features/0023-InstantBlockUpdater-Reintroduced.patch @@ -3,16 +3,15 @@ From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Tue, 29 Nov 2022 14:54:56 +0800 Subject: [PATCH] InstantBlockUpdater Reintroduced -This patch is Powered by Carpet-TIS-Addition(https://github.com/plusls/Carpet-TIS-Addition) diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index b00a8b969c273001c9eabe2409239dce9bd1896f..a8c54d7e6c95fd3dd83e119f01bf6d13378abf3b 100644 +index ec52dbde19377ad2f8aa6b9c5849b9bb7263e664..80a5c47097031b583176d5751413ba6678276655 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -886,12 +886,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -923,12 +923,13 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet // Paper - rewrite chunk system - profilerFiller.pop(); - profilerFiller.push("debugSynchronizers"); + profiler.pop(); + profiler.push("debugSynchronizers"); - if (this.debugSynchronizers.hasAnySubscriberFor(DebugSubscriptions.NEIGHBOR_UPDATES)) { - this.neighborUpdater - .setDebugListener(blockPos -> this.debugSynchronizers.broadcastEventToTracking(blockPos, DebugSubscriptions.NEIGHBOR_UPDATES, blockPos)); @@ -26,15 +25,14 @@ index b00a8b969c273001c9eabe2409239dce9bd1896f..a8c54d7e6c95fd3dd83e119f01bf6d13 + cnu.setDebugListener(null); + } + } // Leaves end - instantBlockUpdaterReintroduced -+ this.debugSynchronizers.tick(this.server.debugSubscribers()); - profilerFiller.pop(); + profiler.pop(); diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index ac1ca945fcea0997d837e7c5586d86a709f52d47..16ea2b070207c7aece5cb80fe713a07d01b18f84 100644 +index 9f7a08a3b19d1f494ff1bfbaaf4b853b0e0df315..d0b07e6a30a98466efacb3d9a032be5d394c23c9 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -113,7 +113,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -119,7 +119,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl .add(new ExplosionParticleInfo(ParticleTypes.SMOKE, 1.0F, 1.0F)) .build(); public final List blockEntityTickers = Lists.newArrayList(); @@ -43,7 +41,7 @@ index ac1ca945fcea0997d837e7c5586d86a709f52d47..16ea2b070207c7aece5cb80fe713a07d private final List pendingBlockEntityTickers = Lists.newArrayList(); private boolean tickingBlockEntities; public final Thread thread; -@@ -861,7 +861,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -868,7 +868,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl this.thread = Thread.currentThread(); this.biomeManager = new BiomeManager(this, biomeZoomSeed); this.isDebug = isDebug; diff --git a/leaves-server/minecraft-patches/features/0023-Reduce-chunk-loading-lookups.patch b/leaves-server/minecraft-patches/features/0023-Reduce-chunk-loading-lookups.patch deleted file mode 100644 index 963403bcd..000000000 --- a/leaves-server/minecraft-patches/features/0023-Reduce-chunk-loading-lookups.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Sun, 21 Aug 2022 08:29:15 +0800 -Subject: [PATCH] Reduce chunk loading & lookups - -This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) - -diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index 6516cccada06a9a7d3d743929712970fe0a2b8c8..916a15dda74c1a68bdcb4c890ec56e4a60befb9f 100644 ---- a/net/minecraft/world/entity/monster/EnderMan.java -+++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -300,11 +300,28 @@ public class EnderMan extends Monster implements NeutralMob { - private boolean teleport(double x, double y, double z) { - BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos(x, y, z); - -- while (mutableBlockPos.getY() > this.level().getMinY() && !this.level().getBlockState(mutableBlockPos).blocksMotion()) { -- mutableBlockPos.move(Direction.DOWN); -+ // Leaves start - single chunk lookup -+ BlockState blockState; -+ if (org.leavesmc.leaves.LeavesConfig.performance.reduceChuckLoadAndLookup) { -+ net.minecraft.world.level.chunk.LevelChunk chunk = this.level().getChunkIfLoaded(mutableBlockPos); -+ if (chunk == null) { -+ return false; -+ } -+ -+ while (mutableBlockPos.getY() > this.level().getMinY() && !chunk.getBlockState(mutableBlockPos).blocksMotion()) { -+ mutableBlockPos.move(Direction.DOWN); -+ } -+ -+ blockState = chunk.getBlockState(mutableBlockPos); -+ } else { -+ while (mutableBlockPos.getY() > this.level().getMinY() && !this.level().getBlockState(mutableBlockPos).blocksMotion()) { -+ mutableBlockPos.move(Direction.DOWN); -+ } -+ -+ blockState = this.level().getBlockState(mutableBlockPos); - } -+ // Leaves end - single chunk lookup - -- BlockState blockState = this.level().getBlockState(mutableBlockPos); - boolean flag = blockState.blocksMotion(); - boolean isWater = blockState.getFluidState().is(FluidTags.WATER); - if (flag && !isWater) { diff --git a/leaves-server/minecraft-patches/features/0025-Random-flatten-triangular-distribution.patch b/leaves-server/minecraft-patches/features/0024-Random-flatten-triangular-distribution.patch similarity index 52% rename from leaves-server/minecraft-patches/features/0025-Random-flatten-triangular-distribution.patch rename to leaves-server/minecraft-patches/features/0024-Random-flatten-triangular-distribution.patch index 4643919e7..e47c34787 100644 --- a/leaves-server/minecraft-patches/features/0025-Random-flatten-triangular-distribution.patch +++ b/leaves-server/minecraft-patches/features/0024-Random-flatten-triangular-distribution.patch @@ -6,34 +6,34 @@ Subject: [PATCH] Random flatten triangular distribution This patch is Powered by Carpet-TIS-Addition(https://github.com/plusls/Carpet-TIS-Addition) diff --git a/net/minecraft/util/RandomSource.java b/net/minecraft/util/RandomSource.java -index 98a54bc4de251014342cda6d0951b7fea79ce553..17a79cef7dac1b407e4e62883b4a943d172fa6b9 100644 +index 664c1b3008b62c533b8e3302baa994ed0c135c42..c30e40eaa75569bc22a489c9f84a1a450d05729a 100644 --- a/net/minecraft/util/RandomSource.java +++ b/net/minecraft/util/RandomSource.java -@@ -52,13 +52,25 @@ public interface RandomSource { +@@ -56,13 +56,25 @@ public interface RandomSource { double nextGaussian(); + // Leaves start - flattenTriangularDistribution - default double triangle(double center, double maxDeviation) { -- return center + maxDeviation * (this.nextDouble() - this.nextDouble()); + default double triangle(final double mean, final double spread) { +- return mean + spread * (this.nextDouble() - this.nextDouble()); + if (org.leavesmc.leaves.LeavesConfig.modify.flattenTriangularDistribution) { + this.nextDouble(); -+ return center + maxDeviation * (-1 + this.nextDouble() * 2); ++ return mean + spread * (-1 + this.nextDouble() * 2); + } else { -+ return center + maxDeviation * (this.nextDouble() - this.nextDouble()); ++ return mean + spread * (this.nextDouble() - this.nextDouble()); + } } - default float triangle(float center, float maxDeviation) { -- return center + maxDeviation * (this.nextFloat() - this.nextFloat()); + default float triangle(final float mean, final float spread) { +- return mean + spread * (this.nextFloat() - this.nextFloat()); + if (org.leavesmc.leaves.LeavesConfig.modify.flattenTriangularDistribution) { + this.nextFloat(); -+ return center + maxDeviation * (-1 + this.nextFloat() * 2); ++ return mean + spread * (-1 + this.nextFloat() * 2); + } else { -+ return center + maxDeviation * (this.nextFloat() - this.nextFloat()); ++ return mean + spread * (this.nextFloat() - this.nextFloat()); + } } + // Leaves end - flattenTriangularDistribution - default void consumeCount(int count) { - for (int i = 0; i < count; i++) { + default void consumeCount(final int rounds) { + for (int i = 0; i < rounds; i++) { diff --git a/leaves-server/minecraft-patches/features/0025-PCA-sync-protocol.patch b/leaves-server/minecraft-patches/features/0025-PCA-sync-protocol.patch new file mode 100644 index 000000000..47094f872 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0025-PCA-sync-protocol.patch @@ -0,0 +1,50 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Mon, 3 Feb 2025 13:17:03 +0800 +Subject: [PATCH] PCA sync protocol + + +diff --git a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java +index d2aa5ef709781e0cea99883ce8deab340d4adee0..c74d683d4ab26d20903842c690b06db34b5f6a85 100644 +--- a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java +@@ -320,6 +320,11 @@ public class BeehiveBlockEntity extends BlockEntity { + if (releaseOccupant(level, pos, state, data.toOccupant(), null, releaseStatus, savedFlowerPos)) { + changed = true; + iterator.remove(); ++ // Leaves start - pca ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(java.util.Objects.requireNonNull(level.getBlockEntity(pos))); ++ } ++ // Leaves end - pca + } + // Paper start - Fix bees aging inside; use exitTickCounter to keep actual bee life + else if (level.paperConfig().entities.behavior.cooldownFailedBeehiveReleases) { +@@ -351,6 +356,11 @@ public class BeehiveBlockEntity extends BlockEntity { + input.read("bees", BeehiveBlockEntity.Occupant.LIST_CODEC).orElse(List.of()).forEach(this::storeBee); + this.savedFlowerPos = input.read("flower_pos", BlockPos.CODEC).orElse(null); + this.maxBees = input.getIntOr("Bukkit.MaxEntities", MAX_OCCUPANTS); // Paper - persist max bukkit occupants ++ // Leaves start - pca ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ // Leaves end - pca + } + + @Override +diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +index ce6b64e00a0a13ebdceda56d975d79f60c26b86d..97b5abf842f698a2b5cebca5acb1acb7fb9095e1 100644 +--- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +@@ -200,6 +200,11 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + if (changed) { + entity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot + setChanged(level, pos, state); ++ // Leaves start - pca ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(entity); ++ } ++ // Leaves end - pca + return true; + } + } diff --git a/leaves-server/minecraft-patches/features/0028-Alternative-block-placement-Protocol.patch b/leaves-server/minecraft-patches/features/0026-Alternative-block-placement-Protocol.patch similarity index 58% rename from leaves-server/minecraft-patches/features/0028-Alternative-block-placement-Protocol.patch rename to leaves-server/minecraft-patches/features/0026-Alternative-block-placement-Protocol.patch index 71b4022c6..1daf65bd9 100644 --- a/leaves-server/minecraft-patches/features/0028-Alternative-block-placement-Protocol.patch +++ b/leaves-server/minecraft-patches/features/0026-Alternative-block-placement-Protocol.patch @@ -3,55 +3,52 @@ From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Mon, 3 Feb 2025 13:51:26 +0800 Subject: [PATCH] Alternative block placement Protocol -This patch is Powered by -carpet-extra(https://github.com/gnembon/carpet-extra) -MasaGadget(https://github.com/plusls/MasaGadget) -litematica(https://github.com/maruohon/litematica) diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java -index 73ce7c82c0bd28c2e43ca40ba35c4603b21375ad..a5d3caab2072b2c9bf8fdcbdb7c52c2dee16cfaf 100644 +index 1065595193574da941d05edec716729d29a65d18..903c819b6de37a07186ecd2f25301586a840c344 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -147,7 +147,7 @@ public class BlockItem extends Item { +@@ -138,7 +138,7 @@ public class BlockItem extends Item { } - protected @Nullable BlockState getPlacementState(BlockPlaceContext context) { + protected @Nullable BlockState getPlacementState(final BlockPlaceContext context) { - BlockState stateForPlacement = this.getBlock().getStateForPlacement(context); -+ BlockState stateForPlacement = this.getBlock().getRealStateForPlacement(context); // Leaves - alternativeBlockPlacement ++ BlockState stateForPlacement = this.getBlock().getRealStateForPlacement(context); return stateForPlacement != null && this.canPlace(context, stateForPlacement) ? stateForPlacement : null; } diff --git a/net/minecraft/world/item/StandingAndWallBlockItem.java b/net/minecraft/world/item/StandingAndWallBlockItem.java -index d75c95d728efc0b4064f562ca80b68b23883feaf..be685383b8e7c8111e976fc560f16d43d6545a34 100644 +index d5d499226d0b2c2adfae7bbb4c28c96c80411c44..29e94404a230c37afc2b592ef7df60f9ed8543de 100644 --- a/net/minecraft/world/item/StandingAndWallBlockItem.java +++ b/net/minecraft/world/item/StandingAndWallBlockItem.java @@ -26,14 +26,14 @@ public class StandingAndWallBlockItem extends BlockItem { @Override - protected @Nullable BlockState getPlacementState(BlockPlaceContext context) { -- BlockState stateForPlacement = this.wallBlock.getStateForPlacement(context); -+ BlockState stateForPlacement = this.wallBlock.getRealStateForPlacement(context); // Leaves - alternativeBlockPlacement - BlockState blockState = null; + protected @Nullable BlockState getPlacementState(final BlockPlaceContext context) { +- BlockState wallState = this.wallBlock.getStateForPlacement(context); ++ BlockState wallState = this.wallBlock.getRealStateForPlacement(context); + BlockState stateForPlacement = null; LevelReader level = context.getLevel(); - BlockPos clickedPos = context.getClickedPos(); + BlockPos pos = context.getClickedPos(); for (Direction direction : context.getNearestLookingDirections()) { if (direction != this.attachmentDirection.getOpposite()) { -- BlockState blockState1 = direction == this.attachmentDirection ? this.getBlock().getStateForPlacement(context) : stateForPlacement; -+ BlockState blockState1 = direction == this.attachmentDirection ? this.getBlock().getRealStateForPlacement(context) : stateForPlacement; // Leaves - alternativeBlockPlacement - if (blockState1 != null && this.canPlace(level, blockState1, clickedPos)) { - blockState = blockState1; +- BlockState possibleState = direction == this.attachmentDirection ? this.getBlock().getStateForPlacement(context) : wallState; ++ BlockState possibleState = direction == this.attachmentDirection ? this.getBlock().getRealStateForPlacement(context) : wallState; + if (possibleState != null && this.canPlace(level, possibleState, pos)) { + stateForPlacement = possibleState; break; diff --git a/net/minecraft/world/level/block/Block.java b/net/minecraft/world/level/block/Block.java -index 6d0cdbd52a3bb4e09fd480fa08fa825e987d2a2c..8dd0ddb5fbb43cb0b3d8eb2c715b883d86299dae 100644 +index 70960c3c280eedc3624f20139a52d5d4961d6217..124834b62c059d642a86cd159c4136b518c02c18 100644 --- a/net/minecraft/world/level/block/Block.java +++ b/net/minecraft/world/level/block/Block.java -@@ -489,6 +489,32 @@ public class Block extends BlockBehaviour implements ItemLike { - public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) { +@@ -520,6 +520,33 @@ public class Block extends BlockBehaviour implements ItemLike { + public void stepOn(final Level level, final BlockPos pos, final BlockState onState, final Entity entity) { } + // Leaves start - alternativeBlockPlacement -+ public @Nullable BlockState getRealStateForPlacement(BlockPlaceContext ctx) { ++ @Nullable ++ public BlockState getRealStateForPlacement(BlockPlaceContext ctx) { + BlockState vanillaState = this.getStateForPlacement(ctx); + switch (org.leavesmc.leaves.LeavesConfig.protocol.alternativeBlockPlacement) { + case CARPET -> { @@ -76,6 +73,6 @@ index 6d0cdbd52a3bb4e09fd480fa08fa825e987d2a2c..8dd0ddb5fbb43cb0b3d8eb2c715b883d + } + // Leaves end - alternativeBlockPlacement + - public @Nullable BlockState getStateForPlacement(BlockPlaceContext context) { + public @Nullable BlockState getStateForPlacement(final BlockPlaceContext context) { return this.defaultBlockState(); } diff --git a/leaves-server/minecraft-patches/features/0026-BBOR-Protocol.patch b/leaves-server/minecraft-patches/features/0026-BBOR-Protocol.patch deleted file mode 100644 index 7201f6a31..000000000 --- a/leaves-server/minecraft-patches/features/0026-BBOR-Protocol.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Mon, 3 Feb 2025 13:03:42 +0800 -Subject: [PATCH] BBOR Protocol - - -diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 3acc1374a7ef968d88e9f566ce7b812fb8d580af..e7fa4e132e88b24789ed30eb3248994f21ffd6bd 100644 ---- a/net/minecraft/world/level/chunk/LevelChunk.java -+++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -753,6 +753,11 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - - public void setLoaded(boolean loaded) { - this.loaded = loaded; -+ // Leaves start - bbor -+ if (loaded) { -+ org.leavesmc.leaves.protocol.BBORProtocol.onChunkLoaded(this); -+ } -+ // Leaves end - bbor - } - - public Level getLevel() { diff --git a/leaves-server/minecraft-patches/features/0029-Jade-Protocol.patch b/leaves-server/minecraft-patches/features/0027-Jade-Protocol.patch similarity index 75% rename from leaves-server/minecraft-patches/features/0029-Jade-Protocol.patch rename to leaves-server/minecraft-patches/features/0027-Jade-Protocol.patch index f9ba8cc74..e6d18e2f9 100644 --- a/leaves-server/minecraft-patches/features/0029-Jade-Protocol.patch +++ b/leaves-server/minecraft-patches/features/0027-Jade-Protocol.patch @@ -3,13 +3,12 @@ From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Mon, 3 Feb 2025 13:33:19 +0800 Subject: [PATCH] Jade Protocol -This patch is Powered by Jade(https://github.com/Snownee/Jade) diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index 901e4e9897e76cd4158d7f8bb8ec829df8ff8196..59b9373c7a14e42d9e5f691354a7616d16856215 100644 +index 14491f7136266a738bbc463731d0785bcce2b4cd..2a72a46ffa748d3b6ff7eb712a57ec344733f87b 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -64,7 +64,7 @@ public class Armadillo extends Animal { +@@ -71,7 +71,7 @@ public class Armadillo extends Animal { public final AnimationState rollOutAnimationState = new AnimationState(); public final AnimationState rollUpAnimationState = new AnimationState(); public final AnimationState peekAnimationState = new AnimationState(); @@ -17,12 +16,12 @@ index 901e4e9897e76cd4158d7f8bb8ec829df8ff8196..59b9373c7a14e42d9e5f691354a7616d + public int scuteTime; // Leaves - private -> public private boolean peekReceivedClient = false; - public Armadillo(EntityType type, Level level) { + public Armadillo(final EntityType type, final Level level) { diff --git a/net/minecraft/world/entity/animal/frog/Tadpole.java b/net/minecraft/world/entity/animal/frog/Tadpole.java -index f65cfb908aac16e6df4d209c6b5c3ee5065289d3..9afada8ca16775752468e1b14cd97daf26325fc4 100644 +index 3d4bfeae2fddb9ace26e7dea8870704d8309862b..d2862d2e6f599265bc319000bba05609e0bea2c3 100644 --- a/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/net/minecraft/world/entity/animal/frog/Tadpole.java -@@ -244,7 +244,7 @@ public class Tadpole extends AbstractFish { +@@ -255,7 +255,7 @@ public class Tadpole extends AbstractFish { } } @@ -32,12 +31,12 @@ index f65cfb908aac16e6df4d209c6b5c3ee5065289d3..9afada8ca16775752468e1b14cd97daf } diff --git a/net/minecraft/world/level/storage/loot/LootPool.java b/net/minecraft/world/level/storage/loot/LootPool.java -index 43b8f4674602532f0273ebc5a0233476d10f6735..2ed995e68cf7812c74c3ba15b49450b2b5f3f0f8 100644 +index f08a25b76e689c2242e8ef8226c3d8c2dcec1c70..6e76e472bd1e7242f6cd7986c23ebc38d16fd46a 100644 --- a/net/minecraft/world/level/storage/loot/LootPool.java +++ b/net/minecraft/world/level/storage/loot/LootPool.java -@@ -37,7 +37,7 @@ public class LootPool { +@@ -36,7 +36,7 @@ public class LootPool implements Validatable { ) - .apply(instance, LootPool::new) + .apply(i, LootPool::new) ); - private final List entries; + public final List entries; // Leaves - private -> public @@ -45,10 +44,10 @@ index 43b8f4674602532f0273ebc5a0233476d10f6735..2ed995e68cf7812c74c3ba15b49450b2 private final Predicate compositeCondition; private final List functions; diff --git a/net/minecraft/world/level/storage/loot/LootTable.java b/net/minecraft/world/level/storage/loot/LootTable.java -index 35b5154473a3021dcae1f2ad016a77bcfb058c58..3d338b354c3d558a1c4ec20c149e8f26ed27da1e 100644 +index 14fc07badbd14a5a4c8e8c7d237d08a4eb6a6f12..0aaf2240a0f79b5c4aaa9c22dca7b2f0953dac49 100644 --- a/net/minecraft/world/level/storage/loot/LootTable.java +++ b/net/minecraft/world/level/storage/loot/LootTable.java -@@ -50,7 +50,7 @@ public class LootTable { +@@ -49,7 +49,7 @@ public class LootTable implements Validatable { public static final LootTable EMPTY = new LootTable(LootContextParamSets.EMPTY, Optional.empty(), List.of(), List.of()); private final ContextKeySet paramSet; private final Optional randomSequence; @@ -58,10 +57,10 @@ index 35b5154473a3021dcae1f2ad016a77bcfb058c58..3d338b354c3d558a1c4ec20c149e8f26 private final BiFunction compositeFunction; public org.bukkit.craftbukkit.CraftLootTable craftLootTable; // CraftBukkit diff --git a/net/minecraft/world/level/storage/loot/entries/CompositeEntryBase.java b/net/minecraft/world/level/storage/loot/entries/CompositeEntryBase.java -index eeaa49e9f70a18b5d39493aeff73f31b05ac2faa..8cd0403d7873c4c37caef75935b06b056c3d951d 100644 +index 53e4375a4af610e54309f2978e59985e6ada15f5..615b533caecef09d967c615ae39ef29c80784575 100644 --- a/net/minecraft/world/level/storage/loot/entries/CompositeEntryBase.java +++ b/net/minecraft/world/level/storage/loot/entries/CompositeEntryBase.java -@@ -16,7 +16,7 @@ public abstract class CompositeEntryBase extends LootPoolEntryContainer { +@@ -17,7 +17,7 @@ public abstract class CompositeEntryBase extends LootPoolEntryContainer { return "Empty children list"; } }; @@ -69,22 +68,22 @@ index eeaa49e9f70a18b5d39493aeff73f31b05ac2faa..8cd0403d7873c4c37caef75935b06b05 + public final List children; // Leaves - private -> public private final ComposableEntryContainer composedChildren; - protected CompositeEntryBase(List children, List conditions) { + protected CompositeEntryBase(final List children, final List conditions) { diff --git a/net/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer.java b/net/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer.java -index cfa05e882d2987cfab4c9d555a2de065b29fdf7e..4bacc9e2fb94d1b24887e7f0e9ce628814393209 100644 +index 83c514c213251dd5470627d0299b5858b850784d..d231f706388e6967d2e29f806a9f52e8f7f5ba61 100644 --- a/net/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer.java +++ b/net/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer.java -@@ -14,7 +14,7 @@ import net.minecraft.world.level.storage.loot.predicates.ConditionUserBuilder; +@@ -15,7 +15,7 @@ import net.minecraft.world.level.storage.loot.predicates.ConditionUserBuilder; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; - public abstract class LootPoolEntryContainer implements ComposableEntryContainer { + public abstract class LootPoolEntryContainer implements ComposableEntryContainer, Validatable { - protected final List conditions; + public final List conditions; // Leaves - private -> public private final Predicate compositeCondition; - protected LootPoolEntryContainer(List conditions) { + protected LootPoolEntryContainer(final List conditions) { diff --git a/net/minecraft/world/level/storage/loot/entries/NestedLootTable.java b/net/minecraft/world/level/storage/loot/entries/NestedLootTable.java -index 141026601cd9a4561426b85fd1f8e7dc0544fbd7..a5d7ebb93c147bf0f806ac3c9b2dc4b878573944 100644 +index 20520b7071f19af2882a797ee40019cddd76e378..11c4333ab28cffcfb97bcd289930b33c4baae993 100644 --- a/net/minecraft/world/level/storage/loot/entries/NestedLootTable.java +++ b/net/minecraft/world/level/storage/loot/entries/NestedLootTable.java @@ -29,7 +29,7 @@ public class NestedLootTable extends LootPoolSingletonContainer { @@ -95,12 +94,12 @@ index 141026601cd9a4561426b85fd1f8e7dc0544fbd7..a5d7ebb93c147bf0f806ac3c9b2dc4b8 + public final Either, LootTable> contents; // Leaves - private -> public private NestedLootTable( - Either, LootTable> contents, int weight, int quality, List conditions, List functions + final Either, LootTable> contents, diff --git a/net/minecraft/world/level/storage/loot/predicates/CompositeLootItemCondition.java b/net/minecraft/world/level/storage/loot/predicates/CompositeLootItemCondition.java -index bae72197acc929c7ed3e964f156115d728eb2176..8f3094f42f3366a1313d70c0b27fbe5632b2082a 100644 +index cb821605781050282fd0a28e3d096fa18de833b8..99624ca2e895884a5e92a965af2064803c0d3b14 100644 --- a/net/minecraft/world/level/storage/loot/predicates/CompositeLootItemCondition.java +++ b/net/minecraft/world/level/storage/loot/predicates/CompositeLootItemCondition.java -@@ -12,7 +12,7 @@ import net.minecraft.world.level.storage.loot.LootContext; +@@ -12,7 +12,7 @@ import net.minecraft.world.level.storage.loot.Validatable; import net.minecraft.world.level.storage.loot.ValidationContext; public abstract class CompositeLootItemCondition implements LootItemCondition { @@ -108,4 +107,4 @@ index bae72197acc929c7ed3e964f156115d728eb2176..8f3094f42f3366a1313d70c0b27fbe56 + public final List terms; // Leaves - private -> public private final Predicate composedPredicate; - protected CompositeLootItemCondition(List terms, Predicate composedPredicate) { + protected CompositeLootItemCondition(final List terms, final Predicate composedPredicate) { diff --git a/leaves-server/minecraft-patches/features/0027-PCA-sync-protocol.patch b/leaves-server/minecraft-patches/features/0027-PCA-sync-protocol.patch deleted file mode 100644 index ceaf8a7d2..000000000 --- a/leaves-server/minecraft-patches/features/0027-PCA-sync-protocol.patch +++ /dev/null @@ -1,291 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Mon, 3 Feb 2025 13:17:03 +0800 -Subject: [PATCH] PCA sync protocol - -This patch is Powered by plusls-carpet-addition(https://github.com/plusls/plusls-carpet-addition) - -diff --git a/net/minecraft/world/entity/animal/equine/AbstractHorse.java b/net/minecraft/world/entity/animal/equine/AbstractHorse.java -index e837c63631c637238b9fe0ba05984af5e0d2b833..9faecf72b8622b57e99c71abcae19c2c38488a1c 100644 ---- a/net/minecraft/world/entity/animal/equine/AbstractHorse.java -+++ b/net/minecraft/world/entity/animal/equine/AbstractHorse.java -@@ -301,6 +301,13 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory - public void createInventory() { - SimpleContainer simpleContainer = this.inventory; - this.inventory = new SimpleContainer(this.getInventorySize(), (org.bukkit.entity.AbstractHorse) this.getBukkitEntity()); // CraftBukkit -+ // Leaves start - pca -+ this.inventory.addListener(inv -> { -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncEntityToClient(this); -+ } -+ }); -+ // Leaves end - pca - if (simpleContainer != null) { - int min = Math.min(simpleContainer.getContainerSize(), this.inventory.getContainerSize()); - -diff --git a/net/minecraft/world/entity/npc/villager/AbstractVillager.java b/net/minecraft/world/entity/npc/villager/AbstractVillager.java -index fa8f1ea38192f9ad0a961a53399f295d83af7721..e6b79e6877b31253c065864e38b1ed62be0b0efb 100644 ---- a/net/minecraft/world/entity/npc/villager/AbstractVillager.java -+++ b/net/minecraft/world/entity/npc/villager/AbstractVillager.java -@@ -49,6 +49,15 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa - super(type, level); - this.setPathfindingMalus(PathType.DANGER_FIRE, 16.0F); - this.setPathfindingMalus(PathType.DAMAGE_FIRE, -1.0F); -+ // Leaves start - pca -+ if (!this.level().isClientSide()) { -+ this.inventory.addListener(inventory -> { -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncEntityToClient(this); -+ } -+ }); -+ } -+ // Leaves end - pca - } - - @Override -diff --git a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java -index 79541b56a07d10de450f63945d0849a7f320da6c..da1cfc043e261e7ed7bc85fa1e5e7ee2e2078630 100644 ---- a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java -+++ b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java -@@ -65,6 +65,11 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme - - @Override - public void setChanged() { -+ // Leaves start - pca -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncEntityToClient(this); -+ } -+ // Leaves end - pca - } - - @Override -diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index c8bfa1eeb847d6d9972d2f6625cc1f60063713d4..580741eb999662726bb9a11022600b78e44417ea 100644 ---- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -@@ -430,6 +430,16 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit - } - } - -+ // Leaves start - pca -+ @Override -+ public void setChanged() { -+ super.setChanged(); -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ } -+ // Leaves end - pca -+ - @Override - public void setRecipeUsed(@Nullable RecipeHolder recipe) { - if (recipe != null) { -diff --git a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -index 75c09a2079c89f9346391abdd01ef8790b9cbb13..6741fe3abc4396236dc0ca31074e36d66e42c39a 100644 ---- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -@@ -124,6 +124,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { - this.items = items; - } - -+ // Leaves start - pca -+ @Override -+ public void setChanged() { -+ super.setChanged(); -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ } -+ // Leaves end - pca -+ - @Override - protected Component getDefaultName() { - return DEFAULT_NAME; -diff --git a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -index c989b7d52e16d93e65afb0f921d514c68b814921..17096a9ba33ecaddb50bfe2bccb505d0f0110e7e 100644 ---- a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -@@ -150,6 +150,11 @@ public class BeehiveBlockEntity extends BlockEntity { - super.setChanged(); - } - -+ // Leaves start - pca -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ // Leaves end - pca - return list; - } - -@@ -207,6 +212,11 @@ public class BeehiveBlockEntity extends BlockEntity { - this.level.gameEvent(GameEvent.BLOCK_CHANGE, blockPos, GameEvent.Context.of(bee, this.getBlockState())); - } - -+ // Leaves start - pca -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ // Leaves end - pca - bee.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.ENTER_BLOCK); // CraftBukkit - add Bukkit remove cause - super.setChanged(); - } -@@ -328,6 +338,11 @@ public class BeehiveBlockEntity extends BlockEntity { - if (releaseOccupant(level, pos, state, beeData.toOccupant(), null, beeReleaseStatus, savedFlowerPos)) { - flag = true; - iterator.remove(); -+ // Leaves start - pca -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(java.util.Objects.requireNonNull(level.getBlockEntity(pos))); -+ } -+ // Leaves end - pca - } - // Paper start - Fix bees aging inside; use exitTickCounter to keep actual bee life - else if (level.paperConfig().entities.behavior.cooldownFailedBeehiveReleases) { -@@ -359,6 +374,11 @@ public class BeehiveBlockEntity extends BlockEntity { - input.read("bees", BeehiveBlockEntity.Occupant.LIST_CODEC).orElse(List.of()).forEach(this::storeBee); - this.savedFlowerPos = input.read("flower_pos", BlockPos.CODEC).orElse(null); - this.maxBees = input.getIntOr("Bukkit.MaxEntities", MAX_OCCUPANTS); // Paper - persist max bukkit occupants -+ // Leaves start - pca -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ // Leaves end - pca - } - - @Override -diff --git a/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java b/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -index 74577d6523db1cce6413317c016887f2a7bb9977..5c51ecca91cfbe86bf815f7c3a1d26a23381a7da 100644 ---- a/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -@@ -334,4 +334,14 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements - protected AbstractContainerMenu createMenu(int id, Inventory player) { - return new BrewingStandMenu(id, player, this, this.dataAccess); - } -+ -+ // Leaves start - pca -+ @Override -+ public void setChanged() { -+ super.setChanged(); -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ } -+ // Leaves end - pca - } -diff --git a/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/net/minecraft/world/level/block/entity/ChestBlockEntity.java -index 6b1299c20573ca009f6bffce829a4a593f548fce..5b209de34bd425bf6c209a5317603f1c6d7280bf 100644 ---- a/net/minecraft/world/level/block/entity/ChestBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/ChestBlockEntity.java -@@ -214,6 +214,16 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement - otherChest.setItems(items); - } - -+ // Leaves start - pca -+ @Override -+ public void setChanged() { -+ super.setChanged(); -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ } -+ // Leaves end - pca -+ - @Override - protected AbstractContainerMenu createMenu(int id, Inventory player) { - return ChestMenu.threeRows(id, player, this); -diff --git a/net/minecraft/world/level/block/entity/ComparatorBlockEntity.java b/net/minecraft/world/level/block/entity/ComparatorBlockEntity.java -index 6b5179ae4269829b1e356840c9a8c33153334c32..b78ee57634471bc6e5308fb30c8f974fdce516de 100644 ---- a/net/minecraft/world/level/block/entity/ComparatorBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/ComparatorBlockEntity.java -@@ -25,6 +25,16 @@ public class ComparatorBlockEntity extends BlockEntity { - this.output = input.getIntOr("OutputSignal", 0); - } - -+ // Leaves start - pca -+ @Override -+ public void setChanged() { -+ super.setChanged(); -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ } -+ // Leaves end - pca -+ - public int getOutputSignal() { - return this.output; - } -diff --git a/net/minecraft/world/level/block/entity/DispenserBlockEntity.java b/net/minecraft/world/level/block/entity/DispenserBlockEntity.java -index b4a155cc914092dad83977df714fbbc033c69d19..2fbfe925c81126cb99a4330a232d7d1b1f035973 100644 ---- a/net/minecraft/world/level/block/entity/DispenserBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/DispenserBlockEntity.java -@@ -105,6 +105,16 @@ public class DispenserBlockEntity extends RandomizableContainerBlockEntity { - return stack; - } - -+ // Leaves start - pca -+ @Override -+ public void setChanged() { -+ super.setChanged(); -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ } -+ // Leaves end - pca -+ - @Override - protected Component getDefaultName() { - return DEFAULT_NAME; -diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index 12f8105d6b12c5d63cb6e5e79435c7fd22655475..59a92e77244f45a58f61919519fc57f6c0bed8ee 100644 ---- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -123,6 +123,16 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - this.facing = blockState.getValue(HopperBlock.FACING); - } - -+ // Leaves start - pca -+ @Override -+ public void setChanged() { -+ super.setChanged(); -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ } -+ // Leaves end - pca -+ - @Override - protected Component getDefaultName() { - return DEFAULT_NAME; -@@ -199,6 +209,11 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - if (flag) { - blockEntity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot - setChanged(level, pos, state); -+ // Leaves start - pca -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(blockEntity); -+ } -+ // Leaves end - pca - return true; - } - } -diff --git a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -index 61b99c895c0e248f0e7c4c634644dcff54a964d9..fa11a17186e590cdc7b7902b91db701592a2f6b7 100644 ---- a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -@@ -267,6 +267,16 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl - this.itemStacks = items; - } - -+ // Leaves start - pca -+ @Override -+ public void setChanged() { -+ super.setChanged(); -+ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -+ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); -+ } -+ } -+ // Leaves end - pca -+ - @Override - public int[] getSlotsForFace(Direction side) { - return SLOTS; diff --git a/leaves-server/minecraft-patches/features/0030-Player-operation-limiter.patch b/leaves-server/minecraft-patches/features/0028-Player-operation-limiter.patch similarity index 50% rename from leaves-server/minecraft-patches/features/0030-Player-operation-limiter.patch rename to leaves-server/minecraft-patches/features/0028-Player-operation-limiter.patch index ed4284ec8..a4ab3ae5a 100644 --- a/leaves-server/minecraft-patches/features/0030-Player-operation-limiter.patch +++ b/leaves-server/minecraft-patches/features/0028-Player-operation-limiter.patch @@ -3,13 +3,12 @@ From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Sun, 11 Dec 2022 18:43:35 +0800 Subject: [PATCH] Player operation limiter -This patch is Powered by plusls-carpet-addition(https://github.com/plusls/plusls-carpet-addition) diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 8c38a1b97203661454c099746472206a7954b5bc..59cd1c64037148e9db403360755663aeda43e729 100644 +index c869682651fe3479aafcf4632a4f203b88ef9e95..8799692ffd3eff3915789145e254e2a370ccd92c 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -433,6 +433,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -435,6 +435,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc public boolean isRealPlayer; // Paper public com.destroystokyo.paper.event.entity.@Nullable PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent public org.bukkit.event.player.PlayerQuitEvent.@Nullable QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event @@ -20,7 +19,7 @@ index 8c38a1b97203661454c099746472206a7954b5bc..59cd1c64037148e9db403360755663ae // Paper start - rewrite chunk system private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; -@@ -720,6 +724,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -724,6 +728,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } // CraftBukkit end this.connection.tickClientLoadTimeout(); @@ -28,85 +27,84 @@ index 8c38a1b97203661454c099746472206a7954b5bc..59cd1c64037148e9db403360755663ae this.gameMode.tick(); this.wardenSpawnTracker.tick(); if (this.invulnerableTime > 0) { -@@ -3131,4 +3136,31 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -3154,4 +3159,31 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end + + // Leaves start - player operation limiter + protected void resetOperationCountPerTick() { -+ instaBreakCountPerTick = 0; -+ placeBlockCountPerTick = 0; ++ this.instaBreakCountPerTick = 0; ++ this.placeBlockCountPerTick = 0; + } + + public int getInstaBreakCountPerTick() { -+ return instaBreakCountPerTick; ++ return this.instaBreakCountPerTick; + } + + public int getPlaceBlockCountPerTick() { -+ return placeBlockCountPerTick; ++ return this.placeBlockCountPerTick; + } + + public void addInstaBreakCountPerTick() { -+ ++instaBreakCountPerTick; ++ ++this.instaBreakCountPerTick; + } + + public void addPlaceBlockCountPerTick() { -+ ++placeBlockCountPerTick; ++ ++this.placeBlockCountPerTick; + } + + public boolean allowOperation() { -+ return (instaBreakCountPerTick == 0 || placeBlockCountPerTick == 0) && (instaBreakCountPerTick <= 1 && placeBlockCountPerTick <= 2); ++ return (this.instaBreakCountPerTick == 0 || this.placeBlockCountPerTick == 0) && (this.instaBreakCountPerTick <= 1 && this.placeBlockCountPerTick <= 2); + } + // Leaves end - player operation limiter } diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index 84d19d79e77cec6a5d64f59fbcce703e467b2407..1039bbcfccb851f9bb557b6d55656d51d8821647 100644 +index 45cbc7913546fe7294cf1ac4a885e6ca68dcbd7f..97bd365f332d64c9e4023ecdf109ca37c4c9238a 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -317,6 +317,19 @@ public class ServerPlayerGameMode { +@@ -324,6 +324,19 @@ public class ServerPlayerGameMode { } - public void destroyAndAck(BlockPos pos, int sequence, String message) { + public void destroyAndAck(final BlockPos pos, final int sequence, final String exitId) { + // Leaves start - player operation limiter + if (org.leavesmc.leaves.LeavesConfig.modify.playerOperationLimiter) { -+ if (message.equals("insta mine")) { -+ player.addInstaBreakCountPerTick(); -+ if (!player.allowOperation()) { -+ this.level.getCraftServer().getPluginManager().callEvent(new org.leavesmc.leaves.event.player.PlayerOperationLimitEvent(player.getBukkitEntity(), org.leavesmc.leaves.event.player.PlayerOperationLimitEvent.Operation.MINE, org.bukkit.craftbukkit.block.CraftBlock.at(level, pos))); ++ if (exitId.equals("insta mine")) { ++ this.player.addInstaBreakCountPerTick(); ++ if (!this.player.allowOperation()) { ++ this.level.getCraftServer().getPluginManager().callEvent(new org.leavesmc.leaves.event.player.PlayerOperationLimitEvent(this.player.getBukkitEntity(), org.leavesmc.leaves.event.player.PlayerOperationLimitEvent.Operation.MINE, org.bukkit.craftbukkit.block.CraftBlock.at(this.level, pos))); + this.player.connection.send(new ClientboundBlockUpdatePacket(pos, this.level.getBlockState(pos))); -+ this.debugLogging(pos, false, sequence, message); ++ this.debugLogging(pos, false, sequence, exitId); + return; + } + } + } + // Leaves end - player operation limiter if (this.destroyBlock(pos)) { - this.debugLogging(pos, true, sequence, message); + this.debugLogging(pos, true, sequence, exitId); } else { diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java -index a5d3caab2072b2c9bf8fdcbdb7c52c2dee16cfaf..b647172cda155a5e704565c8c4819c20758bd3f3 100644 +index 903c819b6de37a07186ecd2f25301586a840c344..03b11543304c173b8558d548e5a193747234de20 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -65,6 +65,21 @@ public class BlockItem extends Item { - final org.bukkit.block.BlockState oldBukkitState = bukkitState != null ? bukkitState : org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(blockPlaceContext.getLevel(), blockPlaceContext.getClickedPos()); // Paper - Reset placed block on exception - // CraftBukkit end +@@ -61,6 +61,20 @@ public class BlockItem extends Item { -+ // Leaves start - player operation limiter -+ if (org.leavesmc.leaves.LeavesConfig.modify.playerOperationLimiter && !context.getLevel().isClientSide()) { -+ ServerPlayer player = (ServerPlayer) context.getPlayer(); -+ if (player != null && placementState != null) { -+ player.addPlaceBlockCountPerTick(); -+ if (!player.allowOperation()) { -+ if (bukkitState != null) { -+ context.getLevel().getCraftServer().getPluginManager().callEvent(new org.leavesmc.leaves.event.player.PlayerOperationLimitEvent(player.getBukkitEntity(), org.leavesmc.leaves.event.player.PlayerOperationLimitEvent.Operation.PLACE, bukkitState.getBlock())); -+ } -+ return InteractionResult.FAIL; -+ } + BlockState placementState = this.getPlacementState(updatedPlaceContext); + final org.bukkit.block.BlockState previousState = org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(updatedPlaceContext.getLevel(), updatedPlaceContext.getClickedPos()); // Paper - Reset placed block on exception ++ // Leaves start - player operation limiter ++ if (org.leavesmc.leaves.LeavesConfig.modify.playerOperationLimiter && !placeContext.getLevel().isClientSide()) { ++ ServerPlayer limiterPlayer = (ServerPlayer) placeContext.getPlayer(); ++ if (limiterPlayer != null && placementState != null) { ++ limiterPlayer.addPlaceBlockCountPerTick(); ++ if (!limiterPlayer.allowOperation()) { ++ if (previousState != null) { ++ placeContext.getLevel().getCraftServer().getPluginManager().callEvent(new org.leavesmc.leaves.event.player.PlayerOperationLimitEvent(limiterPlayer.getBukkitEntity(), org.leavesmc.leaves.event.player.PlayerOperationLimitEvent.Operation.PLACE, previousState.getBlock())); + } ++ return InteractionResult.FAIL; + } -+ // Leaves end - player operation limiter -+ - if (placementState == null) { - return InteractionResult.FAIL; - } else if (!this.placeBlock(blockPlaceContext, placementState)) { ++ } ++ } ++ // Leaves end - player operation limiter + if (placementState == null) { + return InteractionResult.FAIL; + } diff --git a/leaves-server/minecraft-patches/features/0031-Renewable-Elytra.patch b/leaves-server/minecraft-patches/features/0029-Renewable-Elytra.patch similarity index 83% rename from leaves-server/minecraft-patches/features/0031-Renewable-Elytra.patch rename to leaves-server/minecraft-patches/features/0029-Renewable-Elytra.patch index ba46d88c7..fc6bc52a8 100644 --- a/leaves-server/minecraft-patches/features/0031-Renewable-Elytra.patch +++ b/leaves-server/minecraft-patches/features/0029-Renewable-Elytra.patch @@ -6,11 +6,11 @@ Subject: [PATCH] Renewable Elytra This patch is Powered by Carpet-TIS-Addition(https://github.com/plusls/Carpet-TIS-Addition) diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 62c40a04a105eff471599c4535239fee9726dbd1..6d2c12897b7ffd0aa02f607a53684e7d529778f3 100644 +index 6cc9c6c04985a0b63ee509659ffe6dbe2921915e..3218438c476a11ffcd3f03a9e5ac2c1492b80305 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -238,6 +238,20 @@ public class Phantom extends Mob implements Enemy { - return targetingConditions.test(level, this, entity); +@@ -228,6 +228,20 @@ public class Phantom extends Mob implements Enemy { + return targetConditions.test(level, this, target); } + // Leaves start - renewable elytra @@ -27,6 +27,6 @@ index 62c40a04a105eff471599c4535239fee9726dbd1..6d2c12897b7ffd0aa02f607a53684e7d + } + // Leaves end - renewable elytra + - static enum AttackPhase { + private enum AttackPhase { CIRCLE, SWOOP; diff --git a/leaves-server/minecraft-patches/features/0032-MC-Technical-Survival-Mode.patch b/leaves-server/minecraft-patches/features/0030-MC-Technical-Survival-Mode.patch similarity index 65% rename from leaves-server/minecraft-patches/features/0032-MC-Technical-Survival-Mode.patch rename to leaves-server/minecraft-patches/features/0030-MC-Technical-Survival-Mode.patch index fc15fc084..870792ffd 100644 --- a/leaves-server/minecraft-patches/features/0032-MC-Technical-Survival-Mode.patch +++ b/leaves-server/minecraft-patches/features/0030-MC-Technical-Survival-Mode.patch @@ -3,36 +3,35 @@ From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Thu, 19 Jan 2023 23:38:50 +0800 Subject: [PATCH] MC Technical Survival Mode -Will automatically overwrite some configuration after startup diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 59cd1c64037148e9db403360755663aeda43e729..e162ae0779ff613faf1def076fb2267408a9d414 100644 +index 8799692ffd3eff3915789145e254e2a370ccd92c..3b54e1bd8ab25a7564cf2befeb836e61465e2d0f 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1755,7 +1755,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - public boolean isInvulnerableTo(ServerLevel level, DamageSource damageSource) { - return (super.isInvulnerableTo(level, damageSource) // Paper - disable player cramming; - || this.isChangingDimension() && !damageSource.is(DamageTypes.ENDER_PEARL) -- || !this.connection.hasClientLoaded()) || (!this.level().paperConfig().collisions.allowPlayerCrammingDamage && damageSource.is(DamageTypes.CRAMMING)); // Paper - disable player cramming; -+ || !this.connection.hasClientLoaded()) || (!org.leavesmc.leaves.LeavesConfig.modify.mcTechnicalMode && !this.level().paperConfig().collisions.allowPlayerCrammingDamage && damageSource.is(DamageTypes.CRAMMING)); // Paper - disable player cramming; // Leaves - mc technical survival mode +@@ -1764,7 +1764,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + public boolean isInvulnerableTo(final ServerLevel level, final DamageSource source) { + // Paper start - disable player cramming + return (super.isInvulnerableTo(level, source) || this.isChangingDimension() && !source.is(DamageTypes.ENDER_PEARL) || !this.connection.hasClientLoaded()) +- || (!this.level().paperConfig().collisions.allowPlayerCrammingDamage && source.is(DamageTypes.CRAMMING)); ++ || (!org.leavesmc.leaves.LeavesConfig.modify.mcTechnicalMode && !this.level().paperConfig().collisions.allowPlayerCrammingDamage && source.is(DamageTypes.CRAMMING)); // Leaves - mc technical survival mode + // Paper end - disable player cramming } - @Override diff --git a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -index 278addb7dbe4f57e99fb91ce1cd1bf3559e239a3..b7e790d05e2f15dc073f8ca55f17bd6fcaea9cf1 100644 +index 2940dbc31a20eb49e24418ec84b73f2bfbdcfc32..7115dbb6782475b9ea4d33eaf890b40eb51d5f2f 100644 --- a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +++ b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -@@ -69,7 +69,7 @@ public class AcquirePoi { - return false; - } else { - mutableLong.setValue(time + 20L + level.getRandom().nextInt(20)); -- if (level.paperConfig().entities.behavior.stuckEntityPoiRetryDelay.enabled() && mob.getNavigation().isStuck()) mutableLong.add(level.paperConfig().entities.behavior.stuckEntityPoiRetryDelay.intValue()); // Paper - Next stuck check delay config -+ if (!org.leavesmc.leaves.LeavesConfig.modify.mcTechnicalMode && level.paperConfig().entities.behavior.stuckEntityPoiRetryDelay.enabled() && mob.getNavigation().isStuck()) mutableLong.add(level.paperConfig().entities.behavior.stuckEntityPoiRetryDelay.intValue()); // Paper - Next stuck check delay config // Leaves - mc technical survival mode - PoiManager poiManager = level.getPoiManager(); - map.long2ObjectEntrySet().removeIf(entry -> !entry.getValue().isStillValid(time)); - Predicate predicate1 = pos -> { +@@ -78,7 +78,7 @@ public class AcquirePoi { + } + + nextScheduledStart.setValue(timestamp + 20L + random.nextInt(20)); +- if (level.paperConfig().entities.behavior.stuckEntityPoiRetryDelay.enabled() && body.getNavigation().isStuck()) nextScheduledStart.add(level.paperConfig().entities.behavior.stuckEntityPoiRetryDelay.intValue()); // Paper - Next stuck check delay config ++ if (!org.leavesmc.leaves.LeavesConfig.modify.mcTechnicalMode && level.paperConfig().entities.behavior.stuckEntityPoiRetryDelay.enabled() && body.getNavigation().isStuck()) nextScheduledStart.add(level.paperConfig().entities.behavior.stuckEntityPoiRetryDelay.intValue()); // Paper - Next stuck check delay config // Leaves - mc technical survival mode + PoiManager poiManager = level.getPoiManager(); + batchCache.long2ObjectEntrySet().removeIf(entry -> !entry.getValue().isStillValid(timestamp)); + Predicate cacheTest = pos -> { diff --git a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java -index c095f42aa103b7874fb5d8dcece1b1484c2e2968..0b3f757a3de694589a070f6b02594aca06828043 100644 +index 471b33333c32e49076fd4cc169d01da4a92f3101..edbaf908a1ae2dc532662b65794391a9cde89fee 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java +++ b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java @@ -65,7 +65,7 @@ public class EndCrystal extends Entity { @@ -45,10 +44,10 @@ index c095f42aa103b7874fb5d8dcece1b1484c2e2968..0b3f757a3de694589a070f6b02594aca || ((ServerLevel) this.level()).getDragonFight() == null || ((ServerLevel) this.level()).getDragonFight().respawnStage == null diff --git a/net/minecraft/world/entity/item/PrimedTnt.java b/net/minecraft/world/entity/item/PrimedTnt.java -index 910e7739aea98d6dfa603072acf5e9936dbb2c5e..9ceec84368cc24bc43b90a82150c9abf7db758e1 100644 +index 7970c6f9189059e8fc0391709159ef395c56708c..ede2ce9abfb14a25a6b48d7867ff935b5167ba3e 100644 --- a/net/minecraft/world/entity/item/PrimedTnt.java +++ b/net/minecraft/world/entity/item/PrimedTnt.java -@@ -99,7 +99,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { +@@ -101,7 +101,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { @Override public void tick() { @@ -58,10 +57,10 @@ index 910e7739aea98d6dfa603072acf5e9936dbb2c5e..9ceec84368cc24bc43b90a82150c9abf this.applyGravity(); this.move(MoverType.SELF, this.getDeltaMovement()); diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java -index 4e5078495037078922ab6350a500acdabe177ca5..05686d5b79412fdd2934fb16936f1f3b1c7d50c1 100644 +index 9764163a32b0389afa50ba093d0647de04d5119e..4f08a4eeafaaa4ac7db078019cab15232b3ba6c8 100644 --- a/net/minecraft/world/level/NaturalSpawner.java +++ b/net/minecraft/world/level/NaturalSpawner.java -@@ -85,7 +85,7 @@ public final class NaturalSpawner { +@@ -90,7 +90,7 @@ public final class NaturalSpawner { MobCategory category = entity.getType().getCategory(); if (category != MobCategory.MISC) { // Paper start - Only count natural spawns @@ -71,23 +70,23 @@ index 4e5078495037078922ab6350a500acdabe177ca5..05686d5b79412fdd2934fb16936f1f3b entity.spawnReason == org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN)) { continue; diff --git a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -index 17096a9ba33ecaddb50bfe2bccb505d0f0110e7e..86e4cf0631e809615c8d975c0f411be5897ce76f 100644 +index c74d683d4ab26d20903842c690b06db34b5f6a85..65ddab898cb13760389929c00aac29707363fc15 100644 --- a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -@@ -345,7 +345,7 @@ public class BeehiveBlockEntity extends BlockEntity { +@@ -327,7 +327,7 @@ public class BeehiveBlockEntity extends BlockEntity { // Leaves end - pca } // Paper start - Fix bees aging inside; use exitTickCounter to keep actual bee life - else if (level.paperConfig().entities.behavior.cooldownFailedBeehiveReleases) { + else if (!org.leavesmc.leaves.LeavesConfig.modify.mcTechnicalMode && level.paperConfig().entities.behavior.cooldownFailedBeehiveReleases) { // Leaves - mc technical survival mode - beeData.exitTickCounter = beeData.occupant.minTicksInHive / 2; + data.exitTickCounter = data.occupant.minTicksInHive / 2; } // Paper end - Fix bees aging inside; use exitTickCounter to keep actual bee life diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index 59a92e77244f45a58f61919519fc57f6c0bed8ee..cb6a11673d19266925c87b0254a7f66d8e4fb7ca 100644 +index 97b5abf842f698a2b5cebca5acb1acb7fb9095e1..00d0c70447b30a68754a99a1e079e5ceb4b66ecf 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -276,7 +276,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -266,7 +266,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen origItemStack.setCount(originalItemCount); } } @@ -96,7 +95,7 @@ index 59a92e77244f45a58f61919519fc57f6c0bed8ee..cb6a11673d19266925c87b0254a7f66d hopper.setCooldown(level.spigotConfig.hopperTransfer); } return false; -@@ -317,7 +317,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -307,7 +307,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } origItemStack.setCount(originalItemCount); diff --git a/leaves-server/minecraft-patches/features/0031-Item-overstack-util.patch b/leaves-server/minecraft-patches/features/0031-Item-overstack-util.patch new file mode 100644 index 000000000..a2f63a75e --- /dev/null +++ b/leaves-server/minecraft-patches/features/0031-Item-overstack-util.patch @@ -0,0 +1,464 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Wed, 14 Dec 2022 14:47:06 +0800 +Subject: [PATCH] Item overstack util + + +diff --git a/net/minecraft/commands/arguments/item/ItemInput.java b/net/minecraft/commands/arguments/item/ItemInput.java +index 0dce216ae73c85dd69056bec7ef60b5e4364f23b..7cf4653bd7ae893ef16c10ab69221e9c9a43a519 100644 +--- a/net/minecraft/commands/arguments/item/ItemInput.java ++++ b/net/minecraft/commands/arguments/item/ItemInput.java +@@ -20,9 +20,11 @@ public record ItemInput(Holder item, DataComponentPatch components) { + + public ItemStack createItemStack(final int count) throws CommandSyntaxException { + ItemStack result = new ItemStack(this.item, count, this.components); +- if (count > result.getMaxStackSize()) { +- throw ERROR_STACK_TOO_BIG.create(this.item.getRegisteredName(), result.getMaxStackSize()); ++ // Leaves start - item over-stack util ++ if (count > org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(result)) { ++ throw ERROR_STACK_TOO_BIG.create(this.item.getRegisteredName(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(result)); + } ++ // Leaves end - item over-stack util + + DataResult validationResult = ItemStack.validateStrict(result); + return validationResult.getOrThrow(ERROR_MALFORMED_ITEM::create); +diff --git a/net/minecraft/server/commands/GiveCommand.java b/net/minecraft/server/commands/GiveCommand.java +index 5bd2c78b49539c20351562774313d5ce2b5ee94d..6c6d5c0f9a9932d05992470e3b986adf304bd127 100644 +--- a/net/minecraft/server/commands/GiveCommand.java ++++ b/net/minecraft/server/commands/GiveCommand.java +@@ -47,7 +47,7 @@ public class GiveCommand { + + private static int giveItem(final CommandSourceStack source, final ItemInput input, final Collection players, final int count) throws CommandSyntaxException { + ItemStack prototypeItemStack = input.createItemStack(1); +- int maxStackSize = prototypeItemStack.getMaxStackSize(); ++ int maxStackSize = org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(prototypeItemStack); // Leaves - item over-stack util + int maxAllowedCount = maxStackSize * 100; + if (count > maxAllowedCount) { + source.sendFailure(Component.translatable("commands.give.failed.toomanyitems", maxAllowedCount, prototypeItemStack.getDisplayName())); +diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 810b352503cdf56091ec6340ad72edde238fe359..f2ef9b2b0585819c8a59f45f5a12465ce436bb54 100644 +--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -3133,7 +3133,7 @@ public class ServerGamePacketListenerImpl + } else if (slot.mayPlace(cursor)) { + if (ItemStack.isSameItemSameComponents(clickedItem, cursor)) { + int toPlace = packet.buttonNum() == 0 ? cursor.getCount() : 1; +- toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.getCount()); ++ toPlace = Math.min(toPlace, org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(clickedItem) - clickedItem.getCount()); // Leaves - item over-stack util + toPlace = Math.min(toPlace, slot.container.getMaxStackSize() - clickedItem.getCount()); + if (toPlace == 1) { + action = InventoryAction.PLACE_ONE; +@@ -3169,7 +3169,7 @@ public class ServerGamePacketListenerImpl + } + } else if (ItemStack.isSameItemSameComponents(cursor, clickedItem)) { + if (clickedItem.getCount() >= 0) { +- if (clickedItem.getCount() + cursor.getCount() <= cursor.getMaxStackSize()) { ++ if (clickedItem.getCount() + cursor.getCount() <= org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(cursor)) { // Leaves - item over-stack util + // As of 1.5, this is result slots only + action = InventoryAction.PICKUP_ALL; + } +@@ -3386,6 +3386,7 @@ public class ServerGamePacketListenerImpl + this.player.containerMenu.broadcastFullState(); + } else { + this.player.containerMenu.broadcastChanges(); ++ if (org.leavesmc.leaves.util.ItemOverstackUtils.hasOverstackingItem()) this.player.containerMenu.broadcastCarriedItem(); // Leaves - item over-stack util - force send carried item + } + if (packet.buttonNum() == Inventory.SLOT_OFFHAND && this.player.containerMenu != this.player.inventoryMenu) this.player.containerSynchronizer.sendOffHandSlotChange(); // Paper - update offhand data when the player is clicking in an inventory not their own as the sychronizer does not include offhand slots + if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes. +@@ -3497,7 +3498,7 @@ public class ServerGamePacketListenerImpl + } + + boolean validSlot = packet.slotNum() >= 1 && packet.slotNum() <= 45; +- boolean validData = itemStack.isEmpty() || itemStack.getCount() <= itemStack.getMaxStackSize(); ++ boolean validData = itemStack.isEmpty() || itemStack.getCount() <= org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); // Leaves - item over-stack util + if (drop || (validSlot && !ItemStack.matches(this.player.inventoryMenu.getSlot(packet.slotNum()).getItem(), packet.itemStack()))) { // Insist on valid slot + // CraftBukkit start - Call click event + org.bukkit.inventory.InventoryView inventory = this.player.inventoryMenu.getBukkitView(); +@@ -3539,6 +3540,7 @@ public class ServerGamePacketListenerImpl + this.player.inventoryMenu.getSlot(packet.slotNum()).setByPlayer(itemStack); + this.player.inventoryMenu.setRemoteSlot(packet.slotNum(), itemStack); + this.player.inventoryMenu.broadcastChanges(); ++ if (org.leavesmc.leaves.util.ItemOverstackUtils.hasOverstackingItem()) this.player.containerMenu.sendSingleSlot(packet.slotNum(), itemStack); // Leaves - item over-stack util - force send carried item + if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes. + } else if (drop && validData) { + if (this.dropSpamThrottler.isUnderThreshold()) { +diff --git a/net/minecraft/world/Container.java b/net/minecraft/world/Container.java +index 6e08d50794c4af4405f3e164a3fd46f376b3f78f..99449ab429ce545cf8f6f72bd1baad83b1461365 100644 +--- a/net/minecraft/world/Container.java ++++ b/net/minecraft/world/Container.java +@@ -37,6 +37,12 @@ public interface Container extends Clearable, Iterable, SlotProvider + return Math.min(this.getMaxStackSize(), itemStack.getMaxStackSize()); + } + ++ // Leaves start - item over-stack util ++ default int getMaxStackLeaves(final ItemStack stack) { ++ return Math.min(this.getMaxStackSize(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack)); ++ } ++ // Leaves end - item over-stack util ++ + void setChanged(); + + boolean stillValid(Player player); +diff --git a/net/minecraft/world/SimpleContainer.java b/net/minecraft/world/SimpleContainer.java +index 8d75e7fba5a30bc51c41f595e86e49a8cd01c0fb..8cff3f5fd8e2c1bde8fc6066c42b29535e0ad258 100644 +--- a/net/minecraft/world/SimpleContainer.java ++++ b/net/minecraft/world/SimpleContainer.java +@@ -193,7 +193,7 @@ public class SimpleContainer implements Container, StackedContentsCompatible { + @Override + public void setItem(final int slot, final ItemStack itemStack) { + this.items.set(slot, itemStack); +- itemStack.limitSize(this.getMaxStackSize(itemStack)); ++ itemStack.limitSize(this.getMaxStackLeaves(itemStack)); // Leaves - item over-stack util + this.setChanged(); + } + +@@ -263,7 +263,7 @@ public class SimpleContainer implements Container, StackedContentsCompatible { + } + + private void moveItemsBetweenStacks(final ItemStack sourceStack, final ItemStack targetStack) { +- int maxCount = this.getMaxStackSize(targetStack); ++ int maxCount = this.getMaxStackLeaves(targetStack); // Leaves - item over-stack util + int diff = Math.min(sourceStack.getCount(), maxCount - targetStack.getCount()); + if (diff > 0) { + targetStack.grow(diff); +diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java +index 974d1d7b283aace71f0ea8ef07ba68a17b75af8a..79d82446abdc782448a085b99177065d571eb5a1 100644 +--- a/net/minecraft/world/entity/item/ItemEntity.java ++++ b/net/minecraft/world/entity/item/ItemEntity.java +@@ -276,10 +276,15 @@ public class ItemEntity extends Entity implements TraceableEntity { + + private boolean isMergable() { + ItemStack item = this.getItem(); +- return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && item.getCount() < item.getMaxStackSize(); // Paper - Alternative item-despawn-rate ++ return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && item.getCount() < org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(item); // Paper - Alternative item-despawn-rate // Leaves - item over-stack util + } + + private void tryToMerge(final ItemEntity other) { ++ // Leaves start - item over-stack util ++ if (org.leavesmc.leaves.util.ItemOverstackUtils.tryStackItems(this, other)) { ++ return; ++ } ++ // Leaves end - item over-stack util + ItemStack thisItemStack = this.getItem(); + ItemStack otherItemStack = other.getItem(); + if (Objects.equals(this.target, other.target) && areMergable(thisItemStack, otherItemStack)) { +diff --git a/net/minecraft/world/entity/player/Inventory.java b/net/minecraft/world/entity/player/Inventory.java +index cd7714dffcd7e7b6d96d18a97e65fd0914a739d1..fd38d7c34910ab9a60a9f54968901be3af2a9867 100644 +--- a/net/minecraft/world/entity/player/Inventory.java ++++ b/net/minecraft/world/entity/player/Inventory.java +@@ -166,10 +166,12 @@ public class Inventory implements Container, Nameable { + } + + private boolean hasRemainingSpaceForItem(final ItemStack slotItemStack, final ItemStack newItemStack) { ++ // Leaves start - item over-stack util + return !slotItemStack.isEmpty() +- && slotItemStack.isStackable() +- && slotItemStack.getCount() < this.getMaxStackSize(slotItemStack) ++ && org.leavesmc.leaves.util.ItemOverstackUtils.isStackable(slotItemStack) ++ && slotItemStack.getCount() < org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(slotItemStack) + && ItemStack.isSameItemSameComponents(slotItemStack, newItemStack); // Paper - check if itemstack is stackable first ++ // Leaves end - item over-stack util + } + + // CraftBukkit start - Watch method above! :D +@@ -182,7 +184,7 @@ public class Inventory implements Container, Nameable { + } + + if (this.hasRemainingSpaceForItem(itemInSlot, itemStack)) { +- remains -= (itemInSlot.getMaxStackSize() < this.getMaxStackSize() ? itemInSlot.getMaxStackSize() : this.getMaxStackSize()) - itemInSlot.getCount(); ++ remains -= (org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInSlot) < this.getMaxStackSize() ? org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInSlot) : this.getMaxStackSize()) - itemInSlot.getCount(); // Leaves - item over-stack util + } + if (remains <= 0) { + return itemStack.getCount(); +@@ -191,7 +193,7 @@ public class Inventory implements Container, Nameable { + + ItemStack itemInOffhand = this.equipment.get(EquipmentSlot.OFFHAND); + if (this.hasRemainingSpaceForItem(itemInOffhand, itemStack)) { +- remains -= (itemInOffhand.getMaxStackSize() < this.getMaxStackSize() ? itemInOffhand.getMaxStackSize() : this.getMaxStackSize()) - itemInOffhand.getCount(); ++ remains -= (org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInOffhand) < this.getMaxStackSize() ? org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInOffhand) : this.getMaxStackSize()) - itemInOffhand.getCount(); // Leaves - item over-stack util + } + if (remains <= 0) { + return itemStack.getCount(); +@@ -315,7 +317,7 @@ public class Inventory implements Container, Nameable { + this.setItem(slot, itemStackInSlot); + } + +- int maxToAdd = this.getMaxStackSize(itemStackInSlot) - itemStackInSlot.getCount(); ++ int maxToAdd = this.getMaxStackLeaves(itemStackInSlot) - itemStackInSlot.getCount(); // Leaves - item over-stack util + int toAdd = Math.min(count, maxToAdd); + if (toAdd == 0) { + return count; +@@ -423,7 +425,7 @@ public class Inventory implements Container, Nameable { + break; + } + +- int slotHasSpaceFor = itemStack.getMaxStackSize() - this.getItem(slot).getCount(); ++ int slotHasSpaceFor = org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack) - this.getItem(slot).getCount(); // Leaves - item over-stack util + if (this.add(slot, itemStack.split(slotHasSpaceFor)) && shouldSendSetSlotPacket && this.player instanceof ServerPlayer serverPlayer) { + serverPlayer.connection.send(this.createInventoryUpdatePacket(slot)); + } +diff --git a/net/minecraft/world/entity/player/StackedItemContents.java b/net/minecraft/world/entity/player/StackedItemContents.java +index 1ace17d8fc7e7b8b4722a1889d49233c0ec55e20..d146f02338852810679a45bff932d9d68ee86d60 100644 +--- a/net/minecraft/world/entity/player/StackedItemContents.java ++++ b/net/minecraft/world/entity/player/StackedItemContents.java +@@ -36,7 +36,7 @@ public class StackedItemContents { + } + + public void accountStack(final ItemStack itemStack) { +- this.accountStack(itemStack, itemStack.getMaxStackSize()); ++ this.accountStack(itemStack, org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack)); // Leaves - item over-stack util + } + + public void accountStack(final ItemStack itemStack, final int maxCount) { +diff --git a/net/minecraft/world/entity/vehicle/ContainerEntity.java b/net/minecraft/world/entity/vehicle/ContainerEntity.java +index 028f9217e16963b4d3d8deb0f364c526d5661a59..15692744697043ab68a7247534614afac8f781f8 100644 +--- a/net/minecraft/world/entity/vehicle/ContainerEntity.java ++++ b/net/minecraft/world/entity/vehicle/ContainerEntity.java +@@ -160,7 +160,7 @@ public interface ContainerEntity extends Container, MenuProvider { + default void setChestVehicleItem(final int slot, final ItemStack itemStack) { + this.unpackChestVehicleLootTable(null); + this.getItemStacks().set(slot, itemStack); +- itemStack.limitSize(this.getMaxStackSize(itemStack)); ++ itemStack.limitSize(this.getMaxStackLeaves(itemStack)); // Leaves - item over-stack util + } + + default @Nullable SlotAccess getChestVehicleSlot(final int slot) { +diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java +index ded1c27b2083aea24525ffe42ad0e9cc263cbcdb..ea4d896148b4d5886a73a7d1214c552122106332 100644 +--- a/net/minecraft/world/inventory/AbstractContainerMenu.java ++++ b/net/minecraft/world/inventory/AbstractContainerMenu.java +@@ -293,6 +293,14 @@ public abstract class AbstractContainerMenu { + this.sendAllDataToRemote(); + } + ++ // Leaves start - item over-stack util ++ public void sendSingleSlot(final int slotIndex, final ItemStack item) { ++ if (this.synchronizer != null) { ++ this.synchronizer.sendSlotChange(this, slotIndex, item); ++ } ++ } ++ // Leaves end - item over-stack util ++ + private void updateDataSlotListeners(final int id, final int currentValue) { + for (ContainerListener containerListener : this.containerListeners) { + containerListener.dataChanged(this, id, currentValue); +@@ -450,7 +458,7 @@ public abstract class AbstractContainerMenu { + && (this.quickcraftType == QUICKCRAFT_TYPE_CLONE || carriedItemStack.getCount() >= this.quickcraftSlots.size()) + && this.canDragTo(slot)) { + int carry = slot.hasItem() ? slot.getItem().getCount() : 0; +- int maxSize = Math.min(source.getMaxStackSize(), slot.getMaxStackSize(source)); ++ int maxSize = Math.min(org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(source), slot.getMaxStackSize(source)); // Leaves - item over-stack util + int newCount = Math.min(getQuickCraftPlaceCount(this.quickcraftSlots.size(), this.quickcraftType, source) + carry, maxSize); + remaining -= newCount - carry; + // slot.setByPlayer(source.copyWithCount(newCount)); +@@ -558,7 +566,7 @@ public abstract class AbstractContainerMenu { + slot.setByPlayer(carried); + } + } else if (ItemStack.isSameItemSameComponents(clicked, carried)) { +- Optional newCarried = slot.tryRemove(clicked.getCount(), carried.getMaxStackSize() - carried.getCount(), player); ++ Optional newCarried = slot.tryRemove(clicked.getCount(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(carried) - carried.getCount(), player); // Leaves - item over-stack util + newCarried.ifPresent(itemsTaken -> { + carried.grow(itemsTaken.getCount()); + slot.onTake(player, itemsTaken); +@@ -620,7 +628,7 @@ public abstract class AbstractContainerMenu { + Slot slot = this.slots.get(slotIndex); + if (slot.hasItem()) { + ItemStack item = slot.getItem(); +- this.setCarried(item.copyWithCount(item.getMaxStackSize())); ++ this.setCarried(item.copyWithCount(org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(item))); // Leaves - item over-stack util + } + } else if (containerInput == ContainerInput.THROW && this.getCarried().isEmpty() && slotIndex >= 0) { + Slot slot = this.slots.get(slotIndex); +@@ -655,15 +663,15 @@ public abstract class AbstractContainerMenu { + int step = buttonNum == 0 ? 1 : -1; + + for (int pass = 0; pass < 2; pass++) { +- for (int i = start; i >= 0 && i < this.slots.size() && carried.getCount() < carried.getMaxStackSize(); i += step) { ++ for (int i = start; i >= 0 && i < this.slots.size() && carried.getCount() < org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(carried); i += step) { // Leaves - item over-stack util + Slot target = this.slots.get(i); + if (target.hasItem() + && canItemQuickReplace(target, carried, true) + && target.mayPickup(player) + && this.canTakeItemForPickAll(carried, target)) { + ItemStack itemStack = target.getItem(); +- if (pass != 0 || itemStack.getCount() != itemStack.getMaxStackSize()) { +- ItemStack removed = target.safeTake(itemStack.getCount(), carried.getMaxStackSize() - carried.getCount(), player); ++ if (pass != 0 || itemStack.getCount() != org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack)) { // Leaves - item over-stack util ++ ItemStack removed = target.safeTake(itemStack.getCount(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(carried) - carried.getCount(), player); // Leaves - item over-stack util + carried.grow(removed.getCount()); + } + } +@@ -782,7 +790,7 @@ public abstract class AbstractContainerMenu { + destSlot = endSlot - 1; + } + +- if (itemStack.isStackable()) { ++ if (org.leavesmc.leaves.util.ItemOverstackUtils.isStackable(itemStack)) { // Leaves - item over-stack util + while (!itemStack.isEmpty() && (backwards ? destSlot >= startSlot : destSlot < endSlot)) { + Slot slot = this.slots.get(destSlot); + ItemStack target = slot.getItem(); +@@ -883,7 +891,7 @@ public abstract class AbstractContainerMenu { + public static boolean canItemQuickReplace(final @Nullable Slot slot, final ItemStack itemStack, final boolean ignoreSize) { + boolean slotIsEmpty = slot == null || !slot.hasItem(); + return !slotIsEmpty && ItemStack.isSameItemSameComponents(itemStack, slot.getItem()) +- ? slot.getItem().getCount() + (ignoreSize ? 0 : itemStack.getCount()) <= itemStack.getMaxStackSize() ++ ? slot.getItem().getCount() + (ignoreSize ? 0 : itemStack.getCount()) <= org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack) // Leaves - item over-stack util + : slotIsEmpty; + } + +@@ -891,7 +899,7 @@ public abstract class AbstractContainerMenu { + return switch (quickCraftingType) { + case 0 -> Mth.floor((float)itemStack.getCount() / quickCraftSlotsSize); + case 1 -> 1; +- case 2 -> itemStack.getMaxStackSize(); ++ case 2 -> org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); // Leaves - item over-stack util + default -> itemStack.getCount(); + }; + } +@@ -914,7 +922,7 @@ public abstract class AbstractContainerMenu { + for (int i = 0; i < container.getContainerSize(); i++) { + ItemStack itemStack = container.getItem(i); + if (!itemStack.isEmpty()) { +- totalPercent += (float)itemStack.getCount() / container.getMaxStackSize(itemStack); ++ totalPercent += org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackSignalStrength(container.getMaxStackSize(), itemStack); // Leaves - item over-stack util + } + } + +diff --git a/net/minecraft/world/inventory/MerchantContainer.java b/net/minecraft/world/inventory/MerchantContainer.java +index 7c2ab4868dc5bed6a2e444975ef48c68e9a0b6cf..a3500c25b519d7bcff673212eb88d11cee564f53 100644 +--- a/net/minecraft/world/inventory/MerchantContainer.java ++++ b/net/minecraft/world/inventory/MerchantContainer.java +@@ -108,7 +108,7 @@ public class MerchantContainer implements Container { + @Override + public void setItem(final int slot, final ItemStack itemStack) { + this.itemStacks.set(slot, itemStack); +- itemStack.limitSize(this.getMaxStackSize(itemStack)); ++ itemStack.limitSize(this.getMaxStackLeaves(itemStack)); // Leaves - item over-stack util + if (this.isPaymentSlot(slot)) { + this.updateSellItem(); + } +diff --git a/net/minecraft/world/inventory/Slot.java b/net/minecraft/world/inventory/Slot.java +index a1ec8f73f220cd7b269ca5c4d1b12595728360df..dc89d605371bbe020925625da415da179ac2a027 100644 +--- a/net/minecraft/world/inventory/Slot.java ++++ b/net/minecraft/world/inventory/Slot.java +@@ -75,7 +75,7 @@ public class Slot { + } + + public int getMaxStackSize(final ItemStack itemStack) { +- return Math.min(this.getMaxStackSize(), itemStack.getMaxStackSize()); ++ return Math.min(this.getMaxStackSize(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack)); // Leaves - item over-stack util + } + + public @Nullable Identifier getNoItemIcon() { +diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java +index f21148d51f52674a3b6f82f510d05be83b676123..34e56560780a200a2890b36c475aeebc578f1950 100644 +--- a/net/minecraft/world/item/ItemStack.java ++++ b/net/minecraft/world/item/ItemStack.java +@@ -156,7 +156,7 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { + private int popTime; + @Deprecated + private @Nullable Holder item; +- private PatchedDataComponentMap components; ++ public PatchedDataComponentMap components; // Leaves - item over-stack util + + public static DataResult validateStrict(final ItemStack itemStack) { + DataResult result = validateComponents(itemStack.getComponents()); +@@ -182,7 +182,8 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { + + Holder item = Item.STREAM_CODEC.decode(input); + DataComponentPatch patch = patchCodec.decode(input); +- return new ItemStack(item, count, patch); ++ ItemStack stack = new ItemStack(item, count, patch); ++ return org.leavesmc.leaves.util.ItemOverstackUtils.decodeMaxStackSize(stack); // Leaves - item over-stack util + } + + @Override +@@ -190,17 +191,20 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { + if (itemStack.isEmpty() || itemStack.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem() + output.writeVarInt(0); + } else { +- output.writeVarInt(io.papermc.paper.util.sanitizer.ItemComponentSanitizer.sanitizeCount(io.papermc.paper.util.sanitizer.ItemObfuscationSession.currentSession(), itemStack, itemStack.getCount())); // Paper - potentially sanitize count +- Item.STREAM_CODEC.encode(output, itemStack.typeHolder()); ++ // Leaves start - item over-stack util ++ final ItemStack encodedStack = org.leavesmc.leaves.util.ItemOverstackUtils.encodeMaxStackSize(itemStack.copy()); ++ output.writeVarInt(io.papermc.paper.util.sanitizer.ItemComponentSanitizer.sanitizeCount(io.papermc.paper.util.sanitizer.ItemObfuscationSession.currentSession(), encodedStack, encodedStack.getCount())); // Paper - potentially sanitize count ++ Item.STREAM_CODEC.encode(output, encodedStack.typeHolder()); + // Paper start - adventure; conditionally render translatable components + boolean prev = net.minecraft.network.chat.ComponentSerialization.DONT_RENDER_TRANSLATABLES.get(); +- try (final io.papermc.paper.util.SafeAutoClosable ignored = io.papermc.paper.util.sanitizer.ItemObfuscationSession.withContext(c -> c.itemStack(itemStack))) { // pass the itemstack as context to the obfuscation session ++ try (final io.papermc.paper.util.SafeAutoClosable ignored = io.papermc.paper.util.sanitizer.ItemObfuscationSession.withContext(c -> c.itemStack(encodedStack))) { // pass the itemstack as context to the obfuscation session + net.minecraft.network.chat.ComponentSerialization.DONT_RENDER_TRANSLATABLES.set(true); +- patchCodec.encode(output, itemStack.components.asPatch()); ++ patchCodec.encode(output, encodedStack.components.asPatch()); + } finally { + net.minecraft.network.chat.ComponentSerialization.DONT_RENDER_TRANSLATABLES.set(prev); + } + // Paper end - adventure; conditionally render translatable components ++ // Leaves end - item over-stack util + } + } + }; +diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java +index 15ed625105539f402fb39275b292531fe388a7a0..2b97fd6af1c4956eb173b8c66c2a3efc8772a798 100644 +--- a/net/minecraft/world/level/block/CrafterBlock.java ++++ b/net/minecraft/world/level/block/CrafterBlock.java +@@ -202,7 +202,7 @@ public class CrafterBlock extends BaseEntityBlock { + Direction direction = blockState.getValue(ORIENTATION).front(); + Container into = HopperBlockEntity.getContainerAt(level, pos.relative(direction)); + ItemStack remaining = results.copy(); +- if (into != null && (into instanceof CrafterBlockEntity || results.getCount() > into.getMaxStackSize(results))) { ++ if (into != null && (into instanceof CrafterBlockEntity || results.getCount() > into.getMaxStackLeaves(results))) { // Leaves - item over-stack util + // CraftBukkit start - InventoryMoveItemEvent + org.bukkit.craftbukkit.inventory.CraftItemStack oitemstack = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(remaining); + +diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +index d74df87d1228a9144ffb864ddb67ca1bb7d13c1f..97b69ca8025321d4ffbdca80e593348b014a73d6 100644 +--- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +@@ -392,7 +392,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit + ItemStack oldStack = this.items.get(slot); + boolean same = !itemStack.isEmpty() && ItemStack.isSameItemSameComponents(oldStack, itemStack); + this.items.set(slot, itemStack); +- itemStack.limitSize(this.getMaxStackSize(itemStack)); ++ itemStack.limitSize(this.getMaxStackLeaves(itemStack)); // Leaves - item over-stack util + if (slot == 0 && !same && this.level instanceof ServerLevel serverLevel) { + this.cookingTotalTime = getTotalCookTime(serverLevel, this, this.recipeType, this.cookSpeedMultiplier); // Paper - cook speed multiplier API + this.cookingTimer = 0; +diff --git a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java +index f52e4015ee880013a1f6f6ee42a2cd9545b6dbbc..a0f2e2356cf81f14783c00394e0f4177a81cedab 100644 +--- a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java +@@ -124,7 +124,7 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co + @Override + public void setItem(final int slot, final ItemStack itemStack) { + this.getItems().set(slot, itemStack); +- itemStack.limitSize(this.getMaxStackSize(itemStack)); ++ itemStack.limitSize(this.getMaxStackLeaves(itemStack)); // Leaves - item over-stack util + this.setChanged(); + } + +diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +index 00d0c70447b30a68754a99a1e079e5ceb4b66ecf..326e25d1226ed1f719265e32b6e2d64eab6059a6 100644 +--- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +@@ -114,7 +114,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + public void setItem(final int slot, final ItemStack itemStack) { + this.unpackLootTable(null); + this.getItems().set(slot, itemStack); +- itemStack.limitSize(this.getMaxStackSize(itemStack)); ++ itemStack.limitSize(this.getMaxStackLeaves(itemStack)); // Leaves - item over-stack util + } + + @Override +@@ -585,9 +585,9 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + if (current.isEmpty()) { + // Spigot start - SPIGOT-6693, SimpleContainer#setItem + ItemStack leftover = ItemStack.EMPTY; // Paper - Make hoppers respect inventory max stack size +- if (!itemStack.isEmpty() && itemStack.getCount() > container.getMaxStackSize()) { ++ if (!itemStack.isEmpty() && (itemStack.getCount() > container.getMaxStackSize() || itemStack.getCount() > itemStack.getMaxStackSize())) { // Leaves - item over-stack util + leftover = itemStack; // Paper - Make hoppers respect inventory max stack size +- itemStack = itemStack.split(container.getMaxStackSize()); ++ itemStack = itemStack.split(Math.min(container.getMaxStackSize(), itemStack.getMaxStackSize())); // Leaves - item over-stack util + } + // Spigot end + ignoreBlockEntityUpdates = true; // Paper - Perf: Optimize Hoppers diff --git a/leaves-server/minecraft-patches/features/0032-Return-nether-portal-fix.patch b/leaves-server/minecraft-patches/features/0032-Return-nether-portal-fix.patch new file mode 100644 index 000000000..d6b2e4349 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0032-Return-nether-portal-fix.patch @@ -0,0 +1,90 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Mon, 3 Feb 2025 15:36:21 +0800 +Subject: [PATCH] Return nether portal fix + + +diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java +index 3b54e1bd8ab25a7564cf2befeb836e61465e2d0f..4c85295c972b84ac110f5691f48576a315754ad9 100644 +--- a/net/minecraft/server/level/ServerPlayer.java ++++ b/net/minecraft/server/level/ServerPlayer.java +@@ -1582,6 +1582,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), oldLevel.getWorld()); + this.level().getCraftServer().getPluginManager().callEvent(changeEvent); + // CraftBukkit end ++ // Leaves start - nether portal fix ++ if (org.leavesmc.leaves.LeavesConfig.modify.netherPortalFix) { ++ final net.minecraft.resources.ResourceKey fromDim = oldLevel.dimension(); ++ final net.minecraft.resources.ResourceKey toDim = this.level().dimension(); ++ if ((fromDim == Level.OVERWORLD && toDim == Level.NETHER) || (fromDim == Level.NETHER && toDim == Level.OVERWORLD)) { ++ BlockPos fromPortal = org.leavesmc.leaves.util.ReturnPortalManager.findPortalAt(this, fromDim, this.lastPos); ++ BlockPos toPos = this.blockPosition(); ++ if (fromPortal != null) { ++ org.leavesmc.leaves.util.ReturnPortalManager.storeReturnPortal(this, toDim, toPos, fromPortal); ++ } ++ } ++ } ++ // Leaves end - nether portal fix + // Paper start - Reset shield blocking on dimension change + if (this.isBlocking()) { + this.stopUsingItem(); +diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java +index 174443a3abca82b09ae2a0dd4dc55743607b1716..a5d7ab2d4c977fd63972487e2df37af6a1282b30 100644 +--- a/net/minecraft/server/players/PlayerList.java ++++ b/net/minecraft/server/players/PlayerList.java +@@ -704,6 +704,18 @@ public abstract class PlayerList { + // It's possible for respawn to be in a diff dimension + if (fromLevel != level) { + new org.bukkit.event.player.PlayerChangedWorldEvent(player.getBukkitEntity(), fromLevel.getWorld()).callEvent(); ++ // Leaves start - nether portal fix ++ if (org.leavesmc.leaves.LeavesConfig.modify.netherPortalFix) { ++ final net.minecraft.resources.ResourceKey fromDim = fromLevel.dimension(); ++ final net.minecraft.resources.ResourceKey toDim = level.dimension(); ++ if ((fromDim == net.minecraft.world.level.Level.OVERWORLD && toDim == net.minecraft.world.level.Level.NETHER) || (fromDim == net.minecraft.world.level.Level.NETHER && toDim == net.minecraft.world.level.Level.OVERWORLD)) { ++ net.minecraft.core.BlockPos fromPortal = org.leavesmc.leaves.util.ReturnPortalManager.findPortalAt(player, fromDim, player.lastPos); ++ if (fromPortal != null) { ++ org.leavesmc.leaves.util.ReturnPortalManager.storeReturnPortal(player, toDim, player.blockPosition(), fromPortal); ++ } ++ } ++ } ++ // Leaves end - nether portal fix + player.triggerDimensionChangeTriggers(level); + } + +diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java +index 5e312db025ff9b1c9b69eb65adebb2ec16aaa467..2403a117ec13922a5bdf1b736d37a77e21959c8d 100644 +--- a/net/minecraft/world/entity/LivingEntity.java ++++ b/net/minecraft/world/entity/LivingEntity.java +@@ -261,7 +261,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + public int useItemRemaining; + protected int fallFlyTicks; + private long lastKineticHitFeedbackTime = -2147483648L; +- private BlockPos lastPos; ++ public BlockPos lastPos; // Leaves - private -> public + private Optional lastClimbablePos = Optional.empty(); + private @Nullable DamageSource lastDamageSource; + private long lastDamageStamp; +diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java +index 14cca8dae351481328c689d4227d36c00f279b42..4fbc8e7114302004fc498329d6b9f3a0290dee76 100644 +--- a/net/minecraft/world/level/block/NetherPortalBlock.java ++++ b/net/minecraft/world/level/block/NetherPortalBlock.java +@@ -188,7 +188,18 @@ public class NetherPortalBlock extends Block implements Portal { + final WorldBorder worldBorder + , org.bukkit.craftbukkit.event.PortalEventResult result // CraftBukkit + ) { +- Optional exitPortalPos = newLevel.getPortalForcer().findClosestPortalPosition(approximateExitPos, worldBorder, result.searchRadius()); // CraftBukkit ++ // Leaves start - fix return portal ++ Optional exitPortalPos = Optional.empty(); ++ if (org.leavesmc.leaves.LeavesConfig.modify.netherPortalFix && entity instanceof net.minecraft.server.level.ServerPlayer player) { ++ org.leavesmc.leaves.util.ReturnPortalManager.ReturnPortal portal = org.leavesmc.leaves.util.ReturnPortalManager.findReturnPortal(player, entity.level().dimension(), entity.blockPosition()); ++ if (portal != null && newLevel.getBlockState(portal.pos()).is(Blocks.NETHER_PORTAL)) { ++ exitPortalPos = Optional.of(portal.pos()); ++ } ++ } ++ if (exitPortalPos.isEmpty()) { ++ exitPortalPos = newLevel.getPortalForcer().findClosestPortalPosition(approximateExitPos, worldBorder, result.searchRadius()); // CraftBukkit ++ } ++ // Leaves end - fix return portal + BlockUtil.FoundRectangle exitPortal; + TeleportTransition.PostTeleportTransition post; + if (exitPortalPos.isPresent()) { diff --git a/leaves-server/minecraft-patches/features/0033-Item-overstack-util.patch b/leaves-server/minecraft-patches/features/0033-Item-overstack-util.patch deleted file mode 100644 index 2fb8a5831..000000000 --- a/leaves-server/minecraft-patches/features/0033-Item-overstack-util.patch +++ /dev/null @@ -1,522 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Wed, 14 Dec 2022 14:47:06 +0800 -Subject: [PATCH] Item overstack util - -Part of this patch is Powered by fabric-carpet(https://github.com/gnembon/fabric-carpet) and plusls-carpet-addition(https://github.com/plusls/plusls-carpet-addition) - -diff --git a/net/minecraft/commands/arguments/item/ItemInput.java b/net/minecraft/commands/arguments/item/ItemInput.java -index 8e08cb90dc94171a8da7126fe18c46eaa49a58f2..a7804a0d099c79c81eb45eb20402a001d8734529 100644 ---- a/net/minecraft/commands/arguments/item/ItemInput.java -+++ b/net/minecraft/commands/arguments/item/ItemInput.java -@@ -39,11 +39,13 @@ public class ItemInput { - public ItemStack createItemStack(int count, boolean allowOversizedStacks) throws CommandSyntaxException { - ItemStack itemStack = new ItemStack(this.item, count); - itemStack.applyComponents(this.components); -- if (allowOversizedStacks && count > itemStack.getMaxStackSize()) { -- throw ERROR_STACK_TOO_BIG.create(this.getItemName(), itemStack.getMaxStackSize()); -+ // Leaves start - item over-stack util -+ if (allowOversizedStacks && count > org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack)) { -+ throw ERROR_STACK_TOO_BIG.create(this.getItemName(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack)); - } else { - return itemStack; - } -+ // Leaves end - item over-stack util - } - - public String serialize(HolderLookup.Provider levelRegistry) { -diff --git a/net/minecraft/server/commands/GiveCommand.java b/net/minecraft/server/commands/GiveCommand.java -index 0fc63717af24ca37497db8ea5a2395548d9d8491..21c85da896e0896eb0f8a7a6a5570ece368168a2 100644 ---- a/net/minecraft/server/commands/GiveCommand.java -+++ b/net/minecraft/server/commands/GiveCommand.java -@@ -54,7 +54,7 @@ public class GiveCommand { - - private static int giveItem(CommandSourceStack source, ItemInput item, Collection targets, int count) throws CommandSyntaxException { - ItemStack itemStack = item.createItemStack(1, false); -- int maxStackSize = itemStack.getMaxStackSize(); -+ int maxStackSize = org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); // Leaves - item over-stack util - int i = maxStackSize * 100; - if (count > i) { - source.sendFailure(Component.translatable("commands.give.failed.toomanyitems", i, itemStack.getDisplayName())); -diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index e158d614abed8d16e80192c0c9abd8537c92b9dc..41642a09940b7805dcd456b52f26922692eee4c4 100644 ---- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3070,7 +3070,7 @@ public class ServerGamePacketListenerImpl - } else if (slot.mayPlace(cursor)) { - if (ItemStack.isSameItemSameComponents(clickedItem, cursor)) { - int toPlace = packet.buttonNum() == 0 ? cursor.getCount() : 1; -- toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.getCount()); -+ toPlace = Math.min(toPlace, org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(clickedItem) - clickedItem.getCount()); // Leaves - item over-stack util - toPlace = Math.min(toPlace, slot.container.getMaxStackSize() - clickedItem.getCount()); - if (toPlace == 1) { - action = InventoryAction.PLACE_ONE; -@@ -3106,7 +3106,7 @@ public class ServerGamePacketListenerImpl - } - } else if (ItemStack.isSameItemSameComponents(cursor, clickedItem)) { - if (clickedItem.getCount() >= 0) { -- if (clickedItem.getCount() + cursor.getCount() <= cursor.getMaxStackSize()) { -+ if (clickedItem.getCount() + cursor.getCount() <= org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(cursor)) { // Leaves - item over-stack util - // As of 1.5, this is result slots only - action = InventoryAction.PICKUP_ALL; - } -@@ -3323,6 +3323,7 @@ public class ServerGamePacketListenerImpl - this.player.containerMenu.broadcastFullState(); - } else { - this.player.containerMenu.broadcastChanges(); -+ if (org.leavesmc.leaves.util.ItemOverstackUtils.hasOverstackingItem()) this.player.containerMenu.broadcastCarriedItem(); // Leaves - item over-stack util - force send carried item - } - if (packet.buttonNum() == Inventory.SLOT_OFFHAND && this.player.containerMenu != this.player.inventoryMenu) this.player.containerSynchronizer.sendOffHandSlotChange(); // Paper - update offhand data when the player is clicking in an inventory not their own as the sychronizer does not include offhand slots - if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes. -@@ -3434,7 +3435,7 @@ public class ServerGamePacketListenerImpl - } - - boolean flag1 = packet.slotNum() >= 1 && packet.slotNum() <= 45; -- boolean flag2 = itemStack.isEmpty() || itemStack.getCount() <= itemStack.getMaxStackSize(); -+ boolean flag2 = itemStack.isEmpty() || itemStack.getCount() <= org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); // Leaves - item over-stack util - if (flag || (flag1 && !ItemStack.matches(this.player.inventoryMenu.getSlot(packet.slotNum()).getItem(), packet.itemStack()))) { // Insist on valid slot - // CraftBukkit start - Call click event - org.bukkit.inventory.InventoryView inventory = this.player.inventoryMenu.getBukkitView(); -@@ -3476,6 +3477,7 @@ public class ServerGamePacketListenerImpl - this.player.inventoryMenu.getSlot(packet.slotNum()).setByPlayer(itemStack); - this.player.inventoryMenu.setRemoteSlot(packet.slotNum(), itemStack); - this.player.inventoryMenu.broadcastChanges(); -+ if (org.leavesmc.leaves.util.ItemOverstackUtils.hasOverstackingItem()) this.player.containerMenu.sendSingleSlot(packet.slotNum(), itemStack); // Leaves - item over-stack util - force send carried item - if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.updateEquipmentOnPlayerActions) this.player.detectEquipmentUpdates(); // Paper - Force update attributes. - } else if (flag && flag2) { - if (this.dropSpamThrottler.isUnderThreshold()) { -diff --git a/net/minecraft/world/Container.java b/net/minecraft/world/Container.java -index 6489b47810b0431c350098d574469bbe0adcd726..61646fe4b3476017a175a5d30fde53f13538ad9e 100644 ---- a/net/minecraft/world/Container.java -+++ b/net/minecraft/world/Container.java -@@ -37,6 +37,12 @@ public interface Container extends Clearable, SlotProvider, Iterable - return Math.min(this.getMaxStackSize(), stack.getMaxStackSize()); - } - -+ // Leaves start - item over-stack util -+ default int getMaxStackLeaves(ItemStack stack) { -+ return Math.min(this.getMaxStackSize(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack)); -+ } -+ // Leaves end - item over-stack util -+ - void setChanged(); - - boolean stillValid(Player player); -diff --git a/net/minecraft/world/SimpleContainer.java b/net/minecraft/world/SimpleContainer.java -index 0233c2b5e40c33330870e598431897a2ff98c2a3..3cf1819a9c82da2d2e0c43187e204353e3643369 100644 ---- a/net/minecraft/world/SimpleContainer.java -+++ b/net/minecraft/world/SimpleContainer.java -@@ -210,7 +210,7 @@ public class SimpleContainer implements Container, StackedContentsCompatible { - @Override - public void setItem(int index, ItemStack stack) { - this.items.set(index, stack); -- stack.limitSize(this.getMaxStackSize(stack)); -+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util - this.setChanged(); - } - -@@ -285,7 +285,7 @@ public class SimpleContainer implements Container, StackedContentsCompatible { - } - - private void moveItemsBetweenStacks(ItemStack stack, ItemStack other) { -- int maxStackSize = this.getMaxStackSize(other); -+ int maxStackSize = this.getMaxStackLeaves(other); // Leaves - item over-stack util - int min = Math.min(stack.getCount(), maxStackSize - other.getCount()); - if (min > 0) { - other.grow(min); -diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index e82bb8f2d2b0e771dc371fd7e709116e1f5f204f..6d522eac417e6d0e21626f412ba5e90d241f0406 100644 ---- a/net/minecraft/world/entity/item/ItemEntity.java -+++ b/net/minecraft/world/entity/item/ItemEntity.java -@@ -267,10 +267,15 @@ public class ItemEntity extends Entity implements TraceableEntity { - - private boolean isMergable() { - ItemStack item = this.getItem(); -- return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && item.getCount() < item.getMaxStackSize(); // Paper - Alternative item-despawn-rate -+ return this.isAlive() && this.pickupDelay != 32767 && this.age != -32768 && this.age < this.despawnRate && item.getCount() < org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(item); // Paper - Alternative item-despawn-rate // Leaves - item over-stack util - } - - private void tryToMerge(ItemEntity itemEntity) { -+ // Leaves start - item over-stack util -+ if (org.leavesmc.leaves.util.ItemOverstackUtils.tryStackItems(this, itemEntity)) { -+ return; -+ } -+ // Leaves end - item over-stack util - ItemStack item = this.getItem(); - ItemStack item1 = itemEntity.getItem(); - if (Objects.equals(this.target, itemEntity.target) && areMergable(item, item1)) { -diff --git a/net/minecraft/world/entity/npc/InventoryCarrier.java b/net/minecraft/world/entity/npc/InventoryCarrier.java -index 585644a1339b477cb38fec7e06848e1a45c1516b..3d7e05bcc7e0c8c108f81a12a7f77b5d3a0b1d40 100644 ---- a/net/minecraft/world/entity/npc/InventoryCarrier.java -+++ b/net/minecraft/world/entity/npc/InventoryCarrier.java -@@ -31,7 +31,17 @@ public interface InventoryCarrier { - - mob.onItemPickup(itemEntity); - int count = item.getCount(); -- ItemStack itemStack = inventory.addItem(item); -+ // Leaves start - item over-stack util -+ int restoreCount = 0; -+ if (org.leavesmc.leaves.util.ItemOverstackUtils.isStackable(item)) { -+ int vanillaMax = item.getMaxStackSize(); -+ restoreCount = Math.max(0, count - vanillaMax); -+ item.setCount(count - restoreCount); -+ } -+ ItemStack itemStack = item.copy(); -+ itemStack.setCount(inventory.addItem(item).getCount()); -+ itemStack.setCount(itemStack.getCount() + restoreCount); -+ // Leaves end - item over-stack util - mob.take(itemEntity, count - itemStack.getCount()); - if (itemStack.isEmpty()) { - itemEntity.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.PICKUP); // CraftBukkit - add Bukkit remove cause -diff --git a/net/minecraft/world/entity/player/Inventory.java b/net/minecraft/world/entity/player/Inventory.java -index 41e59f3739945ca7f6ab710c993b5c0f15fcd529..b849b04f227b43d036f4f6b3ae7accfafc389d9f 100644 ---- a/net/minecraft/world/entity/player/Inventory.java -+++ b/net/minecraft/world/entity/player/Inventory.java -@@ -166,10 +166,12 @@ public class Inventory implements Container, Nameable { - } - - private boolean hasRemainingSpaceForItem(ItemStack destination, ItemStack origin) { -+ // Leaves start - item over-stack util - return !destination.isEmpty() -- && destination.isStackable() -- && destination.getCount() < this.getMaxStackSize(destination) -+ && org.leavesmc.leaves.util.ItemOverstackUtils.isStackable(destination) -+ && destination.getCount() < org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(destination) - && ItemStack.isSameItemSameComponents(destination, origin); // Paper - check if itemstack is stackable first -+ // Leaves end - item over-stack util - } - - // CraftBukkit start - Watch method above! :D -@@ -182,7 +184,7 @@ public class Inventory implements Container, Nameable { - } - - if (this.hasRemainingSpaceForItem(itemInSlot, itemStack)) { -- remains -= (itemInSlot.getMaxStackSize() < this.getMaxStackSize() ? itemInSlot.getMaxStackSize() : this.getMaxStackSize()) - itemInSlot.getCount(); -+ remains -= (org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInSlot) < this.getMaxStackSize() ? org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInSlot) : this.getMaxStackSize()) - itemInSlot.getCount(); // Leaves - item over-stack util - } - if (remains <= 0) { - return itemStack.getCount(); -@@ -191,7 +193,7 @@ public class Inventory implements Container, Nameable { - - ItemStack itemInOffhand = this.equipment.get(EquipmentSlot.OFFHAND); - if (this.hasRemainingSpaceForItem(itemInOffhand, itemStack)) { -- remains -= (itemInOffhand.getMaxStackSize() < this.getMaxStackSize() ? itemInOffhand.getMaxStackSize() : this.getMaxStackSize()) - itemInOffhand.getCount(); -+ remains -= (org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInOffhand) < this.getMaxStackSize() ? org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemInOffhand) : this.getMaxStackSize()) - itemInOffhand.getCount(); // Leaves - item over-stack util - } - if (remains <= 0) { - return itemStack.getCount(); -@@ -315,7 +317,7 @@ public class Inventory implements Container, Nameable { - this.setItem(slot, item); - } - -- int i = this.getMaxStackSize(item) - item.getCount(); -+ int i = this.getMaxStackLeaves(item) - item.getCount(); // Leaves - item over-stack util - int min = Math.min(count, i); - if (min == 0) { - return count; -@@ -421,7 +423,7 @@ public class Inventory implements Container, Nameable { - break; - } - -- int i = stack.getMaxStackSize() - this.getItem(slotWithRemainingSpace).getCount(); -+ int i = org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack) - this.getItem(slotWithRemainingSpace).getCount(); // Leaves - item over-stack util - if (this.add(slotWithRemainingSpace, stack.split(i)) && sendPacket && this.player instanceof ServerPlayer serverPlayer) { - serverPlayer.connection.send(this.createInventoryUpdatePacket(slotWithRemainingSpace)); - } -diff --git a/net/minecraft/world/entity/player/StackedItemContents.java b/net/minecraft/world/entity/player/StackedItemContents.java -index 00dbc0d125b2c8c208ffa46f9084c6317efaba90..1f57b3c60fd0cbfdd65e06f8994525ade6dc6bd9 100644 ---- a/net/minecraft/world/entity/player/StackedItemContents.java -+++ b/net/minecraft/world/entity/player/StackedItemContents.java -@@ -36,7 +36,7 @@ public class StackedItemContents { - } - - public void accountStack(ItemStack stack) { -- this.accountStack(stack, stack.getMaxStackSize()); -+ this.accountStack(stack, org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack)); // Leaves - item over-stack util - } - - public void accountStack(ItemStack stack, int maxStackSize) { -diff --git a/net/minecraft/world/entity/vehicle/ContainerEntity.java b/net/minecraft/world/entity/vehicle/ContainerEntity.java -index 44276ba9c7aab306cfd12833a834ebe61cf64e7c..0a19a7782f3fa27c41e02393e887ba7cc727012b 100644 ---- a/net/minecraft/world/entity/vehicle/ContainerEntity.java -+++ b/net/minecraft/world/entity/vehicle/ContainerEntity.java -@@ -162,7 +162,7 @@ public interface ContainerEntity extends Container, MenuProvider { - default void setChestVehicleItem(int slot, ItemStack stack) { - this.unpackChestVehicleLootTable(null); - this.getItemStacks().set(slot, stack); -- stack.limitSize(this.getMaxStackSize(stack)); -+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util - } - - default @Nullable SlotAccess getChestVehicleSlot(final int slot) { -diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java -index b5837ee5e291ae23bd8613c4c1856c14dd9e152b..38af11add6b97a34c406e86278008c2652c241a1 100644 ---- a/net/minecraft/world/inventory/AbstractContainerMenu.java -+++ b/net/minecraft/world/inventory/AbstractContainerMenu.java -@@ -292,6 +292,13 @@ public abstract class AbstractContainerMenu { - this.sendAllDataToRemote(); - } - -+ // Leaves start - item over-stack util -+ public void sendSingleSlot(int slotIndex, ItemStack item) { -+ if (this.synchronizer != null) { -+ this.synchronizer.sendSlotChange(this, slotIndex, item); -+ } -+ } -+ // Leaves end - item over-stack util - private void updateDataSlotListeners(int slotIndex, int value) { - for (ContainerListener containerListener : this.containerListeners) { - containerListener.dataChanged(this, slotIndex, value); -@@ -449,7 +456,7 @@ public abstract class AbstractContainerMenu { - && (this.quickcraftType == 2 || carried1.getCount() >= this.quickcraftSlots.size()) - && this.canDragTo(slot1)) { - int i2 = slot1.hasItem() ? slot1.getItem().getCount() : 0; -- int min = Math.min(itemStack.getMaxStackSize(), slot1.getMaxStackSize(itemStack)); -+ int min = Math.min(org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack), slot1.getMaxStackSize(itemStack)); // Leaves - item over-stack util - int min1 = Math.min(getQuickCraftPlaceCount(this.quickcraftSlots, this.quickcraftType, itemStack) + i2, min); - count -= min1 - i2; - // slot1.setByPlayer(itemStack.copyWithCount(min1)); -@@ -557,7 +564,7 @@ public abstract class AbstractContainerMenu { - slot.setByPlayer(carried2); - } - } else if (ItemStack.isSameItemSameComponents(carried, carried2)) { -- Optional optional1 = slot.tryRemove(carried.getCount(), carried2.getMaxStackSize() - carried2.getCount(), player); -+ Optional optional1 = slot.tryRemove(carried.getCount(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(carried2) - carried2.getCount(), player); // Leaves - item over-stack util - optional1.ifPresent(itemStack2 -> { - carried2.grow(itemStack2.getCount()); - slot.onTake(player, itemStack2); -@@ -619,7 +626,7 @@ public abstract class AbstractContainerMenu { - Slot slot2 = this.slots.get(slotIndex); - if (slot2.hasItem()) { - ItemStack itemStack = slot2.getItem(); -- this.setCarried(itemStack.copyWithCount(itemStack.getMaxStackSize())); -+ this.setCarried(itemStack.copyWithCount(org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack))); // Leaves - item over-stack util - } - } else if (clickType == ClickType.THROW && this.getCarried().isEmpty() && slotIndex >= 0) { - Slot slot2 = this.slots.get(slotIndex); -@@ -654,15 +661,15 @@ public abstract class AbstractContainerMenu { - int maxStackSize = button == 0 ? 1 : -1; - - for (int i3 = 0; i3 < 2; i3++) { -- for (int i4 = count; i4 >= 0 && i4 < this.slots.size() && itemStack.getCount() < itemStack.getMaxStackSize(); i4 += maxStackSize) { -+ for (int i4 = count; i4 >= 0 && i4 < this.slots.size() && itemStack.getCount() < org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); i4 += maxStackSize) { // Leaves - item over-stack util - Slot slot3 = this.slots.get(i4); - if (slot3.hasItem() - && canItemQuickReplace(slot3, itemStack, true) - && slot3.mayPickup(player) - && this.canTakeItemForPickAll(itemStack, slot3)) { - ItemStack item1 = slot3.getItem(); -- if (i3 != 0 || item1.getCount() != item1.getMaxStackSize()) { -- ItemStack itemStack1 = slot3.safeTake(item1.getCount(), itemStack.getMaxStackSize() - itemStack.getCount(), player); -+ if (i3 != 0 || item1.getCount() != org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(item1)) { // Leaves - item over-stack util -+ ItemStack itemStack1 = slot3.safeTake(item1.getCount(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack) - itemStack.getCount(), player); // Leaves - item over-stack util - itemStack.grow(itemStack1.getCount()); - } - } -@@ -780,7 +787,7 @@ public abstract class AbstractContainerMenu { - i = endIndex - 1; - } - -- if (stack.isStackable()) { -+ if (org.leavesmc.leaves.util.ItemOverstackUtils.isStackable(stack)) { // Leaves - item over-stack util - while (!stack.isEmpty() && (reverseDirection ? i >= startIndex : i < endIndex)) { - Slot slot = this.slots.get(i); - ItemStack item = slot.getItem(); -@@ -881,7 +888,7 @@ public abstract class AbstractContainerMenu { - public static boolean canItemQuickReplace(@Nullable Slot slot, ItemStack stack, boolean stackSizeMatters) { - boolean flag = slot == null || !slot.hasItem(); - return !flag && ItemStack.isSameItemSameComponents(stack, slot.getItem()) -- ? slot.getItem().getCount() + (stackSizeMatters ? 0 : stack.getCount()) <= stack.getMaxStackSize() -+ ? slot.getItem().getCount() + (stackSizeMatters ? 0 : stack.getCount()) <= org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack) // Leaves - item over-stack util - : flag; - } - -@@ -889,7 +896,7 @@ public abstract class AbstractContainerMenu { - return switch (type) { - case 0 -> Mth.floor((float)stack.getCount() / slots.size()); - case 1 -> 1; -- case 2 -> stack.getMaxStackSize(); -+ case 2 -> org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack); // Leaves - item over-stack util - default -> stack.getCount(); - }; - } -@@ -911,7 +918,7 @@ public abstract class AbstractContainerMenu { - for (int i = 0; i < container.getContainerSize(); i++) { - ItemStack item = container.getItem(i); - if (!item.isEmpty()) { -- f += (float)item.getCount() / container.getMaxStackSize(item); -+ f += org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackSignalStrength(container.getMaxStackSize(), item); // Leaves - item over-stack util - } - } - -diff --git a/net/minecraft/world/inventory/MerchantContainer.java b/net/minecraft/world/inventory/MerchantContainer.java -index a4203c416c7a83557055099a9ea8f43ac2b18b21..46c8026876e851ec4a31fd34c9b64623469ffb8d 100644 ---- a/net/minecraft/world/inventory/MerchantContainer.java -+++ b/net/minecraft/world/inventory/MerchantContainer.java -@@ -108,7 +108,7 @@ public class MerchantContainer implements Container { - @Override - public void setItem(int index, ItemStack stack) { - this.itemStacks.set(index, stack); -- stack.limitSize(this.getMaxStackSize(stack)); -+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util - if (this.isPaymentSlot(index)) { - this.updateSellItem(); - } -diff --git a/net/minecraft/world/inventory/Slot.java b/net/minecraft/world/inventory/Slot.java -index 2b7e245ebf3bb471a1d817c4b5d56a64790cbab7..00083df87439ff0fa56e09853931b60579520d0e 100644 ---- a/net/minecraft/world/inventory/Slot.java -+++ b/net/minecraft/world/inventory/Slot.java -@@ -75,7 +75,7 @@ public class Slot { - } - - public int getMaxStackSize(ItemStack stack) { -- return Math.min(this.getMaxStackSize(), stack.getMaxStackSize()); -+ return Math.min(this.getMaxStackSize(), org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(stack)); // Leaves - item over-stack util - } - - public @Nullable Identifier getNoItemIcon() { -diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index 3a719a98118c275422f4fc61b07d471dd503656f..c59dec418f94b468f0465d0375809031f10bac39 100644 ---- a/net/minecraft/world/item/ItemStack.java -+++ b/net/minecraft/world/item/ItemStack.java -@@ -170,7 +170,7 @@ public final class ItemStack implements DataComponentHolder { - private int popTime; - @Deprecated - private @Nullable Item item; -- PatchedDataComponentMap components; -+ public PatchedDataComponentMap components; // Leaves - item over-stack util - private @Nullable Entity entityRepresentation; - - public static DataResult validateStrict(ItemStack stack) { -@@ -196,7 +196,8 @@ public final class ItemStack implements DataComponentHolder { - } else { - Holder holder = Item.STREAM_CODEC.decode(buffer); - DataComponentPatch dataComponentPatch = codec.decode(buffer); -- return new ItemStack(holder, varInt, dataComponentPatch); -+ ItemStack itemStack = new ItemStack(holder, varInt, dataComponentPatch); -+ return org.leavesmc.leaves.util.ItemOverstackUtils.decodeMaxStackSize(itemStack); - } - } - -@@ -205,13 +206,15 @@ public final class ItemStack implements DataComponentHolder { - if (value.isEmpty() || value.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem() - buffer.writeVarInt(0); - } else { -- buffer.writeVarInt(io.papermc.paper.util.sanitizer.ItemComponentSanitizer.sanitizeCount(io.papermc.paper.util.sanitizer.ItemObfuscationSession.currentSession(), value, value.getCount())); // Paper - potentially sanitize count -- Item.STREAM_CODEC.encode(buffer, value.getItemHolder()); -+ // Leaves start - item over-stack util -+ final ItemStack itemStack = org.leavesmc.leaves.util.ItemOverstackUtils.encodeMaxStackSize(value.copy()); -+ buffer.writeVarInt(io.papermc.paper.util.sanitizer.ItemComponentSanitizer.sanitizeCount(io.papermc.paper.util.sanitizer.ItemObfuscationSession.currentSession(), itemStack, itemStack.getCount())); // Paper - potentially sanitize count -+ Item.STREAM_CODEC.encode(buffer, itemStack.getItemHolder()); - // Paper start - adventure; conditionally render translatable components - boolean prev = net.minecraft.network.chat.ComponentSerialization.DONT_RENDER_TRANSLATABLES.get(); -- try (final io.papermc.paper.util.SafeAutoClosable ignored = io.papermc.paper.util.sanitizer.ItemObfuscationSession.withContext(c -> c.itemStack(value))) { // pass the itemstack as context to the obfuscation session -+ try (final io.papermc.paper.util.SafeAutoClosable ignored = io.papermc.paper.util.sanitizer.ItemObfuscationSession.withContext(c -> c.itemStack(itemStack))) { // pass the itemstack as context to the obfuscation session - net.minecraft.network.chat.ComponentSerialization.DONT_RENDER_TRANSLATABLES.set(true); -- codec.encode(buffer, value.components.asPatch()); -+ codec.encode(buffer, itemStack.components.asPatch()); - } finally { - net.minecraft.network.chat.ComponentSerialization.DONT_RENDER_TRANSLATABLES.set(prev); - } -@@ -305,7 +308,7 @@ public final class ItemStack implements DataComponentHolder { - - for (ItemStack itemStack : itemContainerContents.nonEmptyItems()) { - int count = itemStack.getCount(); -- int maxStackSize = itemStack.getMaxStackSize(); -+ int maxStackSize = org.leavesmc.leaves.util.ItemOverstackUtils.getItemStackMaxCount(itemStack); // Leaves - item over-stack util - if (count > maxStackSize) { - return DataResult.error(() -> "Item stack with count of " + count + " was larger than maximum: " + maxStackSize); - } -diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java -index c5fe15844d405a27cdae18c903dd481c25b437de..3faa541c4a4623e915269d6241e1a3a3c6e374ff 100644 ---- a/net/minecraft/world/level/block/CrafterBlock.java -+++ b/net/minecraft/world/level/block/CrafterBlock.java -@@ -191,7 +191,7 @@ public class CrafterBlock extends BaseEntityBlock { - Direction direction = state.getValue(ORIENTATION).front(); - Container containerAt = HopperBlockEntity.getContainerAt(level, pos.relative(direction)); - ItemStack itemStack = stack.copy(); -- if (containerAt != null && (containerAt instanceof CrafterBlockEntity || stack.getCount() > containerAt.getMaxStackSize(stack))) { -+ if (containerAt != null && (containerAt instanceof CrafterBlockEntity || stack.getCount() > containerAt.getMaxStackLeaves(stack))) { // Leaves - item over-stack util - // CraftBukkit start - InventoryMoveItemEvent - org.bukkit.craftbukkit.inventory.CraftItemStack oitemstack = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack); - -diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index 0503feadad8ff9ff0112199ccd65cdfd433a647e..5b6baeabc4b09ca59a7a9965692d9307a4d3f397 100644 ---- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -@@ -410,7 +410,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit - ItemStack itemStack = this.items.get(index); - boolean flag = !stack.isEmpty() && ItemStack.isSameItemSameComponents(itemStack, stack); - this.items.set(index, stack); -- stack.limitSize(this.getMaxStackSize(stack)); -+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util - if (index == 0 && !flag && this.level instanceof ServerLevel serverLevel) { - this.cookingTotalTime = getTotalCookTime(serverLevel, this, this.recipeType, this.cookSpeedMultiplier); // Paper - cook speed multiplier API - this.cookingTimer = 0; -diff --git a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java -index edf3bc4adc9b1700b73f06ea940f17cd55b16860..b1be97f37398240ce564aba6c700319243be215c 100644 ---- a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java -@@ -124,7 +124,7 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co - @Override - public void setItem(int slot, ItemStack stack) { - this.getItems().set(slot, stack); -- stack.limitSize(this.getMaxStackSize(stack)); -+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util - this.setChanged(); - } - -diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index cb6a11673d19266925c87b0254a7f66d8e4fb7ca..84e4733ab85808d3aa65d8573ea8a99096789d76 100644 ---- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -114,7 +114,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - public void setItem(int index, ItemStack stack) { - this.unpackLootTable(null); - this.getItems().set(index, stack); -- stack.limitSize(this.getMaxStackSize(stack)); -+ stack.limitSize(this.getMaxStackLeaves(stack)); // Leaves - item over-stack util - } - - @Override -@@ -645,7 +645,18 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - // CraftBukkit end - } // Paper - Perf: Optimize Hoppers - ItemStack itemStack = item.getItem().copy(); -- ItemStack itemStack1 = addItem(null, container, itemStack, null); -+ // Leaves start - item over-stack util -+ int restoreCount = 0; -+ ItemStack itemStack1 = itemStack.copy(); -+ if (org.leavesmc.leaves.util.ItemOverstackUtils.isStackable(item.getItem())) { -+ // We need the hopper suck in the item with the vanilla max stack size each time -+ int vanillaMax = itemStack.getMaxStackSize(); -+ restoreCount = Math.max(0, itemStack.getCount() - vanillaMax); -+ itemStack.setCount(itemStack.getCount() - restoreCount); -+ } -+ itemStack1.setCount(addItem(null, container, itemStack, null).getCount()); -+ itemStack1.setCount(itemStack1.getCount() + restoreCount); -+ // Leaves end - item over-stack util - if (itemStack1.isEmpty()) { - flag = true; - item.setItem(ItemStack.EMPTY); -@@ -654,7 +665,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - item.setItem(itemStack1); - } - -- return flag; -+ return flag || (restoreCount != 0); // Leaves - item over-stack util - } - - public static ItemStack addItem(@Nullable Container source, Container destination, ItemStack stack, @Nullable Direction direction) { -@@ -693,9 +704,9 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - if (item.isEmpty()) { - // Spigot start - SPIGOT-6693, SimpleContainer#setItem - ItemStack leftover = ItemStack.EMPTY; // Paper - Make hoppers respect inventory max stack size -- if (!stack.isEmpty() && stack.getCount() > destination.getMaxStackSize()) { -+ if (!stack.isEmpty() && (stack.getCount() > destination.getMaxStackSize() || stack.getCount() > stack.getMaxStackSize())) { // Leaves - item over-stack util - leftover = stack; // Paper - Make hoppers respect inventory max stack size -- stack = stack.split(destination.getMaxStackSize()); -+ stack = stack.split(Math.min(destination.getMaxStackSize(), stack.getMaxStackSize())); // Leaves - item over-stack util - } - // Spigot end - ignoreBlockEntityUpdates = true; // Paper - Perf: Optimize Hoppers diff --git a/leaves-server/minecraft-patches/features/0033-Leaves-Extra-Yggdrasil-Service.patch b/leaves-server/minecraft-patches/features/0033-Leaves-Extra-Yggdrasil-Service.patch new file mode 100644 index 000000000..53c440d69 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0033-Leaves-Extra-Yggdrasil-Service.patch @@ -0,0 +1,32 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Mon, 3 Feb 2025 15:48:19 +0800 +Subject: [PATCH] Leaves Extra Yggdrasil Service + + +diff --git a/net/minecraft/server/Main.java b/net/minecraft/server/Main.java +index 38b50aaf6473c7692d3372ad7b956355be989bd4..b730c6694e819813f8eb08b742d660937f9cbc21 100644 +--- a/net/minecraft/server/Main.java ++++ b/net/minecraft/server/Main.java +@@ -178,7 +178,7 @@ public class Main { + universePath = new File(bukkitConfiguration.getString("settings.world-container", ".")); + } + // Paper end - fix SPIGOT-5824 +- Services services = Services.create(new com.destroystokyo.paper.profile.PaperAuthenticationService(Proxy.NO_PROXY), universePath, userCacheFile, options); // Paper - pass OptionSet to load paper config files; override authentication service; fix world-container ++ Services services = Services.create(new org.leavesmc.leaves.profile.LeavesAuthenticationService(Proxy.NO_PROXY), universePath, userCacheFile, options); // Paper - pass OptionSet to load paper config files; override authentication service; fix world-container // Leaves - extra-yggdrasil-service + String levelName = Optional.ofNullable((String) options.valueOf("world")).orElse(settings.getProperties().levelName); // CraftBukkit + LevelStorageSource levelStorageSource = LevelStorageSource.createDefault(universePath.toPath()); + LevelStorageSource.LevelStorageAccess access = levelStorageSource.validateAndCreateAccess(levelName); +diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java +index d7d878a2d35ad40d4315aab15a466f2543906430..5f34bcf3ea0bfdb5f90c2fd5214adcd4521dafb1 100644 +--- a/net/minecraft/server/MinecraftServer.java ++++ b/net/minecraft/server/MinecraftServer.java +@@ -256,7 +256,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop public + private final NotificationManager notificationManager; + private final ServerActivityMonitor serverActivityMonitor; + private long lastServerStatus; diff --git a/leaves-server/minecraft-patches/features/0034-Configurable-vanilla-random.patch b/leaves-server/minecraft-patches/features/0034-Configurable-vanilla-random.patch new file mode 100644 index 000000000..8b85d0dc5 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0034-Configurable-vanilla-random.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Thu, 16 Feb 2023 17:25:01 +0800 +Subject: [PATCH] Configurable vanilla random + + +diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java +index 42d43b6ba3d668a02621fc231dd03cf11a6f9db9..d7c453d2b72351ec3553b341c02cc54d8a06659a 100644 +--- a/net/minecraft/world/entity/Entity.java ++++ b/net/minecraft/world/entity/Entity.java +@@ -298,7 +298,7 @@ public abstract class Entity + public double yOld; + public double zOld; + public boolean noPhysics; +- public final RandomSource random = SHARED_RANDOM; // Paper - Share random for entities to make them more random ++ public final RandomSource random = org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom ? RandomSource.create() : SHARED_RANDOM; // Paper - Share random for entities to make them more random // Leaves - configurable vanilla random + public int tickCount; + private int remainingFireTicks; + private final EntityFluidInteraction fluidInteraction = new EntityFluidInteraction(Set.of(FluidTags.WATER, FluidTags.LAVA)); +diff --git a/net/minecraft/world/entity/animal/squid/Squid.java b/net/minecraft/world/entity/animal/squid/Squid.java +index 637cdcf459aaf78dc381d8a990b0e2c571c06de8..492cb7411d3cae18786ba9835c122f94b73f57e5 100644 +--- a/net/minecraft/world/entity/animal/squid/Squid.java ++++ b/net/minecraft/world/entity/animal/squid/Squid.java +@@ -51,7 +51,7 @@ public class Squid extends AgeableWaterCreature { + + public Squid(final EntityType type, final Level level) { + super(type, level); +- // this.random.setSeed(this.getId()); // Paper - Share random for entities to make them more random ++ if (org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom) this.random.setSeed(this.getId()); // Paper - Share random for entities to make them more random // Leaves - configurable vanilla random + this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; + } + +diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java +index 79d82446abdc782448a085b99177065d571eb5a1..83299a0e7a11ab1983bc07e4f0a71477d9c3a181 100644 +--- a/net/minecraft/world/entity/item/ItemEntity.java ++++ b/net/minecraft/world/entity/item/ItemEntity.java +@@ -64,7 +64,13 @@ public class ItemEntity extends Entity implements TraceableEntity { + this(EntityType.ITEM, level); + this.setPos(x, y, z); + this.setItem(itemStack); +- this.setDeltaMovement(this.random.nextDouble() * 0.2 - 0.1, 0.2, this.random.nextDouble() * 0.2 - 0.1); ++ // Leaves start - configurable vanilla random ++ if (org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom) { ++ this.setDeltaMovement(level.getRandom().nextDouble() * 0.2 - 0.1, 0.2, level.getRandom().nextDouble() * 0.2 - 0.1); ++ } else { ++ this.setDeltaMovement(this.random.nextDouble() * 0.2 - 0.1, 0.2, this.random.nextDouble() * 0.2 - 0.1); ++ } ++ // Leaves end - configurable vanilla random + } + + public ItemEntity( +diff --git a/net/minecraft/world/entity/item/PrimedTnt.java b/net/minecraft/world/entity/item/PrimedTnt.java +index ede2ce9abfb14a25a6b48d7867ff935b5167ba3e..ba3f839e98ee1601a37169cbfe8b545acac63486 100644 +--- a/net/minecraft/world/entity/item/PrimedTnt.java ++++ b/net/minecraft/world/entity/item/PrimedTnt.java +@@ -69,7 +69,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { + public PrimedTnt(final Level level, final double x, final double y, final double z, final @Nullable LivingEntity owner) { + this(EntityType.TNT, level); + this.setPos(x, y, z); +- double rot = this.getRandom().nextDouble() * (float) (Math.PI * 2); // Paper - Don't use level random in entity constructors ++ double rot = (org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom ? level.getRandom().nextDouble() : this.getRandom().nextDouble()) * (float) (Math.PI * 2); // Paper - Don't use level random in entity constructors // Leaves - configurable vanilla random + this.setDeltaMovement(-Math.sin(rot) * 0.02, 0.2F, -Math.cos(rot) * 0.02); + this.setFuse(80); + this.xo = x; diff --git a/leaves-server/minecraft-patches/features/0034-Return-nether-portal-fix.patch b/leaves-server/minecraft-patches/features/0034-Return-nether-portal-fix.patch deleted file mode 100644 index aefaae4fa..000000000 --- a/leaves-server/minecraft-patches/features/0034-Return-nether-portal-fix.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Mon, 3 Feb 2025 15:36:21 +0800 -Subject: [PATCH] Return nether portal fix - -This patch is powered by NetherPortalFix(https://github.com/TwelveIterationMods/NetherPortalFix) - -diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index e162ae0779ff613faf1def076fb2267408a9d414..a369af5337126fcaebafcb1d1643a6c18b252f00 100644 ---- a/net/minecraft/server/level/ServerPlayer.java -+++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1574,6 +1574,21 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - org.bukkit.event.player.PlayerChangedWorldEvent changeEvent = new org.bukkit.event.player.PlayerChangedWorldEvent(this.getBukkitEntity(), serverLevel.getWorld()); - this.level().getCraftServer().getPluginManager().callEvent(changeEvent); - // CraftBukkit end -+ // Leaves start - nether portal fix -+ if (org.leavesmc.leaves.LeavesConfig.modify.netherPortalFix) { -+ final ResourceKey fromDim = serverLevel.dimension(); -+ final ResourceKey toDim = level().dimension(); -+ final ResourceKey OVERWORLD = Level.OVERWORLD; -+ final ResourceKey THE_NETHER = Level.NETHER; -+ if (!((fromDim != OVERWORLD || toDim != THE_NETHER) && (fromDim != THE_NETHER || toDim != OVERWORLD))) { -+ BlockPos fromPortal = org.leavesmc.leaves.util.ReturnPortalManager.findPortalAt(this, fromDim, lastPos); -+ BlockPos toPos = this.blockPosition(); -+ if (fromPortal != null) { -+ org.leavesmc.leaves.util.ReturnPortalManager.storeReturnPortal(this, toDim, toPos, fromPortal); -+ } -+ } -+ } -+ // Leaves end - nether portal fix - // Paper start - Reset shield blocking on dimension change - if (this.isBlocking()) { - this.stopUsingItem(); -diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index ffc04a2e30b407df64bba4a887b14932c02c0caa..fce0114134eb1ffee558f6ce072e793eafbd6779 100644 ---- a/net/minecraft/server/players/PlayerList.java -+++ b/net/minecraft/server/players/PlayerList.java -@@ -706,6 +706,20 @@ public abstract class PlayerList { - // It's possible for respawn to be in a diff dimension - if (fromLevel != level) { - new org.bukkit.event.player.PlayerChangedWorldEvent(serverPlayer.getBukkitEntity(), fromLevel.getWorld()).callEvent(); -+ // Leaves start - nether portal fix -+ if (org.leavesmc.leaves.LeavesConfig.modify.netherPortalFix) { -+ final ResourceKey fromDim = player.level().dimension(); -+ final ResourceKey toDim = serverPlayer.level().dimension(); -+ final ResourceKey OVERWORLD = Level.OVERWORLD; -+ final ResourceKey THE_NETHER = Level.NETHER; -+ if (!((fromDim != OVERWORLD || toDim != THE_NETHER) && (fromDim != THE_NETHER || toDim != OVERWORLD))) { -+ BlockPos fromPortal = org.leavesmc.leaves.util.ReturnPortalManager.findPortalAt(serverPlayer, fromDim, serverPlayer.lastPos); -+ if (fromPortal != null) { -+ org.leavesmc.leaves.util.ReturnPortalManager.storeReturnPortal(serverPlayer, toDim, serverPlayer.blockPosition(), fromPortal); -+ } -+ } -+ } -+ // Leaves end - nether portal fix - serverPlayer.triggerDimensionChangeTriggers(level); - } - -diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 6657cc6dd1fa32aafa65e79a2b2b439ffba889c6..8adf7835f71688ba319f053208d02b810097b06e 100644 ---- a/net/minecraft/world/entity/LivingEntity.java -+++ b/net/minecraft/world/entity/LivingEntity.java -@@ -262,7 +262,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - public int useItemRemaining; - protected int fallFlyTicks; - private long lastKineticHitFeedbackTime = -2147483648L; -- private BlockPos lastPos; -+ public BlockPos lastPos; // Leaves - private -> public - private Optional lastClimbablePos = Optional.empty(); - private @Nullable DamageSource lastDamageSource; - private long lastDamageStamp; -diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java -index 653b72855197733b33e310b0ccd4fbf04e22e95f..2688d5b86a77e1552e6322e7b80a0217a441afd4 100644 ---- a/net/minecraft/world/level/block/NetherPortalBlock.java -+++ b/net/minecraft/world/level/block/NetherPortalBlock.java -@@ -176,7 +176,18 @@ public class NetherPortalBlock extends Block implements Portal { - private @Nullable TeleportTransition getExitPortal( - ServerLevel level, Entity entity, BlockPos pos, BlockPos exitPos, WorldBorder worldBorder, org.bukkit.craftbukkit.event.PortalEventResult result // CraftBukkit - ) { -- Optional optional = level.getPortalForcer().findClosestPortalPosition(exitPos, worldBorder, result.searchRadius()); // CraftBukkit -+ // Leaves start - fix return portal -+ Optional optional = Optional.empty(); -+ if (org.leavesmc.leaves.LeavesConfig.modify.netherPortalFix && entity instanceof net.minecraft.server.level.ServerPlayer player) { -+ org.leavesmc.leaves.util.ReturnPortalManager.ReturnPortal portal = org.leavesmc.leaves.util.ReturnPortalManager.findReturnPortal(player, entity.level().dimension(), entity.blockPosition()); -+ if (portal != null && level.getBlockState(portal.pos()).is(Blocks.NETHER_PORTAL)) { -+ optional = Optional.of(portal.pos()); -+ } -+ } -+ if (optional.isEmpty()) { -+ optional = level.getPortalForcer().findClosestPortalPosition(exitPos, worldBorder, result.searchRadius()); // CraftBukkit -+ } -+ // Leaves end - fix return portal - BlockUtil.FoundRectangle largestRectangleAround; - TeleportTransition.PostTeleportTransition postTeleportTransition; - if (optional.isPresent()) { diff --git a/leaves-server/minecraft-patches/features/0037-Catch-update-suppression-crash.patch b/leaves-server/minecraft-patches/features/0035-Catch-update-suppression-crash.patch similarity index 59% rename from leaves-server/minecraft-patches/features/0037-Catch-update-suppression-crash.patch rename to leaves-server/minecraft-patches/features/0035-Catch-update-suppression-crash.patch index 821b014ea..f8cb345ef 100644 --- a/leaves-server/minecraft-patches/features/0037-Catch-update-suppression-crash.patch +++ b/leaves-server/minecraft-patches/features/0035-Catch-update-suppression-crash.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Catch update suppression crash diff --git a/net/minecraft/network/PacketProcessor.java b/net/minecraft/network/PacketProcessor.java -index d501168e40f951ee37efcbc464c3ab1307051060..8bf21ede4d7d7c1b05acd05b4b3d3dfcb36b2fb6 100644 +index 408cb996fc8ff77785da8919f19baff2cf4bd789..7c4d0ab96eb0a392debc7fbb2b52717ab5108a17 100644 --- a/net/minecraft/network/PacketProcessor.java +++ b/net/minecraft/network/PacketProcessor.java -@@ -97,7 +97,20 @@ public class PacketProcessor implements AutoCloseable { +@@ -95,7 +95,20 @@ public class PacketProcessor implements AutoCloseable { if (this.listener.shouldHandleMessage(this.packet)) { try { this.packet.handle(this.listener); @@ -18,43 +18,43 @@ index d501168e40f951ee37efcbc464c3ab1307051060..8bf21ede4d7d7c1b05acd05b4b3d3dfc + exception.providePlayer(gamePacketListener.player); + } + exception.consume(); - } catch (Exception var3) { -+ if (var3.getCause() instanceof org.leavesmc.leaves.util.UpdateSuppressionException exception) { + } catch (Exception e) { ++ if (e.getCause() instanceof org.leavesmc.leaves.util.UpdateSuppressionException exception) { + if (this.listener instanceof net.minecraft.server.network.ServerGamePacketListenerImpl gamePacketListener) { + exception.providePlayer(gamePacketListener.player); + } + exception.consume(); + } + // Leaves end - update suppression crash fix - if (var3 instanceof ReportedException reportedException && reportedException.getCause() instanceof OutOfMemoryError) { - throw PacketUtils.makeReportedException(var3, this.packet, this.listener); + if (e instanceof ReportedException re && re.getCause() instanceof OutOfMemoryError) { + throw PacketUtils.makeReportedException(e, this.packet, this.listener); } diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index b148841f83e33646dc2bf56218a1c25f5407f695..9ff3d51bf0af60d6ea9ca658cc1f0c988cf91a6c 100644 +index 5f34bcf3ea0bfdb5f90c2fd5214adcd4521dafb1..44115cd289cc35a29700251499bd176210d4eace 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1821,7 +1821,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop implements ca.spottedleaf.moonrise.patch +@@ -117,7 +117,16 @@ public abstract class StateHolder implements ca.spottedleaf.moonrise.patch if (ret != null) { return ret; } @@ -154,50 +154,62 @@ index c020d1944a25e2cd247e30a97c35bf93731d694a..10c15a3d355f39a3b8e709bffc3fc052 } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index e7fa4e132e88b24789ed30eb3248994f21ffd6bd..670459abcc6f32bdc6d4742f6710585fda83ac83 100644 +index a9d781e2fcac4e2426b0e35e46bbc10c540f9fd9..f845c2c6b19a274f39ec63980b6e3e6761f23bf0 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -378,7 +378,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - if (blockState == state) { - return null; - } else { -- Block block = state.getBlock(); -+ Block block = state.getBlock(); try { // Leaves start - update suppression crash fix - this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING).update(i, y, i2, state); - this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES).update(i, y, i2, state); - this.heightmaps.get(Heightmap.Types.OCEAN_FLOOR).update(i, y, i2, state); -@@ -452,6 +452,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - this.markUnsaved(); - return blockState; - } -+ } catch (org.leavesmc.leaves.util.UpdateSuppressionException e) { e.provideBlock(level, pos, block); throw e; } // Leaves - update suppression crash fix - } +@@ -380,7 +380,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + return null; } + +- Block newBlock = state.getBlock(); ++ Block newBlock = state.getBlock(); try { // Leaves start - update suppression crash fix + this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING).update(localX, y, localZ, state); + this.heightmaps.get(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES).update(localX, y, localZ, state); + this.heightmaps.get(Heightmap.Types.OCEAN_FLOOR).update(localX, y, localZ, state); +@@ -449,6 +449,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + + this.markUnsaved(); + return oldState; ++ } catch (org.leavesmc.leaves.util.UpdateSuppressionException e) { e.provideBlock(level, pos, newBlock); throw e; } // Leaves - update suppression crash fix } + + @Deprecated +@@ -750,6 +751,11 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + + public void setLoaded(final boolean loaded) { + this.loaded = loaded; ++ // Leaves start - bbor ++ if (loaded) { ++ org.leavesmc.leaves.protocol.BBORProtocol.onChunkLoaded(this); ++ } ++ // Leaves end - bbor + } + + public Level getLevel() { diff --git a/net/minecraft/world/level/redstone/NeighborUpdater.java b/net/minecraft/world/level/redstone/NeighborUpdater.java -index 87512434ccd8d46d8db718228c790465c64b2c20..b867a58eb2c954c49f80acfda7575114dfccecd4 100644 +index 72ef04091d1c850de5c15f0d9be3f2097a44ca7a..4bf7a27224896c6b71331196b625438fa9d5b52a 100644 --- a/net/minecraft/world/level/redstone/NeighborUpdater.java +++ b/net/minecraft/world/level/redstone/NeighborUpdater.java -@@ -60,9 +60,22 @@ public interface NeighborUpdater { - state.handleNeighborChanged(level, pos, neighborBlock, orientation, movedByPiston); +@@ -84,9 +84,22 @@ public interface NeighborUpdater { + state.handleNeighborChanged(level, pos, changedBlock, orientation, movedByPiston); // Spigot start } catch (StackOverflowError ex) { + // Leaves start - update suppression crash fix + if (org.leavesmc.leaves.LeavesConfig.modify.updateSuppressionCrashFix) { -+ throw new org.leavesmc.leaves.util.UpdateSuppressionException(pos, level, neighborBlock, null, ex); ++ throw new org.leavesmc.leaves.util.UpdateSuppressionException(pos, level, changedBlock, null, ex); + } level.lastPhysicsProblem = pos.immutable(); // Spigot end - } catch (Throwable var9) { + } catch (Throwable t) { + if (org.leavesmc.leaves.LeavesConfig.modify.updateSuppressionCrashFix) { -+ if (var9 instanceof org.leavesmc.leaves.util.UpdateSuppressionException ue) { -+ ue.provideBlock(level, pos, neighborBlock); ++ if (t instanceof org.leavesmc.leaves.util.UpdateSuppressionException ue) { ++ ue.provideBlock(level, pos, changedBlock); + throw ue; + } else { -+ throw new org.leavesmc.leaves.util.UpdateSuppressionException(pos, level, neighborBlock, null, var9); ++ throw new org.leavesmc.leaves.util.UpdateSuppressionException(pos, level, changedBlock, null, t); + } + } + // Leaves end - update suppression crash fix - CrashReport crashReport = CrashReport.forThrowable(var9, "Exception while updating neighbours"); - CrashReportCategory crashReportCategory = crashReport.addCategory("Block being updated"); - crashReportCategory.setDetail( + CrashReport report = CrashReport.forThrowable(t, "Exception while updating neighbours"); + CrashReportCategory category = report.addCategory("Block being updated"); + category.setDetail( diff --git a/leaves-server/minecraft-patches/features/0035-Leaves-Extra-Yggdrasil-Service.patch b/leaves-server/minecraft-patches/features/0035-Leaves-Extra-Yggdrasil-Service.patch deleted file mode 100644 index d8c9f7167..000000000 --- a/leaves-server/minecraft-patches/features/0035-Leaves-Extra-Yggdrasil-Service.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Mon, 3 Feb 2025 15:48:19 +0800 -Subject: [PATCH] Leaves Extra Yggdrasil Service - - -diff --git a/com/mojang/authlib/yggdrasil/YggdrasilMinecraftSessionService.java b/com/mojang/authlib/yggdrasil/YggdrasilMinecraftSessionService.java -index 9e5757391ea32e37b2aac52cc1bb38259a2cc497..b85593aea7a347a5c2c50464d2146f96f4fa317e 100644 ---- a/com/mojang/authlib/yggdrasil/YggdrasilMinecraftSessionService.java -+++ b/com/mojang/authlib/yggdrasil/YggdrasilMinecraftSessionService.java -@@ -48,7 +48,7 @@ import java.util.stream.Collectors; - - public class YggdrasilMinecraftSessionService implements MinecraftSessionService { - private static final Logger LOGGER = LoggerFactory.getLogger(YggdrasilMinecraftSessionService.class); -- private final MinecraftClient client; -+ protected final MinecraftClient client; // Leaves - private -> protected - private final ServicesKeySet servicesKeySet; - private final String baseUrl; - private final URL joinUrl; -diff --git a/net/minecraft/server/Main.java b/net/minecraft/server/Main.java -index 094d2d528cb74b8f1d277cd780bba7f438dbe764..b946df218837f424c5f6fcdc43f6fa106aae4edf 100644 ---- a/net/minecraft/server/Main.java -+++ b/net/minecraft/server/Main.java -@@ -174,7 +174,7 @@ public class Main { - file = new File(bukkitConfiguration.getString("settings.world-container", ".")); - } - // Paper end - fix SPIGOT-5824 -- Services services = Services.create(new com.destroystokyo.paper.profile.PaperAuthenticationService(Proxy.NO_PROXY), file, userCacheFile, optionSet); // Paper - pass OptionSet to load paper config files; override authentication service; fix world-container -+ Services services = Services.create(new org.leavesmc.leaves.profile.LeavesAuthenticationService(Proxy.NO_PROXY), file, userCacheFile, optionSet); // Paper - pass OptionSet to load paper config files; override authentication service; fix world-container // Leaves - extra-yggdrasil-service - // CraftBukkit start - String string = Optional.ofNullable((String) optionSet.valueOf("world")).orElse(dedicatedServerSettings.getProperties().levelName); - LevelStorageSource levelStorageSource = LevelStorageSource.createDefault(file.toPath()); -diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index db16841b42ff4b3e2ac8df6c15561367b35d977a..cb7b19fe33acf7ad0f287cdf7f5fe1882d993306 100644 ---- a/net/minecraft/server/MinecraftServer.java -+++ b/net/minecraft/server/MinecraftServer.java -@@ -246,7 +246,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop public - private final NotificationManager notificationManager; - private final ServerActivityMonitor serverActivityMonitor; - private long lastServerStatus; diff --git a/leaves-server/minecraft-patches/features/0038-Bedrock-break-list.patch b/leaves-server/minecraft-patches/features/0036-Bedrock-break-list.patch similarity index 74% rename from leaves-server/minecraft-patches/features/0038-Bedrock-break-list.patch rename to leaves-server/minecraft-patches/features/0036-Bedrock-break-list.patch index ac6b3aec7..a19bae675 100644 --- a/leaves-server/minecraft-patches/features/0038-Bedrock-break-list.patch +++ b/leaves-server/minecraft-patches/features/0036-Bedrock-break-list.patch @@ -5,24 +5,25 @@ Subject: [PATCH] Bedrock break list diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 9ff3d51bf0af60d6ea9ca658cc1f0c988cf91a6c..5a46df87c6af968c583bbfc2bdf365ad7779d90d 100644 +index 44115cd289cc35a29700251499bd176210d4eace..426420ad00f70d9c0a8792064ee1e73e887a624b 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1856,6 +1856,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop -Date: Thu, 16 Feb 2023 17:25:01 +0800 -Subject: [PATCH] Configurable vanilla random - - -diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 47851ec2ee99aa7f42fa1baee0fab36dee3f6e7b..044d8a7175abe573ff08b4c6a0be3a0c19efd5a6 100644 ---- a/net/minecraft/world/entity/Entity.java -+++ b/net/minecraft/world/entity/Entity.java -@@ -283,7 +283,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name - public double yOld; - public double zOld; - public boolean noPhysics; -- public final RandomSource random = SHARED_RANDOM; // Paper - Share random for entities to make them more random -+ public final RandomSource random = org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom ? RandomSource.create() : SHARED_RANDOM; // Paper - Share random for entities to make them more random // Leaves - but mojang use it, optimize? no! - public int tickCount; - private int remainingFireTicks; - public boolean wasTouchingWater; -diff --git a/net/minecraft/world/entity/animal/bee/Bee.java b/net/minecraft/world/entity/animal/bee/Bee.java -index 0cbcf23b6edba2305dfbbc95abb06a90a6edd42b..46d72345de78053d0da689c7ae83d8cb1c2cdd4f 100644 ---- a/net/minecraft/world/entity/animal/bee/Bee.java -+++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -801,7 +801,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - @VisibleForDebug - public class BeeGoToHiveGoal extends Bee.BaseBeeGoal { - public static final int MAX_TRAVELLING_TICKS = 2400; -- int travellingTicks; -+ int travellingTicks; // TODO: int travellingTicks = org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom ? Bee.this.level().random.nextInt(10) : Bee.this.random.nextInt(10); // CraftBukkit - SPIGOT-7495: Give Bees another chance and let them use their own random, avoid concurrency issues // Leaves - why no vanilla - private static final int MAX_BLACKLISTED_TARGETS = 3; - final List blacklistedTargets = Lists.newArrayList(); - private @Nullable Path lastPath; -@@ -916,7 +916,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - - public class BeeGoToKnownFlowerGoal extends Bee.BaseBeeGoal { - private static final int MAX_TRAVELLING_TICKS = 2400; -- int travellingTicks; -+ int travellingTicks; // TODO: int travellingTicks = org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom ? Bee.this.level().random.nextInt(10) : Bee.this.random.nextInt(10); // CraftBukkit - SPIGOT-7495: Give Bees another chance and let them use their own random, avoid concurrency issues // Leaves - why no vanilla - - BeeGoToKnownFlowerGoal() { - this.setFlags(EnumSet.of(Goal.Flag.MOVE)); -diff --git a/net/minecraft/world/entity/animal/squid/Squid.java b/net/minecraft/world/entity/animal/squid/Squid.java -index 0e13879ce2802ff8ef0ee9b745a23396727c3e30..cd16be399d70ef5782806798a695a56beed29f2c 100644 ---- a/net/minecraft/world/entity/animal/squid/Squid.java -+++ b/net/minecraft/world/entity/animal/squid/Squid.java -@@ -48,7 +48,7 @@ public class Squid extends AgeableWaterCreature { - - public Squid(EntityType type, Level level) { - super(type, level); -- // this.random.setSeed(this.getId()); // Paper - Share random for entities to make them more random -+ if (org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom) this.random.setSeed(this.getId()); // Paper - Share random for entities to make them more random // Leaves - vanilla plz - this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; - } - -diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index 6d522eac417e6d0e21626f412ba5e90d241f0406..41050491bde33981448b3da0290f8edfaee82c30 100644 ---- a/net/minecraft/world/entity/item/ItemEntity.java -+++ b/net/minecraft/world/entity/item/ItemEntity.java -@@ -64,7 +64,13 @@ public class ItemEntity extends Entity implements TraceableEntity { - // Paper start - Don't use level random in entity constructors (to make them thread-safe) - this(EntityType.ITEM, level); - this.setPos(posX, posY, posZ); -- this.setDeltaMovement(this.random.nextDouble() * 0.2 - 0.1, 0.2, this.random.nextDouble() * 0.2 - 0.1); -+ // Leaves start - vanilla yes, safe no -+ if (org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom) { -+ this.setDeltaMovement(level.random.nextDouble() * 0.2 - 0.1, 0.2, level.random.nextDouble() * 0.2 - 0.1); -+ } else { -+ this.setDeltaMovement(this.random.nextDouble() * 0.2 - 0.1, 0.2, this.random.nextDouble() * 0.2 - 0.1); -+ } -+ // Leaves end - vanilla yes, safe no - this.setItem(stack); - // Paper end - Don't use level random in entity constructors - } -diff --git a/net/minecraft/world/entity/item/PrimedTnt.java b/net/minecraft/world/entity/item/PrimedTnt.java -index 9ceec84368cc24bc43b90a82150c9abf7db758e1..97d106e19095a501bf9e9176bfb6acc77f0a63d9 100644 ---- a/net/minecraft/world/entity/item/PrimedTnt.java -+++ b/net/minecraft/world/entity/item/PrimedTnt.java -@@ -67,7 +67,7 @@ public class PrimedTnt extends Entity implements TraceableEntity { - public PrimedTnt(Level level, double x, double y, double z, @Nullable LivingEntity owner) { - this(EntityType.TNT, level); - this.setPos(x, y, z); -- double d = this.random.nextDouble() * (float) (Math.PI * 2); // Paper - Don't use level random in entity constructors -+ double d = (org.leavesmc.leaves.LeavesConfig.modify.useVanillaRandom ? level.random.nextDouble() : this.random.nextDouble()) * (float) (Math.PI * 2); // Paper - Don't use level random in entity constructors // Leaves - why? - this.setDeltaMovement(-Math.sin(d) * 0.02, 0.2F, -Math.cos(d) * 0.02); - this.setFuse(80); - this.xo = x; diff --git a/leaves-server/minecraft-patches/features/0039-Fix-trapdoor-feature.patch b/leaves-server/minecraft-patches/features/0037-Fix-trapdoor-feature.patch similarity index 63% rename from leaves-server/minecraft-patches/features/0039-Fix-trapdoor-feature.patch rename to leaves-server/minecraft-patches/features/0037-Fix-trapdoor-feature.patch index 99e4bccf7..b18c92108 100644 --- a/leaves-server/minecraft-patches/features/0039-Fix-trapdoor-feature.patch +++ b/leaves-server/minecraft-patches/features/0037-Fix-trapdoor-feature.patch @@ -5,19 +5,18 @@ Subject: [PATCH] Fix trapdoor feature diff --git a/net/minecraft/world/level/block/TrapDoorBlock.java b/net/minecraft/world/level/block/TrapDoorBlock.java -index b45ae50db32c4156b8f8008335673d20c570c72d..1a298a81583e7fa80cac578ffcce65d15ea6be97 100644 +index 91e1bdc83d8e582ecf76a6e04c60dd67528eb41b..35cf9480d33202b6cf47f0d9d61b58ee67bb8601 100644 --- a/net/minecraft/world/level/block/TrapDoorBlock.java +++ b/net/minecraft/world/level/block/TrapDoorBlock.java -@@ -139,6 +139,8 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW - hasNeighborSignal = eventRedstone.getNewCurrent() > 0; +@@ -138,6 +138,7 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW + return; } - // CraftBukkit end -+ + // Paper end - Call BlockRedstoneEvent + /* Leaves - it is feature, not bug! // Paper start - break redstone on trapdoors early - boolean open = state.getValue(TrapDoorBlock.OPEN) != hasNeighborSignal; + boolean open = state.getValue(TrapDoorBlock.OPEN) != signal; // note: this must run before any state for this block/its neighbours are written to the world -@@ -157,8 +159,9 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW +@@ -156,8 +157,9 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW } } } @@ -25,7 +24,7 @@ index b45ae50db32c4156b8f8008335673d20c570c72d..1a298a81583e7fa80cac578ffcce65d1 - // Paper end - break redstone on trapdoors early + */ + -+ if (state.getValue(TrapDoorBlock.OPEN) != hasNeighborSignal) { - state = state.setValue(OPEN, hasNeighborSignal); - this.playSound(null, level, pos, hasNeighborSignal); ++ if (state.getValue(TrapDoorBlock.OPEN) != signal) { + state = state.setValue(OPEN, signal); + this.playSound(null, level, pos, signal); } diff --git a/leaves-server/minecraft-patches/features/0038-Disable-distance-check-for-UseItemOnPacket.patch b/leaves-server/minecraft-patches/features/0038-Disable-distance-check-for-UseItemOnPacket.patch new file mode 100644 index 000000000..8ed198819 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0038-Disable-distance-check-for-UseItemOnPacket.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Tue, 23 May 2023 17:10:00 +0800 +Subject: [PATCH] Disable distance check for UseItemOnPacket + + +diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index f2ef9b2b0585819c8a59f45f5a12465ce436bb54..6823436658aa93e3d3336f685e3f3357564467b1 100644 +--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -2136,7 +2136,7 @@ public class ServerGamePacketListenerImpl + if (this.player.isWithinBlockInteractionRange(pos, 1.0)) { + Vec3 distance = location.subtract(Vec3.atCenterOf(pos)); + double limit = 1.0000001; +- if (Math.abs(distance.x()) < 1.0000001 && Math.abs(distance.y()) < 1.0000001 && Math.abs(distance.z()) < 1.0000001) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.disableDistanceCheckForUseItem ||Math.abs(distance.x()) < 1.0000001 && Math.abs(distance.y()) < 1.0000001 && Math.abs(distance.z()) < 1.0000001) { // Leaves - disableDistanceCheckForUseItem + Direction direction = blockHit.getDirection(); + this.player.resetLastActionTime(); + int maxY = level.getMaxY(); diff --git a/leaves-server/minecraft-patches/features/0041-No-feather-falling-trample.patch b/leaves-server/minecraft-patches/features/0039-No-feather-falling-trample.patch similarity index 65% rename from leaves-server/minecraft-patches/features/0041-No-feather-falling-trample.patch rename to leaves-server/minecraft-patches/features/0039-No-feather-falling-trample.patch index 8764d2276..f3cbc0238 100644 --- a/leaves-server/minecraft-patches/features/0041-No-feather-falling-trample.patch +++ b/leaves-server/minecraft-patches/features/0039-No-feather-falling-trample.patch @@ -4,11 +4,11 @@ Date: Thu, 25 May 2023 16:37:06 +0800 Subject: [PATCH] No feather falling trample -diff --git a/net/minecraft/world/level/block/FarmBlock.java b/net/minecraft/world/level/block/FarmBlock.java -index da822a89e134e98696308315799d872944e7712f..9d613f5ff53609f05025ae46f7f3758c0d556626 100644 ---- a/net/minecraft/world/level/block/FarmBlock.java -+++ b/net/minecraft/world/level/block/FarmBlock.java -@@ -116,6 +116,13 @@ public class FarmBlock extends Block { +diff --git a/net/minecraft/world/level/block/FarmlandBlock.java b/net/minecraft/world/level/block/FarmlandBlock.java +index 902735a0ae76c0a8b3397c00bb8e4480b4120c6e..7366e2e968e00a93dbe38bb5bf9b8e2545799066 100644 +--- a/net/minecraft/world/level/block/FarmlandBlock.java ++++ b/net/minecraft/world/level/block/FarmlandBlock.java +@@ -115,6 +115,13 @@ public class FarmlandBlock extends Block { && entity instanceof LivingEntity && (entity instanceof Player || serverLevel.getGameRules().get(GameRules.MOB_GRIEFING)) && entity.getBbWidth() * entity.getBbWidth() * entity.getBbHeight() > 0.512F) { @@ -19,6 +19,6 @@ index da822a89e134e98696308315799d872944e7712f..9d613f5ff53609f05025ae46f7f3758c + } + } + // Leaves end - noFeatherFallingTrample - // CraftBukkit start - Interact soil - org.bukkit.event.Cancellable cancellable; - if (entity instanceof Player) { + // CraftBukkit start - Interact soil + org.bukkit.event.Cancellable cancellable; + if (entity instanceof Player) { diff --git a/leaves-server/minecraft-patches/features/0040-Disable-distance-check-for-UseItemOnPacket.patch b/leaves-server/minecraft-patches/features/0040-Disable-distance-check-for-UseItemOnPacket.patch deleted file mode 100644 index 3e6553c4f..000000000 --- a/leaves-server/minecraft-patches/features/0040-Disable-distance-check-for-UseItemOnPacket.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Tue, 23 May 2023 17:10:00 +0800 -Subject: [PATCH] Disable distance check for UseItemOnPacket - - -diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 41642a09940b7805dcd456b52f26922692eee4c4..d0613418faa02508a728d98fd0b85e9640c493fc 100644 ---- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2085,7 +2085,7 @@ public class ServerGamePacketListenerImpl - if (this.player.isWithinBlockInteractionRange(blockPos, 1.0)) { - Vec3 vec3 = location.subtract(Vec3.atCenterOf(blockPos)); - double d = 1.0000001; -- if (Math.abs(vec3.x()) < 1.0000001 && Math.abs(vec3.y()) < 1.0000001 && Math.abs(vec3.z()) < 1.0000001) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.disableDistanceCheckForUseItem ||Math.abs(vec3.x()) < 1.0000001 && Math.abs(vec3.y()) < 1.0000001 && Math.abs(vec3.z()) < 1.0000001) { // Leaves - disableDistanceCheckForUseItem - Direction direction = hitResult.getDirection(); - this.player.resetLastActionTime(); - int maxY = this.player.level().getMaxY(); diff --git a/leaves-server/minecraft-patches/features/0042-Disable-packet-limit.patch b/leaves-server/minecraft-patches/features/0040-Disable-packet-limit.patch similarity index 73% rename from leaves-server/minecraft-patches/features/0042-Disable-packet-limit.patch rename to leaves-server/minecraft-patches/features/0040-Disable-packet-limit.patch index cfb51e250..0d9973a76 100644 --- a/leaves-server/minecraft-patches/features/0042-Disable-packet-limit.patch +++ b/leaves-server/minecraft-patches/features/0040-Disable-packet-limit.patch @@ -5,26 +5,26 @@ Subject: [PATCH] Disable packet limit diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java -index ab6255937577008689c25ba1474ecc2c961079da..e83f69bcd8057a42123e21da60d6301c2a41e0b3 100644 +index 5d3403d53a87435a0d13694533c7f68d56175451..074786da4475bef0ba26c5cebd8ca2afc67b29af 100644 --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java @@ -221,8 +221,8 @@ public class Connection extends SimpleChannelInboundHandler> { - if (this.stopReadingPackets) { - return; - } -- if (this.allPacketCounts != null || -- io.papermc.paper.configuration.GlobalConfiguration.get().packetLimiter.overrides.containsKey(packet.getClass())) { + if (this.stopReadingPackets) { + return; + } +- if (this.allPacketCounts != null || +- io.papermc.paper.configuration.GlobalConfiguration.get().packetLimiter.overrides.containsKey(packet.getClass())) { + if (!org.leavesmc.leaves.LeavesConfig.modify.disablePacketLimit && (this.allPacketCounts != null || // Leaves - can disable + io.papermc.paper.configuration.GlobalConfiguration.get().packetLimiter.overrides.containsKey(packet.getClass()))) { // Leaves - can disable - long time = System.nanoTime(); - synchronized (PACKET_LIMIT_LOCK) { - if (this.allPacketCounts != null) { + long time = System.nanoTime(); + synchronized (PACKET_LIMIT_LOCK) { + if (this.allPacketCounts != null) { diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index d0613418faa02508a728d98fd0b85e9640c493fc..b734e22651d338f5234c901d7c2f07643068f51c 100644 +index 6823436658aa93e3d3336f685e3f3357564467b1..047d3533c23c68b38d63889e9a88780451f66672 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -832,7 +832,7 @@ public class ServerGamePacketListenerImpl - public void handleCustomCommandSuggestions(ServerboundCommandSuggestionPacket packet) { +@@ -841,7 +841,7 @@ public class ServerGamePacketListenerImpl + public void handleCustomCommandSuggestions(final ServerboundCommandSuggestionPacket packet) { // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); // Paper - AsyncTabCompleteEvent; run this async // CraftBukkit start - if (!this.tabSpamThrottler.isIncrementAndUnderThreshold() && !this.server.getPlayerList().isOp(this.player.nameAndId()) && !this.server.isSingleplayerOwner(this.player.nameAndId())) { // Paper - configurable tab spam limits @@ -32,25 +32,25 @@ index d0613418faa02508a728d98fd0b85e9640c493fc..b734e22651d338f5234c901d7c2f0764 this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - Kick event cause // Paper - add proper async disconnect return; } -@@ -2043,6 +2043,7 @@ public class ServerGamePacketListenerImpl +@@ -2094,6 +2094,7 @@ public class ServerGamePacketListenerImpl private long lastLimitedPacket = -1; private boolean checkLimit(long timestamp) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.disablePacketLimit) return true; // Leaves - disable packet limit ++ if (org.leavesmc.leaves.LeavesConfig.modify.disablePacketLimit) return true; // Leaves - disable if (!io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.incomingPacketThreshold.enabled()) { return true; } -@@ -2598,6 +2599,7 @@ public class ServerGamePacketListenerImpl +@@ -2649,6 +2650,7 @@ public class ServerGamePacketListenerImpl // Spigot start - spam exclusions private void detectRateSpam(String message) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.disablePacketLimit) return; // Leaves - disable packet limit ++ if (org.leavesmc.leaves.LeavesConfig.modify.disablePacketLimit) return; // Leaves - disable // CraftBukkit start - replaced with thread safe throttle if (org.spigotmc.SpigotConfig.enableSpamExclusions) { for (String exclude : org.spigotmc.SpigotConfig.spamExclusions) { -@@ -3335,7 +3337,7 @@ public class ServerGamePacketListenerImpl +@@ -3398,7 +3400,7 @@ public class ServerGamePacketListenerImpl @Override - public void handlePlaceRecipe(ServerboundPlaceRecipePacket packet) { + public void handlePlaceRecipe(final ServerboundPlaceRecipePacket packet) { // Paper start - auto recipe limit - if (!org.bukkit.Bukkit.isPrimaryThread()) { + if (!org.leavesmc.leaves.LeavesConfig.modify.disablePacketLimit && !org.bukkit.Bukkit.isPrimaryThread()) { // Leaves - can disable diff --git a/leaves-server/minecraft-patches/features/0043-Syncmatica-Protocol.patch b/leaves-server/minecraft-patches/features/0041-Syncmatica-Protocol.patch similarity index 90% rename from leaves-server/minecraft-patches/features/0043-Syncmatica-Protocol.patch rename to leaves-server/minecraft-patches/features/0041-Syncmatica-Protocol.patch index 9fe5614ff..2c6b52ac3 100644 --- a/leaves-server/minecraft-patches/features/0043-Syncmatica-Protocol.patch +++ b/leaves-server/minecraft-patches/features/0041-Syncmatica-Protocol.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Syncmatica Protocol This patch is Powered by Syncmatica(https://github.com/End-Tech/syncmatica) diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 2617ef7f8011368294f90baa71107b5353151564..03e16b029329f6bf63500b585d74c1aec3702398 100644 +index 047d3533c23c68b38d63889e9a88780451f66672..185824a02d0c1f67dbcb69d93e816af383e59566 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -331,9 +331,12 @@ public class ServerGamePacketListenerImpl +@@ -339,9 +339,12 @@ public class ServerGamePacketListenerImpl this.signedMessageDecoder = SignedMessageChain.Decoder.unsigned(player.getUUID(), server::enforceSecureProfile); this.chatMessageChain = new FutureChain(server.chatExecutor); // CraftBukkit - async chat this.tickEndEvent = new io.papermc.paper.event.packet.ClientTickEndEvent(player.getBukkitEntity()); // Paper - add client tick end event diff --git a/leaves-server/minecraft-patches/features/0044-Shared-villager-discounts.patch b/leaves-server/minecraft-patches/features/0042-Shared-villager-discounts.patch similarity index 64% rename from leaves-server/minecraft-patches/features/0044-Shared-villager-discounts.patch rename to leaves-server/minecraft-patches/features/0042-Shared-villager-discounts.patch index b94a4a26e..90fee44e8 100644 --- a/leaves-server/minecraft-patches/features/0044-Shared-villager-discounts.patch +++ b/leaves-server/minecraft-patches/features/0042-Shared-villager-discounts.patch @@ -5,23 +5,23 @@ Subject: [PATCH] Shared villager discounts diff --git a/net/minecraft/world/entity/ai/gossip/GossipContainer.java b/net/minecraft/world/entity/ai/gossip/GossipContainer.java -index 425ca1931fb0a5c33ba7aaf4f639409c9fea836f..c17ba3f76069f23b38de2aabf29b784049059144 100644 +index 9008b12745628fdcc225415e20e740192185bdd8..c56d55bab1b4704a26ced328bf25180e76f5080d 100644 --- a/net/minecraft/world/entity/ai/gossip/GossipContainer.java +++ b/net/minecraft/world/entity/ai/gossip/GossipContainer.java @@ -121,6 +121,16 @@ public class GossipContainer { - public int getReputation(UUID identifier, Predicate gossip) { - GossipContainer.EntityGossips entityGossips = this.gossips.get(identifier); + public int getReputation(final UUID entity, final Predicate types) { + GossipContainer.EntityGossips entry = this.gossips.get(entity); + // Leaves start - sharedVillagerDiscounts -+ if (org.leavesmc.leaves.LeavesConfig.modify.sharedVillagerDiscounts && gossip.test(GossipType.MAJOR_POSITIVE)) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.sharedVillagerDiscounts && types.test(GossipType.MAJOR_POSITIVE)) { + int otherRep = 0; -+ if (entityGossips != null) { -+ otherRep = entityGossips.weightedValue(v -> gossip.test(v) && !v.equals(GossipType.MAJOR_POSITIVE)); ++ if (entry != null) { ++ otherRep = entry.weightedValue(v -> types.test(v) && !v.equals(GossipType.MAJOR_POSITIVE)); + } + int majorPositiveRep = this.gossips.values().stream().mapToInt(a -> a.weightedValue(v -> v.equals(GossipType.MAJOR_POSITIVE))).sum(); + return otherRep + Math.min(majorPositiveRep, GossipType.MAJOR_POSITIVE.max * GossipType.MAJOR_POSITIVE.weight); + } + // Leaves end - sharedVillagerDiscounts - return entityGossips != null ? entityGossips.weightedValue(gossip) : 0; + return entry != null ? entry.weightedValue(types) : 0; } diff --git a/leaves-server/minecraft-patches/features/0043-Redstone-ignore-upwards-update.patch b/leaves-server/minecraft-patches/features/0043-Redstone-ignore-upwards-update.patch new file mode 100644 index 000000000..d7180bfbd --- /dev/null +++ b/leaves-server/minecraft-patches/features/0043-Redstone-ignore-upwards-update.patch @@ -0,0 +1,52 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Wed, 14 Jun 2023 12:07:07 +0800 +Subject: [PATCH] Redstone ignore upwards update + + +diff --git a/net/minecraft/world/level/block/ComparatorBlock.java b/net/minecraft/world/level/block/ComparatorBlock.java +index 856048e51cf7499e20460be4d077a960cd1c0ccc..b228132bf447dcfcc5a2d31de3603a9bb5424299 100644 +--- a/net/minecraft/world/level/block/ComparatorBlock.java ++++ b/net/minecraft/world/level/block/ComparatorBlock.java +@@ -59,6 +59,7 @@ public class ComparatorBlock extends DiodeBlock implements EntityBlock { + final BlockState neighbourState, + final RandomSource random + ) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.redstoneIgnoreUpwardsUpdate && directionToNeighbour == Direction.DOWN) return state; // Leaves - behavior to 1.20.1 + return directionToNeighbour == Direction.DOWN && !this.canSurviveOn(level, neighbourPos, neighbourState) + ? Blocks.AIR.defaultBlockState() + : super.updateShape(state, level, ticks, pos, directionToNeighbour, neighbourPos, neighbourState, random); +diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java +index 0e285f38d282b29f625c5578ee1871a6c2b8585d..fbc11774a51a01b8a99a997746b18c435c7a6069 100644 +--- a/net/minecraft/world/level/block/RedStoneWireBlock.java ++++ b/net/minecraft/world/level/block/RedStoneWireBlock.java +@@ -179,7 +179,7 @@ public class RedStoneWireBlock extends Block { + final RandomSource random + ) { + if (directionToNeighbour == Direction.DOWN) { +- return !this.canSurviveOn(level, neighbourPos, neighbourState) ? Blocks.AIR.defaultBlockState() : state; ++ return org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.redstoneIgnoreUpwardsUpdate ? state : !this.canSurviveOn(level, neighbourPos, neighbourState) ? Blocks.AIR.defaultBlockState() : state; // Leaves - behavior to 1.19 + } + + if (directionToNeighbour == Direction.UP) { +@@ -242,7 +242,7 @@ public class RedStoneWireBlock extends Block { + BlockPos relativePos = pos.relative(direction); + BlockState relativeState = level.getBlockState(relativePos); + if (canConnectUp) { +- boolean isPlaceableAbove = relativeState.getBlock() instanceof TrapDoorBlock || this.canSurviveOn(level, relativePos, relativeState); ++ boolean isPlaceableAbove = (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.redstoneIgnoreUpwardsUpdate && relativeState.getBlock() instanceof TrapDoorBlock) || this.canSurviveOn(level, relativePos, relativeState); // Leaves - behavior to 1.19 + if (isPlaceableAbove && shouldConnectTo(level.getBlockState(relativePos.above()))) { + if (relativeState.isFaceSturdy(level, relativePos, direction.getOpposite())) { + return RedstoneSide.UP; +diff --git a/net/minecraft/world/level/block/RepeaterBlock.java b/net/minecraft/world/level/block/RepeaterBlock.java +index 407d1025dbc7c57114c07e41789f12a36d39952d..3c83dfe46c8893f0094540e8f5b99d1156867598 100644 +--- a/net/minecraft/world/level/block/RepeaterBlock.java ++++ b/net/minecraft/world/level/block/RepeaterBlock.java +@@ -70,6 +70,7 @@ public class RepeaterBlock extends DiodeBlock { + final BlockState neighbourState, + final RandomSource random + ) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.redstoneIgnoreUpwardsUpdate && directionToNeighbour == Direction.DOWN) return state; // Leaves - behavior to 1.20.1 + if (directionToNeighbour == Direction.DOWN && !this.canSurviveOn(level, neighbourPos, neighbourState)) { + return Blocks.AIR.defaultBlockState(); + } else { diff --git a/leaves-server/minecraft-patches/features/0044-Disable-check-out-of-order-command.patch b/leaves-server/minecraft-patches/features/0044-Disable-check-out-of-order-command.patch new file mode 100644 index 000000000..d981dfd0f --- /dev/null +++ b/leaves-server/minecraft-patches/features/0044-Disable-check-out-of-order-command.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Sun, 10 Dec 2023 13:13:14 +0800 +Subject: [PATCH] Disable check out-of-order command + + +diff --git a/net/minecraft/network/chat/SignedMessageChain.java b/net/minecraft/network/chat/SignedMessageChain.java +index 9395c6a58ba37fb00c492065b8045f54de0a2246..0e86909d6c56eceda449656428aa8adfd8c3b370 100644 +--- a/net/minecraft/network/chat/SignedMessageChain.java ++++ b/net/minecraft/network/chat/SignedMessageChain.java +@@ -49,7 +49,7 @@ public class SignedMessageChain { + throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.CHAIN_BROKEN); + } + +- if (body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { ++ if (!org.leavesmc.leaves.LeavesConfig.modify.disableCheckOutOfOrderCommand && body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { // Leaves - disable check to support Velocity + this.setChainBroken(); + throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.OUT_OF_ORDER_CHAT, org.bukkit.event.player.PlayerKickEvent.Cause.OUT_OF_ORDER_CHAT); // Paper - kick event causes + } diff --git a/leaves-server/minecraft-patches/features/0047-Despawn-enderman-with-block.patch b/leaves-server/minecraft-patches/features/0045-Despawn-enderman-with-block.patch similarity index 78% rename from leaves-server/minecraft-patches/features/0047-Despawn-enderman-with-block.patch rename to leaves-server/minecraft-patches/features/0045-Despawn-enderman-with-block.patch index 0f873bc45..55458adce 100644 --- a/leaves-server/minecraft-patches/features/0047-Despawn-enderman-with-block.patch +++ b/leaves-server/minecraft-patches/features/0045-Despawn-enderman-with-block.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Despawn enderman with block diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index 916a15dda74c1a68bdcb4c890ec56e4a60befb9f..0c251d07e206a687a8d7d34a06075747e3a4fc65 100644 +index 33d1e88f19bfcaeba58a433361975c0a934cc495..0cbc93e016cbc184b56fa2762b886e0fe772c1df 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -451,7 +451,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -446,7 +446,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { @@ -16,4 +16,4 @@ index 916a15dda74c1a68bdcb4c890ec56e4a60befb9f..0c251d07e206a687a8d7d34a06075747 + return super.requiresCustomPersistence() || (!org.leavesmc.leaves.LeavesConfig.modify.despawnEndermanWithBlock && this.getCarriedBlock() != null); // Leaves - despawn enderman with block } - static class EndermanFreezeWhenLookedAt extends Goal { + private static class EndermanFreezeWhenLookedAt extends Goal { diff --git a/leaves-server/minecraft-patches/features/0045-Redstone-ignore-upwards-update.patch b/leaves-server/minecraft-patches/features/0045-Redstone-ignore-upwards-update.patch deleted file mode 100644 index ef1a316c2..000000000 --- a/leaves-server/minecraft-patches/features/0045-Redstone-ignore-upwards-update.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Wed, 14 Jun 2023 12:07:07 +0800 -Subject: [PATCH] Redstone ignore upwards update - - -diff --git a/net/minecraft/world/level/block/ComparatorBlock.java b/net/minecraft/world/level/block/ComparatorBlock.java -index 578e7c8dc601f53cf2a068685c6901bfaf47e763..25c435923233ce5073710028d9e87dad374cd7e0 100644 ---- a/net/minecraft/world/level/block/ComparatorBlock.java -+++ b/net/minecraft/world/level/block/ComparatorBlock.java -@@ -58,6 +58,7 @@ public class ComparatorBlock extends DiodeBlock implements EntityBlock { - BlockState neighborState, - RandomSource random - ) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.redstoneIgnoreUpwardsUpdate && direction == Direction.DOWN) return state; // Leaves - behavior to 1.20.1 - return direction == Direction.DOWN && !this.canSurviveOn(level, neighborPos, neighborState) - ? Blocks.AIR.defaultBlockState() - : super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random); -diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java -index 6d98bc37d88459d1e0a171b52bbff5810d775c38..fe5a571e2ef6e505ba2ea8ccebd2f7b34395fd81 100644 ---- a/net/minecraft/world/level/block/RedStoneWireBlock.java -+++ b/net/minecraft/world/level/block/RedStoneWireBlock.java -@@ -178,7 +178,7 @@ public class RedStoneWireBlock extends Block { - RandomSource random - ) { - if (direction == Direction.DOWN) { -- return !this.canSurviveOn(level, neighborPos, neighborState) ? Blocks.AIR.defaultBlockState() : state; -+ return org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.redstoneIgnoreUpwardsUpdate ? state : !this.canSurviveOn(level, neighborPos, neighborState) ? Blocks.AIR.defaultBlockState() : state; // Leaves - behavior to 1.19 - } else if (direction == Direction.UP) { - return this.getConnectionState(level, state, pos); - } else { -@@ -237,7 +237,7 @@ public class RedStoneWireBlock extends Block { - BlockPos blockPos = pos.relative(direction); - BlockState blockState = level.getBlockState(blockPos); - if (nonNormalCubeAbove) { -- boolean flag = blockState.getBlock() instanceof TrapDoorBlock || this.canSurviveOn(level, blockPos, blockState); -+ boolean flag = (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.redstoneIgnoreUpwardsUpdate && blockState.getBlock() instanceof TrapDoorBlock) || this.canSurviveOn(level, blockPos, blockState); // Leaves - behavior to 1.19 - if (flag && shouldConnectTo(level.getBlockState(blockPos.above()))) { - if (blockState.isFaceSturdy(level, blockPos, direction.getOpposite())) { - return RedstoneSide.UP; -diff --git a/net/minecraft/world/level/block/RepeaterBlock.java b/net/minecraft/world/level/block/RepeaterBlock.java -index 87e1a32376adc5a15f035b62bc1f672c507cd230..b519c39ea2078a11adb7cc1fe4252c5678e66882 100644 ---- a/net/minecraft/world/level/block/RepeaterBlock.java -+++ b/net/minecraft/world/level/block/RepeaterBlock.java -@@ -68,6 +68,7 @@ public class RepeaterBlock extends DiodeBlock { - BlockState neighborState, - RandomSource random - ) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.redstoneIgnoreUpwardsUpdate && direction == Direction.DOWN) return state; // Leaves - behavior to 1.20.1 - if (direction == Direction.DOWN && !this.canSurviveOn(level, neighborPos, neighborState)) { - return Blocks.AIR.defaultBlockState(); - } else { diff --git a/leaves-server/minecraft-patches/features/0046-Disable-check-out-of-order-command.patch b/leaves-server/minecraft-patches/features/0046-Disable-check-out-of-order-command.patch deleted file mode 100644 index 1f8dc994c..000000000 --- a/leaves-server/minecraft-patches/features/0046-Disable-check-out-of-order-command.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Sun, 10 Dec 2023 13:13:14 +0800 -Subject: [PATCH] Disable check out-of-order command - - -diff --git a/net/minecraft/network/chat/SignedMessageChain.java b/net/minecraft/network/chat/SignedMessageChain.java -index 67b2f87f8424c5642010b3d9852b55c40d4947e1..a5a6f9dba5e524809da9e70085cb1a4b8dc97ca2 100644 ---- a/net/minecraft/network/chat/SignedMessageChain.java -+++ b/net/minecraft/network/chat/SignedMessageChain.java -@@ -44,7 +44,7 @@ public class SignedMessageChain { - SignedMessageLink signedMessageLink = SignedMessageChain.this.nextLink; - if (signedMessageLink == null) { - throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.CHAIN_BROKEN); -- } else if (body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { -+ } else if (!org.leavesmc.leaves.LeavesConfig.modify.disableCheckOutOfOrderCommand && body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { // Leaves - disable check to support Velocity - this.setChainBroken(); - throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.OUT_OF_ORDER_CHAT, org.bukkit.event.player.PlayerKickEvent.Cause.OUT_OF_ORDER_CHAT); // Paper - kick event causes - } else { diff --git a/leaves-server/minecraft-patches/features/0046-Optimized-dragon-respawn.patch b/leaves-server/minecraft-patches/features/0046-Optimized-dragon-respawn.patch new file mode 100644 index 000000000..1d1c26915 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0046-Optimized-dragon-respawn.patch @@ -0,0 +1,104 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Tue, 27 Jun 2023 13:22:34 +0800 +Subject: [PATCH] Optimized dragon respawn + + +diff --git a/net/minecraft/world/level/block/state/pattern/BlockPattern.java b/net/minecraft/world/level/block/state/pattern/BlockPattern.java +index ed5a5fb38bfe8fb9216c7eab00b833485c4bbade..fc45703525901d700c98b5ad0c6eb10b65e775d8 100644 +--- a/net/minecraft/world/level/block/state/pattern/BlockPattern.java ++++ b/net/minecraft/world/level/block/state/pattern/BlockPattern.java +@@ -57,7 +57,7 @@ public class BlockPattern { + return this.matches(origin, forwards, up, cache); + } + +- private BlockPattern.@Nullable BlockPatternMatch matches( ++ public BlockPattern.@Nullable BlockPatternMatch matches( // Leaves - private -> public + final BlockPos origin, final Direction forwards, final Direction up, final LoadingCache cache + ) { + for (int x = 0; x < this.width; x++) { +diff --git a/net/minecraft/world/level/dimension/end/EnderDragonFight.java b/net/minecraft/world/level/dimension/end/EnderDragonFight.java +index 6cfaf75e92d194fe4ad1d404bc12ddec5ca18b8a..9153b1cc8042eb04f4f3ccd7e71b3dbf4380b62d 100644 +--- a/net/minecraft/world/level/dimension/end/EnderDragonFight.java ++++ b/net/minecraft/world/level/dimension/end/EnderDragonFight.java +@@ -311,7 +311,68 @@ public class EnderDragonFight extends SavedData { + return false; + } + ++ // Leaves start - optimizedDragonRespawn ++ private int cachePortalChunkIteratorX = -8; ++ private int cachePortalChunkIteratorZ = -8; ++ private int cachePortalOriginIteratorY = -1; ++ // Leaves end - optimizedDragonRespawn ++ + public BlockPattern.@Nullable BlockPatternMatch findExitPortal() { ++ if (org.leavesmc.leaves.LeavesConfig.performance.optimizedDragonRespawn) { ++ for (int x = cachePortalChunkIteratorX; x <= 8; ++x) { ++ for (int z = cachePortalChunkIteratorZ; z <= 8; ++z) { ++ LevelChunk chunk = this.level.getChunk(x, z); ++ for (BlockEntity blockEntity : chunk.getBlockEntities().values()) { ++ if (blockEntity instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity) { ++ continue; ++ } ++ if (blockEntity instanceof TheEndPortalBlockEntity) { ++ BlockPattern.BlockPatternMatch match = this.exitPortalPattern.find(this.level, blockEntity.getBlockPos()); ++ if (match != null) { ++ BlockPos posInWorld = match.getBlock(3, 3, 3).getPos(); ++ if (this.exitPortalLocation == null) { ++ this.exitPortalLocation = posInWorld; ++ this.setDirty(); ++ } ++ cachePortalChunkIteratorX = x; ++ cachePortalChunkIteratorZ = z; ++ return match; ++ } ++ } ++ } ++ } ++ } ++ ++ if (this.needsStateScanning || this.exitPortalLocation == null) { ++ BlockPos endPodiumLocation = EndPodiumFeature.getLocation(this.origin); ++ int startY; ++ if (cachePortalOriginIteratorY != -1) { ++ startY = cachePortalOriginIteratorY; ++ } else { ++ startY = this.level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, endPodiumLocation).getY(); ++ } ++ boolean notFirstSearch = false; ++ for (int y = startY; y >= this.level.getMinY(); --y) { ++ BlockPattern.BlockPatternMatch match; ++ if (notFirstSearch) { ++ match = org.leavesmc.leaves.util.BlockPatternHelper.partialSearchAround(this.exitPortalPattern, this.level, new BlockPos(endPodiumLocation.getX(), y, endPodiumLocation.getZ())); ++ } else { ++ match = this.exitPortalPattern.find(this.level, new BlockPos(endPodiumLocation.getX(), y, endPodiumLocation.getZ())); ++ } ++ if (match != null) { ++ if (this.exitPortalLocation == null) { ++ this.exitPortalLocation = match.getBlock(3, 3, 3).getPos(); ++ this.setDirty(); ++ } ++ cachePortalOriginIteratorY = y; ++ return match; ++ } ++ notFirstSearch = true; ++ } ++ } ++ return null; ++ } ++ // Leaves end - optimizedDragonRespawn + ChunkPos chunkOrigin = ChunkPos.containing(this.origin); + + for (int x = -8 + chunkOrigin.x(); x <= 8 + chunkOrigin.x(); x++) { +@@ -608,6 +669,11 @@ public class EnderDragonFight extends SavedData { + } + + public boolean respawnDragon(final List crystals) { // CraftBukkit - return boolean ++ // Leaves start - optimizedDragonRespawn - reset iterator cache ++ cachePortalChunkIteratorX = -8; ++ cachePortalChunkIteratorZ = -8; ++ cachePortalOriginIteratorY = -1; ++ // Leaves end - optimizedDragonRespawn + if (this.dragonKilled && this.respawnStage == null) { + for (BlockPattern.BlockPatternMatch portal = this.findExitPortal(); portal != null; portal = this.findExitPortal()) { + for (int x = 0; x < this.exitPortalPattern.getWidth(); x++) { diff --git a/leaves-server/minecraft-patches/features/0049-Creative-fly-no-clip.patch b/leaves-server/minecraft-patches/features/0047-Creative-fly-no-clip.patch similarity index 64% rename from leaves-server/minecraft-patches/features/0049-Creative-fly-no-clip.patch rename to leaves-server/minecraft-patches/features/0047-Creative-fly-no-clip.patch index 24673fe76..5fcd01660 100644 --- a/leaves-server/minecraft-patches/features/0049-Creative-fly-no-clip.patch +++ b/leaves-server/minecraft-patches/features/0047-Creative-fly-no-clip.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Creative fly no clip diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java -index f2ec0bd8cca3c08d558790537e17a8a2f95f1953..29d904b02a2c7b3d25261ca26c7c0479b00999ef 100644 +index 73a29d7d40e092be8264679c7f30e5aa8b8fb393..49582cb05db4872486cc142efceae6b768a589a3 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java @@ -199,7 +199,7 @@ public class ExperienceOrb extends Entity { @@ -18,10 +18,10 @@ index f2ec0bd8cca3c08d558790537e17a8a2f95f1953..29d904b02a2c7b3d25261ca26c7c0479 } else { this.followingPlayer = null; diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 5bd617cd5ad73c7c06f72f2c77fb0169deab8f41..edf2f188e3547e92413e74862788945441f25b4c 100644 +index b75702a359cef9ecbf92c7c4f0c8eae1e8020d10..4d488da36964ddfebabe478b3a7e61ec940f7984 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -245,8 +245,8 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -242,8 +242,8 @@ public abstract class Player extends Avatar implements ContainerUser { @Override public void tick() { @@ -32,25 +32,25 @@ index 5bd617cd5ad73c7c06f72f2c77fb0169deab8f41..edf2f188e3547e92413e748627889454 this.setOnGround(false); } -@@ -375,7 +375,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -369,7 +369,7 @@ public abstract class Player extends Avatar implements ContainerUser { if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.SWIMMING)) { Pose desiredPose = this.getDesiredPose(); - Pose pose; + Pose actualPose; - if (this.isSpectator() || this.isPassenger() || this.canPlayerFitWithinBlocksAndEntitiesWhen(desiredPose)) { + if (this.isCreativeFlyOrSpectator() || this.isPassenger() || this.canPlayerFitWithinBlocksAndEntitiesWhen(desiredPose)) { // Leaves - creative no clip - pose = desiredPose; + actualPose = desiredPose; } else if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.CROUCHING)) { - pose = Pose.CROUCHING; -@@ -504,7 +504,7 @@ public abstract class Player extends Avatar implements ContainerUser { + actualPose = Pose.CROUCHING; +@@ -498,7 +498,7 @@ public abstract class Player extends Avatar implements ContainerUser { this.updateSwingTime(); this.yHeadRot = this.getYRot(); this.setSpeed((float)this.getAttributeValue(Attributes.MOVEMENT_SPEED)); - if (this.getHealth() > 0.0F && !this.isSpectator()) { + if (this.getHealth() > 0.0F && !this.isCreativeFlyOrSpectator()) { // Leaves - creative no clip - AABB aabb; + AABB pickupArea; if (this.isPassenger() && !this.getVehicle().isRemoved()) { - aabb = this.getBoundingBox().minmax(this.getVehicle().getBoundingBox()).inflate(1.0, 0.0, 1.0); -@@ -1821,9 +1821,29 @@ public abstract class Player extends Avatar implements ContainerUser { + pickupArea = this.getBoundingBox().minmax(this.getVehicle().getBoundingBox()).inflate(1.0, 0.0, 1.0); +@@ -1805,6 +1805,26 @@ public abstract class Player extends Avatar implements ContainerUser { return this.gameMode() == GameType.SPECTATOR; } @@ -59,7 +59,7 @@ index 5bd617cd5ad73c7c06f72f2c77fb0169deab8f41..edf2f188e3547e92413e748627889454 + return isSpectator() || (org.leavesmc.leaves.LeavesConfig.modify.creativeNoClip && isCreative() && getAbilities().flying); + } + -+ public boolean canSpectatingPlace(net.minecraft.world.level.LevelReader world, BlockState state, BlockPos pos, net.minecraft.world.phys.shapes.CollisionContext context) { ++ public boolean canSpectatingPlace(final net.minecraft.world.level.LevelReader world, final BlockState state, final BlockPos pos, final net.minecraft.world.phys.shapes.CollisionContext context) { + if (this.isCreativeFlyOrSpectator()) { + net.minecraft.world.phys.shapes.VoxelShape voxelShape = state.getCollisionShape(world, pos, context); + return voxelShape.isEmpty() || world.isUnobstructed(this, voxelShape.move(pos.getX(), pos.getY(), pos.getZ())); @@ -69,52 +69,48 @@ index 5bd617cd5ad73c7c06f72f2c77fb0169deab8f41..edf2f188e3547e92413e748627889454 + } + + @Override -+ public boolean isCollidable(boolean ignoreClimbing) { ++ public boolean isCollidable(final boolean ignoreClimbing) { + return !isCreativeFlyOrSpectator() && super.isCollidable(ignoreClimbing); + } + // Leaves end - creative no clip + @Override - public boolean canBeHitByProjectile() { -- return !this.isSpectator() && super.canBeHitByProjectile(); -+ return !this.isCreativeFlyOrSpectator() && super.canBeHitByProjectile(); // Leaves - creative no clip - } - - @Override + public boolean isPickable() { + return !this.isSpectator() && super.isPickable(); diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java -index b647172cda155a5e704565c8c4819c20758bd3f3..85416c58bd447a7129f2b021f93690e3fdda62c8 100644 +index 03b11543304c173b8558d548e5a193747234de20..ea701aa6af6da7400c0ca08ad88376f26a620665 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -183,8 +183,9 @@ public class BlockItem extends Item { - protected boolean canPlace(BlockPlaceContext context, BlockState state) { +@@ -174,8 +174,9 @@ public class BlockItem extends Item { Player player = context.getPlayer(); // CraftBukkit start -+ CollisionContext collisionContext = player == null ? CollisionContext.empty() : CollisionContext.placementContext(player); Level world = context.getLevel(); // Paper - Cancel hit for vanished players -- boolean canBuild = (!this.mustSurvive() || state.canSurvive(world, context.getClickedPos())) && world.checkEntityCollision(state, player, CollisionContext.placementContext(player), context.getClickedPos(), true); // Paper - Cancel hit for vanished players -+ boolean canBuild = (!this.mustSurvive() || state.canSurvive(world, context.getClickedPos())) && ((org.leavesmc.leaves.LeavesConfig.modify.creativeNoClip && context.getPlayer() != null) ? context.getPlayer().canSpectatingPlace(world, state, context.getClickedPos(), collisionContext) : world.checkEntityCollision(state, player, collisionContext, context.getClickedPos(), true)); // Paper - Cancel hit for vanished players // Leaves - creative no clip ++ CollisionContext collisionContext = player == null ? CollisionContext.empty() : CollisionContext.placementContext(player); // Leaves - creative no clip + boolean canBuild = (!this.mustSurvive() || stateForPlacement.canSurvive(world, context.getClickedPos())) +- && world.checkEntityCollision(stateForPlacement, player, CollisionContext.placementContext(player), context.getClickedPos(), true); // Paper - Cancel hit for vanished players ++ && ((org.leavesmc.leaves.LeavesConfig.modify.creativeNoClip && context.getPlayer() != null) ? context.getPlayer().canSpectatingPlace(world, stateForPlacement, context.getClickedPos(), collisionContext) : world.checkEntityCollision(stateForPlacement, player, collisionContext, context.getClickedPos(), true)); // Paper - Cancel hit for vanished players // Leaves - creative no clip org.bukkit.entity.Player bukkitPlayer = (context.getPlayer() instanceof ServerPlayer) ? (org.bukkit.entity.Player) context.getPlayer().getBukkitEntity() : null; org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent( diff --git a/net/minecraft/world/item/StandingAndWallBlockItem.java b/net/minecraft/world/item/StandingAndWallBlockItem.java -index be685383b8e7c8111e976fc560f16d43d6545a34..b96d2475c06f395fc5090eca23bdfcd6e51c3a3e 100644 +index 29e94404a230c37afc2b592ef7df60f9ed8543de..0e9a48c5cacbe2dd97af1b4e994eb69509160043 100644 --- a/net/minecraft/world/item/StandingAndWallBlockItem.java +++ b/net/minecraft/world/item/StandingAndWallBlockItem.java @@ -44,7 +44,7 @@ public class StandingAndWallBlockItem extends BlockItem { - // return blockState != null && level.isUnobstructed(blockState, clickedPos, CollisionContext.empty()) ? blockState : null; + // return stateForPlacement != null && level.isUnobstructed(stateForPlacement, pos, CollisionContext.empty()) ? stateForPlacement : null; // CraftBukkit start - if (blockState != null) { -- boolean defaultReturn = level.isUnobstructed(blockState, clickedPos, CollisionContext.empty()); -+ boolean defaultReturn = (org.leavesmc.leaves.LeavesConfig.modify.creativeNoClip && context.getPlayer() != null) ? context.getPlayer().canSpectatingPlace(level, blockState, clickedPos, CollisionContext.empty()) : level.isUnobstructed(blockState, clickedPos, CollisionContext.empty()); // Leaves - creative no clip + if (stateForPlacement != null) { +- boolean defaultReturn = level.isUnobstructed(stateForPlacement, pos, CollisionContext.empty()); ++ boolean defaultReturn = (org.leavesmc.leaves.LeavesConfig.modify.creativeNoClip && context.getPlayer() != null) ? context.getPlayer().canSpectatingPlace(level, stateForPlacement, pos, CollisionContext.empty()) : level.isUnobstructed(stateForPlacement, pos, CollisionContext.empty()); // Leaves - creative no clip org.bukkit.entity.Player player = (context.getPlayer() instanceof net.minecraft.server.level.ServerPlayer serverPlayer) ? serverPlayer.getBukkitEntity() : null; - org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent(org.bukkit.craftbukkit.block.CraftBlock.at(context.getLevel(), clickedPos), player, org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(blockState), defaultReturn, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())); // Paper - Expose hand in BlockCanBuildEvent + org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent(org.bukkit.craftbukkit.block.CraftBlock.at(context.getLevel(), pos), player, stateForPlacement.asBlockData(), defaultReturn, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())); // Paper - Expose hand in BlockCanBuildEvent diff --git a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -index fa11a17186e590cdc7b7902b91db701592a2f6b7..feab1f0d6f89035f6fcc7a568bd287821eb70a5e 100644 +index 702aa9fdd3a9787547c7d64fdb17b40f27cd8d5e..edf07e06509df360a1423aa0b3828d656b6a3c4b 100644 --- a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java @@ -152,7 +152,7 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl - List entities = level.getEntities(null, progressDeltaAabb); + List entities = level.getEntities(null, aabb); if (!entities.isEmpty()) { for (Entity entity : entities) { - if (entity.getPistonPushReaction() != PushReaction.IGNORE) { @@ -123,23 +119,23 @@ index fa11a17186e590cdc7b7902b91db701592a2f6b7..feab1f0d6f89035f6fcc7a568bd28782 MoverType.SHULKER_BOX, new Vec3( diff --git a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -index 7223cd393c4ef9408ab22c2e4d16458c19f29423..9314fdec86c7d01a6c9a155082d72cf62dffefd8 100644 +index 65f332462cdd60fb00f4dd7be4fccd250bfc69d9..95a88a9ee23bb6b51d15e31c1fb6ee567b513d2d 100644 --- a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java +++ b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -@@ -151,7 +151,7 @@ public class PistonMovingBlockEntity extends BlockEntity { - d3 = movementDirection.getStepZ(); +@@ -158,7 +158,7 @@ public class PistonMovingBlockEntity extends BlockEntity { + dz = movement.getStepZ(); } -- entity.setDeltaMovement(d1, d2, d3); -+ if (!(entity instanceof net.minecraft.world.entity.player.Player player) || !player.isCreativeFlyOrSpectator()) entity.setDeltaMovement(d1, d2, d3); // Leaves - creative no clip +- entity.setDeltaMovement(dx, dy, dz); ++ if (!(entity instanceof net.minecraft.world.entity.player.Player player) || !player.isCreativeFlyOrSpectator()) entity.setDeltaMovement(dx, dy, dz); // Leaves - creative no clip // Paper - EAR items stuck in slime pushed by a piston entity.activatedTick = Math.max(entity.activatedTick, net.minecraft.server.MinecraftServer.currentTick + 10); entity.activatedImmunityTick = Math.max(entity.activatedImmunityTick, net.minecraft.server.MinecraftServer.currentTick + 10); -@@ -187,6 +187,7 @@ public class PistonMovingBlockEntity extends BlockEntity { +@@ -194,6 +194,7 @@ public class PistonMovingBlockEntity extends BlockEntity { } - private static void moveEntityByPiston(Direction noClipDirection, Entity entity, double progress, Direction direction) { + private static void moveEntityByPiston(final Direction pistonDirection, final Entity entity, final double delta, final Direction movement) { + if (entity instanceof net.minecraft.world.entity.player.Player player && player.isCreativeFlyOrSpectator()) return; // Leaves - creative no clip - NOCLIP.set(noClipDirection); - Vec3 vec3 = entity.position(); - entity.move(MoverType.PISTON, new Vec3(progress * direction.getStepX(), progress * direction.getStepY(), progress * direction.getStepZ())); + NOCLIP.set(pistonDirection); + Vec3 previousPos = entity.position(); + entity.move(MoverType.PISTON, new Vec3(delta * movement.getStepX(), delta * movement.getStepY(), delta * movement.getStepZ())); diff --git a/leaves-server/minecraft-patches/features/0048-Optimized-dragon-respawn.patch b/leaves-server/minecraft-patches/features/0048-Optimized-dragon-respawn.patch deleted file mode 100644 index bcc191a14..000000000 --- a/leaves-server/minecraft-patches/features/0048-Optimized-dragon-respawn.patch +++ /dev/null @@ -1,103 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Tue, 27 Jun 2023 13:22:34 +0800 -Subject: [PATCH] Optimized dragon respawn - - -diff --git a/net/minecraft/world/level/block/state/pattern/BlockPattern.java b/net/minecraft/world/level/block/state/pattern/BlockPattern.java -index f834d487136627c07c893b8d68a6929ed46f20b9..7278bd208552b860145dc2d68fe84014c3508610 100644 ---- a/net/minecraft/world/level/block/state/pattern/BlockPattern.java -+++ b/net/minecraft/world/level/block/state/pattern/BlockPattern.java -@@ -57,7 +57,7 @@ public class BlockPattern { - return this.matches(pos, finger, thumb, loadingCache); - } - -- private BlockPattern.@Nullable BlockPatternMatch matches(BlockPos pos, Direction finger, Direction thumb, LoadingCache cache) { -+ public BlockPattern.@Nullable BlockPatternMatch matches(BlockPos pos, Direction finger, Direction thumb, LoadingCache cache) { // Leaves - private -> public - for (int i = 0; i < this.width; i++) { - for (int i1 = 0; i1 < this.height; i1++) { - for (int i2 = 0; i2 < this.depth; i2++) { -diff --git a/net/minecraft/world/level/dimension/end/EndDragonFight.java b/net/minecraft/world/level/dimension/end/EndDragonFight.java -index 04b03940a8c7d0d1e04298d7bcbe245a4174f7d8..82d40effe5e8dafec60c25b97f45c1188d0e6d28 100644 ---- a/net/minecraft/world/level/dimension/end/EndDragonFight.java -+++ b/net/minecraft/world/level/dimension/end/EndDragonFight.java -@@ -270,7 +270,67 @@ public class EndDragonFight { - return false; - } - -+ // Leaves start - optimizedDragonRespawn -+ private int cachePortalChunkIteratorX = -8; -+ private int cachePortalChunkIteratorZ = -8; -+ private int cachePortalOriginIteratorY = -1; -+ - public BlockPattern.@Nullable BlockPatternMatch findExitPortal() { -+ if (org.leavesmc.leaves.LeavesConfig.performance.optimizedDragonRespawn) { -+ int i, j; -+ for (i = cachePortalChunkIteratorX; i <= 8; ++i) { -+ for (j = cachePortalChunkIteratorZ; j <= 8; ++j) { -+ LevelChunk worldChunk = this.level.getChunk(i, j); -+ for (BlockEntity blockEntity : worldChunk.getBlockEntities().values()) { -+ if (blockEntity instanceof net.minecraft.world.level.block.entity.TheEndGatewayBlockEntity) { -+ continue; -+ } -+ if (blockEntity instanceof TheEndPortalBlockEntity) { -+ BlockPattern.BlockPatternMatch blockPatternMatch = this.exitPortalPattern.find(this.level, blockEntity.getBlockPos()); -+ if (blockPatternMatch != null) { -+ BlockPos blockPos = blockPatternMatch.getBlock(3, 3, 3).getPos(); -+ if (this.portalLocation == null) { -+ this.portalLocation = blockPos; -+ } -+ //No need to judge whether optimizing option is open -+ cachePortalChunkIteratorX = i; -+ cachePortalChunkIteratorZ = j; -+ return blockPatternMatch; -+ } -+ } -+ } -+ } -+ } -+ -+ if (this.needsStateScanning || this.portalLocation == null) { -+ if (cachePortalOriginIteratorY != -1) { -+ i = cachePortalOriginIteratorY; -+ } else { -+ i = this.level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, EndPodiumFeature.getLocation(BlockPos.ZERO)).getY(); -+ } -+ boolean notFirstSearch = false; -+ for (j = i; j >= 0; --j) { -+ BlockPattern.BlockPatternMatch result2 = null; -+ if (notFirstSearch) { -+ result2 = org.leavesmc.leaves.util.BlockPatternHelper.partialSearchAround(this.exitPortalPattern, this.level, new BlockPos(EndPodiumFeature.getLocation(BlockPos.ZERO).getY(), j, EndPodiumFeature.getLocation(BlockPos.ZERO).getZ())); -+ } else { -+ result2 = this.exitPortalPattern.find(this.level, new BlockPos(EndPodiumFeature.getLocation(BlockPos.ZERO).getX(), j, EndPodiumFeature.getLocation(BlockPos.ZERO).getZ())); -+ } -+ if (result2 != null) { -+ if (this.portalLocation == null) { -+ this.portalLocation = result2.getBlock(3, 3, 3).getPos(); -+ } -+ cachePortalOriginIteratorY = j; -+ return result2; -+ } -+ notFirstSearch = true; -+ } -+ } -+ -+ return null; -+ } -+ // Leaves end - optimizedDragonRespawn -+ - ChunkPos chunkPos = new ChunkPos(this.origin); - - for (int i = -8 + chunkPos.x; i <= 8 + chunkPos.x; i++) { -@@ -567,6 +627,11 @@ public class EndDragonFight { - } - - public boolean respawnDragon(List crystals) { // CraftBukkit - return boolean -+ // Leaves - start optimizedDragonRespawn -+ cachePortalChunkIteratorX = -8; -+ cachePortalChunkIteratorZ = -8; -+ cachePortalOriginIteratorY = -1; -+ // Leaves - end optimizedDragonRespawn - if (this.dragonKilled && this.respawnStage == null) { - for (BlockPattern.BlockPatternMatch blockPatternMatch = this.findExitPortal(); blockPatternMatch != null; blockPatternMatch = this.findExitPortal()) { - for (int i = 0; i < this.exitPortalPattern.getWidth(); i++) { diff --git a/leaves-server/minecraft-patches/features/0048-Shave-snow-layers.patch b/leaves-server/minecraft-patches/features/0048-Shave-snow-layers.patch new file mode 100644 index 000000000..fd72fc27b --- /dev/null +++ b/leaves-server/minecraft-patches/features/0048-Shave-snow-layers.patch @@ -0,0 +1,37 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Tue, 27 Jun 2023 14:07:00 +0800 +Subject: [PATCH] Shave snow layers + + +diff --git a/net/minecraft/world/item/ShovelItem.java b/net/minecraft/world/item/ShovelItem.java +index e1cc616833885022b1e4a1f9d7ba68df16dedecf..a6b4a2f09a1ee7a094d6a4478a150501008edf60 100644 +--- a/net/minecraft/world/item/ShovelItem.java ++++ b/net/minecraft/world/item/ShovelItem.java +@@ -44,6 +44,26 @@ public class ShovelItem extends Item { + } + + Player player = context.getPlayer(); ++ // Leaves start - shaveSnowLayers ++ if (org.leavesmc.leaves.LeavesConfig.modify.shaveSnowLayers && blockState.is(Blocks.SNOW)) { ++ int layers = blockState.getValue(net.minecraft.world.level.block.SnowLayerBlock.LAYERS); ++ ItemStack tool = context.getItemInHand(); ++ boolean hasSilkTouch = net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(level.registryAccess().lookupOrThrow(net.minecraft.core.registries.Registries.ENCHANTMENT).getOrThrow(net.minecraft.world.item.enchantment.Enchantments.SILK_TOUCH), tool) > 0; ++ BlockState shavedBlockState = layers > 1 ? blockState.setValue(net.minecraft.world.level.block.SnowLayerBlock.LAYERS, layers - 1) : Blocks.AIR.defaultBlockState(); ++ ++ level.setBlock(pos, shavedBlockState, Block.UPDATE_ALL_IMMEDIATE); ++ level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(player, shavedBlockState)); ++ ++ Block.popResource(level, pos, new ItemStack(hasSilkTouch ? Items.SNOW : Items.SNOWBALL)); ++ level.playSound(player, pos, SoundEvents.SNOW_BREAK, SoundSource.BLOCKS, 1.0F, 1.0F); ++ ++ if (player != null) { ++ tool.hurtAndBreak(1, player, context.getHand()); ++ } ++ ++ return InteractionResult.SUCCESS; ++ } ++ // Leaves end - shaveSnowLayers + BlockState newState = FLATTENABLES.get(blockState.getBlock()); + BlockState updatedState = null; + Runnable afterAction = null; // Paper diff --git a/leaves-server/minecraft-patches/features/0051-Elytra-aeronautics-no-chunk-load.patch b/leaves-server/minecraft-patches/features/0049-Elytra-aeronautics-no-chunk-load.patch similarity index 69% rename from leaves-server/minecraft-patches/features/0051-Elytra-aeronautics-no-chunk-load.patch rename to leaves-server/minecraft-patches/features/0049-Elytra-aeronautics-no-chunk-load.patch index 7122f66de..3accaf4d8 100644 --- a/leaves-server/minecraft-patches/features/0051-Elytra-aeronautics-no-chunk-load.patch +++ b/leaves-server/minecraft-patches/features/0049-Elytra-aeronautics-no-chunk-load.patch @@ -5,56 +5,57 @@ Subject: [PATCH] Elytra aeronautics no chunk load diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java -index 03aaf6d85f578f1a73dfe41d1d9fb49c7b16aa2f..240fb718b2fe5e06cd7aa9c4fcf97743837fa372 100644 +index 2e44b338893aaf30ba36eace5796971f52012e19..902df7cbb0465868048dbf04904651d49c4a1975 100644 --- a/net/minecraft/server/level/ChunkMap.java +++ b/net/minecraft/server/level/ChunkMap.java -@@ -897,7 +897,8 @@ public class ChunkMap extends SimpleRegionStorage implements ChunkHolder.PlayerP +@@ -891,7 +891,8 @@ public class ChunkMap extends SimpleRegionStorage implements ChunkHolder.PlayerP } - private boolean skipPlayer(ServerPlayer player) { + private boolean skipPlayer(final ServerPlayer player) { - return player.isSpectator() && !this.level.getGameRules().get(GameRules.SPECTATORS_GENERATE_CHUNKS); -+ return (player.isSpectator() && !this.level.getGameRules().get(GameRules.SPECTATORS_GENERATE_CHUNKS) -+ || (org.leavesmc.leaves.LeavesConfig.modify.elytraAeronautics.enableNoChunkLoad && player.elytraAeronauticsNoChunk)); // Leaves - Elytra aeronautics ++ return (player.isSpectator() && !this.level.getGameRules().get(GameRules.SPECTATORS_GENERATE_CHUNKS)) ++ || (org.leavesmc.leaves.LeavesConfig.modify.elytraAeronautics.enableNoChunkLoad && player.elytraAeronauticsNoChunk); // Leaves - Elytra aeronautics } - void updatePlayerStatus(ServerPlayer player, boolean track) { -@@ -931,6 +932,7 @@ public class ChunkMap extends SimpleRegionStorage implements ChunkHolder.PlayerP + void updatePlayerStatus(final ServerPlayer player, final boolean added) { +@@ -925,6 +926,7 @@ public class ChunkMap extends SimpleRegionStorage implements ChunkHolder.PlayerP } - public void move(ServerPlayer player) { + public void move(final ServerPlayer player) { + if (player.elytraAeronauticsNoChunk) return; // Leaves - no chunk // Paper - optimise entity tracker - SectionPos lastSectionPos = player.getLastSectionPos(); + SectionPos oldSection = player.getLastSectionPos(); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index a26ecb47170a8fb3189f9a468ac7db21f7cbb077..b06e7dd6f1ce735d4ea9b4c3f75c004adc296487 100644 +index 7e469816f9be0dcba5d6bab0d0b9ac9881f14a35..a91d6173b9424ebe669bfdb1c8b08ac15ada953e 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -883,6 +883,9 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - } +@@ -918,6 +918,10 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet ); - profilerFiller.popPush("blockEntities"); + if (this.paperConfig().unsupportedSettings.ticking.blockEntities) { // Paper - option to disable ticking + profiler.popPush("blockEntities"); + if (org.leavesmc.leaves.LeavesConfig.modify.elytraAeronautics.enableNoChunkLoad) { + org.leavesmc.leaves.util.ElytraAeronauticsHelper.tick(this); + } ++ // Leaves end - elytra aeronautics this.tickBlockEntities(); - profilerFiller.pop(); - } + profiler.pop(); + } // Paper - option to disable ticking diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 3e7c6eceddf36dd38dcd9713dfefe0ada85815f8..051e3bac4f406df379ec1fc335f351b1089bda8b 100644 +index 185824a02d0c1f67dbcb69d93e816af383e59566..fbdc03dc4a27ec23054705a4095485e0ce5c41c3 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -602,7 +602,7 @@ public class ServerGamePacketListenerImpl +@@ -609,7 +609,7 @@ public class ServerGamePacketListenerImpl speed *= 2f; // TODO: Get the speed of the vehicle instead of the player // Paper start - Prevent moving into unloaded chunks - if (this.player.level().paperConfig().chunks.preventMovingIntoUnloadedChunks && ( + if (this.player.level().paperConfig().chunks.preventMovingIntoUnloadedChunks && !player.elytraAeronauticsNoChunk && ( // Leaves - no chunk load - !serverLevel.areChunksLoadedForMove(this.player.getBoundingBox().expandTowards(new Vec3(toX, toY, toZ).subtract(this.player.position()))) || - !serverLevel.areChunksLoadedForMove(rootVehicle.getBoundingBox().expandTowards(new Vec3(toX, toY, toZ).subtract(rootVehicle.position()))) + !level.areChunksLoadedForMove(this.player.getBoundingBox().expandTowards(new Vec3(targetX, targetY, targetZ).subtract(this.player.position()))) || + !level.areChunksLoadedForMove(vehicle.getBoundingBox().expandTowards(new Vec3(targetX, targetY, targetZ).subtract(vehicle.position()))) )) { -@@ -1622,6 +1622,7 @@ public class ServerGamePacketListenerImpl - allowMovement = !this.hasNewCollision(serverLevel, this.player, boundingBox, newBox); +@@ -1661,6 +1661,7 @@ public class ServerGamePacketListenerImpl + allowMovement = !this.hasNewCollision(level, this.player, oldAABB, newBox); } // else: no collision at all detected, why do we care? } + allowMovement = allowMovement || player.elytraAeronauticsNoChunk; // Leaves - Elytra aeronautics @@ -62,37 +63,37 @@ index 3e7c6eceddf36dd38dcd9713dfefe0ada85815f8..051e3bac4f406df379ec1fc335f351b1 if (!allowMovement) { io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.CLIPPED_INTO_BLOCK, diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 0e5210ee87e31c9d23488d80eb832d9a1bcf91b9..38bb637d2392268037be4facffc669546a1847b8 100644 +index 1fcd740140202444ba11404fb0a1d20303fc33bf..8e62879ca0e2bf4913295bbad127f8cf314654cd 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -1142,7 +1142,13 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -1160,7 +1160,13 @@ public abstract class Entity return; } } - + // Leaves start - elytra aeronautics + if (org.leavesmc.leaves.LeavesConfig.modify.elytraAeronautics.enableNoChunkLoad && this instanceof Player player) { -+ if (type == MoverType.PLAYER && player.isFallFlying()) { -+ org.leavesmc.leaves.util.ElytraAeronauticsHelper.flightBehaviour(player, movement); ++ if (moverType == MoverType.PLAYER && player.isFallFlying()) { ++ org.leavesmc.leaves.util.ElytraAeronauticsHelper.flightBehaviour(player, delta); + } + } + // Leaves end - elytra aeronautics - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("move"); + ProfilerFiller profiler = Profiler.get(); + profiler.push("move"); if (this.stuckSpeedMultiplier.lengthSqr() > 1.0E-7) { -@@ -2211,6 +2217,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -2232,6 +2238,7 @@ public abstract class Entity this.yo = y; - this.zo = d1; - this.setPos(d, y, d1); + this.zo = cz; + this.setPos(cx, y, cz); + if (this instanceof Player player && player.elytraAeronauticsNoChunk) return; // Leaves - elytra aeronautics if (this.valid) this.level.getChunk((int) Math.floor(this.getX()) >> 4, (int) Math.floor(this.getZ()) >> 4); // CraftBukkit } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 8adf7835f71688ba319f053208d02b810097b06e..c2442d69ce547719467dd94fcf6fd209a3612ac2 100644 +index 2403a117ec13922a5bdf1b736d37a77e21959c8d..7b2f91825fd34bd7ad7f98bcf08696a80deab370 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3443,6 +3443,11 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3477,6 +3477,11 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.fallFlyTicks++; } else { this.fallFlyTicks = 0; @@ -105,11 +106,11 @@ index 8adf7835f71688ba319f053208d02b810097b06e..c2442d69ce547719467dd94fcf6fd209 if (this.isSleeping()) { diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index e3d09f67195f467a685c740407bd2487cfbeeb52..6bd3cd6b1a4807b0f2acee9087bcbbf9dd0bde05 100644 +index 4d488da36964ddfebabe478b3a7e61ec940f7984..7005678a7ea06a118878033558c61fef7bf58434 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -179,6 +179,7 @@ public abstract class Player extends Avatar implements ContainerUser { - private int currentImpulseContextResetGraceTime = 0; +@@ -173,6 +173,7 @@ public abstract class Player extends Avatar implements ContainerUser { + public float hurtDir; public boolean affectsSpawning = true; // Paper - Affects Spawning API public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage + public boolean elytraAeronauticsNoChunk = false; // Leaves - Elytra aeronautics @@ -117,7 +118,7 @@ index e3d09f67195f467a685c740407bd2487cfbeeb52..6bd3cd6b1a4807b0f2acee9087bcbbf9 // CraftBukkit start public boolean fauxSleeping; diff --git a/net/minecraft/world/entity/projectile/FireworkRocketEntity.java b/net/minecraft/world/entity/projectile/FireworkRocketEntity.java -index 1b633d2eb77704fd9a6358f09ed368fab2a5b212..6a5bc21eda925f0c2c41e3a63d9060b526ece472 100644 +index c9f7e68abccbc6b894a66b675952c973e22af8e6..f37836d81a0bfffb0d6ff83d3686739691fd7fb0 100644 --- a/net/minecraft/world/entity/projectile/FireworkRocketEntity.java +++ b/net/minecraft/world/entity/projectile/FireworkRocketEntity.java @@ -324,7 +324,7 @@ public class FireworkRocketEntity extends Projectile implements ItemSupplier { @@ -126,26 +127,26 @@ index 1b633d2eb77704fd9a6358f09ed368fab2a5b212..6a5bc21eda925f0c2c41e3a63d9060b5 - private List getExplosions() { + public List getExplosions() { // Leaves private -> public - ItemStack itemStack = this.entityData.get(DATA_ID_FIREWORKS_ITEM); - Fireworks fireworks = itemStack.get(DataComponents.FIREWORKS); + ItemStack sourceItemStack = this.entityData.get(DATA_ID_FIREWORKS_ITEM); + Fireworks fireworks = sourceItemStack.get(DataComponents.FIREWORKS); return fireworks != null ? fireworks.explosions() : List.of(); diff --git a/net/minecraft/world/item/FireworkRocketItem.java b/net/minecraft/world/item/FireworkRocketItem.java -index 2c597e20c1ff587f2eadef600bedb9e01b999bbf..7ccf76e938280216def8df55fe397a433b521d29 100644 +index b3443ff2d06af328493046e723efc11d299a2824..897f3e8750fec11ea665681d86e1126b84cca252 100644 --- a/net/minecraft/world/item/FireworkRocketItem.java +++ b/net/minecraft/world/item/FireworkRocketItem.java @@ -65,6 +65,24 @@ public class FireworkRocketItem extends Item implements ProjectileItem { if (player.isFallFlying()) { - ItemStack itemInHand = player.getItemInHand(hand); + ItemStack itemStack = player.getItemInHand(hand); if (level instanceof ServerLevel serverLevel) { + // Leaves start - Elytra aeronautics + if (player instanceof net.minecraft.server.level.ServerPlayer sp && sp.elytraAeronauticsNoChunk) { -+ final FireworkRocketEntity firework = new FireworkRocketEntity(level, itemInHand, player); ++ final FireworkRocketEntity firework = new FireworkRocketEntity(level, itemStack, player); + firework.spawningEntity = player.getUUID(); -+ com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Firework) firework.getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); ++ com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Firework) firework.getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); + if (event.callEvent() && org.leavesmc.leaves.util.ElytraAeronauticsHelper.proxySpawnAndTick(firework)) { + player.awardStat(Stats.ITEM_USED.get(this)); + if (event.shouldConsume() && !player.hasInfiniteMaterials()) { -+ itemInHand.shrink(1); ++ itemStack.shrink(1); + } else { + player.containerMenu.sendAllDataToRemote(); + } @@ -156,5 +157,5 @@ index 2c597e20c1ff587f2eadef600bedb9e01b999bbf..7ccf76e938280216def8df55fe397a43 + } + // Leaves end - Elytra aeronautics // Paper start - PlayerElytraBoostEvent - final Projectile.Delayed delayed = Projectile.spawnProjectileDelayed(new FireworkRocketEntity(level, itemInHand, player), serverLevel, itemInHand, f -> f.spawningEntity = player.getUUID()); // Paper - firework api - assign spawning entity uuid - com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Firework) delayed.projectile().getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); + final Projectile.Delayed delayed = Projectile.spawnProjectileDelayed(new FireworkRocketEntity(level, itemStack, player), serverLevel, itemStack, f -> f.spawningEntity = player.getUUID()); // Paper - firework api - assign spawning entity uuid + com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Firework) delayed.projectile().getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); diff --git a/leaves-server/minecraft-patches/features/0050-Cache-ignite-odds.patch b/leaves-server/minecraft-patches/features/0050-Cache-ignite-odds.patch new file mode 100644 index 000000000..8f304620c --- /dev/null +++ b/leaves-server/minecraft-patches/features/0050-Cache-ignite-odds.patch @@ -0,0 +1,67 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Wed, 5 Jul 2023 17:42:24 +0800 +Subject: [PATCH] Cache ignite odds + + +diff --git a/net/minecraft/world/level/block/FireBlock.java b/net/minecraft/world/level/block/FireBlock.java +index 5602bdde7fc5dc10ec9281dcc52a817a3944c252..6fcbf2c3ae6dd1cfe88b1f2c5cb62f0669d7184f 100644 +--- a/net/minecraft/world/level/block/FireBlock.java ++++ b/net/minecraft/world/level/block/FireBlock.java +@@ -202,6 +202,7 @@ public class FireBlock extends BaseFireBlock { + this.checkBurnOut(level, pos.south(), 300 + extra, random, age, pos); + // CraftBukkit end - add source blockPos to burn calls + BlockPos.MutableBlockPos testPos = new BlockPos.MutableBlockPos(); ++ Object2IntOpenHashMap blockPositionIgniteCache = new Object2IntOpenHashMap<>(); // Leaves - cache ignite odds + + for (int xx = -1; xx <= 1; xx++) { + for (int zz = -1; zz <= 1; zz++) { +@@ -213,7 +214,7 @@ public class FireBlock extends BaseFireBlock { + } + + testPos.setWithOffset(pos, xx, yy, zz); +- int igniteOdds = this.getIgniteOdds(level, testPos); ++ int igniteOdds = this.getIgniteOdds(level, testPos, org.leavesmc.leaves.LeavesConfig.performance.cacheIgniteOdds ? blockPositionIgniteCache : null); // Leaves - cache ignite odds + if (igniteOdds > 0) { + int odds = (igniteOdds + 40 + level.getDifficulty().getId() * 7) / (age + 30); + if (increasedBurnout) { +@@ -316,19 +317,32 @@ public class FireBlock extends BaseFireBlock { + } + + private int getIgniteOdds(final LevelReader level, final BlockPos pos) { ++ return this.getIgniteOdds(level, pos, null); ++ } ++ ++ // Leaves start - cache ignite odds ++ private int getIgniteOdds(final LevelReader level, final BlockPos pos, @org.jetbrains.annotations.Nullable final Object2IntOpenHashMap cache) { + if (!level.isEmptyBlock(pos)) { + return 0; +- } ++ } else { ++ int odds = 0; + +- int odds = 0; ++ for (Direction direction : Direction.values()) { ++ if (cache != null) { ++ odds = Math.max(cache.computeIfAbsent(pos, key -> { ++ BlockState blockState = level.getBlockState(pos.relative(direction)); ++ return this.getIgniteOdds(blockState); ++ }), odds); ++ } else { ++ BlockState blockState = level.getBlockState(pos.relative(direction)); ++ odds = Math.max(this.getIgniteOdds(blockState), odds); ++ } ++ } + +- for (Direction direction : Direction.values()) { +- BlockState blockState = level.getBlockState(pos.relative(direction)); +- odds = Math.max(this.getIgniteOdds(blockState), odds); ++ return odds; + } +- +- return odds; + } ++ // Leaves end - cache ignite odds + + @Override + protected boolean canBurn(final BlockState state) { diff --git a/leaves-server/minecraft-patches/features/0050-Shave-snow-layers.patch b/leaves-server/minecraft-patches/features/0050-Shave-snow-layers.patch deleted file mode 100644 index 3c63c103e..000000000 --- a/leaves-server/minecraft-patches/features/0050-Shave-snow-layers.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Tue, 27 Jun 2023 14:07:00 +0800 -Subject: [PATCH] Shave snow layers - - -diff --git a/net/minecraft/world/item/ShovelItem.java b/net/minecraft/world/item/ShovelItem.java -index ba0609f4d9166e66599f9d4430885ab03d53ef41..c50ea91c477a9b59222faab629cdf32049899519 100644 ---- a/net/minecraft/world/item/ShovelItem.java -+++ b/net/minecraft/world/item/ShovelItem.java -@@ -43,6 +43,26 @@ public class ShovelItem extends Item { - return InteractionResult.PASS; - } else { - Player player = context.getPlayer(); -+ // Leaves start - shaveSnowLayers -+ if (org.leavesmc.leaves.LeavesConfig.modify.shaveSnowLayers && blockState.is(Blocks.SNOW)) { -+ int layers = blockState.getValue(net.minecraft.world.level.block.SnowLayerBlock.LAYERS); -+ ItemStack tool = context.getItemInHand(); -+ boolean hasSilkTouch = net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(level.registryAccess().lookupOrThrow(net.minecraft.core.registries.Registries.ENCHANTMENT).getOrThrow(net.minecraft.world.item.enchantment.Enchantments.SILK_TOUCH), tool) > 0; -+ BlockState shavedBlockState = layers > 1 ? blockState.setValue(net.minecraft.world.level.block.SnowLayerBlock.LAYERS, layers - 1) : Blocks.AIR.defaultBlockState(); -+ -+ level.setBlock(clickedPos, shavedBlockState, Block.UPDATE_ALL_IMMEDIATE); -+ level.gameEvent(GameEvent.BLOCK_CHANGE, clickedPos, GameEvent.Context.of(player, shavedBlockState)); -+ -+ Block.popResource(level, clickedPos, new ItemStack(hasSilkTouch ? Items.SNOW : Items.SNOWBALL)); -+ level.playSound(player, clickedPos, SoundEvents.SNOW_BREAK, SoundSource.BLOCKS, 1.0F, 1.0F); -+ -+ if (player != null) { -+ tool.hurtAndBreak(1, player, context.getHand()); -+ } -+ -+ return InteractionResult.SUCCESS; -+ } -+ // Leaves end - shaveSnowLayers - BlockState blockState1 = FLATTENABLES.get(blockState.getBlock()); - BlockState blockState2 = null; - Runnable afterAction = null; // Paper diff --git a/leaves-server/minecraft-patches/features/0051-Lava-riptide.patch b/leaves-server/minecraft-patches/features/0051-Lava-riptide.patch new file mode 100644 index 000000000..9c57867cd --- /dev/null +++ b/leaves-server/minecraft-patches/features/0051-Lava-riptide.patch @@ -0,0 +1,28 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Fri, 7 Jul 2023 16:53:32 +0800 +Subject: [PATCH] Lava riptide + + +diff --git a/net/minecraft/world/item/TridentItem.java b/net/minecraft/world/item/TridentItem.java +index 2b091511bf82a0012fe4cbc4bc3d5f9b56dfdbeb..f1620e072294505cb28cc6093ea0164563c2921f 100644 +--- a/net/minecraft/world/item/TridentItem.java ++++ b/net/minecraft/world/item/TridentItem.java +@@ -71,7 +71,7 @@ public class TridentItem extends Item implements ProjectileItem { + } + + float riptideStrength = EnchantmentHelper.getTridentSpinAttackStrength(itemStack, player); +- if (!(riptideStrength > 0.0F) || player.isInWaterOrRain() && !player.isPassenger()) { ++ if (!(riptideStrength > 0.0F) || (player.isInWaterOrRain() || (org.leavesmc.leaves.LeavesConfig.modify.lavaRiptide && player.isInLava())) && !player.isPassenger()) { // Leaves - lava riptide + if (itemStack.nextDamageWillBreak()) { + return false; + } +@@ -153,7 +153,7 @@ public class TridentItem extends Item implements ProjectileItem { + return InteractionResult.FAIL; + } + +- if (EnchantmentHelper.getTridentSpinAttackStrength(itemInHand, player) > 0.0F && !player.isInWaterOrRain()) { ++ if (EnchantmentHelper.getTridentSpinAttackStrength(itemInHand, player) > 0.0F && !player.isInWaterOrRain() && !(org.leavesmc.leaves.LeavesConfig.modify.lavaRiptide && player.isInLava())) { // Leaves - lava riptide + return InteractionResult.FAIL; + } + diff --git a/leaves-server/minecraft-patches/features/0052-Cache-ignite-odds.patch b/leaves-server/minecraft-patches/features/0052-Cache-ignite-odds.patch deleted file mode 100644 index 98ae670f5..000000000 --- a/leaves-server/minecraft-patches/features/0052-Cache-ignite-odds.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Wed, 5 Jul 2023 17:42:24 +0800 -Subject: [PATCH] Cache ignite odds - - -diff --git a/net/minecraft/world/level/block/FireBlock.java b/net/minecraft/world/level/block/FireBlock.java -index 14a4189166b862b66a8383046f2abfe02ccbccd8..d9092edd3df19a8392cc49f314cbfa624179d44a 100644 ---- a/net/minecraft/world/level/block/FireBlock.java -+++ b/net/minecraft/world/level/block/FireBlock.java -@@ -202,6 +202,7 @@ public class FireBlock extends BaseFireBlock { - this.checkBurnOut(level, pos.south(), 300 + i, random, ageValue, pos); - // CraftBukkit end - add source blockPos to burn calls - BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos(); -+ Object2IntOpenHashMap blockPositionIgniteCache = new Object2IntOpenHashMap<>(); // Leaves - cache ignite odds - - for (int i1 = -1; i1 <= 1; i1++) { - for (int i2 = -1; i2 <= 1; i2++) { -@@ -213,7 +214,7 @@ public class FireBlock extends BaseFireBlock { - } - - mutableBlockPos.setWithOffset(pos, i1, i3, i2); -- int igniteOdds = this.getIgniteOdds(level, mutableBlockPos); -+ int igniteOdds = this.getIgniteOdds(level, mutableBlockPos, org.leavesmc.leaves.LeavesConfig.performance.cacheIgniteOdds ? blockPositionIgniteCache : null); // Leaves - cache ignite odds - if (igniteOdds > 0) { - int i5 = (igniteOdds + 40 + level.getDifficulty().getId() * 7) / (ageValue + 30); - if (value) { -@@ -315,20 +316,33 @@ public class FireBlock extends BaseFireBlock { - return false; - } - -+ // Leaves start - cache ignite odds - private int getIgniteOdds(LevelReader level, BlockPos pos) { -+ return getIgniteOdds(level, pos, null); -+ } -+ -+ private int getIgniteOdds(LevelReader level, BlockPos pos, @org.jetbrains.annotations.Nullable Object2IntOpenHashMap cache) { - if (!level.isEmptyBlock(pos)) { - return 0; - } else { - int i = 0; - - for (Direction direction : Direction.values()) { -- BlockState blockState = level.getBlockState(pos.relative(direction)); -- i = Math.max(this.getIgniteOdds(blockState), i); -+ if (cache != null) { -+ i = Math.max(cache.computeIfAbsent(pos, key -> { -+ BlockState blockState = level.getBlockState(pos.relative(direction)); -+ return this.getIgniteOdds(blockState); -+ }), i); -+ } else { -+ BlockState blockState = level.getBlockState(pos.relative(direction)); -+ i = Math.max(this.getIgniteOdds(blockState), i); -+ } - } - - return i; - } - } -+ // Leaves end - cache ignite odds - - @Override - protected boolean canBurn(BlockState state) { diff --git a/leaves-server/minecraft-patches/features/0052-No-block-update-command.patch b/leaves-server/minecraft-patches/features/0052-No-block-update-command.patch new file mode 100644 index 000000000..73a65e79e --- /dev/null +++ b/leaves-server/minecraft-patches/features/0052-No-block-update-command.patch @@ -0,0 +1,102 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Mon, 3 Feb 2025 19:16:16 +0800 +Subject: [PATCH] No block update command + + +diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java +index 97bd365f332d64c9e4023ecdf109ca37c4c9238a..e1ebc7729f1c60833fafe90636e22e33d1c918a9 100644 +--- a/net/minecraft/server/level/ServerPlayerGameMode.java ++++ b/net/minecraft/server/level/ServerPlayerGameMode.java +@@ -406,7 +406,7 @@ public class ServerPlayerGameMode { + org.bukkit.block.BlockState bState = bblock.getState(); + this.level.captureDrops = new java.util.ArrayList<>(); + // CraftBukkit end +- BlockState adjustedState = block.playerWillDestroy(this.level, pos, state, this.player); ++ BlockState adjustedState = org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? state : block.playerWillDestroy(this.level, pos, state, this.player); // Leaves - no block update + boolean changed = this.level.removeBlock(pos, false); + if (SharedConstants.DEBUG_BLOCK_BREAK) { + LOGGER.info("server broke {} {} -> {}", pos, adjustedState, this.level.getBlockState(pos)); +diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java +index d0b07e6a30a98466efacb3d9a032be5d394c23c9..48f044d8296c0b35d22202887c515872787ed3f3 100644 +--- a/net/minecraft/world/level/Level.java ++++ b/net/minecraft/world/level/Level.java +@@ -1055,7 +1055,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + } + + @Override +- public boolean setBlock(final BlockPos pos, final BlockState blockState, @Block.UpdateFlags final int updateFlags, final int updateLimit) { ++ public boolean setBlock(final BlockPos pos, final BlockState blockState, @Block.UpdateFlags int updateFlags, final int updateLimit) { // Leaves - remove final on updateFlags for no-block-update ++ // Leaves start - no block update ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { ++ updateFlags = updateFlags & ~Block.UPDATE_NEIGHBORS | Block.UPDATE_SKIP_ON_PLACE; ++ } ++ // Leaves end - no block update + // CraftBukkit start - tree generation + if (this.captureTreeGeneration) { + // Paper start - Protect Bedrock and End Portal/Frames from being destroyed +@@ -1156,6 +1161,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + + // CraftBukkit start - Split off from above in order to directly send client and physic updates + public void notifyAndUpdatePhysics(BlockPos pos, LevelChunk chunk, BlockState oldState, BlockState blockState, BlockState newState, @Block.UpdateFlags int updateFlags, int updateLimit) { ++ // Leaves start - no block update ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { ++ updateFlags = updateFlags & ~Block.UPDATE_NEIGHBORS | Block.UPDATE_SKIP_ON_PLACE; ++ } ++ // Leaves end - no block update + if (newState == blockState) { + if (oldState != newState) { + this.setBlocksDirty(pos, oldState, newState); +@@ -1174,6 +1184,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + + if ((updateFlags & Block.UPDATE_KNOWN_SHAPE) == 0 && updateLimit > 0) { + int neighbourUpdateFlags = updateFlags & ~(Block.UPDATE_SUPPRESS_DROPS | Block.UPDATE_NEIGHBORS); ++ // Leaves start - no block update ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { ++ this.updatePOIOnBlockStateChange(pos, oldState, newState); ++ return; ++ } ++ // Leaves end - no block update + + // CraftBukkit start + oldState.updateIndirectNeighbourShapes(this, pos, neighbourUpdateFlags, updateLimit - 1); // Don't call an event for the old block to limit event spam +diff --git a/net/minecraft/world/level/block/piston/PistonBaseBlock.java b/net/minecraft/world/level/block/piston/PistonBaseBlock.java +index 8e60d158618e45b03eac9a01abe0777e359cf0bc..a9597492e3c61d063035a5cb94f76c06fff5a600 100644 +--- a/net/minecraft/world/level/block/piston/PistonBaseBlock.java ++++ b/net/minecraft/world/level/block/piston/PistonBaseBlock.java +@@ -108,6 +108,7 @@ public class PistonBaseBlock extends DirectionalBlock { + } + + private void checkIfExtend(final Level level, final BlockPos pos, final BlockState state) { ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) return; // Leaves - no block update + Direction direction = state.getValue(FACING); + boolean extend = this.getNeighborSignal(level, pos, direction); + if (extend && !state.getValue(EXTENDED)) { +diff --git a/net/minecraft/world/level/redstone/NeighborUpdater.java b/net/minecraft/world/level/redstone/NeighborUpdater.java +index 4bf7a27224896c6b71331196b625438fa9d5b52a..dfe7e80bd84b651a5059a1a1ab99b2615e7254dc 100644 +--- a/net/minecraft/world/level/redstone/NeighborUpdater.java ++++ b/net/minecraft/world/level/redstone/NeighborUpdater.java +@@ -39,9 +39,14 @@ public interface NeighborUpdater { + final BlockPos pos, + final BlockPos neighborPos, + final BlockState neighborState, +- @Block.UpdateFlags final int updateFlags, ++ @Block.UpdateFlags int updateFlags, // Leaves - remove final for no-block-update + final int updateLimit + ) { ++ // Leaves start - no block update ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { ++ updateFlags = updateFlags & ~net.minecraft.world.level.block.Block.UPDATE_NEIGHBORS | net.minecraft.world.level.block.Block.UPDATE_SKIP_ON_PLACE; ++ } ++ // Leaves end - no block update + BlockState currentState = level.getBlockState(pos); + if ((updateFlags & Block.UPDATE_SKIP_SHAPE_UPDATE_ON_WIRE) == 0 || !currentState.is(Blocks.REDSTONE_WIRE)) { + try { +@@ -72,6 +77,7 @@ public interface NeighborUpdater { + + static void executeUpdate(Level level, BlockState state, BlockPos pos, Block changedBlock, @Nullable Orientation orientation, boolean movedByPiston, BlockPos sourcePos) { + // Paper end - Add source block to BlockPhysicsEvent ++ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) return; // Leaves - no block update + try { + // CraftBukkit start + org.bukkit.event.block.BlockPhysicsEvent event = new org.bukkit.event.block.BlockPhysicsEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), state.asBlockData(), org.bukkit.craftbukkit.block.CraftBlock.at(level, sourcePos)); // Paper - Add source block to BlockPhysicsEvent diff --git a/leaves-server/minecraft-patches/features/0053-Container-open-passthrough.patch b/leaves-server/minecraft-patches/features/0053-Container-open-passthrough.patch new file mode 100644 index 000000000..69dca7299 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0053-Container-open-passthrough.patch @@ -0,0 +1,76 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Mon, 3 Feb 2025 21:31:03 +0800 +Subject: [PATCH] Container open passthrough + + +diff --git a/net/minecraft/world/entity/decoration/ItemFrame.java b/net/minecraft/world/entity/decoration/ItemFrame.java +index 9cc2af3db862fdfa45a67ef4b9c49581d7d69d36..47b20e61a32f68df7344f6376a820aba6fe3885a 100644 +--- a/net/minecraft/world/entity/decoration/ItemFrame.java ++++ b/net/minecraft/world/entity/decoration/ItemFrame.java +@@ -396,6 +396,16 @@ public class ItemFrame extends HangingEntity { + } + + if (!player.level().isClientSide()) { ++ // Leaves start - itemFrameContainerPassthrough ++ if (org.leavesmc.leaves.LeavesConfig.modify.containerPassthrough && !player.isShiftKeyDown() && (frameHasItem || !hasHeldItem)) { ++ BlockPos behindPos = this.pos.relative(this.getDirection().getOpposite()); ++ if (this.level().getBlockEntity(behindPos) instanceof net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity) { ++ net.minecraft.world.phys.BlockHitResult hitResult = new net.minecraft.world.phys.BlockHitResult(Vec3.atCenterOf(behindPos), this.getDirection(), behindPos, false); ++ net.minecraft.server.level.ServerPlayer serverPlayer = (net.minecraft.server.level.ServerPlayer) player; ++ return serverPlayer.gameMode.useItemOn(serverPlayer, this.level(), itemStack, hand, hitResult); ++ } ++ } ++ // Leaves end - itemFrameContainerPassthrough + if (!frameHasItem) { + if (hasHeldItem && !this.isRemoved()) { + MapItemSavedData data = MapItem.getSavedData(itemStack, this.level()); +diff --git a/net/minecraft/world/level/block/SignBlock.java b/net/minecraft/world/level/block/SignBlock.java +index 32ddf56263e3882616a6d7ee45fe26f53d85eda4..a6739ae08a7d77f3009bc2044a9fbfaa50467623 100644 +--- a/net/minecraft/world/level/block/SignBlock.java ++++ b/net/minecraft/world/level/block/SignBlock.java +@@ -112,6 +112,18 @@ public abstract class SignBlock extends BaseEntityBlock implements SimpleWaterlo + } else { + return InteractionResult.TRY_WITH_EMPTY_HAND; + } ++ // Leaves start - signContainerPassthrough ++ } else if (org.leavesmc.leaves.LeavesConfig.modify.containerPassthrough) { ++ BlockPos behindPos = pos.relative(hitResult.getDirection().getOpposite()); ++ if (this instanceof WallSignBlock || this instanceof WallHangingSignBlock) { ++ behindPos = pos.relative(state.getValue(HorizontalDirectionalBlock.FACING).getOpposite()); ++ } ++ if (level.getBlockEntity(behindPos) instanceof net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity) { ++ BlockState behindState = level.getBlockState(behindPos); ++ return behindState.useItemOn(itemStack, level, player, hand, hitResult.withPosition(behindPos)); ++ } ++ return InteractionResult.TRY_WITH_EMPTY_HAND; ++ // Leaves end - signContainerPassthrough + } else { + return InteractionResult.TRY_WITH_EMPTY_HAND; + } +@@ -136,6 +148,25 @@ public abstract class SignBlock extends BaseEntityBlock implements SimpleWaterlo + return InteractionResult.SUCCESS_SERVER; + } else if (executedClickCommand) { + return InteractionResult.SUCCESS_SERVER; ++ // Leaves start - signContainerPassthrough ++ } else if (org.leavesmc.leaves.LeavesConfig.modify.containerPassthrough) { ++ if (player.isShiftKeyDown()) { ++ if (!this.otherPlayerIsEditingSign(player, sign) && player.mayBuild() && this.hasEditableText(player, sign, isFrontText)) { ++ this.openTextEdit(player, sign, isFrontText, io.papermc.paper.event.player.PlayerOpenSignEvent.Cause.INTERACT); ++ return InteractionResult.SUCCESS; ++ } ++ } ++ ++ BlockPos behindPos = pos.relative(hitResult.getDirection().getOpposite()); ++ if (this instanceof WallSignBlock || this instanceof WallHangingSignBlock) { ++ behindPos = pos.relative(state.getValue(HorizontalDirectionalBlock.FACING).getOpposite()); ++ } ++ if (level.getBlockEntity(behindPos) instanceof net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity) { ++ BlockState behindState = level.getBlockState(behindPos); ++ return behindState.useWithoutItem(level, player, hitResult.withPosition(behindPos)); ++ } ++ return InteractionResult.PASS; ++ // Leaves end - signContainerPassthrough + } else if (!this.otherPlayerIsEditingSign(player, sign) && player.mayBuild() && this.hasEditableText(player, sign, isFrontText)) { + this.openTextEdit(player, sign, isFrontText, io.papermc.paper.event.player.PlayerOpenSignEvent.Cause.INTERACT); // Paper - Add PlayerOpenSignEvent + return InteractionResult.SUCCESS_SERVER; diff --git a/leaves-server/minecraft-patches/features/0053-Lava-riptide.patch b/leaves-server/minecraft-patches/features/0053-Lava-riptide.patch deleted file mode 100644 index a6d9916fa..000000000 --- a/leaves-server/minecraft-patches/features/0053-Lava-riptide.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Fri, 7 Jul 2023 16:53:32 +0800 -Subject: [PATCH] Lava riptide - - -diff --git a/net/minecraft/world/item/TridentItem.java b/net/minecraft/world/item/TridentItem.java -index d029fda2e8bac95fb75f75666a55b0c3aa3bb12d..d524a83c16dcf67d6498e1494bffe6ad378f7d1c 100644 ---- a/net/minecraft/world/item/TridentItem.java -+++ b/net/minecraft/world/item/TridentItem.java -@@ -70,7 +70,7 @@ public class TridentItem extends Item implements ProjectileItem { - return false; - } else { - float tridentSpinAttackStrength = EnchantmentHelper.getTridentSpinAttackStrength(stack, player); -- if (tridentSpinAttackStrength > 0.0F && !player.isInWaterOrRain()) { -+ if (tridentSpinAttackStrength > 0.0F && !player.isInWaterOrRain() || (org.leavesmc.leaves.LeavesConfig.modify.lavaRiptide && player.isInLava())) { // Leaves - lava riptide - return false; - } else if (stack.nextDamageWillBreak()) { - return false; -@@ -149,7 +149,7 @@ public class TridentItem extends Item implements ProjectileItem { - ItemStack itemInHand = player.getItemInHand(hand); - if (itemInHand.nextDamageWillBreak()) { - return InteractionResult.FAIL; -- } else if (EnchantmentHelper.getTridentSpinAttackStrength(itemInHand, player) > 0.0F && !player.isInWaterOrRain()) { -+ } else if (EnchantmentHelper.getTridentSpinAttackStrength(itemInHand, player) > 0.0F && !player.isInWaterOrRain() && !(org.leavesmc.leaves.LeavesConfig.modify.lavaRiptide && player.isInLava())) { // Leaves - lava riptide - return InteractionResult.FAIL; - } else { - player.startUsingItem(hand); diff --git a/leaves-server/minecraft-patches/features/0056-Dont-respond-ping-before-start-fully.patch b/leaves-server/minecraft-patches/features/0054-Dont-respond-ping-before-start-fully.patch similarity index 93% rename from leaves-server/minecraft-patches/features/0056-Dont-respond-ping-before-start-fully.patch rename to leaves-server/minecraft-patches/features/0054-Dont-respond-ping-before-start-fully.patch index eb6e18efb..3ec484009 100644 --- a/leaves-server/minecraft-patches/features/0056-Dont-respond-ping-before-start-fully.patch +++ b/leaves-server/minecraft-patches/features/0054-Dont-respond-ping-before-start-fully.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Dont respond ping before start fully This patch is Powered by Gale(https://github.com/GaleMC/Gale) diff --git a/net/minecraft/server/network/ServerStatusPacketListenerImpl.java b/net/minecraft/server/network/ServerStatusPacketListenerImpl.java -index 465559113071a47e706f77a5b0996597ee986b3d..f64b21ef2660a1e60e3d6cddef04950e983b3baa 100644 +index fc7b0b1dd054bddd830983b7f07a92169c886518..c813e4ab59ce059ffaa281b72cf27c14ff141344 100644 --- a/net/minecraft/server/network/ServerStatusPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerStatusPacketListenerImpl.java @@ -37,6 +37,12 @@ public class ServerStatusPacketListenerImpl implements ServerStatusPacketListene diff --git a/leaves-server/minecraft-patches/features/0054-No-block-update-command.patch b/leaves-server/minecraft-patches/features/0054-No-block-update-command.patch deleted file mode 100644 index 2a1f2f72a..000000000 --- a/leaves-server/minecraft-patches/features/0054-No-block-update-command.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Mon, 3 Feb 2025 19:16:16 +0800 -Subject: [PATCH] No block update command - - -diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index 1039bbcfccb851f9bb557b6d55656d51d8821647..24632205303bbcb2240a851b9d8baf8bbdfe4622 100644 ---- a/net/minecraft/server/level/ServerPlayerGameMode.java -+++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -398,7 +398,7 @@ public class ServerPlayerGameMode { - org.bukkit.block.BlockState state = bblock.getState(); - this.level.captureDrops = new java.util.ArrayList<>(); - // CraftBukkit end -- BlockState blockState1 = block.playerWillDestroy(this.level, pos, blockState, this.player); -+ BlockState blockState1 = org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? blockState : block.playerWillDestroy(this.level, pos, blockState, this.player); // Leaves - no block update - boolean flag = this.level.removeBlock(pos, false); - if (SharedConstants.DEBUG_BLOCK_BREAK) { - LOGGER.info("server broke {} {} -> {}", pos, blockState1, this.level.getBlockState(pos)); -diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 16ea2b070207c7aece5cb80fe713a07d01b18f84..6c60317613df508b593cc1cfa4f62b0ca303ed93 100644 ---- a/net/minecraft/world/level/Level.java -+++ b/net/minecraft/world/level/Level.java -@@ -1049,6 +1049,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - - @Override - public boolean setBlock(BlockPos pos, BlockState state, @Block.UpdateFlags int flags, int recursionLeft) { -+ // Leaves start - no block update -+ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { -+ flags = flags & ~1 | net.minecraft.world.level.block.Block.UPDATE_SKIP_ON_PLACE; -+ } -+ // Leaves end - no block update - // CraftBukkit start - tree generation - if (this.captureTreeGeneration) { - // Paper start - Protect Bedrock and End Portal/Frames from being destroyed -@@ -1150,6 +1155,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - BlockState state = newState; - BlockState blockState = oldState; - BlockState blockState1 = currentState; -+ // Leaves start - no block update -+ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { -+ flags = flags & ~1 | net.minecraft.world.level.block.Block.UPDATE_SKIP_ON_PLACE; -+ } -+ // Leaves end - no block update - if (blockState1 == state) { - if (blockState != blockState1) { - this.setBlocksDirty(pos, blockState, blockState1); -@@ -1167,6 +1177,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - } - - if ((flags & Block.UPDATE_KNOWN_SHAPE) == 0 && recursionLeft > 0) { -+ // Leaves start - no block update -+ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { -+ this.updatePOIOnBlockStateChange(pos, blockState, blockState1); -+ return; -+ } -+ // Leaves end - no block update - int i = flags & ~(Block.UPDATE_SUPPRESS_DROPS | Block.UPDATE_NEIGHBORS); - - // CraftBukkit start -diff --git a/net/minecraft/world/level/block/piston/PistonBaseBlock.java b/net/minecraft/world/level/block/piston/PistonBaseBlock.java -index 74d9b13400f6401fd88884a8e6e82eb235d9d1a1..4fa357fa06bb522ab3a8a5c776acad0c5e6a6e3e 100644 ---- a/net/minecraft/world/level/block/piston/PistonBaseBlock.java -+++ b/net/minecraft/world/level/block/piston/PistonBaseBlock.java -@@ -106,6 +106,7 @@ public class PistonBaseBlock extends DirectionalBlock { - } - - private void checkIfExtend(Level level, BlockPos pos, BlockState state) { -+ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) return; // Leaves - no block update - Direction direction = state.getValue(FACING); - boolean neighborSignal = this.getNeighborSignal(level, pos, direction); - if (neighborSignal && !state.getValue(EXTENDED)) { -diff --git a/net/minecraft/world/level/redstone/NeighborUpdater.java b/net/minecraft/world/level/redstone/NeighborUpdater.java -index b867a58eb2c954c49f80acfda7575114dfccecd4..41f3bdd134100814e4d3af42d74a8d9c361e0dff 100644 ---- a/net/minecraft/world/level/redstone/NeighborUpdater.java -+++ b/net/minecraft/world/level/redstone/NeighborUpdater.java -@@ -34,6 +34,11 @@ public interface NeighborUpdater { - static void executeShapeUpdate( - LevelAccessor level, Direction direction, BlockPos pos, BlockPos neighborPos, BlockState neighborState, @Block.UpdateFlags int flags, int recursionLeft - ) { -+ // Leaves start - no block update -+ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { -+ flags = flags & ~1 | net.minecraft.world.level.block.Block.UPDATE_SKIP_ON_PLACE; -+ } -+ // Leaves end - no block update - BlockState blockState = level.getBlockState(pos); - if ((flags & Block.UPDATE_SKIP_SHAPE_UPDATE_ON_WIRE) == 0 || !blockState.is(Blocks.REDSTONE_WIRE)) { - BlockState blockState1 = blockState.updateShape(level, level, pos, direction, neighborPos, neighborState, level.getRandom()); -@@ -48,6 +53,7 @@ public interface NeighborUpdater { - - static void executeUpdate(Level level, BlockState state, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston, BlockPos sourcePos) { - // Paper end - Add source block to BlockPhysicsEvent -+ if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) return; // Leaves - no block update - try { - // CraftBukkit start - org.bukkit.event.block.BlockPhysicsEvent event = new org.bukkit.event.block.BlockPhysicsEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(state), org.bukkit.craftbukkit.block.CraftBlock.at(level, sourcePos)); // Paper - Add source block to BlockPhysicsEvent diff --git a/leaves-server/minecraft-patches/features/0055-Container-open-passthrough.patch b/leaves-server/minecraft-patches/features/0055-Container-open-passthrough.patch deleted file mode 100644 index b53b4f0dc..000000000 --- a/leaves-server/minecraft-patches/features/0055-Container-open-passthrough.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Mon, 3 Feb 2025 21:31:03 +0800 -Subject: [PATCH] Container open passthrough - - -diff --git a/net/minecraft/world/entity/decoration/ItemFrame.java b/net/minecraft/world/entity/decoration/ItemFrame.java -index 462ad83bc08d6d6ae55ee852489439ff6e1dc845..b36ad5527c5b10f5903a9c6627b8877c015c9867 100644 ---- a/net/minecraft/world/entity/decoration/ItemFrame.java -+++ b/net/minecraft/world/entity/decoration/ItemFrame.java -@@ -398,6 +398,16 @@ public class ItemFrame extends HangingEntity { - if (this.fixed) { - return InteractionResult.PASS; - } else if (!player.level().isClientSide()) { -+ // Leaves start - itemFrameContainerPassthrough -+ if (org.leavesmc.leaves.LeavesConfig.modify.containerPassthrough && !player.isShiftKeyDown() && (flag || !flag1)) { -+ BlockPos pos1 = this.pos.relative(this.getDirection().getOpposite()); -+ if (level().getBlockEntity(pos1) instanceof net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity) { -+ net.minecraft.world.phys.BlockHitResult hitResult = new net.minecraft.world.phys.BlockHitResult(Vec3.atCenterOf(pos1), this.getDirection(), pos1, false); -+ net.minecraft.server.level.ServerPlayer serverPlayer = (net.minecraft.server.level.ServerPlayer) player; -+ return serverPlayer.gameMode.useItemOn(serverPlayer, level(), itemInHand, hand, hitResult); -+ } -+ } -+ // Leaves end - itemFrameContainerPassthrough - if (!flag) { - if (flag1 && !this.isRemoved()) { - MapItemSavedData savedData = MapItem.getSavedData(itemInHand, this.level()); -diff --git a/net/minecraft/world/level/block/SignBlock.java b/net/minecraft/world/level/block/SignBlock.java -index b36b9b48da940ad7b4014c90c05eb90f5198a5fb..c2fb2a862fdaaa47bf848ed537827c315ed53503 100644 ---- a/net/minecraft/world/level/block/SignBlock.java -+++ b/net/minecraft/world/level/block/SignBlock.java -@@ -108,6 +108,18 @@ public abstract class SignBlock extends BaseEntityBlock implements SimpleWaterlo - } else { - return InteractionResult.TRY_WITH_EMPTY_HAND; - } -+ // Leaves start - signContainerPassthrough -+ } else if (org.leavesmc.leaves.LeavesConfig.modify.containerPassthrough) { -+ BlockPos pos1 = pos.relative(hitResult.getDirection().getOpposite()); -+ if (this instanceof WallSignBlock || this instanceof WallHangingSignBlock) { -+ pos1 = pos.relative(state.getValue(HorizontalDirectionalBlock.FACING).getOpposite()); -+ } -+ if (level.getBlockEntity(pos1) instanceof net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity) { -+ BlockState state1 = level.getBlockState(pos1); -+ return state1.useItemOn(stack, level, player, hand, hitResult.withPosition(pos1)); -+ } -+ return InteractionResult.TRY_WITH_EMPTY_HAND; -+ // Leaves end - signContainerPassthrough - } else { - return InteractionResult.TRY_WITH_EMPTY_HAND; - } -@@ -130,6 +142,25 @@ public abstract class SignBlock extends BaseEntityBlock implements SimpleWaterlo - return InteractionResult.SUCCESS_SERVER; - } else if (flag) { - return InteractionResult.SUCCESS_SERVER; -+ // Leaves start - signContainerPassthrough -+ } else if (org.leavesmc.leaves.LeavesConfig.modify.containerPassthrough) { -+ if (player.isShiftKeyDown()) { -+ if (!this.otherPlayerIsEditingSign(player, signBlockEntity) && player.mayBuild() && this.hasEditableText(player, signBlockEntity, isFacingFrontText)) { -+ this.openTextEdit(player, signBlockEntity, isFacingFrontText); -+ return InteractionResult.SUCCESS; -+ } -+ } -+ -+ BlockPos pos1 = pos.relative(hitResult.getDirection().getOpposite()); -+ if (this instanceof WallSignBlock || this instanceof WallHangingSignBlock) { -+ pos1 = pos.relative(state.getValue(HorizontalDirectionalBlock.FACING).getOpposite()); -+ } -+ if (level.getBlockEntity(pos1) instanceof net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity) { -+ BlockState state1 = level.getBlockState(pos1); -+ return state1.useWithoutItem(level, player, hitResult.withPosition(pos1)); -+ } -+ return InteractionResult.PASS; -+ // Leaves end - signContainerPassthrough - } else if (!this.otherPlayerIsEditingSign(player, signBlockEntity) - && player.mayBuild() - && this.hasEditableText(player, signBlockEntity, isFacingFrontText)) { diff --git a/leaves-server/minecraft-patches/features/0057-Faster-chunk-serialization.patch b/leaves-server/minecraft-patches/features/0055-Faster-chunk-serialization.patch similarity index 63% rename from leaves-server/minecraft-patches/features/0057-Faster-chunk-serialization.patch rename to leaves-server/minecraft-patches/features/0055-Faster-chunk-serialization.patch index 49b3693d0..52f28a2cc 100644 --- a/leaves-server/minecraft-patches/features/0057-Faster-chunk-serialization.patch +++ b/leaves-server/minecraft-patches/features/0055-Faster-chunk-serialization.patch @@ -1,19 +1,18 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From a260c23da85bd64a4db7343130e814cf88237903 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Tue, 18 Jul 2023 13:14:15 +0800 Subject: [PATCH] Faster chunk serialization -This patch is Powered by Leaf(https://github.com/Winds-Studio/Leaf) -License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) - -This patch is based on the following mixins: -* "net/caffeinemc/mods/lithium/mixin/chunk/palette/StrategyMixin.java" -By: 2No2Name <2No2Name@web.de> -As part of: Lithium (https://github.com/CaffeineMC/lithium) -Licensed under: LGPL-3.0 (https://www.gnu.org/licenses/lgpl-3.0.html) +--- + net/minecraft/util/BitStorage.java | 2 + + net/minecraft/util/SimpleBitStorage.java | 31 +++++++ + net/minecraft/util/ZeroBitStorage.java | 2 + + .../world/level/chunk/HashMapPalette.java | 10 +- + .../world/level/chunk/PalettedContainer.java | 91 +++++++++++++++++-- + 5 files changed, 129 insertions(+), 7 deletions(-) diff --git a/net/minecraft/util/BitStorage.java b/net/minecraft/util/BitStorage.java -index 02502d50f0255f5bbcc0ecb965abb48cc1a112da..0abb6a2886cd80889307d4bc596513837154810d 100644 +index 48f6671..fe3f454 100644 --- a/net/minecraft/util/BitStorage.java +++ b/net/minecraft/util/BitStorage.java @@ -38,4 +38,6 @@ public interface BitStorage extends ca.spottedleaf.moonrise.patches.block_counti @@ -21,60 +20,50 @@ index 02502d50f0255f5bbcc0ecb965abb48cc1a112da..0abb6a2886cd80889307d4bc59651383 } // Paper end - block counting + -+ void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out, net.minecraft.world.level.chunk.PalettedContainer resizeHandler); // Leaves - Leaf - Lithium - faster chunk serialization ++ void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out, net.minecraft.world.level.chunk.PalettedContainer resizeHandler); // Leaves - Gale - Lithium - faster chunk serialization } diff --git a/net/minecraft/util/SimpleBitStorage.java b/net/minecraft/util/SimpleBitStorage.java -index 08af7687cdbf395116c2ae0c40befa518b796846..8b81dc0526f31cd23ef40fb047046738647ba35d 100644 +index 8513636..738dd4e 100644 --- a/net/minecraft/util/SimpleBitStorage.java +++ b/net/minecraft/util/SimpleBitStorage.java -@@ -465,4 +465,45 @@ public class SimpleBitStorage implements BitStorage { +@@ -465,4 +465,35 @@ public class SimpleBitStorage implements BitStorage { super(message); } } + -+ // Leaves start - Leaf - Lithium - faster chunk serialization ++ // Leaves start - Gale - Lithium - faster chunk serialization + @Override + public void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out, net.minecraft.world.level.chunk.PalettedContainer resizeHandler) { + if (this.size >= Short.MAX_VALUE) { + throw new IllegalStateException("Array too large"); + } -+ + if (this.size != out.length) { + throw new IllegalStateException("Array size mismatch"); + } -+ + short[] mappings = new short[(int) (this.mask + 1)]; -+ + int idx = 0; -+ + for (long word : this.data) { + long bits = word; -+ + for (int elementIdx = 0; elementIdx < this.valuesPerLong; ++elementIdx) { + int value = (int) (bits & this.mask); + int remappedId = mappings[value]; -+ + if (remappedId == 0) { + remappedId = dstPalette.idFor(srcPalette.valueFor(value), resizeHandler) + 1; + mappings[value] = (short) remappedId; + } -+ + out[idx] = (short) (remappedId - 1); + bits >>= this.bits; -+ + ++idx; -+ + if (idx >= this.size) { + return; + } + } + } + } -+ // Leaves end - Leaf - Lithium - faster chunk serialization -+ ++ // Leaves end - Gale - Lithium - faster chunk serialization } diff --git a/net/minecraft/util/ZeroBitStorage.java b/net/minecraft/util/ZeroBitStorage.java -index 09fd99c9cbd23b5f3c899bfb00c9b89651948ed8..8337ee207a01486516087fcfc99e985a3dcd7dc1 100644 +index 3666c3e..e316c2e 100644 --- a/net/minecraft/util/ZeroBitStorage.java +++ b/net/minecraft/util/ZeroBitStorage.java @@ -80,4 +80,6 @@ public class ZeroBitStorage implements BitStorage { @@ -82,10 +71,10 @@ index 09fd99c9cbd23b5f3c899bfb00c9b89651948ed8..8337ee207a01486516087fcfc99e985a } // Paper end - block counting + -+ @Override public void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out, net.minecraft.world.level.chunk.PalettedContainer resizeHandler) {} // Leaves - Leaf - Lithium - faster chunk serialization ++ @Override public void compact(net.minecraft.world.level.chunk.Palette srcPalette, net.minecraft.world.level.chunk.Palette dstPalette, short[] out, net.minecraft.world.level.chunk.PalettedContainer resizeHandler) {} // Leaves - Gale - Lithium - faster chunk serialization } diff --git a/net/minecraft/world/level/chunk/HashMapPalette.java b/net/minecraft/world/level/chunk/HashMapPalette.java -index 5b9346b25aa01db9f3c36e243f46846b87a6eb75..9f39eab314ca6a4c22b30d70df423eea4d35cc0f 100644 +index 3ee3588..90bf5e7 100644 --- a/net/minecraft/world/level/chunk/HashMapPalette.java +++ b/net/minecraft/world/level/chunk/HashMapPalette.java @@ -14,7 +14,7 @@ public class HashMapPalette implements Palette, ca.spottedleaf.moonrise.pa @@ -109,11 +98,11 @@ index 5b9346b25aa01db9f3c36e243f46846b87a6eb75..9f39eab314ca6a4c22b30d70df423eea + } + // Leaves end - Leaf - Lithium - faster hash palette + - private HashMapPalette(int bits, CrudeIncrementalIntIdentityHashBiMap values) { + private HashMapPalette(final int bits, final CrudeIncrementalIntIdentityHashBiMap values) { this.bits = bits; this.values = values; diff --git a/net/minecraft/world/level/chunk/PalettedContainer.java b/net/minecraft/world/level/chunk/PalettedContainer.java -index 7c8f8772a6fba04dbafdb5dbf8098b6ebce6d6f2..a74b249378e94721eb04579932625e61ecc71041 100644 +index 66a05ad..2ab0063 100644 --- a/net/minecraft/world/level/chunk/PalettedContainer.java +++ b/net/minecraft/world/level/chunk/PalettedContainer.java @@ -23,6 +23,22 @@ import net.minecraft.util.ZeroBitStorage; @@ -121,128 +110,114 @@ index 7c8f8772a6fba04dbafdb5dbf8098b6ebce6d6f2..a74b249378e94721eb04579932625e61 public class PalettedContainer implements PaletteResize, PalettedContainerRO { + -+ // Leaves start - Leaf - Lithium - faster chunk serialization ++ // Leaves start - Gale - Lithium - faster chunk serialization + private static final ThreadLocal CACHED_ARRAY_4096 = ThreadLocal.withInitial(() -> new short[4096]); + private static final ThreadLocal CACHED_ARRAY_64 = ThreadLocal.withInitial(() -> new short[64]); -+ private Optional asOptional(long[] data) { ++ private Optional asOptional(final long[] data) { + return Optional.of(Arrays.stream(data)); + } -+ private short[] getOrCreate(int size) { ++ private short[] getOrCreate(final int size) { + return switch (size) { + case 64 -> CACHED_ARRAY_64.get(); + case 4096 -> CACHED_ARRAY_4096.get(); + default -> new short[size]; + }; + } -+ // Leaves end - Leaf - Lithium - faster chunk serialization ++ // Leaves end - Gale - Lithium - faster chunk serialization + private static final int MIN_PALETTE_BITS = 0; public volatile PalettedContainer.Data data; // Paper - optimise collisions - public private final Strategy strategy; -@@ -338,6 +354,56 @@ public class PalettedContainer implements PaletteResize, PalettedContainer - public synchronized PalettedContainerRO.PackedData pack(Strategy strategy) { // Paper - synchronize +@@ -348,6 +364,45 @@ public class PalettedContainer implements PaletteResize, PalettedContainer + public synchronized PalettedContainerRO.PackedData pack(final Strategy strategy) { // Paper - synchronize this.acquire(); -+ // Leaves start - Leaf - Lithium - faster chunk serialization ++ // Leaves start - Gale - Lithium - faster chunk serialization + if (org.leavesmc.leaves.LeavesConfig.performance.fasterChunkSerialization) { -+ Optional data = Optional.empty(); -+ List elements = null; ++ Optional fsData = Optional.empty(); ++ List fsElements = null; + try { -+ // The palette that will be serialized + org.leavesmc.leaves.lithium.common.world.chunk.LithiumHashPalette hashPalette = null; -+ + final Palette palette = this.data.palette(); + final BitStorage storage = this.data.storage(); + if (storage instanceof ZeroBitStorage || palette.getSize() == 1) { -+ // If the palette only contains one entry, don't attempt to repack it. -+ elements = List.of(palette.valueFor(0)); ++ fsElements = List.of(palette.valueFor(0)); + } else if (palette instanceof org.leavesmc.leaves.lithium.common.world.chunk.LithiumHashPalette lithiumHashPalette) { + hashPalette = lithiumHashPalette; + } + -+ if (elements == null) { ++ if (fsElements == null) { + org.leavesmc.leaves.lithium.common.world.chunk.LithiumHashPalette compactedPalette = new org.leavesmc.leaves.lithium.common.world.chunk.LithiumHashPalette<>(storage.getBits()); + short[] array = this.getOrCreate(strategy.entryCount()); -+ + storage.compact(this.data.palette(), compactedPalette, array, this); -+ -+ // If the palette didn't change during compaction, do a simple copy of the data array -+ if (hashPalette != null && hashPalette.getSize() == compactedPalette.getSize() && storage.getBits() == strategy.getConfigurationForPaletteSize(hashPalette.getSize()).bitsInStorage()) { // paletteSize can de-sync from palette - see https://github.com/CaffeineMC/lithium-fabric/issues/279 -+ data = this.asOptional(storage.getRaw().clone()); -+ elements = hashPalette.getElements(); ++ if (hashPalette != null && hashPalette.getSize() == compactedPalette.getSize() && storage.getBits() == strategy.getConfigurationForPaletteSize(hashPalette.getSize()).bitsInStorage()) { ++ fsData = this.asOptional(storage.getRaw().clone()); ++ fsElements = hashPalette.getElements(); + } else { + int bits = strategy.getConfigurationForPaletteSize(compactedPalette.getSize()).bitsInStorage(); + if (bits != 0) { -+ // Re-pack the integer array as the palette has changed size + SimpleBitStorage copy = new SimpleBitStorage(bits, array.length); + for (int i = 0; i < array.length; ++i) { + copy.set(i, array[i]); + } -+ -+ // We don't need to clone the data array as we are the sole owner of it -+ data = this.asOptional(copy.getRaw()); ++ fsData = this.asOptional(copy.getRaw()); + } -+ -+ elements = compactedPalette.getElements(); ++ fsElements = compactedPalette.getElements(); + } + } + } finally { + this.release(); + } -+ -+ return new PalettedContainerRO.PackedData<>(elements, data); ++ return new PalettedContainerRO.PackedData<>(fsElements, fsData); + } -+ // Leaves end - Leaf - Lithium - faster chunk serialization - PalettedContainerRO.PackedData var14; ++ // Leaves end - Gale - Lithium - faster chunk serialization try { - BitStorage bitStorage = this.data.storage; -@@ -410,13 +476,43 @@ public class PalettedContainer implements PaletteResize, PalettedContainer + BitStorage currentStorage = this.data.storage; + Palette currentPalette = this.data.palette; +@@ -417,13 +472,37 @@ public class PalettedContainer implements PaletteResize, PalettedContainer @Override - public void count(PalettedContainer.CountConsumer countConsumer) { + public void count(final PalettedContainer.CountConsumer output) { - if (this.data.palette.getSize() == 1) { -- countConsumer.accept(this.data.palette.valueFor(0), this.data.storage.getSize()); +- output.accept(this.data.palette.valueFor(0), this.data.storage.getSize()); - } else { -- Int2IntOpenHashMap map = new Int2IntOpenHashMap(); -- this.data.storage.getAll(id -> map.addTo(id, 1)); -- map.int2IntEntrySet().forEach(idEntry -> countConsumer.accept(this.data.palette.valueFor(idEntry.getIntKey()), idEntry.getIntValue())); -+ // Leaves start - Leaf - Lithium - faster chunk serialization +- Int2IntOpenHashMap counts = new Int2IntOpenHashMap(); +- this.data.storage.getAll(state -> counts.addTo(state, 1)); +- counts.int2IntEntrySet().forEach(entry -> output.accept(this.data.palette.valueFor(entry.getIntKey()), entry.getIntValue())); ++ // Leaves start - Gale - Lithium - faster chunk serialization + if (!org.leavesmc.leaves.LeavesConfig.performance.fasterChunkSerialization) { + if (this.data.palette.getSize() == 1) { -+ countConsumer.accept(this.data.palette.valueFor(0), this.data.storage.getSize()); ++ output.accept(this.data.palette.valueFor(0), this.data.storage.getSize()); + } else { -+ Int2IntOpenHashMap map = new Int2IntOpenHashMap(); -+ this.data.storage.getAll(id -> map.addTo(id, 1)); -+ map.int2IntEntrySet().forEach(idEntry -> countConsumer.accept(this.data.palette.valueFor(idEntry.getIntKey()), idEntry.getIntValue())); ++ Int2IntOpenHashMap counts = new Int2IntOpenHashMap(); ++ this.data.storage.getAll(state -> counts.addTo(state, 1)); ++ counts.int2IntEntrySet().forEach(entry -> output.accept(this.data.palette.valueFor(entry.getIntKey()), entry.getIntValue())); + } + return; + } + int len = this.data.palette().getSize(); -+ -+ // Do not allocate huge arrays if we're using a large palette + if (len > 4096) { -+ // VanillaCopy + if (this.data.palette.getSize() == 1) { -+ countConsumer.accept(this.data.palette.valueFor(0), this.data.storage.getSize()); ++ output.accept(this.data.palette.valueFor(0), this.data.storage.getSize()); + } else { -+ Int2IntOpenHashMap map = new Int2IntOpenHashMap(); -+ this.data.storage.getAll(id -> map.addTo(id, 1)); -+ map.int2IntEntrySet().forEach(idEntry -> countConsumer.accept(this.data.palette.valueFor(idEntry.getIntKey()), idEntry.getIntValue())); ++ Int2IntOpenHashMap counts = new Int2IntOpenHashMap(); ++ this.data.storage.getAll(state -> counts.addTo(state, 1)); ++ counts.int2IntEntrySet().forEach(entry -> output.accept(this.data.palette.valueFor(entry.getIntKey()), entry.getIntValue())); + } ++ return; + } -+ + short[] counts = new short[len]; -+ + this.data.storage().getAll(i -> counts[i]++); -+ + for (int i = 0; i < counts.length; i++) { + T obj = this.data.palette().valueFor(i); -+ + if (obj != null) { -+ countConsumer.accept(obj, counts[i]); ++ output.accept(obj, counts[i]); + } } -+ // Leaves end - Leaf - Lithium - faster chunk serialization ++ // Leaves end - Gale - Lithium - faster chunk serialization } @FunctionalInterface +-- +2.50.1 (Apple Git-155) + diff --git a/leaves-server/minecraft-patches/features/0058-Skip-secondary-POI-sensor-if-absent.patch b/leaves-server/minecraft-patches/features/0056-Skip-secondary-POI-sensor-if-absent.patch similarity index 65% rename from leaves-server/minecraft-patches/features/0058-Skip-secondary-POI-sensor-if-absent.patch rename to leaves-server/minecraft-patches/features/0056-Skip-secondary-POI-sensor-if-absent.patch index cad8c8cad..a77d413fb 100644 --- a/leaves-server/minecraft-patches/features/0058-Skip-secondary-POI-sensor-if-absent.patch +++ b/leaves-server/minecraft-patches/features/0056-Skip-secondary-POI-sensor-if-absent.patch @@ -6,22 +6,22 @@ Subject: [PATCH] Skip secondary POI sensor if absent This patch is Powered by Gale(https://github.com/GaleMC/Gale) diff --git a/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java b/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java -index 39a9e9a6f6dfddbf47a7f96150ef832efe61f89e..fb5b90efabde9625ba404f754ffcc8c704641d32 100644 +index ec12508c112b1e7748a5d197b73a0d540bed10fc..4172da3fce736bf7d6be2fa5eb944df68e25e23b 100644 --- a/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java +++ b/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java @@ -22,6 +22,15 @@ public class SecondaryPoiSensor extends Sensor { @Override - protected void doTick(ServerLevel level, Villager entity) { + protected void doTick(final ServerLevel level, final Villager body) { + // Leaves start - skip secondary POI sensor if absent + if (org.leavesmc.leaves.LeavesConfig.performance.skipSecondaryPOISensorIfAbsent) { -+ var secondaryPoi = entity.getVillagerData().profession().value().secondaryPoi(); ++ var secondaryPoi = body.getVillagerData().profession().value().secondaryPoi(); + if (secondaryPoi.isEmpty()) { -+ entity.getBrain().eraseMemory(MemoryModuleType.SECONDARY_JOB_SITE); ++ body.getBrain().eraseMemory(MemoryModuleType.SECONDARY_JOB_SITE); + return; + } + } + // Leaves end - skip secondary POI sensor if absent - ResourceKey resourceKey = level.dimension(); - BlockPos blockPos = entity.blockPosition(); - List list = Lists.newArrayList(); + ResourceKey dimensionType = level.dimension(); + BlockPos center = body.blockPosition(); + List jobSites = Lists.newArrayList(); diff --git a/leaves-server/minecraft-patches/features/0059-Store-mob-counts-in-an-array.patch b/leaves-server/minecraft-patches/features/0057-Store-mob-counts-in-an-array.patch similarity index 79% rename from leaves-server/minecraft-patches/features/0059-Store-mob-counts-in-an-array.patch rename to leaves-server/minecraft-patches/features/0057-Store-mob-counts-in-an-array.patch index fb0bb74b5..294f336f2 100644 --- a/leaves-server/minecraft-patches/features/0059-Store-mob-counts-in-an-array.patch +++ b/leaves-server/minecraft-patches/features/0057-Store-mob-counts-in-an-array.patch @@ -6,27 +6,27 @@ Subject: [PATCH] Store mob counts in an array This patch is Powered by Gale(https://github.com/GaleMC/Gale) diff --git a/net/minecraft/world/level/LocalMobCapCalculator.java b/net/minecraft/world/level/LocalMobCapCalculator.java -index 9641219c190261dea0db5f95f040a705ba0a3ff9..463a86eee6a75bdd8989b5bed46f118073a4fe25 100644 +index 5b3808e6ff58d350fe3fd65fb56e8f209e1b2c93..34ff3aed2dd9c0f051680433700b19c35341dfa3 100644 --- a/net/minecraft/world/level/LocalMobCapCalculator.java +++ b/net/minecraft/world/level/LocalMobCapCalculator.java @@ -43,13 +43,26 @@ public class LocalMobCapCalculator { - static class MobCounts { + private static class MobCounts { private final Object2IntMap counts = new Object2IntOpenHashMap<>(MobCategory.values().length); + public final int[] arrCounts = new int[MobCategory.values().length]; // Leaves - store mob counts in an array - public void add(MobCategory category) { -- this.counts.computeInt(category, (key, value) -> value == null ? 1 : value + 1); + public void add(final MobCategory category) { +- this.counts.computeInt(category, (k, count) -> count == null ? 1 : count + 1); + // Leaves start - store mob counts in an array + if (!org.leavesmc.leaves.LeavesConfig.performance.storeMobCountsInArray) { -+ this.counts.computeInt(category, (group, density) -> density == null ? 1 : density + 1); ++ this.counts.computeInt(category, (k, count) -> count == null ? 1 : count + 1); + } else { + this.arrCounts[category.ordinal()]++; + } + // Leaves end - store mob counts in an array } - public boolean canSpawn(MobCategory category) { + public boolean canSpawn(final MobCategory category) { - return this.counts.getOrDefault(category, 0) < category.getMaxInstancesPerChunk(); + // Leaves start - store mob counts in an array + if (!org.leavesmc.leaves.LeavesConfig.performance.storeMobCountsInArray) { diff --git a/leaves-server/minecraft-patches/features/0058-Optimize-noise-generation.patch b/leaves-server/minecraft-patches/features/0058-Optimize-noise-generation.patch new file mode 100644 index 000000000..3a9ed8da4 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0058-Optimize-noise-generation.patch @@ -0,0 +1,322 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Tue, 18 Jul 2023 15:27:19 +0800 +Subject: [PATCH] Optimize noise generation + + +diff --git a/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java b/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java +index ef8f2a00945a3d240a23ca73f138960ee0fe8742..d31fd89d8127b898486a8a455115498756900c64 100644 +--- a/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java ++++ b/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java +@@ -11,6 +11,27 @@ public final class ImprovedNoise { + public final double yo; + public final double zo; + ++ // Leaves start - optimize noise generation ++ private static final double[] FLAT_SIMPLEX_GRAD = new double[]{ ++ 1, 1, 0, 0, ++ -1, 1, 0, 0, ++ 1, -1, 0, 0, ++ -1, -1, 0, 0, ++ 1, 0, 1, 0, ++ -1, 0, 1, 0, ++ 1, 0, -1, 0, ++ -1, 0, -1, 0, ++ 0, 1, 1, 0, ++ 0, -1, 1, 0, ++ 0, 1, -1, 0, ++ 0, -1, -1, 0, ++ 1, 1, 0, 0, ++ 0, -1, 1, 0, ++ -1, 1, 0, 0, ++ 0, -1, -1, 0, ++ }; ++ // Leaves end - optimize noise generation ++ + public ImprovedNoise(final RandomSource random) { + this.xo = random.nextDouble() * 256.0; + this.yo = random.nextDouble() * 256.0; +@@ -38,40 +59,78 @@ public final class ImprovedNoise { + double x = _x + this.xo; + double y = _y + this.yo; + double z = _z + this.zo; +- int xf = Mth.floor(x); +- int yf = Mth.floor(y); +- int zf = Mth.floor(z); +- double xr = x - xf; +- double yr = y - yf; +- double zr = z - zf; +- double yrFudge; +- if (yScale != 0.0) { +- double fudgeLimit; +- if (yFudge >= 0.0 && yFudge < yr) { +- fudgeLimit = yFudge; ++ // Leaves start - optimize noise generation ++ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { ++ int xf = Mth.floor(x); ++ int yf = Mth.floor(y); ++ int zf = Mth.floor(z); ++ double xr = x - xf; ++ double yr = y - yf; ++ double zr = z - zf; ++ double yrFudge; ++ if (yScale != 0.0) { ++ double fudgeLimit; ++ if (yFudge >= 0.0 && yFudge < yr) { ++ fudgeLimit = yFudge; ++ } else { ++ fudgeLimit = yr; ++ } ++ ++ yrFudge = Mth.floor(fudgeLimit / yScale + 1.0E-7F) * yScale; + } else { +- fudgeLimit = yr; ++ yrFudge = 0.0; + } + +- yrFudge = Mth.floor(fudgeLimit / yScale + 1.0E-7F) * yScale; ++ return this.sampleAndLerp(xf, yf, zf, xr, yr - yrFudge, zr, yr); + } else { +- yrFudge = 0.0; +- } ++ double xf = Math.floor(x); ++ double yf = Math.floor(y); ++ double zf = Math.floor(z); ++ double xr = x - xf; ++ double yr = y - yf; ++ double zr = z - zf; ++ double yrFudge; ++ if (yScale != 0.0) { ++ double fudgeLimit; ++ if (yFudge >= 0.0 && yFudge < yr) { ++ fudgeLimit = yFudge; ++ } else { ++ fudgeLimit = yr; ++ } ++ ++ yrFudge = Math.floor(fudgeLimit / yScale + 1.0E-7F) * yScale; ++ } else { ++ yrFudge = 0.0; ++ } + +- return this.sampleAndLerp(xf, yf, zf, xr, yr - yrFudge, zr, yr); ++ return this.sampleAndLerp((int) xf, (int) yf, (int) zf, xr, yr - yrFudge, zr, yr); ++ } ++ // Leaves end - optimize noise generation + } + + public double noiseWithDerivative(final double _x, final double _y, final double _z, final double[] derivativeOut) { + double x = _x + this.xo; + double y = _y + this.yo; + double z = _z + this.zo; +- int xf = Mth.floor(x); +- int yf = Mth.floor(y); +- int zf = Mth.floor(z); +- double xr = x - xf; +- double yr = y - yf; +- double zr = z - zf; +- return this.sampleWithDerivative(xf, yf, zf, xr, yr, zr, derivativeOut); ++ // Leaves start - optimize noise generation ++ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { ++ int xf = Mth.floor(x); ++ int yf = Mth.floor(y); ++ int zf = Mth.floor(z); ++ double xr = x - xf; ++ double yr = y - yf; ++ double zr = z - zf; ++ return this.sampleWithDerivative(xf, yf, zf, xr, yr, zr, derivativeOut); ++ } else { ++ double xf = Math.floor(x); ++ double yf = Math.floor(y); ++ double zf = Math.floor(z); ++ double xr = x - xf; ++ double yr = y - yf; ++ double zr = z - zf; ++ return this.sampleWithDerivative((int) xf, (int) yf, (int) zf, xr, yr, zr, derivativeOut); ++ } ++ // Leaves end - optimize noise generation + } + + private static double gradDot(final int hash, final double x, final double y, final double z) { +@@ -83,24 +142,90 @@ public final class ImprovedNoise { + } + + private double sampleAndLerp(final int x, final int y, final int z, final double xr, final double yr, final double zr, final double yrOriginal) { +- int x0 = this.p(x); +- int x1 = this.p(x + 1); +- int xy00 = this.p(x0 + y); +- int xy01 = this.p(x0 + y + 1); +- int xy10 = this.p(x1 + y); +- int xy11 = this.p(x1 + y + 1); +- double d000 = gradDot(this.p(xy00 + z), xr, yr, zr); +- double d100 = gradDot(this.p(xy10 + z), xr - 1.0, yr, zr); +- double d010 = gradDot(this.p(xy01 + z), xr, yr - 1.0, zr); +- double d110 = gradDot(this.p(xy11 + z), xr - 1.0, yr - 1.0, zr); +- double d001 = gradDot(this.p(xy00 + z + 1), xr, yr, zr - 1.0); +- double d101 = gradDot(this.p(xy10 + z + 1), xr - 1.0, yr, zr - 1.0); +- double d011 = gradDot(this.p(xy01 + z + 1), xr, yr - 1.0, zr - 1.0); +- double d111 = gradDot(this.p(xy11 + z + 1), xr - 1.0, yr - 1.0, zr - 1.0); +- double xAlpha = Mth.smoothstep(xr); +- double yAlpha = Mth.smoothstep(yrOriginal); +- double zAlpha = Mth.smoothstep(zr); +- return Mth.lerp3(xAlpha, yAlpha, zAlpha, d000, d100, d010, d110, d001, d101, d011, d111); ++ // Leaves start - optimize noise generation ++ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { ++ int x0 = this.p(x); ++ int x1 = this.p(x + 1); ++ int xy00 = this.p(x0 + y); ++ int xy01 = this.p(x0 + y + 1); ++ int xy10 = this.p(x1 + y); ++ int xy11 = this.p(x1 + y + 1); ++ double d000 = gradDot(this.p(xy00 + z), xr, yr, zr); ++ double d100 = gradDot(this.p(xy10 + z), xr - 1.0, yr, zr); ++ double d010 = gradDot(this.p(xy01 + z), xr, yr - 1.0, zr); ++ double d110 = gradDot(this.p(xy11 + z), xr - 1.0, yr - 1.0, zr); ++ double d001 = gradDot(this.p(xy00 + z + 1), xr, yr, zr - 1.0); ++ double d101 = gradDot(this.p(xy10 + z + 1), xr - 1.0, yr, zr - 1.0); ++ double d011 = gradDot(this.p(xy01 + z + 1), xr, yr - 1.0, zr - 1.0); ++ double d111 = gradDot(this.p(xy11 + z + 1), xr - 1.0, yr - 1.0, zr - 1.0); ++ double xAlpha = Mth.smoothstep(xr); ++ double yAlpha = Mth.smoothstep(yrOriginal); ++ double zAlpha = Mth.smoothstep(zr); ++ return Mth.lerp3(xAlpha, yAlpha, zAlpha, d000, d100, d010, d110, d001, d101, d011, d111); ++ } else { ++ final int var0 = x & 0xFF; ++ final int var1 = (x + 1) & 0xFF; ++ final int var2 = this.p[var0] & 0xFF; ++ final int var3 = this.p[var1] & 0xFF; ++ final int var4 = (var2 + y) & 0xFF; ++ final int var5 = (var3 + y) & 0xFF; ++ final int var6 = (var2 + y + 1) & 0xFF; ++ final int var7 = (var3 + y + 1) & 0xFF; ++ final int var8 = this.p[var4] & 0xFF; ++ final int var9 = this.p[var5] & 0xFF; ++ final int var10 = this.p[var6] & 0xFF; ++ final int var11 = this.p[var7] & 0xFF; ++ ++ final int var12 = (var8 + z) & 0xFF; ++ final int var13 = (var9 + z) & 0xFF; ++ final int var14 = (var10 + z) & 0xFF; ++ final int var15 = (var11 + z) & 0xFF; ++ final int var16 = (var8 + z + 1) & 0xFF; ++ final int var17 = (var9 + z + 1) & 0xFF; ++ final int var18 = (var10 + z + 1) & 0xFF; ++ final int var19 = (var11 + z + 1) & 0xFF; ++ final int var20 = (this.p[var12] & 15) << 2; ++ final int var21 = (this.p[var13] & 15) << 2; ++ final int var22 = (this.p[var14] & 15) << 2; ++ final int var23 = (this.p[var15] & 15) << 2; ++ final int var24 = (this.p[var16] & 15) << 2; ++ final int var25 = (this.p[var17] & 15) << 2; ++ final int var26 = (this.p[var18] & 15) << 2; ++ final int var27 = (this.p[var19] & 15) << 2; ++ final double var60 = xr - 1.0; ++ final double var61 = yr - 1.0; ++ final double var62 = zr - 1.0; ++ final double var87 = FLAT_SIMPLEX_GRAD[(var20) | 0] * xr + FLAT_SIMPLEX_GRAD[(var20) | 1] * yr + FLAT_SIMPLEX_GRAD[(var20) | 2] * zr; ++ final double var88 = FLAT_SIMPLEX_GRAD[(var21) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var21) | 1] * yr + FLAT_SIMPLEX_GRAD[(var21) | 2] * zr; ++ final double var89 = FLAT_SIMPLEX_GRAD[(var22) | 0] * xr + FLAT_SIMPLEX_GRAD[(var22) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var22) | 2] * zr; ++ final double var90 = FLAT_SIMPLEX_GRAD[(var23) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var23) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var23) | 2] * zr; ++ final double var91 = FLAT_SIMPLEX_GRAD[(var24) | 0] * xr + FLAT_SIMPLEX_GRAD[(var24) | 1] * yr + FLAT_SIMPLEX_GRAD[(var24) | 2] * var62; ++ final double var92 = FLAT_SIMPLEX_GRAD[(var25) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var25) | 1] * yr + FLAT_SIMPLEX_GRAD[(var25) | 2] * var62; ++ final double var93 = FLAT_SIMPLEX_GRAD[(var26) | 0] * xr + FLAT_SIMPLEX_GRAD[(var26) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var26) | 2] * var62; ++ final double var94 = FLAT_SIMPLEX_GRAD[(var27) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var27) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var27) | 2] * var62; ++ ++ final double var95 = xr * 6.0 - 15.0; ++ final double var96 = yrOriginal * 6.0 - 15.0; ++ final double var97 = zr * 6.0 - 15.0; ++ final double var98 = xr * var95 + 10.0; ++ final double var99 = yrOriginal * var96 + 10.0; ++ final double var100 = zr * var97 + 10.0; ++ final double var101 = xr * xr * xr * var98; ++ final double var102 = yrOriginal * yrOriginal * yrOriginal * var99; ++ final double var103 = zr * zr * zr * var100; ++ ++ final double var113 = var87 + var101 * (var88 - var87); ++ final double var114 = var93 + var101 * (var94 - var93); ++ final double var115 = var91 + var101 * (var92 - var91); ++ final double var116 = var89 + var101 * (var90 - var89); ++ final double var117 = var114 - var115; ++ final double var118 = var102 * (var116 - var113); ++ final double var119 = var102 * var117; ++ final double var120 = var113 + var118; ++ final double var121 = var115 + var119; ++ return var120 + (var103 * (var121 - var120)); ++ } ++ // Leaves end - optimize noise generation + } + + private double sampleWithDerivative(final int x, final int y, final int z, final double xr, final double yr, final double zr, final double[] derivativeOut) { +diff --git a/net/minecraft/world/level/levelgen/synth/PerlinNoise.java b/net/minecraft/world/level/levelgen/synth/PerlinNoise.java +index 9f9836f6bf15c5d3aa283c2cbcf6d29202ff22bb..81b87cdf97171c3deeff9ec1573b11b4d53a9ce9 100644 +--- a/net/minecraft/world/level/levelgen/synth/PerlinNoise.java ++++ b/net/minecraft/world/level/levelgen/synth/PerlinNoise.java +@@ -26,6 +26,10 @@ public class PerlinNoise { + private final double lowestFreqValueFactor; + private final double lowestFreqInputFactor; + private final double maxValue; ++ // Leaves start - optimize noise generation ++ private final int octaveSamplersCount; ++ private final double[] amplitudesArray; ++ // Leaves end - optimize noise generation + + @Deprecated + public static PerlinNoise createLegacyForBlendedNoise(final RandomSource random, final IntStream octaves) { +@@ -127,6 +131,10 @@ public class PerlinNoise { + this.lowestFreqInputFactor = Math.pow(2.0, -zeroOctaveIndex); + this.lowestFreqValueFactor = Math.pow(2.0, octaves - 1) / (Math.pow(2.0, octaves) - 1.0); + this.maxValue = this.edgeValue(2.0); ++ // Leaves start - optimize noise generation ++ this.octaveSamplersCount = this.noiseLevels.length; ++ this.amplitudesArray = this.amplitudes.toDoubleArray(); ++ // Leaves end - optimize noise generation + } + + protected double maxValue() { +@@ -138,7 +146,30 @@ public class PerlinNoise { + } + + public double getValue(final double x, final double y, final double z) { +- return this.getValue(x, y, z, 0.0, 0.0); ++ // Leaves start - optimize noise generation ++ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { ++ return this.getValue(x, y, z, 0.0, 0.0); ++ } else { ++ double d = 0.0; ++ double e = this.lowestFreqInputFactor; ++ double f = this.lowestFreqValueFactor; ++ ++ for (int i = 0; i < this.octaveSamplersCount; ++i) { ++ ImprovedNoise perlinNoiseSampler = this.noiseLevels[i]; ++ if (perlinNoiseSampler != null) { ++ @SuppressWarnings("deprecation") ++ double g = perlinNoiseSampler.noise( ++ wrap(x * e), wrap(y * e), wrap(z * e), 0.0, 0.0 ++ ); ++ d += this.amplitudesArray[i] * g * f; ++ } ++ ++ e *= 2.0; ++ f /= 2.0; ++ } ++ return d; ++ } ++ // Leaves end - optimize noise generation + } + + @Deprecated +@@ -186,7 +217,13 @@ public class PerlinNoise { + } + + public static double wrap(final double x) { +- return x - Mth.lfloor(x / 3.3554432E7 + 0.5) * 3.3554432E7; ++ // Leaves start - optimize noise generation ++ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { ++ return x - Mth.lfloor(x / 3.3554432E7 + 0.5) * 3.3554432E7; ++ } else { ++ return x - Math.floor(x / 3.3554432E7 + 0.5) * 3.3554432E7; ++ } ++ // Leaves end - optimize noise generation + } + + protected int firstOctave() { diff --git a/leaves-server/minecraft-patches/features/0059-Optimize-sun-burn-tick.patch b/leaves-server/minecraft-patches/features/0059-Optimize-sun-burn-tick.patch new file mode 100644 index 000000000..d40553e56 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0059-Optimize-sun-burn-tick.patch @@ -0,0 +1,65 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Thu, 20 Jul 2023 15:18:50 +0800 +Subject: [PATCH] Optimize sun burn tick + + +diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java +index 8e62879ca0e2bf4913295bbad127f8cf314654cd..85a06111cecde93ca6bfecd4d8d3e0323684ae08 100644 +--- a/net/minecraft/world/entity/Entity.java ++++ b/net/minecraft/world/entity/Entity.java +@@ -2213,11 +2213,23 @@ public abstract class Entity + + @Deprecated + public float getLightLevelDependentMagicValue() { ++ // Leaves start - optimize sun burn tick ++ if (org.leavesmc.leaves.LeavesConfig.performance.optimizeSunBurnTick) { ++ return this.getLightLevelDependentMagicValue(BlockPos.containing(this.getX(), this.getEyeY(), this.getZ())); ++ } ++ // Leaves end - optimize sun burn tick + return this.level().hasChunkAt(this.getBlockX(), this.getBlockZ()) + ? this.level().getLightLevelDependentMagicValue(BlockPos.containing(this.getX(), this.getEyeY(), this.getZ())) + : 0.0F; + } + ++ // Leaves start - optimize sun burn tick ++ @Deprecated ++ public float getLightLevelDependentMagicValue(final BlockPos pos) { ++ return this.level().hasChunkAt(this.getBlockX(), this.getBlockZ()) ? this.level.getLightLevelDependentMagicValue(pos) : 0.0F; ++ } ++ // Leaves end - optimize sun burn tick ++ + public void absSnapTo(final double x, final double y, final double z, final float yRot, final float xRot) { + this.absSnapTo(x, y, z); + this.absSnapRotationTo(yRot, xRot); +diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java +index 3bbf67d96f687b7275a4e496f0d25018ff4890c7..85cc3228091ba769e79297c924549a7daaf1fff8 100644 +--- a/net/minecraft/world/entity/Mob.java ++++ b/net/minecraft/world/entity/Mob.java +@@ -592,8 +592,26 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs + } + } + ++ // Leaves start - optimize sun burn tick ++ private @Nullable BlockPos cachedSunBurnEyeBlockPos; ++ private net.minecraft.world.phys.@Nullable Vec3 cachedSunBurnPosition; ++ // Leaves end - optimize sun burn tick ++ + public boolean isSunBurnTick() { + if (!this.level().isClientSide() && this.level().environmentAttributes().getValue(EnvironmentAttributes.MONSTERS_BURN, this.position())) { ++ // Leaves start - optimize sun burn tick ++ if (org.leavesmc.leaves.LeavesConfig.performance.optimizeSunBurnTick) { ++ if (this.cachedSunBurnEyeBlockPos == null || !this.position().equals(this.cachedSunBurnPosition)) { ++ this.cachedSunBurnEyeBlockPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); ++ this.cachedSunBurnPosition = this.position(); ++ } ++ float brightness = this.getLightLevelDependentMagicValue(this.cachedSunBurnEyeBlockPos); ++ if (brightness <= 0.5F) return false; ++ if (this.random.nextFloat() * 30.0F >= (brightness - 0.4F) * 2.0F) return false; ++ boolean isInNonBurnableBlock2 = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; ++ return !isInNonBurnableBlock2 && this.level().canSeeSky(this.cachedSunBurnEyeBlockPos); ++ } ++ // Leaves end - optimize sun burn tick + float br = this.getLightLevelDependentMagicValue(); + BlockPos roundedPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); + boolean isInNonBurnableBlock = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; diff --git a/leaves-server/minecraft-patches/features/0060-Optimize-noise-generation.patch b/leaves-server/minecraft-patches/features/0060-Optimize-noise-generation.patch deleted file mode 100644 index c873302f8..000000000 --- a/leaves-server/minecraft-patches/features/0060-Optimize-noise-generation.patch +++ /dev/null @@ -1,323 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Tue, 18 Jul 2023 15:27:19 +0800 -Subject: [PATCH] Optimize noise generation - -This patch is Powered by Gale(https://github.com/GaleMC/Gale) - -diff --git a/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java b/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java -index fb11a2eea540d55e50eab59f9857ca5d99f556f8..a54ad0b2731b83ee2e3de09972c62992fbea0ff6 100644 ---- a/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java -+++ b/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java -@@ -11,6 +11,27 @@ public final class ImprovedNoise { - public final double yo; - public final double zo; - -+ // Leaves start - optimize noise generation -+ private static final double[] FLAT_SIMPLEX_GRAD = new double[]{ -+ 1, 1, 0, 0, -+ -1, 1, 0, 0, -+ 1, -1, 0, 0, -+ -1, -1, 0, 0, -+ 1, 0, 1, 0, -+ -1, 0, 1, 0, -+ 1, 0, -1, 0, -+ -1, 0, -1, 0, -+ 0, 1, 1, 0, -+ 0, -1, 1, 0, -+ 0, 1, -1, 0, -+ 0, -1, -1, 0, -+ 1, 1, 0, 0, -+ 0, -1, 1, 0, -+ -1, 1, 0, 0, -+ 0, -1, -1, 0, -+ }; -+ // Leaves end - optimize noise generation -+ - public ImprovedNoise(RandomSource random) { - this.xo = random.nextDouble() * 256.0; - this.yo = random.nextDouble() * 256.0; -@@ -38,40 +59,78 @@ public final class ImprovedNoise { - double d = x + this.xo; - double d1 = y + this.yo; - double d2 = z + this.zo; -- int floor = Mth.floor(d); -- int floor1 = Mth.floor(d1); -- int floor2 = Mth.floor(d2); -- double d3 = d - floor; -- double d4 = d1 - floor1; -- double d5 = d2 - floor2; -- double d7; -- if (yScale != 0.0) { -- double d6; -- if (yMax >= 0.0 && yMax < d4) { -- d6 = yMax; -+ // Leaves start - optimize noise generation -+ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { -+ int floor = Mth.floor(d); -+ int floor1 = Mth.floor(d1); -+ int floor2 = Mth.floor(d2); -+ double d3 = d - floor; -+ double d4 = d1 - floor1; -+ double d5 = d2 - floor2; -+ double d7; -+ if (yScale != 0.0) { -+ double d6; -+ if (yMax >= 0.0 && yMax < d4) { -+ d6 = yMax; -+ } else { -+ d6 = d4; -+ } -+ -+ d7 = Mth.floor(d6 / yScale + 1.0E-7F) * yScale; - } else { -- d6 = d4; -+ d7 = 0.0; - } - -- d7 = Mth.floor(d6 / yScale + 1.0E-7F) * yScale; -+ return this.sampleAndLerp(floor, floor1, floor2, d3, d4 - d7, d5, d4); - } else { -- d7 = 0.0; -- } -+ double floor = Math.floor(d); -+ double floor1 = Math.floor(d1); -+ double floor2 = Math.floor(d2); -+ double d3 = d - floor; -+ double d4 = d1 - floor1; -+ double d5 = d2 - floor2; -+ double d7; -+ if (yScale != 0.0) { -+ double d6; -+ if (yMax >= 0.0 && yMax < d4) { -+ d6 = yMax; -+ } else { -+ d6 = d4; -+ } -+ -+ d7 = Math.floor(d6 / yScale + 1.0E-7F) * yScale; -+ } else { -+ d7 = 0.0; -+ } - -- return this.sampleAndLerp(floor, floor1, floor2, d3, d4 - d7, d5, d4); -+ return this.sampleAndLerp((int) floor, (int) floor1, (int) floor2, d3, d4 - d7, d5, d4); -+ } -+ // Leaves end - optimize noise generation - } - - public double noiseWithDerivative(double x, double y, double z, double[] values) { - double d = x + this.xo; - double d1 = y + this.yo; - double d2 = z + this.zo; -- int floor = Mth.floor(d); -- int floor1 = Mth.floor(d1); -- int floor2 = Mth.floor(d2); -- double d3 = d - floor; -- double d4 = d1 - floor1; -- double d5 = d2 - floor2; -- return this.sampleWithDerivative(floor, floor1, floor2, d3, d4, d5, values); -+ // Leaves start - optimize noise generation -+ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { -+ int floor = Mth.floor(d); -+ int floor1 = Mth.floor(d1); -+ int floor2 = Mth.floor(d2); -+ double d3 = d - floor; -+ double d4 = d1 - floor1; -+ double d5 = d2 - floor2; -+ return this.sampleWithDerivative(floor, floor1, floor2, d3, d4, d5, values); -+ } else { -+ double floor = Math.floor(d); -+ double floor1 = Math.floor(d1); -+ double floor2 = Math.floor(d2); -+ double d3 = d - floor; -+ double d4 = d1 - floor1; -+ double d5 = d2 - floor2; -+ return this.sampleWithDerivative((int) floor, (int) floor1, (int) floor2, d3, d4, d5, values); -+ } -+ // Leaves end - optimize noise generation - } - - private static double gradDot(int gradIndex, double xFactor, double yFactor, double zFactor) { -@@ -83,24 +142,90 @@ public final class ImprovedNoise { - } - - private double sampleAndLerp(int gridX, int gridY, int gridZ, double deltaX, double weirdDeltaY, double deltaZ, double deltaY) { -- int i = this.p(gridX); -- int i1 = this.p(gridX + 1); -- int i2 = this.p(i + gridY); -- int i3 = this.p(i + gridY + 1); -- int i4 = this.p(i1 + gridY); -- int i5 = this.p(i1 + gridY + 1); -- double d = gradDot(this.p(i2 + gridZ), deltaX, weirdDeltaY, deltaZ); -- double d1 = gradDot(this.p(i4 + gridZ), deltaX - 1.0, weirdDeltaY, deltaZ); -- double d2 = gradDot(this.p(i3 + gridZ), deltaX, weirdDeltaY - 1.0, deltaZ); -- double d3 = gradDot(this.p(i5 + gridZ), deltaX - 1.0, weirdDeltaY - 1.0, deltaZ); -- double d4 = gradDot(this.p(i2 + gridZ + 1), deltaX, weirdDeltaY, deltaZ - 1.0); -- double d5 = gradDot(this.p(i4 + gridZ + 1), deltaX - 1.0, weirdDeltaY, deltaZ - 1.0); -- double d6 = gradDot(this.p(i3 + gridZ + 1), deltaX, weirdDeltaY - 1.0, deltaZ - 1.0); -- double d7 = gradDot(this.p(i5 + gridZ + 1), deltaX - 1.0, weirdDeltaY - 1.0, deltaZ - 1.0); -- double d8 = Mth.smoothstep(deltaX); -- double d9 = Mth.smoothstep(deltaY); -- double d10 = Mth.smoothstep(deltaZ); -- return Mth.lerp3(d8, d9, d10, d, d1, d2, d3, d4, d5, d6, d7); -+ // Leaves start - optimize noise generation -+ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { -+ int i = this.p(gridX); -+ int i1 = this.p(gridX + 1); -+ int i2 = this.p(i + gridY); -+ int i3 = this.p(i + gridY + 1); -+ int i4 = this.p(i1 + gridY); -+ int i5 = this.p(i1 + gridY + 1); -+ double d = gradDot(this.p(i2 + gridZ), deltaX, weirdDeltaY, deltaZ); -+ double d1 = gradDot(this.p(i4 + gridZ), deltaX - 1.0, weirdDeltaY, deltaZ); -+ double d2 = gradDot(this.p(i3 + gridZ), deltaX, weirdDeltaY - 1.0, deltaZ); -+ double d3 = gradDot(this.p(i5 + gridZ), deltaX - 1.0, weirdDeltaY - 1.0, deltaZ); -+ double d4 = gradDot(this.p(i2 + gridZ + 1), deltaX, weirdDeltaY, deltaZ - 1.0); -+ double d5 = gradDot(this.p(i4 + gridZ + 1), deltaX - 1.0, weirdDeltaY, deltaZ - 1.0); -+ double d6 = gradDot(this.p(i3 + gridZ + 1), deltaX, weirdDeltaY - 1.0, deltaZ - 1.0); -+ double d7 = gradDot(this.p(i5 + gridZ + 1), deltaX - 1.0, weirdDeltaY - 1.0, deltaZ - 1.0); -+ double d8 = Mth.smoothstep(deltaX); -+ double d9 = Mth.smoothstep(deltaY); -+ double d10 = Mth.smoothstep(deltaZ); -+ return Mth.lerp3(d8, d9, d10, d, d1, d2, d3, d4, d5, d6, d7); -+ } else { -+ final int var0 = gridX & 0xFF; -+ final int var1 = (gridX + 1) & 0xFF; -+ final int var2 = this.p[var0] & 0xFF; -+ final int var3 = this.p[var1] & 0xFF; -+ final int var4 = (var2 + gridY) & 0xFF; -+ final int var5 = (var3 + gridY) & 0xFF; -+ final int var6 = (var2 + gridY + 1) & 0xFF; -+ final int var7 = (var3 + gridY + 1) & 0xFF; -+ final int var8 = this.p[var4] & 0xFF; -+ final int var9 = this.p[var5] & 0xFF; -+ final int var10 = this.p[var6] & 0xFF; -+ final int var11 = this.p[var7] & 0xFF; -+ -+ final int var12 = (var8 + gridZ) & 0xFF; -+ final int var13 = (var9 + gridZ) & 0xFF; -+ final int var14 = (var10 + gridZ) & 0xFF; -+ final int var15 = (var11 + gridZ) & 0xFF; -+ final int var16 = (var8 + gridZ + 1) & 0xFF; -+ final int var17 = (var9 + gridZ + 1) & 0xFF; -+ final int var18 = (var10 + gridZ + 1) & 0xFF; -+ final int var19 = (var11 + gridZ + 1) & 0xFF; -+ final int var20 = (this.p[var12] & 15) << 2; -+ final int var21 = (this.p[var13] & 15) << 2; -+ final int var22 = (this.p[var14] & 15) << 2; -+ final int var23 = (this.p[var15] & 15) << 2; -+ final int var24 = (this.p[var16] & 15) << 2; -+ final int var25 = (this.p[var17] & 15) << 2; -+ final int var26 = (this.p[var18] & 15) << 2; -+ final int var27 = (this.p[var19] & 15) << 2; -+ final double var60 = deltaX - 1.0; -+ final double var61 = weirdDeltaY - 1.0; -+ final double var62 = deltaZ - 1.0; -+ final double var87 = FLAT_SIMPLEX_GRAD[(var20) | 0] * deltaX + FLAT_SIMPLEX_GRAD[(var20) | 1] * weirdDeltaY + FLAT_SIMPLEX_GRAD[(var20) | 2] * deltaZ; -+ final double var88 = FLAT_SIMPLEX_GRAD[(var21) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var21) | 1] * weirdDeltaY + FLAT_SIMPLEX_GRAD[(var21) | 2] * deltaZ; -+ final double var89 = FLAT_SIMPLEX_GRAD[(var22) | 0] * deltaX + FLAT_SIMPLEX_GRAD[(var22) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var22) | 2] * deltaZ; -+ final double var90 = FLAT_SIMPLEX_GRAD[(var23) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var23) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var23) | 2] * deltaZ; -+ final double var91 = FLAT_SIMPLEX_GRAD[(var24) | 0] * deltaX + FLAT_SIMPLEX_GRAD[(var24) | 1] * weirdDeltaY + FLAT_SIMPLEX_GRAD[(var24) | 2] * var62; -+ final double var92 = FLAT_SIMPLEX_GRAD[(var25) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var25) | 1] * weirdDeltaY + FLAT_SIMPLEX_GRAD[(var25) | 2] * var62; -+ final double var93 = FLAT_SIMPLEX_GRAD[(var26) | 0] * deltaX + FLAT_SIMPLEX_GRAD[(var26) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var26) | 2] * var62; -+ final double var94 = FLAT_SIMPLEX_GRAD[(var27) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var27) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var27) | 2] * var62; -+ -+ final double var95 = deltaX * 6.0 - 15.0; -+ final double var96 = deltaY * 6.0 - 15.0; -+ final double var97 = deltaZ * 6.0 - 15.0; -+ final double var98 = deltaX * var95 + 10.0; -+ final double var99 = deltaY * var96 + 10.0; -+ final double var100 = deltaZ * var97 + 10.0; -+ final double var101 = deltaX * deltaX * deltaX * var98; -+ final double var102 = deltaY * deltaY * deltaY * var99; -+ final double var103 = deltaZ * deltaZ * deltaZ * var100; -+ -+ final double var113 = var87 + var101 * (var88 - var87); -+ final double var114 = var93 + var101 * (var94 - var93); -+ final double var115 = var91 + var101 * (var92 - var91); -+ final double var116 = var89 + var101 * (var90 - var89); -+ final double var117 = var114 - var115; -+ final double var118 = var102 * (var116 - var113); -+ final double var119 = var102 * var117; -+ final double var120 = var113 + var118; -+ final double var121 = var115 + var119; -+ return var120 + (var103 * (var121 - var120)); -+ } -+ // Leaves end - optimize noise generation - } - - private double sampleWithDerivative(int gridX, int gridY, int gridZ, double deltaX, double deltaY, double deltaZ, double[] noiseValues) { -diff --git a/net/minecraft/world/level/levelgen/synth/PerlinNoise.java b/net/minecraft/world/level/levelgen/synth/PerlinNoise.java -index 4c5268704af9b6a88c00878459254851c0592da1..3aff39b7bb9dca4fd357bd3ee69a4c4cb3e5f380 100644 ---- a/net/minecraft/world/level/levelgen/synth/PerlinNoise.java -+++ b/net/minecraft/world/level/levelgen/synth/PerlinNoise.java -@@ -26,6 +26,10 @@ public class PerlinNoise { - private final double lowestFreqValueFactor; - private final double lowestFreqInputFactor; - private final double maxValue; -+ // Leaves start - optimize noise generation -+ private final int octaveSamplersCount; -+ private final double [] amplitudesArray; -+ // Leaves end - optimize noise generation - - @Deprecated - public static PerlinNoise createLegacyForBlendedNoise(RandomSource random, IntStream octaves) { -@@ -127,6 +131,10 @@ public class PerlinNoise { - this.lowestFreqInputFactor = Math.pow(2.0, -i); - this.lowestFreqValueFactor = Math.pow(2.0, size - 1) / (Math.pow(2.0, size) - 1.0); - this.maxValue = this.edgeValue(2.0); -+ // Leaves start - optimize noise generation -+ this.octaveSamplersCount = this.noiseLevels.length; -+ this.amplitudesArray = this.amplitudes.toDoubleArray(); -+ // Leaves end - optimize noise generation - } - - protected double maxValue() { -@@ -138,7 +146,30 @@ public class PerlinNoise { - } - - public double getValue(double x, double y, double z) { -- return this.getValue(x, y, z, 0.0, 0.0, false); -+ // Leaves start - optimize noise generation -+ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { -+ return this.getValue(x, y, z, 0.0, 0.0, false); -+ } else { -+ double d = 0.0; -+ double e = this.lowestFreqInputFactor; -+ double f = this.lowestFreqValueFactor; -+ -+ for (int i = 0; i < this.octaveSamplersCount; ++i) { -+ ImprovedNoise perlinNoiseSampler = this.noiseLevels[i]; -+ if (perlinNoiseSampler != null) { -+ @SuppressWarnings("deprecation") -+ double g = perlinNoiseSampler.noise( -+ wrap(x * e), wrap(y * e), wrap(z * e), 0.0, 0.0 -+ ); -+ d += this.amplitudesArray[i] * g * f; -+ } -+ -+ e *= 2.0; -+ f /= 2.0; -+ } -+ return d; -+ } -+ // Leaves end - optimize noise generation - } - - @Deprecated -@@ -186,7 +217,13 @@ public class PerlinNoise { - } - - public static double wrap(double value) { -- return value - Mth.lfloor(value / 3.3554432E7 + 0.5) * 3.3554432E7; -+ // Leaves start - optimize noise generation -+ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeNoiseGeneration) { -+ return value - Mth.lfloor(value / 3.3554432E7 + 0.5) * 3.3554432E7; -+ } else { -+ return value - Math.floor(value / 3.3554432E7 + 0.5) * 3.3554432E7; -+ } -+ // Leaves end - optimize noise generation - } - - protected int firstOctave() { diff --git a/leaves-server/minecraft-patches/features/0062-Reduce-lambda-and-Optional-allocation-in-EntityBased.patch b/leaves-server/minecraft-patches/features/0060-Reduce-lambda-and-Optional-allocation-in-EntityBased.patch similarity index 66% rename from leaves-server/minecraft-patches/features/0062-Reduce-lambda-and-Optional-allocation-in-EntityBased.patch rename to leaves-server/minecraft-patches/features/0060-Reduce-lambda-and-Optional-allocation-in-EntityBased.patch index 6bb91779a..d2a2f3b97 100644 --- a/leaves-server/minecraft-patches/features/0062-Reduce-lambda-and-Optional-allocation-in-EntityBased.patch +++ b/leaves-server/minecraft-patches/features/0060-Reduce-lambda-and-Optional-allocation-in-EntityBased.patch @@ -7,29 +7,31 @@ Subject: [PATCH] Reduce lambda and Optional allocation in This patch is Powered by Gale(https://github.com/GaleMC/Gale) diff --git a/net/minecraft/world/level/EntityBasedExplosionDamageCalculator.java b/net/minecraft/world/level/EntityBasedExplosionDamageCalculator.java -index b1ee207527d1bf43bcc1c9d2c2a1ae2ad7993371..4bceb069ecf2e4137940ff16128ca6b5a17524fb 100644 +index 356a3a0dda09af007c3fbddfe360b38f4d7204ce..ce44b4445299ca5f1299a94c106cea413ad6c858 100644 --- a/net/minecraft/world/level/EntityBasedExplosionDamageCalculator.java +++ b/net/minecraft/world/level/EntityBasedExplosionDamageCalculator.java -@@ -15,8 +15,20 @@ public class EntityBasedExplosionDamageCalculator extends ExplosionDamageCalcula - - @Override - public Optional getBlockExplosionResistance(Explosion explosion, BlockGetter level, BlockPos pos, BlockState state, FluidState fluid) { -- return super.getBlockExplosionResistance(explosion, level, pos, state, fluid) -- .map(resistance -> this.source.getBlockExplosionResistance(explosion, level, pos, state, fluid, resistance)); +@@ -17,8 +17,22 @@ public class EntityBasedExplosionDamageCalculator extends ExplosionDamageCalcula + public Optional getBlockExplosionResistance( + final Explosion explosion, final BlockGetter level, final BlockPos pos, final BlockState block, final FluidState fluid + ) { +- return super.getBlockExplosionResistance(explosion, level, pos, block, fluid) +- .map(resistance -> this.source.getBlockExplosionResistance(explosion, level, pos, block, fluid, resistance)); ++ // Leaves start - reduce lambda and Optional allocation + if (!org.leavesmc.leaves.LeavesConfig.performance.remove.damageLambda) { -+ return super.getBlockExplosionResistance(explosion, level, pos, state, fluid) -+ .map(max -> this.source.getBlockExplosionResistance(explosion, level, pos, state, fluid, max)); ++ return super.getBlockExplosionResistance(explosion, level, pos, block, fluid) ++ .map(max -> this.source.getBlockExplosionResistance(explosion, level, pos, block, fluid, max)); + } else { -+ Optional optionalBlastResistance = super.getBlockExplosionResistance(explosion, level, pos, state, fluid); ++ Optional optionalBlastResistance = super.getBlockExplosionResistance(explosion, level, pos, block, fluid); + if (optionalBlastResistance.isPresent()) { + float blastResistance = optionalBlastResistance.get(); -+ float effectiveExplosionResistance = this.source.getBlockExplosionResistance(explosion, level, pos, state, fluid, blastResistance); ++ float effectiveExplosionResistance = this.source.getBlockExplosionResistance(explosion, level, pos, block, fluid, blastResistance); + if (effectiveExplosionResistance != blastResistance) { + return Optional.of(effectiveExplosionResistance); + } + } + return optionalBlastResistance; + } ++ // Leaves end - reduce lambda and Optional allocation } @Override diff --git a/leaves-server/minecraft-patches/features/0063-Avoid-Class-isAssignableFrom-call-in-ClassInstanceMu.patch b/leaves-server/minecraft-patches/features/0061-Avoid-Class-isAssignableFrom-call-in-ClassInstanceMu.patch similarity index 61% rename from leaves-server/minecraft-patches/features/0063-Avoid-Class-isAssignableFrom-call-in-ClassInstanceMu.patch rename to leaves-server/minecraft-patches/features/0061-Avoid-Class-isAssignableFrom-call-in-ClassInstanceMu.patch index 800adcc02..d78b7ef58 100644 --- a/leaves-server/minecraft-patches/features/0063-Avoid-Class-isAssignableFrom-call-in-ClassInstanceMu.patch +++ b/leaves-server/minecraft-patches/features/0061-Avoid-Class-isAssignableFrom-call-in-ClassInstanceMu.patch @@ -6,28 +6,26 @@ Subject: [PATCH] Avoid Class#isAssignableFrom call in ClassInstanceMultiMap This patch is Powered by Gale(https://github.com/GaleMC/Gale) diff --git a/net/minecraft/util/ClassInstanceMultiMap.java b/net/minecraft/util/ClassInstanceMultiMap.java -index 81b8bedff21dc77930e40457937b895b1c3d5401..912803b9f49975b2c601ee91ef2752699621a9d2 100644 +index 021457d7676356ee9d5c7ba174206ba190adc1eb..c8ddd598cdd83024e071efdf3e1a2f32091eb915 100644 --- a/net/minecraft/util/ClassInstanceMultiMap.java +++ b/net/minecraft/util/ClassInstanceMultiMap.java -@@ -55,13 +55,24 @@ public class ClassInstanceMultiMap extends AbstractCollection { +@@ -55,12 +55,24 @@ public class ClassInstanceMultiMap extends AbstractCollection { } - public Collection find(Class type) { -- if (!this.baseClass.isAssignableFrom(type)) { -- throw new IllegalArgumentException("Don't know how to search for " + type); -- } else { -- List list = this.byClass -- .computeIfAbsent(type, clazz -> this.allInstances.stream().filter(clazz::isInstance).collect(Util.toMutableList())); -- return (Collection)Collections.unmodifiableCollection(list); + public Collection find(final Class index) { +- if (!this.baseClass.isAssignableFrom(index)) { +- throw new IllegalArgumentException("Don't know how to search for " + index); + // Leaves start - avoid Class#isAssignableFrom call in ClassInstanceMultiMap -+ Collection collection = this.byClass.get(type); ++ Collection collection = this.byClass.get(index); + if (collection == null) { -+ collection = this.createAllOfType(type); ++ collection = this.createAllOfType(index); } + return (Collection) Collections.unmodifiableCollection(collection); + } -+ -+ private Collection createAllOfType(Class type) { + +- List instances = this.byClass.computeIfAbsent(index, k -> this.allInstances.stream().filter(k::isInstance).collect(Util.toMutableList())); +- return (Collection)Collections.unmodifiableCollection(instances); ++ private Collection createAllOfType(final Class type) { + List list = new java.util.ArrayList<>(1); + for (T allElement : this.allInstances) { + if (type.isInstance(allElement)) { diff --git a/leaves-server/minecraft-patches/features/0061-Optimize-sun-burn-tick.patch b/leaves-server/minecraft-patches/features/0061-Optimize-sun-burn-tick.patch deleted file mode 100644 index ab7c84531..000000000 --- a/leaves-server/minecraft-patches/features/0061-Optimize-sun-burn-tick.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Thu, 20 Jul 2023 15:18:50 +0800 -Subject: [PATCH] Optimize sun burn tick - -This patch is Powered by Gale(https://github.com/GaleMC/Gale) - -diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 38bb637d2392268037be4facffc669546a1847b8..3fe3d5578fe6023ed75f66a64493db9a5ef1f9be 100644 ---- a/net/minecraft/world/entity/Entity.java -+++ b/net/minecraft/world/entity/Entity.java -@@ -2192,9 +2192,20 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name - - @Deprecated - public float getLightLevelDependentMagicValue() { -- return this.level().hasChunkAt(this.getBlockX(), this.getBlockZ()) -- ? this.level().getLightLevelDependentMagicValue(BlockPos.containing(this.getX(), this.getEyeY(), this.getZ())) -- : 0.0F; -+ // Leaves start - optimize sun burn tick -+ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeSunBurnTick) { -+ return this.level().hasChunkAt(this.getBlockX(), this.getBlockZ()) ? this.level().getLightLevelDependentMagicValue(BlockPos.containing(this.getX(), this.getEyeY(), this.getZ())) : 0.0F; -+ } else { -+ return this.getLightLevelDependentMagicValue(BlockPos.containing(this.getX(), this.getEyeY(), this.getZ())); -+ } -+ // Leaves end - optimize sun burn tick -+ } -+ -+ // Leaves start - optimize sun burn tick -+ /** @deprecated */ -+ @Deprecated -+ public float getLightLevelDependentMagicValue(BlockPos pos) { -+ return this.level().hasChunkAt(this.getBlockX(), this.getBlockZ()) ? this.level.getLightLevelDependentMagicValue(pos) : 0.0F; - } - - public void absSnapTo(double x, double y, double z, float yRot, float xRot) { -@@ -2209,6 +2220,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name - this.xRotO = this.getXRot(); - this.setYHeadRot(yRot); // Paper - Update head rotation - } -+ // Leaves end - optimize sun burn tick - - public void absSnapTo(double x, double y, double z) { - double d = Mth.clamp(x, -3.0E7, 3.0E7); -diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 0e58de4eef841606b5fb26ad8267c5736c2b807c..7d70731905440c6b01639c0b50e259c619bf0421 100644 ---- a/net/minecraft/world/entity/Mob.java -+++ b/net/minecraft/world/entity/Mob.java -@@ -577,17 +577,39 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab - } - } - -+ // Leaves start - optimize sun burn tick -+ @org.jetbrains.annotations.Nullable private BlockPos cached_eye_blockpos; -+ @org.jetbrains.annotations.Nullable private net.minecraft.world.phys.Vec3 cached_position; -+ // Leaves end - optimize sun burn tick -+ - public boolean isSunBurnTick() { - if (!this.level().isClientSide() && this.level().environmentAttributes().getValue(EnvironmentAttributes.MONSTERS_BURN, this.position())) { -- float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue(); -- BlockPos blockPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); -- boolean flag = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; -- if (lightLevelDependentMagicValue > 0.5F -- && this.random.nextFloat() * 30.0F < (lightLevelDependentMagicValue - 0.4F) * 2.0F -- && !flag -- && this.level().canSeeSky(blockPos)) { -- return true; -+ // Leaves start - optimize sun burn tick -+ if (!org.leavesmc.leaves.LeavesConfig.performance.optimizeSunBurnTick) { -+ float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue(); -+ BlockPos blockPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); -+ boolean flag = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; -+ if (lightLevelDependentMagicValue > 0.5F -+ && this.random.nextFloat() * 30.0F < (lightLevelDependentMagicValue - 0.4F) * 2.0F -+ && !flag -+ && this.level().canSeeSky(blockPos)) { -+ return true; -+ } -+ } else { -+ if (cached_eye_blockpos == null || !this.position().equals(cached_position)) { -+ this.cached_eye_blockpos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); -+ this.cached_position = this.position(); -+ } -+ -+ float f = this.getLightLevelDependentMagicValue(cached_eye_blockpos); // Pass BlockPos to getBrightness -+ -+ // Check brightness first -+ if (f <= 0.5F) return false; -+ if (this.random.nextFloat() * 30.0F >= (f - 0.4F) * 2.0F) return false; -+ boolean flag = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; -+ return !flag && this.level().canSeeSky(this.cached_eye_blockpos); - } -+ // Leaves end - optimize sun burn tick - } - - return false; diff --git a/leaves-server/minecraft-patches/features/0064-Optimized-CubePointRange.patch b/leaves-server/minecraft-patches/features/0062-Optimized-CubePointRange.patch similarity index 70% rename from leaves-server/minecraft-patches/features/0064-Optimized-CubePointRange.patch rename to leaves-server/minecraft-patches/features/0062-Optimized-CubePointRange.patch index 270362b49..4904de2a6 100644 --- a/leaves-server/minecraft-patches/features/0064-Optimized-CubePointRange.patch +++ b/leaves-server/minecraft-patches/features/0062-Optimized-CubePointRange.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Optimized CubePointRange This patch is Powered by Gale(https://github.com/GaleMC/Gale) diff --git a/net/minecraft/world/phys/shapes/CubePointRange.java b/net/minecraft/world/phys/shapes/CubePointRange.java -index 62aea61c5f240aa59b8489dd0bbb3d1b69b54b1c..b8e06a2d7f3a42a1cec1c87b950242acda54b214 100644 +index 72bb3bb29f2a1b06371589ed9bfea85de8046d50..99dcd631bd61b14688e75c7ff2b0e6b2b348cce2 100644 --- a/net/minecraft/world/phys/shapes/CubePointRange.java +++ b/net/minecraft/world/phys/shapes/CubePointRange.java -@@ -3,23 +3,33 @@ package net.minecraft.world.phys.shapes; +@@ -3,7 +3,9 @@ package net.minecraft.world.phys.shapes; import it.unimi.dsi.fastutil.doubles.AbstractDoubleList; public class CubePointRange extends AbstractDoubleList { @@ -17,26 +17,26 @@ index 62aea61c5f240aa59b8489dd0bbb3d1b69b54b1c..b8e06a2d7f3a42a1cec1c87b950242ac private final int parts; + private final double scale; // Leaves - replace division by multiplication in CubePointRange - public CubePointRange(int parts) { + public CubePointRange(final int parts) { if (parts <= 0) { - throw new IllegalArgumentException("Need at least 1 part"); - } else { - this.parts = parts; -+ this.size = parts + 1; +@@ -11,15 +13,23 @@ public class CubePointRange extends AbstractDoubleList { } + + this.parts = parts; ++ this.size = parts + 1; + this.scale = 1.0D / parts; // Leaves - replace division by multiplication in CubePointRange } @Override - public double getDouble(int value) { -- return (double)value / this.parts; + public double getDouble(final int index) { +- return (double)index / this.parts; + // Leaves start - replace division by multiplication in CubePointRange + if (!org.leavesmc.leaves.LeavesConfig.performance.optimizedCubePointRange) { -+ return (double)value / (double)this.parts; ++ return (double)index / (double)this.parts; + } else { -+ return value * this.scale; ++ return index * this.scale; + } -+ // Leaves start - replace division by multiplication in CubePointRange ++ // Leaves end - replace division by multiplication in CubePointRange } @Override diff --git a/leaves-server/minecraft-patches/features/0065-Check-frozen-ticks-before-landing-block.patch b/leaves-server/minecraft-patches/features/0063-Check-frozen-ticks-before-landing-block.patch similarity index 62% rename from leaves-server/minecraft-patches/features/0065-Check-frozen-ticks-before-landing-block.patch rename to leaves-server/minecraft-patches/features/0063-Check-frozen-ticks-before-landing-block.patch index fb662cc86..a3d8d8575 100644 --- a/leaves-server/minecraft-patches/features/0065-Check-frozen-ticks-before-landing-block.patch +++ b/leaves-server/minecraft-patches/features/0063-Check-frozen-ticks-before-landing-block.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Check frozen ticks before landing block This patch is Powered by Gale(https://github.com/GaleMC/Gale) diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index c2442d69ce547719467dd94fcf6fd209a3612ac2..411b5623511a2b3d0205a98f9ba6db43a630fed3 100644 +index 7b2f91825fd34bd7ad7f98bcf08696a80deab370..3d29b1d4471048dd30c05fda7a5804a82ff1c698 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -544,10 +544,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -538,10 +538,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } protected void tryAddFrost() { @@ -17,8 +17,8 @@ index c2442d69ce547719467dd94fcf6fd209a3612ac2..411b5623511a2b3d0205a98f9ba6db43 + if (org.leavesmc.leaves.LeavesConfig.performance.checkFrozenTicksBeforeLandingBlock || !this.getBlockStateOnLegacy().isAir()) { // Leaves - check frozen ticks before landing block int ticksFrozen = this.getTicksFrozen(); if (ticksFrozen > 0) { -- AttributeInstance attribute = this.getAttribute(Attributes.MOVEMENT_SPEED); -+ AttributeInstance attribute = !org.leavesmc.leaves.LeavesConfig.performance.checkFrozenTicksBeforeLandingBlock || !this.getBlockStateOnLegacy().isAir() ? this.getAttribute(Attributes.MOVEMENT_SPEED) : null; // Leaves - check frozen ticks before landing block - if (attribute == null) { +- AttributeInstance speed = this.getAttribute(Attributes.MOVEMENT_SPEED); ++ AttributeInstance speed = !org.leavesmc.leaves.LeavesConfig.performance.checkFrozenTicksBeforeLandingBlock || !this.getBlockStateOnLegacy().isAir() ? this.getAttribute(Attributes.MOVEMENT_SPEED) : null; // Leaves - check frozen ticks before landing block + if (speed == null) { return; } diff --git a/leaves-server/minecraft-patches/features/0066-Skip-entity-move-if-movement-is-zero.patch b/leaves-server/minecraft-patches/features/0064-Skip-entity-move-if-movement-is-zero.patch similarity index 69% rename from leaves-server/minecraft-patches/features/0066-Skip-entity-move-if-movement-is-zero.patch rename to leaves-server/minecraft-patches/features/0064-Skip-entity-move-if-movement-is-zero.patch index 302db2bc3..d2ecc5d0b 100644 --- a/leaves-server/minecraft-patches/features/0066-Skip-entity-move-if-movement-is-zero.patch +++ b/leaves-server/minecraft-patches/features/0064-Skip-entity-move-if-movement-is-zero.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Skip entity move if movement is zero This patch is Powered by Gale(https://github.com/GaleMC/Gale) diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 3fe3d5578fe6023ed75f66a64493db9a5ef1f9be..943dab97a4e22797664554b8cbcf1cb7603de12f 100644 +index 85a06111cecde93ca6bfecd4d8d3e0323684ae08..e96539243f9ce8027661b2079fa96d6251a26229 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -265,6 +265,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -280,6 +280,7 @@ public abstract class Entity public float yRotO; public float xRotO; private AABB bb = INITIAL_AABB; @@ -17,24 +17,24 @@ index 3fe3d5578fe6023ed75f66a64493db9a5ef1f9be..943dab97a4e22797664554b8cbcf1cb7 public boolean onGround; public boolean horizontalCollision; public boolean verticalCollision; -@@ -1114,6 +1115,13 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -1132,6 +1133,13 @@ public abstract class Entity // Paper end - detailed watchdog information - public void move(MoverType type, Vec3 movement) { + public void move(final MoverType moverType, Vec3 delta) { + // Leaves start - skip entity move if movement is zero + if (org.leavesmc.leaves.LeavesConfig.performance.skipEntityMoveIfMovementIsZero) { -+ if (!this.boundingBoxChanged && movement.equals(Vec3.ZERO)) { ++ if (!this.boundingBoxChanged && delta.equals(Vec3.ZERO)) { + return; + } + } + // Leaves end - skip entity move if movement is zero - final Vec3 originalMovement = movement; // Paper - Expose pre-collision velocity + final Vec3 originalMovement = delta; // Paper - Expose pre-collision velocity // Paper start - detailed watchdog information ca.spottedleaf.moonrise.common.util.TickThread.ensureTickThread("Cannot move an entity off-main"); -@@ -4485,6 +4493,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -4537,6 +4545,7 @@ public abstract class Entity } - public final void setBoundingBox(AABB bb) { + public final void setBoundingBox(final AABB bb) { + if (!this.bb.equals(bb)) this.boundingBoxChanged = true; // Leaves - skip entity move if movement is zero // CraftBukkit start - block invalid bounding boxes double minX = bb.minX, diff --git a/leaves-server/minecraft-patches/features/0067-Skip-cloning-advancement-criteria.patch b/leaves-server/minecraft-patches/features/0065-Skip-cloning-advancement-criteria.patch similarity index 77% rename from leaves-server/minecraft-patches/features/0067-Skip-cloning-advancement-criteria.patch rename to leaves-server/minecraft-patches/features/0065-Skip-cloning-advancement-criteria.patch index a738277f2..99707854c 100644 --- a/leaves-server/minecraft-patches/features/0067-Skip-cloning-advancement-criteria.patch +++ b/leaves-server/minecraft-patches/features/0065-Skip-cloning-advancement-criteria.patch @@ -6,15 +6,15 @@ Subject: [PATCH] Skip cloning advancement criteria This patch is Powered by Gale(https://github.com/GaleMC/Gale) diff --git a/net/minecraft/advancements/Advancement.java b/net/minecraft/advancements/Advancement.java -index 504052b70e5397b298ee99ac650b43af6103cc1a..95f31f4fde4d12d72173add5984d00697b709255 100644 +index 87b703a8cc636617b03600f26315b72a175dcf82..5623e15cd8b1f1981633d121ca77db938fa7d0c1 100644 --- a/net/minecraft/advancements/Advancement.java +++ b/net/minecraft/advancements/Advancement.java @@ -61,7 +61,7 @@ public record Advancement( - AdvancementRequirements requirements, - boolean sendsTelemetryEvent + final AdvancementRequirements requirements, + final boolean sendsTelemetryEvent ) { - this(parent, display, rewards, Map.copyOf(criteria), requirements, sendsTelemetryEvent, display.map(Advancement::decorateName)); + this(parent, display, rewards, !org.leavesmc.leaves.LeavesConfig.performance.skipCloningAdvancementCriteria ? Map.copyOf(criteria) : criteria, requirements, sendsTelemetryEvent, display.map(Advancement::decorateName)); // Leaves - skip cloning advancement criteria } - private static DataResult validate(Advancement advancement) { + private static DataResult validate(final Advancement advancement) { diff --git a/leaves-server/minecraft-patches/features/0068-Avoid-anvil-too-expensive.patch b/leaves-server/minecraft-patches/features/0066-Avoid-anvil-too-expensive.patch similarity index 86% rename from leaves-server/minecraft-patches/features/0068-Avoid-anvil-too-expensive.patch rename to leaves-server/minecraft-patches/features/0066-Avoid-anvil-too-expensive.patch index 40fa4eaad..68130100d 100644 --- a/leaves-server/minecraft-patches/features/0068-Avoid-anvil-too-expensive.patch +++ b/leaves-server/minecraft-patches/features/0066-Avoid-anvil-too-expensive.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Avoid anvil too expensive diff --git a/net/minecraft/world/inventory/AnvilMenu.java b/net/minecraft/world/inventory/AnvilMenu.java -index 7939f19b87364a32a40e58e001cea14e06348f86..0fd12fd175160dd73e0b129744d89855707a86d5 100644 +index a577225f59bb562b860cb90db72b4d658a69956f..8a9edac9ab3de0e5f024493b2f7dacf80d2976c4 100644 --- a/net/minecraft/world/inventory/AnvilMenu.java +++ b/net/minecraft/world/inventory/AnvilMenu.java @@ -267,7 +267,7 @@ public class AnvilMenu extends ItemCombinerMenu { @@ -14,6 +14,6 @@ index 7939f19b87364a32a40e58e001cea14e06348f86..0fd12fd175160dd73e0b129744d89855 - if (this.cost.get() >= this.maximumRepairCost && !this.player.hasInfiniteMaterials()) { // CraftBukkit + if (this.cost.get() >= this.maximumRepairCost && (!org.leavesmc.leaves.LeavesConfig.modify.avoidAnvilTooExpensive || this.cost.get() == DEFAULT_DENIED_COST) && !this.player.hasInfiniteMaterials()) { // CraftBukkit // Leaves - avoid anvil too expensive - itemStack = ItemStack.EMPTY; + result = ItemStack.EMPTY; } diff --git a/leaves-server/minecraft-patches/features/0067-Bow-infinity-fix.patch b/leaves-server/minecraft-patches/features/0067-Bow-infinity-fix.patch new file mode 100644 index 000000000..27af4d54c --- /dev/null +++ b/leaves-server/minecraft-patches/features/0067-Bow-infinity-fix.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Mon, 24 Jul 2023 15:54:18 +0800 +Subject: [PATCH] Bow infinity fix + + +diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java +index 7005678a7ea06a118878033558c61fef7bf58434..c6e49ebf1520700b2996ba86bdfc0abf4a1f4d6f 100644 +--- a/net/minecraft/world/entity/player/Player.java ++++ b/net/minecraft/world/entity/player/Player.java +@@ -2088,8 +2088,10 @@ public abstract class Player extends Avatar implements ContainerUser { + } + } + +- if (anyEventCancelled.booleanValue() && !this.abilities.instabuild && this instanceof final ServerPlayer player) this.resyncUsingItem(player); // Paper - resync if no item matched the Predicate +- return this.hasInfiniteMaterials() ? new ItemStack(Items.ARROW) : ItemStack.EMPTY; ++ // Leaves start - bow infinity fix ++ if ((org.leavesmc.leaves.LeavesConfig.modify.bowInfinityFix || anyEventCancelled.booleanValue()) && !this.abilities.instabuild && this instanceof final ServerPlayer player) this.resyncUsingItem(player); // Paper - resync if no item matched the Predicate ++ return this.hasInfiniteMaterials() || (org.leavesmc.leaves.LeavesConfig.modify.bowInfinityFix && net.minecraft.world.item.enchantment.EnchantmentHelper.processAmmoUse((ServerLevel) this.level(), heldWeapon, new ItemStack(Items.ARROW), 1) <= 0) ? new ItemStack(Items.ARROW) : ItemStack.EMPTY; ++ // Leaves end - bow infinity fix + } + + @Override diff --git a/leaves-server/minecraft-patches/features/0070-Zero-tick-plants.patch b/leaves-server/minecraft-patches/features/0068-Zero-tick-plants.patch similarity index 63% rename from leaves-server/minecraft-patches/features/0070-Zero-tick-plants.patch rename to leaves-server/minecraft-patches/features/0068-Zero-tick-plants.patch index d4f1a51d4..c846864db 100644 --- a/leaves-server/minecraft-patches/features/0070-Zero-tick-plants.patch +++ b/leaves-server/minecraft-patches/features/0068-Zero-tick-plants.patch @@ -5,81 +5,82 @@ Subject: [PATCH] Zero tick plants diff --git a/net/minecraft/world/level/block/BambooStalkBlock.java b/net/minecraft/world/level/block/BambooStalkBlock.java -index 81e2a279d4c29f5fe52387875489239515a8c82b..66ef754fa72626886b14ea2941a851c847094efd 100644 +index cf23ecd34bc7af694a036e388f20c56b0ca0a5b1..8c22957926e23a97b959f36bbe350db24a967736 100644 --- a/net/minecraft/world/level/block/BambooStalkBlock.java +++ b/net/minecraft/world/level/block/BambooStalkBlock.java @@ -108,6 +108,10 @@ public class BambooStalkBlock extends Block implements BonemealableBlock { - protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + protected void tick(final BlockState state, final ServerLevel level, final BlockPos pos, final RandomSource random) { if (!state.canSurvive(level, pos)) { level.destroyBlock(pos, true); -+ // Leaves start - zero tick plants ++ // Leaves start - zero tick plants + } else if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.zeroTickPlants) { + this.randomTick(state, level, pos, random); -+ // Leaves end - zero tick plants ++ // Leaves end - zero tick plants } } diff --git a/net/minecraft/world/level/block/CactusBlock.java b/net/minecraft/world/level/block/CactusBlock.java -index 9662828596de15e5b855f12d2a3b014763b3fc2e..67490a7db2db521863bcc4d923ed435de9d6e961 100644 +index 1fbdb7a9ae8120cbe43cb185ad17c4769cf6e8b6..5b6124a1185e8a3b51f0e13777a4bc9bd75ae01b 100644 --- a/net/minecraft/world/level/block/CactusBlock.java +++ b/net/minecraft/world/level/block/CactusBlock.java @@ -47,6 +47,10 @@ public class CactusBlock extends Block { - protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + protected void tick(final BlockState state, final ServerLevel level, final BlockPos pos, final RandomSource random) { if (!state.canSurvive(level, pos)) { level.destroyBlock(pos, true); -+ // Leaves start - zero tick plants ++ // Leaves start - zero tick plants + } else if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.zeroTickPlants) { + this.randomTick(state, level, pos, random); -+ // Leaves end - zero tick plants ++ // Leaves end - zero tick plants } } diff --git a/net/minecraft/world/level/block/ChorusFlowerBlock.java b/net/minecraft/world/level/block/ChorusFlowerBlock.java -index 184c971852a9eb387484e4ce89a26a69567cbeda..fe668a8c4c7449731901dc3bee8996b7baeaed5c 100644 +index 76dbad4969f8e7e39c78eec782579362203ca6bc..386795ed3920dc94341848b65dd2b29ab1a43cd1 100644 --- a/net/minecraft/world/level/block/ChorusFlowerBlock.java +++ b/net/minecraft/world/level/block/ChorusFlowerBlock.java -@@ -49,6 +49,9 @@ public class ChorusFlowerBlock extends Block { - protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { +@@ -47,6 +47,10 @@ public class ChorusFlowerBlock extends Block { + protected void tick(final BlockState state, final ServerLevel level, final BlockPos pos, final RandomSource random) { if (!state.canSurvive(level, pos)) { level.destroyBlock(pos, true); ++ // Leaves start - zero tick plants + } else if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.zeroTickPlants) { + this.randomTick(state, level, pos, random); -+ // Leaves end - zero tick plants ++ // Leaves end - zero tick plants } } diff --git a/net/minecraft/world/level/block/GrowingPlantHeadBlock.java b/net/minecraft/world/level/block/GrowingPlantHeadBlock.java -index bac7f990282fd7c676c2f8c40d7fd87badb1e284..876f2e24c5e62eaf3b355ea313d7a9a1b473ffc8 100644 +index 21524350cb8822d33c86f1be783669ac8b961319..fbed46f137c13ae80a954d1de3b7b339978024ce 100644 --- a/net/minecraft/world/level/block/GrowingPlantHeadBlock.java +++ b/net/minecraft/world/level/block/GrowingPlantHeadBlock.java -@@ -155,4 +155,15 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements +@@ -160,4 +160,15 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements protected GrowingPlantHeadBlock getHeadBlock() { return this; } + + // Leaves start - zero tick plants + @Override -+ public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { -+ if (!state.canSurvive(world, pos)) { -+ world.destroyBlock(pos, true); ++ protected void tick(final BlockState state, final ServerLevel level, final BlockPos pos, final RandomSource random) { ++ if (!state.canSurvive(level, pos)) { ++ level.destroyBlock(pos, true); + } else if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.zeroTickPlants) { -+ this.randomTick(state, world, pos, random); ++ this.randomTick(state, level, pos, random); + } + } + // Leaves end - zero tick plants } diff --git a/net/minecraft/world/level/block/SugarCaneBlock.java b/net/minecraft/world/level/block/SugarCaneBlock.java -index 4437fd5724e094e8d2edb97ca9bf494ef57f5b79..1060c57dde837481a898d9a5f45c7f1fd7174c4e 100644 +index 373a61d2d8e73f3bbfd5117c492a8d63bb574f54..629b8ef749543eb3be9756ef917b0bbb4537e723 100644 --- a/net/minecraft/world/level/block/SugarCaneBlock.java +++ b/net/minecraft/world/level/block/SugarCaneBlock.java @@ -43,6 +43,10 @@ public class SugarCaneBlock extends Block { - protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + protected void tick(final BlockState state, final ServerLevel level, final BlockPos pos, final RandomSource random) { if (!state.canSurvive(level, pos)) { level.destroyBlock(pos, true); -+ // Leaves start - zero tick plants ++ // Leaves start - zero tick plants + } else if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.zeroTickPlants) { + this.randomTick(state, level, pos, random); -+ // Leaves end - zero tick plants ++ // Leaves end - zero tick plants } } diff --git a/leaves-server/minecraft-patches/features/0069-Bow-infinity-fix.patch b/leaves-server/minecraft-patches/features/0069-Bow-infinity-fix.patch deleted file mode 100644 index 4bca89765..000000000 --- a/leaves-server/minecraft-patches/features/0069-Bow-infinity-fix.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Mon, 24 Jul 2023 15:54:18 +0800 -Subject: [PATCH] Bow infinity fix - - -diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 6bd3cd6b1a4807b0f2acee9087bcbbf9dd0bde05..7fe3de7baa38a5b769b1069f3ee7ae56dc76fd1b 100644 ---- a/net/minecraft/world/entity/player/Player.java -+++ b/net/minecraft/world/entity/player/Player.java -@@ -2092,8 +2092,10 @@ public abstract class Player extends Avatar implements ContainerUser { - } - } - -- if (anyEventCancelled.booleanValue() && !this.abilities.instabuild && this instanceof final ServerPlayer player) this.resyncUsingItem(player); // Paper - resync if no item matched the Predicate -- return this.hasInfiniteMaterials() ? new ItemStack(Items.ARROW) : ItemStack.EMPTY; -+ // Leaves start - bow infinity fix -+ if ((org.leavesmc.leaves.LeavesConfig.modify.bowInfinityFix || anyEventCancelled.booleanValue()) && !this.abilities.instabuild && this instanceof final ServerPlayer player) this.resyncUsingItem(player); // Paper - resync if no item matched the Predicate -+ return this.hasInfiniteMaterials() || (org.leavesmc.leaves.LeavesConfig.modify.bowInfinityFix && net.minecraft.world.item.enchantment.EnchantmentHelper.processAmmoUse((ServerLevel) this.level(), shootable, new ItemStack(Items.ARROW), 1) <= 0) ? new ItemStack(Items.ARROW) : ItemStack.EMPTY; -+ // Leaves end - bow infinity fix - } - } - } diff --git a/leaves-server/minecraft-patches/features/0071-Replay-Mod-API.patch b/leaves-server/minecraft-patches/features/0069-Replay-Mod-API.patch similarity index 58% rename from leaves-server/minecraft-patches/features/0071-Replay-Mod-API.patch rename to leaves-server/minecraft-patches/features/0069-Replay-Mod-API.patch index cb586c5c0..116e12cf7 100644 --- a/leaves-server/minecraft-patches/features/0071-Replay-Mod-API.patch +++ b/leaves-server/minecraft-patches/features/0069-Replay-Mod-API.patch @@ -3,13 +3,12 @@ From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Tue, 4 Feb 2025 19:45:19 +0800 Subject: [PATCH] Replay Mod API -This patch is Powered by ReplayMod(https://github.com/ReplayMod) diff --git a/net/minecraft/commands/CommandSourceStack.java b/net/minecraft/commands/CommandSourceStack.java -index 566304106fd4f1c677a56e7c66282d1570e7b974..539cc641d894cc74051e01da7acc5a62b84ffb7c 100644 +index 89b9d1a4122d502437d516f8affc5ba72f421f5f..b4b5b32f73659f3bd9de1c62e56419ec93374e05 100644 --- a/net/minecraft/commands/CommandSourceStack.java +++ b/net/minecraft/commands/CommandSourceStack.java -@@ -562,7 +562,7 @@ public class CommandSourceStack implements ExecutionCommandSource getOnlinePlayerNames() { @@ -19,71 +18,75 @@ index 566304106fd4f1c677a56e7c66282d1570e7b974..539cc641d894cc74051e01da7acc5a62 @Override diff --git a/net/minecraft/commands/arguments/selector/EntitySelector.java b/net/minecraft/commands/arguments/selector/EntitySelector.java -index af71e0e1eb1c93745f3e4954ecc8fbd2ad4808a3..f3829564681faff3ae8971ed90b947b4a082a636 100644 +index 30fccc96d377c8ac3d0845675a6b228836ec9a95..648a5972e96e103c5bf54a79b2746d0ed1e1ae9e 100644 --- a/net/minecraft/commands/arguments/selector/EntitySelector.java +++ b/net/minecraft/commands/arguments/selector/EntitySelector.java -@@ -126,11 +126,12 @@ public class EntitySelector { - return this.findPlayers(source); - } else if (this.playerName != null) { - ServerPlayer playerByName = source.getServer().getPlayerList().getPlayerByName(this.playerName); -+ playerByName = playerByName instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : playerByName; // Leaves - skip photographer - return playerByName == null ? List.of() : List.of(playerByName); - } else if (this.entityUUID != null) { - for (ServerLevel serverLevel : source.getServer().getAllLevels()) { - Entity entity = serverLevel.getEntity(this.entityUUID); +@@ -144,13 +144,14 @@ public class EntitySelector { + + if (this.playerName != null) { + ServerPlayer result = sender.getServer().getPlayerList().getPlayerByName(this.playerName); ++ result = result instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : result; // Leaves - skip photographer + return result == null ? List.of() : List.of(result); + } + + if (this.entityUUID != null) { + for (ServerLevel level : sender.getServer().getAllLevels()) { + Entity entity = level.getEntity(this.entityUUID); - if (entity != null) { + if (entity != null && !(entity instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { - if (entity.getType().isEnabled(source.enabledFeatures())) { + if (entity.getType().isEnabled(sender.enabledFeatures())) { return List.of(entity); } -@@ -144,7 +145,7 @@ public class EntitySelector { - AABB absoluteAabb = this.getAbsoluteAabb(vec3); +@@ -164,7 +165,7 @@ public class EntitySelector { + AABB absoluteAabb = this.getAbsoluteAabb(pos); if (this.currentEntity) { - Predicate predicate = this.getPredicate(vec3, absoluteAabb, null); -- return source.getEntity() != null && predicate.test(source.getEntity()) ? List.of(source.getEntity()) : List.of(); -+ return source.getEntity() != null && !(source.getEntity() instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(source.getEntity()) ? List.of(source.getEntity()) : List.of(); // Leaves - skip photographer - } else { - Predicate predicate = this.getPredicate(vec3, absoluteAabb, source.enabledFeatures()); - List list = new ObjectArrayList<>(); -@@ -155,6 +156,7 @@ public class EntitySelector { - this.addEntities(list, serverLevel1, absoluteAabb, predicate); - } - } -+ list.removeIf(entity -> entity instanceof org.leavesmc.leaves.replay.ServerPhotographer); // Leaves - skip photographer + Predicate predicate = this.getPredicate(pos, absoluteAabb, null); +- return sender.getEntity() != null && predicate.test(sender.getEntity()) ? List.of(sender.getEntity()) : List.of(); ++ return sender.getEntity() != null && !(sender.getEntity() instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(sender.getEntity()) ? List.of(sender.getEntity()) : List.of(); // Leaves - skip photographer + } - return this.sortAndLimit(vec3, list); + Predicate predicate = this.getPredicate(pos, absoluteAabb, sender.enabledFeatures()); +@@ -177,6 +178,7 @@ public class EntitySelector { + } } -@@ -190,9 +192,11 @@ public class EntitySelector { - this.checkPermissions(source); + ++ result.removeIf(entity -> entity instanceof org.leavesmc.leaves.replay.ServerPhotographer); // Leaves - skip photographer + return this.sortAndLimit(pos, result); + } + } +@@ -210,11 +212,13 @@ public class EntitySelector { + this.checkPermissions(sender); if (this.playerName != null) { - ServerPlayer playerByName = source.getServer().getPlayerList().getPlayerByName(this.playerName); -+ playerByName = playerByName instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : playerByName; // Leaves - skip photographer - return playerByName == null ? List.of() : List.of(playerByName); - } else if (this.entityUUID != null) { - ServerPlayer playerByName = source.getServer().getPlayerList().getPlayer(this.entityUUID); -+ playerByName = playerByName instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : playerByName; // Leaves - skip photographer - return playerByName == null ? List.of() : List.of(playerByName); + ServerPlayer result = sender.getServer().getPlayerList().getPlayerByName(this.playerName); ++ result = result instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : result; // Leaves - skip photographer + return result == null ? List.of() : List.of(result); + } + + if (this.entityUUID != null) { + ServerPlayer result = sender.getServer().getPlayerList().getPlayer(this.entityUUID); ++ result = result instanceof org.leavesmc.leaves.replay.ServerPhotographer ? null : result; // Leaves - skip photographer + return result == null ? List.of() : List.of(result); + } + +@@ -228,11 +232,11 @@ public class EntitySelector { + int limit = this.getResultLimit(); + List result; + if (this.isWorldLimited()) { +- result = sender.getLevel().getPlayers(predicate, limit); ++ result = sender.getLevel().getPlayers((player -> !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(player)), limit); // Leaves - skip photographer } else { - Vec3 vec3 = this.position.apply(source.getPosition()); -@@ -204,11 +208,11 @@ public class EntitySelector { - int resultLimit = this.getResultLimit(); - List players; - if (this.isWorldLimited()) { -- players = source.getLevel().getPlayers(predicate, resultLimit); -+ players = source.getLevel().getPlayers((player -> !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer) && predicate.test(player)), resultLimit); // Leaves - skip photographer - } else { - players = new ObjectArrayList<>(); + result = new ObjectArrayList<>(); -- for (ServerPlayer serverPlayer1 : source.getServer().getPlayerList().getPlayers()) { -+ for (ServerPlayer serverPlayer1 : source.getServer().getPlayerList().realPlayers) { // Leaves - only real players - if (predicate.test(serverPlayer1)) { - players.add(serverPlayer1); - if (players.size() >= resultLimit) { +- for (ServerPlayer player : sender.getServer().getPlayerList().getPlayers()) { ++ for (ServerPlayer player : sender.getServer().getPlayerList().realPlayers) { // Leaves - only real players + if (predicate.test(player)) { + result.add(player); + if (result.size() >= limit) { diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 5a46df87c6af968c583bbfc2bdf365ad7779d90d..972dccc49fc6636168e82caa6a259a4b6d456d21 100644 +index 426420ad00f70d9c0a8792064ee1e73e887a624b..95bb2ec78ec0d773cf065a8b60722576a3eae3bd 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1733,7 +1733,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> startTrackingPackets = this.getStartTrackingPackets(objective); +@@ -247,7 +247,7 @@ public class ServerScoreboard extends Scoreboard { + public void startTrackingObjective(final Objective objective) { + List> packets = this.getStartTrackingPackets(objective); -- for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) { -+ for (ServerPlayer serverPlayer : this.server.getPlayerList().realPlayers) { // Leaves - only real players - if (serverPlayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - for (Packet packet : startTrackingPackets) { - serverPlayer.connection.send(packet); -@@ -277,7 +277,7 @@ public class ServerScoreboard extends Scoreboard { - public void stopTrackingObjective(Objective objective) { - List> stopTrackingPackets = this.getStopTrackingPackets(objective); +- for (ServerPlayer player : this.server.getPlayerList().getPlayers()) { ++ for (ServerPlayer player : this.server.getPlayerList().realPlayers) { // Leaves - only real players + if (player.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + for (Packet packet : packets) { + player.connection.send(packet); +@@ -273,7 +273,7 @@ public class ServerScoreboard extends Scoreboard { + public void stopTrackingObjective(final Objective objective) { + List> packets = this.getStopTrackingPackets(objective); -- for (ServerPlayer serverPlayer : this.server.getPlayerList().getPlayers()) { -+ for (ServerPlayer serverPlayer : this.server.getPlayerList().realPlayers) { // Leaves - only real players - if (serverPlayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - for (Packet packet : stopTrackingPackets) { - serverPlayer.connection.send(packet); +- for (ServerPlayer player : this.server.getPlayerList().getPlayers()) { ++ for (ServerPlayer player : this.server.getPlayerList().realPlayers) { // Leaves - only real players + if (player.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + for (Packet packet : packets) { + player.connection.send(packet); diff --git a/net/minecraft/server/commands/ListPlayersCommand.java b/net/minecraft/server/commands/ListPlayersCommand.java -index e7c778a7f292fd0749cbd5e6586ad1b93ac7f29e..024b56405bb58801b17a6adad7fec7a461d12a5c 100644 +index b850c908a594f839ce124c6bd01762d31cc3aa1e..b2240fd3f5ace03168fd679932675a72c09e81d7 100644 --- a/net/minecraft/server/commands/ListPlayersCommand.java +++ b/net/minecraft/server/commands/ListPlayersCommand.java @@ -33,7 +33,7 @@ public class ListPlayersCommand { - private static int format(CommandSourceStack source, Function nameExtractor) { + private static int format(final CommandSourceStack source, final Function formatter) { PlayerList playerList = source.getServer().getPlayerList(); // CraftBukkit start - List playersTemp = playerList.getPlayers(); @@ -177,28 +180,29 @@ index e7c778a7f292fd0749cbd5e6586ad1b93ac7f29e..024b56405bb58801b17a6adad7fec7a4 org.bukkit.entity.Player sender = (org.bukkit.entity.Player) source.getBukkitSender(); playersTemp = playersTemp.stream().filter((ep) -> sender.canSee(ep.getBukkitEntity())).collect(java.util.stream.Collectors.toList()); diff --git a/net/minecraft/server/commands/OpCommand.java b/net/minecraft/server/commands/OpCommand.java -index 590891d70a71ab30ceae3a3cf1923745e7c20b26..0ede1e5c73a0071e854de70f81ae1fc6a1d6dc59 100644 +index 20cbc0e65fea3fc2d0033259c2f35e158ea81926..6bcd09b8d39333bd5f2c0d7c0a9a91bb52f9314d 100644 --- a/net/minecraft/server/commands/OpCommand.java +++ b/net/minecraft/server/commands/OpCommand.java -@@ -25,7 +25,7 @@ public class OpCommand { - (commandContext, suggestionsBuilder) -> { - PlayerList playerList = commandContext.getSource().getServer().getPlayerList(); +@@ -25,7 +25,8 @@ public class OpCommand { + (c, p) -> { + PlayerList list = c.getSource().getServer().getPlayerList(); return SharedSuggestionProvider.suggest( -- playerList.getPlayers() -+ playerList.realPlayers // Leaves - only real player - .stream() - .filter(serverPlayer -> !playerList.isOp(serverPlayer.nameAndId())) - .map(serverPlayer -> serverPlayer.getGameProfile().name()), +- list.getPlayers().stream().filter(player -> !list.isOp(player.nameAndId())).map(pl -> pl.getGameProfile().name()), p ++ list.realPlayers // Leaves - only real player ++ .stream().filter(player -> !list.isOp(player.nameAndId())).map(pl -> pl.getGameProfile().name()), p + ); + } + ) diff --git a/net/minecraft/server/commands/ParticleCommand.java b/net/minecraft/server/commands/ParticleCommand.java -index b5cb0fd45c1e33f40ff38e86772c9e6cc06c10a0..e9ac6ee47fd9c3d73e55a3467bb1c53f931609d0 100644 +index ce8a8e665ca68f14158739dd7a07f932a472203c..390464ac4dcf698f27646efbdb034a873a8725af 100644 --- a/net/minecraft/server/commands/ParticleCommand.java +++ b/net/minecraft/server/commands/ParticleCommand.java @@ -36,7 +36,7 @@ public class ParticleCommand { 0.0F, 0, false, -- commandContext.getSource().getServer().getPlayerList().getPlayers() -+ commandContext.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( @@ -206,114 +210,114 @@ index b5cb0fd45c1e33f40ff38e86772c9e6cc06c10a0..e9ac6ee47fd9c3d73e55a3467bb1c53f 0.0F, 0, false, -- context1.getSource().getServer().getPlayerList().getPlayers() -+ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( @@ -68,7 +68,7 @@ public class ParticleCommand { - FloatArgumentType.getFloat(context1, "speed"), - IntegerArgumentType.getInteger(context1, "count"), + FloatArgumentType.getFloat(c, "speed"), + IntegerArgumentType.getInteger(c, "count"), false, -- context1.getSource().getServer().getPlayerList().getPlayers() -+ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( @@ -82,7 +82,7 @@ public class ParticleCommand { - FloatArgumentType.getFloat(context1, "speed"), - IntegerArgumentType.getInteger(context1, "count"), + FloatArgumentType.getFloat(c, "speed"), + IntegerArgumentType.getInteger(c, "count"), true, -- context1.getSource().getServer().getPlayerList().getPlayers() -+ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( @@ -112,7 +112,7 @@ public class ParticleCommand { - FloatArgumentType.getFloat(context1, "speed"), - IntegerArgumentType.getInteger(context1, "count"), + FloatArgumentType.getFloat(c, "speed"), + IntegerArgumentType.getInteger(c, "count"), false, -- context1.getSource().getServer().getPlayerList().getPlayers() -+ context1.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player +- c.getSource().getServer().getPlayerList().getPlayers() ++ c.getSource().getServer().getPlayerList().realPlayers // Leaves - only real player ) ) .then( diff --git a/net/minecraft/server/commands/TeamMsgCommand.java b/net/minecraft/server/commands/TeamMsgCommand.java -index 0ae4d68dfe42004839a0c5ad457de592f6b4af8b..1d1e396e4b29f33669872fb39e3a7f1d474a49f7 100644 +index 6a79944b040307acef3d1c66bd0dacaba514c708..4fa37a9772a10aea5eacaa1a02d9f834eda0877b 100644 --- a/net/minecraft/server/commands/TeamMsgCommand.java +++ b/net/minecraft/server/commands/TeamMsgCommand.java -@@ -40,7 +40,7 @@ public class TeamMsgCommand { - } else { - List list = commandSourceStack.getServer() - .getPlayerList() -- .getPlayers() -+ .realPlayers // Leaves - only real players - .stream() - .filter(player -> player == entityOrException || player.getTeam() == team) - .toList(); +@@ -41,7 +41,7 @@ public class TeamMsgCommand { + + List receivers = source.getServer() + .getPlayerList() +- .getPlayers() ++ .realPlayers // Leaves - only real players + .stream() + .filter(receiver -> receiver == entity || receiver.getTeam() == team) + .toList(); diff --git a/net/minecraft/server/commands/WhitelistCommand.java b/net/minecraft/server/commands/WhitelistCommand.java -index 305273583b3d2ad233c6cd67883baad15fe572eb..ce2939eac9c66e0c6eaac1570c4da19d908662ad 100644 +index 7b2abb978d7063a7a47840c10d0ddac0ef139ef7..5f790ff7c2c0cb0f8744767203b5e15b3aaffbfc 100644 --- a/net/minecraft/server/commands/WhitelistCommand.java +++ b/net/minecraft/server/commands/WhitelistCommand.java @@ -44,7 +44,7 @@ public class WhitelistCommand { - (commandContext, suggestionsBuilder) -> { - PlayerList playerList = commandContext.getSource().getServer().getPlayerList(); + (c, p) -> { + PlayerList list = c.getSource().getServer().getPlayerList(); return SharedSuggestionProvider.suggest( -- playerList.getPlayers() -+ playerList.realPlayers // Leaves - only real player +- list.getPlayers() ++ list.realPlayers // Leaves - only real player .stream() .map(Player::nameAndId) - .filter(nameAndId -> !playerList.getWhiteList().isWhiteListed(nameAndId)) + .filter(nameAndId -> !list.getWhiteList().isWhiteListed(nameAndId)) diff --git a/net/minecraft/server/gui/PlayerListComponent.java b/net/minecraft/server/gui/PlayerListComponent.java -index 5a8cd3e6b448a4472092690cf589bca10b142126..8f22d5faf89006153b1fff4ff0b622f8de9fb588 100644 +index 37c9f983ae89c497f44a1b7967d741abf909e0a0..d7fb2505f2a86ca0d81f144624ef2e1a4b4bddbb 100644 --- a/net/minecraft/server/gui/PlayerListComponent.java +++ b/net/minecraft/server/gui/PlayerListComponent.java @@ -17,8 +17,8 @@ public class PlayerListComponent extends JList { if (this.tickCount++ % 20 == 0) { - Vector list = new Vector<>(); + Vector players = new Vector<>(); - for (int i = 0; i < this.server.getPlayerList().getPlayers().size(); i++) { -- list.add(this.server.getPlayerList().getPlayers().get(i).getGameProfile().name()); +- players.add(this.server.getPlayerList().getPlayers().get(i).getGameProfile().name()); + for (int i = 0; i < this.server.getPlayerList().realPlayers.size(); i++) { // Leaves - only real players -+ list.add(this.server.getPlayerList().realPlayers.get(i).getGameProfile().name()); // Leaves - only real players ++ players.add(this.server.getPlayerList().realPlayers.get(i).getGameProfile().name()); // Leaves - only real players } - this.setListData(list); + this.setListData(players); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index b06e7dd6f1ce735d4ea9b4c3f75c004adc296487..499714800b2160cf163fc7a37e287f655a9d80ee 100644 +index a91d6173b9424ebe669bfdb1c8b08ac15ada953e..fa2032a630ce9791cf7dfb2f968ee05163b6379e 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -2816,7 +2816,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - if (entity instanceof ServerPlayer serverPlayer) { - ServerLevel.this.players.add(serverPlayer); +@@ -2884,7 +2884,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet + if (entity instanceof ServerPlayer player) { + ServerLevel.this.players.add(player); // Leaves start - skip -- if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot)) { -+ if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot) && !(serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer - ServerLevel.this.realPlayers.add(serverPlayer); +- if (!(player instanceof org.leavesmc.leaves.bot.ServerBot)) { ++ if (!(player instanceof org.leavesmc.leaves.bot.ServerBot) && !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer + ServerLevel.this.realPlayers.add(player); } // Leaves end - skip -@@ -2899,7 +2899,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - if (entity instanceof ServerPlayer serverPlayer) { - ServerLevel.this.players.remove(serverPlayer); +@@ -2967,7 +2967,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet + if (entity instanceof ServerPlayer player) { + ServerLevel.this.players.remove(player); // Leaves start - skip -- if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot)) { -+ if (!(serverPlayer instanceof org.leavesmc.leaves.bot.ServerBot) && !(serverPlayer instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer - ServerLevel.this.realPlayers.remove(serverPlayer); +- if (!(player instanceof org.leavesmc.leaves.bot.ServerBot)) { ++ if (!(player instanceof org.leavesmc.leaves.bot.ServerBot) && !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { // and photographer + ServerLevel.this.realPlayers.remove(player); } // Leaves end - skip diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index fce0114134eb1ffee558f6ce072e793eafbd6779..dc27a7b11c72ff0d184580edf4ac1376fda86f7c 100644 +index a5d7ab2d4c977fd63972487e2df37af6a1282b30..1543fad27aff40dba8591ffde4de611cb2516f6c 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -130,6 +130,7 @@ public abstract class PlayerList { +@@ -129,6 +129,7 @@ public abstract class PlayerList { private int simulationDistance; private boolean allowCommandsForAllPlayers; private int sendAllPlayerInfoIn; -+ public final List realPlayers = new java.util.concurrent.CopyOnWriteArrayList(); // Leaves - replay api ++ public final List realPlayers = new java.util.concurrent.CopyOnWriteArrayList<>(); // Leaves - replay api // CraftBukkit start private org.bukkit.craftbukkit.CraftServer cserver; -@@ -153,6 +154,128 @@ public abstract class PlayerList { +@@ -155,6 +156,124 @@ public abstract class PlayerList { abstract public void loadAndSaveFiles(); // Paper - fix converting txt to json file; moved from DedicatedPlayerList constructor @@ -336,7 +340,7 @@ index fce0114134eb1ffee558f6ce072e793eafbd6779..dc27a7b11c72ff0d184580edf4ac1376 + boolean flag1 = gamerules.get(GameRules.REDUCED_DEBUG_INFO); + boolean flag2 = gamerules.get(GameRules.LIMITED_CRAFTING); + -+ playerconnection.send(new ClientboundLoginPacket(player.getId(), worlddata.isHardcore(), this.server.levelKeys(), this.getMaxPlayers(), worldserver1.getWorld().getSendViewDistance(), worldserver1.getWorld().getSimulationDistance(), flag1, !flag, flag2, player.createCommonSpawnInfo(worldserver1), this.server.enforceSecureProfile())); // Paper - replace old player chunk management ++ playerconnection.send(new ClientboundLoginPacket(player.getId(), worlddata.isHardcore(), this.server.levelKeys(), this.getMaxPlayers(), io.papermc.paper.FeatureHooks.getViewDistance(worldserver1), io.papermc.paper.FeatureHooks.getSimulationDistance(worldserver1), flag1, !flag, flag2, player.createCommonSpawnInfo(worldserver1), this.server.enforceSecureProfile())); + player.getBukkitEntity().sendSupportedChannels(); // CraftBukkit + playerconnection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); + playerconnection.send(new ClientboundPlayerAbilitiesPacket(player.getAbilities())); @@ -357,10 +361,6 @@ index fce0114134eb1ffee558f6ce072e793eafbd6779..dc27a7b11c72ff0d184580edf4ac1376 + player.sendServerStatus(serverping); + } + -+ if (playersByName.containsKey(player.getScoreboardName()) || playersByUUID.containsKey(player.getUUID())) { -+ throw new IllegalStateException("There is a player with the same name as the photographer " + player.getScoreboardName() + " !"); -+ } -+ + this.players.add(player); + this.playersByName.put(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT), player); // Spigot + this.playersByUUID.put(player.getUUID(), player); @@ -439,10 +439,10 @@ index fce0114134eb1ffee558f6ce072e793eafbd6779..dc27a7b11c72ff0d184580edf4ac1376 + } + // Leaves end - replay mod api + - public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie cookie) { + public void placeNewPlayer(final Connection connection, final ServerPlayer player, final CommonListenerCookie cookie) { player.isRealPlayer = true; // Paper player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed -@@ -221,6 +344,7 @@ public abstract class PlayerList { +@@ -222,6 +341,7 @@ public abstract class PlayerList { // player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); // CraftBukkit - replaced with loop below this.players.add(player); @@ -450,15 +450,15 @@ index fce0114134eb1ffee558f6ce072e793eafbd6779..dc27a7b11c72ff0d184580edf4ac1376 this.playersByName.put(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT), player); // Spigot this.playersByUUID.put(player.getUUID(), player); // this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player))); // CraftBukkit - replaced with loop below -@@ -426,6 +550,7 @@ public abstract class PlayerList { +@@ -427,6 +547,7 @@ public abstract class PlayerList { } - protected void save(ServerPlayer player) { + protected void save(final ServerPlayer player) { + if (player instanceof org.leavesmc.leaves.replay.ServerPhotographer) return; // Leaves - skip photographer if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit player.lastSave = MinecraftServer.currentTick; // Paper - Incremental chunk and player saving this.playerIo.save(player); -@@ -440,6 +565,43 @@ public abstract class PlayerList { +@@ -441,6 +562,47 @@ public abstract class PlayerList { } } @@ -486,7 +486,11 @@ index fce0114134eb1ffee558f6ce072e793eafbd6779..dc27a7b11c72ff0d184580edf4ac1376 + entityplayer.retireScheduler(); + entityplayer.getAdvancements().stopListening(); + this.players.remove(entityplayer); -+ this.playersByName.remove(entityplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); ++ // Leaves - guard name removal so a photographer sharing a real player's name won't evict the real player's mapping ++ final String nameKey = entityplayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT); ++ if (this.playersByName.get(nameKey) == entityplayer) { ++ this.playersByName.remove(nameKey); ++ } + this.server.getCustomBossEvents().onPlayerDisconnect(entityplayer); + UUID uuid = entityplayer.getUUID(); + ServerPlayer entityplayer1 = this.playersByUUID.get(uuid); @@ -497,9 +501,9 @@ index fce0114134eb1ffee558f6ce072e793eafbd6779..dc27a7b11c72ff0d184580edf4ac1376 + + this.cserver.getScoreboardManager().removePlayer(entityplayer.getBukkitEntity()); + } -+ // Leaves stop - replay mod api ++ // Leaves end - replay mod api + - public net.kyori.adventure.text.@Nullable Component remove(ServerPlayer player) { // CraftBukkit - return string // Paper - return Component + public net.kyori.adventure.text.@Nullable Component remove(final ServerPlayer player) { // CraftBukkit - return string // Paper - return Component // Paper start - Fix kick event leave message not being sent return this.remove(player, net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, io.papermc.paper.configuration.GlobalConfiguration.get().messages.useDisplayNameInQuitMessage ? player.getBukkitEntity().displayName() : io.papermc.paper.adventure.PaperAdventure.asAdventure(player.getDisplayName()))); @@ -513,6 +675,7 @@ public abstract class PlayerList { @@ -510,27 +514,27 @@ index fce0114134eb1ffee558f6ce072e793eafbd6779..dc27a7b11c72ff0d184580edf4ac1376 this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot this.server.getCustomBossEvents().onPlayerDisconnect(player); UUID uuid = player.getUUID(); -@@ -841,14 +1004,14 @@ public abstract class PlayerList { +@@ -836,14 +999,14 @@ public abstract class PlayerList { } public String[] getPlayerNamesArray() { -- String[] strings = new String[this.players.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support -+ String[] strings = new String[this.realPlayers.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support, and skip photographer +- String[] names = new String[this.players.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support ++ String[] names = new String[this.realPlayers.size() + this.server.getBotList().bots.size()]; // Leaves - fakeplayer support, and skip photographer - for (int i = 0; i < this.players.size(); i++) { -- strings[i] = this.players.get(i).getGameProfile().name(); +- names[i] = this.players.get(i).getGameProfile().name(); + for (int i = 0; i < this.realPlayers.size(); i++) { // Leaves - only real players -+ strings[i] = this.realPlayers.get(i).getGameProfile().name(); // Leaves - only real players ++ names[i] = this.realPlayers.get(i).getGameProfile().name(); // Leaves - only real players } // Leaves start - fakeplayer support -- for (int i = this.players.size(); i < strings.length; ++i) { -- strings[i] = this.server.getBotList().bots.get(i - this.players.size()).getGameProfile().getName(); -+ for (int i = this.realPlayers.size(); i < strings.length; ++i) { // Leaves - only real players -+ strings[i] = this.server.getBotList().bots.get(i - this.realPlayers.size()).getGameProfile().name(); // Leaves - only real players +- for (int i = this.players.size(); i < names.length; ++i) { +- names[i] = this.server.getBotList().bots.get(i - this.players.size()).gameProfile.name(); ++ for (int i = this.realPlayers.size(); i < names.length; ++i) { // Leaves - only real players ++ names[i] = this.server.getBotList().bots.get(i - this.realPlayers.size()).gameProfile.name(); // Leaves - only real players } // Leaves end - fakeplayer support -@@ -915,7 +1078,7 @@ public abstract class PlayerList { +@@ -910,7 +1073,7 @@ public abstract class PlayerList { // Paper start - whitelist verify event / login event public LoginResult canBypassFullServerLogin(final NameAndId nameAndId, final LoginResult currentResult) { diff --git a/leaves-server/minecraft-patches/features/0072-Leaves-I18n-support.patch b/leaves-server/minecraft-patches/features/0070-Leaves-I18n-support.patch similarity index 52% rename from leaves-server/minecraft-patches/features/0072-Leaves-I18n-support.patch rename to leaves-server/minecraft-patches/features/0070-Leaves-I18n-support.patch index 699fbecc7..bc7c14adb 100644 --- a/leaves-server/minecraft-patches/features/0072-Leaves-I18n-support.patch +++ b/leaves-server/minecraft-patches/features/0070-Leaves-I18n-support.patch @@ -5,31 +5,31 @@ Subject: [PATCH] Leaves I18n support diff --git a/net/minecraft/locale/Language.java b/net/minecraft/locale/Language.java -index 7b9e2a1a208b46a69c16e6afd8b502259893574f..8ef3627217a8c495e4e31b70e61ad1b78d988278 100644 +index 3ee139b4c47cd5a747cf7aa4f95beb0c67f86143..22289e4247082c6c2388ab5df686f89e708a8eb1 100644 --- a/net/minecraft/locale/Language.java +++ b/net/minecraft/locale/Language.java -@@ -36,6 +36,7 @@ public abstract class Language { - Map map = new HashMap<>(); - BiConsumer biConsumer = map::put; - parseTranslations(biConsumer, "/assets/minecraft/lang/en_us.json"); -+ org.leavesmc.leaves.util.ServerI18nUtil.loadLeavesI18nDefault(biConsumer); // Leaves I18n - deprecatedTranslationsInfo.applyToMap(map); - final Map map1 = Map.copyOf(map); +@@ -37,6 +37,7 @@ public abstract class Language { + Map loadedData = new HashMap<>(); + BiConsumer output = loadedData::put; + parseTranslations(output, "/assets/minecraft/lang/en_us.json"); ++ org.leavesmc.leaves.util.ServerI18nUtil.loadLeavesI18nDefault(output); // Leaves I18n + deprecatedInfo.applyToMap(loadedData); + final Map storage = Map.copyOf(loadedData); return new Language() { -@@ -65,7 +66,7 @@ public abstract class Language { +@@ -66,7 +67,7 @@ public abstract class Language { }; } -- private static void parseTranslations(BiConsumer output, String languagePath) { -+ public static void parseTranslations(BiConsumer output, String languagePath) { // private -> public - try (InputStream resourceAsStream = Language.class.getResourceAsStream(languagePath)) { - loadFromJson(resourceAsStream, output); - } catch (JsonParseException | IOException var7) { +- private static void parseTranslations(final BiConsumer output, final String path) { ++ public static void parseTranslations(final BiConsumer output, final String path) { // Leaves - private -> public + try (InputStream stream = Language.class.getResourceAsStream(path)) { + loadFromJson(stream, output); + } catch (IOException | JsonParseException e) { diff --git a/net/minecraft/server/Main.java b/net/minecraft/server/Main.java -index b946df218837f424c5f6fcdc43f6fa106aae4edf..ca434d97dbdf4a805f6fa566d18b7256b9a2673f 100644 +index b730c6694e819813f8eb08b742d660937f9cbc21..f68b38e274947f96b371d832377e4b7c06e0c13e 100644 --- a/net/minecraft/server/Main.java +++ b/net/minecraft/server/Main.java -@@ -150,6 +150,8 @@ public class Main { +@@ -154,6 +154,8 @@ public class Main { return; } @@ -39,14 +39,14 @@ index b946df218837f424c5f6fcdc43f6fa106aae4edf..ca434d97dbdf4a805f6fa566d18b7256 String awtException = io.papermc.paper.util.ServerEnvironment.awtDependencyCheck(); if (awtException != null) { diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index 16ea8a00470943904ae167b7a670cd26c599f024..e6ad9b2a2478f768103b7829702cb25dda2cf63a 100644 +index c251bb40f9e2b370d38f1b4f0b8f7b18f88d2470..647abeb9e487cdead07cb38ae0c0184047923e6e 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -277,6 +277,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -292,6 +292,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface org.leavesmc.leaves.LeavesConfig.init((java.io.File) options.valueOf("leaves-settings")); // Leaves - Server Config this.getBotList().loadResumeBotInfo(); // Leaves - load resident bot info + org.leavesmc.leaves.util.ServerI18nUtil.init(); // Leaves I18n - com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics // Leaves - down - + com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics + com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now diff --git a/leaves-server/minecraft-patches/features/0073-Fix-minecraft-hopper-not-work-without-player.patch b/leaves-server/minecraft-patches/features/0071-Fix-minecraft-hopper-not-work-without-player.patch similarity index 90% rename from leaves-server/minecraft-patches/features/0073-Fix-minecraft-hopper-not-work-without-player.patch rename to leaves-server/minecraft-patches/features/0071-Fix-minecraft-hopper-not-work-without-player.patch index 3c45a5df2..7010400ca 100644 --- a/leaves-server/minecraft-patches/features/0073-Fix-minecraft-hopper-not-work-without-player.patch +++ b/leaves-server/minecraft-patches/features/0071-Fix-minecraft-hopper-not-work-without-player.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix minecraft hopper not work without player diff --git a/net/minecraft/world/entity/vehicle/minecart/MinecartHopper.java b/net/minecraft/world/entity/vehicle/minecart/MinecartHopper.java -index 3c961b76769f16160caedce8ec32bb2a2561163f..f2aae7add30a7652a98693efc0275fdafa274926 100644 +index 445c5cafad71028171c1f261939661775dd7f2bd..2db1ce5a62ac82f82a7f61f9df32abb134676a53 100644 --- a/net/minecraft/world/entity/vehicle/minecart/MinecartHopper.java +++ b/net/minecraft/world/entity/vehicle/minecart/MinecartHopper.java @@ -102,6 +102,13 @@ public class MinecartHopper extends AbstractMinecartContainer implements Hopper diff --git a/leaves-server/minecraft-patches/features/0074-RNG-Fishing.patch b/leaves-server/minecraft-patches/features/0072-RNG-Fishing.patch similarity index 52% rename from leaves-server/minecraft-patches/features/0074-RNG-Fishing.patch rename to leaves-server/minecraft-patches/features/0072-RNG-Fishing.patch index a9142e4fa..3a4a715b8 100644 --- a/leaves-server/minecraft-patches/features/0074-RNG-Fishing.patch +++ b/leaves-server/minecraft-patches/features/0072-RNG-Fishing.patch @@ -5,15 +5,15 @@ Subject: [PATCH] RNG Fishing diff --git a/net/minecraft/world/entity/projectile/FishingHook.java b/net/minecraft/world/entity/projectile/FishingHook.java -index 30e3c19adcdc55fa468257037ca49275c09de324..c6e87d453bfccbd7706ec45b105e469f8a27ba99 100644 +index 2d79dbb3e9667e810004cab440c7027800434c84..922b1d45144d78688a153235fec76016dc9cdca7 100644 --- a/net/minecraft/world/entity/projectile/FishingHook.java +++ b/net/minecraft/world/entity/projectile/FishingHook.java -@@ -531,7 +531,7 @@ public class FishingHook extends Projectile { - .withLuck(this.luck + playerOwner.getLuck()) +@@ -522,7 +522,7 @@ public class FishingHook extends Projectile { + .withLuck(this.luck + owner.getLuck()) .create(LootContextParamSets.FISHING); LootTable lootTable = this.level().getServer().reloadableRegistries().getLootTable(BuiltInLootTables.FISHING); -- List randomItems = lootTable.getRandomItems(lootParams); -+ List randomItems = org.leavesmc.leaves.LeavesConfig.modify.oldMC.rngFishing ? lootTable.getRandomItems(lootParams, this.random) : lootTable.getRandomItems(lootParams); // Leaves - world random - CriteriaTriggers.FISHING_ROD_HOOKED.trigger((ServerPlayer)playerOwner, stack, this, randomItems); +- List items = lootTable.getRandomItems(params); ++ List items = org.leavesmc.leaves.LeavesConfig.modify.oldMC.rngFishing ? lootTable.getRandomItems(params, this.random) : lootTable.getRandomItems(params); // Leaves - world random + CriteriaTriggers.FISHING_ROD_HOOKED.trigger((ServerPlayer)owner, rod, this, items); - for (ItemStack itemStack : randomItems) { + for (ItemStack itemStack : items) { diff --git a/leaves-server/minecraft-patches/features/0073-Wool-Hopper-Counter.patch b/leaves-server/minecraft-patches/features/0073-Wool-Hopper-Counter.patch new file mode 100644 index 000000000..4bf842549 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0073-Wool-Hopper-Counter.patch @@ -0,0 +1,90 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Tue, 4 Feb 2025 20:18:35 +0800 +Subject: [PATCH] Wool Hopper Counter + + +diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +index 326e25d1226ed1f719265e32b6e2d64eab6059a6..33d832852cf167c4925cd9548636fc712d2ddaf3 100644 +--- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +@@ -197,8 +197,30 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + changed |= action.getAsBoolean(); + } + ++ // Leaves start - Wool hopper counter ++ if (org.leavesmc.leaves.LeavesConfig.modify.hopperCounter.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { ++ net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, entity.getBlockPos().relative(state.getValue(HopperBlock.FACING))); ++ if (woolColor != null) { ++ for (int unlimited = 0; unlimited < Short.MAX_VALUE; unlimited++) { ++ changed |= suckInItems(level, entity); ++ if (!changed) { ++ break; ++ } else { ++ woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos)); ++ } ++ } ++ } ++ } ++ // Leaves end - Wool hopper counter ++ + if (changed) { + entity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot ++ // Leaves start - Wool hopper counter ++ if (org.leavesmc.leaves.LeavesConfig.modify.hopperCounter.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { ++ entity.setCooldown(0); ++ return true; ++ } ++ // Leaves end - Wool hopper counter + setChanged(level, pos, state); + // Leaves start - pca + if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { +@@ -423,6 +445,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + // Paper end - Perf: Optimize Hoppers + + private static boolean ejectItems(final Level level, final BlockPos blockPos, final HopperBlockEntity self) { ++ // Leaves start - hopper counter ++ if (org.leavesmc.leaves.util.HopperCounter.isEnabled()) { ++ if (woolHopperCounter(level, blockPos, level.getBlockState(blockPos), HopperBlockEntity.getContainerAt(level, blockPos))) { ++ return true; ++ } ++ } ++ // Leaves end - hopper counter + Container container = getAttachedContainer(level, blockPos, self); + if (container == null) { + return false; +@@ -436,6 +465,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + return hopperPush(level, container, direction, self); // Paper - Perf: Optimize Hoppers + } + ++ // Leaves start - hopper counter ++ private static boolean woolHopperCounter(final Level level, final BlockPos blockPos, final BlockState state, final @Nullable Container container) { ++ if (container == null) { ++ return false; ++ } ++ net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, blockPos.relative(state.getValue(HopperBlock.FACING))); ++ if (woolColor != null) { ++ for (int i = 0; i < container.getContainerSize(); ++i) { ++ if (!container.getItem(i).isEmpty()) { ++ ItemStack itemstack = container.getItem(i); ++ org.leavesmc.leaves.util.HopperCounter.getCounter(woolColor).add(level.getServer(), itemstack); ++ container.setItem(i, ItemStack.EMPTY); ++ } ++ } ++ return true; ++ } ++ return false; ++ } ++ // Leaves end - hopper counter ++ + private static int[] getSlots(final Container container, final Direction direction) { + if (container instanceof WorldlyContainer worldlyContainer) { + return worldlyContainer.getSlotsForFace(direction); +@@ -521,6 +570,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + } + + public static boolean addItem(final Container container, final ItemEntity entity) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.hopperCounter.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && entity.isRemoved()) return false; // Leaves - Wool hopper counter + boolean changed = false; + // CraftBukkit start + if (org.bukkit.event.inventory.InventoryPickupItemEvent.getHandlerList().getRegisteredListeners().length > 0) { // Paper - optimize hoppers diff --git a/leaves-server/minecraft-patches/features/0076-Spider-jockeys-drop-gapples.patch b/leaves-server/minecraft-patches/features/0074-Spider-jockeys-drop-gapples.patch similarity index 65% rename from leaves-server/minecraft-patches/features/0076-Spider-jockeys-drop-gapples.patch rename to leaves-server/minecraft-patches/features/0074-Spider-jockeys-drop-gapples.patch index eb8be47f0..38a7d387b 100644 --- a/leaves-server/minecraft-patches/features/0076-Spider-jockeys-drop-gapples.patch +++ b/leaves-server/minecraft-patches/features/0074-Spider-jockeys-drop-gapples.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Spider jockeys drop gapples diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java -index 94a01d35457053bb4265acb5542ae2f83671d9bb..f1638ebacf61d4baffea7eff60605c56ca03bb2e 100644 +index f2759462a4423d2c5d31d2c7fbfe96dc61081c77..28142a6131426eb6aee85572c8b0574331e414e9 100644 --- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java +++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java @@ -130,4 +130,25 @@ public class Skeleton extends AbstractSkeleton { @@ -15,17 +15,17 @@ index 94a01d35457053bb4265acb5542ae2f83671d9bb..f1638ebacf61d4baffea7eff60605c56 + + // Leaves start - spider jockeys drop gapples + @Override -+ protected void dropCustomDeathLoot(net.minecraft.server.level.ServerLevel level, DamageSource damageSource, boolean recentlyHit) { -+ super.dropCustomDeathLoot(level, damageSource, recentlyHit); -+ if (damageSource.getEntity() instanceof net.minecraft.world.entity.monster.Creeper creeper && creeper.isPowered() && !creeper.droppedSkulls) { ++ protected void dropCustomDeathLoot(final net.minecraft.server.level.ServerLevel level, final DamageSource source, final boolean playerKilled) { ++ super.dropCustomDeathLoot(level, source, playerKilled); ++ if (source.getEntity() instanceof net.minecraft.world.entity.monster.Creeper creeper && creeper.isPowered() && !creeper.droppedSkulls) { + creeper.droppedSkulls = true; + this.spawnAtLocation(level, net.minecraft.world.item.Items.SKELETON_SKULL); + } + } + + @Override -+ protected void dropFromLootTable(net.minecraft.server.level.ServerLevel level, DamageSource damageSource, boolean causedByPlayer) { -+ super.dropFromLootTable(level, damageSource, causedByPlayer); ++ protected void dropFromLootTable(final net.minecraft.server.level.ServerLevel level, final DamageSource source, final boolean playerKilled) { ++ super.dropFromLootTable(level, source, playerKilled); + if (org.leavesmc.leaves.LeavesConfig.modify.spiderJockeysDropGapples > 0.0D) { + if (this.getRootVehicle().getType() == EntityType.SPIDER && this.random.nextDouble() < org.leavesmc.leaves.LeavesConfig.modify.spiderJockeysDropGapples) { + this.spawnAtLocation(level, new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.ENCHANTED_GOLDEN_APPLE)); @@ -35,17 +35,17 @@ index 94a01d35457053bb4265acb5542ae2f83671d9bb..f1638ebacf61d4baffea7eff60605c56 + // Leaves end - spider jockeys drop gapples } diff --git a/net/minecraft/world/entity/monster/spider/Spider.java b/net/minecraft/world/entity/monster/spider/Spider.java -index 64a84f73d48deb254345a5c25f3fe650591e64a1..c4666ab51a1c308fbd632f8b598acb847f2b3ae9 100644 +index 1507f340b16fd95985bfe49870e923c626833d18..975693c1aa4a6e441040ed8dc9cbb77ba33ddd68 100644 --- a/net/minecraft/world/entity/monster/spider/Spider.java +++ b/net/minecraft/world/entity/monster/spider/Spider.java @@ -141,6 +141,18 @@ public class Spider extends Monster { - this.entityData.set(DATA_FLAGS_ID, b); + this.entityData.set(DATA_FLAGS_ID, flags); } + // Leaves start - spider jockeys drop gapples + @Override -+ protected void dropFromLootTable(net.minecraft.server.level.ServerLevel level, DamageSource damageSource, boolean causedByPlayer) { -+ super.dropFromLootTable(level, damageSource, causedByPlayer); ++ protected void dropFromLootTable(final net.minecraft.server.level.ServerLevel level, final net.minecraft.world.damagesource.DamageSource source, final boolean playerKilled) { ++ super.dropFromLootTable(level, source, playerKilled); + if (org.leavesmc.leaves.LeavesConfig.modify.spiderJockeysDropGapples > 0.0D) { + if (this.hasPassenger(entity -> entity.getType() == EntityType.SKELETON) && this.random.nextDouble() < org.leavesmc.leaves.LeavesConfig.modify.spiderJockeysDropGapples) { + this.spawnAtLocation(level, new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.ENCHANTED_GOLDEN_APPLE)); @@ -56,4 +56,4 @@ index 64a84f73d48deb254345a5c25f3fe650591e64a1..c4666ab51a1c308fbd632f8b598acb84 + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, @Nullable SpawnGroupData groupData diff --git a/leaves-server/minecraft-patches/features/0077-Force-Void-Trade.patch b/leaves-server/minecraft-patches/features/0075-Force-Void-Trade.patch similarity index 65% rename from leaves-server/minecraft-patches/features/0077-Force-Void-Trade.patch rename to leaves-server/minecraft-patches/features/0075-Force-Void-Trade.patch index 99eff177d..c71f191d4 100644 --- a/leaves-server/minecraft-patches/features/0077-Force-Void-Trade.patch +++ b/leaves-server/minecraft-patches/features/0075-Force-Void-Trade.patch @@ -5,24 +5,24 @@ Subject: [PATCH] Force Void Trade diff --git a/net/minecraft/world/entity/npc/villager/AbstractVillager.java b/net/minecraft/world/entity/npc/villager/AbstractVillager.java -index e6b79e6877b31253c065864e38b1ed62be0b0efb..e1f1e6c9a1328e6910c7c3ca06e651dd93e43d3e 100644 +index 9582f694ddbb47be7d820c5fe8791d5ba112ec6b..d68cc8ae9e2b5e2350fa226bcf8ed519579ce0c1 100644 --- a/net/minecraft/world/entity/npc/villager/AbstractVillager.java +++ b/net/minecraft/world/entity/npc/villager/AbstractVillager.java -@@ -44,6 +44,7 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa +@@ -57,6 +57,7 @@ public abstract class AbstractVillager extends AgeableMob implements Npc, Mercha private @Nullable Player tradingPlayer; protected @Nullable MerchantOffers offers; private final SimpleContainer inventory = new SimpleContainer(8, (org.bukkit.craftbukkit.entity.CraftAbstractVillager) this.getBukkitEntity()); // CraftBukkit - add argument + protected boolean voidTrade = false; // Leaves - force void trade - public AbstractVillager(EntityType type, Level level) { + public AbstractVillager(final EntityType type, final Level level) { super(type, level); -@@ -144,7 +145,13 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa +@@ -148,7 +149,13 @@ public abstract class AbstractVillager extends AgeableMob implements Npc, Mercha @Override public void processTrade(MerchantOffer offer, io.papermc.paper.event.player.@Nullable PlayerPurchaseEvent event) { // The MerchantRecipe passed in here is the one set by the PlayerPurchaseEvent if (event == null || event.willIncreaseTradeUses()) { - offer.increaseUses(); + // Leaves start - force void trade -+ if (voidTrade) { ++ if (this.voidTrade) { + offer.increaseVoidUses(); + } else { + offer.increaseUses(); @@ -31,25 +31,25 @@ index e6b79e6877b31253c065864e38b1ed62be0b0efb..e1f1e6c9a1328e6910c7c3ca06e651dd } if (event == null || event.isRewardingExp()) { this.rewardTradeXp(offer); -@@ -156,7 +163,7 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa +@@ -160,7 +167,7 @@ public abstract class AbstractVillager extends AgeableMob implements Npc, Mercha @Override - public void notifyTrade(MerchantOffer offer) { + public void notifyTrade(final MerchantOffer offer) { // offer.increaseUses(); // Paper - Add PlayerTradeEvent and PlayerPurchaseEvent - this.ambientSoundTime = -this.getAmbientSoundInterval(); -+ if (!voidTrade) this.ambientSoundTime = -this.getAmbientSoundInterval(); // Leaves - force void trade ++ if (!this.voidTrade) this.ambientSoundTime = -this.getAmbientSoundInterval(); // Leaves - force void trade // this.rewardTradeXp(offer); // Paper - Add PlayerTradeEvent and PlayerPurchaseEvent if (this.tradingPlayer instanceof ServerPlayer) { CriteriaTriggers.TRADE.trigger((ServerPlayer)this.tradingPlayer, this, offer.getResult()); -@@ -173,7 +180,7 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa +@@ -177,7 +184,7 @@ public abstract class AbstractVillager extends AgeableMob implements Npc, Mercha @Override - public void notifyTradeUpdated(ItemStack stack) { + public void notifyTradeUpdated(final ItemStack itemStack) { if (!this.level().isClientSide() && this.ambientSoundTime > -this.getAmbientSoundInterval() + 20) { - this.ambientSoundTime = -this.getAmbientSoundInterval(); -+ if (!voidTrade) this.ambientSoundTime = -this.getAmbientSoundInterval(); // Leaves - force void trade - this.makeSound(this.getTradeUpdatedSound(!stack.isEmpty())); ++ if (!this.voidTrade) this.ambientSoundTime = -this.getAmbientSoundInterval(); // Leaves - force void trade + this.makeSound(this.getTradeUpdatedSound(!itemStack.isEmpty())); } } -@@ -218,6 +225,12 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa +@@ -222,9 +229,21 @@ public abstract class AbstractVillager extends AgeableMob implements Npc, Mercha } protected void stopTrading() { @@ -62,37 +62,35 @@ index e6b79e6877b31253c065864e38b1ed62be0b0efb..e1f1e6c9a1328e6910c7c3ca06e651dd this.setTradingPlayer(null); } -@@ -296,4 +309,10 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa - public boolean stillValid(Player player) { - return this.getTradingPlayer() == player && this.isAlive() && player.isWithinEntityInteractionRange(this, 4.0); - } -+ + // Leaves start - force void trade + public void setVoidTrade() { + this.voidTrade = true; + } + // Leaves end - force void trade - } ++ + @Override + public void die(final DamageSource source) { + super.die(source); diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java -index 89844d7e804cc8a2110b694e448bc5993991bea7..681960e4453cbbe60203948b4acdebf33af7a71d 100644 +index e4ba6e200e85f4e226d6a3e68db734f277b89226..5ba17ee4f048a6bb109a7706fe1adfe3de152e59 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java -@@ -384,6 +384,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -361,6 +361,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } - private void startTrading(Player player) { + private void startTrading(final Player player) { + this.voidTrade = false; // Leaves - force void trade this.updateSpecialPrices(player); this.setTradingPlayer(player); this.openTradingScreen(player, this.getDisplayName(), this.getVillagerData().level()); -@@ -617,8 +618,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -612,8 +613,12 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re @Override - protected void rewardTradeXp(MerchantOffer offer) { - int i = 3 + this.random.nextInt(4); + protected void rewardTradeXp(final MerchantOffer offer) { + int popXp = 3 + this.random.nextInt(4); - this.villagerXp = this.villagerXp + offer.getXp(); - this.lastTradedPlayer = this.getTradingPlayer(); + // Leaves start - force void trade -+ if (!voidTrade) { ++ if (!this.voidTrade) { + this.villagerXp += offer.getXp(); + this.lastTradedPlayer = this.getTradingPlayer(); + } @@ -101,25 +99,19 @@ index 89844d7e804cc8a2110b694e448bc5993991bea7..681960e4453cbbe60203948b4acdebf3 this.updateMerchantTimer = 40; this.increaseProfessionLevelOnUpdate = true; diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java -index 3eb6ee2ffecbdeb6057d81b7936b80e205db7cdc..8de44af1247797acdb9e9307ff094a72fb662e04 100644 +index 104bf115e9cbd10bb2801ece34a6879b452edf63..11662a8f0945db2e0daf45695a9313189aa06a7e 100644 --- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java -@@ -124,9 +124,10 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +@@ -120,6 +120,7 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over return InteractionResult.CONSUME; } -- this.setTradingPlayer(player); -- this.openTradingScreen(player, this.getDisplayName(), 1); -- } + this.voidTrade = false; // Leaves - force void trade -+ this.setTradingPlayer(player); -+ this.openTradingScreen(player, this.getDisplayName(), 1); -+ } - - return InteractionResult.SUCCESS; - } else { + this.setTradingPlayer(player); + this.openTradingScreen(player, this.getDisplayName(), 1); + } diff --git a/net/minecraft/world/inventory/MerchantMenu.java b/net/minecraft/world/inventory/MerchantMenu.java -index ade7732b638b30ad0ae50605793cbf75754aad0e..8ca85b07ad3a9902359704bf7071146d99153959 100644 +index 7fcc2c2ad603699e176bb95559e51134174ecc20..8aa48fd5be819af44ce1ac4f5e101a9ae66a457d 100644 --- a/net/minecraft/world/inventory/MerchantMenu.java +++ b/net/minecraft/world/inventory/MerchantMenu.java @@ -25,7 +25,7 @@ public class MerchantMenu extends AbstractContainerMenu { @@ -132,7 +124,7 @@ index ade7732b638b30ad0ae50605793cbf75754aad0e..8ca85b07ad3a9902359704bf7071146d private int merchantLevel; private boolean showProgressBar; diff --git a/net/minecraft/world/item/trading/MerchantOffer.java b/net/minecraft/world/item/trading/MerchantOffer.java -index 6afeb92c2e00ca5b945b7c7de9257bd741d53c3d..f5b82f56a59dd150938e35dde0333e7ea91fd042 100644 +index 7e605e64aa386aadfa8ffc135d955f5b4a3f4381..ca76581c33f8d8d996deed0a714db82163fc36bb 100644 --- a/net/minecraft/world/item/trading/MerchantOffer.java +++ b/net/minecraft/world/item/trading/MerchantOffer.java @@ -39,6 +39,7 @@ public class MerchantOffer { @@ -142,7 +134,7 @@ index 6afeb92c2e00ca5b945b7c7de9257bd741d53c3d..f5b82f56a59dd150938e35dde0333e7e + public int voidTradeUses; // Leaves - force void trade // CraftBukkit start - private @javax.annotation.Nullable org.bukkit.craftbukkit.inventory.CraftMerchantRecipe bukkitHandle; + private org.bukkit.craftbukkit.inventory.@org.jspecify.annotations.Nullable CraftMerchantRecipe bukkitHandle; @@ -78,6 +79,7 @@ public class MerchantOffer { this.priceMultiplier = priceMultiplier; this.xp = xp; @@ -150,8 +142,8 @@ index 6afeb92c2e00ca5b945b7c7de9257bd741d53c3d..f5b82f56a59dd150938e35dde0333e7e + this.voidTradeUses = 0; // Leaves - force void trade } - public MerchantOffer(ItemCost baseCostA, ItemStack result, int maxUses, int xp, float priceMultiplier) { -@@ -167,6 +169,16 @@ public class MerchantOffer { + public MerchantOffer(final ItemCost buy, final ItemStack result, final int maxUses, final int xp, final float priceMultiplier) { +@@ -186,6 +188,16 @@ public class MerchantOffer { this.uses++; } @@ -168,7 +160,7 @@ index 6afeb92c2e00ca5b945b7c7de9257bd741d53c3d..f5b82f56a59dd150938e35dde0333e7e public int getDemand() { return this.demand; } -@@ -196,7 +208,7 @@ public class MerchantOffer { +@@ -215,7 +227,7 @@ public class MerchantOffer { } public boolean isOutOfStock() { @@ -178,16 +170,15 @@ index 6afeb92c2e00ca5b945b7c7de9257bd741d53c3d..f5b82f56a59dd150938e35dde0333e7e public void setToOutOfStock() { diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java -index 4b959091412defb5ae6ffe387f98ed1cc9a29e5f..0d9b286bcc25ad5376a7a22ae4323bd553d4da3d 100644 +index f9bb42aa5f85c3a4ef144d9131ae9e2d7d7ed78b..e0874a0f424b81dcb694db0e83099ee82b2bfcff 100644 --- a/net/minecraft/world/level/block/EndGatewayBlock.java +++ b/net/minecraft/world/level/block/EndGatewayBlock.java -@@ -107,6 +107,17 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { - public @Nullable TeleportTransition getPortalDestination(ServerLevel level, Entity entity, BlockPos pos) { - if (level.getBlockEntity(pos) instanceof TheEndGatewayBlockEntity theEndGatewayBlockEntity) { - Vec3 portalPosition = theEndGatewayBlockEntity.getPortalPosition(level, pos); -+ +@@ -112,6 +112,15 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { + public @Nullable TeleportTransition getPortalDestination(final ServerLevel currentLevel, final Entity entity, final BlockPos portalEntryPos) { + if (currentLevel.getBlockEntity(portalEntryPos) instanceof TheEndGatewayBlockEntity endGatewayBlockEntity) { + Vec3 teleportPosition = endGatewayBlockEntity.getPortalPosition(currentLevel, portalEntryPos); + // Leaves start - force void trade -+ if (org.leavesmc.leaves.LeavesConfig.modify.forceVoidTrade && portalPosition != null && entity instanceof net.minecraft.server.level.ServerPlayer player) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.forceVoidTrade && teleportPosition != null && entity instanceof net.minecraft.server.level.ServerPlayer player) { + if (player.containerMenu instanceof net.minecraft.world.inventory.MerchantMenu merchantMenu) { + if (merchantMenu.trader instanceof net.minecraft.world.entity.npc.villager.AbstractVillager villager) { + villager.setVoidTrade(); @@ -195,7 +186,6 @@ index 4b959091412defb5ae6ffe387f98ed1cc9a29e5f..0d9b286bcc25ad5376a7a22ae4323bd5 + } + } + // Leaves end - force void trade -+ - if (portalPosition == null) { + if (teleportPosition == null) { return null; } else { diff --git a/leaves-server/minecraft-patches/features/0075-Wool-Hopper-Counter.patch b/leaves-server/minecraft-patches/features/0075-Wool-Hopper-Counter.patch deleted file mode 100644 index b02897cb9..000000000 --- a/leaves-server/minecraft-patches/features/0075-Wool-Hopper-Counter.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Tue, 4 Feb 2025 20:18:35 +0800 -Subject: [PATCH] Wool Hopper Counter - -This patch is Powered by fabric-carpet(https://github.com/gnembon/fabric-carpet) - -diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index 9b0d26b7a8c0656848cfa659065abae6fc2fdab4..e3e7d8c9e704d49d78472ac7b9239f93031d2fd1 100644 ---- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -206,8 +206,30 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - flag |= validator.getAsBoolean(); // Paper - note: this is not a validator, it's what adds/sucks in items - } - -+ // Leaves start - Wool hopper counter -+ if (org.leavesmc.leaves.LeavesConfig.modify.hopperCounter.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled()) { -+ net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, blockEntity.getBlockPos().relative(state.getValue(HopperBlock.FACING))); -+ if (woolColor != null) { -+ for (int i = 0; i < Short.MAX_VALUE; i++) { -+ flag |= suckInItems(level, blockEntity); -+ if (!flag) { -+ break; -+ } else { -+ woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos)); -+ } -+ } -+ } -+ } -+ // Leaves end - Wool hopper counter -+ - if (flag) { - blockEntity.setCooldown(level.spigotConfig.hopperTransfer); // Spigot -+ // Leaves start - Wool hopper counter -+ if (org.leavesmc.leaves.LeavesConfig.modify.hopperCounter.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && woolHopperCounter(level, pos, state, HopperBlockEntity.getContainerAt(level, pos))) { -+ blockEntity.setCooldown(0); -+ return true; -+ } -+ // Leaves end - Wool hopper counter - setChanged(level, pos, state); - // Leaves start - pca - if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { -@@ -433,6 +455,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - // Paper end - Perf: Optimize Hoppers - - private static boolean ejectItems(Level level, BlockPos pos, HopperBlockEntity blockEntity) { -+ // Leaves start - hopper counter -+ if (org.leavesmc.leaves.util.HopperCounter.isEnabled()) { -+ if (woolHopperCounter(level, pos, level.getBlockState(pos), HopperBlockEntity.getContainerAt(level, pos))) { -+ return true; -+ } -+ } -+ // Leaves end - hopper counter - Container attachedContainer = getAttachedContainer(level, pos, blockEntity); - if (attachedContainer == null) { - return false; -@@ -499,6 +528,26 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - } - } - -+ // Leaves start - hopper counter -+ private static boolean woolHopperCounter(Level level, BlockPos blockPos, BlockState state, @Nullable Container container) { -+ if (container == null) { -+ return false; -+ } -+ net.minecraft.world.item.DyeColor woolColor = org.leavesmc.leaves.util.WoolUtils.getWoolColorAtPosition(level, blockPos.relative(state.getValue(HopperBlock.FACING))); -+ if (woolColor != null) { -+ for (int i = 0; i < container.getContainerSize(); ++i) { -+ if (!container.getItem(i).isEmpty()) { -+ ItemStack itemstack = container.getItem(i); -+ org.leavesmc.leaves.util.HopperCounter.getCounter(woolColor).add(level.getServer(), itemstack); -+ container.setItem(i, ItemStack.EMPTY); -+ } -+ } -+ return true; -+ } -+ return false; -+ } -+ // Leaves end - hopper counter -+ - private static int[] getSlots(Container container, Direction direction) { - if (container instanceof WorldlyContainer worldlyContainer) { - return worldlyContainer.getSlotsForFace(direction); -@@ -633,6 +682,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - } - - public static boolean addItem(Container container, ItemEntity item) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.hopperCounter.unlimitedSpeed && org.leavesmc.leaves.util.HopperCounter.isEnabled() && item.isRemoved()) return false; // Leaves - Wool hopper counter - boolean flag = false; - // CraftBukkit start - if (org.bukkit.event.inventory.InventoryPickupItemEvent.getHandlerList().getRegisteredListeners().length > 0) { // Paper - optimize hoppers diff --git a/leaves-server/minecraft-patches/features/0078-Villager-infinite-discounts.patch b/leaves-server/minecraft-patches/features/0076-Villager-infinite-discounts.patch similarity index 81% rename from leaves-server/minecraft-patches/features/0078-Villager-infinite-discounts.patch rename to leaves-server/minecraft-patches/features/0076-Villager-infinite-discounts.patch index c7cba5a23..39d933b0f 100644 --- a/leaves-server/minecraft-patches/features/0078-Villager-infinite-discounts.patch +++ b/leaves-server/minecraft-patches/features/0076-Villager-infinite-discounts.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Villager infinite discounts diff --git a/net/minecraft/world/entity/ai/gossip/GossipType.java b/net/minecraft/world/entity/ai/gossip/GossipType.java -index 32548e375202452c5f5ec89fec8a82d62252e823..b8a05c113e8b228c904e952f6ab2b4c38694dc3e 100644 +index f5e02819debed6be1f43d379a6e7bd17bc6d71a6..9b7cb1e2a7187840c5e9bcbd676bc5d10622748d 100644 --- a/net/minecraft/world/entity/ai/gossip/GossipType.java +++ b/net/minecraft/world/entity/ai/gossip/GossipType.java @@ -15,9 +15,9 @@ public enum GossipType implements StringRepresentable { @@ -19,4 +19,4 @@ index 32548e375202452c5f5ec89fec8a82d62252e823..b8a05c113e8b228c904e952f6ab2b4c3 + public int decayPerTransfer; // Leaves - not final public static final Codec CODEC = StringRepresentable.fromEnum(GossipType::values); - private GossipType(final String id, final int weight, final int max, final int decayPerDay, final int decayPerTransfer) { + GossipType(final String id, final int weight, final int max, final int decayPerDay, final int decayPerTransfer) { diff --git a/leaves-server/minecraft-patches/features/0079-CCE-update-suppression.patch b/leaves-server/minecraft-patches/features/0077-CCE-update-suppression.patch similarity index 85% rename from leaves-server/minecraft-patches/features/0079-CCE-update-suppression.patch rename to leaves-server/minecraft-patches/features/0077-CCE-update-suppression.patch index 52cdfadb5..44572519e 100644 --- a/leaves-server/minecraft-patches/features/0079-CCE-update-suppression.patch +++ b/leaves-server/minecraft-patches/features/0077-CCE-update-suppression.patch @@ -5,11 +5,11 @@ Subject: [PATCH] CCE update suppression diff --git a/net/minecraft/world/level/block/ShulkerBoxBlock.java b/net/minecraft/world/level/block/ShulkerBoxBlock.java -index 02f3e470ed70de87deeb8180f50da11724bf5198..1b6bddc15f39c381050eb20c5ad43581d471d876 100644 +index 450dd13892ec6ad049fe6e4c134221cadd25c2a1..9133d78f29e4a18a8102a27be97e018e298e2398 100644 --- a/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/net/minecraft/world/level/block/ShulkerBoxBlock.java @@ -183,7 +183,9 @@ public class ShulkerBoxBlock extends BaseEntityBlock { - protected int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos, Direction direction) { + protected int getAnalogOutputSignal(final BlockState state, final Level level, final BlockPos pos, final Direction direction) { // Leaves start - update suppression crash fix try { - return AbstractContainerMenu.getRedstoneSignalFromBlockEntity(level.getBlockEntity(pos)); diff --git a/leaves-server/minecraft-patches/features/0080-Disable-offline-warn-if-use-proxy.patch b/leaves-server/minecraft-patches/features/0078-Disable-offline-warn-if-use-proxy.patch similarity index 88% rename from leaves-server/minecraft-patches/features/0080-Disable-offline-warn-if-use-proxy.patch rename to leaves-server/minecraft-patches/features/0078-Disable-offline-warn-if-use-proxy.patch index 544d39dae..e1915af3c 100644 --- a/leaves-server/minecraft-patches/features/0080-Disable-offline-warn-if-use-proxy.patch +++ b/leaves-server/minecraft-patches/features/0078-Disable-offline-warn-if-use-proxy.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Disable offline warn if use proxy diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index e6ad9b2a2478f768103b7829702cb25dda2cf63a..fd53f41ded5f8904e1ac8d037250709ee8c43f23 100644 +index 647abeb9e487cdead07cb38ae0c0184047923e6e..a02d4f4c7241ebff526964035d7ae327cf4a7b0a 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -332,7 +332,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -348,7 +348,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface String proxyFlavor = (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.velocity.enabled) ? "Velocity" : "BungeeCord"; String proxyLink = (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.velocity.enabled) ? "https://docs.papermc.io/velocity/security" : "http://www.spigotmc.org/wiki/firewall-guide/"; // Paper end - Add Velocity IP Forwarding Support diff --git a/leaves-server/minecraft-patches/features/0081-Make-Item-tick-vanilla.patch b/leaves-server/minecraft-patches/features/0079-Make-Item-tick-vanilla.patch similarity index 81% rename from leaves-server/minecraft-patches/features/0081-Make-Item-tick-vanilla.patch rename to leaves-server/minecraft-patches/features/0079-Make-Item-tick-vanilla.patch index ead4fc65e..c6ec9ca05 100644 --- a/leaves-server/minecraft-patches/features/0081-Make-Item-tick-vanilla.patch +++ b/leaves-server/minecraft-patches/features/0079-Make-Item-tick-vanilla.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Make Item tick vanilla diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index 41050491bde33981448b3da0290f8edfaee82c30..80f9c003b125a3af29c1456b6f796a43954a9aad 100644 +index 83299a0e7a11ab1983bc07e4f0a71477d9c3a181..45c491d2f234b6db9a88aab2cda6b423c7fd11e4 100644 --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java -@@ -126,6 +126,9 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -133,6 +133,9 @@ public class ItemEntity extends Entity implements TraceableEntity { // Paper start - EAR 2 @Override public void inactiveTick() { @@ -18,7 +18,7 @@ index 41050491bde33981448b3da0290f8edfaee82c30..80f9c003b125a3af29c1456b6f796a43 super.inactiveTick(); if (this.pickupDelay > 0 && this.pickupDelay != 32767) { this.pickupDelay--; -@@ -143,6 +146,8 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -150,6 +153,8 @@ public class ItemEntity extends Entity implements TraceableEntity { // CraftBukkit end this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause } diff --git a/leaves-server/minecraft-patches/features/0082-Copper-Bulb-1-gt-delay.patch b/leaves-server/minecraft-patches/features/0080-Copper-Bulb-1-gt-delay.patch similarity index 62% rename from leaves-server/minecraft-patches/features/0082-Copper-Bulb-1-gt-delay.patch rename to leaves-server/minecraft-patches/features/0080-Copper-Bulb-1-gt-delay.patch index d8b164a80..6ee08fce2 100644 --- a/leaves-server/minecraft-patches/features/0082-Copper-Bulb-1-gt-delay.patch +++ b/leaves-server/minecraft-patches/features/0080-Copper-Bulb-1-gt-delay.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Copper Bulb 1 gt delay diff --git a/net/minecraft/world/level/block/CopperBulbBlock.java b/net/minecraft/world/level/block/CopperBulbBlock.java -index 79ce45289d9ab81fb2cd7fdf1b32042e84a01a50..32b774ddee171387d79f7da34520996622daefa5 100644 +index ebc44c7adf15ea8a67b4253a18eafe2c9eadb3e2..d280e871a51360d34e21238481e94f80af4e96f0 100644 --- a/net/minecraft/world/level/block/CopperBulbBlock.java +++ b/net/minecraft/world/level/block/CopperBulbBlock.java -@@ -33,14 +33,26 @@ public class CopperBulbBlock extends Block { +@@ -33,7 +33,13 @@ public class CopperBulbBlock extends Block { @Override - protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + protected void onPlace(final BlockState state, final Level level, final BlockPos pos, final BlockState oldState, final boolean movedByPiston) { if (oldState.getBlock() != state.getBlock() && level instanceof ServerLevel serverLevel) { - this.checkAndFlip(state, serverLevel, pos); + // Leaves start - copper bulb 1 gt delay @@ -23,33 +23,29 @@ index 79ce45289d9ab81fb2cd7fdf1b32042e84a01a50..32b774ddee171387d79f7da345209966 } } - @Override - protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) { +@@ -42,9 +48,24 @@ public class CopperBulbBlock extends Block { + final BlockState state, final Level level, final BlockPos pos, final Block block, final @Nullable Orientation orientation, final boolean movedByPiston + ) { if (level instanceof ServerLevel serverLevel) { - this.checkAndFlip(state, serverLevel, pos); -+ // Leaves start - copper bulb 1 gt ++ // Leaves start - copper bulb 1 gt delay + if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.copperBulb1gt) { + this.checkAndFlip(state, serverLevel, pos); + } else { + level.scheduleTick(pos, this, 1); + } + // Leaves end - copper bulb 1 gt delay - } - } - -@@ -57,6 +69,15 @@ public class CopperBulbBlock extends Block { - } - } - ++ } ++ } ++ + // Leaves start - copper bulb 1 gt delay + @Override -+ public void tick(BlockState state, ServerLevel world, BlockPos pos, net.minecraft.util.RandomSource random) { ++ public void tick(final BlockState state, final ServerLevel level, final BlockPos pos, final net.minecraft.util.RandomSource random) { + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.copperBulb1gt) { -+ checkAndFlip(state, world, pos); -+ } -+ } ++ this.checkAndFlip(state, level, pos); + } + } + // Leaves end - copper bulb 1 gt delay -+ - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(LIT, POWERED); + + public void checkAndFlip(final BlockState state, final ServerLevel level, final BlockPos pos) { + boolean signal = level.hasNeighborSignal(pos); diff --git a/leaves-server/minecraft-patches/features/0083-Crafter-1-gt-delay.patch b/leaves-server/minecraft-patches/features/0081-Crafter-1-gt-delay.patch similarity index 67% rename from leaves-server/minecraft-patches/features/0083-Crafter-1-gt-delay.patch rename to leaves-server/minecraft-patches/features/0081-Crafter-1-gt-delay.patch index daf4a0779..cff6812ae 100644 --- a/leaves-server/minecraft-patches/features/0083-Crafter-1-gt-delay.patch +++ b/leaves-server/minecraft-patches/features/0081-Crafter-1-gt-delay.patch @@ -5,21 +5,21 @@ Subject: [PATCH] Crafter 1 gt delay diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java -index 3faa541c4a4623e915269d6241e1a3a3c6e374ff..468a39219d82a665b99ac1768435557d6f3326c9 100644 +index 2b97fd6af1c4956eb173b8c66c2a3efc8772a798..2d98e505cc5d7c22966a3605a77e0bbf0edf2ee4 100644 --- a/net/minecraft/world/level/block/CrafterBlock.java +++ b/net/minecraft/world/level/block/CrafterBlock.java -@@ -75,7 +75,7 @@ public class CrafterBlock extends BaseEntityBlock { - boolean triggeredValue = state.getValue(TRIGGERED); +@@ -77,7 +77,7 @@ public class CrafterBlock extends BaseEntityBlock { + boolean isTriggered = state.getValue(TRIGGERED); BlockEntity blockEntity = level.getBlockEntity(pos); - if (hasNeighborSignal && !triggeredValue) { + if (shouldTrigger && !isTriggered) { - level.scheduleTick(pos, this, 4); + level.scheduleTick(pos, this, !org.leavesmc.leaves.LeavesConfig.modify.oldMC.crafter1gt ? 4 : 1); // Leaves - crafter 1 gt delay level.setBlock(pos, state.setValue(TRIGGERED, true), Block.UPDATE_CLIENTS); this.setBlockEntityTriggered(blockEntity, true); - } else if (!hasNeighborSignal && triggeredValue) { -@@ -124,7 +124,7 @@ public class CrafterBlock extends BaseEntityBlock { + } else if (!shouldTrigger && isTriggered) { +@@ -126,7 +126,7 @@ public class CrafterBlock extends BaseEntityBlock { @Override - public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { + public void setPlacedBy(final Level level, final BlockPos pos, final BlockState state, final @Nullable LivingEntity by, final ItemStack itemStack) { if (state.getValue(TRIGGERED)) { - level.scheduleTick(pos, this, 4); + level.scheduleTick(pos, this, !org.leavesmc.leaves.LeavesConfig.modify.oldMC.crafter1gt ? 4 : 1); // Leaves - crafter 1 gt delay diff --git a/leaves-server/minecraft-patches/features/0084-More-Region-Format-Support.patch b/leaves-server/minecraft-patches/features/0082-More-Region-Format-Support.patch similarity index 68% rename from leaves-server/minecraft-patches/features/0084-More-Region-Format-Support.patch rename to leaves-server/minecraft-patches/features/0082-More-Region-Format-Support.patch index 996f3414e..9a8b99b6f 100644 --- a/leaves-server/minecraft-patches/features/0084-More-Region-Format-Support.patch +++ b/leaves-server/minecraft-patches/features/0082-More-Region-Format-Support.patch @@ -21,10 +21,10 @@ index a814512fcfb85312474ae2c2c21443843bf57831..2b0349568f38321c893a8ffa16607350 public MoonriseRegionFileIO.RegionDataController.WriteData moonrise$startWrite( final int chunkX, final int chunkZ, final CompoundTag compound diff --git a/ca/spottedleaf/moonrise/patches/chunk_system/io/MoonriseRegionFileIO.java b/ca/spottedleaf/moonrise/patches/chunk_system/io/MoonriseRegionFileIO.java -index aa3d5a6ea59ac77665f2cfaa56a7d383016d08d0..2f56cda82824053b3f5321cec2e93f9c6a7e84e8 100644 +index 3bb9b58ee97464687e348e23b99159226415c267..c06564d28ad7384e1672136021621b42ef84ca14 100644 --- a/ca/spottedleaf/moonrise/patches/chunk_system/io/MoonriseRegionFileIO.java +++ b/ca/spottedleaf/moonrise/patches/chunk_system/io/MoonriseRegionFileIO.java -@@ -1274,7 +1274,7 @@ public final class MoonriseRegionFileIO { +@@ -1273,7 +1273,7 @@ public final class MoonriseRegionFileIO { this.regionDataController.finishWrite(this.chunkX, this.chunkZ, writeData); // Paper start - flush regionfiles on save if (this.world.paperConfig().chunks.flushRegionsOnSave) { @@ -33,7 +33,7 @@ index aa3d5a6ea59ac77665f2cfaa56a7d383016d08d0..2f56cda82824053b3f5321cec2e93f9c if (regionFile != null) { regionFile.flush(); } // else: evicted from cache, which should have called flush -@@ -1490,7 +1490,7 @@ public final class MoonriseRegionFileIO { +@@ -1489,7 +1489,7 @@ public final class MoonriseRegionFileIO { public static interface IORunnable { @@ -54,73 +54,75 @@ index 51c126735ace8fdde89ad97b5cab62f244212db0..a6573e327ace16b7ea320eb1440ffcbc + public void moonrise$write(final org.leavesmc.leaves.region.IRegionFile regionFile) throws IOException; // Leaves - more region format } diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 6853577d7ae7e28cf68338b4939d7b01958563d1..499fa53ef47da7e46e6646d0c88a9c51c8fea7f1 100644 +index 95bb2ec78ec0d773cf065a8b60722576a3eae3bd..9b522f910812ab3523bca22c6575836e0520735f 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -961,10 +961,10 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> progressMap = Reference2FloatMaps.synchronize(new Reference2FloatOpenHashMap<>()); - volatile Component status = Component.translatable("optimizeWorld.stage.counting"); -- static final Pattern REGEX = Pattern.compile("^r\\.(-?[0-9]+)\\.(-?[0-9]+)\\.mca$"); -+ static final Pattern REGEX = org.leavesmc.leaves.region.IRegionFileFactory.getRegionFileRegex(); // Leaves - more region format - final DimensionDataStorage overworldDataStorage; - - public WorldUpgrader( -@@ -270,7 +270,7 @@ public class WorldUpgrader implements AutoCloseable { - } - - private static List getAllChunkPositions(RegionStorageInfo regionStorageInfo, Path path) { -- File[] files = path.toFile().listFiles((directory, filename) -> filename.endsWith(".mca")); -+ File[] files = path.toFile().listFiles((directory, filename) -> org.leavesmc.leaves.region.IRegionFileFactory.isRegionFile(filename)); // Leaves - more region format - if (files == null) { - return List.of(); - } else { -@@ -283,7 +283,7 @@ public class WorldUpgrader implements AutoCloseable { - int i1 = Integer.parseInt(matcher.group(2)) << 5; - List list1 = Lists.newArrayList(); - -- try (RegionFile regionFile = new RegionFile(regionStorageInfo, file.toPath(), path, true)) { -+ try (org.leavesmc.leaves.region.IRegionFile regionFile = org.leavesmc.leaves.region.IRegionFileFactory.createRegionFile(regionStorageInfo, file.toPath(), path, true)) { // Leaves - more region format - for (int i2 = 0; i2 < 32; i2++) { - for (int i3 = 0; i3 < 32; i3++) { - ChunkPos chunkPos = new ChunkPos(i2 + i, i3 + i1); -@@ -331,7 +331,7 @@ public class WorldUpgrader implements AutoCloseable { - - protected abstract boolean tryProcessOnePosition(SimpleRegionStorage regionStorage, ChunkPos chunkPos, ResourceKey dimension); - -- private void onFileFinished(RegionFile regionFile) { -+ private void onFileFinished(org.leavesmc.leaves.region.IRegionFile regionFile) { // Leaves - more region format - if (WorldUpgrader.this.recreateRegionFiles) { - if (this.previousWriteFuture != null) { - this.previousWriteFuture.join(); -@@ -441,7 +441,7 @@ public class WorldUpgrader implements AutoCloseable { - } + return result; +diff --git a/net/minecraft/util/worldupdate/FileToUpgrade.java b/net/minecraft/util/worldupdate/FileToUpgrade.java +index a7f2cfa9277c898038f6b9e0a3401db51012b64c..eed7abc6eb84592ade0fa1bc247c726c7891fb7f 100644 +--- a/net/minecraft/util/worldupdate/FileToUpgrade.java ++++ b/net/minecraft/util/worldupdate/FileToUpgrade.java +@@ -4,5 +4,5 @@ import java.util.List; + import net.minecraft.world.level.ChunkPos; + import net.minecraft.world.level.chunk.storage.RegionFile; + +-public record FileToUpgrade(RegionFile file, List chunksToUpgrade) { ++public record FileToUpgrade(org.leavesmc.leaves.region.IRegionFile file, List chunksToUpgrade) { // Leaves - more region format + } +diff --git a/net/minecraft/util/worldupdate/RegionStorageUpgrader.java b/net/minecraft/util/worldupdate/RegionStorageUpgrader.java +index b228cd6c54e8c8998923ab332882d99092769c67..a5ed73e542afd79b9ec5358639b168f25bd0a18c 100644 +--- a/net/minecraft/util/worldupdate/RegionStorageUpgrader.java ++++ b/net/minecraft/util/worldupdate/RegionStorageUpgrader.java +@@ -36,7 +36,7 @@ import org.slf4j.Logger; + public class RegionStorageUpgrader { + private static final Logger LOGGER = LogUtils.getLogger(); + private static final String NEW_DIRECTORY_PREFIX = "new_"; +- private static final Pattern REGEX = Pattern.compile("^r\\.(-?[0-9]+)\\.(-?[0-9]+)\\.mca$"); ++ private static final Pattern REGEX = org.leavesmc.leaves.region.IRegionFileFactory.getRegionFileRegex(); // Leaves - more region format + private final DataFixer dataFixer; + private final UpgradeProgress upgradeProgress; + private final String type; +@@ -162,7 +162,7 @@ public class RegionStorageUpgrader { } -- record FileToUpgrade(RegionFile file, List chunksToUpgrade) { -+ record FileToUpgrade(org.leavesmc.leaves.region.IRegionFile file, List chunksToUpgrade) { // Leaves - more region format + private static List getAllChunkPositions(final RegionStorageInfo info, final Path regionFolder) { +- File[] files = regionFolder.toFile().listFiles((dir, name) -> name.endsWith(".mca")); ++ File[] files = regionFolder.toFile().listFiles((dir, name) -> org.leavesmc.leaves.region.IRegionFileFactory.isRegionFile(name)); // Leaves - more region format + if (files == null) { + return List.of(); + } +@@ -176,7 +176,7 @@ public class RegionStorageUpgrader { + int zOffset = Integer.parseInt(regex.group(2)) << 5; + List chunkPositions = Lists.newArrayList(); + +- try (RegionFile regionSource = new RegionFile(info, regionFile.toPath(), regionFolder, true)) { ++ try (org.leavesmc.leaves.region.IRegionFile regionSource = org.leavesmc.leaves.region.IRegionFileFactory.createRegionFile(info, regionFile.toPath(), regionFolder, true)) { // Leaves - more region format + for (int x = 0; x < 32; x++) { + for (int z = 0; z < 32; z++) { + ChunkPos pos = new ChunkPos(x + xOffset, z + zOffset); +@@ -253,7 +253,7 @@ public class RegionStorageUpgrader { + return storage.upgradeChunkTag(chunkTag, this.defaultVersion, this.dataFixContextTag, targetVersion); } - class PoiUpgrader extends WorldUpgrader.SimpleRegionStorageUpgrader { +- private void onFileFinished(final RegionFile regionFile) { ++ private void onFileFinished(final org.leavesmc.leaves.region.IRegionFile regionFile) { // Leaves - more region format + if (this.recreateRegionFiles) { + if (this.previousWriteFuture != null) { + this.previousWriteFuture.join(); diff --git a/net/minecraft/world/level/chunk/storage/RegionFile.java b/net/minecraft/world/level/chunk/storage/RegionFile.java -index c6adcb44bc96eaeba74bfc228a6a61765b1628e7..69580a685bae83236f8047cf6afad05958ff072c 100644 +index 42d07aef0b2f646ec52ed6f4e7c003dbf82bd92d..19b7e8c5b964fbd3a72a2b99c95e3098ee0f02fa 100644 --- a/net/minecraft/world/level/chunk/storage/RegionFile.java +++ b/net/minecraft/world/level/chunk/storage/RegionFile.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.ChunkPos; @@ -141,16 +143,16 @@ index c6adcb44bc96eaeba74bfc228a6a61765b1628e7..69580a685bae83236f8047cf6afad059 if (!this.canRecalcHeader) { return false; } -@@ -791,7 +791,7 @@ public class RegionFile implements AutoCloseable, ca.spottedleaf.moonrise.patche +@@ -789,7 +789,7 @@ public class RegionFile implements AutoCloseable, ca.spottedleaf.moonrise.patche } } -- protected synchronized void write(ChunkPos chunkPos, ByteBuffer chunkData) throws IOException { -+ public synchronized void write(ChunkPos chunkPos, ByteBuffer chunkData) throws IOException { // Leaves - more region format - int offsetIndex = getOffsetIndex(chunkPos); - int i = this.offsets.get(offsetIndex); - int sectorNumber = getSectorNumber(i); -@@ -909,7 +909,7 @@ public class RegionFile implements AutoCloseable, ca.spottedleaf.moonrise.patche +- protected synchronized void write(final ChunkPos pos, final ByteBuffer data) throws IOException { ++ public synchronized void write(final ChunkPos pos, final ByteBuffer data) throws IOException { // Leaves - more region format + int offsetIndex = getOffsetIndex(pos); + int offset = this.offsets.get(offsetIndex); + int sectorNumber = getSectorNumber(offset); +@@ -907,7 +907,7 @@ public class RegionFile implements AutoCloseable, ca.spottedleaf.moonrise.patche } @Override @@ -159,7 +161,7 @@ index c6adcb44bc96eaeba74bfc228a6a61765b1628e7..69580a685bae83236f8047cf6afad059 regionFile.write(this.pos, ByteBuffer.wrap(this.buf, 0, this.count)); } // Paper end - rewrite chunk system -@@ -975,11 +975,11 @@ public class RegionFile implements AutoCloseable, ca.spottedleaf.moonrise.patche +@@ -973,11 +973,11 @@ public class RegionFile implements AutoCloseable, ca.spottedleaf.moonrise.patche return (x & 31) + (z & 31) * 32; } @@ -173,7 +175,7 @@ index c6adcb44bc96eaeba74bfc228a6a61765b1628e7..69580a685bae83236f8047cf6afad059 final int offset = getChunkIndex(x, z); boolean previous = this.oversized[offset] == 1; this.oversized[offset] = (byte) (oversized ? 1 : 0); -@@ -1018,7 +1018,7 @@ public class RegionFile implements AutoCloseable, ca.spottedleaf.moonrise.patche +@@ -1016,7 +1016,7 @@ public class RegionFile implements AutoCloseable, ca.spottedleaf.moonrise.patche return this.path.getParent().resolve(this.path.getFileName().toString().replaceAll("\\.mca$", "") + "_oversized_" + x + "_" + z + ".nbt"); } @@ -183,7 +185,7 @@ index c6adcb44bc96eaeba74bfc228a6a61765b1628e7..69580a685bae83236f8047cf6afad059 try (DataInputStream out = new DataInputStream(new java.io.BufferedInputStream(new java.util.zip.InflaterInputStream(Files.newInputStream(file))))) { return net.minecraft.nbt.NbtIo.read((java.io.DataInput) out); diff --git a/net/minecraft/world/level/chunk/storage/RegionFileStorage.java b/net/minecraft/world/level/chunk/storage/RegionFileStorage.java -index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca32a5d7b7f 100644 +index e47a91b1869801258d0db20c126722fb06522c80..69c6c40b1706870c7a89a366f51cc30105672bdb 100644 --- a/net/minecraft/world/level/chunk/storage/RegionFileStorage.java +++ b/net/minecraft/world/level/chunk/storage/RegionFileStorage.java @@ -19,7 +19,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise @@ -195,7 +197,7 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 private final RegionStorageInfo info; private final Path folder; private final boolean sync; -@@ -34,7 +34,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -30,7 +30,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise @Nullable public static ChunkPos getRegionFileCoordinates(Path file) { String fileName = file.getFileName().toString(); @@ -204,7 +206,7 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 return null; } -@@ -55,7 +55,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -51,7 +51,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise } // Paper end // Paper start - rewrite chunk system @@ -213,26 +215,26 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 private static final int MAX_NON_EXISTING_CACHE = 1024 * 4; private final it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet nonExistingRegionFiles = new it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet(); private static String getRegionFileName(final int chunkX, final int chunkZ) { -@@ -94,15 +94,15 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -90,15 +90,15 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise } @Override - public synchronized final RegionFile moonrise$getRegionFileIfLoaded(final int chunkX, final int chunkZ) { + public synchronized final org.leavesmc.leaves.region.IRegionFile moonrise$getRegionFileIfLoaded(final int chunkX, final int chunkZ) { // Leaves - more region format - return this.regionCache.getAndMoveToFirst(ChunkPos.asLong(chunkX >> REGION_SHIFT, chunkZ >> REGION_SHIFT)); + return this.regionCache.getAndMoveToFirst(ChunkPos.pack(chunkX >> REGION_SHIFT, chunkZ >> REGION_SHIFT)); } @Override - public synchronized final RegionFile moonrise$getRegionFileIfExists(final int chunkX, final int chunkZ) throws IOException { + public synchronized final org.leavesmc.leaves.region.IRegionFile moonrise$getRegionFileIfExists(final int chunkX, final int chunkZ) throws IOException { // Leaves - more region format - final long key = ChunkPos.asLong(chunkX >> REGION_SHIFT, chunkZ >> REGION_SHIFT); + final long key = ChunkPos.pack(chunkX >> REGION_SHIFT, chunkZ >> REGION_SHIFT); - RegionFile ret = this.regionCache.getAndMoveToFirst(key); + org.leavesmc.leaves.region.IRegionFile ret = this.regionCache.getAndMoveToFirst(key); if (ret != null) { return ret; } -@@ -115,18 +115,28 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -113,18 +113,28 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise this.regionCache.removeLast().close(); } @@ -264,7 +266,7 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 this.regionCache.putAndMoveToFirst(key, ret); -@@ -145,7 +155,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -143,7 +153,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise } final ChunkPos pos = new ChunkPos(chunkX, chunkZ); @@ -273,7 +275,7 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 // note: not required to keep regionfile loaded after this call, as the write param takes a regionfile as input // (and, the regionfile parameter is unused for writing until the write call) -@@ -179,7 +189,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -177,7 +187,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise ) throws IOException { final ChunkPos pos = new ChunkPos(chunkX, chunkZ); if (writeData.result() == ca.spottedleaf.moonrise.patches.chunk_system.io.MoonriseRegionFileIO.RegionDataController.WriteData.WriteResult.DELETE) { @@ -282,7 +284,7 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 if (regionFile != null) { regionFile.clear(pos); } // else: didn't exist -@@ -194,7 +204,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -192,7 +202,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise public final ca.spottedleaf.moonrise.patches.chunk_system.io.MoonriseRegionFileIO.RegionDataController.ReadData moonrise$readData( final int chunkX, final int chunkZ ) throws IOException { @@ -291,7 +293,7 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 final DataInputStream input = regionFile == null ? null : regionFile.getChunkDataInputStream(new ChunkPos(chunkX, chunkZ)); -@@ -239,7 +249,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -237,7 +247,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise final ChunkPos pos = new ChunkPos(chunkX, chunkZ); final ChunkPos headerChunkPos = SerializableChunkData.getChunkCoordinate(ret); @@ -300,27 +302,27 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 if (regionFile.getRecalculateCount() != readData.recalculateCount()) { return null; -@@ -263,7 +273,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -261,7 +271,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise } // Paper end - rewrite chunk system // Paper start - rewrite chunk system -- public RegionFile getRegionFile(ChunkPos chunkcoordintpair) throws IOException { -+ public org.leavesmc.leaves.region.IRegionFile getRegionFile(ChunkPos chunkcoordintpair) throws IOException { // Leaves - more region format - return this.getRegionFile(chunkcoordintpair, false); +- public RegionFile getRegionFile(ChunkPos pos) throws IOException { ++ public org.leavesmc.leaves.region.IRegionFile getRegionFile(ChunkPos pos) throws IOException { // Leaves - more region format + return this.getRegionFile(pos, false); } // Paper end - rewrite chunk system -@@ -275,7 +285,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise - this.isChunkData = isChunkDataFolder(this.folder); // Paper - recalculate region file headers +@@ -273,7 +283,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise + this.isChunkData = info.dfuType()[0] == net.minecraft.util.datafix.DataFixTypes.CHUNK; // Paper - recalculate region file headers } -- @org.jetbrains.annotations.Contract("_, false -> !null") @Nullable private RegionFile getRegionFile(ChunkPos chunkPos, boolean existingOnly) throws IOException { // CraftBukkit -+ @org.jetbrains.annotations.Contract("_, false -> !null") private org.leavesmc.leaves.region.IRegionFile getRegionFile(ChunkPos chunkPos, boolean existingOnly) throws IOException { // CraftBukkit // Leaves - more region format +- @org.jetbrains.annotations.Contract("_, false -> !null") private @Nullable RegionFile getRegionFile(final ChunkPos pos, boolean existingOnly) throws IOException { // CraftBukkit ++ @org.jetbrains.annotations.Contract("_, false -> !null") private org.leavesmc.leaves.region.@Nullable IRegionFile getRegionFile(final ChunkPos pos, boolean existingOnly) throws IOException { // CraftBukkit // Leaves - more region format // Paper start - rewrite chunk system if (existingOnly) { - return this.moonrise$getRegionFileIfExists(chunkPos.x, chunkPos.z); -@@ -283,7 +293,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise + return this.moonrise$getRegionFileIfExists(pos.x(), pos.z()); +@@ -281,7 +291,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise synchronized (this) { - final long key = ChunkPos.asLong(chunkPos.x >> REGION_SHIFT, chunkPos.z >> REGION_SHIFT); + final long key = ChunkPos.pack(pos.x() >> REGION_SHIFT, pos.z() >> REGION_SHIFT); - RegionFile ret = this.regionCache.getAndMoveToFirst(key); + org.leavesmc.leaves.region.IRegionFile ret = this.regionCache.getAndMoveToFirst(key); // Leaves - more region format @@ -331,10 +333,10 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 this.regionCache.removeLast().close(); } -- final Path regionPath = this.folder.resolve(getRegionFileName(chunkPos.x, chunkPos.z)); +- final Path regionPath = this.folder.resolve(getRegionFileName(pos.x(), pos.z())); + // Leaves start - more region format -+ Path regionPath = this.folder.resolve(org.leavesmc.leaves.region.IRegionFileFactory.getFirstRegionFileName(chunkPos.x, chunkPos.z)); -+ for (String fileName : org.leavesmc.leaves.region.IRegionFileFactory.getRegionFileName(chunkPos.x, chunkPos.z)) { ++ Path regionPath = this.folder.resolve(org.leavesmc.leaves.region.IRegionFileFactory.getFirstRegionFileName(pos.x(), pos.z())); ++ for (String fileName : org.leavesmc.leaves.region.IRegionFileFactory.getRegionFileName(pos.x(), pos.z())) { + Path newRegionPath = this.folder.resolve(fileName); + if (java.nio.file.Files.exists(newRegionPath)) { + regionPath = newRegionPath; @@ -353,42 +355,42 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 this.regionCache.putAndMoveToFirst(key, ret); @@ -312,7 +331,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise - org.apache.logging.log4j.LogManager.getLogger().fatal(msg + " (" + file.toString().replaceAll(".+[\\\\/]", "") + " - " + x + "," + z + ") Go clean it up to remove this message. /minecraft:tp " + (x<<4)+" 128 "+(z<<4) + " - DO NOT REPORT THIS TO PAPER - You may ask for help on Discord, but do not file an issue. These error messages can not be removed."); + LOGGER.error("{} ({} - {},{}) Go clean it up to remove this message. /minecraft:tp {} 128 {} - DO NOT REPORT THIS TO PAPER - You may ask for help on Discord, but do not file an issue. These error messages can not be removed.", msg, file.toString().replaceAll(".+[\\\\/]", ""), x, z, x << 4, z << 4); } - private static CompoundTag readOversizedChunk(RegionFile regionfile, ChunkPos chunkCoordinate) throws IOException { + private static CompoundTag readOversizedChunk(org.leavesmc.leaves.region.IRegionFile regionfile, ChunkPos chunkCoordinate) throws IOException { // Leaves - more region format synchronized (regionfile) { try (DataInputStream datainputstream = regionfile.getChunkDataInputStream(chunkCoordinate)) { - CompoundTag oversizedData = regionfile.getOversizedData(chunkCoordinate.x, chunkCoordinate.z); + CompoundTag oversizedData = regionfile.getOversizedData(chunkCoordinate.x(), chunkCoordinate.z()); @@ -346,7 +365,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise - public @Nullable CompoundTag read(ChunkPos chunkPos) throws IOException { + public @Nullable CompoundTag read(final ChunkPos pos) throws IOException { // CraftBukkit start - SPIGOT-5680: There's no good reason to preemptively create files on read, save that for writing -- RegionFile regionFile = this.getRegionFile(chunkPos, true); -+ org.leavesmc.leaves.region.IRegionFile regionFile = this.getRegionFile(chunkPos, true); // Leaves - more region format - if (regionFile == null) { +- RegionFile region = this.getRegionFile(pos, true); ++ org.leavesmc.leaves.region.IRegionFile region = this.getRegionFile(pos, true); // Leaves - more region format + if (region == null) { return null; } -@@ -385,7 +404,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -383,7 +402,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise - public void scanChunk(ChunkPos chunkPos, StreamTagVisitor visitor) throws IOException { + public void scanChunk(final ChunkPos pos, final StreamTagVisitor scanner) throws IOException { // CraftBukkit start - SPIGOT-5680: There's no good reason to preemptively create files on read, save that for writing -- RegionFile regionFile = this.getRegionFile(chunkPos, true); -+ org.leavesmc.leaves.region.IRegionFile regionFile = this.getRegionFile(chunkPos, true); // Leaves - more region format - if (regionFile == null) { +- RegionFile region = this.getRegionFile(pos, true); ++ org.leavesmc.leaves.region.IRegionFile region = this.getRegionFile(pos, true); // Leaves - more region format + if (region == null) { return; } -@@ -400,7 +419,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -398,7 +417,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise - public void write(ChunkPos chunkPos, @Nullable CompoundTag chunkData) throws IOException { // Paper - rewrite chunk system - public + public void write(final ChunkPos pos, final @Nullable CompoundTag value) throws IOException { // Paper - rewrite chunk system - public if (!SharedConstants.DEBUG_DONT_SAVE_WORLD) { -- RegionFile regionFile = this.getRegionFile(chunkPos, chunkData == null); // CraftBukkit // Paper - rewrite chunk system -+ org.leavesmc.leaves.region.IRegionFile regionFile = this.getRegionFile(chunkPos, chunkData == null); // CraftBukkit // Paper - rewrite chunk system // Leaves - more region format +- RegionFile region = this.getRegionFile(pos, value == null); // CraftBukkit // Paper - rewrite chunk system ++ org.leavesmc.leaves.region.IRegionFile region = this.getRegionFile(pos, value == null); // CraftBukkit // Paper - rewrite chunk system // Leaves - more region format // Paper start - rewrite chunk system - if (regionFile == null) { + if (region == null) { // if the RegionFile doesn't exist, no point in deleting from it -@@ -431,7 +450,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -430,7 +449,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise // Paper start - rewrite chunk system synchronized (this) { final ExceptionCollector exceptionCollector = new ExceptionCollector<>(); @@ -397,7 +399,7 @@ index 1e9e061ec694ad64fc2724b83a66dfec7e069a43..a242151f911d9b8f0ae0ebfea6440ca3 try { regionFile.close(); } catch (final IOException ex) { -@@ -447,7 +466,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise +@@ -446,7 +465,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise // Paper start - rewrite chunk system synchronized (this) { final ExceptionCollector exceptionCollector = new ExceptionCollector<>(); diff --git a/leaves-server/minecraft-patches/features/0085-No-TNT-place-update.patch b/leaves-server/minecraft-patches/features/0083-No-TNT-place-update.patch similarity index 83% rename from leaves-server/minecraft-patches/features/0085-No-TNT-place-update.patch rename to leaves-server/minecraft-patches/features/0083-No-TNT-place-update.patch index 06cdec1b4..37e719cbd 100644 --- a/leaves-server/minecraft-patches/features/0085-No-TNT-place-update.patch +++ b/leaves-server/minecraft-patches/features/0083-No-TNT-place-update.patch @@ -5,12 +5,12 @@ Subject: [PATCH] No TNT place update diff --git a/net/minecraft/world/level/block/TntBlock.java b/net/minecraft/world/level/block/TntBlock.java -index 00da328f21e5ce5de6f968323b14a7832a6cbd62..03aaf2ced00873f74fa15cb72cd2cf88fa1a8651 100644 +index d450d1e8625863a991d7a8ee54d83f9906ce4d60..2dd4e63acf45eaca5391349ec364e05bde5e9bb9 100644 --- a/net/minecraft/world/level/block/TntBlock.java +++ b/net/minecraft/world/level/block/TntBlock.java @@ -47,7 +47,7 @@ public class TntBlock extends Block { @Override - protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + protected void onPlace(final BlockState state, final Level level, final BlockPos pos, final BlockState oldState, final boolean movedByPiston) { if (!oldState.is(state.getBlock())) { - if (level.hasNeighborSignal(pos) && prime(level, pos, () -> org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.REDSTONE, null, null))) { // CraftBukkit - TNTPrimeEvent + if (level.hasNeighborSignal(pos) && !org.leavesmc.leaves.LeavesConfig.modify.noTNTPlaceUpdate && prime(level, pos, () -> org.bukkit.craftbukkit.event.CraftEventFactory.callTNTPrimeEvent(level, pos, org.bukkit.event.block.TNTPrimeEvent.PrimeCause.REDSTONE, null, null))) { // CraftBukkit - TNTPrimeEvent // Leaves - prevent update diff --git a/leaves-server/minecraft-patches/features/0086-Servux-Protocol.patch b/leaves-server/minecraft-patches/features/0084-Servux-Protocol.patch similarity index 83% rename from leaves-server/minecraft-patches/features/0086-Servux-Protocol.patch rename to leaves-server/minecraft-patches/features/0084-Servux-Protocol.patch index a97e6cce4..26712ecdf 100644 --- a/leaves-server/minecraft-patches/features/0086-Servux-Protocol.patch +++ b/leaves-server/minecraft-patches/features/0084-Servux-Protocol.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Servux Protocol diff --git a/net/minecraft/server/ServerTickRateManager.java b/net/minecraft/server/ServerTickRateManager.java -index 4257c47d33e3773fac766817138cc21c55d9ab76..8638f3f7aa853802a60ddeb681d089e0c6143693 100644 +index eeb2f88723b37bb3cada04bf3098dd46f0ed7316..36ccd875ebb8f13b28731fb99420beb77b977216 100644 --- a/net/minecraft/server/ServerTickRateManager.java +++ b/net/minecraft/server/ServerTickRateManager.java -@@ -129,4 +129,10 @@ public class ServerTickRateManager extends TickRateManager { +@@ -133,4 +133,10 @@ public class ServerTickRateManager extends TickRateManager { player.connection.send(ClientboundTickingStatePacket.from(this)); player.connection.send(ClientboundTickingStepPacket.from(this)); } @@ -20,10 +20,10 @@ index 4257c47d33e3773fac766817138cc21c55d9ab76..8638f3f7aa853802a60ddeb681d089e0 + // Leaves end - servux } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 499714800b2160cf163fc7a37e287f655a9d80ee..81094f0ab63dfb48f7ae9a529d407dec5e356626 100644 +index fa2032a630ce9791cf7dfb2f968ee05163b6379e..d73dc43d451886ad22adfe65b64c13bd3eca09aa 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -2316,9 +2316,21 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2380,9 +2380,21 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet // Paper end } diff --git a/leaves-server/minecraft-patches/features/0087-Placing-locked-hopper-no-longer-send-NC-updates.patch b/leaves-server/minecraft-patches/features/0085-Placing-locked-hopper-no-longer-send-NC-updates.patch similarity index 60% rename from leaves-server/minecraft-patches/features/0087-Placing-locked-hopper-no-longer-send-NC-updates.patch rename to leaves-server/minecraft-patches/features/0085-Placing-locked-hopper-no-longer-send-NC-updates.patch index 5bb9caba2..26033dacf 100644 --- a/leaves-server/minecraft-patches/features/0087-Placing-locked-hopper-no-longer-send-NC-updates.patch +++ b/leaves-server/minecraft-patches/features/0085-Placing-locked-hopper-no-longer-send-NC-updates.patch @@ -5,19 +5,19 @@ Subject: [PATCH] Placing locked hopper no longer send NC updates diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 6c60317613df508b593cc1cfa4f62b0ca303ed93..6b9f1e5421a66c0a42f93c66a61c0fbecc913a16 100644 +index 48f044d8296c0b35d22202887c515872787ed3f3..961bc61685e2b6f6d38aeb770018beb634378427 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -1170,7 +1170,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1176,7 +1176,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } - if ((flags & Block.UPDATE_NEIGHBORS) != 0) { -- this.updateNeighborsAt(pos, blockState.getBlock()); + if ((updateFlags & Block.UPDATE_NEIGHBORS) != 0) { +- this.updateNeighborsAt(pos, oldState.getBlock()); + // Leaves start - Placing locked hopper doesn't send NC updates. + if (!(blockState.getBlock() instanceof net.minecraft.world.level.block.HopperBlock) || blockState.getValue(net.minecraft.world.level.block.HopperBlock.ENABLED)) { -+ this.updateNeighborsAt(pos, blockState.getBlock()); ++ this.updateNeighborsAt(pos, oldState.getBlock()); + } + // Leaves end - Placing locked hopper doesn't send NC updates. - if (!this.isClientSide() && state.hasAnalogOutputSignal()) { - this.updateNeighbourForOutputSignal(pos, newState.getBlock()); + if (!this.isClientSide() && blockState.hasAnalogOutputSignal()) { + this.updateNeighbourForOutputSignal(pos, blockState.getBlock()); } diff --git a/leaves-server/minecraft-patches/features/0088-Renewable-deepslate.patch b/leaves-server/minecraft-patches/features/0086-Renewable-deepslate.patch similarity index 60% rename from leaves-server/minecraft-patches/features/0088-Renewable-deepslate.patch rename to leaves-server/minecraft-patches/features/0086-Renewable-deepslate.patch index 3edc5355a..7fd3bf89b 100644 --- a/leaves-server/minecraft-patches/features/0088-Renewable-deepslate.patch +++ b/leaves-server/minecraft-patches/features/0086-Renewable-deepslate.patch @@ -5,24 +5,24 @@ Subject: [PATCH] Renewable deepslate diff --git a/net/minecraft/world/level/block/LiquidBlock.java b/net/minecraft/world/level/block/LiquidBlock.java -index 1f62dcf2709d430e996790750a691b12938eb09a..2d6f4579fa27b0f9117abf13671a47576fffb155 100644 +index 615279417cb3ee216f02530ddf95782a21e10333..fa74266781de859a935b847a07c5eb8166cc6392 100644 --- a/net/minecraft/world/level/block/LiquidBlock.java +++ b/net/minecraft/world/level/block/LiquidBlock.java -@@ -196,7 +196,7 @@ public class LiquidBlock extends Block implements BucketPickup { +@@ -241,7 +241,7 @@ public class LiquidBlock extends Block implements BucketPickup { for (Direction direction : POSSIBLE_FLOW_DIRECTIONS) { - BlockPos blockPos = pos.relative(direction.getOpposite()); - if (level.getFluidState(blockPos).is(FluidTags.WATER)) { -- Block block = level.getFluidState(pos).isSource() ? Blocks.OBSIDIAN : Blocks.COBBLESTONE; -+ Block block = level.getFluidState(pos).isSource() ? Blocks.OBSIDIAN : (org.leavesmc.leaves.LeavesConfig.modify.renewableDeepslate && level.dimension() == Level.OVERWORLD && pos.getY() < 0 ? Blocks.COBBLED_DEEPSLATE : Blocks.COBBLESTONE); // Leaves - renewable deepslate + BlockPos neighbourPos = pos.relative(direction.getOpposite()); + if (level.getFluidState(neighbourPos).is(FluidTags.WATER)) { +- Block convertToBlock = level.getFluidState(pos).isSource() ? Blocks.OBSIDIAN : Blocks.COBBLESTONE; ++ Block convertToBlock = level.getFluidState(pos).isSource() ? Blocks.OBSIDIAN : (org.leavesmc.leaves.LeavesConfig.modify.renewableDeepslate && level.dimension() == net.minecraft.world.level.Level.OVERWORLD && pos.getY() < 0 ? Blocks.COBBLED_DEEPSLATE : Blocks.COBBLESTONE); // Leaves - renewable deepslate // CraftBukkit start - if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, block.defaultBlockState(), Block.UPDATE_ALL)) { + if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level, pos, convertToBlock.defaultBlockState(), Block.UPDATE_ALL)) { this.fizz(level, pos); diff --git a/net/minecraft/world/level/material/LavaFluid.java b/net/minecraft/world/level/material/LavaFluid.java -index a42878c191445ba4b0d50dd2b789a132d5cf6a3e..69ea51ee111b9595a234c9f8177f35147be35b94 100644 +index 76284429b4d9439de04a9a71acac9802ac8d14d2..f17dde9131126c727479f23bad745c61a49c1ed4 100644 --- a/net/minecraft/world/level/material/LavaFluid.java +++ b/net/minecraft/world/level/material/LavaFluid.java -@@ -224,7 +224,7 @@ public abstract class LavaFluid extends FlowingFluid { - if (this.is(FluidTags.LAVA) && fluidState1.is(FluidTags.WATER)) { +@@ -225,7 +225,7 @@ public abstract class LavaFluid extends FlowingFluid { + if (this.is(FluidTags.LAVA) && fluidState.is(FluidTags.WATER)) { if (state.getBlock() instanceof LiquidBlock) { // CraftBukkit start - if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(level.getMinecraftWorld(), pos, Blocks.STONE.defaultBlockState(), Block.UPDATE_ALL)) { diff --git a/leaves-server/minecraft-patches/features/0089-Renewable-sponges.patch b/leaves-server/minecraft-patches/features/0087-Renewable-sponges.patch similarity index 77% rename from leaves-server/minecraft-patches/features/0089-Renewable-sponges.patch rename to leaves-server/minecraft-patches/features/0087-Renewable-sponges.patch index 3cffd46f9..31d6180ab 100644 --- a/leaves-server/minecraft-patches/features/0089-Renewable-sponges.patch +++ b/leaves-server/minecraft-patches/features/0087-Renewable-sponges.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Renewable sponges diff --git a/net/minecraft/world/entity/monster/Guardian.java b/net/minecraft/world/entity/monster/Guardian.java -index 8229de18fbac59493b377b12a281f3f4d74731d7..df574ab74cea4f2fbe83815983d65498a5fcba61 100644 +index 39c7c9d7b92872b013fe4dbf68dafd02ecab3ab9..c67584b3db57760cd782c3b1dbbb3777600a1e1f 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java -@@ -446,6 +446,28 @@ public class Guardian extends Monster { +@@ -444,6 +444,28 @@ public class Guardian extends Monster { } } @@ -16,9 +16,9 @@ index 8229de18fbac59493b377b12a281f3f4d74731d7..df574ab74cea4f2fbe83815983d65498 + @Override + public void thunderHit(net.minecraft.server.level.ServerLevel level, net.minecraft.world.entity.LightningBolt lightning) { + if (org.leavesmc.leaves.LeavesConfig.modify.renewableSponges && !this.isRemoved() && !(this instanceof ElderGuardian)) { -+ ElderGuardian elderGuardian = new ElderGuardian(EntityType.ELDER_GUARDIAN ,this.level()); ++ ElderGuardian elderGuardian = new ElderGuardian(EntityType.ELDER_GUARDIAN, this.level()); + elderGuardian.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); -+ elderGuardian.finalizeSpawn(level ,this.level().getMinecraftWorld().getCurrentDifficultyAt(elderGuardian.blockPosition()), EntitySpawnReason.CONVERSION, null); ++ elderGuardian.finalizeSpawn(level, level.getCurrentDifficultyAt(elderGuardian.blockPosition()), EntitySpawnReason.CONVERSION, null); + elderGuardian.setNoAi(this.isNoAi()); + + if (this.hasCustomName()) { @@ -34,6 +34,6 @@ index 8229de18fbac59493b377b12a281f3f4d74731d7..df574ab74cea4f2fbe83815983d65498 + } + // Leaves end - renewable sponges + - static class GuardianMoveControl extends MoveControl { + private static class GuardianMoveControl extends MoveControl { private final Guardian guardian; diff --git a/leaves-server/minecraft-patches/features/0090-Renewable-coral.patch b/leaves-server/minecraft-patches/features/0088-Renewable-coral.patch similarity index 58% rename from leaves-server/minecraft-patches/features/0090-Renewable-coral.patch rename to leaves-server/minecraft-patches/features/0088-Renewable-coral.patch index d618d0d66..b70eb2fed 100644 --- a/leaves-server/minecraft-patches/features/0090-Renewable-coral.patch +++ b/leaves-server/minecraft-patches/features/0088-Renewable-coral.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Renewable coral diff --git a/net/minecraft/world/level/block/CoralFanBlock.java b/net/minecraft/world/level/block/CoralFanBlock.java -index 2a48b215fde808fdc6b36a5d8fe88c7ae56c9567..4aa97ca825604478e2a86e655c6cf6cb4e0db336 100644 +index 7a8cd7a7bf00cc0b29b0d4ee9b2241bf3a0f9905..4a02a40aa1109f0c074b97f6683fd06d4f4de534 100644 --- a/net/minecraft/world/level/block/CoralFanBlock.java +++ b/net/minecraft/world/level/block/CoralFanBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour; @@ -15,11 +15,11 @@ index 2a48b215fde808fdc6b36a5d8fe88c7ae56c9567..4aa97ca825604478e2a86e655c6cf6cb -public class CoralFanBlock extends BaseCoralFanBlock { +public class CoralFanBlock extends BaseCoralFanBlock implements org.leavesmc.leaves.util.FertilizableCoral { // Leaves - renewable coral public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group(CoralBlock.DEAD_CORAL_FIELD.forGetter(coralFanBlock -> coralFanBlock.deadBlock), propertiesCodec()) - .apply(instance, CoralFanBlock::new) -@@ -69,4 +69,11 @@ public class CoralFanBlock extends BaseCoralFanBlock { - return super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random); - } + i -> i.group(CoralBlock.DEAD_CORAL_FIELD.forGetter(b -> b.deadBlock), propertiesCodec()).apply(i, CoralFanBlock::new) + ); +@@ -68,4 +68,11 @@ public class CoralFanBlock extends BaseCoralFanBlock { + + return super.updateShape(state, level, ticks, pos, directionToNeighbour, neighbourPos, neighbourState, random); } + + // Leaves start - renewable coral @@ -30,7 +30,7 @@ index 2a48b215fde808fdc6b36a5d8fe88c7ae56c9567..4aa97ca825604478e2a86e655c6cf6cb + // Leaves end - renewable coral } diff --git a/net/minecraft/world/level/block/CoralPlantBlock.java b/net/minecraft/world/level/block/CoralPlantBlock.java -index b66a3e6e109cab913ff2593accaea04110d66094..128f768ec5c194b697796ac7f2f8b55229f5a4be 100644 +index 4111ec67b81e05b59d1ad2e55723356f0c9474f5..2aecaa8d3414405503dbffd4b93817d6e2cd4d35 100644 --- a/net/minecraft/world/level/block/CoralPlantBlock.java +++ b/net/minecraft/world/level/block/CoralPlantBlock.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.material.Fluids; @@ -40,10 +40,10 @@ index b66a3e6e109cab913ff2593accaea04110d66094..128f768ec5c194b697796ac7f2f8b552 -public class CoralPlantBlock extends BaseCoralPlantTypeBlock { +public class CoralPlantBlock extends BaseCoralPlantTypeBlock implements org.leavesmc.leaves.util.FertilizableCoral { // Leaves - renewable coral public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group(CoralBlock.DEAD_CORAL_FIELD.forGetter(coralPlantBlock -> coralPlantBlock.deadBlock), propertiesCodec()) - .apply(instance, CoralPlantBlock::new) -@@ -78,4 +78,12 @@ public class CoralPlantBlock extends BaseCoralPlantTypeBlock { - protected VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { + i -> i.group(CoralBlock.DEAD_CORAL_FIELD.forGetter(b -> b.deadBlock), propertiesCodec()).apply(i, CoralPlantBlock::new) + ); +@@ -77,4 +77,12 @@ public class CoralPlantBlock extends BaseCoralPlantTypeBlock { + protected VoxelShape getShape(final BlockState state, final BlockGetter level, final BlockPos pos, final CollisionContext context) { return SHAPE; } + @@ -56,7 +56,7 @@ index b66a3e6e109cab913ff2593accaea04110d66094..128f768ec5c194b697796ac7f2f8b552 + // Leaves end - renewable coral } diff --git a/net/minecraft/world/level/block/CoralWallFanBlock.java b/net/minecraft/world/level/block/CoralWallFanBlock.java -index 2d34d3e7a39a27b1756573d16ec0f8878ab8f620..b702c69f881a56a8d9cd48cf017ea8c0392720fd 100644 +index 8e58e5d5f3b32323f28fc668eeebe59b320cce34..1e9118b309000fe732517c233772889452b538e8 100644 --- a/net/minecraft/world/level/block/CoralWallFanBlock.java +++ b/net/minecraft/world/level/block/CoralWallFanBlock.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour; @@ -66,11 +66,11 @@ index 2d34d3e7a39a27b1756573d16ec0f8878ab8f620..b702c69f881a56a8d9cd48cf017ea8c0 -public class CoralWallFanBlock extends BaseCoralWallFanBlock { +public class CoralWallFanBlock extends BaseCoralWallFanBlock implements org.leavesmc.leaves.util.FertilizableCoral { // Leaves - renewable coral public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> instance.group(CoralBlock.DEAD_CORAL_FIELD.forGetter(coralWallFanBlock -> coralWallFanBlock.deadBlock), propertiesCodec()) - .apply(instance, CoralWallFanBlock::new) -@@ -69,4 +69,11 @@ public class CoralWallFanBlock extends BaseCoralWallFanBlock { - return super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random); - } + i -> i.group(CoralBlock.DEAD_CORAL_FIELD.forGetter(b -> b.deadBlock), propertiesCodec()).apply(i, CoralWallFanBlock::new) + ); +@@ -68,4 +68,11 @@ public class CoralWallFanBlock extends BaseCoralWallFanBlock { + this.tryScheduleDieTick(state, level, ticks, random, pos); + return super.updateShape(state, level, ticks, pos, directionToNeighbour, neighbourPos, neighbourState, random); } + + // Leaves start - renewable coral @@ -81,54 +81,54 @@ index 2d34d3e7a39a27b1756573d16ec0f8878ab8f620..b702c69f881a56a8d9cd48cf017ea8c0 + // Leaves end - renewable coral } diff --git a/net/minecraft/world/level/levelgen/feature/CoralClawFeature.java b/net/minecraft/world/level/levelgen/feature/CoralClawFeature.java -index 19c810d820a559afdc8fac399e4021121063c2ff..d848f5e19347e69776b99d9feade002d66774513 100644 +index 01eedebb5125c5200d1f60a5c7006a5846ab3327..98cdbdf69a739b462a7d7348d8a36a5fdb9bf1a0 100644 --- a/net/minecraft/world/level/levelgen/feature/CoralClawFeature.java +++ b/net/minecraft/world/level/levelgen/feature/CoralClawFeature.java @@ -17,7 +17,7 @@ public class CoralClawFeature extends CoralFeature { } @Override -- protected boolean placeFeature(LevelAccessor level, RandomSource random, BlockPos pos, BlockState state) { -+ public boolean placeFeature(LevelAccessor level, RandomSource random, BlockPos pos, BlockState state) { // Leaves - protected -> public - if (!this.placeCoralBlock(level, random, pos, state)) { +- protected boolean placeFeature(final LevelAccessor level, final RandomSource random, final BlockPos origin, final BlockState state) { ++ public boolean placeFeature(final LevelAccessor level, final RandomSource random, final BlockPos origin, final BlockState state) { // Leaves - protected -> public + if (!this.placeCoralBlock(level, random, origin, state)) { return false; - } else { + } diff --git a/net/minecraft/world/level/levelgen/feature/CoralFeature.java b/net/minecraft/world/level/levelgen/feature/CoralFeature.java -index 53e2f2f05368949365b9690fc16bc21efabb50bb..b8475b55b3d7aa65125ecf9460a5c9c4e1261225 100644 +index 0ab324d8435826878861547fe3309ace9c37abe8..2f03682551798bf756d9b7d829f0945453d81345 100644 --- a/net/minecraft/world/level/levelgen/feature/CoralFeature.java +++ b/net/minecraft/world/level/levelgen/feature/CoralFeature.java @@ -31,7 +31,7 @@ public abstract class CoralFeature extends Feature { - return !optional.isEmpty() && this.placeFeature(worldGenLevel, randomSource, blockPos, optional.get().defaultBlockState()); + return !coral.isEmpty() && this.placeFeature(level, random, origin, coral.get().defaultBlockState()); } -- protected abstract boolean placeFeature(LevelAccessor level, RandomSource random, BlockPos pos, BlockState state); -+ public abstract boolean placeFeature(LevelAccessor level, RandomSource random, BlockPos pos, BlockState state); // Leaves - protected -> public +- protected abstract boolean placeFeature(final LevelAccessor level, final RandomSource random, final BlockPos origin, final BlockState state); ++ public abstract boolean placeFeature(final LevelAccessor level, final RandomSource random, final BlockPos origin, final BlockState state); // Leaves - protected -> public - protected boolean placeCoralBlock(LevelAccessor level, RandomSource random, BlockPos pos, BlockState state) { - BlockPos blockPos = pos.above(); + protected boolean placeCoralBlock(final LevelAccessor level, final RandomSource random, final BlockPos pos, final BlockState state) { + BlockPos above = pos.above(); diff --git a/net/minecraft/world/level/levelgen/feature/CoralMushroomFeature.java b/net/minecraft/world/level/levelgen/feature/CoralMushroomFeature.java -index cd550c704cbe46727caf965d7910d2a1d55f5697..29c5c8ed793834dd5bbafb89e48670a30dc8184d 100644 +index 15cdf75f5039334de38eb7a413453cdd7988938c..4bb0fdc30c2e425087d7e0ac8aadfe5162df43cb 100644 --- a/net/minecraft/world/level/levelgen/feature/CoralMushroomFeature.java +++ b/net/minecraft/world/level/levelgen/feature/CoralMushroomFeature.java @@ -14,7 +14,7 @@ public class CoralMushroomFeature extends CoralFeature { } @Override -- protected boolean placeFeature(LevelAccessor level, RandomSource random, BlockPos pos, BlockState state) { -+ public boolean placeFeature(LevelAccessor level, RandomSource random, BlockPos pos, BlockState state) { // Leaves - protected -> public - int i = random.nextInt(3) + 3; - int i1 = random.nextInt(3) + 3; - int i2 = random.nextInt(3) + 3; +- protected boolean placeFeature(final LevelAccessor level, final RandomSource random, final BlockPos origin, final BlockState state) { ++ public boolean placeFeature(final LevelAccessor level, final RandomSource random, final BlockPos origin, final BlockState state) { // Leaves - protected -> public + int height = random.nextInt(3) + 3; + int width = random.nextInt(3) + 3; + int length = random.nextInt(3) + 3; diff --git a/net/minecraft/world/level/levelgen/feature/CoralTreeFeature.java b/net/minecraft/world/level/levelgen/feature/CoralTreeFeature.java -index 521dbd30e9fb7a366d534fe6a952b0e3a8ec8449..13a0c047c86563d0f28866d513c52999bfce6fd1 100644 +index 789ddf552066a4adebab13c61ed895ed74d85741..68457021c66c19318ff39cc894535daa295066e2 100644 --- a/net/minecraft/world/level/levelgen/feature/CoralTreeFeature.java +++ b/net/minecraft/world/level/levelgen/feature/CoralTreeFeature.java @@ -15,7 +15,7 @@ public class CoralTreeFeature extends CoralFeature { } @Override -- protected boolean placeFeature(LevelAccessor level, RandomSource random, BlockPos pos, BlockState state) { -+ public boolean placeFeature(LevelAccessor level, RandomSource random, BlockPos pos, BlockState state) { // Leaves - protected -> public - BlockPos.MutableBlockPos mutableBlockPos = pos.mutable(); - int i = random.nextInt(3) + 1; +- protected boolean placeFeature(final LevelAccessor level, final RandomSource random, final BlockPos origin, final BlockState state) { ++ public boolean placeFeature(final LevelAccessor level, final RandomSource random, final BlockPos origin, final BlockState state) { // Leaves - protected -> public + BlockPos.MutableBlockPos mutPos = origin.mutable(); + int trunckHeight = random.nextInt(3) + 1; diff --git a/leaves-server/minecraft-patches/features/0091-Vanilla-hopper.patch b/leaves-server/minecraft-patches/features/0089-Vanilla-hopper.patch similarity index 85% rename from leaves-server/minecraft-patches/features/0091-Vanilla-hopper.patch rename to leaves-server/minecraft-patches/features/0089-Vanilla-hopper.patch index 092459488..7e18af004 100644 --- a/leaves-server/minecraft-patches/features/0091-Vanilla-hopper.patch +++ b/leaves-server/minecraft-patches/features/0089-Vanilla-hopper.patch @@ -3,13 +3,12 @@ From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Fri, 26 Jan 2024 01:36:34 +0800 Subject: [PATCH] Vanilla hopper -This is a temporary solution designed to attempt to restore the vanilla behavior of the funnel while preserving optimizations as much as possible. It should ultimately be replaced by the optimization solution provided by lithium. diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index e3e7d8c9e704d49d78472ac7b9239f93031d2fd1..47cff0e87dc9c6de280b1c59a7a2f83d5571a303 100644 +index 33d832852cf167c4925cd9548636fc712d2ddaf3..17f8c6f812c300216b32a8fbc109e94e80c78e73 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -308,36 +308,58 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -298,36 +298,55 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen ItemStack movedItem = origItemStack; final int originalItemCount = origItemStack.getCount(); final int movedItemCount = Math.min(level.spigotConfig.hopperAmount, originalItemCount); @@ -23,20 +22,17 @@ index e3e7d8c9e704d49d78472ac7b9239f93031d2fd1..47cff0e87dc9c6de280b1c59a7a2f83d - // Drastically improve performance by returning true. - // No plugin could have relied on the behavior of false as the other call - // site for IMIE did not exhibit the same behavior -+ // Leaves start - fix vanilla ++ // Leaves start - fix vanilla hopper + if (org.leavesmc.leaves.LeavesConfig.fix.vanillaHopper && movedItem.getCount() <= movedItemCount) { + if (!skipPullModeEventFire) { + movedItem = callPullMoveEvent(hopper, container, movedItem); + if (movedItem == null) { // cancelled + origItemStack.setCount(originalItemCount); -+ // Drastically improve performance by returning true. -+ // No plugin could have relied on the behavior of false as the other call -+ // site for IMIE did not exhibit the same behavior + return true; + } + } + movedItem = origItemStack.copy(); -+ final ItemStack remainingItem = addItem(container, hopper, container.removeItem(i, movedItemCount), null); ++ final ItemStack remainingItem = addItem(container, hopper, container.removeItem(i, movedItemCount), null); + if (remainingItem.isEmpty()) { + container.setChanged(); return true; @@ -88,7 +84,7 @@ index e3e7d8c9e704d49d78472ac7b9239f93031d2fd1..47cff0e87dc9c6de280b1c59a7a2f83d + origItemStack.setCount(originalItemCount); } - origItemStack.setCount(originalItemCount); -+ // Leaves end - fix vanilla ++ // Leaves end - fix vanilla hopper if (level.paperConfig().hopper.cooldownWhenFull && !org.leavesmc.leaves.LeavesConfig.modify.mcTechnicalMode) { // Leaves - mc technical survival mode applyCooldown(hopper); diff --git a/leaves-server/minecraft-patches/features/0090-Old-hopper-suckin-behavior.patch b/leaves-server/minecraft-patches/features/0090-Old-hopper-suckin-behavior.patch new file mode 100644 index 000000000..3e78a849d --- /dev/null +++ b/leaves-server/minecraft-patches/features/0090-Old-hopper-suckin-behavior.patch @@ -0,0 +1,21 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Lumine1909 <133463833+Lumine1909@users.noreply.github.com> +Date: Thu, 6 Feb 2025 00:05:23 +0800 +Subject: [PATCH] Old hopper suckin behavior + + +diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +index 17f8c6f812c300216b32a8fbc109e94e80c78e73..009d5d34a50ef75343007a638a357a9a05521e8b 100644 +--- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +@@ -565,8 +565,8 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + return false; + } else { + boolean isBlocked = hopper.isGridAligned() +- && blockState.isCollisionShapeFullBlock(level, blockPos) +- && !blockState.is(BlockTags.DOES_NOT_BLOCK_HOPPERS); ++ && (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldHopperSuckInBehavior && blockState.isCollisionShapeFullBlock(level, blockPos)) ++ && !blockState.is(BlockTags.DOES_NOT_BLOCK_HOPPERS); // Leaves - oldHopperSuckInBehavior + if (!isBlocked) { + for (ItemEntity entity : getItemsAtAndAbove(level, hopper)) { + if (addItem(hopper, entity)) { diff --git a/leaves-server/minecraft-patches/features/0093-Fix-falling-block-s-block-location.patch b/leaves-server/minecraft-patches/features/0091-Fix-falling-block-s-block-location.patch similarity index 56% rename from leaves-server/minecraft-patches/features/0093-Fix-falling-block-s-block-location.patch rename to leaves-server/minecraft-patches/features/0091-Fix-falling-block-s-block-location.patch index 42f099b6c..bf796bc2b 100644 --- a/leaves-server/minecraft-patches/features/0093-Fix-falling-block-s-block-location.patch +++ b/leaves-server/minecraft-patches/features/0091-Fix-falling-block-s-block-location.patch @@ -5,22 +5,22 @@ Subject: [PATCH] Fix falling block's block location diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 943dab97a4e22797664554b8cbcf1cb7603de12f..0c38341119ba2cc1850ffd0726396f3e4ee0ec17 100644 +index e96539243f9ce8027661b2079fa96d6251a26229..f1c6c8c9f4208e1b218b86bf89e26df7288fd18c 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -5080,6 +5080,15 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name - int floor = Mth.floor(x); - int floor1 = Mth.floor(y); - int floor2 = Mth.floor(z); +@@ -5011,6 +5011,15 @@ public abstract class Entity + int fx = Mth.floor(x); + int fy = Mth.floor(y); + int fz = Mth.floor(z); + + // Leaves start - fix falling block location + if (this instanceof net.minecraft.world.entity.item.FallingBlockEntity) { + if (y < 0.0 && y + 1e-10 > 0.0) { -+ floor1 = 0; ++ fy = 0; + } + } + // Leaves end - fix falling block location + - if (floor != this.blockPosition.getX() || floor1 != this.blockPosition.getY() || floor2 != this.blockPosition.getZ()) { - this.blockPosition = new BlockPos(floor, floor1, floor2); + if (fx != this.blockPosition.getX() || fy != this.blockPosition.getY() || fz != this.blockPosition.getZ()) { + this.blockPosition = new BlockPos(fx, fy, fz); this.inBlockState = null; diff --git a/leaves-server/minecraft-patches/features/0092-Bytebuf-API.patch b/leaves-server/minecraft-patches/features/0092-Bytebuf-API.patch new file mode 100644 index 000000000..31ace8b8a --- /dev/null +++ b/leaves-server/minecraft-patches/features/0092-Bytebuf-API.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Lumine1909 <133463833+Lumine1909@users.noreply.github.com> +Date: Thu, 6 Feb 2025 00:14:22 +0800 +Subject: [PATCH] Bytebuf API + + +diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java +index 1543fad27aff40dba8591ffde4de611cb2516f6c..c31d51dcbd7b27083550f137127c468e924cf8b0 100644 +--- a/net/minecraft/server/players/PlayerList.java ++++ b/net/minecraft/server/players/PlayerList.java +@@ -295,6 +295,13 @@ public abstract class PlayerList { + boolean immediateRespawn = gameRules.get(GameRules.IMMEDIATE_RESPAWN); + boolean reducedDebugInfo = gameRules.get(GameRules.REDUCED_DEBUG_INFO); + boolean doLimitedCrafting = gameRules.get(GameRules.LIMITED_CRAFTING); ++ ++ // Leaves start - Bytebuf API ++ if (!(player instanceof org.leavesmc.leaves.bot.ServerBot) && !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { ++ org.leavesmc.leaves.bytebuf.internal.InternalBytebufHandler.updatePlayer(player); ++ } ++ // Leaves end - Bytebuf API ++ + playerConnection.send( + new ClientboundLoginPacket( + player.getId(), diff --git a/leaves-server/minecraft-patches/features/0092-Old-hopper-suckin-behavior.patch b/leaves-server/minecraft-patches/features/0092-Old-hopper-suckin-behavior.patch deleted file mode 100644 index b9ca5cf68..000000000 --- a/leaves-server/minecraft-patches/features/0092-Old-hopper-suckin-behavior.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Lumine1909 <133463833+Lumine1909@users.noreply.github.com> -Date: Thu, 6 Feb 2025 00:05:23 +0800 -Subject: [PATCH] Old hopper suckin behavior - - -diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index 47cff0e87dc9c6de280b1c59a7a2f83d5571a303..4876c725872674899252d3338868c696eaf31f45 100644 ---- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -630,7 +630,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - - return false; - } else { -- boolean flag = hopper.isGridAligned() && blockState.isCollisionShapeFullBlock(level, blockPos) && !blockState.is(BlockTags.DOES_NOT_BLOCK_HOPPERS); -+ boolean flag = hopper.isGridAligned() && (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldHopperSuckInBehavior && blockState.isCollisionShapeFullBlock(level, blockPos)) && !blockState.is(BlockTags.DOES_NOT_BLOCK_HOPPERS); // Leaves - oldHopperSuckInBehavior - if (!flag) { - for (ItemEntity itemEntity : getItemsAtAndAbove(level, hopper)) { - if (addItem(hopper, itemEntity)) { diff --git a/leaves-server/minecraft-patches/features/0095-Configurable-MC-67.patch b/leaves-server/minecraft-patches/features/0093-Configurable-MC-67.patch similarity index 62% rename from leaves-server/minecraft-patches/features/0095-Configurable-MC-67.patch rename to leaves-server/minecraft-patches/features/0093-Configurable-MC-67.patch index 8004cc11f..f85697243 100644 --- a/leaves-server/minecraft-patches/features/0095-Configurable-MC-67.patch +++ b/leaves-server/minecraft-patches/features/0093-Configurable-MC-67.patch @@ -5,14 +5,14 @@ Subject: [PATCH] Configurable MC-67 diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 0c38341119ba2cc1850ffd0726396f3e4ee0ec17..64ab6dd069f423595a66769f255fba828ad20574 100644 +index f1c6c8c9f4208e1b218b86bf89e26df7288fd18c..ab92199db9f5a66572904a8b54bf0efd43e75a19 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -4265,6 +4265,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -4282,6 +4282,7 @@ public abstract class Entity } - public boolean canTeleport(Level fromLevel, Level toLevel) { + public boolean canTeleport(final Level from, final Level to) { + if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowEntityPortalWithPassenger && (this.isPassenger() || this.isVehicle())) return false; // Leaves - allowEntityPortalWithPassenger if (!this.isAlive() || !this.valid) return false; // Paper - Fix item duplication and teleport issues - if (fromLevel.dimension() == Level.END && toLevel.dimension() == Level.OVERWORLD) { - for (Entity entity : this.getPassengers()) { + if (from.dimension() == Level.END && to.dimension() == Level.OVERWORLD) { + for (Entity passenger : this.getPassengers()) { diff --git a/leaves-server/minecraft-patches/features/0094-Bytebuf-API.patch b/leaves-server/minecraft-patches/features/0094-Bytebuf-API.patch deleted file mode 100644 index b0039046e..000000000 --- a/leaves-server/minecraft-patches/features/0094-Bytebuf-API.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Lumine1909 <133463833+Lumine1909@users.noreply.github.com> -Date: Thu, 6 Feb 2025 00:14:22 +0800 -Subject: [PATCH] Bytebuf API - - -diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index dc27a7b11c72ff0d184580edf4ac1376fda86f7c..231387831280f24e9e50ee94aaacbd10d1532979 100644 ---- a/net/minecraft/server/players/PlayerList.java -+++ b/net/minecraft/server/players/PlayerList.java -@@ -294,6 +294,13 @@ public abstract class PlayerList { - serverGamePacketListenerImpl - ); - serverGamePacketListenerImpl.suspendFlushing(); -+ -+ // Leaves start - Bytebuf API -+ if (!(player instanceof org.leavesmc.leaves.bot.ServerBot) && !(player instanceof org.leavesmc.leaves.replay.ServerPhotographer)) { -+ org.leavesmc.leaves.bytebuf.internal.InternalBytebufHandler.updatePlayer(player); -+ } -+ // Leaves end - Bytebuf API -+ - GameRules gameRules = serverLevel.getGameRules(); - boolean flag = gameRules.get(GameRules.IMMEDIATE_RESPAWN); - boolean flag1 = gameRules.get(GameRules.REDUCED_DEBUG_INFO); diff --git a/leaves-server/minecraft-patches/features/0094-Disable-end-gateway-portal-entity-ticking.patch b/leaves-server/minecraft-patches/features/0094-Disable-end-gateway-portal-entity-ticking.patch new file mode 100644 index 000000000..ab6c7fee8 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0094-Disable-end-gateway-portal-entity-ticking.patch @@ -0,0 +1,34 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Mon, 1 Jul 2024 22:09:33 +0800 +Subject: [PATCH] Disable end gateway portal entity ticking + + +diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java +index e0874a0f424b81dcb694db0e83099ee82b2bfcff..c269726570398a518e4010c6188a9f5adb96623b 100644 +--- a/net/minecraft/world/level/block/EndGatewayBlock.java ++++ b/net/minecraft/world/level/block/EndGatewayBlock.java +@@ -124,8 +124,10 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { + if (teleportPosition == null) { + return null; + } else { ++ // Leaves start - Disable end gateway portal entity ticking ++ TeleportTransition.PostTeleportTransition postTeleportTransition = org.leavesmc.leaves.LeavesConfig.modify.oldMC.disableGatewayPortalEntityTicking ? TeleportTransition.DO_NOTHING : TeleportTransition.PLACE_PORTAL_TICKET; + return entity instanceof ThrownEnderpearl +- ? new TeleportTransition(currentLevel, teleportPosition, Vec3.ZERO, 0.0F, 0.0F, Set.of(), TeleportTransition.PLACE_PORTAL_TICKET, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY) // CraftBukkit ++ ? new TeleportTransition(currentLevel, teleportPosition, Vec3.ZERO, 0.0F, 0.0F, Set.of(), postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY) // CraftBukkit + : new TeleportTransition( + currentLevel, + teleportPosition, +@@ -133,9 +135,10 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { + 0.0F, + 0.0F, + Relative.union(Relative.DELTA, Relative.ROTATION), +- TeleportTransition.PLACE_PORTAL_TICKET, ++ postTeleportTransition, + org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY // CraftBukkit + ); ++ // Leaves end - Disable end gateway portal entity ticking + } + } else { + return null; diff --git a/leaves-server/minecraft-patches/features/0095-Disable-crystal-portal-proximity-check.patch b/leaves-server/minecraft-patches/features/0095-Disable-crystal-portal-proximity-check.patch new file mode 100644 index 000000000..60dd88aa3 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0095-Disable-crystal-portal-proximity-check.patch @@ -0,0 +1,54 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Bluemangoo +Date: Fri, 19 Jul 2024 15:04:03 +0800 +Subject: [PATCH] Disable crystal-portal proximity check + + +diff --git a/net/minecraft/world/item/EndCrystalItem.java b/net/minecraft/world/item/EndCrystalItem.java +index eaf7b3f7e9b8135e0ebc1aa7f764f58b45dd3aa5..d28f2d6fda7fcb6018fa19fd0939bcf49eb869ad 100644 +--- a/net/minecraft/world/item/EndCrystalItem.java ++++ b/net/minecraft/world/item/EndCrystalItem.java +@@ -54,7 +54,7 @@ public class EndCrystalItem extends Item { + level.gameEvent(context.getPlayer(), GameEvent.ENTITY_PLACE, above); + EnderDragonFight fight = ((ServerLevel)level).getDragonFight(); + if (fight != null) { +- fight.tryRespawn(above); // Paper - Perf: Do crystal-portal proximity check before entity lookup ++ fight.tryRespawn(); // fight.tryRespawn(above); // Paper - Perf: Do crystal-portal proximity check before entity lookup // Leaves - disable crystal-portal proximity check + } + } + +diff --git a/net/minecraft/world/level/dimension/end/EnderDragonFight.java b/net/minecraft/world/level/dimension/end/EnderDragonFight.java +index 9153b1cc8042eb04f4f3ccd7e71b3dbf4380b62d..fbae59ab57fa737f47b42c75bb304d1ad17a1c94 100644 +--- a/net/minecraft/world/level/dimension/end/EnderDragonFight.java ++++ b/net/minecraft/world/level/dimension/end/EnderDragonFight.java +@@ -615,12 +615,14 @@ public class EnderDragonFight extends SavedData { + } + + public boolean tryRespawn() { // CraftBukkit - return boolean ++ /* Leaves - disable crystal-portal proximity check + // Paper start - Perf: Do crystal-portal proximity check before entity lookup + return this.tryRespawn(null); + } + + public boolean tryRespawn(@Nullable final BlockPos placedEndCrystalPos) { // placedEndCrystalPos is null if the tryRespawn() call was not caused by a placed end crystal + // Paper end - Perf: Do crystal-portal proximity check before entity lookup ++ */ + if (this.dragonKilled && this.respawnStage == null) { + BlockPos location = this.exitPortalLocation; + if (location == null) { +@@ -635,6 +637,7 @@ public class EnderDragonFight extends SavedData { + + location = this.exitPortalLocation; + } ++ /* Leaves - disable crystal-portal proximity check + // Paper start - Perf: Do crystal-portal proximity check before entity lookup + if (placedEndCrystalPos != null && !this.level.paperConfig().misc.allowRemoteEnderDragonRespawning) { + int dy = placedEndCrystalPos.getY() - location.getY(); +@@ -649,6 +652,7 @@ public class EnderDragonFight extends SavedData { + } + } + // Paper end - Perf: Do crystal-portal proximity check before entity lookup ++ */ + + List crystals = Lists.newArrayList(); + BlockPos center = location.above(1); diff --git a/leaves-server/minecraft-patches/features/0098-Can-disable-LivingEntity-aiStep-alive-check.patch b/leaves-server/minecraft-patches/features/0096-Can-disable-LivingEntity-aiStep-alive-check.patch similarity index 82% rename from leaves-server/minecraft-patches/features/0098-Can-disable-LivingEntity-aiStep-alive-check.patch rename to leaves-server/minecraft-patches/features/0096-Can-disable-LivingEntity-aiStep-alive-check.patch index 674cf6ada..2aedfddcb 100644 --- a/leaves-server/minecraft-patches/features/0098-Can-disable-LivingEntity-aiStep-alive-check.patch +++ b/leaves-server/minecraft-patches/features/0096-Can-disable-LivingEntity-aiStep-alive-check.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Can disable LivingEntity aiStep alive check diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 411b5623511a2b3d0205a98f9ba6db43a630fed3..7703fb2264ddf66f36b114af63ab6e2f1f5e75fa 100644 +index 3d29b1d4471048dd30c05fda7a5804a82ff1c698..a7e15fd19e8bca5bcf5947b36ee0547b5b0d8116 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3400,7 +3400,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3434,7 +3434,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } } diff --git a/leaves-server/minecraft-patches/features/0096-Disable-end-gateway-portal-entity-ticking.patch b/leaves-server/minecraft-patches/features/0096-Disable-end-gateway-portal-entity-ticking.patch deleted file mode 100644 index 4713ecb65..000000000 --- a/leaves-server/minecraft-patches/features/0096-Disable-end-gateway-portal-entity-ticking.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Mon, 1 Jul 2024 22:09:33 +0800 -Subject: [PATCH] Disable end gateway portal entity ticking - - -diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java -index 0d9b286bcc25ad5376a7a22ae4323bd553d4da3d..e37f1e07656bdec2fe51223bda7cce1e13a616cd 100644 ---- a/net/minecraft/world/level/block/EndGatewayBlock.java -+++ b/net/minecraft/world/level/block/EndGatewayBlock.java -@@ -121,11 +121,14 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { - if (portalPosition == null) { - return null; - } else { -+ // Leaves start - Disable end gateway portal entity ticking -+ TeleportTransition.PostTeleportTransition postTeleportTransition = org.leavesmc.leaves.LeavesConfig.modify.oldMC.disableGatewayPortalEntityTicking ? TeleportTransition.DO_NOTHING : TeleportTransition.PLACE_PORTAL_TICKET; - return entity instanceof ThrownEnderpearl -- ? new TeleportTransition(level, portalPosition, Vec3.ZERO, 0.0F, 0.0F, Set.of(), TeleportTransition.PLACE_PORTAL_TICKET, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY) // CraftBukkit -+ ? new TeleportTransition(level, portalPosition, Vec3.ZERO, 0.0F, 0.0F, Set.of(), postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY) // CraftBukkit - : new TeleportTransition( -- level, portalPosition, Vec3.ZERO, 0.0F, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), TeleportTransition.PLACE_PORTAL_TICKET, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY // CraftBukkit -+ level, portalPosition, Vec3.ZERO, 0.0F, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY // CraftBukkit - ); -+ // Leaves end - Disable end gateway portal entity ticking - } - } else { - return null; diff --git a/leaves-server/minecraft-patches/features/0097-Disable-crystal-portal-proximity-check.patch b/leaves-server/minecraft-patches/features/0097-Disable-crystal-portal-proximity-check.patch deleted file mode 100644 index 87e2ae546..000000000 --- a/leaves-server/minecraft-patches/features/0097-Disable-crystal-portal-proximity-check.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Bluemangoo -Date: Fri, 19 Jul 2024 15:04:03 +0800 -Subject: [PATCH] Disable crystal-portal proximity check - - -diff --git a/net/minecraft/world/item/EndCrystalItem.java b/net/minecraft/world/item/EndCrystalItem.java -index 05ec512839898f96d9769bb0d00f6ba11dda0c4b..27b225344c34e561d4913b3a6ca1c4a42d22ef41 100644 ---- a/net/minecraft/world/item/EndCrystalItem.java -+++ b/net/minecraft/world/item/EndCrystalItem.java -@@ -27,7 +27,7 @@ public class EndCrystalItem extends Item { - if (!blockState.is(Blocks.OBSIDIAN) && !blockState.is(Blocks.BEDROCK)) { - return InteractionResult.FAIL; - } else { -- BlockPos blockPos = clickedPos.above(); final BlockPos aboveBlockPos = blockPos; // Paper - OBFHELPER -+ BlockPos blockPos = clickedPos.above(); // final BlockPos aboveBlockPos = blockPos; // Paper - OBFHELPER // Leaves - if (!level.isEmptyBlock(blockPos)) { - return InteractionResult.FAIL; - } else { -@@ -51,7 +51,7 @@ public class EndCrystalItem extends Item { - level.gameEvent(context.getPlayer(), GameEvent.ENTITY_PLACE, blockPos); - EndDragonFight dragonFight = ((ServerLevel)level).getDragonFight(); - if (dragonFight != null) { -- dragonFight.tryRespawn(aboveBlockPos); // Paper - Perf: Do crystal-portal proximity check before entity lookup -+ dragonFight.tryRespawn(); //dragonFight.tryRespawn(aboveBlockPos); // Paper - Perf: Do crystal-portal proximity check before entity lookup // Leaves - } - } - -diff --git a/net/minecraft/world/level/dimension/end/EndDragonFight.java b/net/minecraft/world/level/dimension/end/EndDragonFight.java -index 82d40effe5e8dafec60c25b97f45c1188d0e6d28..049cdeb156aedfa36a15d7ebb7a641909a05edef 100644 ---- a/net/minecraft/world/level/dimension/end/EndDragonFight.java -+++ b/net/minecraft/world/level/dimension/end/EndDragonFight.java -@@ -571,12 +571,14 @@ public class EndDragonFight { - } - - public boolean tryRespawn() { // CraftBukkit - return boolean -+ /* Leaves - // Paper start - Perf: Do crystal-portal proximity check before entity lookup - return this.tryRespawn(null); - } - - public boolean tryRespawn(@Nullable BlockPos placedEndCrystalPos) { // placedEndCrystalPos is null if the tryRespawn() call was not caused by a placed end crystal - // Paper end - Perf: Do crystal-portal proximity check before entity lookup -+ */ - if (this.dragonKilled && this.respawnStage == null) { - BlockPos blockPos = this.portalLocation; - if (blockPos == null) { -@@ -591,6 +593,7 @@ public class EndDragonFight { - - blockPos = this.portalLocation; - } -+ /* Leaves - // Paper start - Perf: Do crystal-portal proximity check before entity lookup - if (placedEndCrystalPos != null && !level.paperConfig().misc.allowRemoteEnderDragonRespawning) { - // The end crystal must be 0 or 1 higher than the portal origin -@@ -606,7 +609,7 @@ public class EndDragonFight { - } - } - // Paper end - Perf: Do crystal-portal proximity check before entity lookup -- -+ */ - - List list = Lists.newArrayList(); - BlockPos blockPos1 = blockPos.above(1); diff --git a/leaves-server/minecraft-patches/features/0097-Fix-FallingBlockEntity-Duplicate.patch b/leaves-server/minecraft-patches/features/0097-Fix-FallingBlockEntity-Duplicate.patch new file mode 100644 index 000000000..3d68f8961 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0097-Fix-FallingBlockEntity-Duplicate.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Wed, 31 Jul 2024 12:51:44 +0800 +Subject: [PATCH] Fix FallingBlockEntity Duplicate + + +diff --git a/net/minecraft/world/entity/item/FallingBlockEntity.java b/net/minecraft/world/entity/item/FallingBlockEntity.java +index 045ce9cf39ec1c106bf7e9694e6d309f58900850..ed39910d6db6613006577d5aa37a6d483d386e3b 100644 +--- a/net/minecraft/world/entity/item/FallingBlockEntity.java ++++ b/net/minecraft/world/entity/item/FallingBlockEntity.java +@@ -383,7 +383,7 @@ public class FallingBlockEntity extends Entity { + ResourceKey oldDimension = this.level().dimension(); + boolean fromOrToEnd = (oldDimension == Level.END || newDimension == Level.END) && oldDimension != newDimension; + Entity newEntity = super.teleport(transition); +- this.forceTickAfterTeleportToDuplicate = newEntity != null && fromOrToEnd && io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowUnsafeEndPortalTeleportation; // Paper ++ this.forceTickAfterTeleportToDuplicate = newEntity != null && fromOrToEnd; // Paper // Leaves + return newEntity; + } + } diff --git a/leaves-server/minecraft-patches/features/0100-Old-Block-remove-behaviour.patch b/leaves-server/minecraft-patches/features/0098-Old-Block-remove-behaviour.patch similarity index 70% rename from leaves-server/minecraft-patches/features/0100-Old-Block-remove-behaviour.patch rename to leaves-server/minecraft-patches/features/0098-Old-Block-remove-behaviour.patch index c794adf45..919a3ff9f 100644 --- a/leaves-server/minecraft-patches/features/0100-Old-Block-remove-behaviour.patch +++ b/leaves-server/minecraft-patches/features/0098-Old-Block-remove-behaviour.patch @@ -5,11 +5,11 @@ Subject: [PATCH] Old Block remove behaviour diff --git a/net/minecraft/world/Containers.java b/net/minecraft/world/Containers.java -index da10ca5ef12be1a834adda9243c082dadde24ec0..f682930f765d04f0a278b0648c2773ab5d4d740e 100644 +index 1311d4936f84652c5ffc51544f99cb98fc293906..b4cbe16c9660f3e88a1177817979b1f6a59fc485 100644 --- a/net/minecraft/world/Containers.java +++ b/net/minecraft/world/Containers.java @@ -51,4 +51,15 @@ public class Containers { - public static void updateNeighboursAfterDestroy(BlockState state, Level level, BlockPos pos) { + public static void updateNeighboursAfterDestroy(final BlockState state, final Level level, final BlockPos pos) { level.updateNeighbourForOutputSignal(pos, state.getBlock()); } + @@ -25,10 +25,10 @@ index da10ca5ef12be1a834adda9243c082dadde24ec0..f682930f765d04f0a278b0648c2773ab + // Leaves end - behaviour 1.21.1- } diff --git a/net/minecraft/world/level/block/AbstractFurnaceBlock.java b/net/minecraft/world/level/block/AbstractFurnaceBlock.java -index dcc1bb4fcee9646212a424c03f77370ffa577fee..ca5cf7526082b9d3a7887dd77313e2c0012efebb 100644 +index 98561dcc465ca9d5394e58b05ad3e8dc59773ebc..16b9f7eaccbe63aa13fcc89571e0b9c95ff9fd25 100644 --- a/net/minecraft/world/level/block/AbstractFurnaceBlock.java +++ b/net/minecraft/world/level/block/AbstractFurnaceBlock.java -@@ -51,6 +51,26 @@ public abstract class AbstractFurnaceBlock extends BaseEntityBlock { +@@ -53,6 +53,26 @@ public abstract class AbstractFurnaceBlock extends BaseEntityBlock { return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); } @@ -53,13 +53,13 @@ index dcc1bb4fcee9646212a424c03f77370ffa577fee..ca5cf7526082b9d3a7887dd77313e2c0 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/BarrelBlock.java b/net/minecraft/world/level/block/BarrelBlock.java -index 8139799a24274cfb70a99d301c2688c0360720c6..b224d3756120cd82d1381c55a95ad63c18c123b7 100644 +index 5332fd32fa7a0d3fc3be1b0a7c2ca5dee8e402c6..0a77f67da73856edd2c45c8a9c6962cc653d7176 100644 --- a/net/minecraft/world/level/block/BarrelBlock.java +++ b/net/minecraft/world/level/block/BarrelBlock.java -@@ -49,6 +49,14 @@ public class BarrelBlock extends BaseEntityBlock { +@@ -51,6 +51,14 @@ public class BarrelBlock extends BaseEntityBlock { return InteractionResult.SUCCESS; } @@ -72,13 +72,13 @@ index 8139799a24274cfb70a99d301c2688c0360720c6..b224d3756120cd82d1381c55a95ad63c + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/BasePressurePlateBlock.java b/net/minecraft/world/level/block/BasePressurePlateBlock.java -index 7135a6bc87f90fafa94d0783aaf7b42d66449010..afd06de092a75c6c4f7b8848055e314b0c241029 100644 +index c2fbf44e93e44c36423465d406b5e4d3db029a80..e22cade1f4258f9660f1f5ac3a330432cdf326d1 100644 --- a/net/minecraft/world/level/block/BasePressurePlateBlock.java +++ b/net/minecraft/world/level/block/BasePressurePlateBlock.java -@@ -125,6 +125,19 @@ public abstract class BasePressurePlateBlock extends Block { +@@ -133,6 +133,19 @@ public abstract class BasePressurePlateBlock extends Block { } } @@ -96,14 +96,14 @@ index 7135a6bc87f90fafa94d0783aaf7b42d66449010..afd06de092a75c6c4f7b8848055e314b + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston && this.getSignalForState(state) > 0) { diff --git a/net/minecraft/world/level/block/BaseRailBlock.java b/net/minecraft/world/level/block/BaseRailBlock.java -index 504f38ce16f6a5d2b748a5c71c69f5be5886ceb5..db0b38db5675cb248e31e7a5988c35496561ad6f 100644 +index eb0b61b760d53c46b73a0bc00e21359ca9283cee..008192d30f7a46a2f8b7125ee340e560f6d48e3a 100644 --- a/net/minecraft/world/level/block/BaseRailBlock.java +++ b/net/minecraft/world/level/block/BaseRailBlock.java -@@ -121,6 +121,23 @@ public abstract class BaseRailBlock extends Block implements SimpleWaterloggedBl - } +@@ -123,6 +123,23 @@ public abstract class BaseRailBlock extends Block implements SimpleWaterloggedBl + return new RailState(level, pos, state).place(level.hasNeighborSignal(pos), first, current).getState(); } + // Leaves start - behaviour 1.21.1- @@ -124,16 +124,17 @@ index 504f38ce16f6a5d2b748a5c71c69f5be5886ceb5..db0b38db5675cb248e31e7a5988c3549 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/BrewingStandBlock.java b/net/minecraft/world/level/block/BrewingStandBlock.java -index bd6dc109fd9c37666f23ccd17c0eab8aff95e777..e25103c62a41e3fb0a8f7e84496cacc73ed71a74 100644 +index aea12aad3270b966eed7779eaf77d26052f8a21f..751792a388202a14be69fd68f891198bcea71193 100644 --- a/net/minecraft/world/level/block/BrewingStandBlock.java +++ b/net/minecraft/world/level/block/BrewingStandBlock.java -@@ -78,6 +78,14 @@ public class BrewingStandBlock extends BaseEntityBlock { - level.addParticle(ParticleTypes.SMOKE, d, d1, d2, 0.0, 0.0, 0.0); +@@ -79,7 +79,13 @@ public class BrewingStandBlock extends BaseEntityBlock { + double z = pos.getZ() + 0.4 + random.nextFloat() * 0.2; + level.addParticle(ParticleTypes.SMOKE, x, y, z, 0.0, 0.0, 0.0); } - +- + // Leaves start - behaviour 1.21.1- + @Override + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { @@ -141,16 +142,15 @@ index bd6dc109fd9c37666f23ccd17c0eab8aff95e777..e25103c62a41e3fb0a8f7e84496cacc7 + super.onRemove(state, level, pos, newState, isMoving); + } + // Leaves end - behaviour 1.21.1- -+ @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/ButtonBlock.java b/net/minecraft/world/level/block/ButtonBlock.java -index 27ca29f1d3e0e68229edef3b32634ce9b054824a..ea2c5d79fc41f58b263ec34b53df436e0043ef53 100644 +index 34b40cf5da7f06bf61fcf856dd33c6a3bea2a1d4..e8282ec25d025bdd19463e6a8b6bc4e488bbfae8 100644 --- a/net/minecraft/world/level/block/ButtonBlock.java +++ b/net/minecraft/world/level/block/ButtonBlock.java -@@ -132,6 +132,19 @@ public class ButtonBlock extends FaceAttachedHorizontalDirectionalBlock { - return isOn ? this.type.buttonClickOn() : this.type.buttonClickOff(); +@@ -131,6 +131,19 @@ public class ButtonBlock extends FaceAttachedHorizontalDirectionalBlock { + return pressed ? this.type.buttonClickOn() : this.type.buttonClickOff(); } + // Leaves start - behaviour 1.21.1- @@ -167,13 +167,13 @@ index 27ca29f1d3e0e68229edef3b32634ce9b054824a..ea2c5d79fc41f58b263ec34b53df436e + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston && state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/CampfireBlock.java b/net/minecraft/world/level/block/CampfireBlock.java -index b9e11a361e91cf3d5c929330fc0ba59cfe903198..4985fcfef75abbe2be9cd5e6111de4d60237bafa 100644 +index 8b706b34914326c039b761387f25e488f30fe6c8..d83754699a181c6abb97e9492186dc96d922b325 100644 --- a/net/minecraft/world/level/block/CampfireBlock.java +++ b/net/minecraft/world/level/block/CampfireBlock.java -@@ -105,6 +105,20 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB +@@ -111,6 +111,20 @@ public class CampfireBlock extends BaseEntityBlock implements SimpleWaterloggedB return InteractionResult.TRY_WITH_EMPTY_HAND; } @@ -192,14 +192,14 @@ index b9e11a361e91cf3d5c929330fc0ba59cfe903198..4985fcfef75abbe2be9cd5e6111de4d6 + // Leaves end - behaviour 1.21.1- + @Override - protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean pastEdges) { - if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent + protected void entityInside( + final BlockState state, diff --git a/net/minecraft/world/level/block/ChestBlock.java b/net/minecraft/world/level/block/ChestBlock.java -index fa2dce759419f62825000718361f47c6f208cdb2..64c0616c294bd7c7b62ae376d50369500b948390 100644 +index 599a11344c5dcfe1122ec10a89628490602572af..dbb571be36b26baae2d79293e79cb09d9ce240cd 100644 --- a/net/minecraft/world/level/block/ChestBlock.java +++ b/net/minecraft/world/level/block/ChestBlock.java -@@ -280,6 +280,14 @@ public class ChestBlock extends AbstractChestBlock implements - return this.chestCanConnectTo(blockState) && blockState.getValue(TYPE) == ChestType.SINGLE ? blockState.getValue(FACING) : null; +@@ -252,6 +252,14 @@ public class ChestBlock extends AbstractChestBlock implements + return this.chestCanConnectTo(state) && state.getValue(TYPE) == ChestType.SINGLE ? state.getValue(FACING) : null; } + // Leaves start - behaviour 1.21.1- @@ -211,14 +211,14 @@ index fa2dce759419f62825000718361f47c6f208cdb2..64c0616c294bd7c7b62ae376d5036950 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/ChiseledBookShelfBlock.java b/net/minecraft/world/level/block/ChiseledBookShelfBlock.java -index cea0f015290137a5284f4a3021c954272b3db543..53d983505b4c92824083ecd123901874d04704c5 100644 +index b7d7f1acf8e5cb3dddb7fb39fe003d25a9a41840..81c51667b8a89cc9ffc904406a5af7041fd7616d 100644 --- a/net/minecraft/world/level/block/ChiseledBookShelfBlock.java +++ b/net/minecraft/world/level/block/ChiseledBookShelfBlock.java -@@ -149,6 +149,27 @@ public class ChiseledBookShelfBlock extends BaseEntityBlock implements Selectabl - SLOT_OCCUPIED_PROPERTIES.forEach(property -> builder.add(property)); +@@ -171,6 +171,27 @@ public class ChiseledBookShelfBlock extends BaseEntityBlock implements Selectabl + SLOT_OCCUPIED_PROPERTIES.forEach(xva$0 -> var2.add(xva$0)); } + // Leaves start - behaviour 1.21.1- @@ -243,13 +243,13 @@ index cea0f015290137a5284f4a3021c954272b3db543..53d983505b4c92824083ecd123901874 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java -index 468a39219d82a665b99ac1768435557d6f3326c9..43af4388f09a5be23906478b1ff1a74fdbc94023 100644 +index 2d98e505cc5d7c22966a3605a77e0bbf0edf2ee4..540abc705d08f7a3d75fea50cc47d7a7651d11bf 100644 --- a/net/minecraft/world/level/block/CrafterBlock.java +++ b/net/minecraft/world/level/block/CrafterBlock.java -@@ -128,6 +128,14 @@ public class CrafterBlock extends BaseEntityBlock { +@@ -130,6 +130,14 @@ public class CrafterBlock extends BaseEntityBlock { } } @@ -262,10 +262,10 @@ index 468a39219d82a665b99ac1768435557d6f3326c9..43af4388f09a5be23906478b1ff1a74f + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/CreakingHeartBlock.java b/net/minecraft/world/level/block/CreakingHeartBlock.java -index dfb9a10622ba2a0c2759bb563fefd729f1109865..c735e7de1b88de531dd00a2cc2dd4a1394b808e6 100644 +index 3dd5f8c20ad68e0bd6222c8ba1687df0b2ad3b0d..746f140ea7522db879b8af1922be54395741c9f2 100644 --- a/net/minecraft/world/level/block/CreakingHeartBlock.java +++ b/net/minecraft/world/level/block/CreakingHeartBlock.java @@ -152,6 +152,16 @@ public class CreakingHeartBlock extends BaseEntityBlock { @@ -283,14 +283,14 @@ index dfb9a10622ba2a0c2759bb563fefd729f1109865..c735e7de1b88de531dd00a2cc2dd4a13 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/DecoratedPotBlock.java b/net/minecraft/world/level/block/DecoratedPotBlock.java -index dd20e3c57352859ab931692445c83669da94f629..e8c216831b66cd0f4e989797030119388a3378a5 100644 +index 1c131955ba7a01348d9d9d5cf733d107c2531915..2e59bcf4bd1b3bb26b58c5194c6d245ec501fbd2 100644 --- a/net/minecraft/world/level/block/DecoratedPotBlock.java +++ b/net/minecraft/world/level/block/DecoratedPotBlock.java -@@ -164,6 +164,14 @@ public class DecoratedPotBlock extends BaseEntityBlock implements SimpleWaterlog - return new DecoratedPotBlockEntity(pos, state); +@@ -172,6 +172,14 @@ public class DecoratedPotBlock extends BaseEntityBlock implements SimpleWaterlog + return new DecoratedPotBlockEntity(worldPosition, blockState); } + // Leaves start - behaviour 1.21.1- @@ -302,13 +302,13 @@ index dd20e3c57352859ab931692445c83669da94f629..e8c216831b66cd0f4e98979703011938 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/DiodeBlock.java b/net/minecraft/world/level/block/DiodeBlock.java -index a750e2d7f6c5ac7561c8b06870e022b07875c587..0ca50622be8dc300babc6b01b12eddae7fdd38bc 100644 +index 306377c8dcd9cfb1dda205d803bec2beffa2f2b7..2322290501c48485457a9f82e57e21901e05a9c4 100644 --- a/net/minecraft/world/level/block/DiodeBlock.java +++ b/net/minecraft/world/level/block/DiodeBlock.java -@@ -176,6 +176,16 @@ public abstract class DiodeBlock extends HorizontalDirectionalBlock { +@@ -179,6 +179,16 @@ public abstract class DiodeBlock extends HorizontalDirectionalBlock { this.updateNeighborsInFront(level, pos, state); } @@ -323,13 +323,13 @@ index a750e2d7f6c5ac7561c8b06870e022b07875c587..0ca50622be8dc300babc6b01b12eddae + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/DispenserBlock.java b/net/minecraft/world/level/block/DispenserBlock.java -index 2ef2861041f3aaf85ea64458c43c5d83fdab9bfc..0828d663647f7c3267a4a9392a3b0b8e6e54928c 100644 +index dc9118c64671e5a5598fe432873a20eee94a177e..4cf831d57c933b3d75a734d9cbdd37e194486e7c 100644 --- a/net/minecraft/world/level/block/DispenserBlock.java +++ b/net/minecraft/world/level/block/DispenserBlock.java -@@ -147,6 +147,14 @@ public class DispenserBlock extends BaseEntityBlock { +@@ -157,6 +157,14 @@ public class DispenserBlock extends BaseEntityBlock { return this.defaultBlockState().setValue(FACING, context.getNearestLookingDirection().getOpposite()); } @@ -342,13 +342,13 @@ index 2ef2861041f3aaf85ea64458c43c5d83fdab9bfc..0828d663647f7c3267a4a9392a3b0b8e + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/HopperBlock.java b/net/minecraft/world/level/block/HopperBlock.java -index 6789dd6c6f9c1683bcf0abb20319ccd6775e613c..695520463adcc6000ef5a94c86466e93a59af118 100644 +index e032b5289abe413009fe7c9068e71e788fab512a..b7bbaef98593d5fd73413ad5cd12ce2f7f5f0a49 100644 --- a/net/minecraft/world/level/block/HopperBlock.java +++ b/net/minecraft/world/level/block/HopperBlock.java -@@ -121,6 +121,14 @@ public class HopperBlock extends BaseEntityBlock { +@@ -127,6 +127,14 @@ public class HopperBlock extends BaseEntityBlock { } } @@ -361,14 +361,14 @@ index 6789dd6c6f9c1683bcf0abb20319ccd6775e613c..695520463adcc6000ef5a94c86466e93 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/JukeboxBlock.java b/net/minecraft/world/level/block/JukeboxBlock.java -index a4b824dab307705559a76b954a3e47d30dd65889..bc036d8e9d241ea9178808fce39c4e5115d5f753 100644 +index 218d4a3e77c46caf136ae06e6422022efda6cd73..fb46a7737cbd050b81b0c84f4454b8486318d21c 100644 --- a/net/minecraft/world/level/block/JukeboxBlock.java +++ b/net/minecraft/world/level/block/JukeboxBlock.java -@@ -73,6 +73,19 @@ public class JukeboxBlock extends BaseEntityBlock { - } +@@ -82,6 +82,19 @@ public class JukeboxBlock extends BaseEntityBlock { + return !result.consumesAction() ? InteractionResult.TRY_WITH_EMPTY_HAND : result; } + // Leaves start - behaviour 1.21.1- @@ -385,13 +385,13 @@ index a4b824dab307705559a76b954a3e47d30dd65889..bc036d8e9d241ea9178808fce39c4e51 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/LecternBlock.java b/net/minecraft/world/level/block/LecternBlock.java -index 52b9bd310c731c407fc4264559084debec81d3d9..0b991825d48ad64c1c68fd7c6bded7583572dded 100644 +index 921a7b3cac9dc38730f65920001edb4ffbb98b3a..f16adac24fbd6953b0d89f7ec268a6d7ef651cd4 100644 --- a/net/minecraft/world/level/block/LecternBlock.java +++ b/net/minecraft/world/level/block/LecternBlock.java -@@ -198,6 +198,36 @@ public class LecternBlock extends BaseEntityBlock { +@@ -200,6 +200,36 @@ public class LecternBlock extends BaseEntityBlock { changePowered(level, pos, state, false); } @@ -426,13 +426,13 @@ index 52b9bd310c731c407fc4264559084debec81d3d9..0b991825d48ad64c1c68fd7c6bded758 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/LeverBlock.java b/net/minecraft/world/level/block/LeverBlock.java -index 5f03e9fed3d4a8c3b72ca05be0b62ef45ac291f7..359fe5d611bcebe4cb98b9d8cea26b255adb167e 100644 +index 341960ef67a689f660d0dcf61aaf5bf52bdc9074..341acc65fb2ffa45d9ad90fa15cf4e972e68a95e 100644 --- a/net/minecraft/world/level/block/LeverBlock.java +++ b/net/minecraft/world/level/block/LeverBlock.java -@@ -124,6 +124,19 @@ public class LeverBlock extends FaceAttachedHorizontalDirectionalBlock { +@@ -127,6 +127,19 @@ public class LeverBlock extends FaceAttachedHorizontalDirectionalBlock { } } @@ -450,13 +450,13 @@ index 5f03e9fed3d4a8c3b72ca05be0b62ef45ac291f7..359fe5d611bcebe4cb98b9d8cea26b25 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston && state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/LightningRodBlock.java b/net/minecraft/world/level/block/LightningRodBlock.java -index 622f28a3661eec0487179aa9798f5771c0d957f7..4175957f56ddaaaa6e7fd7639f8173e39ce92d71 100644 +index 8399256a819bf70a0a943c404c82dbbbbea9267c..e9b97d24d8c444a831c463c95319cc4c0a48361e 100644 --- a/net/minecraft/world/level/block/LightningRodBlock.java +++ b/net/minecraft/world/level/block/LightningRodBlock.java -@@ -120,6 +120,18 @@ public class LightningRodBlock extends RodBlock implements SimpleWaterloggedBloc +@@ -123,6 +123,18 @@ public class LightningRodBlock extends RodBlock implements SimpleWaterloggedBloc } } @@ -473,13 +473,13 @@ index 622f28a3661eec0487179aa9798f5771c0d957f7..4175957f56ddaaaa6e7fd7639f8173e3 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (state.getValue(POWERED)) { diff --git a/net/minecraft/world/level/block/ObserverBlock.java b/net/minecraft/world/level/block/ObserverBlock.java -index 3c12d8e23f20b666b0005e597ba2e803c02d5d78..17c371f4c24e8a81705bdd322b1de5de4b8be8b7 100644 +index 6a3413ca875ce78f48cd8d3ce2cfe7798be1a19e..c492a770cedf976949434d700c943fcd8d4b4199 100644 --- a/net/minecraft/world/level/block/ObserverBlock.java +++ b/net/minecraft/world/level/block/ObserverBlock.java -@@ -127,6 +127,17 @@ public class ObserverBlock extends DirectionalBlock { +@@ -128,6 +128,17 @@ public class ObserverBlock extends DirectionalBlock { } } @@ -495,13 +495,13 @@ index 3c12d8e23f20b666b0005e597ba2e803c02d5d78..17c371f4c24e8a81705bdd322b1de5de + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (state.getValue(POWERED) && level.getBlockTicks().hasScheduledTick(pos, this)) { diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java -index fe5a571e2ef6e505ba2ea8ccebd2f7b34395fd81..1c606cc15495a2f6f81bb22e3e0e0888c429a4ab 100644 +index fbc11774a51a01b8a99a997746b18c435c7a6069..718617a9bf78f1e55174ea69ffb28bec1d6c3694 100644 --- a/net/minecraft/world/level/block/RedStoneWireBlock.java +++ b/net/minecraft/world/level/block/RedStoneWireBlock.java -@@ -362,6 +362,27 @@ public class RedStoneWireBlock extends Block { +@@ -369,6 +369,27 @@ public class RedStoneWireBlock extends Block { } } @@ -527,13 +527,13 @@ index fe5a571e2ef6e505ba2ea8ccebd2f7b34395fd81..1c606cc15495a2f6f81bb22e3e0e0888 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/RedstoneTorchBlock.java b/net/minecraft/world/level/block/RedstoneTorchBlock.java -index 5365cc6c2ec7f86376bf27551493b6621d4c412e..b08f46411828b4cc05d7d836cd896063c6c9b6a9 100644 +index 9d4e3511e5a3fbd9b5160c3a85a80420b2db560c..fa3ad496e807aab09c00a5394cbebdb518e2c944 100644 --- a/net/minecraft/world/level/block/RedstoneTorchBlock.java +++ b/net/minecraft/world/level/block/RedstoneTorchBlock.java -@@ -53,6 +53,15 @@ public class RedstoneTorchBlock extends BaseTorchBlock { +@@ -54,6 +54,15 @@ public class RedstoneTorchBlock extends BaseTorchBlock { } } @@ -547,13 +547,13 @@ index 5365cc6c2ec7f86376bf27551493b6621d4c412e..b08f46411828b4cc05d7d836cd896063 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/SculkSensorBlock.java b/net/minecraft/world/level/block/SculkSensorBlock.java -index 80e6ba8f026a6565696f18304507b2d0a347650c..593fab3d2a70bcd6832dd777afa4973f22abbaeb 100644 +index 2bbce50d9dd0ca65f9e3bc90c8de098473039bc5..94ec05d2c6338464f4912cc1c919165c080f8cde 100644 --- a/net/minecraft/world/level/block/SculkSensorBlock.java +++ b/net/minecraft/world/level/block/SculkSensorBlock.java -@@ -128,6 +128,18 @@ public class SculkSensorBlock extends BaseEntityBlock implements SimpleWaterlogg +@@ -129,6 +129,18 @@ public class SculkSensorBlock extends BaseEntityBlock implements SimpleWaterlogg } } @@ -570,14 +570,14 @@ index 80e6ba8f026a6565696f18304507b2d0a347650c..593fab3d2a70bcd6832dd777afa4973f + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (getPhase(state) == SculkSensorPhase.ACTIVE) { diff --git a/net/minecraft/world/level/block/SculkShriekerBlock.java b/net/minecraft/world/level/block/SculkShriekerBlock.java -index 2815fb48530de3a2f9ef0f472a0fd0a2c32140b6..6b5e5bbbeb11bd8ce100ef3c215dfcf4b387e595 100644 +index d7e5ec23c64b60c47ab6b54cbf282e88c3a4a045..6858d2721a7e5bad21756bacd90255e3c817f931 100644 --- a/net/minecraft/world/level/block/SculkShriekerBlock.java +++ b/net/minecraft/world/level/block/SculkShriekerBlock.java @@ -68,6 +68,16 @@ public class SculkShriekerBlock extends BaseEntityBlock implements SimpleWaterlo - super.stepOn(level, pos, state, entity); + super.stepOn(level, pos, onState, entity); } + // Leaves start - behaviour 1.21.1- @@ -591,10 +591,10 @@ index 2815fb48530de3a2f9ef0f472a0fd0a2c32140b6..6b5e5bbbeb11bd8ce100ef3c215dfcf4 + // Leaves end - behaviour 1.21.1- + @Override - protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + protected void tick(final BlockState state, final ServerLevel level, final BlockPos pos, final RandomSource random) { if (state.getValue(SHRIEKING)) { diff --git a/net/minecraft/world/level/block/ShulkerBoxBlock.java b/net/minecraft/world/level/block/ShulkerBoxBlock.java -index 1b6bddc15f39c381050eb20c5ad43581d471d876..211fee7a51f73fb18d1b15bce34cf8b684f96a2d 100644 +index 9133d78f29e4a18a8102a27be97e018e298e2398..283cc264eb2f2e7674fa01576793acead7fc813c 100644 --- a/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/net/minecraft/world/level/block/ShulkerBoxBlock.java @@ -150,6 +150,19 @@ public class ShulkerBoxBlock extends BaseEntityBlock { @@ -615,35 +615,38 @@ index 1b6bddc15f39c381050eb20c5ad43581d471d876..211fee7a51f73fb18d1b15bce34cf8b6 + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { Containers.updateNeighboursAfterDestroy(state, level, pos); diff --git a/net/minecraft/world/level/block/TripWireBlock.java b/net/minecraft/world/level/block/TripWireBlock.java -index 9d005c3db8f0c784cdd7217e7b110daa703a9cf3..190d7cd818f768bd44fc1b4e62af2c9b3aacbe4d 100644 +index 83823edc4a943e006e3237ecb9198a571a681873..50a70afc257deaddd8224b5f18077eba21664f8a 100644 --- a/net/minecraft/world/level/block/TripWireBlock.java +++ b/net/minecraft/world/level/block/TripWireBlock.java -@@ -108,6 +108,16 @@ public class TripWireBlock extends Block { +@@ -107,9 +107,18 @@ public class TripWireBlock extends Block { } } + // Leaves start - behaviour 1.21.1- -+ @Override + @Override +- protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { + protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean isMoving) { -+ if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating + if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating + if (!isMoving && !state.is(newState.getBlock())) { + this.updateSource(level, pos, state.setValue(POWERED, Boolean.TRUE)); + } + } + // Leaves end - behaviour 1.21.1- + - @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { - if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating ++ @Override ++ protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { + if (!movedByPiston) { + this.updateSource(level, pos, state.setValue(POWERED, true)); + } diff --git a/net/minecraft/world/level/block/TripWireHookBlock.java b/net/minecraft/world/level/block/TripWireHookBlock.java -index 599f62a108a943f4f4d566ebefa3647515f74c50..33557a0d921d0ff1ed3bba748c16db6ea0f517bd 100644 +index cf6dcbffcef94bed19b89c252b602dd04d646d84..801a2e9d441108fb75b06c6685ccf5c5de636df6 100644 --- a/net/minecraft/world/level/block/TripWireHookBlock.java +++ b/net/minecraft/world/level/block/TripWireHookBlock.java -@@ -244,6 +244,25 @@ public class TripWireHookBlock extends Block { - level.updateNeighborsAt(pos.relative(opposite), block, orientation); +@@ -247,6 +247,25 @@ public class TripWireHookBlock extends Block { + level.updateNeighborsAt(pos.relative(front), block, orientation); } + // Leaves start - behaviour 1.21.1- @@ -666,27 +669,27 @@ index 599f62a108a943f4f4d566ebefa3647515f74c50..33557a0d921d0ff1ed3bba748c16db6e + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { if (!movedByPiston) { diff --git a/net/minecraft/world/level/block/entity/BlockEntityType.java b/net/minecraft/world/level/block/entity/BlockEntityType.java -index 8b392c168d9cfefa972aa7f1e9b68711f9683024..adc9fee0c3d5204f7ae7003dc82085c661cdfd0c 100644 +index d991a4b80af22e6b88ef3f72f57119cd8f16b4e6..278fe5fe0e99ba4d42e2eec88007edd04fd8e5cf 100644 --- a/net/minecraft/world/level/block/entity/BlockEntityType.java +++ b/net/minecraft/world/level/block/entity/BlockEntityType.java -@@ -302,7 +302,7 @@ public class BlockEntityType { +@@ -297,7 +297,7 @@ public class BlockEntityType { } - public boolean isValid(BlockState state) { + public boolean isValid(final BlockState state) { - return this.validBlocks.contains(state.getBlock()); + return org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.oldBlockRemoveBehaviour || this.validBlocks.contains(state.getBlock()); // Leaves - behaviour 1.21.1- } @Deprecated diff --git a/net/minecraft/world/level/block/piston/MovingPistonBlock.java b/net/minecraft/world/level/block/piston/MovingPistonBlock.java -index 58b78e6b9a43605940420d8cb0f1163ee3f0a5ff..eebf03ece11052f07702951b9335bc151e160848 100644 +index 2b6ad989e1e1424d0283bae39e5dae33eba44923..c72a14a8c3d9fe4430cfde671f29688c696f983a 100644 --- a/net/minecraft/world/level/block/piston/MovingPistonBlock.java +++ b/net/minecraft/world/level/block/piston/MovingPistonBlock.java -@@ -65,6 +65,18 @@ public class MovingPistonBlock extends BaseEntityBlock { - return createTickerHelper(blockEntityType, BlockEntityType.PISTON, PistonMovingBlockEntity::tick); +@@ -70,6 +70,18 @@ public class MovingPistonBlock extends BaseEntityBlock { + return createTickerHelper(type, BlockEntityType.PISTON, PistonMovingBlockEntity::tick); } + // Leaves start - behaviour 1.21.1- @@ -702,10 +705,10 @@ index 58b78e6b9a43605940420d8cb0f1163ee3f0a5ff..eebf03ece11052f07702951b9335bc15 + // Leaves end - behaviour 1.21.1- + @Override - public void destroy(LevelAccessor level, BlockPos pos, BlockState state) { - BlockPos blockPos = pos.relative(state.getValue(FACING).getOpposite()); + public void destroy(final LevelAccessor level, final BlockPos pos, final BlockState state) { + BlockPos relative = pos.relative(state.getValue(FACING).getOpposite()); diff --git a/net/minecraft/world/level/block/piston/PistonHeadBlock.java b/net/minecraft/world/level/block/piston/PistonHeadBlock.java -index b369e80a4fc371a3762e34e7d4d180b86d1d190f..0b412e360b090dc85d1726eb8f51c69b47061276 100644 +index f8caa0b3c21766dbad73c524c1680346e4257188..343660d3e5fbdc25aba84a5cacbc367d40533848 100644 --- a/net/minecraft/world/level/block/piston/PistonHeadBlock.java +++ b/net/minecraft/world/level/block/piston/PistonHeadBlock.java @@ -78,6 +78,19 @@ public class PistonHeadBlock extends DirectionalBlock { @@ -726,13 +729,13 @@ index b369e80a4fc371a3762e34e7d4d180b86d1d190f..0b412e360b090dc85d1726eb8f51c69b + // Leaves end - behaviour 1.21.1- + @Override - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { - BlockPos blockPos = pos.relative(state.getValue(FACING).getOpposite()); + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { + BlockPos basePos = pos.relative(state.getValue(FACING).getOpposite()); diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java -index b1f1ea03072c63bc3032c9f023a8fb4ede34b34b..1d805ccd2bc9d74e8f15db37bcc8146b846e438e 100644 +index 6be4d5c7801937e865788e08789de2814c6fa19d..1a58fe708e4d69361991e1b5b5b2726955bde25d 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -170,6 +170,15 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -173,6 +173,15 @@ public abstract class BlockBehaviour implements FeatureElement { org.spigotmc.AsyncCatcher.catchOp("block onPlace"); // Spigot } @@ -745,10 +748,10 @@ index b1f1ea03072c63bc3032c9f023a8fb4ede34b34b..1d805ccd2bc9d74e8f15db37bcc8146b + } + // Leaves end - behaviour 1.21.1- + - protected void affectNeighborsAfterRemoval(BlockState state, ServerLevel level, BlockPos pos, boolean movedByPiston) { + protected void affectNeighborsAfterRemoval(final BlockState state, final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { } -@@ -865,6 +874,12 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -892,6 +901,12 @@ public abstract class BlockBehaviour implements FeatureElement { // CraftBukkit end } @@ -758,51 +761,30 @@ index b1f1ea03072c63bc3032c9f023a8fb4ede34b34b..1d805ccd2bc9d74e8f15db37bcc8146b + } + // Leaves end - behaviour 1.21.1- + - public void affectNeighborsAfterRemoval(ServerLevel level, BlockPos pos, boolean movedByPiston) { + public void affectNeighborsAfterRemoval(final ServerLevel level, final BlockPos pos, final boolean movedByPiston) { this.getBlock().affectNeighborsAfterRemoval(this.asState(), level, pos, movedByPiston); } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 670459abcc6f32bdc6d4742f6710585fda83ac83..3c5640ed649ba89066da70e64fe6291165948a5d 100644 +index f845c2c6b19a274f39ec63980b6e3e6761f23bf0..6bd86a6266623092dd9abf610ef2bc52e5b9d0b7 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -401,22 +401,28 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - boolean flag = !blockState.is(block); - boolean flag1 = (flags & Block.UPDATE_MOVE_BY_PISTON) != 0; - boolean flag2 = (flags & Block.UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS) == 0; -- if (flag && blockState.hasBlockEntity() && !state.shouldChangedStateKeepBlockEntity(blockState)) { -- if (!this.level.isClientSide() && flag2) { -- BlockEntity blockEntity = this.level.getBlockEntity(pos); -- if (blockEntity != null) { -- blockEntity.preRemoveSideEffects(pos, blockState); -+ // Leaves start - behaviour 1.21.1- -+ if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.oldBlockRemoveBehaviour) { -+ if (flag && blockState.hasBlockEntity()) { -+ if (!this.level.isClientSide() && flag2) { -+ BlockEntity blockEntity = this.level.getBlockEntity(pos); -+ if (blockEntity != null) { -+ blockEntity.preRemoveSideEffects(pos, blockState); -+ } - } -- } - -- this.removeBlockEntity(pos); -- } -+ this.removeBlockEntity(pos); -+ } - -- if ((flag || block instanceof BaseRailBlock) -- && this.level instanceof ServerLevel serverLevel -- && ((flags & Block.UPDATE_NEIGHBORS) != 0 || flag1)) { -- blockState.affectNeighborsAfterRemoval(serverLevel, pos, flag1); -+ if ((flag || block instanceof BaseRailBlock) -+ && this.level instanceof ServerLevel serverLevel -+ && ((flags & Block.UPDATE_NEIGHBORS) != 0 || flag1)) { -+ blockState.affectNeighborsAfterRemoval(serverLevel, pos, flag1); -+ } -+ } else { -+ blockState.onRemove(this.level, pos, state, flag1); - } -+ // Leaves end - behaviour 1.21.1- +@@ -403,6 +403,8 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + boolean blockChanged = !oldState.is(newBlock); + boolean movedByPiston = (flags & Block.UPDATE_MOVE_BY_PISTON) != 0; + boolean sideEffects = (flags & Block.UPDATE_SKIP_BLOCK_ENTITY_SIDEEFFECTS) == 0; ++ // Leaves start - behaviour 1.21.1- ++ if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.oldBlockRemoveBehaviour) { + if (blockChanged && oldState.hasBlockEntity() && !state.shouldChangedStateKeepBlockEntity(oldState)) { + if (!this.level.isClientSide() && sideEffects) { + BlockEntity blockEntity = this.level.getBlockEntity(pos); +@@ -419,6 +421,10 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + && ((flags & Block.UPDATE_NEIGHBORS) != 0 || movedByPiston)) { + oldState.affectNeighborsAfterRemoval(serverLevel, pos, movedByPiston); + } ++ } else { ++ oldState.onRemove(this.level, pos, state, movedByPiston); ++ } ++ // Leaves end - behaviour 1.21.1- - if (!section.getBlockState(i, i1, i2).is(block)) { - return null; + if (!section.getBlockState(localX, localY, localZ).is(newBlock)) { + return null; diff --git a/leaves-server/minecraft-patches/features/0099-Fix-FallingBlockEntity-Duplicate.patch b/leaves-server/minecraft-patches/features/0099-Fix-FallingBlockEntity-Duplicate.patch deleted file mode 100644 index 7fb3aa90b..000000000 --- a/leaves-server/minecraft-patches/features/0099-Fix-FallingBlockEntity-Duplicate.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Wed, 31 Jul 2024 12:51:44 +0800 -Subject: [PATCH] Fix FallingBlockEntity Duplicate - - -diff --git a/net/minecraft/world/entity/item/FallingBlockEntity.java b/net/minecraft/world/entity/item/FallingBlockEntity.java -index 51f1b141f5f2abd96d36d3ea1954f8dded936506..a5ce7877daa70cc5b3120d56fd50a57c5b7f2ea4 100644 ---- a/net/minecraft/world/entity/item/FallingBlockEntity.java -+++ b/net/minecraft/world/entity/item/FallingBlockEntity.java -@@ -384,7 +384,7 @@ public class FallingBlockEntity extends Entity { - ResourceKey resourceKey1 = this.level().dimension(); - boolean flag = (resourceKey1 == Level.END || resourceKey == Level.END) && resourceKey1 != resourceKey; - Entity entity = super.teleport(teleportTransition); -- this.forceTickAfterTeleportToDuplicate = entity != null && flag && io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowUnsafeEndPortalTeleportation; // Paper -+ this.forceTickAfterTeleportToDuplicate = entity != null && flag; // Paper // Leaves - return entity; - } - } diff --git a/leaves-server/minecraft-patches/features/0099-Old-raid-behavior.patch b/leaves-server/minecraft-patches/features/0099-Old-raid-behavior.patch new file mode 100644 index 000000000..6aea8cb7e --- /dev/null +++ b/leaves-server/minecraft-patches/features/0099-Old-raid-behavior.patch @@ -0,0 +1,174 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: huanli233 <392352840@qq.com> +Date: Wed, 23 Oct 2024 23:10:48 +0800 +Subject: [PATCH] Old raid behavior + + +diff --git a/net/minecraft/world/effect/BadOmenMobEffect.java b/net/minecraft/world/effect/BadOmenMobEffect.java +index f58b10c7dec0d2b7dc2b3d1198539b74d13038f3..ee49b2bdf1bbf6a53940099d1b84a99b278d84e3 100644 +--- a/net/minecraft/world/effect/BadOmenMobEffect.java ++++ b/net/minecraft/world/effect/BadOmenMobEffect.java +@@ -22,6 +22,11 @@ class BadOmenMobEffect extends MobEffect { + && !player.isSpectator() + && level.getDifficulty() != Difficulty.PEACEFUL + && level.isVillage(player.blockPosition())) { ++ // Leaves start - Revert raid changes ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior) { ++ return level.getRaids().createOrExtendRaid(player, player.blockPosition()) == null; ++ } ++ // Leaves end - Revert raid changes + Raid raid = level.getRaidAt(player.blockPosition()); + if (raid == null || raid.getRaidOmenLevel() < raid.getMaxRaidOmenLevel()) { + player.addEffect(new MobEffectInstance(MobEffects.RAID_OMEN, 600, amplification)); +diff --git a/net/minecraft/world/entity/raid/Raid.java b/net/minecraft/world/entity/raid/Raid.java +index bd40c5fecbf449d0774b3ce68c471916fc494154..4c97c5d5f9e47bb53b49e0f87a5998a993bed312 100644 +--- a/net/minecraft/world/entity/raid/Raid.java ++++ b/net/minecraft/world/entity/raid/Raid.java +@@ -261,7 +261,7 @@ public class Raid { + } + + public boolean absorbRaidOmen(final ServerPlayer player) { +- MobEffectInstance effect = player.getEffect(MobEffects.RAID_OMEN); ++ MobEffectInstance effect = player.getEffect(org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior ? MobEffects.BAD_OMEN : MobEffects.RAID_OMEN); // Leaves - old Raid Behavior + if (effect == null) { + return false; + } +@@ -338,7 +338,13 @@ public class Raid { + } + + if (shouldTryToFindSpawnPos) { +- this.waveSpawnPos = this.getValidSpawnPos(level); ++ // Leaves Start - old FindSpawnPosition ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior) { ++ this.waveSpawnPos = this.preCalcRavagerSpawnLocation(level, this.raidCooldownTicks < 100 ? 1 : 0); ++ } else { ++ this.waveSpawnPos = this.getValidSpawnPos(level); ++ } ++ // Leaves End - old FindSpawnPosition + } + + if (this.raidCooldownTicks == 300 || this.raidCooldownTicks % 20 == 0) { +@@ -393,7 +399,14 @@ public class Raid { + int attempt = 0; + + while (this.shouldSpawnGroup()) { +- BlockPos spawnPos = this.waveSpawnPos.orElseGet(() -> this.findRandomSpawnPos(level, 20)); ++ // Leaves Start - old FindSpawnPosition ++ BlockPos spawnPos; ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior) { ++ spawnPos = this.getRavagerSpawnLocation(level, attempt, 20); ++ } else { ++ spawnPos = this.waveSpawnPos.orElseGet(() -> this.findRandomSpawnPos(level, 20)); ++ } ++ // Leaves End - old FindSpawnPosition + if (spawnPos != null) { + this.started = true; + this.spawnGroup(level, spawnPos); +@@ -405,7 +418,7 @@ public class Raid { + attempt++; + } + +- if (attempt > 5) { ++ if (attempt > (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior ? 3 : 5)) { // Leaves - old FindSpawnPosition + org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(level, this, org.bukkit.event.raid.RaidStopEvent.Reason.UNSPAWNABLE); // CraftBukkit + this.stop(); + break; +@@ -700,7 +713,7 @@ public class Raid { + int spawnX = this.center.getX() + Mth.floor(Mth.cos(angle) * 32.0F * howFar) + this.random.nextInt(3) * Mth.floor(howFar); + int spawnZ = this.center.getZ() + Mth.floor(Mth.sin(angle) * 32.0F * howFar) + this.random.nextInt(3) * Mth.floor(howFar); + int spawnY = level.getHeight(Heightmap.Types.WORLD_SURFACE, spawnX, spawnZ); +- if (Mth.abs(spawnY - this.center.getY()) <= 96) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior || Mth.abs(spawnY - this.center.getY()) <= 96) { // Leaves - skippable + spawnPos.set(spawnX, spawnY, spawnZ); + if (!level.isVillage(spawnPos) || secondsRemaining <= 7) { + int delta = 10; +@@ -878,4 +891,42 @@ public class Raid { + this.spawnsPerWaveBeforeBonus = spawnsPerWaveBeforeBonus; + } + } ++ ++ // Leaves start - old FindSpawnPosition ++ @Nullable ++ private BlockPos getRavagerSpawnLocation(final ServerLevel serverWorld, final int proximity, final int tries) { ++ int i = proximity == 0 ? 2 : 2 - proximity; ++ BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); ++ net.minecraft.world.entity.SpawnPlacementType spawnLocation = net.minecraft.world.entity.SpawnPlacements.getPlacementType(EntityType.RAVAGER); ++ for (int j = 0; j < tries; j++) { ++ float f = serverWorld.getRandom().nextFloat() * (float) (Math.PI * 2); ++ int k = this.center.getX() + Mth.floor(Mth.cos(f) * 32.0F * (float) i + serverWorld.getRandom().nextInt(5)); ++ int l = this.center.getZ() + Mth.floor(Mth.sin(f) * 32.0F * (float) i + serverWorld.getRandom().nextInt(5)); ++ int m = serverWorld.getHeight(Heightmap.Types.WORLD_SURFACE, k, l); ++ mutable.set(k, m, l); ++ if (serverWorld.isVillage(mutable) && proximity < 2) { ++ continue; ++ } ++ if (serverWorld.hasChunksAt(mutable.getX() - 10, mutable.getZ() - 10, mutable.getX() + 10, mutable.getZ() + 10) ++ && serverWorld.isPositionEntityTicking(mutable) ++ && (spawnLocation.isSpawnPositionOk(serverWorld, mutable, EntityType.RAVAGER) ++ || serverWorld.getBlockState(mutable.below()).is(net.minecraft.world.level.block.Blocks.SNOW) ++ && serverWorld.getBlockState(mutable).isAir()) ++ ) { ++ return mutable.immutable(); ++ } ++ } ++ return null; ++ } ++ ++ private Optional preCalcRavagerSpawnLocation(final ServerLevel serverWorld, final int proximity) { ++ for (int i = 0; i < 3; i++) { ++ BlockPos blockPos = this.getRavagerSpawnLocation(serverWorld, proximity, 1); ++ if (blockPos != null) { ++ return Optional.of(blockPos); ++ } ++ } ++ return Optional.empty(); ++ } ++ // Leaves end - old FindSpawnPosition + } +diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java +index cf689dae6978577970e39bf3004be551b4908cd1..474e5de382b3d1e485d9ea988c143689e72f39ab 100644 +--- a/net/minecraft/world/entity/raid/Raider.java ++++ b/net/minecraft/world/entity/raid/Raider.java +@@ -128,6 +128,42 @@ public abstract class Raider extends PatrollingMonster { + + raidWhenKilled.removeFromRaid(serverLevel, this, false); + } ++ ++ // Leaves start - Revert raid changes ++ Entity killerEntity = source.getEntity(); ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior && !this.hasActiveRaid()) { ++ ItemStack itemstack = this.getItemBySlot(net.minecraft.world.entity.EquipmentSlot.HEAD); ++ net.minecraft.world.entity.player.Player entityhuman = null; ++ if (killerEntity instanceof net.minecraft.world.entity.player.Player player) { ++ entityhuman = player; ++ } else if (killerEntity instanceof net.minecraft.world.entity.animal.wolf.Wolf wolf) { ++ LivingEntity entityliving = wolf.getOwner(); ++ if (wolf.isTame() && entityliving instanceof net.minecraft.world.entity.player.Player player) { ++ entityhuman = player; ++ } ++ } ++ ++ if (entityhuman != null && !itemstack.isEmpty() && this.isPatrolLeader()) { ++ net.minecraft.world.effect.MobEffectInstance mobeffect = entityhuman.getEffect(net.minecraft.world.effect.MobEffects.BAD_OMEN); ++ int amp = 1; ++ ++ if (mobeffect != null) { ++ amp += mobeffect.getAmplifier(); ++ entityhuman.removeEffectNoUpdate(net.minecraft.world.effect.MobEffects.BAD_OMEN); ++ } else { ++ --amp; ++ } ++ ++ amp = net.minecraft.util.Mth.clamp(amp, 0, 4); ++ net.minecraft.world.effect.MobEffectInstance mobeffect1 = new net.minecraft.world.effect.MobEffectInstance(net.minecraft.world.effect.MobEffects.BAD_OMEN, 120000, amp, false, false, true); ++ ++ if (serverLevel.getGameRules().get(net.minecraft.world.level.gamerules.GameRules.RAIDS)) { ++ entityhuman.addEffect(mobeffect1, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN); // CraftBukkit ++ } ++ this.setPatrolLeader(false); ++ } ++ } ++ // Leaves end - Revert raid changes + } + + super.die(source); diff --git a/leaves-server/minecraft-patches/features/0100-Allow-anvil-destroy-item-entities.patch b/leaves-server/minecraft-patches/features/0100-Allow-anvil-destroy-item-entities.patch new file mode 100644 index 000000000..0e1f32410 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0100-Allow-anvil-destroy-item-entities.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: huanli233 <392352840@qq.com> +Date: Sat, 26 Oct 2024 19:53:17 +0800 +Subject: [PATCH] Allow anvil destroy item entities + + +diff --git a/net/minecraft/world/entity/item/FallingBlockEntity.java b/net/minecraft/world/entity/item/FallingBlockEntity.java +index ed39910d6db6613006577d5aa37a6d483d386e3b..2afbaf3418e7dd35d10e853ddbe2da25043f3aa8 100644 +--- a/net/minecraft/world/entity/item/FallingBlockEntity.java ++++ b/net/minecraft/world/entity/item/FallingBlockEntity.java +@@ -281,7 +281,7 @@ public class FallingBlockEntity extends Entity { + return false; + } + +- Predicate entitySelector = EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(EntitySelector.LIVING_ENTITY_STILL_ALIVE); ++ Predicate entitySelector = org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowAnvilDestroyItemEntities ? EntitySelector.NO_CREATIVE_OR_SPECTATOR : EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(EntitySelector.LIVING_ENTITY_STILL_ALIVE); // Leaves - Allow anvil destroy item entities + DamageSource actualDamageSource = this.blockState.getBlock() instanceof Fallable fallable + ? fallable.getFallDamageSource(this) + : this.damageSources().fallingBlock(this); diff --git a/leaves-server/minecraft-patches/features/0103-Disable-vault-blacklist.patch b/leaves-server/minecraft-patches/features/0101-Disable-vault-blacklist.patch similarity index 77% rename from leaves-server/minecraft-patches/features/0103-Disable-vault-blacklist.patch rename to leaves-server/minecraft-patches/features/0101-Disable-vault-blacklist.patch index 7ba37e285..56797b1c8 100644 --- a/leaves-server/minecraft-patches/features/0103-Disable-vault-blacklist.patch +++ b/leaves-server/minecraft-patches/features/0101-Disable-vault-blacklist.patch @@ -5,13 +5,13 @@ Subject: [PATCH] Disable vault blacklist diff --git a/net/minecraft/world/level/block/entity/vault/VaultServerData.java b/net/minecraft/world/level/block/entity/vault/VaultServerData.java -index c73ccb38eb4cd5995a9005f3319acad2605c6a2b..5500eeafb5c8d15049a5308c18323f549d7fde3e 100644 +index f732f660d6a7639bbdc2b35f0a8d9c828b07a418..d4fbc7e6c03c3d6bf27f7640f1d9420f9231a3bd 100644 --- a/net/minecraft/world/level/block/entity/vault/VaultServerData.java +++ b/net/minecraft/world/level/block/entity/vault/VaultServerData.java @@ -57,7 +57,7 @@ public class VaultServerData { } - boolean hasRewardedPlayer(Player player) { + boolean hasRewardedPlayer(final Player player) { - return this.rewardedPlayers.contains(player.getUUID()); + return !org.leavesmc.leaves.LeavesConfig.modify.disableVaultBlacklist && this.rewardedPlayers.contains(player.getUUID()); // Leaves - disable vault blacklist } @@ -26,17 +26,17 @@ index c73ccb38eb4cd5995a9005f3319acad2605c6a2b..5500eeafb5c8d15049a5308c18323f54 // Paper end - Vault API if (this.rewardedPlayers.size() > 128) { diff --git a/net/minecraft/world/level/block/entity/vault/VaultSharedData.java b/net/minecraft/world/level/block/entity/vault/VaultSharedData.java -index 036087f8085f05b43703ceca3413e0b8ac0a412b..a55c773f37cf8a50954d9a0f28868e42d94ad90e 100644 +index 877dbe309089df9ffb27ebbe3af527feb75d97a6..d34b24db92627e5e53b5eb31c2b71ba7f8e80c0e 100644 --- a/net/minecraft/world/level/block/entity/vault/VaultSharedData.java +++ b/net/minecraft/world/level/block/entity/vault/VaultSharedData.java -@@ -68,8 +68,8 @@ public class VaultSharedData { - Set set = config.playerDetector() - .detect(level, config.entitySelector(), pos, deactivationRange, false) +@@ -70,8 +70,8 @@ public class VaultSharedData { + Set currentConnectedPlayers = config.playerDetector() + .detect(serverLevel, config.entitySelector(), pos, limit, false) .stream() - .filter(uuid -> !serverData.getRewardedPlayers().contains(uuid)) - .collect(Collectors.toSet()); + .filter(uuid -> org.leavesmc.leaves.LeavesConfig.modify.disableVaultBlacklist || !serverData.getRewardedPlayers().contains(uuid)) + .collect(Collectors.toSet()); // Leaves - disable vault blacklist - if (!this.connectedPlayers.equals(set)) { - this.connectedPlayers = set; + if (!this.connectedPlayers.equals(currentConnectedPlayers)) { + this.connectedPlayers = currentConnectedPlayers; this.markDirty(); diff --git a/leaves-server/minecraft-patches/features/0101-Old-raid-behavior.patch b/leaves-server/minecraft-patches/features/0101-Old-raid-behavior.patch deleted file mode 100644 index 31f279c4d..000000000 --- a/leaves-server/minecraft-patches/features/0101-Old-raid-behavior.patch +++ /dev/null @@ -1,213 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: huanli233 <392352840@qq.com> -Date: Wed, 23 Oct 2024 23:10:48 +0800 -Subject: [PATCH] Old raid behavior - - -diff --git a/net/minecraft/world/effect/BadOmenMobEffect.java b/net/minecraft/world/effect/BadOmenMobEffect.java -index 80f17f33f670018240c854df589cf90cdeab6e70..d7f443bcf91ac7817fe79881122960f49b331365 100644 ---- a/net/minecraft/world/effect/BadOmenMobEffect.java -+++ b/net/minecraft/world/effect/BadOmenMobEffect.java -@@ -22,6 +22,11 @@ class BadOmenMobEffect extends MobEffect { - && !serverPlayer.isSpectator() - && level.getDifficulty() != Difficulty.PEACEFUL - && level.isVillage(serverPlayer.blockPosition())) { -+ // Leaves start - Revert raid changes -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior) { -+ return level.getRaids().createOrExtendRaid(serverPlayer, serverPlayer.blockPosition()) == null; -+ } -+ // Leaves end - Revert raid changes - Raid raidAt = level.getRaidAt(serverPlayer.blockPosition()); - if (raidAt == null || raidAt.getRaidOmenLevel() < raidAt.getMaxRaidOmenLevel()) { - serverPlayer.addEffect(new MobEffectInstance(MobEffects.RAID_OMEN, 600, amplifier)); -diff --git a/net/minecraft/world/entity/raid/Raid.java b/net/minecraft/world/entity/raid/Raid.java -index 8c6b8439bbfb8d9763767fda7985f26f14c05f3f..bff6c27c9037eb88b5da696f6ec99866dced7b39 100644 ---- a/net/minecraft/world/entity/raid/Raid.java -+++ b/net/minecraft/world/entity/raid/Raid.java -@@ -257,7 +257,7 @@ public class Raid { - } - - public boolean absorbRaidOmen(ServerPlayer player) { -- MobEffectInstance effect = player.getEffect(MobEffects.RAID_OMEN); -+ MobEffectInstance effect = player.getEffect(org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior ? MobEffects.BAD_OMEN : MobEffects.RAID_OMEN); // Leaves - old Raid Behavior - if (effect == null) { - return false; - } else { -@@ -334,7 +334,13 @@ public class Raid { - } - - if (flag1) { -- this.waveSpawnPos = this.getValidSpawnPos(level); -+ // Leaves Start - old FindSpawnPosition -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior) { -+ this.waveSpawnPos = this.preCalcRavagerSpawnLocation(level, this.raidCooldownTicks < 100 ? 1 : 0); -+ } else { -+ this.waveSpawnPos = this.getValidSpawnPos(level); -+ } -+ // Leaves End - old FindSpawnPosition - } - - if (this.raidCooldownTicks == 300 || this.raidCooldownTicks % 20 == 0) { -@@ -389,7 +395,14 @@ public class Raid { - int i = 0; - - while (this.shouldSpawnGroup()) { -- BlockPos blockPos = this.waveSpawnPos.orElseGet(() -> this.findRandomSpawnPos(level, 20)); -+ // Leaves Start - old FindSpawnPosition -+ BlockPos blockPos; -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior) { -+ blockPos = this.getRavagerSpawnLocation(level, i, 20); -+ } else { -+ blockPos = this.waveSpawnPos.orElseGet(() -> this.findRandomSpawnPos(level, 20)); -+ } -+ // Leaves End - old FindSpawnPosition - if (blockPos != null) { - this.started = true; - this.spawnGroup(level, blockPos); -@@ -401,7 +414,7 @@ public class Raid { - i++; - } - -- if (i > 5) { -+ if (i > (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior ? 3 : 5)) { // Leaves - old FindSpawnPosition - org.bukkit.craftbukkit.event.CraftEventFactory.callRaidStopEvent(level, this, org.bukkit.event.raid.RaidStopEvent.Reason.UNSPAWNABLE); // CraftBukkit - this.stop(); - break; -@@ -686,7 +699,7 @@ public class Raid { - int i2 = this.center.getX() + Mth.floor(Mth.cos(f2) * 32.0F * f) + level.random.nextInt(3) * Mth.floor(f); - int i3 = this.center.getZ() + Mth.floor(Mth.sin(f2) * 32.0F * f) + level.random.nextInt(3) * Mth.floor(f); - int height = level.getHeight(Heightmap.Types.WORLD_SURFACE, i2, i3); -- if (Mth.abs(height - this.center.getY()) <= 96) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior || Mth.abs(height - this.center.getY()) <= 96) { // Leaves - skippable - mutableBlockPos.set(i2, height, i3); - if (!level.isVillage(mutableBlockPos) || i <= 7) { - int i4 = 10; -@@ -705,6 +718,36 @@ public class Raid { - return null; - } - -+ // Leaves Start - old FindSpawnPosition -+ @Nullable -+ private BlockPos findRandomSpawnPos(ServerLevel level, int n, int n2) { -+ int n3 = 2 - n; -+ BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos(); -+ SpawnPlacementType spawnPlacementType = SpawnPlacements.getPlacementType(EntityType.RAVAGER); -+ for (int i = 0; i < n2; ++i) { -+ float f = level.random.nextFloat() * ((float)Math.PI * 2); -+ int n4 = this.center.getX() + Mth.floor(Mth.cos(f) * 32.0f * (float)n3) + level.random.nextInt(5); -+ int n5 = this.center.getZ() + Mth.floor(Mth.sin(f) * 32.0f * (float)n3) + level.random.nextInt(5); -+ int n6 = level.getHeight(Heightmap.Types.WORLD_SURFACE, n4, n5); -+ mutableBlockPos.set(n4, n6, n5); -+ if (level.isVillage(mutableBlockPos) && n < 2) continue; -+ if (!level.hasChunksAt(mutableBlockPos.getX() - 10, mutableBlockPos.getZ() - 10, mutableBlockPos.getX() + 10, mutableBlockPos.getZ() + 10) || !level.isPositionEntityTicking(mutableBlockPos) || !spawnPlacementType.isSpawnPositionOk(level, mutableBlockPos, EntityType.RAVAGER) && (!level.getBlockState((BlockPos)mutableBlockPos.below()).is(Blocks.SNOW) || !level.getBlockState(mutableBlockPos).isAir())) continue; -+ return mutableBlockPos; -+ } -+ return null; -+ } -+ -+ private Optional getValidSpawnPos(ServerLevel level, int n) { -+ for (int i = 0; i < 3; ++i) { -+ BlockPos blockPos = this.findRandomSpawnPos(level, n, 1); -+ if (blockPos == null) continue; -+ return Optional.of(blockPos); -+ } -+ return Optional.empty(); -+ } -+ // Leaves End - old FindSpawnPosition -+ -+ - private boolean addWaveMob(ServerLevel level, int wave, Raider raider) { - return this.addWaveMob(level, wave, raider, true); - } -@@ -862,4 +905,43 @@ public class Raid { - this.spawnsPerWaveBeforeBonus = spawnsPerWaveBeforeBonus; - } - } -+ -+ // Leaves start - old FindSpawnPosition -+ private BlockPos getRavagerSpawnLocation(ServerLevel serverWorld, int proximity, int tries) { -+ int i = proximity == 0 ? 2 : 2 - proximity; -+ BlockPos.MutableBlockPos mutable = new BlockPos.MutableBlockPos(); -+ SpawnPlacementType spawnLocation = SpawnPlacements.getPlacementType(EntityType.RAVAGER); -+ -+ for (int j = 0; j < tries; j++) { -+ float f = serverWorld.random.nextFloat() * (float) (Math.PI * 2); -+ int k = this.center.getX() + Mth.floor(Mth.cos(f) * 32.0F * (float) i + serverWorld.random.nextInt(5)); -+ int l = this.center.getZ() + Mth.floor(Mth.sin(f) * 32.0F * (float) i + serverWorld.random.nextInt(5)); -+ int m = serverWorld.getHeight(Heightmap.Types.WORLD_SURFACE, k, l); -+ mutable.set(k, m, l); -+ -+ if (serverWorld.isVillage(mutable) && proximity < 2) { -+ continue; -+ } -+ if (serverWorld.hasChunksAt(mutable.getX() - 10, mutable.getZ() - 10, mutable.getX() + 10, mutable.getZ() + 10) -+ && serverWorld.isPositionEntityTicking(mutable) -+ && (spawnLocation.isSpawnPositionOk(serverWorld, mutable, EntityType.RAVAGER) -+ || serverWorld.getBlockState(mutable.below()).is(Blocks.SNOW) -+ && serverWorld.getBlockState(mutable).isAir()) -+ ) { -+ return mutable; -+ } -+ } -+ return null; -+ } -+ -+ private Optional preCalcRavagerSpawnLocation(ServerLevel serverWorld, int proximity) { -+ for (int i = 0; i < 3; i++) { -+ BlockPos blockPos = this.getRavagerSpawnLocation(serverWorld, proximity, 1); -+ if (blockPos != null) { -+ return Optional.of(blockPos); -+ } -+ } -+ return Optional.empty(); -+ } -+ // Leaves end - old FindSpawnPosition - } -diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java -index ab94809c5cedc8ea7db6db45394bc9c65516da63..e1b82527d7f3cf8b43482c0c8188ef06c6d6e5c4 100644 ---- a/net/minecraft/world/entity/raid/Raider.java -+++ b/net/minecraft/world/entity/raid/Raider.java -@@ -127,6 +127,43 @@ public abstract class Raider extends PatrollingMonster { - - currentRaid.removeFromRaid(serverLevel, this, false); - } -+ -+ // Leaves start - Revert raid changes -+ if (this.level() instanceof ServerLevel) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldRaidBehavior && !this.hasRaid()) { -+ ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD); -+ net.minecraft.world.entity.player.Player entityhuman = null; -+ if (entity instanceof net.minecraft.world.entity.player.Player player) { -+ entityhuman = player; -+ } else if (entity instanceof net.minecraft.world.entity.animal.wolf.Wolf wolf) { -+ LivingEntity entityliving = wolf.getOwner(); -+ if (wolf.isTame() && entityliving instanceof net.minecraft.world.entity.player.Player player) { -+ entityhuman = player; -+ } -+ } -+ -+ if (entityhuman != null && !itemstack.isEmpty() && this.isCaptain()) { -+ net.minecraft.world.effect.MobEffectInstance mobeffect = entityhuman.getEffect(net.minecraft.world.effect.MobEffects.BAD_OMEN); -+ int i = 1; -+ -+ if (mobeffect != null) { -+ i += mobeffect.getAmplifier(); -+ entityhuman.removeEffectNoUpdate(net.minecraft.world.effect.MobEffects.BAD_OMEN); -+ } else { -+ --i; -+ } -+ -+ i = net.minecraft.util.Mth.clamp(i, 0, 4); -+ net.minecraft.world.effect.MobEffectInstance mobeffect1 = new net.minecraft.world.effect.MobEffectInstance(net.minecraft.world.effect.MobEffects.BAD_OMEN, 120000, i, false, false, true); -+ -+ if (serverLevel.getGameRules().get(net.minecraft.world.level.gamerules.GameRules.RAIDS)) { -+ entityhuman.addEffect(mobeffect1, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN); // CraftBukkit -+ } -+ this.setPatrolLeader(false); -+ } -+ } -+ } -+ // Leaves end - Revert raid changes - } - - super.die(damageSource); diff --git a/leaves-server/minecraft-patches/features/0102-Allow-anvil-destroy-item-entities.patch b/leaves-server/minecraft-patches/features/0102-Allow-anvil-destroy-item-entities.patch deleted file mode 100644 index 714f6c2b8..000000000 --- a/leaves-server/minecraft-patches/features/0102-Allow-anvil-destroy-item-entities.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: huanli233 <392352840@qq.com> -Date: Sat, 26 Oct 2024 19:53:17 +0800 -Subject: [PATCH] Allow anvil destroy item entities - - -diff --git a/net/minecraft/world/entity/item/FallingBlockEntity.java b/net/minecraft/world/entity/item/FallingBlockEntity.java -index a5ce7877daa70cc5b3120d56fd50a57c5b7f2ea4..3faabf37f41688f51d17dc177e52078025879ca7 100644 ---- a/net/minecraft/world/entity/item/FallingBlockEntity.java -+++ b/net/minecraft/world/entity/item/FallingBlockEntity.java -@@ -280,7 +280,7 @@ public class FallingBlockEntity extends Entity { - if (ceil < 0) { - return false; - } else { -- Predicate predicate = EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(EntitySelector.LIVING_ENTITY_STILL_ALIVE); -+ Predicate predicate = org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowAnvilDestroyItemEntities ? EntitySelector.NO_CREATIVE_OR_SPECTATOR : EntitySelector.NO_CREATIVE_OR_SPECTATOR.and(EntitySelector.LIVING_ENTITY_STILL_ALIVE); // Leaves - Allow anvil destroy item entities - DamageSource damageSource1 = this.blockState.getBlock() instanceof Fallable fallable - ? fallable.getFallDamageSource(this) - : this.damageSources().fallingBlock(this); diff --git a/leaves-server/minecraft-patches/features/0104-Fix-EntityPortalExitEvent-logic.patch b/leaves-server/minecraft-patches/features/0102-Fix-EntityPortalExitEvent-logic.patch similarity index 76% rename from leaves-server/minecraft-patches/features/0104-Fix-EntityPortalExitEvent-logic.patch rename to leaves-server/minecraft-patches/features/0102-Fix-EntityPortalExitEvent-logic.patch index 334964aae..b575a887c 100644 --- a/leaves-server/minecraft-patches/features/0104-Fix-EntityPortalExitEvent-logic.patch +++ b/leaves-server/minecraft-patches/features/0102-Fix-EntityPortalExitEvent-logic.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix EntityPortalExitEvent logic diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 64ab6dd069f423595a66769f255fba828ad20574..4583083678004a9abe9fb5b6b1f4e7aa113e8d27 100644 +index ab92199db9f5a66572904a8b54bf0efd43e75a19..37c21521ba13682a11424d9d0db71854946b5a4f 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -4073,19 +4073,21 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -4093,19 +4093,21 @@ public abstract class Entity ); event.callEvent(); @@ -32,7 +32,7 @@ index 64ab6dd069f423595a66769f255fba828ad20574..4583083678004a9abe9fb5b6b1f4e7aa + to = event.getFrom().clone(); + velocity = Vec3.ZERO; } - teleportTransition = new TeleportTransition(((org.bukkit.craftbukkit.CraftWorld) to.getWorld()).getHandle(), org.bukkit.craftbukkit.util.CraftLocation.toVec3(to), velocity, to.getYaw(), to.getPitch(), teleportTransition.missingRespawnBlock(), teleportTransition.asPassenger(), Set.of(), teleportTransition.postTeleportTransition(), teleportTransition.cause()); + transition = new TeleportTransition(((org.bukkit.craftbukkit.CraftWorld) to.getWorld()).getHandle(), org.bukkit.craftbukkit.util.CraftLocation.toVec3(to), velocity, to.getYaw(), to.getPitch(), transition.missingRespawnBlock(), transition.asPassenger(), Set.of(), transition.postTeleportTransition(), transition.cause()); } + // Leaves end - fix } diff --git a/leaves-server/minecraft-patches/features/0103-Fix-CraftPortalEvent-logic.patch b/leaves-server/minecraft-patches/features/0103-Fix-CraftPortalEvent-logic.patch new file mode 100644 index 000000000..2d0e80a8d --- /dev/null +++ b/leaves-server/minecraft-patches/features/0103-Fix-CraftPortalEvent-logic.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Thu, 2 Jan 2025 22:01:36 +0800 +Subject: [PATCH] Fix CraftPortalEvent logic + + +diff --git a/net/minecraft/world/level/block/EndPortalBlock.java b/net/minecraft/world/level/block/EndPortalBlock.java +index 6a656113e5206552dbca5de3fa24f788dddbb8e7..8d0e97647946509af5f536f7856b68a68fa6f9a4 100644 +--- a/net/minecraft/world/level/block/EndPortalBlock.java ++++ b/net/minecraft/world/level/block/EndPortalBlock.java +@@ -116,10 +116,10 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal { + } + + // CraftBukkit start +- relatives.removeAll(Relative.ROTATION); // remove relative rotation flags to simplify event mutation ++ // relatives.removeAll(Relative.ROTATION); // remove relative rotation flags to simplify event mutation // Leaves - no + float absoluteYaw = !fromEnd ? yRot : entity.getYRot() + yRot; + float absolutePitch = entity.getXRot() + xRot; +- org.bukkit.craftbukkit.event.PortalEventResult result = org.bukkit.craftbukkit.event.CraftEventFactory.handlePortalEvents(entity, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(spawnPos, newLevel, absoluteYaw, absolutePitch), org.bukkit.PortalType.ENDER, 0, 0); ++ org.bukkit.craftbukkit.event.PortalEventResult result = org.bukkit.craftbukkit.event.CraftEventFactory.handlePortalEvents(entity, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(spawnPos, newLevel.getWorld(), absoluteYaw, 0.0F), org.bukkit.PortalType.ENDER, 0, 0); + if (result == null) { + return null; + } diff --git a/leaves-server/minecraft-patches/features/0106-Xaero-Map-Protocol.patch b/leaves-server/minecraft-patches/features/0104-Xaero-Map-Protocol.patch similarity index 87% rename from leaves-server/minecraft-patches/features/0106-Xaero-Map-Protocol.patch rename to leaves-server/minecraft-patches/features/0104-Xaero-Map-Protocol.patch index 764fdf259..271ba24d7 100644 --- a/leaves-server/minecraft-patches/features/0106-Xaero-Map-Protocol.patch +++ b/leaves-server/minecraft-patches/features/0104-Xaero-Map-Protocol.patch @@ -5,16 +5,14 @@ Subject: [PATCH] Xaero Map Protocol diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 231387831280f24e9e50ee94aaacbd10d1532979..98a71ac21c8f658a751b8b1628aeaa540444c6da 100644 +index c31d51dcbd7b27083550f137127c468e924cf8b0..c63ad21c3b4d5e8a51472c3fdbda2d980ca3e425 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1209,6 +1209,9 @@ public abstract class PlayerList { +@@ -1212,6 +1212,7 @@ public abstract class PlayerList { //player.connection.send(new ClientboundSetChunkCacheRadiusPacket(io.papermc.paper.FeatureHooks.getViewDistance(level))); // Paper - rewrite chunk system //player.connection.send(new ClientboundSetSimulationDistancePacket(io.papermc.paper.FeatureHooks.getSimulationDistance(level))); // Paper - rewrite chunk system // Paper end - view distances -+ + org.leavesmc.leaves.protocol.XaeroMapProtocol.onSendWorldInfo(player); // Leaves - xaero map protocol -+ if (level.isRaining()) { // CraftBukkit start - handle player weather // player.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.START_RAINING, 0.0F)); diff --git a/leaves-server/minecraft-patches/features/0105-Fix-CraftPortalEvent-logic.patch b/leaves-server/minecraft-patches/features/0105-Fix-CraftPortalEvent-logic.patch deleted file mode 100644 index eeea83838..000000000 --- a/leaves-server/minecraft-patches/features/0105-Fix-CraftPortalEvent-logic.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Thu, 2 Jan 2025 22:01:36 +0800 -Subject: [PATCH] Fix CraftPortalEvent logic - - -diff --git a/net/minecraft/world/level/block/EndPortalBlock.java b/net/minecraft/world/level/block/EndPortalBlock.java -index 19590aa5af0eaf0f9bf76dc189ed67e67c692c77..a2b0f63c20a08e15b36fbcffd264e7004f4480c5 100644 ---- a/net/minecraft/world/level/block/EndPortalBlock.java -+++ b/net/minecraft/world/level/block/EndPortalBlock.java -@@ -110,10 +110,10 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal { - } - - // CraftBukkit start -- set.removeAll(Relative.ROTATION); // remove relative rotation flags to simplify event mutation -+ // set.removeAll(Relative.ROTATION); // remove relative rotation flags to simplify event mutation // Leaves - no - float absoluteYaw = !flag ? f : entity.getYRot() + f; - float absolutePitch = entity.getXRot() + f1; -- org.bukkit.craftbukkit.event.PortalEventResult result = org.bukkit.craftbukkit.event.CraftEventFactory.handlePortalEvents(entity, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(bottomCenter, level1, absoluteYaw, absolutePitch), org.bukkit.PortalType.ENDER, 0, 0); -+ org.bukkit.craftbukkit.event.PortalEventResult result = org.bukkit.craftbukkit.event.CraftEventFactory.handlePortalEvents(entity, org.bukkit.craftbukkit.util.CraftLocation.toBukkit(bottomCenter, level1.getWorld(), absoluteYaw, 0.0F), org.bukkit.PortalType.ENDER, 0, 0); - if (result == null) { - return null; - } diff --git a/leaves-server/minecraft-patches/features/0107-Skip-negligible-planar-movement-multiplication.patch b/leaves-server/minecraft-patches/features/0105-Skip-negligible-planar-movement-multiplication.patch similarity index 87% rename from leaves-server/minecraft-patches/features/0107-Skip-negligible-planar-movement-multiplication.patch rename to leaves-server/minecraft-patches/features/0105-Skip-negligible-planar-movement-multiplication.patch index 4030b5df3..f81d10f3a 100644 --- a/leaves-server/minecraft-patches/features/0107-Skip-negligible-planar-movement-multiplication.patch +++ b/leaves-server/minecraft-patches/features/0105-Skip-negligible-planar-movement-multiplication.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Skip negligible planar movement multiplication This patch is Powered by Gale(https://github.com/Dreeam-qwq/Gale) diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 4583083678004a9abe9fb5b6b1f4e7aa113e8d27..ff9e27a648e7fe8ff51fd1edc2e321b2213e4e6c 100644 +index 37c21521ba13682a11424d9d0db71854946b5a4f..9e62ae2f9d4f04f43cab0628817df260ab90db95 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -1261,8 +1261,17 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -1279,8 +1279,17 @@ public abstract class Entity } } @@ -26,6 +26,6 @@ index 4583083678004a9abe9fb5b6b1f4e7aa113e8d27..ff9e27a648e7fe8ff51fd1edc2e321b2 + } + } + // Leaves end - skip negligible planar movement multiplication - profilerFiller.pop(); + profiler.pop(); } } diff --git a/leaves-server/minecraft-patches/features/0108-Support-REI-protocol.patch b/leaves-server/minecraft-patches/features/0106-Support-REI-protocol.patch similarity index 73% rename from leaves-server/minecraft-patches/features/0108-Support-REI-protocol.patch rename to leaves-server/minecraft-patches/features/0106-Support-REI-protocol.patch index f00c95362..fffbfd6c8 100644 --- a/leaves-server/minecraft-patches/features/0108-Support-REI-protocol.patch +++ b/leaves-server/minecraft-patches/features/0106-Support-REI-protocol.patch @@ -5,16 +5,16 @@ Subject: [PATCH] Support REI protocol diff --git a/net/minecraft/world/item/crafting/SmithingTransformRecipe.java b/net/minecraft/world/item/crafting/SmithingTransformRecipe.java -index d02609198253b51f632db46c40afd737d686c520..7296e0b73f1c8e32374f39238d1dfac62bc41afb 100644 +index 33f9870a4f966a887023b1debd4ab9ef9d24378f..89983e7da244434a5346b23b49c748349cd79e34 100644 --- a/net/minecraft/world/item/crafting/SmithingTransformRecipe.java +++ b/net/minecraft/world/item/crafting/SmithingTransformRecipe.java -@@ -82,6 +82,12 @@ public class SmithingTransformRecipe implements SmithingRecipe { +@@ -115,6 +115,12 @@ public class SmithingTransformRecipe extends SimpleSmithingRecipe { ); } + // Leaves start - REI + public SlotDisplay getResult() { -+ return this.result.display(); ++ return new SlotDisplay.ItemStackSlotDisplay(this.result); + } + // Leaves end - REI + @@ -22,10 +22,10 @@ index d02609198253b51f632db46c40afd737d686c520..7296e0b73f1c8e32374f39238d1dfac6 @Override public org.bukkit.inventory.Recipe toBukkitRecipe(org.bukkit.NamespacedKey id) { diff --git a/net/minecraft/world/item/crafting/SmithingTrimRecipe.java b/net/minecraft/world/item/crafting/SmithingTrimRecipe.java -index 6582370cfa3d58a7ac08d574e26e7a93d243bdaa..07501a27e6032e578b823d9b617166a9e78fcb20 100644 +index 93347bd9fbab41888c5d63eb40e7928e74a1f9af..4f9e700ed621cdb556162174bbb9b219403fc05a 100644 --- a/net/minecraft/world/item/crafting/SmithingTrimRecipe.java +++ b/net/minecraft/world/item/crafting/SmithingTrimRecipe.java -@@ -84,6 +84,12 @@ public class SmithingTrimRecipe implements SmithingRecipe { +@@ -109,6 +109,12 @@ public class SmithingTrimRecipe extends SimpleSmithingRecipe { return Optional.of(this.addition); } @@ -37,4 +37,4 @@ index 6582370cfa3d58a7ac08d574e26e7a93d243bdaa..07501a27e6032e578b823d9b617166a9 + @Override public RecipeSerializer getSerializer() { - return RecipeSerializer.SMITHING_TRIM; + return SERIALIZER; diff --git a/leaves-server/minecraft-patches/features/0109-Vanilla-player-display-name.patch b/leaves-server/minecraft-patches/features/0107-Vanilla-player-display-name.patch similarity index 51% rename from leaves-server/minecraft-patches/features/0109-Vanilla-player-display-name.patch rename to leaves-server/minecraft-patches/features/0107-Vanilla-player-display-name.patch index f8213bf80..d0ad764fd 100644 --- a/leaves-server/minecraft-patches/features/0109-Vanilla-player-display-name.patch +++ b/leaves-server/minecraft-patches/features/0107-Vanilla-player-display-name.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Vanilla player display name diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 5b0b3735caa2ddbcb83d3adc29126205fa4bf131..49dbb6ca89c8a8b7f999ed98bda635d443cd8f85 100644 +index 9ad31f2a9f45451396ba1c6bb23646ab2fa8b766..3fbe335eb3dd0619a8bb102c711beeb8f7d669f0 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -481,7 +481,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -483,7 +483,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.object = null; // CraftBukkit start this.displayName = this.getScoreboardName(); @@ -18,38 +18,38 @@ index 5b0b3735caa2ddbcb83d3adc29126205fa4bf131..49dbb6ca89c8a8b7f999ed98bda635d4 this.maxHealthCache = this.getMaxHealth(); // CraftBukkit end diff --git a/net/minecraft/world/scores/Scoreboard.java b/net/minecraft/world/scores/Scoreboard.java -index 8ac6138dbf9299a0253599a57f85138fc7c80bd2..4b425d768b0d24a4ca95b901a9c706b507395bf7 100644 +index 5cd65073793152967484ba9b92326eb6ede69805..ba22490e62a93e9c64078a47092d55053d72c648 100644 --- a/net/minecraft/world/scores/Scoreboard.java +++ b/net/minecraft/world/scores/Scoreboard.java -@@ -277,6 +277,16 @@ public class Scoreboard { +@@ -275,6 +275,16 @@ public class Scoreboard { } - this.teamsByPlayer.put(playerName, team); + this.teamsByPlayer.put(player, team); + // Leaves start - vanilla display name + if (org.leavesmc.leaves.LeavesConfig.fix.vanillaDisplayName) { -+ boolean result = team.getPlayers().add(playerName); -+ net.minecraft.server.level.ServerPlayer player = net.minecraft.server.MinecraftServer.getServer().getPlayerList().getPlayerByName(playerName); -+ if (player != null) { -+ player.adventure$displayName = io.papermc.paper.adventure.PaperAdventure.asAdventure(player.getDisplayName()); ++ boolean result = team.getPlayers().add(player); ++ net.minecraft.server.level.ServerPlayer serverPlayer = net.minecraft.server.MinecraftServer.getServer().getPlayerList().getPlayerByName(player); ++ if (serverPlayer != null) { ++ serverPlayer.adventure$displayName = io.papermc.paper.adventure.PaperAdventure.asAdventure(serverPlayer.getDisplayName()); + } + return result; + } + // Leaves end - vanilla display name - return team.getPlayers().add(playerName); + return team.getPlayers().add(player); } -@@ -296,6 +306,14 @@ public class Scoreboard { - } else { - this.teamsByPlayer.remove(playerName); - team.getPlayers().remove(playerName); -+ // Leaves start - vanilla display name -+ if (org.leavesmc.leaves.LeavesConfig.fix.vanillaDisplayName) { -+ net.minecraft.server.level.ServerPlayer player = net.minecraft.server.MinecraftServer.getServer().getPlayerList().getPlayerByName(playerName); -+ if (player != null) { -+ player.adventure$displayName = io.papermc.paper.adventure.PaperAdventure.asAdventure(player.getDisplayName()); -+ } +@@ -295,6 +305,14 @@ public class Scoreboard { + + this.teamsByPlayer.remove(player); + team.getPlayers().remove(player); ++ // Leaves start - vanilla display name ++ if (org.leavesmc.leaves.LeavesConfig.fix.vanillaDisplayName) { ++ net.minecraft.server.level.ServerPlayer serverPlayer = net.minecraft.server.MinecraftServer.getServer().getPlayerList().getPlayerByName(player); ++ if (serverPlayer != null) { ++ serverPlayer.adventure$displayName = io.papermc.paper.adventure.PaperAdventure.asAdventure(serverPlayer.getDisplayName()); + } -+ // Leaves end - vanilla display name - } ++ } ++ // Leaves end - vanilla display name } + public Collection getTeamNames() { diff --git a/leaves-server/minecraft-patches/features/0110-Fix-SculkCatalyst-exp-skip.patch b/leaves-server/minecraft-patches/features/0108-Fix-SculkCatalyst-exp-skip.patch similarity index 53% rename from leaves-server/minecraft-patches/features/0110-Fix-SculkCatalyst-exp-skip.patch rename to leaves-server/minecraft-patches/features/0108-Fix-SculkCatalyst-exp-skip.patch index df3fc964b..28f88091a 100644 --- a/leaves-server/minecraft-patches/features/0110-Fix-SculkCatalyst-exp-skip.patch +++ b/leaves-server/minecraft-patches/features/0108-Fix-SculkCatalyst-exp-skip.patch @@ -5,28 +5,28 @@ Subject: [PATCH] Fix SculkCatalyst exp skip diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 49dbb6ca89c8a8b7f999ed98bda635d443cd8f85..270d567b2059466b6e54d63241d6d9f86f6da437 100644 +index 3fbe335eb3dd0619a8bb102c711beeb8f7d669f0..5805cf4d4bb9502c85205fc889409fdb84447c89 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1211,7 +1211,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1207,7 +1207,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } // SPIGOT-5478 must be called manually now -- if (event.shouldDropExperience()) this.dropExperience(this.level(), damageSource.getEntity()); // Paper - tie to event -+ if (shouldDropExperience(event.shouldDropExperience(), event.forceUseEventDropStatus())) this.dropExperience(this.level(), damageSource.getEntity()); // Paper - tie to event // Leaves - exp fix +- if (event.shouldDropExperience()) this.dropExperience(this.level(), source.getEntity()); // Paper - tie to event ++ if (shouldDropExperience(event.shouldDropExperience(), event.forceUseEventDropStatus())) this.dropExperience(this.level(), source.getEntity()); // Paper - tie to event // Leaves - exp fix // we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory. if (!event.getKeepInventory()) { // Paper start - PlayerDeathEvent#getItemsToKeep -@@ -1258,6 +1258,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1254,6 +1254,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.connection.markClientUnloadedAfterDeath(); } + // Leaves start - exp fix -+ private boolean shouldDropExperience(boolean eventResult, boolean forceUseEvent) { ++ private boolean shouldDropExperience(final boolean eventResult, final boolean forceUseEvent) { + if (forceUseEvent) { + return eventResult; + } -+ return wasExperienceConsumed() ? false : eventResult; ++ return !this.wasExperienceConsumed() && eventResult; + } + // Leaves end - exp fix + @@ -34,45 +34,56 @@ index 49dbb6ca89c8a8b7f999ed98bda635d443cd8f85..270d567b2059466b6e54d63241d6d9f8 AABB aabb = new AABB(this.blockPosition()).inflate(32.0, 10.0, 32.0); this.level() diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 7703fb2264ddf66f36b114af63ab6e2f1f5e75fa..493bbb6fb85d2b014a9f94a07409c7a73829d234 100644 +index a7e15fd19e8bca5bcf5947b36ee0547b5b0d8116..45f42b7b08d0ef7127ef94ed19b2535b7ee49e63 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -281,6 +281,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - private Waypoint.Icon locatorBarIcon = new Waypoint.Icon(); +@@ -282,6 +282,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + public @Nullable Entity currentExplosionCause; // CraftBukkit start public int expToDrop; + public int expToReward; // Leaves - exp fix public List drops = new java.util.ArrayList<>(); // Paper - Restore vanilla drops behavior public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; public boolean collides = true; -@@ -1883,6 +1884,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - entity.killedEntity((ServerLevel) this.level(), this, damageSource); +@@ -1878,6 +1879,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + sourceEntity.killedEntity((ServerLevel)this.level(), this, source); } this.gameEvent(GameEvent.ENTITY_DIE); -+ if (!this.wasExperienceConsumed()) this.dropExperience((ServerLevel) this.level(), damageSource.getEntity()); // Leaves - exp fix ++ if (!this.wasExperienceConsumed()) this.dropExperience((ServerLevel) this.level(), source.getEntity()); // Leaves - exp fix } else { this.dead = false; this.setHealth((float) deathEvent.getReviveHealth()); -@@ -1959,7 +1961,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1954,7 +1956,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.drops = new java.util.ArrayList<>(); // this.dropEquipment(level); // CraftBukkit - moved up // CraftBukkit end -- this.dropExperience(level, damageSource.getEntity()); -+ // this.dropExperience(level, damageSource.getEntity()); // Leaves - exp fix +- this.dropExperience(level, source.getEntity()); ++ // this.dropExperience(level, source.getEntity()); // Leaves - exp fix return deathEvent; // Paper } +@@ -1968,7 +1970,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + this.isAlwaysExperienceDropper() + || this.lastHurtByPlayerMemoryTime > 0 && this.shouldDropExperience() && level.getGameRules().get(GameRules.MOB_DROPS) + )) { +- return this.getExperienceReward(level, killer); // CraftBukkit ++ int reward = this.getExperienceReward(level, killer); // CraftBukkit ++ this.expToReward = reward; // Leaves - exp fix: cache for SculkCatalyst ++ return reward; + } + return 0; // CraftBukkit + } diff --git a/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java b/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java -index ab7be4298be22af32c4726f178b93896b96f599d..7bce957dca7ef797100b685f0e5a25820be0f4b4 100644 +index e75fb2e83c58de051672c8edaf89c7cb8a68cac8..ce82b0893708fbdad5143b47871f9c79ad5bdcf9 100644 --- a/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java +++ b/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java @@ -97,8 +97,7 @@ public class SculkCatalystBlockEntity extends BlockEntity implements GameEventLi - public boolean handleGameEvent(ServerLevel level, Holder gameEvent, GameEvent.Context context, Vec3 pos) { - if (gameEvent.is(GameEvent.ENTITY_DIE) && context.sourceEntity() instanceof LivingEntity livingEntity) { - if (!livingEntity.wasExperienceConsumed()) { -- DamageSource lastDamageSource = livingEntity.getLastDamageSource(); -- int experienceReward = livingEntity.getExperienceReward(level, Optionull.map(lastDamageSource, DamageSource::getEntity)); -+ int experienceReward = livingEntity.expToReward; // Leaves - exp fix - if (livingEntity.shouldDropExperience() && experienceReward > 0) { - this.sculkSpreader.addCursors(BlockPos.containing(pos.relative(Direction.UP, 0.5)), experienceReward); - this.tryAwardItSpreadsAdvancement(level, livingEntity); + public boolean handleGameEvent(final ServerLevel level, final Holder event, final GameEvent.Context context, final Vec3 sourcePosition) { + if (event.is(GameEvent.ENTITY_DIE) && context.sourceEntity() instanceof LivingEntity mob) { + if (!mob.wasExperienceConsumed()) { +- DamageSource lastDamageSource = mob.getLastDamageSource(); +- int experienceWouldDrop = mob.getExperienceReward(level, Optionull.map(lastDamageSource, DamageSource::getEntity)); ++ int experienceWouldDrop = mob.expToReward; // Leaves - exp fix + if (mob.shouldDropExperience() && experienceWouldDrop > 0) { + this.sculkSpreader.addCursors(BlockPos.containing(sourcePosition.relative(Direction.UP, 0.5)), experienceWouldDrop); + this.tryAwardItSpreadsAdvancement(level, mob); diff --git a/leaves-server/minecraft-patches/features/0111-Vanilla-creative-pickup-behavior.patch b/leaves-server/minecraft-patches/features/0109-Vanilla-creative-pickup-behavior.patch similarity index 91% rename from leaves-server/minecraft-patches/features/0111-Vanilla-creative-pickup-behavior.patch rename to leaves-server/minecraft-patches/features/0109-Vanilla-creative-pickup-behavior.patch index c27dbc378..6febd2f47 100644 --- a/leaves-server/minecraft-patches/features/0111-Vanilla-creative-pickup-behavior.patch +++ b/leaves-server/minecraft-patches/features/0109-Vanilla-creative-pickup-behavior.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Vanilla creative pickup behavior diff --git a/net/minecraft/world/entity/player/Inventory.java b/net/minecraft/world/entity/player/Inventory.java -index b849b04f227b43d036f4f6b3ae7accfafc389d9f..c001055c89cfd3705ce0fcbafd7461cf401f35b5 100644 +index fd38d7c34910ab9a60a9f54968901be3af2a9867..47e1a18cc7fee51971a113fa4d6f4f8f2e45d736 100644 --- a/net/minecraft/world/entity/player/Inventory.java +++ b/net/minecraft/world/entity/player/Inventory.java @@ -177,6 +177,13 @@ public class Inventory implements Container, Nameable { diff --git a/leaves-server/minecraft-patches/features/0112-Vanilla-portal-handle.patch b/leaves-server/minecraft-patches/features/0110-Vanilla-portal-handle.patch similarity index 81% rename from leaves-server/minecraft-patches/features/0112-Vanilla-portal-handle.patch rename to leaves-server/minecraft-patches/features/0110-Vanilla-portal-handle.patch index 0661288aa..1ff769e82 100644 --- a/leaves-server/minecraft-patches/features/0112-Vanilla-portal-handle.patch +++ b/leaves-server/minecraft-patches/features/0110-Vanilla-portal-handle.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Vanilla portal handle diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index ff9e27a648e7fe8ff51fd1edc2e321b2213e4e6c..21c605ec1fc93366bc4c2d82d5ef9137a07b1d3b 100644 +index 9e62ae2f9d4f04f43cab0628817df260ab90db95..31a8631ef794a4b99adcbe0004f33bcc98ee73de 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -846,6 +846,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -864,6 +864,7 @@ public abstract class Entity // CraftBukkit start public void postTick() { @@ -16,7 +16,7 @@ index ff9e27a648e7fe8ff51fd1edc2e321b2213e4e6c..21c605ec1fc93366bc4c2d82d5ef9137 // 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 if (!(this instanceof ServerPlayer) && this.isAlive()) { // Paper - don't attempt to teleport dead entities this.handlePortal(); -@@ -867,7 +868,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -885,7 +886,7 @@ public abstract class Entity this.boardingCooldown--; } @@ -26,10 +26,10 @@ index ff9e27a648e7fe8ff51fd1edc2e321b2213e4e6c..21c605ec1fc93366bc4c2d82d5ef9137 this.spawnSprintParticle(); } diff --git a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java -index 1123ec0038552e0b40774f4a433ff325695ea071..fdff726c89e25164437ec8ef370349df2e44c804 100644 +index 1c043c1136fc42e888125047ed73b1dc32276183..28ee5a62cfd584707c879e74ff87792db208eca9 100644 --- a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java +++ b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java -@@ -296,7 +296,7 @@ public abstract class AbstractMinecart extends VehicleEntity { +@@ -307,7 +307,7 @@ public abstract class AbstractMinecart extends VehicleEntity { this.checkBelowWorld(); this.computeSpeed(); diff --git a/leaves-server/minecraft-patches/features/0113-Fix-chunk-reload-detector.patch b/leaves-server/minecraft-patches/features/0111-Fix-chunk-reload-detector.patch similarity index 76% rename from leaves-server/minecraft-patches/features/0113-Fix-chunk-reload-detector.patch rename to leaves-server/minecraft-patches/features/0111-Fix-chunk-reload-detector.patch index 9347902db..4a12ff3c3 100644 --- a/leaves-server/minecraft-patches/features/0113-Fix-chunk-reload-detector.patch +++ b/leaves-server/minecraft-patches/features/0111-Fix-chunk-reload-detector.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Fix chunk reload detector diff --git a/net/minecraft/server/level/ServerEntity.java b/net/minecraft/server/level/ServerEntity.java -index 8f6b7ec2f2294ac5845b8f6fb94959e9a11d6329..451b9dcff9c37572df4e7c3aad1fd1afe314c932 100644 +index 3e0c75b8006ee939115556ed09554ae5a007a272..558399993913184148e924de0892cc3fd5c71ed2 100644 --- a/net/minecraft/server/level/ServerEntity.java +++ b/net/minecraft/server/level/ServerEntity.java @@ -372,7 +372,7 @@ public class ServerEntity { - if (!list.isEmpty()) { - consumer.accept(new ClientboundSetEquipmentPacket(this.entity.getId(), list, true)); // Paper - data sanitization + if (!slots.isEmpty()) { + broadcast.accept(new ClientboundSetEquipmentPacket(this.entity.getId(), slots, true)); // Paper - data sanitization } - ((LivingEntity) this.entity).detectEquipmentUpdates(); // CraftBukkit - SPIGOT-3789: sync again immediately after sending + if (this.entity.totalEntityAge == 0) ((LivingEntity) this.entity).detectEquipmentUpdates(); // CraftBukkit - SPIGOT-3789: sync again immediately after sending // Leaves - fix chunk reload detector (#492) diff --git a/leaves-server/minecraft-patches/features/0112-Do-not-reset-placed-block-on-exception.patch b/leaves-server/minecraft-patches/features/0112-Do-not-reset-placed-block-on-exception.patch new file mode 100644 index 000000000..3c21f82e1 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0112-Do-not-reset-placed-block-on-exception.patch @@ -0,0 +1,43 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MC_XiaoHei +Date: Sat, 17 May 2025 11:38:56 +0000 +Subject: [PATCH] Do not reset placed block on exception + + +diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java +index ea701aa6af6da7400c0ca08ad88376f26a620665..de73e9e278f626c7c7cc5eb52e4c3e2570f6c231 100644 +--- a/net/minecraft/world/item/BlockItem.java ++++ b/net/minecraft/world/item/BlockItem.java +@@ -90,20 +90,22 @@ public class BlockItem extends Item { + BlockState placedState = level.getBlockState(pos); + if (placedState.is(placementState.getBlock())) { + placedState = this.updateBlockStateFromTag(pos, level, itemStack, placedState); ++ // Leaves start - we do not need this + // Paper start - Reset placed block on exception +- try { ++ // try { + this.updateCustomBlockEntityTag(pos, level, player, itemStack, placedState); + updateBlockEntityComponents(level, pos, itemStack); +- } catch (Exception ex) { +- ((org.bukkit.craftbukkit.block.CraftBlockState) previousState).revertPlace(); +- if (player instanceof ServerPlayer serverPlayer) { +- net.minecraft.server.MinecraftServer.LOGGER.warn("Player {} tried placing invalid block", player.getScoreboardName(), ex); +- serverPlayer.connection.disconnect(net.minecraft.network.chat.Component.literal("Packet processing error")); +- return InteractionResult.FAIL; +- } +- throw ex; // Rethrow exception if not placed by a player +- } ++ // } catch (Exception ex) { ++ // ((org.bukkit.craftbukkit.block.CraftBlockState) previousState).revertPlace(); ++ // if (player instanceof ServerPlayer serverPlayer) { ++ // net.minecraft.server.MinecraftServer.LOGGER.warn("Player {} tried placing invalid block", player.getScoreboardName(), ex); ++ // serverPlayer.connection.disconnect(net.minecraft.network.chat.Component.literal("Packet processing error")); ++ // return InteractionResult.FAIL; ++ // } ++ // throw ex; // Rethrow exception if not placed by a player ++ // } + // Paper end - Reset placed block on exception ++ // Leaves end - we dot not need this + placedState.getBlock().setPlacedBy(level, pos, placedState, player, itemStack); + // CraftBukkit start - special case for handling block placement with water lilies, frog spawn and snow buckets + if (player != null && (this instanceof PlaceOnWaterBlockItem || this instanceof SolidBucketItem)) { diff --git a/leaves-server/minecraft-patches/features/0113-Do-not-prevent-block-entity-and-entity-crash-at-Leve.patch b/leaves-server/minecraft-patches/features/0113-Do-not-prevent-block-entity-and-entity-crash-at-Leve.patch new file mode 100644 index 000000000..027a598ff --- /dev/null +++ b/leaves-server/minecraft-patches/features/0113-Do-not-prevent-block-entity-and-entity-crash-at-Leve.patch @@ -0,0 +1,29 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MC_XiaoHei +Date: Sun, 18 May 2025 03:21:56 +0000 +Subject: [PATCH] Do not prevent block entity and entity crash at LevelChunk + + +diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java +index 6bd86a6266623092dd9abf610ef2bc52e5b9d0b7..2d14dbbbcfc54cba6034e0a4f28d116b918f7f2f 100644 +--- a/net/minecraft/world/level/chunk/LevelChunk.java ++++ b/net/minecraft/world/level/chunk/LevelChunk.java +@@ -982,12 +982,14 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + + profiler.pop(); + } catch (Throwable t) { ++ // Leaves start - do not prevent here + // Paper start - Prevent block entity and entity crashes +- final String msg = String.format("BlockEntity threw exception at %s:%s,%s,%s", io.papermc.paper.util.MCUtil.getLevelName(LevelChunk.this.getLevel()), this.getPos().getX(), this.getPos().getY(), this.getPos().getZ()); +- LevelChunk.LOGGER.error(msg, t); +- LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, t))); // Paper - ServerExceptionEvent +- LevelChunk.this.removeBlockEntity(this.getPos()); ++ // final String msg = String.format("BlockEntity threw exception at %s:%s,%s,%s", io.papermc.paper.util.MCUtil.getLevelName(LevelChunk.this.getLevel()), this.getPos().getX(), this.getPos().getY(), this.getPos().getZ()); ++ // LevelChunk.LOGGER.error(msg, t); ++ // LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, t))); // Paper - ServerExceptionEvent ++ // LevelChunk.this.removeBlockEntity(this.getPos()); + // Paper end - Prevent block entity and entity crashes ++ // Leaves end - do not prevent here + } + } + } diff --git a/leaves-server/minecraft-patches/features/0114-Do-not-reset-placed-block-on-exception.patch b/leaves-server/minecraft-patches/features/0114-Do-not-reset-placed-block-on-exception.patch deleted file mode 100644 index 198a0ff42..000000000 --- a/leaves-server/minecraft-patches/features/0114-Do-not-reset-placed-block-on-exception.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MC_XiaoHei -Date: Sat, 17 May 2025 11:38:56 +0000 -Subject: [PATCH] Do not reset placed block on exception - - -diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java -index 85416c58bd447a7129f2b021f93690e3fdda62c8..439e29d2b9399311d9b1ca3dc6153504bccb906b 100644 ---- a/net/minecraft/world/item/BlockItem.java -+++ b/net/minecraft/world/item/BlockItem.java -@@ -92,20 +92,22 @@ public class BlockItem extends Item { - BlockState blockState = level.getBlockState(clickedPos); - if (blockState.is(placementState.getBlock())) { - blockState = this.updateBlockStateFromTag(clickedPos, level, itemInHand, blockState); -+ // Leaves start - we do not need this - // Paper start - Reset placed block on exception -- try { -+ // try { - this.updateCustomBlockEntityTag(clickedPos, level, player, itemInHand, blockState); - updateBlockEntityComponents(level, clickedPos, itemInHand); -- } catch (Exception ex) { -- ((org.bukkit.craftbukkit.block.CraftBlockState) oldBukkitState).revertPlace(); -- if (player instanceof ServerPlayer serverPlayer) { -- org.apache.logging.log4j.LogManager.getLogger().error("Player {} tried placing invalid block", player.getScoreboardName(), ex); -- serverPlayer.getBukkitEntity().kickPlayer("Packet processing error"); -- return InteractionResult.FAIL; -- } -- throw ex; // Rethrow exception if not placed by a player -- } -+ // } catch (Exception ex) { -+ // ((org.bukkit.craftbukkit.block.CraftBlockState) oldBukkitState).revertPlace(); -+ // if (player instanceof ServerPlayer serverPlayer) { -+ // org.apache.logging.log4j.LogManager.getLogger().error("Player {} tried placing invalid block", player.getScoreboardName(), ex); -+ // serverPlayer.getBukkitEntity().kickPlayer("Packet processing error"); -+ // return InteractionResult.FAIL; -+ // } -+ // throw ex; // Rethrow exception if not placed by a player -+ // } - // Paper end - Reset placed block on exception -+ // Leaves end - we dot not need this - blockState.getBlock().setPlacedBy(level, clickedPos, blockState, player, itemInHand); - // CraftBukkit start - if (bukkitState != null) { diff --git a/leaves-server/minecraft-patches/features/0114-Tripwire-behavior-modifier.patch b/leaves-server/minecraft-patches/features/0114-Tripwire-behavior-modifier.patch new file mode 100644 index 000000000..6b4ca9ffc --- /dev/null +++ b/leaves-server/minecraft-patches/features/0114-Tripwire-behavior-modifier.patch @@ -0,0 +1,89 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Helvetica Volubi +Date: Sat, 17 May 2025 21:03:00 +0800 +Subject: [PATCH] Tripwire behavior modifier + + +diff --git a/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java b/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java +index 68eb73d004dfe85bccc96af269832b0086d01720..9bf71bfe442182993cfb71fdb7eb283f6efad620 100644 +--- a/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java ++++ b/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java +@@ -28,6 +28,11 @@ public class EndPlatformFeature extends Feature { + // CraftBukkit end + BlockPos.MutableBlockPos pos = origin.mutable(); + ++ // Leaves start - tripwire behavior modifier ++ java.util.List skipDrop = new java.util.ArrayList<>(); ++ java.util.List disarmedTripwires = new java.util.ArrayList<>(); ++ boolean is121 = org.leavesmc.leaves.LeavesConfig.modify.oldMC.tripwire.tripwireBehavior == org.leavesmc.leaves.LeavesConfig.ModifyConfig.MinecraftOLDConfig.TripwireConfig.TripwireBehavior.VANILLA_21; ++ // Leaves end - tripwire behavior modifier + for (int dz = -2; dz <= 2; dz++) { + for (int dx = -2; dx <= 2; dx++) { + for (int dy = -1; dy < 3; dy++) { +@@ -35,7 +40,32 @@ public class EndPlatformFeature extends Feature { + Block block = dy == -1 ? Blocks.OBSIDIAN : Blocks.AIR; + if (!blockList.getBlockState(blockPos).is(block)) { // CraftBukkit + if (dropResources) { +- blockList.destroyBlock(blockPos, true, null); // CraftBukkit ++ // Leaves start - tripwire behavior modifier ++ boolean skip = false; ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.tripwire.stringTripwireHookDuplicate) { ++ switch (org.leavesmc.leaves.LeavesConfig.modify.oldMC.tripwire.tripwireBehavior) { ++ case VANILLA_20 -> skip = true; ++ case MIXED -> { ++ net.minecraft.world.level.block.state.BlockState bs = newLevel.getBlockState(blockPos); ++ if (bs.is(Blocks.TRIPWIRE)) { ++ if (bs.getValue(net.minecraft.world.level.block.TripWireBlock.DISARMED)) { ++ skip = true; ++ disarmedTripwires.add(blockPos.immutable()); ++ } ++ if (!skip) { ++ skip = checkString(disarmedTripwires, blockPos); ++ } ++ } ++ } ++ default -> {} ++ } ++ } ++ if (skip) { ++ skipDrop.add(blockPos.immutable()); ++ } else { ++ blockList.destroyBlock(blockPos, true, null); // CraftBukkit ++ } ++ // Leaves end - tripwire behavior modifier + } + + blockList.setBlock(blockPos, block.defaultBlockState(), Block.UPDATE_ALL); // CraftBukkit +@@ -53,11 +83,30 @@ public class EndPlatformFeature extends Feature { + if (portalEvent.isCancelled()) return; + } + +- if (dropResources) { +- blockList.placeBlocks(state -> newLevel.destroyBlock(state.getPosition(), true, null)); ++ // Leaves start - tripwire behavior modifier ++ if (is121 || !org.leavesmc.leaves.LeavesConfig.modify.oldMC.tripwire.stringTripwireHookDuplicate) { ++ if (dropResources) { ++ blockList.placeBlocks(state -> newLevel.destroyBlock(state.getPosition(), !skipDrop.contains(state.getPosition()), null)); ++ } else { ++ blockList.placeBlocks(); ++ } + } else { ++ if (dropResources) { ++ blockList.getSnapshotBlocks().forEach(state -> newLevel.destroyBlock(state.getPosition(), !skipDrop.contains(state.getPosition()), null)); ++ } + blockList.placeBlocks(); + } ++ // Leaves end - tripwire behavior modifier + // CraftBukkit end + } ++ ++ // Leaves start - tripwire behavior modifier ++ private static boolean checkString(final java.util.List list, final BlockPos blockPos) { ++ for (BlockPos other : list) { ++ if (other.getY() != blockPos.getY()) continue; ++ if (other.getX() == blockPos.getX() || other.getZ() == blockPos.getZ()) return true; ++ } ++ return false; ++ } ++ // Leaves end - tripwire behavior modifier + } diff --git a/leaves-server/minecraft-patches/features/0115-Do-not-prevent-block-entity-and-entity-crash-at-Leve.patch b/leaves-server/minecraft-patches/features/0115-Do-not-prevent-block-entity-and-entity-crash-at-Leve.patch deleted file mode 100644 index 92ef9e035..000000000 --- a/leaves-server/minecraft-patches/features/0115-Do-not-prevent-block-entity-and-entity-crash-at-Leve.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MC_XiaoHei -Date: Sun, 18 May 2025 03:21:56 +0000 -Subject: [PATCH] Do not prevent block entity and entity crash at LevelChunk - - -diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 3c5640ed649ba89066da70e64fe6291165948a5d..d5a0a2c0a5673088e4ad1e2e7f4fac8a65f68ceb 100644 ---- a/net/minecraft/world/level/chunk/LevelChunk.java -+++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -982,12 +982,14 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - - profilerFiller.pop(); - } catch (Throwable var5) { -+ // Leaves start - do not prevent here - // Paper start - Prevent block entity and entity crashes -- final String msg = String.format("BlockEntity threw exception at %s:%s,%s,%s", LevelChunk.this.getLevel().getWorld().getName(), this.getPos().getX(), this.getPos().getY(), this.getPos().getZ()); -- net.minecraft.server.MinecraftServer.LOGGER.error(msg, var5); -- net.minecraft.world.level.chunk.LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, var5))); // Paper - ServerExceptionEvent -- LevelChunk.this.removeBlockEntity(this.getPos()); -+ // final String msg = String.format("BlockEntity threw exception at %s:%s,%s,%s", LevelChunk.this.getLevel().getWorld().getName(), this.getPos().getX(), this.getPos().getY(), this.getPos().getZ()); -+ // net.minecraft.server.MinecraftServer.LOGGER.error(msg, var5); -+ // net.minecraft.world.level.chunk.LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, var5))); // Paper - ServerExceptionEvent -+ // LevelChunk.this.removeBlockEntity(this.getPos()); - // Paper end - Prevent block entity and entity crashes -+ // Leaves end - do not prevent here - } - } - } diff --git a/leaves-server/minecraft-patches/features/0117-Spawn-invulnerable-time.patch b/leaves-server/minecraft-patches/features/0115-Spawn-invulnerable-time.patch similarity index 56% rename from leaves-server/minecraft-patches/features/0117-Spawn-invulnerable-time.patch rename to leaves-server/minecraft-patches/features/0115-Spawn-invulnerable-time.patch index 67947585b..4fb7204c6 100644 --- a/leaves-server/minecraft-patches/features/0117-Spawn-invulnerable-time.patch +++ b/leaves-server/minecraft-patches/features/0115-Spawn-invulnerable-time.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Spawn invulnerable time diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 270d567b2059466b6e54d63241d6d9f86f6da437..3623f1e71633f5823efec4f56285d1d7efe8087a 100644 +index 5805cf4d4bb9502c85205fc889409fdb84447c89..0352eeeaf49796438cc656bf0cbdfaf4a7b7cf21 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -240,6 +240,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -241,6 +241,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc private int lastSentFood = -99999999; private boolean lastFoodSaturationZero = true; public int lastSentExp = -99999999; @@ -16,7 +16,7 @@ index 270d567b2059466b6e54d63241d6d9f86f6da437..3623f1e71633f5823efec4f56285d1d7 private ChatVisiblity chatVisibility = ChatVisiblity.FULL; public ParticleStatus particleStatus = ParticleStatus.ALL; private boolean canChatColor = true; -@@ -727,6 +728,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -731,6 +732,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.resetOperationCountPerTick(); // Leaves - player operation limiter this.gameMode.tick(); this.wardenSpawnTracker.tick(); @@ -24,17 +24,18 @@ index 270d567b2059466b6e54d63241d6d9f86f6da437..3623f1e71633f5823efec4f56285d1d7 if (this.invulnerableTime > 0) { this.invulnerableTime--; } -@@ -1310,6 +1312,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - if (this.isInvulnerableTo(level, damageSource)) { +@@ -1308,6 +1310,14 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc return false; - } else { -+ // Leaves start - spawn invulnerable time -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.spawnInvulnerableTime) { -+ if (this.spawnInvulnerableTime > 0 && !damageSource.is(net.minecraft.tags.DamageTypeTags.BYPASSES_INVULNERABILITY)) { -+ return false; -+ } + } + ++ // Leaves start - spawn invulnerable time ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.spawnInvulnerableTime) { ++ if (this.spawnInvulnerableTime > 0 && !source.is(net.minecraft.tags.DamageTypeTags.BYPASSES_INVULNERABILITY)) { ++ return false; + } -+ // Leaves end - spawn invulnerable time - Entity entity = damageSource.getEntity(); - if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false. - !(entity instanceof Player player && !this.canHarmPlayer(player)) ++ } ++ // Leaves end - spawn invulnerable time ++ + Entity entity = source.getEntity(); + if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false. + !(entity instanceof Player player && !this.canHarmPlayer(player)) diff --git a/leaves-server/minecraft-patches/features/0118-Old-zombie-reinforcement.patch b/leaves-server/minecraft-patches/features/0116-Old-zombie-reinforcement.patch similarity index 54% rename from leaves-server/minecraft-patches/features/0118-Old-zombie-reinforcement.patch rename to leaves-server/minecraft-patches/features/0116-Old-zombie-reinforcement.patch index e195b22d2..fdc08c85e 100644 --- a/leaves-server/minecraft-patches/features/0118-Old-zombie-reinforcement.patch +++ b/leaves-server/minecraft-patches/features/0116-Old-zombie-reinforcement.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Old zombie reinforcement diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java -index d9935d71393b28ee8052b1c05739bfd44d6afb47..19f892c01409af4d02a7771aca0ad098588ffd71 100644 +index a245070c5460eb34de2d92495c04eea6f2c1a4db..82a01cf20308dc98915a7870495877cc43afed96 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -314,7 +314,7 @@ public class Zombie extends Monster { - int floor = Mth.floor(this.getX()); - int floor1 = Mth.floor(this.getY()); - int floor2 = Mth.floor(this.getZ()); -- EntityType type = this.getType(); +@@ -331,7 +331,7 @@ public class Zombie extends Monster { + int x = Mth.floor(this.getX()); + int y = Mth.floor(this.getY()); + int z = Mth.floor(this.getZ()); +- EntityType type = this.getType(); + EntityType type = org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldZombieReinforcement ? EntityType.ZOMBIE : this.getType(); // Leaves end - old zombie reinforcement - Zombie zombie = type.create(level, EntitySpawnReason.REINFORCEMENT); - if (zombie == null) { - return true; + Zombie reinforcement = type.create(level, EntitySpawnReason.REINFORCEMENT); + if (reinforcement == null) { + return true; diff --git a/leaves-server/minecraft-patches/features/0116-Tripwire-behavior-modifier.patch b/leaves-server/minecraft-patches/features/0116-Tripwire-behavior-modifier.patch deleted file mode 100644 index 628a4e158..000000000 --- a/leaves-server/minecraft-patches/features/0116-Tripwire-behavior-modifier.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Helvetica Volubi -Date: Sat, 17 May 2025 21:03:00 +0800 -Subject: [PATCH] Tripwire behavior modifier - - -diff --git a/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java b/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java -index 20a7264c3f476f0100a7f3a78589f99b4ea59921..dbf34676e792c51e1147e952468030e92da7d5f9 100644 ---- a/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java -+++ b/net/minecraft/world/level/levelgen/feature/EndPlatformFeature.java -@@ -28,14 +28,40 @@ public class EndPlatformFeature extends Feature { - // CraftBukkit end - BlockPos.MutableBlockPos mutableBlockPos = pos.mutable(); - -+ // Leaves start - tripwire behavior modifier -+ java.util.List blockList1 = new java.util.ArrayList<>(); -+ java.util.List blockList2 = new java.util.ArrayList<>(); -+ boolean flag21 = org.leavesmc.leaves.LeavesConfig.modify.oldMC.tripwire.tripwireBehavior == org.leavesmc.leaves.LeavesConfig.ModifyConfig.MinecraftOLDConfig.TripwireConfig.TripwireBehavior.VANILLA_21; - for (int i = -2; i <= 2; i++) { - for (int i1 = -2; i1 <= 2; i1++) { - for (int i2 = -1; i2 < 3; i2++) { - BlockPos blockPos = mutableBlockPos.set(pos).move(i1, i2, i); - Block block = i2 == -1 ? Blocks.OBSIDIAN : Blocks.AIR; -- if (!blockList.getBlockState(blockPos).is(block)) { // CraftBukkit -+ if (!blockList.getBlockState(blockPos).is(block)) { - if (dropBlocks) { -- blockList.destroyBlock(blockPos, true, null); // CraftBukkit -+ boolean flag = false; -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.tripwire.stringTripwireHookDuplicate) { -+ switch (org.leavesmc.leaves.LeavesConfig.modify.oldMC.tripwire.tripwireBehavior) { -+ case org.leavesmc.leaves.LeavesConfig.ModifyConfig.MinecraftOLDConfig.TripwireConfig.TripwireBehavior.VANILLA_20 -> { -+ flag = true; -+ } -+ case org.leavesmc.leaves.LeavesConfig.ModifyConfig.MinecraftOLDConfig.TripwireConfig.TripwireBehavior.MIXED -> { -+ net.minecraft.world.level.block.state.BlockState state = level.getBlockState(blockPos); -+ if (state.is(Blocks.TRIPWIRE)) { -+ if (state.getValue(net.minecraft.world.level.block.TripWireBlock.DISARMED)) { -+ flag = true; -+ blockList2.add(blockPos.immutable()); -+ } -+ if (!flag) { -+ flag = checkString(blockList2, blockPos); -+ } -+ } -+ } -+ default -> {} // Leaves - 1.21 & default Logic - default empty -+ } -+ } -+ if (flag) blockList1.add(blockPos.immutable()); -+ else blockList.destroyBlock(blockPos, true, null); - } - - blockList.setBlock(blockPos, block.defaultBlockState(), Block.UPDATE_ALL); // CraftBukkit -@@ -53,11 +79,29 @@ public class EndPlatformFeature extends Feature { - if (portalEvent.isCancelled()) return; - } - -- if (dropBlocks) { -- blockList.placeBlocks(state -> level.destroyBlock(state.getPosition(), true, null)); -+ if (flag21 || !org.leavesmc.leaves.LeavesConfig.modify.oldMC.tripwire.stringTripwireHookDuplicate) { -+ if (dropBlocks) { -+ blockList.placeBlocks(state -> level.destroyBlock(state.getPosition(), !blockList1.contains(state.getPosition()), null)); -+ } else { -+ blockList.placeBlocks(); -+ } - } else { -+ if (dropBlocks) { -+ blockList.getSnapshotBlocks().forEach((state) -> { -+ level.destroyBlock(state.getPosition(), !blockList1.contains(state.getPosition()), null); -+ }); -+ } - blockList.placeBlocks(); - } - // CraftBukkit end - } -+ -+ private static boolean checkString(java.util.List blockList, BlockPos blockPos) { -+ for (BlockPos pos : blockList) { -+ if (pos.getY() != blockPos.getY()) continue; -+ if (pos.getX() == blockPos.getX() || pos.getZ() == blockPos.getZ()) return true; -+ } -+ return false; -+ } -+ // Leaves end - tripwire behavior modifier - } diff --git a/leaves-server/minecraft-patches/features/0117-Sound-update-suppression.patch b/leaves-server/minecraft-patches/features/0117-Sound-update-suppression.patch new file mode 100644 index 000000000..fae033079 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0117-Sound-update-suppression.patch @@ -0,0 +1,119 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MC_XiaoHei +Date: Tue, 20 May 2025 12:08:40 +0000 +Subject: [PATCH] Sound update suppression + + +diff --git a/net/minecraft/world/entity/animal/equine/AbstractHorse.java b/net/minecraft/world/entity/animal/equine/AbstractHorse.java +index 52fc3d9600a7bd256647fbbfc1e460ca2b10a424..eb11277ae0c6e2613452887a27f1d89d7b7e49c8 100644 +--- a/net/minecraft/world/entity/animal/equine/AbstractHorse.java ++++ b/net/minecraft/world/entity/animal/equine/AbstractHorse.java +@@ -300,7 +300,17 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump + + public void createInventory() { + SimpleContainer old = this.inventory; +- this.inventory = new SimpleContainer(this.getInventorySize(), (org.bukkit.entity.AbstractHorse) this.getBukkitEntity()); // CraftBukkit ++ // Leaves start - pca ++ this.inventory = new SimpleContainer(this.getInventorySize(), (org.bukkit.entity.AbstractHorse) this.getBukkitEntity()) { // CraftBukkit ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncEntityToClient(AbstractHorse.this); ++ } ++ } ++ }; ++ // Leaves end - pca + if (old != null) { + int max = Math.min(old.getContainerSize(), this.inventory.getContainerSize()); + +diff --git a/net/minecraft/world/entity/npc/villager/AbstractVillager.java b/net/minecraft/world/entity/npc/villager/AbstractVillager.java +index d68cc8ae9e2b5e2350fa226bcf8ed519579ce0c1..0754c74d99e472747e98ca111cce7958b4f289a9 100644 +--- a/net/minecraft/world/entity/npc/villager/AbstractVillager.java ++++ b/net/minecraft/world/entity/npc/villager/AbstractVillager.java +@@ -56,7 +56,17 @@ public abstract class AbstractVillager extends AgeableMob implements Npc, Mercha + private static final EntityDataAccessor DATA_UNHAPPY_COUNTER = SynchedEntityData.defineId(AbstractVillager.class, EntityDataSerializers.INT); + private @Nullable Player tradingPlayer; + protected @Nullable MerchantOffers offers; +- private final SimpleContainer inventory = new SimpleContainer(8, (org.bukkit.craftbukkit.entity.CraftAbstractVillager) this.getBukkitEntity()); // CraftBukkit - add argument ++ // Leaves start - pca ++ private final SimpleContainer inventory = new SimpleContainer(8, (org.bukkit.craftbukkit.entity.CraftAbstractVillager) this.getBukkitEntity()) { // CraftBukkit - add argument ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (!AbstractVillager.this.level().isClientSide() && org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncEntityToClient(AbstractVillager.this); ++ } ++ } ++ }; ++ // Leaves end - pca + protected boolean voidTrade = false; // Leaves - force void trade + + public AbstractVillager(final EntityType type, final Level level) { +diff --git a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java +index 91d699adfbfa211db85734a6406d690aed5f0324..918b20be69b9961b3d9c0f1d4f8d0866e33a2745 100644 +--- a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java ++++ b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java +@@ -66,6 +66,11 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme + + @Override + public void setChanged() { ++ // Leaves start - pca ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncEntityToClient(this); ++ } ++ // Leaves end - pca + } + + @Override +diff --git a/net/minecraft/world/level/block/SculkSensorBlock.java b/net/minecraft/world/level/block/SculkSensorBlock.java +index 94ec05d2c6338464f4912cc1c919165c080f8cde..5f24f6e850fb5701cb4e108af3a707a973fcd271 100644 +--- a/net/minecraft/world/level/block/SculkSensorBlock.java ++++ b/net/minecraft/world/level/block/SculkSensorBlock.java +@@ -97,7 +97,7 @@ public class SculkSensorBlock extends BaseEntityBlock implements SimpleWaterlogg + @Override + public void stepOn(final Level level, final BlockPos pos, final BlockState onState, final Entity entity) { + if (!level.isClientSide() +- && canActivate(onState) ++ && canActivate(onState, pos) // Leaves - Sound update suppression + && !entity.is(EntityType.WARDEN) + && level.getBlockEntity(pos) instanceof SculkSensorBlockEntity sculkSensor + && level instanceof ServerLevel serverLevel +@@ -212,6 +212,15 @@ public class SculkSensorBlock extends BaseEntityBlock implements SimpleWaterlogg + return state.getValue(PHASE); + } + ++ // Leaves start - Sound update suppression ++ public static boolean canActivate(BlockState state, BlockPos pos) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.soundUpdateSuppression && !(state.getBlock() instanceof SculkSensorBlock)) { ++ throw new org.leavesmc.leaves.util.UpdateSuppressionException(pos, null, state.getBlock(), null, new IllegalArgumentException()); ++ } ++ return canActivate(state); ++ } ++ // Leaves end - Sound update suppression ++ + public static boolean canActivate(final BlockState state) { + return state.getBlock() instanceof SculkSensorBlock && getPhase(state) == SculkSensorPhase.INACTIVE; // Paper - Check for a valid type + } +diff --git a/net/minecraft/world/level/block/entity/SculkSensorBlockEntity.java b/net/minecraft/world/level/block/entity/SculkSensorBlockEntity.java +index a1adc346a229eb05e45843a6315622b24f11dda9..d1f677fd087aa7e88e55699e3431004782f55b37 100644 +--- a/net/minecraft/world/level/block/entity/SculkSensorBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/SculkSensorBlockEntity.java +@@ -115,7 +115,7 @@ public class SculkSensorBlockEntity extends BlockEntity implements GameEventList + ) { + return (!pos.equals(this.blockPos) || !event.is(GameEvent.BLOCK_DESTROY) && !event.is(GameEvent.BLOCK_PLACE)) + && VibrationSystem.getGameEventFrequency(event) != 0 +- && SculkSensorBlock.canActivate(SculkSensorBlockEntity.this.getBlockState()); ++ && SculkSensorBlock.canActivate(SculkSensorBlockEntity.this.getBlockState(), pos); // Leaves - Sound update suppression + } + + @Override +@@ -128,7 +128,7 @@ public class SculkSensorBlockEntity extends BlockEntity implements GameEventList + final float receivingDistance + ) { + BlockState state = SculkSensorBlockEntity.this.getBlockState(); +- if (SculkSensorBlock.canActivate(state)) { ++ if (SculkSensorBlock.canActivate(state, pos)) { // Leaves - Sound update suppression + int eventFrequency = VibrationSystem.getGameEventFrequency(event); + SculkSensorBlockEntity.this.setLastVibrationFrequency(eventFrequency); + int calculatedPower = VibrationSystem.getRedstoneStrengthForDistance(receivingDistance, this.getListenerRadius()); diff --git a/leaves-server/minecraft-patches/features/0120-Old-zombie-piglin-drop-behavior.patch b/leaves-server/minecraft-patches/features/0118-Old-zombie-piglin-drop-behavior.patch similarity index 83% rename from leaves-server/minecraft-patches/features/0120-Old-zombie-piglin-drop-behavior.patch rename to leaves-server/minecraft-patches/features/0118-Old-zombie-piglin-drop-behavior.patch index 4c5f98c08..7f4574f9a 100644 --- a/leaves-server/minecraft-patches/features/0120-Old-zombie-piglin-drop-behavior.patch +++ b/leaves-server/minecraft-patches/features/0118-Old-zombie-piglin-drop-behavior.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Old zombie piglin drop behavior diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java -index 8fcb6cd1cefa6c9e1809944b4720cfdc35325729..0c5da9aa8e682ee37b04a5fc18d696f25fbb0ba2 100644 +index fb72d1a79705f023e6e4b22ee26391623b931ab0..e0ac326513f5028664a06f81bee27b4aee8671f4 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +++ b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java -@@ -109,6 +109,9 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -113,6 +113,9 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.maybeAlertOthers(); } diff --git a/leaves-server/minecraft-patches/features/0121-Fast-exp-orb-absorb.patch b/leaves-server/minecraft-patches/features/0119-Fast-exp-orb-absorb.patch similarity index 56% rename from leaves-server/minecraft-patches/features/0121-Fast-exp-orb-absorb.patch rename to leaves-server/minecraft-patches/features/0119-Fast-exp-orb-absorb.patch index 28d1e69a6..440302ced 100644 --- a/leaves-server/minecraft-patches/features/0121-Fast-exp-orb-absorb.patch +++ b/leaves-server/minecraft-patches/features/0119-Fast-exp-orb-absorb.patch @@ -5,20 +5,20 @@ Subject: [PATCH] Fast exp orb absorb diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java -index 29d904b02a2c7b3d25261ca26c7c0479b00999ef..ae716dffb9d282ee2c5df73dfb846ac20aea02e0 100644 +index 49582cb05db4872486cc142efceae6b768a589a3..ae76daa86e870fd6fbbaa51b110f4340b19e626b 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java -@@ -355,6 +355,20 @@ public class ExperienceOrb extends Entity { - public void playerTouch(Player entity) { - if (entity instanceof ServerPlayer serverPlayer) { - if (entity.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(serverPlayer.getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent +@@ -352,6 +352,20 @@ public class ExperienceOrb extends Entity { + public void playerTouch(final Player player) { + if (player instanceof ServerPlayer serverPlayer) { + if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(serverPlayer.getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent + if (org.leavesmc.leaves.LeavesConfig.modify.fastAbsorbPredicate.test(serverPlayer)) { -+ entity.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(entity, 0, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entity.takeXpDelay = 2; ++ player.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(player, 0, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entity.takeXpDelay = 2; + while (this.count > 0) { -+ entity.take(this, 1); -+ int i = this.repairPlayerItems(serverPlayer, this.getValue()); -+ if (i > 0) { -+ entity.giveExperiencePoints(org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerExpChangeEvent(entity, this, i).getAmount()); // CraftBukkit - this.value -> event.getAmount() // Paper - supply experience orb object ++ player.take(this, 1); ++ int rem = this.repairPlayerItems(serverPlayer, this.getValue()); ++ if (rem > 0) { ++ player.giveExperiencePoints(org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerExpChangeEvent(player, this, rem).getAmount()); // CraftBukkit - this.value -> event.getAmount() // Paper - supply experience orb object + } + this.count--; + } @@ -26,6 +26,6 @@ index 29d904b02a2c7b3d25261ca26c7c0479b00999ef..ae716dffb9d282ee2c5df73dfb846ac2 + return; + } + - entity.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(entity, 2, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entity.takeXpDelay = 2; - entity.take(this, 1); - int i = this.repairPlayerItems(serverPlayer, this.getValue()); + player.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(player, 2, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entity.takeXpDelay = 2; + player.take(this, 1); + int remaining = this.repairPlayerItems(serverPlayer, this.getValue()); diff --git a/leaves-server/minecraft-patches/features/0119-Sound-update-suppression.patch b/leaves-server/minecraft-patches/features/0119-Sound-update-suppression.patch deleted file mode 100644 index ebf250bbd..000000000 --- a/leaves-server/minecraft-patches/features/0119-Sound-update-suppression.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MC_XiaoHei -Date: Tue, 20 May 2025 12:08:40 +0000 -Subject: [PATCH] Sound update suppression - - -diff --git a/net/minecraft/world/level/block/SculkSensorBlock.java b/net/minecraft/world/level/block/SculkSensorBlock.java -index 593fab3d2a70bcd6832dd777afa4973f22abbaeb..0207f5d28d7a7673f82df5ce9e0e596c6756ecf6 100644 ---- a/net/minecraft/world/level/block/SculkSensorBlock.java -+++ b/net/minecraft/world/level/block/SculkSensorBlock.java -@@ -96,7 +96,7 @@ public class SculkSensorBlock extends BaseEntityBlock implements SimpleWaterlogg - @Override - public void stepOn(Level level, BlockPos pos, BlockState state, Entity entity) { - if (!level.isClientSide() -- && canActivate(state) -+ && canActivate(state, pos) // Leaves - Sound update suppression - && entity.getType() != EntityType.WARDEN - && level.getBlockEntity(pos) instanceof SculkSensorBlockEntity sculkSensorBlockEntity - && level instanceof ServerLevel serverLevel -@@ -211,6 +211,15 @@ public class SculkSensorBlock extends BaseEntityBlock implements SimpleWaterlogg - return state.getValue(PHASE); - } - -+ // Leaves start - Sound update suppression -+ public static boolean canActivate(BlockState state, BlockPos pos) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.updater.soundUpdateSuppression && !(state.getBlock() instanceof SculkSensorBlock)) { -+ throw new org.leavesmc.leaves.util.UpdateSuppressionException(pos, null, state.getBlock(), null, new IllegalArgumentException()); -+ } -+ return canActivate(state); -+ } -+ // Leaves end - Sound update suppression -+ - public static boolean canActivate(BlockState state) { - return state.getBlock() instanceof SculkSensorBlock && getPhase(state) == SculkSensorPhase.INACTIVE; // Paper - Check for a valid type - } -diff --git a/net/minecraft/world/level/block/entity/SculkSensorBlockEntity.java b/net/minecraft/world/level/block/entity/SculkSensorBlockEntity.java -index 39aa9e1703ade12899f26ffc8063895e52138adb..b6d0af221c083f29215d2c56f07b4b3954acc86b 100644 ---- a/net/minecraft/world/level/block/entity/SculkSensorBlockEntity.java -+++ b/net/minecraft/world/level/block/entity/SculkSensorBlockEntity.java -@@ -113,7 +113,7 @@ public class SculkSensorBlockEntity extends BlockEntity implements GameEventList - public boolean canReceiveVibration(ServerLevel level, BlockPos pos, Holder gameEvent, GameEvent.@Nullable Context context) { - return (!pos.equals(this.blockPos) || !gameEvent.is(GameEvent.BLOCK_DESTROY) && !gameEvent.is(GameEvent.BLOCK_PLACE)) - && VibrationSystem.getGameEventFrequency(gameEvent) != 0 -- && SculkSensorBlock.canActivate(SculkSensorBlockEntity.this.getBlockState()); -+ && SculkSensorBlock.canActivate(SculkSensorBlockEntity.this.getBlockState(), pos); // Leaves - Sound update suppression - } - - @Override -@@ -121,7 +121,7 @@ public class SculkSensorBlockEntity extends BlockEntity implements GameEventList - ServerLevel level, BlockPos pos, Holder gameEvent, @Nullable Entity entity, @Nullable Entity playerEntity, float distance - ) { - BlockState blockState = SculkSensorBlockEntity.this.getBlockState(); -- if (SculkSensorBlock.canActivate(blockState)) { -+ if (SculkSensorBlock.canActivate(blockState, pos)) { // Leaves - Sound update suppression - int gameEventFrequency = VibrationSystem.getGameEventFrequency(gameEvent); - SculkSensorBlockEntity.this.setLastVibrationFrequency(gameEventFrequency); - int redstoneStrengthForDistance = VibrationSystem.getRedstoneStrengthForDistance(distance, this.getListenerRadius()); diff --git a/leaves-server/minecraft-patches/features/0122-Configurable-item-damage-check.patch b/leaves-server/minecraft-patches/features/0120-Configurable-item-damage-check.patch similarity index 66% rename from leaves-server/minecraft-patches/features/0122-Configurable-item-damage-check.patch rename to leaves-server/minecraft-patches/features/0120-Configurable-item-damage-check.patch index 790a23ed5..9331dad1b 100644 --- a/leaves-server/minecraft-patches/features/0122-Configurable-item-damage-check.patch +++ b/leaves-server/minecraft-patches/features/0120-Configurable-item-damage-check.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable item damage check diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index c59dec418f94b468f0465d0375809031f10bac39..2d01258e377ad1d628b193d15d794a057c3d11b4 100644 +index 34e56560780a200a2890b36c475aeebc578f1950..4dfd8a6b2332fc6148336cd39fd315c1fce1c6a9 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -603,11 +603,11 @@ public final class ItemStack implements DataComponentHolder { +@@ -596,11 +596,11 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { } public int getDamageValue() { @@ -16,9 +16,9 @@ index c59dec418f94b468f0465d0375809031f10bac39..2d01258e377ad1d628b193d15d794a05 + return org.leavesmc.leaves.LeavesConfig.modify.oldMC.disableItemDamageCheck ? this.getOrDefault(DataComponents.DAMAGE, 0) : Mth.clamp(this.getOrDefault(DataComponents.DAMAGE, 0), 0, this.getMaxDamage()); // Leaves - disable check } - public void setDamageValue(int damage) { -- this.set(DataComponents.DAMAGE, Mth.clamp(damage, 0, this.getMaxDamage())); -+ this.set(DataComponents.DAMAGE, org.leavesmc.leaves.LeavesConfig.modify.oldMC.disableItemDamageCheck ? damage : Mth.clamp(damage, 0, this.getMaxDamage())); // Leaves - disable check + public void setDamageValue(final int value) { +- this.set(DataComponents.DAMAGE, Mth.clamp(value, 0, this.getMaxDamage())); ++ this.set(DataComponents.DAMAGE, org.leavesmc.leaves.LeavesConfig.modify.oldMC.disableItemDamageCheck ? value : Mth.clamp(value, 0, this.getMaxDamage())); // Leaves - disable check } public int getMaxDamage() { diff --git a/leaves-server/minecraft-patches/features/0121-Old-Throwable-Projectile-tick-order.patch b/leaves-server/minecraft-patches/features/0121-Old-Throwable-Projectile-tick-order.patch new file mode 100644 index 000000000..7a0eb3feb --- /dev/null +++ b/leaves-server/minecraft-patches/features/0121-Old-Throwable-Projectile-tick-order.patch @@ -0,0 +1,37 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: violetc <58360096+s-yh-china@users.noreply.github.com> +Date: Tue, 1 Jul 2025 01:29:07 +0800 +Subject: [PATCH] Old Throwable Projectile tick order + + +diff --git a/net/minecraft/world/entity/projectile/ThrowableProjectile.java b/net/minecraft/world/entity/projectile/ThrowableProjectile.java +index 799165c7e09b151c929fa386c33c6985aedb54d3..ba1c1ac480986fda74d0cf566056e81d6bab9326 100644 +--- a/net/minecraft/world/entity/projectile/ThrowableProjectile.java ++++ b/net/minecraft/world/entity/projectile/ThrowableProjectile.java +@@ -45,6 +45,26 @@ public abstract class ThrowableProjectile extends Projectile { + @Override + public void tick() { + this.handleFirstTickBubbleColumn(); ++ // Leaves start - old-throwable-projectile-tick-order ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldThrowableProjectileTickOrder) { ++ super.tick(); ++ HitResult hitResultOnMoveVector = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); ++ if (hitResultOnMoveVector.getType() != HitResult.Type.MISS) { ++ this.preHitTargetOrDeflectSelf(hitResultOnMoveVector); // CraftBukkit - projectile hit event ++ } ++ ++ Vec3 oldDelta = this.getDeltaMovement(); ++ double nx = this.getX() + oldDelta.x; ++ double ny = this.getY() + oldDelta.y; ++ double nz = this.getZ() + oldDelta.z; ++ this.updateRotation(); ++ this.applyInertia(); ++ this.applyGravity(); ++ this.setPos(nx, ny, nz); ++ this.applyEffectsFromBlocks(); ++ return; ++ } ++ // Leaves end - old-throwable-projectile-tick-order + this.applyGravity(); + this.applyInertia(); + HitResult result = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); diff --git a/leaves-server/minecraft-patches/features/0124-Old-leash-behavior-when-use-firework.patch b/leaves-server/minecraft-patches/features/0122-Old-leash-behavior-when-use-firework.patch similarity index 73% rename from leaves-server/minecraft-patches/features/0124-Old-leash-behavior-when-use-firework.patch rename to leaves-server/minecraft-patches/features/0122-Old-leash-behavior-when-use-firework.patch index b993a203f..9bbb2c221 100644 --- a/leaves-server/minecraft-patches/features/0124-Old-leash-behavior-when-use-firework.patch +++ b/leaves-server/minecraft-patches/features/0122-Old-leash-behavior-when-use-firework.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Old leash behavior when use firework diff --git a/net/minecraft/world/item/FireworkRocketItem.java b/net/minecraft/world/item/FireworkRocketItem.java -index 7ccf76e938280216def8df55fe397a433b521d29..05d10035da22f1a3450f680da3551ad05d2d89aa 100644 +index 897f3e8750fec11ea665681d86e1126b84cca252..19cc55712c4ebcd81a6daa155355a940df2abdf4 100644 --- a/net/minecraft/world/item/FireworkRocketItem.java +++ b/net/minecraft/world/item/FireworkRocketItem.java @@ -88,7 +88,7 @@ public class FireworkRocketItem extends Item implements ProjectileItem { - com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Firework) delayed.projectile().getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); + com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Firework) delayed.projectile().getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); if (event.callEvent() && delayed.attemptSpawn()) { player.awardStat(Stats.ITEM_USED.get(this)); // Moved up from below -- if (player.dropAllLeashConnections(null)) { -+ if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.keepLeashConnectWhenUseFirework && player.dropAllLeashConnections(null)) { // Leaves - Keep leash connection when using firework +- if (player.dropAllLeashConnections(player, hand)) { // Paper - PlayerUnleashEntityEvent ++ if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.keepLeashConnectWhenUseFirework && player.dropAllLeashConnections(player, hand)) { // Leaves - Keep leash connection when using firework // Paper - PlayerUnleashEntityEvent level.playSound(null, player, SoundEvents.LEAD_BREAK, SoundSource.NEUTRAL, 1.0F, 1.0F); } if (event.shouldConsume() && !player.hasInfiniteMaterials()) { diff --git a/leaves-server/minecraft-patches/features/0123-Old-Throwable-Projectile-tick-order.patch b/leaves-server/minecraft-patches/features/0123-Old-Throwable-Projectile-tick-order.patch deleted file mode 100644 index d1e8a6c1c..000000000 --- a/leaves-server/minecraft-patches/features/0123-Old-Throwable-Projectile-tick-order.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: violetc <58360096+s-yh-china@users.noreply.github.com> -Date: Tue, 1 Jul 2025 01:29:07 +0800 -Subject: [PATCH] Old Throwable Projectile tick order - - -diff --git a/net/minecraft/world/entity/projectile/ThrowableProjectile.java b/net/minecraft/world/entity/projectile/ThrowableProjectile.java -index dfda0560e364aa7777bc1aa76febc55f1c2dd5a0..57ad4b5ef32e773d08bb1c0f496365ad154a01ce 100644 ---- a/net/minecraft/world/entity/projectile/ThrowableProjectile.java -+++ b/net/minecraft/world/entity/projectile/ThrowableProjectile.java -@@ -45,23 +45,43 @@ public abstract class ThrowableProjectile extends Projectile { - @Override - public void tick() { - this.handleFirstTickBubbleColumn(); -- this.applyGravity(); -- this.applyInertia(); -- HitResult hitResultOnMoveVector = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); -- Vec3 location; -- if (hitResultOnMoveVector.getType() != HitResult.Type.MISS) { -- location = hitResultOnMoveVector.getLocation(); -+ // Leaves start - old-throwable-projectile-tick-order // TODO - ? -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldThrowableProjectileTickOrder) { -+ super.tick(); -+ HitResult hitResultOnMoveVector = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); -+ if (hitResultOnMoveVector.getType() != HitResult.Type.MISS) { -+ this.preHitTargetOrDeflectSelf(hitResultOnMoveVector); // CraftBukkit - projectile hit event -+ } -+ -+ Vec3 vec3 = this.getDeltaMovement(); -+ double d = this.getX() + vec3.x; -+ double e = this.getY() + vec3.y; -+ double f = this.getZ() + vec3.z; -+ this.updateRotation(); -+ this.applyInertia(); -+ this.applyGravity(); -+ this.setPos(d, e, f); -+ this.applyEffectsFromBlocks(); - } else { -- location = this.position().add(this.getDeltaMovement()); -- } -+ this.applyGravity(); -+ this.applyInertia(); -+ HitResult hitResultOnMoveVector = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); -+ Vec3 location; -+ if (hitResultOnMoveVector.getType() != HitResult.Type.MISS) { -+ location = hitResultOnMoveVector.getLocation(); -+ } else { -+ location = this.position().add(this.getDeltaMovement()); -+ } - -- this.setPos(location); -- this.updateRotation(); -- this.applyEffectsFromBlocks(); -- super.tick(); -- if (hitResultOnMoveVector.getType() != HitResult.Type.MISS && this.isAlive()) { -- this.preHitTargetOrDeflectSelf(hitResultOnMoveVector); // CraftBukkit - projectile hit event -+ this.setPos(location); -+ this.updateRotation(); -+ this.applyEffectsFromBlocks(); -+ super.tick(); -+ if (hitResultOnMoveVector.getType() != HitResult.Type.MISS && this.isAlive()) { -+ this.preHitTargetOrDeflectSelf(hitResultOnMoveVector); // CraftBukkit - projectile hit event -+ } - } -+ // Leaves end - old-throwable-projectile-tick-order - } - - private void applyInertia() { diff --git a/leaves-server/minecraft-patches/features/0123-Old-wet-tnt-explode-behavior.patch b/leaves-server/minecraft-patches/features/0123-Old-wet-tnt-explode-behavior.patch new file mode 100644 index 000000000..a00277607 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0123-Old-wet-tnt-explode-behavior.patch @@ -0,0 +1,18 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MC_XiaoHei +Date: Fri, 4 Jul 2025 08:55:31 +0800 +Subject: [PATCH] Old wet tnt explode behavior + + +diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java +index 34d7eef8b2540172bd4dcdbf80df45e9cbfcb43c..83e4bdacecb49ae06ed11efd200a779680d2920f 100644 +--- a/net/minecraft/world/level/ServerExplosion.java ++++ b/net/minecraft/world/level/ServerExplosion.java +@@ -708,6 +708,7 @@ public class ServerExplosion implements Explosion { + public boolean shouldAffectBlocklikeEntities() { + boolean mobGriefingEnabled = this.level.getGameRules().get(GameRules.MOB_GRIEFING); + boolean isNotWindCharge = this.source == null || !this.source.is(EntityType.BREEZE_WIND_CHARGE) && !this.source.is(EntityType.WIND_CHARGE); ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.tntWetExplosionNoItemDamage) isNotWindCharge = isNotWindCharge && (this.source == null || !this.source.isInWater()); // Leaves - Old MC TNT wet explosion no item damage + return mobGriefingEnabled ? isNotWindCharge : this.blockInteraction.shouldAffectBlocklikeEntities() && isNotWindCharge; + } + diff --git a/leaves-server/minecraft-patches/features/0126-Old-projectile-explosion-behavior.patch b/leaves-server/minecraft-patches/features/0124-Old-projectile-explosion-behavior.patch similarity index 56% rename from leaves-server/minecraft-patches/features/0126-Old-projectile-explosion-behavior.patch rename to leaves-server/minecraft-patches/features/0124-Old-projectile-explosion-behavior.patch index 0b8ccf0ad..bab5ce95c 100644 --- a/leaves-server/minecraft-patches/features/0126-Old-projectile-explosion-behavior.patch +++ b/leaves-server/minecraft-patches/features/0124-Old-projectile-explosion-behavior.patch @@ -5,21 +5,15 @@ Subject: [PATCH] Old projectile explosion behavior diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java -index b6c289e9615753b2da66c995f2f950e874514ad9..f43bb2d76ea8ad34065ad296609eecc4ef6edf34 100644 +index 83e4bdacecb49ae06ed11efd200a779680d2920f..8657185ad1872680b7afb93afefcacb23f4e4565 100644 --- a/net/minecraft/world/level/ServerExplosion.java +++ b/net/minecraft/world/level/ServerExplosion.java -@@ -541,7 +541,13 @@ public class ServerExplosion implements Explosion { +@@ -534,7 +534,7 @@ public class ServerExplosion implements Explosion { // Paper end - knockback events } // CraftBukkit end -- entity.push(vec32); -+ // Leaves start - old projectile explosion behavior -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldProjectileExplosionBehavior) { -+ entity.setDeltaMovement(entity.getDeltaMovement().add(vec32)); -+ } else { -+ entity.push(vec32); -+ } -+ // Leaves end - old projectile explosion behavior - if (entity.getType().is(EntityTypeTags.REDIRECTABLE_PROJECTILE) && entity instanceof Projectile projectile) { +- entity.push(knockback); ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldProjectileExplosionBehavior) entity.setDeltaMovement(entity.getDeltaMovement().add(knockback)); else entity.push(knockback); // Leaves - old projectile explosion behavior + if (entity.is(EntityTypeTags.REDIRECTABLE_PROJECTILE) && entity instanceof Projectile projectile) { projectile.setOwner(this.damageSource.getEntity()); } else if (entity instanceof Player player && !player.isSpectator() && (!player.isCreative() || !player.getAbilities().flying) && !level.paperConfig().environment.disableExplosionKnockback) { // Paper - Option to disable explosion knockback diff --git a/leaves-server/minecraft-patches/features/0125-Old-wet-tnt-explode-behavior.patch b/leaves-server/minecraft-patches/features/0125-Old-wet-tnt-explode-behavior.patch deleted file mode 100644 index eb2588040..000000000 --- a/leaves-server/minecraft-patches/features/0125-Old-wet-tnt-explode-behavior.patch +++ /dev/null @@ -1,18 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MC_XiaoHei -Date: Fri, 4 Jul 2025 08:55:31 +0800 -Subject: [PATCH] Old wet tnt explode behavior - - -diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java -index 1e94326047622d8975fd1cc5f44e75104fd56946..b6c289e9615753b2da66c995f2f950e874514ad9 100644 ---- a/net/minecraft/world/level/ServerExplosion.java -+++ b/net/minecraft/world/level/ServerExplosion.java -@@ -717,6 +717,7 @@ public class ServerExplosion implements Explosion { - public boolean shouldAffectBlocklikeEntities() { - boolean flag = this.level.getGameRules().get(GameRules.MOB_GRIEFING); - boolean flag1 = this.source == null || this.source.getType() != EntityType.BREEZE_WIND_CHARGE && this.source.getType() != EntityType.WIND_CHARGE; -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.tntWetExplosionNoItemDamage) flag1 = flag1 && (this.source == null || !this.source.isInWater()); // Leaves - Old MC TNT wet explosion no item damage - return flag ? flag1 : this.blockInteraction.shouldAffectBlocklikeEntities() && flag1; - } - diff --git a/leaves-server/minecraft-patches/features/0125-Prevent-loss-of-item-drops-due-to-update-suppression.patch b/leaves-server/minecraft-patches/features/0125-Prevent-loss-of-item-drops-due-to-update-suppression.patch new file mode 100644 index 000000000..868e5d949 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0125-Prevent-loss-of-item-drops-due-to-update-suppression.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MC_XiaoHei +Date: Fri, 4 Jul 2025 17:13:15 +0800 +Subject: [PATCH] Prevent loss of item drops due to update suppression when + breaking blocks + + +diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java +index e1ebc7729f1c60833fafe90636e22e33d1c918a9..8d93ef10aac217b19efc091eee43a07ff1b766ad 100644 +--- a/net/minecraft/server/level/ServerPlayerGameMode.java ++++ b/net/minecraft/server/level/ServerPlayerGameMode.java +@@ -407,11 +407,21 @@ public class ServerPlayerGameMode { + this.level.captureDrops = new java.util.ArrayList<>(); + // CraftBukkit end + BlockState adjustedState = org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? state : block.playerWillDestroy(this.level, pos, state, this.player); // Leaves - no block update +- boolean changed = this.level.removeBlock(pos, false); ++ // Leaves start - Prevent loss of item drops due to update suppression when breaking blocks ++ boolean changed; + if (SharedConstants.DEBUG_BLOCK_BREAK) { + LOGGER.info("server broke {} {} -> {}", pos, adjustedState, this.level.getBlockState(pos)); + } +- ++ org.leavesmc.leaves.util.UpdateSuppressionException ex = null; ++ try { ++ changed = this.level.removeBlock(pos, false); ++ } catch (org.leavesmc.leaves.util.UpdateSuppressionException e) { ++ ex = e; ++ ex.provideBlock(level, pos, block); ++ ex.providePlayer(this.player); ++ changed = false; ++ } ++ // Leaves end - Prevent loss of item drops due to update suppression when breaking blocks + if (changed) { + block.destroy(this.level, pos, adjustedState); + } +@@ -435,6 +445,7 @@ public class ServerPlayerGameMode { + if (event.isDropItems()) { + org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, bState, this.player, itemsToDrop); // Paper - capture all item additions to the world + } ++ if (ex != null) throw ex; // Leaves - Prevent loss of item drops due to update suppression when breaking blocks + + // Drop event experience + if (changed) { +diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +index 97b69ca8025321d4ffbdca80e593348b014a73d6..b6f55df3e3f2752eae10cd0ee1e0c81fc57680c4 100644 +--- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +@@ -150,6 +150,16 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit + } + // CraftBukkit end + ++ // Leaves start - pca ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ } ++ // Leaves end - pca ++ + @Override + protected void loadAdditional(final ValueInput input) { + super.loadAdditional(input); diff --git a/leaves-server/minecraft-patches/features/0126-Fix-block-place-desync-due-to-update-suppression.patch b/leaves-server/minecraft-patches/features/0126-Fix-block-place-desync-due-to-update-suppression.patch new file mode 100644 index 000000000..d971a01cb --- /dev/null +++ b/leaves-server/minecraft-patches/features/0126-Fix-block-place-desync-due-to-update-suppression.patch @@ -0,0 +1,212 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MC_XiaoHei +Date: Sat, 5 Jul 2025 09:48:47 +0800 +Subject: [PATCH] Fix block place desync due to update suppression + + +diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java +index 4dfd8a6b2332fc6148336cd39fd315c1fce1c6a9..c2a35843e7f56ec9df5872d07277c06a47fe1d41 100644 +--- a/net/minecraft/world/item/ItemStack.java ++++ b/net/minecraft/world/item/ItemStack.java +@@ -394,8 +394,18 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { + } + } + InteractionResult result; ++ // Leaves start - fix block place desync due to update suppression ++ org.leavesmc.leaves.util.UpdateSuppressionException ue = null; + try { + result = usedItem.useOn(context); ++ } catch (org.leavesmc.leaves.util.UpdateSuppressionException ex) { ++ result = InteractionResult.SUCCESS.configurePaper(e -> e.placedBlockAt(pos.immutable())); ++ ue = ex; ++ ue.provideBlock(context.getLevel(), context.getClickedPos(), level.getBlockState(context.getClickedPos()).getBlock()); ++ if (player != null) { ++ ue.providePlayer((net.minecraft.server.level.ServerPlayer) player); ++ } ++ // Leaves end - fix block place desync due to update suppression + } finally { + level.captureBlockStates = false; + } +@@ -541,6 +551,7 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { + level.capturedBlockStates.clear(); + // CraftBukkit end + ++ if (ue != null) throw ue; // Leaves - fix block place desync due to update suppression + return result; + } + +diff --git a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +index 5ba46020b47edfc886ecd5c33483ebb0fa57e5dc..edcd56b5302e45f59e75c658e3c8bb8042f69d9e 100644 +--- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +@@ -107,6 +107,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { + } + } + ++ // Leaves start - pca ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ } ++ // Leaves end - pca ++ + @Override + protected void loadAdditional(final ValueInput input) { + super.loadAdditional(input); +diff --git a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java +index 65ddab898cb13760389929c00aac29707363fc15..e9bd63b69b47d26edfc445fa6383d62f68179671 100644 +--- a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java +@@ -154,6 +154,11 @@ public class BeehiveBlockEntity extends BlockEntity { + super.setChanged(); + } + ++ // Leaves start - pca ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ // Leaves end - pca + return spawned; + } + +@@ -202,6 +207,11 @@ public class BeehiveBlockEntity extends BlockEntity { + this.level.gameEvent(GameEvent.BLOCK_CHANGE, blockPos, GameEvent.Context.of(bee, this.getBlockState())); + } + ++ // Leaves start - pca ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ // Leaves end - pca + bee.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.ENTER_BLOCK); // CraftBukkit - add Bukkit remove cause + super.setChanged(); + } +diff --git a/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java b/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java +index 6c96ea9b477999453b2e9e59c119d70ea1e44453..284ea08334971feb08d5376f7b3e618e89939dd9 100644 +--- a/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java +@@ -280,6 +280,16 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements + level.levelEvent(LevelEvent.SOUND_BREWING_STAND_BREW, pos, 0); + } + ++ // Leaves start - pca ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ } ++ // Leaves end - pca ++ + @Override + protected void loadAdditional(final ValueInput input) { + super.loadAdditional(input); +diff --git a/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/net/minecraft/world/level/block/entity/ChestBlockEntity.java +index 324f19786c4e298e706184045aea3e8ab98aaf46..884467b40c4b4bd26feaf68532be9ac7dd18120a 100644 +--- a/net/minecraft/world/level/block/entity/ChestBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/ChestBlockEntity.java +@@ -121,6 +121,16 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement + return DEFAULT_NAME; + } + ++ // Leaves start - pca ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ } ++ // Leaves end - pca ++ + @Override + protected void loadAdditional(final ValueInput input) { + super.loadAdditional(input); +diff --git a/net/minecraft/world/level/block/entity/ComparatorBlockEntity.java b/net/minecraft/world/level/block/entity/ComparatorBlockEntity.java +index 268762008b2913f960bcfb0a92800ccee5219e7d..6da877507ac0a73b443016eb86bbb159d1bdfd28 100644 +--- a/net/minecraft/world/level/block/entity/ComparatorBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/ComparatorBlockEntity.java +@@ -19,6 +19,16 @@ public class ComparatorBlockEntity extends BlockEntity { + output.putInt("OutputSignal", this.output); + } + ++ // Leaves start - pca ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ } ++ // Leaves end - pca ++ + @Override + protected void loadAdditional(final ValueInput input) { + super.loadAdditional(input); +diff --git a/net/minecraft/world/level/block/entity/DispenserBlockEntity.java b/net/minecraft/world/level/block/entity/DispenserBlockEntity.java +index 0b4e914c9bff24ca28a8aec11efc6d13f44522b6..37911a7187a029ca5e51224adf3696c4da24a2d7 100644 +--- a/net/minecraft/world/level/block/entity/DispenserBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/DispenserBlockEntity.java +@@ -110,6 +110,16 @@ public class DispenserBlockEntity extends RandomizableContainerBlockEntity { + return DEFAULT_NAME; + } + ++ // Leaves start - pca ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ } ++ // Leaves end - pca ++ + @Override + protected void loadAdditional(final ValueInput input) { + super.loadAdditional(input); +diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +index 009d5d34a50ef75343007a638a357a9a05521e8b..7a29c9815d11fb096662debb37f229c51a4384b8 100644 +--- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java +@@ -78,6 +78,16 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + this.facing = blockState.getValue(HopperBlock.FACING); + } + ++ // Leaves start - pca ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ } ++ // Leaves end - pca ++ + @Override + protected void loadAdditional(final ValueInput input) { + super.loadAdditional(input); +diff --git a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java +index edf07e06509df360a1423aa0b3828d656b6a3c4b..29cefcc20fb5f32404bad07d3fa6ae059b706807 100644 +--- a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java ++++ b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java +@@ -240,6 +240,16 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl + return DEFAULT_NAME; + } + ++ // Leaves start - pca ++ @Override ++ public void setChanged() { ++ super.setChanged(); ++ if (org.leavesmc.leaves.LeavesConfig.protocol.pca.enable) { ++ org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(this); ++ } ++ } ++ // Leaves end - pca ++ + @Override + protected void loadAdditional(final ValueInput input) { + super.loadAdditional(input); diff --git a/leaves-server/minecraft-patches/features/0129-Old-ender-dragon-part-can-use-end-portal.patch b/leaves-server/minecraft-patches/features/0127-Old-ender-dragon-part-can-use-end-portal.patch similarity index 55% rename from leaves-server/minecraft-patches/features/0129-Old-ender-dragon-part-can-use-end-portal.patch rename to leaves-server/minecraft-patches/features/0127-Old-ender-dragon-part-can-use-end-portal.patch index 6bbda2d04..6ee9cb941 100644 --- a/leaves-server/minecraft-patches/features/0129-Old-ender-dragon-part-can-use-end-portal.patch +++ b/leaves-server/minecraft-patches/features/0127-Old-ender-dragon-part-can-use-end-portal.patch @@ -3,33 +3,12 @@ From: MC_XiaoHei Date: Sun, 6 Jul 2025 10:32:36 +0800 Subject: [PATCH] Old ender dragon part can use end portal -This patch is Powered by CrystalCarpetAddition(https://github.com/Crystal0404/CrystalCarpetAddition) - -/* - * This file is part of the Crystal Carpet Addition project, licensed under the - * GNU General Public License v3.0 - * - * Copyright (C) 2024 Crystal0404 and contributors - * - * Crystal Carpet Addition is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Crystal Carpet Addition is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Crystal Carpet Addition. If not, see . - */ diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 21c605ec1fc93366bc4c2d82d5ef9137a07b1d3b..d3316e443b950e709d7e56266a777d0fc1205c87 100644 +index 31a8631ef794a4b99adcbe0004f33bcc98ee73de..78d411d860dcdfffc8b3bbc3e08f4d23cd01722d 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -189,7 +189,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -204,7 +204,7 @@ public abstract class Entity // Paper end - Share random for entities to make them more random public org.bukkit.event.entity.CreatureSpawnEvent.@Nullable SpawnReason spawnReason; // Paper - Entity#getEntitySpawnReason @@ -38,37 +17,37 @@ index 21c605ec1fc93366bc4c2d82d5ef9137a07b1d3b..d3316e443b950e709d7e56266a777d0f public org.bukkit.craftbukkit.entity.CraftEntity getBukkitEntity() { if (this.bukkitEntity == null) { -@@ -4044,7 +4044,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -4064,7 +4064,7 @@ public abstract class Entity - public @Nullable Entity teleport(TeleportTransition teleportTransition) { + public @Nullable Entity teleport(TeleportTransition transition) { // Paper - remove param final // Paper start - Fix item duplication and teleport issues -- if ((!this.isAlive() || !this.valid) && (teleportTransition.newLevel() != this.level)) { -+ if (!(org.leavesmc.leaves.LeavesConfig.modify.oldMC.enderDragonPartCanUseEndPortal && this instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragonPart)) if ((!this.isAlive() || !this.valid) && (teleportTransition.newLevel() != this.level)) { // Leaves - endDragonPartCanUseEndPortal - LOGGER.warn("Illegal Entity Teleport {} to {}:{}", this, teleportTransition.newLevel(), teleportTransition.position(), new Throwable()); +- if ((!this.isAlive() || !this.valid) && (transition.newLevel() != this.level)) { ++ if (!(org.leavesmc.leaves.LeavesConfig.modify.oldMC.enderDragonPartCanUseEndPortal && this instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragonPart)) if ((!this.isAlive() || !this.valid) && (transition.newLevel() != this.level)) { // Leaves - endDragonPartCanUseEndPortal + LOGGER.warn("Illegal Entity Teleport {} to {}:{}", this, transition.newLevel(), transition.position(), new Throwable()); return null; } -@@ -4160,7 +4160,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name - entityx.restoreFrom(this); - this.removeAfterChangingDimensions(); - entityx.teleportSetPosition(PositionMoveRotation.of(this), PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); -- if (this.inWorld) newLevel.addDuringTeleport(entityx); // CraftBukkit - Don't spawn the new entity if the current entity isn't spawned -+ if (this.inWorld || (this instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragonPart && org.leavesmc.leaves.LeavesConfig.modify.oldMC.enderDragonPartCanUseEndPortal)) newLevel.addDuringTeleport(entityx); // CraftBukkit - Don't spawn the new entity if the current entity isn't spawned // Leaves - ender dragon part can use end portal +@@ -4181,7 +4181,7 @@ public abstract class Entity + newEntity.restoreFrom(this); + this.removeAfterChangingDimensions(); + newEntity.teleportSetPosition(PositionMoveRotation.of(this), PositionMoveRotation.of(transition), transition.relatives()); +- if (this.inWorld) newLevel.addDuringTeleport(newEntity); // CraftBukkit - Don't spawn the new entity if the current entity isn't spawned ++ if (this.inWorld || (this instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragonPart && org.leavesmc.leaves.LeavesConfig.modify.oldMC.enderDragonPartCanUseEndPortal)) newLevel.addDuringTeleport(newEntity); // CraftBukkit - Don't spawn the new entity if the current entity isn't spawned // Leaves - ender dragon part can use end portal - for (Entity entity2 : list) { - entity2.startRiding(entityx, true, false); -@@ -4277,6 +4277,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name + for (Entity newPassenger : newPassengers) { + newPassenger.startRiding(newEntity, true, false); +@@ -4294,6 +4294,7 @@ public abstract class Entity } - public boolean canTeleport(Level fromLevel, Level toLevel) { + public boolean canTeleport(final Level from, final Level to) { + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.enderDragonPartCanUseEndPortal && this instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragonPart) return true; // Leaves - enderDragonPartCanUseEndPortal if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowEntityPortalWithPassenger && (this.isPassenger() || this.isVehicle())) return false; // Leaves - allowEntityPortalWithPassenger if (!this.isAlive() || !this.valid) return false; // Paper - Fix item duplication and teleport issues - if (fromLevel.dimension() == Level.END && toLevel.dimension() == Level.OVERWORLD) { + if (from.dimension() == Level.END && to.dimension() == Level.OVERWORLD) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 7d70731905440c6b01639c0b50e259c619bf0421..4f417489f96217ef19e3ca624c5d791bf38a9237 100644 +index 85cc3228091ba769e79297c924549a7daaf1fff8..df73fdd8affd0a20c1ca456b02c8f31a872f25d4 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -392,6 +392,16 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -404,6 +404,16 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs if (!this.level().isClientSide() && this.tickCount % 5 == 0) { this.updateControlFlags(); } @@ -86,7 +65,7 @@ index 7d70731905440c6b01639c0b50e259c619bf0421..4f417489f96217ef19e3ca624c5d791b protected void updateControlFlags() { diff --git a/net/minecraft/world/entity/PortalProcessor.java b/net/minecraft/world/entity/PortalProcessor.java -index 4e69e32ad000b8c02e44c3ffce24ff5e3c090a2f..2fdb9a7e0f81a988a17c63253b8574ddbab094d6 100644 +index 7ec15f3d3a770e1e9e2fbac29dd38e947bb07091..60ed93e7b834e7bce21e4d8d826d9fba99aff952 100644 --- a/net/minecraft/world/entity/PortalProcessor.java +++ b/net/minecraft/world/entity/PortalProcessor.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.portal.TeleportTransition; diff --git a/leaves-server/minecraft-patches/features/0127-Prevent-loss-of-item-drops-due-to-update-suppression.patch b/leaves-server/minecraft-patches/features/0127-Prevent-loss-of-item-drops-due-to-update-suppression.patch deleted file mode 100644 index 77a45224d..000000000 --- a/leaves-server/minecraft-patches/features/0127-Prevent-loss-of-item-drops-due-to-update-suppression.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MC_XiaoHei -Date: Fri, 4 Jul 2025 17:13:15 +0800 -Subject: [PATCH] Prevent loss of item drops due to update suppression when - breaking blocks - - -diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index 24632205303bbcb2240a851b9d8baf8bbdfe4622..caf753c700ae2542627ff60e420bc40ab04ae013 100644 ---- a/net/minecraft/server/level/ServerPlayerGameMode.java -+++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -399,11 +399,21 @@ public class ServerPlayerGameMode { - this.level.captureDrops = new java.util.ArrayList<>(); - // CraftBukkit end - BlockState blockState1 = org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate() ? blockState : block.playerWillDestroy(this.level, pos, blockState, this.player); // Leaves - no block update -- boolean flag = this.level.removeBlock(pos, false); -+ // Leaves start - Prevent loss of item drops due to update suppression when breaking blocks -+ boolean flag; - if (SharedConstants.DEBUG_BLOCK_BREAK) { - LOGGER.info("server broke {} {} -> {}", pos, blockState1, this.level.getBlockState(pos)); - } -- -+ org.leavesmc.leaves.util.UpdateSuppressionException ex = null; -+ try { -+ flag = this.level.removeBlock(pos, false); -+ } catch (org.leavesmc.leaves.util.UpdateSuppressionException e) { -+ ex = e; -+ ex.provideBlock(level, pos, block); -+ ex.providePlayer(this.player); -+ flag = false; -+ } -+ // Leaves end - Prevent loss of item drops due to update suppression when breaking blocks - if (flag) { - block.destroy(this.level, pos, blockState1); - } -@@ -431,6 +441,7 @@ public class ServerPlayerGameMode { - if (event.isDropItems()) { - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockDropItemEvent(bblock, state, this.player, itemsToDrop); // Paper - capture all item additions to the world - } -+ if (ex != null) throw ex; // Leaves - Prevent loss of item drops due to update suppression when breaking blocks - - // Drop event experience - if (flag) { diff --git a/leaves-server/minecraft-patches/features/0128-Configurable-collision-behavior.patch b/leaves-server/minecraft-patches/features/0128-Configurable-collision-behavior.patch new file mode 100644 index 000000000..ec1a60dd6 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0128-Configurable-collision-behavior.patch @@ -0,0 +1,65 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Fortern +Date: Thu, 24 Oct 2024 23:10:34 +0800 +Subject: [PATCH] Configurable collision behavior + + +diff --git a/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java b/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java +index de764da80793d272ff597b4a0742ce785838799a..f6fd88839fa08fa48468712aec959c3c4eee7db4 100644 +--- a/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java ++++ b/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java +@@ -101,6 +101,14 @@ public final class CollisionUtil { + (box1.minZ - box2.maxZ) < -COLLISION_EPSILON && (box1.maxZ - box2.minZ) > COLLISION_EPSILON; + } + ++ // Leaves start - Configurable collision behavior ++ public static boolean voxelShapeIntersectVanilla(final AABB box1, final AABB box2) { ++ return box1.minX < box2.maxX && box1.maxX > box2.minX && ++ box1.minY < box2.maxY && box1.maxY > box2.minY && ++ box1.minZ < box2.maxZ && box1.maxZ > box2.minZ; ++ } ++ // Leaves end - Configurable collision behavior ++ + // assume !isEmpty(target) && abs(source_move) >= COLLISION_EPSILON + public static double collideX(final AABB target, final AABB source, final double source_move) { + if ((source.minY - target.maxY) < -COLLISION_EPSILON && (source.maxY - target.minY) > COLLISION_EPSILON && +@@ -2014,18 +2022,11 @@ public final class CollisionUtil { + AABB singleAABB = ((CollisionVoxelShape)blockCollision).moonrise$getSingleAABBRepresentation(); + if (singleAABB != null) { + singleAABB = singleAABB.move((double)blockX, (double)blockY, (double)blockZ); +- +- // Not using the epsilon violates the collision rules but this is what Vanilla does. +- // Check BlockCollisions.class +- if (blockCollision == Shapes.block()) { +- if (!aabb.intersects(singleAABB)) { +- continue; +- } +- } else { +- if (!voxelShapeIntersect(aabb, singleAABB)) { +- continue; +- } ++ // Leaves start - Configurable collision behavior ++ if (shouldSkip(aabb, blockCollision, singleAABB)) { ++ continue; + } ++ // Leaves end - Configurable collision behavior + + if (predicate != null) { + if (!predicate.test(blockData, mutablePos)) { +@@ -2076,6 +2077,16 @@ public final class CollisionUtil { + return ret; + } + ++ // Leaves start - Configurable collision behavior ++ private static boolean shouldSkip(final net.minecraft.world.phys.AABB aabb, final net.minecraft.world.phys.shapes.VoxelShape blockCollision, final net.minecraft.world.phys.AABB singleAABB) { ++ final boolean isBlockShape = blockCollision == net.minecraft.world.phys.shapes.Shapes.block(); ++ return switch (org.leavesmc.leaves.LeavesConfig.fix.collisionBehavior) { ++ case PAPER -> !voxelShapeIntersect(aabb, singleAABB); ++ case VANILLA -> !voxelShapeIntersectVanilla(aabb, singleAABB); ++ }; ++ } ++ // Leaves end - Configurable collision behavior ++ + public static boolean getEntityHardCollisions(final Level world, final Entity entity, AABB aabb, + final List into, final int collisionFlags, final Predicate predicate) { + final boolean checkOnly = (collisionFlags & COLLISION_FLAG_CHECK_ONLY) != 0; diff --git a/leaves-server/minecraft-patches/features/0128-Fix-block-place-desync-due-to-update-suppression.patch b/leaves-server/minecraft-patches/features/0128-Fix-block-place-desync-due-to-update-suppression.patch deleted file mode 100644 index 06a3a2c87..000000000 --- a/leaves-server/minecraft-patches/features/0128-Fix-block-place-desync-due-to-update-suppression.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MC_XiaoHei -Date: Sat, 5 Jul 2025 09:48:47 +0800 -Subject: [PATCH] Fix block place desync due to update suppression - - -diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index 2d01258e377ad1d628b193d15d794a057c3d11b4..f0a27175e044f49f47ac012e0d81b61832ff5af5 100644 ---- a/net/minecraft/world/item/ItemStack.java -+++ b/net/minecraft/world/item/ItemStack.java -@@ -395,8 +395,18 @@ public final class ItemStack implements DataComponentHolder { - } - } - InteractionResult interactionResult; -+ // Leaves start - fix block place desync due to update suppression -+ org.leavesmc.leaves.util.UpdateSuppressionException ue = null; - try { - interactionResult = item.useOn(context); -+ } catch (org.leavesmc.leaves.util.UpdateSuppressionException ex) { -+ interactionResult = net.minecraft.world.InteractionResult.SUCCESS.configurePaper(e -> e.placedBlockAt(clickedPos.immutable())); -+ ue = ex; -+ ue.provideBlock(context.getLevel(), context.getClickedPos(), serverLevel.getBlockState(context.getClickedPos()).getBlock()); -+ if (player != null) { -+ ue.providePlayer((net.minecraft.server.level.ServerPlayer) player); -+ } -+ // Leaves end - fix block place desync due to update suppression - } finally { - serverLevel.captureBlockStates = false; - } -@@ -543,6 +553,7 @@ public final class ItemStack implements DataComponentHolder { - serverLevel.capturedBlockStates.clear(); - // CraftBukkit end - -+ if (ue != null) throw ue; // Leaves - fix block place desync due to update suppression - return interactionResult; - } - } diff --git a/leaves-server/minecraft-patches/features/0131-Lithium-Sleeping-Block-Entity.patch b/leaves-server/minecraft-patches/features/0129-Lithium-Sleeping-Block-Entity.patch similarity index 81% rename from leaves-server/minecraft-patches/features/0131-Lithium-Sleeping-Block-Entity.patch rename to leaves-server/minecraft-patches/features/0129-Lithium-Sleeping-Block-Entity.patch index 62dcee1d8..aec5738a9 100644 --- a/leaves-server/minecraft-patches/features/0131-Lithium-Sleeping-Block-Entity.patch +++ b/leaves-server/minecraft-patches/features/0129-Lithium-Sleeping-Block-Entity.patch @@ -3,21 +3,9 @@ From: MC_XiaoHei Date: Thu, 31 Jul 2025 09:37:26 +0800 Subject: [PATCH] Lithium Sleeping Block Entity -This patch is Powered by Lithium(https://github.com/CaffeineMC/lithium) - -This patch is based on the following mixins: -* "net/caffeinemc/mods/lithium/mixin/world/block_entity_ticking/sleeping/*.java" -* "net/caffeinemc/mods/lithium/mixin/block/hopper/*.java" -* "net/caffeinemc/mods/lithium/mixin/util/block_entity_retrieval/LevelMixin.java" -* "net/caffeinemc/mods/lithium/mixin/util/inventory_change_listening/*.java" -* "net/caffeinemc/mods/lithium/mixin/util/inventory_comparator_tracking/*.java" -* "net/caffeinemc/mods/lithium/mixin/util/item_component_and_count_tracking/*.java" -By: 2No2Name <2No2Name@web.de> -As part of: Lithium (https://github.com/CaffeineMC/lithium) -Licensed under: LGPL-3.0 (https://www.gnu.org/licenses/lgpl-3.0.html) diff --git a/net/minecraft/core/NonNullList.java b/net/minecraft/core/NonNullList.java -index ede0a5403739a2cf8bf101d7b12748c8acce87f5..21e6190ae894a73cde27c6321c602acab2098cc0 100644 +index 8fd27a342f7302284c48b3db7d085bb692e08cdc..8992e13df499333235e1a51b725c0ad3ccd0284d 100644 --- a/net/minecraft/core/NonNullList.java +++ b/net/minecraft/core/NonNullList.java @@ -8,7 +8,7 @@ import java.util.Objects; @@ -30,7 +18,7 @@ index ede0a5403739a2cf8bf101d7b12748c8acce87f5..21e6190ae894a73cde27c6321c602aca public static NonNullList create() { diff --git a/net/minecraft/core/component/PatchedDataComponentMap.java b/net/minecraft/core/component/PatchedDataComponentMap.java -index 4276819c6143b41886e26d359a562beb3b277afc..56f0573bb74ea1e5f09851d421b83db23594441e 100644 +index 08ea8107fc8cbec3742278ab5cf03ef9048720f9..1c9218686c50d59200c53d164a33debc41b1de8b 100644 --- a/net/minecraft/core/component/PatchedDataComponentMap.java +++ b/net/minecraft/core/component/PatchedDataComponentMap.java @@ -14,7 +14,7 @@ import java.util.Map.Entry; @@ -42,15 +30,15 @@ index 4276819c6143b41886e26d359a562beb3b277afc..56f0573bb74ea1e5f09851d421b83db2 private final DataComponentMap prototype; private Reference2ObjectMap, Optional> patch; private boolean copyOnWrite; -@@ -136,6 +136,7 @@ public final class PatchedDataComponentMap implements DataComponentMap { +@@ -137,6 +137,7 @@ public final class PatchedDataComponentMap implements DataComponentMap { } private void ensureMapOwnership() { -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.subscriber != null) this.subscriber.lithium$notify((PatchedDataComponentMap) (Object) this, 0); // Leaves - Lithium Sleeping Block Entity ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.copyOnWrite && this.subscriber != null) this.subscriber.lithium$notify((PatchedDataComponentMap) (Object) this, 0); // Leaves - Lithium Sleeping Block Entity (only notify when actually copying, matches Lithium mixin semantics) if (this.copyOnWrite) { this.patch = new Reference2ObjectArrayMap<>(this.patch); this.copyOnWrite = false; -@@ -239,4 +240,22 @@ public final class PatchedDataComponentMap implements DataComponentMap { +@@ -233,4 +234,22 @@ public final class PatchedDataComponentMap implements DataComponentMap { public String toString() { return "{" + this.stream().map(TypedDataComponent::toString).collect(Collectors.joining(", ")) + "}"; } @@ -74,47 +62,47 @@ index 4276819c6143b41886e26d359a562beb3b277afc..56f0573bb74ea1e5f09851d421b83db2 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/server/commands/data/EntityDataAccessor.java b/net/minecraft/server/commands/data/EntityDataAccessor.java -index 6f01763c178324dd1741b996cd21cb9c23795b71..a4f32e6333b3b7ac56ac010f842ce61c7c5c78fb 100644 +index bcd7097def03c59140e1774cfdc787d526fb205b..35c6645b72edc72ce037c8687dd8b04b5acdc886 100644 --- a/net/minecraft/server/commands/data/EntityDataAccessor.java +++ b/net/minecraft/server/commands/data/EntityDataAccessor.java -@@ -55,6 +55,7 @@ public class EntityDataAccessor implements DataAccessor { - try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(this.entity.problemPath(), LOGGER)) { - this.entity.load(TagValueInput.create(scopedCollector, this.entity.registryAccess(), other)); - this.entity.setUUID(uuid); -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.entity instanceof net.minecraft.world.entity.item.ItemEntity itemEntity) itemEntity.levelCallback.onMove(); // Leaves - Lithium Sleeping Block Entity - } +@@ -57,6 +57,7 @@ public class EntityDataAccessor implements DataAccessor { + try (ProblemReporter.ScopedCollector reporter = new ProblemReporter.ScopedCollector(this.entity.problemPath(), LOGGER)) { + this.entity.load(TagValueInput.create(reporter, this.entity.registryAccess(), tag)); + this.entity.setUUID(uuid); ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.entity instanceof net.minecraft.world.entity.item.ItemEntity itemEntity) itemEntity.levelCallback.onMove(); // Leaves - Lithium Sleeping Block Entity } } + diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 81094f0ab63dfb48f7ae9a529d407dec5e356626..fa45be0a6349cea76daf4f90528fb890cb2a90b9 100644 +index d73dc43d451886ad22adfe65b64c13bd3eca09aa..5c0d090e8dfff27caa867fffc013e4ad387a4d03 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -2502,6 +2502,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2566,6 +2566,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet - for (TickingBlockEntity tickingBlockEntity : this.blockEntityTickers) { - BlockPos pos = tickingBlockEntity.getPos(); -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && pos == null) pos = BlockPos.ZERO; // Leaves - Lithium Sleeping Block Entity - csvOutput.writeRow(pos.getX(), pos.getY(), pos.getZ(), tickingBlockEntity.getType()); + for (TickingBlockEntity ticker : this.blockEntityTickers) { + BlockPos blockPos = ticker.getPos(); ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && blockPos == null) blockPos = BlockPos.ZERO; // Leaves - Lithium Sleeping Block Entity + csvOutput.writeRow(blockPos.getX(), blockPos.getY(), blockPos.getZ(), ticker.getType()); } } diff --git a/net/minecraft/world/Container.java b/net/minecraft/world/Container.java -index 61646fe4b3476017a175a5d30fde53f13538ad9e..392678778dc2a036c1e3db4b6bb2800e452d3cd0 100644 +index 99449ab429ce545cf8f6f72bd1baad83b1461365..b3585aee0393142366e583fc2c8fb207f162e92b 100644 --- a/net/minecraft/world/Container.java +++ b/net/minecraft/world/Container.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import org.jspecify.annotations.Nullable; --public interface Container extends Clearable, SlotProvider, Iterable { -+public interface Container extends Clearable, SlotProvider, Iterable, org.leavesmc.leaves.lithium.api.inventory.LithiumCooldownReceivingInventory, org.leavesmc.leaves.lithium.api.inventory.LithiumTransferConditionInventory { // Leaves - Lithium Sleeping Block Entity +-public interface Container extends Clearable, Iterable, SlotProvider { ++public interface Container extends Clearable, Iterable, SlotProvider, org.leavesmc.leaves.lithium.api.inventory.LithiumCooldownReceivingInventory, org.leavesmc.leaves.lithium.api.inventory.LithiumTransferConditionInventory { // Leaves - Lithium Sleeping Block Entity float DEFAULT_DISTANCE_BUFFER = 4.0F; int getContainerSize(); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index d3316e443b950e709d7e56266a777d0fc1205c87..f150ccb26cb191f4db68f1f4596eacd62343d117 100644 +index 78d411d860dcdfffc8b3bbc3e08f4d23cd01722d..5645a8ace78e58288887e496ad753e4efe8a9367 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -311,7 +311,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -325,7 +325,7 @@ public abstract class Entity private static final EntityDataAccessor DATA_NO_GRAVITY = SynchedEntityData.defineId(Entity.class, EntityDataSerializers.BOOLEAN); protected static final EntityDataAccessor DATA_POSE = SynchedEntityData.defineId(Entity.class, EntityDataSerializers.POSE); public static final EntityDataAccessor DATA_TICKS_FROZEN = SynchedEntityData.defineId(Entity.class, EntityDataSerializers.INT); @@ -123,7 +111,7 @@ index d3316e443b950e709d7e56266a777d0fc1205c87..f150ccb26cb191f4db68f1f4596eacd6 private final VecDeltaCodec packetPositionCodec = new VecDeltaCodec(); public boolean needsSync; public @Nullable PortalProcessor portalProcess; -@@ -5133,6 +5133,19 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -5064,6 +5064,19 @@ public abstract class Entity this.setBoundingBox(this.makeBoundingBox()); } // Paper end - Block invalid positions and bounding box @@ -144,7 +132,7 @@ index d3316e443b950e709d7e56266a777d0fc1205c87..f150ccb26cb191f4db68f1f4596eacd6 public void checkDespawn() { diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index 80f9c003b125a3af29c1456b6f796a43954a9aad..eeb34a80c1bb491caa60526c1c09e5d91c3bf373 100644 +index 45c491d2f234b6db9a88aab2cda6b423c7fd11e4..d382e9ad5cb8f6ab4abf0cfab51c13bb57227ba3 100644 --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java @@ -34,8 +34,12 @@ import net.minecraft.world.level.storage.ValueInput; @@ -161,20 +149,20 @@ index 80f9c003b125a3af29c1456b6f796a43954a9aad..eeb34a80c1bb491caa60526c1c09e5d9 private static final EntityDataAccessor DATA_ITEM = SynchedEntityData.defineId(ItemEntity.class, EntityDataSerializers.ITEM_STACK); private static final float FLOAT_HEIGHT = 0.1F; public static final float EYE_HEIGHT = 0.2125F; -@@ -522,6 +526,25 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -535,6 +539,25 @@ public class ItemEntity extends Entity implements TraceableEntity { } - public void setItem(ItemStack stack) { + public void setItem(final ItemStack itemStack) { + // Leaves start - Lithium Sleeping Block Entity + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.subscriber != null) { + ItemStack oldStack = this.getItem(); -+ if (oldStack != stack) { ++ if (oldStack != itemStack) { + if (!oldStack.isEmpty()) { + oldStack.lithium$unsubscribe(this); + } + -+ if (!stack.isEmpty()) { -+ stack.lithium$subscribe(this, this.subscriberData); ++ if (!itemStack.isEmpty()) { ++ itemStack.lithium$subscribe(this, this.subscriberData); + this.subscriber.lithium$notify((ItemEntity) (Object) this, this.subscriberData); + } else { + this.subscriber.lithium$forceUnsubscribe((ItemEntity) (Object) this, this.subscriberData); @@ -184,11 +172,11 @@ index 80f9c003b125a3af29c1456b6f796a43954a9aad..eeb34a80c1bb491caa60526c1c09e5d9 + } + } + // Leaves end - Lithium Sleeping Block Entity - this.getEntityData().set(DATA_ITEM, stack); - this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate + this.getEntityData().set(DATA_ITEM, itemStack); + this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(itemStack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate } -@@ -597,4 +620,76 @@ public class ItemEntity extends Entity implements TraceableEntity { - public @Nullable SlotAccess getSlot(int slot) { +@@ -602,4 +625,76 @@ public class ItemEntity extends Entity implements TraceableEntity { + public @Nullable SlotAccess getSlot(final int slot) { return slot == 0 ? SlotAccess.of(this::getItem, this::setItem) : super.getSlot(slot); } + @@ -265,10 +253,10 @@ index 80f9c003b125a3af29c1456b6f796a43954a9aad..eeb34a80c1bb491caa60526c1c09e5d9 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java -index da1cfc043e261e7ed7bc85fa1e5e7ee2e2078630..22567f12fe9b3a3c7f8988bb196e78e804bcfd6f 100644 +index 918b20be69b9961b3d9c0f1d4f8d0866e33a2745..a97a58923fa5455c5af3562f66a824a7a6ef98d9 100644 --- a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java +++ b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecartContainer.java -@@ -22,7 +22,7 @@ import net.minecraft.world.level.storage.loot.LootTable; +@@ -23,7 +23,7 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.phys.Vec3; import org.jspecify.annotations.Nullable; @@ -277,7 +265,7 @@ index da1cfc043e261e7ed7bc85fa1e5e7ee2e2078630..22567f12fe9b3a3c7f8988bb196e78e8 private NonNullList itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); // CraftBukkit - SPIGOT-3513 public @Nullable ResourceKey lootTable; public long lootTableSeed; -@@ -221,4 +221,15 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme +@@ -222,4 +222,15 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme return this.getBukkitEntity().getLocation(); } // CraftBukkit end @@ -294,22 +282,22 @@ index da1cfc043e261e7ed7bc85fa1e5e7ee2e2078630..22567f12fe9b3a3c7f8988bb196e78e8 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java -index 38af11add6b97a34c406e86278008c2652c241a1..792f37d1f4288be88d83eb25ccf5e3c5cb4eeb8c 100644 +index ea4d896148b4d5886a73a7d1214c552122106332..267e943db7ddfbfc87a174f6bd7dc0c3203b598f 100644 --- a/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/net/minecraft/world/inventory/AbstractContainerMenu.java -@@ -915,6 +915,7 @@ public abstract class AbstractContainerMenu { - } else { - float f = 0.0F; +@@ -918,6 +918,7 @@ public abstract class AbstractContainerMenu { + } + + float totalPercent = 0.0F; ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && container instanceof org.leavesmc.leaves.lithium.api.inventory.LithiumInventory optimizedInventory) return org.leavesmc.leaves.lithium.common.hopper.InventoryHelper.getLithiumStackList(optimizedInventory).getSignalStrength(container); // Leaves - Lithium Sleeping Block Entity -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && container instanceof org.leavesmc.leaves.lithium.api.inventory.LithiumInventory optimizedInventory) return org.leavesmc.leaves.lithium.common.hopper.InventoryHelper.getLithiumStackList(optimizedInventory).getSignalStrength(container); // Leaves - Lithium Sleeping Block Entity - for (int i = 0; i < container.getContainerSize(); i++) { - ItemStack item = container.getItem(i); - if (!item.isEmpty()) { + for (int i = 0; i < container.getContainerSize(); i++) { + ItemStack itemStack = container.getItem(i); diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index f0a27175e044f49f47ac012e0d81b61832ff5af5..16f219534e1118ff2d7ce6a447917d405eb19d5c 100644 +index c2a35843e7f56ec9df5872d07277c06a47fe1d41..82c67dca06c213be92f59e2e248fc835a241c73c 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -101,8 +101,12 @@ import org.apache.commons.lang3.function.TriConsumer; +@@ -99,8 +99,12 @@ import org.apache.commons.lang3.function.TriConsumer; import org.apache.commons.lang3.mutable.MutableBoolean; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; @@ -318,23 +306,23 @@ index f0a27175e044f49f47ac012e0d81b61832ff5af5..16f219534e1118ff2d7ce6a447917d40 +import org.leavesmc.leaves.lithium.common.util.change_tracking.ChangeSubscriber; +// Leaves end - Lithium Sleeping Block Entity --public final class ItemStack implements DataComponentHolder { -+public final class ItemStack implements DataComponentHolder, ChangePublisher, ChangeSubscriber { // Leaves - Lithium Sleeping Block Entity +-public final class ItemStack implements DataComponentHolder, ItemInstance { ++public final class ItemStack implements DataComponentHolder, ItemInstance, ChangePublisher, ChangeSubscriber { // Leaves - Lithium Sleeping Block Entity private static final List OP_NBT_WARNING = List.of( Component.translatable("item.op_warning.line1").withStyle(ChatFormatting.RED, ChatFormatting.BOLD), Component.translatable("item.op_warning.line2").withStyle(ChatFormatting.RED), -@@ -1018,6 +1022,7 @@ public final class ItemStack implements DataComponentHolder { +@@ -1021,6 +1025,7 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { // CraftBukkit end - public @Nullable T set(DataComponentType component, @Nullable T value) { -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && component == DataComponents.ENCHANTMENTS && this.subscriber instanceof ChangeSubscriber.EnchantmentSubscriber enchantmentSubscriber) enchantmentSubscriber.lithium$notifyAfterEnchantmentChange(this, this.subscriberData); // Leaves - Lithium Sleeping Block Entity - return this.components.set(component, value); + public @Nullable T set(final DataComponentType type, final @Nullable T value) { ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && type == DataComponents.ENCHANTMENTS && this.subscriber instanceof ChangeSubscriber.EnchantmentSubscriber enchantmentSubscriber) enchantmentSubscriber.lithium$notifyAfterEnchantmentChange(this, this.subscriberData); // Leaves - Lithium Sleeping Block Entity + return this.components.set(type, value); } -@@ -1366,6 +1371,23 @@ public final class ItemStack implements DataComponentHolder { +@@ -1359,6 +1364,23 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { } - public void setCount(int count) { + public void setCount(final int count) { + // Leaves start - Lithium Sleeping Block Entity + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && count != this.count) { + if (this.subscriber instanceof ChangeSubscriber.CountChangeSubscriber countChangeSubscriber) { @@ -355,9 +343,9 @@ index f0a27175e044f49f47ac012e0d81b61832ff5af5..16f219534e1118ff2d7ce6a447917d40 this.count = count; } -@@ -1434,4 +1456,90 @@ public final class ItemStack implements DataComponentHolder { +@@ -1426,4 +1448,90 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { .or(() -> Optional.ofNullable(this.getItem().getItemDamageSource(attacker))) - .orElseGet(fallback); + .orElseGet(defaultSource); } + + // Leaves start - Lithium Sleeping Block Entity @@ -447,33 +435,32 @@ index f0a27175e044f49f47ac012e0d81b61832ff5af5..16f219534e1118ff2d7ce6a447917d40 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 6b9f1e5421a66c0a42f93c66a61c0fbecc913a16..92747bbf355aa135a38df47cf7770bf74ab40dc9 100644 +index 961bc61685e2b6f6d38aeb770018beb634378427..0781232b9ed97aa5373a31866dc9c81cfd77462b 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -1183,6 +1183,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - if ((flags & Block.UPDATE_KNOWN_SHAPE) == 0 && recursionLeft > 0) { +@@ -1190,6 +1190,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + int neighbourUpdateFlags = updateFlags & ~(Block.UPDATE_SUPPRESS_DROPS | Block.UPDATE_NEIGHBORS); // Leaves start - no block update if (org.leavesmc.leaves.command.leaves.subcommands.BlockUpdateCommand.isNoBlockUpdate()) { -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) org.leavesmc.leaves.lithium.common.hopper.HopperHelper.updateHopperOnUpdateSuppression(this, pos, flags, chunkAt, oldState != currentState); // Leaves - Lithium Sleeping Block Entity - this.updatePOIOnBlockStateChange(pos, blockState, blockState1); ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) org.leavesmc.leaves.lithium.common.hopper.HopperHelper.updateHopperOnUpdateSuppression(this, pos, updateFlags, chunk, oldState != newState); // Leaves - Lithium Sleeping Block Entity + this.updatePOIOnBlockStateChange(pos, oldState, newState); return; } -@@ -1434,7 +1435,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - // Spigot end - if (tickingBlockEntity.isRemoved()) { - toRemove.add(tickingBlockEntity); // Paper - Fix MC-117075; use removeAll -- } else if (runsNormally && this.shouldTickBlocksAt(tickingBlockEntity.getPos())) { -+ } else if (runsNormally && this.shouldTickBlockPosFilterNull(tickingBlockEntity.getPos())) { // Leaves - Lithium Sleeping Block Entity - tickingBlockEntity.tick(); +@@ -1524,7 +1525,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + // Paper end - Fix MC-117075 use removeAll + if (ticker.isRemoved()) { + toRemove.add(ticker); // Paper - Fix MC-117075 use removeAll +- } else if (tickBlockEntities && this.shouldTickBlocksAt(ticker.getPos())) { ++ } else if (tickBlockEntities && this.shouldTickBlockPosFilterNull(ticker.getPos())) { // Leaves - Lithium Sleeping Block Entity + ticker.tick(); // Paper start - rewrite chunk system if ((++tickedEntities & 7) == 0) { -@@ -2116,4 +2117,25 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - return this.moonrise$getEntityLookup().getEntityCount(); // Paper - rewrite chunk system +@@ -1580,6 +1581,27 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + return this.shouldTickBlocksAt(ChunkPos.pack(pos)); } - // Paper end - allow patching this logic -+ + + // Leaves start - Lithium Sleeping Block Entity -+ public BlockEntity lithium$getLoadedExistingBlockEntity(BlockPos pos) { ++ public @org.jspecify.annotations.Nullable BlockEntity lithium$getLoadedExistingBlockEntity(BlockPos pos) { + if (!this.isOutsideBuildHeight(pos)) { + if (this.isClientSide || Thread.currentThread() == this.thread) { + ChunkAccess chunk = this.getChunk(SectionPos.blockToSectionCoord(pos.getX()), SectionPos.blockToSectionCoord(pos.getZ()), ChunkStatus.FULL, false); @@ -492,12 +479,15 @@ index 6b9f1e5421a66c0a42f93c66a61c0fbecc913a16..92747bbf355aa135a38df47cf7770bf7 + return shouldTickBlocksAt(pos); + } + // Leaves end - Lithium Sleeping Block Entity - } ++ + public void explode( + final @Nullable Entity source, final double x, final double y, final double z, final float r, final Level.ExplosionInteraction blockInteraction + ) { diff --git a/net/minecraft/world/level/block/ComposterBlock.java b/net/minecraft/world/level/block/ComposterBlock.java -index 429e833ffe7c89d7b0ca7515dbd82ffc1ce8d60d..9fbd9b5d51685fac25fd05ef03276b4b5564c82f 100644 +index 69e3969242ad52168e947af209e6fa72f36178ae..673ae8a3cdc93d9eb9912e7fc4e69a815f90e416 100644 --- a/net/minecraft/world/level/block/ComposterBlock.java +++ b/net/minecraft/world/level/block/ComposterBlock.java -@@ -411,7 +411,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { +@@ -426,7 +426,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { } } @@ -506,7 +496,7 @@ index 429e833ffe7c89d7b0ca7515dbd82ffc1ce8d60d..9fbd9b5d51685fac25fd05ef03276b4b public EmptyContainer(LevelAccessor levelAccessor, BlockPos blockPos) { // CraftBukkit super(0); this.bukkitOwner = new org.bukkit.craftbukkit.inventory.CraftBlockInventoryHolder(levelAccessor, blockPos, this); // CraftBukkit -@@ -433,7 +433,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { +@@ -448,7 +448,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { } } @@ -515,10 +505,10 @@ index 429e833ffe7c89d7b0ca7515dbd82ffc1ce8d60d..9fbd9b5d51685fac25fd05ef03276b4b private final BlockState state; private final LevelAccessor level; private final BlockPos pos; -@@ -479,12 +479,13 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { +@@ -494,12 +494,13 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { } // Paper end - Add CompostItemEvent and EntityCompostItemEvent - this.level.levelEvent(LevelEvent.COMPOSTER_FILL, this.pos, blockState != this.state ? 1 : 0); + this.level.levelEvent(LevelEvent.COMPOSTER_FILL, this.pos, newState != this.state ? 1 : 0); + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) this.changed = false; // Leaves - Lithium Sleeping Block Entity this.removeItemNoUpdate(0); } @@ -531,19 +521,19 @@ index 429e833ffe7c89d7b0ca7515dbd82ffc1ce8d60d..9fbd9b5d51685fac25fd05ef03276b4b private final LevelAccessor level; private final BlockPos pos; diff --git a/net/minecraft/world/level/block/DiodeBlock.java b/net/minecraft/world/level/block/DiodeBlock.java -index 0ca50622be8dc300babc6b01b12eddae7fdd38bc..0d45b5767045c719fec3f07c7e0e956c1901aeee 100644 +index 2322290501c48485457a9f82e57e21901e05a9c4..2e86c1bc9ea24222a4849409a3f3697c8a233522 100644 --- a/net/minecraft/world/level/block/DiodeBlock.java +++ b/net/minecraft/world/level/block/DiodeBlock.java -@@ -174,6 +174,7 @@ public abstract class DiodeBlock extends HorizontalDirectionalBlock { +@@ -177,6 +177,7 @@ public abstract class DiodeBlock extends HorizontalDirectionalBlock { @Override - protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + protected void onPlace(final BlockState state, final Level level, final BlockPos pos, final BlockState oldState, final boolean movedByPiston) { this.updateNeighborsInFront(level, pos, state); + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this instanceof ComparatorBlock && !oldState.is(Blocks.COMPARATOR)) org.leavesmc.leaves.lithium.common.block.entity.inventory_comparator_tracking.ComparatorTracking.notifyNearbyBlockEntitiesAboutNewComparator(level, pos); // Leaves - Lithium Sleeping Block Entity } // Leaves start - behaviour 1.21.1- diff --git a/net/minecraft/world/level/block/HopperBlock.java b/net/minecraft/world/level/block/HopperBlock.java -index 695520463adcc6000ef5a94c86466e93a59af118..cdbcf2edd2f95ee87239aaf7bad26189802115ad 100644 +index b7bbaef98593d5fd73413ad5cd12ce2f7f5f0a49..ec88fcedffe2f9bb85aaf7b56f5247467ed6d49d 100644 --- a/net/minecraft/world/level/block/HopperBlock.java +++ b/net/minecraft/world/level/block/HopperBlock.java @@ -37,7 +37,7 @@ import net.minecraft.world.phys.shapes.Shapes; @@ -555,8 +545,8 @@ index 695520463adcc6000ef5a94c86466e93a59af118..cdbcf2edd2f95ee87239aaf7bad26189 public static final MapCodec CODEC = simpleCodec(HopperBlock::new); public static final EnumProperty FACING = BlockStateProperties.FACING_HOPPER; public static final BooleanProperty ENABLED = BlockStateProperties.ENABLED; -@@ -97,6 +97,17 @@ public class HopperBlock extends BaseEntityBlock { - protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { +@@ -99,6 +99,17 @@ public class HopperBlock extends BaseEntityBlock { + protected void onPlace(final BlockState state, final Level level, final BlockPos pos, final BlockState oldState, final boolean movedByPiston) { if (!oldState.is(state.getBlock())) { this.checkPoweredState(level, pos, state); + // Leaves start - Lithium Sleeping Block Entity @@ -573,16 +563,16 @@ index 695520463adcc6000ef5a94c86466e93a59af118..cdbcf2edd2f95ee87239aaf7bad26189 } } -@@ -111,6 +122,7 @@ public class HopperBlock extends BaseEntityBlock { - - @Override - protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) { -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && level.lithium$getLoadedExistingBlockEntity(pos) instanceof org.leavesmc.leaves.lithium.common.hopper.UpdateReceiver updateReceiver) updateReceiver.lithium$invalidateCacheOnUndirectedNeighborUpdate(); // Leaves - Lithium Sleeping Block Entity /* invalidate cache when the block is replaced */ +@@ -117,6 +128,7 @@ public class HopperBlock extends BaseEntityBlock { + protected void neighborChanged( + final BlockState state, final Level level, final BlockPos pos, final Block block, final @Nullable Orientation orientation, final boolean movedByPiston + ) { ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && level.lithium$getLoadedExistingBlockEntity(pos) instanceof org.leavesmc.leaves.lithium.common.hopper.UpdateReceiver updateReceiver) updateReceiver.lithium$invalidateCacheOnUndirectedNeighborUpdate(); // Leaves - Lithium Sleeping Block Entity this.checkPoweredState(level, pos, state); } -@@ -172,4 +184,25 @@ public class HopperBlock extends BaseEntityBlock { - protected boolean isPathfindable(BlockState state, PathComputationType pathComputationType) { +@@ -185,4 +197,25 @@ public class HopperBlock extends BaseEntityBlock { + protected boolean isPathfindable(final BlockState state, final PathComputationType type) { return false; } + @@ -608,19 +598,19 @@ index 695520463adcc6000ef5a94c86466e93a59af118..cdbcf2edd2f95ee87239aaf7bad26189 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index 5b6baeabc4b09ca59a7a9965692d9307a4d3f397..398767a4e05847e5100e6656af4dfe921f2b1809 100644 +index b6f55df3e3f2752eae10cd0ee1e0c81fc57680c4..b1683002d961f75a7dbdcb6ba1f310b23a0f32cb 100644 --- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -@@ -40,7 +40,7 @@ import net.minecraft.world.level.storage.ValueOutput; +@@ -39,7 +39,7 @@ import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.phys.Vec3; import org.jspecify.annotations.Nullable; --public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeCraftingHolder, StackedContentsCompatible { -+public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, RecipeCraftingHolder, StackedContentsCompatible, org.leavesmc.leaves.lithium.common.block.entity.inventory_change_tracking.InventoryChangeTracker, org.leavesmc.leaves.lithium.common.block.entity.SleepingBlockEntity, org.leavesmc.leaves.lithium.common.block.entity.SetChangedHandlingBlockEntity, org.leavesmc.leaves.lithium.api.inventory.LithiumInventory { // Leaves - Lithium Sleeping Block Entity +-public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, StackedContentsCompatible, RecipeCraftingHolder { ++public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntity implements WorldlyContainer, StackedContentsCompatible, RecipeCraftingHolder, org.leavesmc.leaves.lithium.common.block.entity.inventory_change_tracking.InventoryChangeTracker, org.leavesmc.leaves.lithium.common.block.entity.SleepingBlockEntity, org.leavesmc.leaves.lithium.common.block.entity.SetChangedHandlingBlockEntity, org.leavesmc.leaves.lithium.api.inventory.LithiumInventory { // Leaves - Lithium Sleeping Block Entity protected static final int SLOT_INPUT = 0; protected static final int SLOT_FUEL = 1; protected static final int SLOT_RESULT = 2; -@@ -165,6 +165,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit +@@ -172,6 +172,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit this.recipesUsed.clear(); this.recipesUsed.putAll(input.read("RecipesUsed", RECIPES_USED_CODEC).orElse(Map.of())); this.cookSpeedMultiplier = input.getDoubleOr("Paper.CookSpeedMultiplier", 1); // Paper - cook speed multiplier API @@ -628,15 +618,15 @@ index 5b6baeabc4b09ca59a7a9965692d9307a4d3f397..398767a4e05847e5100e6656af4dfe92 } @Override -@@ -270,6 +271,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit - if (flag) { +@@ -278,6 +279,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit + if (changed) { setChanged(level, pos, state); } -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) furnace.checkSleep(state); // Leaves - Lithium Sleeping Block Entity ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) entity.checkSleep(state); // Leaves - Lithium Sleeping Block Entity } - private static boolean canBurn( -@@ -535,4 +537,53 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit + private static void consumeFuel(final NonNullList items, final ItemStack fuel) { +@@ -519,4 +521,53 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit this.getRecipesToAwardAndPopExperience(serverLevel, Vec3.atCenterOf(pos)); } } @@ -667,7 +657,7 @@ index 5b6baeabc4b09ca59a7a9965692d9307a4d3f397..398767a4e05847e5100e6656af4dfe92 + } + + private void checkSleep(BlockState state) { -+ if (!this.isLit() && this.cookingTimer == 0 && (state.is(Blocks.FURNACE) || state.is(Blocks.BLAST_FURNACE) || state.is(Blocks.SMOKER)) && this.level != null) { ++ if (this.litTimeRemaining <= 0 && this.cookingTimer == 0 && (state.is(net.minecraft.world.level.block.Blocks.FURNACE) || state.is(net.minecraft.world.level.block.Blocks.BLAST_FURNACE) || state.is(net.minecraft.world.level.block.Blocks.SMOKER)) && this.level != null) { // Leaves - Paper 26.1 fix + this.lithium$startSleeping(); + } + } @@ -691,7 +681,7 @@ index 5b6baeabc4b09ca59a7a9965692d9307a4d3f397..398767a4e05847e5100e6656af4dfe92 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -index 6741fe3abc4396236dc0ca31074e36d66e42c39a..780474a3f7b7128ca571356e26d0ae32b848d7b0 100644 +index edcd56b5302e45f59e75c658e3c8bb8042f69d9e..8238e5be408a408fe19b3a50774bd09fab17120c 100644 --- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java @@ -23,7 +23,7 @@ import net.minecraft.world.level.block.state.BlockState; @@ -703,17 +693,17 @@ index 6741fe3abc4396236dc0ca31074e36d66e42c39a..780474a3f7b7128ca571356e26d0ae32 // CraftBukkit start - add fields and methods public java.util.List transaction = new java.util.ArrayList<>(); private int maxStack = MAX_STACK; -@@ -122,6 +122,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -139,6 +139,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @Override - protected void setItems(NonNullList items) { + protected void setItems(final NonNullList items) { this.items = items; + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) this.lithium$emitStackListReplaced(); // Leaves - Lithium Sleeping Block Entity } - // Leaves start - pca -@@ -181,4 +182,18 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { - double d2 = this.worldPosition.getZ() + 0.5 + unitVec3i.getZ() / 2.0; - this.level.playSound(null, d, d1, d2, sound, SoundSource.BLOCKS, 0.5F, this.level.random.nextFloat() * 0.1F + 0.9F); + @Override +@@ -190,4 +191,18 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { + double z = this.worldPosition.getZ() + 0.5 + direction.getZ() / 2.0; + this.level.playSound(null, x, y, z, event, SoundSource.BLOCKS, 0.5F, this.level.getRandom().nextFloat() * 0.1F + 0.9F); } + + // Leaves start - Lithium Sleeping Block Entity @@ -731,7 +721,7 @@ index 6741fe3abc4396236dc0ca31074e36d66e42c39a..780474a3f7b7128ca571356e26d0ae32 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java -index b1be97f37398240ce564aba6c700319243be215c..c49b08aec71c60a1e18476af41891e7af92aa63f 100644 +index a0f2e2356cf81f14783c00394e0f4177a81cedab..e629871cfe21c5a2c9eba61196d38b725936eadf 100644 --- a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java @@ -25,8 +25,17 @@ import net.minecraft.world.level.storage.ValueInput; @@ -749,7 +739,7 @@ index b1be97f37398240ce564aba6c700319243be215c..c49b08aec71c60a1e18476af41891e7a +// Leaves end - Lithium Sleeping Block Entity -public abstract class BaseContainerBlockEntity extends BlockEntity implements Container, MenuProvider, Nameable { -+public abstract class BaseContainerBlockEntity extends BlockEntity implements Container, MenuProvider, Nameable, InventoryChangeEmitter { ++public abstract class BaseContainerBlockEntity extends BlockEntity implements Container, MenuProvider, Nameable, InventoryChangeEmitter { // Leaves - Lithium Sleeping Block Entity public LockCode lockKey = LockCode.NO_LOCK; public @Nullable Component name; @@ -761,7 +751,7 @@ index b1be97f37398240ce564aba6c700319243be215c..c49b08aec71c60a1e18476af41891e7a } @Override -@@ -183,4 +193,97 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co +@@ -183,4 +193,98 @@ public abstract class BaseContainerBlockEntity extends BlockEntity implements Co return org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.worldPosition, this.level); } // CraftBukkit end @@ -858,17 +848,18 @@ index b1be97f37398240ce564aba6c700319243be215c..c49b08aec71c60a1e18476af41891e7a + this.inventoryHandlingTypeListeners.remove(inventoryChangeListener); + } + } ++ // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/BlockEntity.java b/net/minecraft/world/level/block/entity/BlockEntity.java -index fb22ebe9758014ebf2aebcda21155f1c4c83fafe..9bae6fde43ecef2959137c3a791ec76158ac920c 100644 +index 2c9fb60cae8065b1cd70d6ec53122cec9cf7f2a7..a0ef307b92e05cf5130d1115611870f9428c3d5f 100644 --- a/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/net/minecraft/world/level/block/entity/BlockEntity.java -@@ -35,8 +35,16 @@ import net.minecraft.world.level.storage.ValueInput; +@@ -37,8 +37,16 @@ import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; - --public abstract class BlockEntity implements DebugValueSource { +-public abstract class BlockEntity implements DebugValueSource, TypedInstance> { +// Leaves start - Lithium Sleeping Block Entity +import net.minecraft.core.Direction; +import org.leavesmc.leaves.lithium.common.block.entity.inventory_comparator_tracking.ComparatorTracker; @@ -878,19 +869,19 @@ index fb22ebe9758014ebf2aebcda21155f1c4c83fafe..9bae6fde43ecef2959137c3a791ec761 +import org.leavesmc.leaves.lithium.common.block.entity.SetChangedHandlingBlockEntity; +// Leaves end - Lithium Sleeping Block Entity + -+public abstract class BlockEntity implements DebugValueSource, ComparatorTracker, SetBlockStateHandlingBlockEntity, SetChangedHandlingBlockEntity { // Leaves - Lithium Sleeping Block Entity ++public abstract class BlockEntity implements DebugValueSource, TypedInstance>, ComparatorTracker, SetBlockStateHandlingBlockEntity, SetChangedHandlingBlockEntity { // Leaves - Lithium Sleeping Block Entity static boolean ignoreBlockEntityUpdates; // Paper - Perf: Optimize Hoppers // CraftBukkit start - data containers private static final org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry(); -@@ -57,6 +65,7 @@ public abstract class BlockEntity implements DebugValueSource { +@@ -59,6 +67,7 @@ public abstract class BlockEntity implements DebugValueSource, TypedInstance 0) { - blockEntity.fuel--; -@@ -182,6 +184,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements - blockEntity.brewTime = event.getBrewingTime(); // 400 -> event.getTotalBrewTime() // Paper - use brewing time from event ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) entity.wakeUpNow(); // Leaves - Lithium Sleeping Block Entity + setChanged(level, pos, selfState); + } else if (brewable && entity.fuel > 0) { + entity.fuel--; +@@ -183,6 +185,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements + entity.brewTime = event.getBrewingTime(); // 400 -> event.getTotalBrewTime() // Paper - use brewing time from event // CraftBukkit end - blockEntity.ingredient = itemStack1.getItem(); -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) blockEntity.wakeUpNow(); // Leaves - Lithium Sleeping Block Entity - setChanged(level, pos, state); + entity.ingredient = ingredient.getItem(); ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) entity.wakeUpNow(); // Leaves - Lithium Sleeping Block Entity + setChanged(level, pos, selfState); } -@@ -288,6 +291,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements +@@ -301,6 +304,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements } this.fuel = input.getByteOr("Fuel", (byte)0); @@ -1003,10 +994,11 @@ index 5c51ecca91cfbe86bf815f7c3a1d26a23381a7da..8022390f4a6be506d30531a50c53253b } @Override -@@ -344,4 +348,52 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements - } +@@ -347,4 +351,53 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements + protected AbstractContainerMenu createMenu(final int containerId, final Inventory inventory) { + return new BrewingStandMenu(containerId, inventory, this, this.dataAccess); } - // Leaves end - pca ++ + // Leaves start - Lithium Sleeping Block Entity + private net.minecraft.world.level.chunk.LevelChunk.RebindableTickingBlockEntityWrapper tickWrapper = null; + private TickingBlockEntity sleepingTicker = null; @@ -1057,7 +1049,7 @@ index 5c51ecca91cfbe86bf815f7c3a1d26a23381a7da..8022390f4a6be506d30531a50c53253b + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/CampfireBlockEntity.java b/net/minecraft/world/level/block/entity/CampfireBlockEntity.java -index a27f578eb4d2dbcdb5cd72cb0aa3ec98cdb543c2..5a3457e5a72b1666fccc955aa5522d803e6b6024 100644 +index d32246b37ff8ee597704e1984f06a02c3e420f46..c848aea64f2cfeb4902aa6c6c4b8492a2cb344b0 100644 --- a/net/minecraft/world/level/block/entity/CampfireBlockEntity.java +++ b/net/minecraft/world/level/block/entity/CampfireBlockEntity.java @@ -39,7 +39,7 @@ import net.minecraft.world.level.storage.ValueOutput; @@ -1069,25 +1061,25 @@ index a27f578eb4d2dbcdb5cd72cb0aa3ec98cdb543c2..5a3457e5a72b1666fccc955aa5522d80 private static final Logger LOGGER = LogUtils.getLogger(); private static final int BURN_COOL_SPEED = 2; private static final int NUM_SLOTS = 4; -@@ -113,7 +113,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { +@@ -111,7 +111,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { - if (flag) { + if (changed) { setChanged(level, pos, state); - } -+ } else if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) campfire.lithium$startSleeping(); // Leaves - Lithium Sleeping Block Entity ++ } else if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) entity.lithium$startSleeping(); // Leaves - Lithium Sleeping Block Entity } - public static void cooldownTick(Level level, BlockPos pos, BlockState state, CampfireBlockEntity blockEntity) { -@@ -128,7 +128,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { + public static void cooldownTick(final Level level, final BlockPos pos, final BlockState state, final CampfireBlockEntity entity) { +@@ -126,7 +126,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { - if (flag) { + if (changed) { setChanged(level, pos, state); - } -+ } else if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) blockEntity.lithium$startSleeping(); // Leaves - Lithium Sleeping Block Entity ++ } else if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) entity.lithium$startSleeping(); // Leaves - Lithium Sleeping Block Entity } - public static void particleTick(Level level, BlockPos pos, BlockState state, CampfireBlockEntity blockEntity) { -@@ -184,6 +184,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { + public static void particleTick(final Level level, final BlockPos pos, final BlockState state, final CampfireBlockEntity entity) { +@@ -183,6 +183,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { System.arraycopy(cookingState, 0, this.stopCooking, 0, Math.min(this.stopCooking.length, bytes.capacity())); }); // Paper end - Add more Campfire API @@ -1095,16 +1087,16 @@ index a27f578eb4d2dbcdb5cd72cb0aa3ec98cdb543c2..5a3457e5a72b1666fccc955aa5522d80 } @Override -@@ -238,6 +239,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { - this.cookingTime[i] = event.getTotalCookTime(); // i -> event.getTotalCookTime() +@@ -234,6 +235,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { + this.cookingTime[slot] = event.getTotalCookTime(); // recipe.get().value().cookingTime() -> event.getTotalCookTime() // CraftBukkit end - this.cookingProgress[i] = 0; + this.cookingProgress[slot] = 0; + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) this.wakeUpNow(); // Leaves - Lithium Sleeping Block Entity - this.items.set(i, stack.consumeAndReturn(1, entity)); - level.gameEvent(GameEvent.BLOCK_CHANGE, this.getBlockPos(), GameEvent.Context.of(entity, this.getBlockState())); + this.items.set(slot, placeItem.consumeAndReturn(1, sourceEntity)); + serverLevel.gameEvent(GameEvent.BLOCK_CHANGE, this.getBlockPos(), GameEvent.Context.of(sourceEntity, this.getBlockState())); this.markUpdated(); -@@ -281,4 +283,30 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { - public void removeComponentsFromTag(ValueOutput output) { +@@ -277,4 +279,30 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { + public void removeComponentsFromTag(final ValueOutput output) { output.discard("Items"); } + @@ -1135,7 +1127,7 @@ index a27f578eb4d2dbcdb5cd72cb0aa3ec98cdb543c2..5a3457e5a72b1666fccc955aa5522d80 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/net/minecraft/world/level/block/entity/ChestBlockEntity.java -index 5b209de34bd425bf6c209a5317603f1c6d7280bf..4e294825c2e8c15839629eadeb3ee956d7180bef 100644 +index 884467b40c4b4bd26feaf68532be9ac7dd18120a..c15fe9ab3fc38b8f41ecc777e7ddc6014d706a9f 100644 --- a/net/minecraft/world/level/block/entity/ChestBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ChestBlockEntity.java @@ -25,7 +25,7 @@ import net.minecraft.world.level.block.state.properties.ChestType; @@ -1147,33 +1139,33 @@ index 5b209de34bd425bf6c209a5317603f1c6d7280bf..4e294825c2e8c15839629eadeb3ee956 private static final int EVENT_SET_OPEN_COUNT = 1; public static final Component DEFAULT_NAME = Component.translatable("container.chest"); private NonNullList items = NonNullList.withSize(27, ItemStack.EMPTY); -@@ -133,6 +133,7 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement +@@ -150,6 +150,7 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement - public static void lidAnimateTick(Level level, BlockPos pos, BlockState state, ChestBlockEntity blockEntity) { - blockEntity.chestLidController.tickLid(); -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) blockEntity.checkSleep(); // Leaves - Lithium Sleeping Block Entity + public static void lidAnimateTick(final Level level, final BlockPos pos, final BlockState state, final ChestBlockEntity entity) { + entity.chestLidController.tickLid(); ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) entity.checkSleep(); // Leaves - Lithium Sleeping Block Entity } - public static void playSound(Level level, BlockPos pos, BlockState state, SoundEvent sound) { -@@ -154,6 +155,7 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement + public static void playSound(final Level level, final BlockPos worldPosition, final BlockState blockState, final SoundEvent event) { +@@ -171,6 +172,7 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement @Override - public boolean triggerEvent(int id, int type) { - if (id == 1) { + public boolean triggerEvent(final int b0, final int b1) { + if (b0 == 1) { + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.sleepingTicker != null) this.wakeUpNow(); // Leaves - Lithium Sleeping Block Entity - this.chestLidController.shouldBeOpen(type > 0); + this.chestLidController.shouldBeOpen(b1 > 0); return true; } else { -@@ -189,6 +191,7 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement +@@ -208,6 +210,7 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement @Override - protected void setItems(NonNullList items) { + protected void setItems(final NonNullList items) { this.items = items; + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) this.lithium$emitStackListReplaced(); // Leaves - Lithium Sleeping Block Entity } @Override -@@ -239,4 +242,52 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement - Block block = state.getBlock(); - level.blockEvent(pos, block, 1, eventParam); +@@ -248,4 +251,52 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement + Block block = blockState.getBlock(); + level.blockEvent(pos, block, 1, current); } + + // Leaves start - Lithium Sleeping Block Entity @@ -1225,7 +1217,7 @@ index 5b209de34bd425bf6c209a5317603f1c6d7280bf..4e294825c2e8c15839629eadeb3ee956 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java b/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java -index 25cde0c41ef94f9fb602ed346baad7b4b0ae77f9..a5ca4fd18d4a7f66b41392627f63e61c6762e0e9 100644 +index c9151d1572b2c5fc0f19575f19c20cbdf09c5daa..bf502c056faafae0a9e885e3c0f729b1fc518367 100644 --- a/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java @@ -22,7 +22,7 @@ import net.minecraft.world.level.storage.ValueInput; @@ -1238,14 +1230,14 @@ index 25cde0c41ef94f9fb602ed346baad7b4b0ae77f9..a5ca4fd18d4a7f66b41392627f63e61c private static final Logger LOGGER = LogUtils.getLogger(); private static final int DEFAULT_LAST_INTERACTED_SLOT = -1; @@ -171,4 +171,6 @@ public class ChiseledBookShelfBlockEntity extends BlockEntity implements ListBac - public void removeComponentsFromTag(ValueOutput output) { + public void removeComponentsFromTag(final ValueOutput output) { output.discard("Items"); } + + @Override public boolean lithium$itemInsertionTestRequiresStackSize1() {return true;} // Leaves - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/CrafterBlockEntity.java b/net/minecraft/world/level/block/entity/CrafterBlockEntity.java -index ffb5f2a07afcd6a3df0442ba48faa1557184d27c..2fa18d7dbfeccade1d47c7e8c4f1e13503c14210 100644 +index 1ceda6b26a559d21270e0c137157c4311d5fc261..40ca51b01f9cb3bc594ba9834a341c445070c516 100644 --- a/net/minecraft/world/level/block/entity/CrafterBlockEntity.java +++ b/net/minecraft/world/level/block/entity/CrafterBlockEntity.java @@ -23,7 +23,7 @@ import net.minecraft.world.level.block.state.BlockState; @@ -1253,7 +1245,7 @@ index ffb5f2a07afcd6a3df0442ba48faa1557184d27c..2fa18d7dbfeccade1d47c7e8c4f1e135 import net.minecraft.world.level.storage.ValueOutput; -public class CrafterBlockEntity extends RandomizableContainerBlockEntity implements CraftingContainer { -+public class CrafterBlockEntity extends RandomizableContainerBlockEntity implements CraftingContainer, org.leavesmc.leaves.lithium.common.block.entity.SleepingBlockEntity, org.leavesmc.leaves.lithium.common.block.entity.SetChangedHandlingBlockEntity { ++public class CrafterBlockEntity extends RandomizableContainerBlockEntity implements CraftingContainer, org.leavesmc.leaves.lithium.common.block.entity.SleepingBlockEntity, org.leavesmc.leaves.lithium.common.block.entity.SetChangedHandlingBlockEntity { // Leaves - Lithium Sleeping Block Entity public static final int CONTAINER_WIDTH = 3; public static final int CONTAINER_HEIGHT = 3; public static final int CONTAINER_SIZE = 9; @@ -1266,21 +1258,21 @@ index ffb5f2a07afcd6a3df0442ba48faa1557184d27c..2fa18d7dbfeccade1d47c7e8c4f1e135 @Override @@ -280,10 +281,12 @@ public class CrafterBlockEntity extends RandomizableContainerBlockEntity impleme - level.setBlock(pos, state.setValue(CrafterBlock.CRAFTING, false), Block.UPDATE_ALL); + level.setBlock(blockPos, blockState.setValue(CrafterBlock.CRAFTING, false), Block.UPDATE_ALL); } } -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && i < 0) crafter.checkSleep(); // Leaves - Lithium Sleeping Block Entity ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && craftingTicksRemaining < 0) entity.checkSleep(); // Leaves - Lithium Sleeping Block Entity } - public void setCraftingTicksRemaining(int craftingTicksRemaining) { - this.craftingTicksRemaining = craftingTicksRemaining; + public void setCraftingTicksRemaining(final int maxCraftingTicks) { + this.craftingTicksRemaining = maxCraftingTicks; + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.isSleeping() && this.level != null) this.wakeUpNow(); // Leaves - Lithium Sleeping Block Entity } public int getRedstoneSignal() { @@ -302,4 +305,43 @@ public class CrafterBlockEntity extends RandomizableContainerBlockEntity impleme - private boolean slotCanBeDisabled(int slot) { - return slot > -1 && slot < 9 && this.items.get(slot).isEmpty(); + private boolean slotCanBeDisabled(final int slotId) { + return slotId > -1 && slotId < 9 && this.items.get(slotId).isEmpty(); } + + // Leaves start - Lithium Sleeping Block Entity @@ -1323,7 +1315,7 @@ index ffb5f2a07afcd6a3df0442ba48faa1557184d27c..2fa18d7dbfeccade1d47c7e8c4f1e135 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/DispenserBlockEntity.java b/net/minecraft/world/level/block/entity/DispenserBlockEntity.java -index 2fbfe925c81126cb99a4330a232d7d1b1f035973..36445dbf5e4691ce32ef996d32fbb228226a1f87 100644 +index 37911a7187a029ca5e51224adf3696c4da24a2d7..a112b9b78e8b0f7f6dbab41d0450367b24603f1f 100644 --- a/net/minecraft/world/level/block/entity/DispenserBlockEntity.java +++ b/net/minecraft/world/level/block/entity/DispenserBlockEntity.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.BlockState; @@ -1337,14 +1329,14 @@ index 2fbfe925c81126cb99a4330a232d7d1b1f035973..36445dbf5e4691ce32ef996d32fbb228 private NonNullList items = NonNullList.withSize(9, ItemStack.EMPTY); @@ -145,10 +145,23 @@ public class DispenserBlockEntity extends RandomizableContainerBlockEntity { @Override - protected void setItems(NonNullList items) { + protected void setItems(final NonNullList items) { this.items = items; + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) this.lithium$emitStackListReplaced(); // Leaves - Lithium Sleeping Block Entity } @Override - protected AbstractContainerMenu createMenu(int id, Inventory player) { - return new DispenserMenu(id, player, this); + protected AbstractContainerMenu createMenu(final int containerId, final Inventory inventory) { + return new DispenserMenu(containerId, inventory, this); } + + // Leaves start - Lithium Sleeping Block Entity @@ -1360,7 +1352,7 @@ index 2fbfe925c81126cb99a4330a232d7d1b1f035973..36445dbf5e4691ce32ef996d32fbb228 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/EnderChestBlockEntity.java b/net/minecraft/world/level/block/entity/EnderChestBlockEntity.java -index 775928cfe700202a70b19589ca72afd9768b62f1..c87e57f4f0aa2ffcf5531a55d971c8042a1b3eaf 100644 +index 551149b8888d78fc17b153a59532ed08e7f5724b..a8573190d1c2fe39ba43d9d2012bffef174e3447 100644 --- a/net/minecraft/world/level/block/entity/EnderChestBlockEntity.java +++ b/net/minecraft/world/level/block/entity/EnderChestBlockEntity.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.Level; @@ -1371,24 +1363,24 @@ index 775928cfe700202a70b19589ca72afd9768b62f1..c87e57f4f0aa2ffcf5531a55d971c804 +public class EnderChestBlockEntity extends BlockEntity implements LidBlockEntity, org.leavesmc.leaves.lithium.common.block.entity.SleepingBlockEntity { // Leaves - Lithium Sleeping Block Entity private final ChestLidController chestLidController = new ChestLidController(); public final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() { - @Override -@@ -58,11 +58,13 @@ public class EnderChestBlockEntity extends BlockEntity implements LidBlockEntity + // Paper start - delay open/close callbacks +@@ -65,11 +65,13 @@ public class EnderChestBlockEntity extends BlockEntity implements LidBlockEntity - public static void lidAnimateTick(Level level, BlockPos pos, BlockState state, EnderChestBlockEntity blockEntity) { - blockEntity.chestLidController.tickLid(); -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) blockEntity.checkSleep(); // Leaves - Lithium Sleeping Block Entity + public static void lidAnimateTick(final Level level, final BlockPos pos, final BlockState state, final EnderChestBlockEntity entity) { + entity.chestLidController.tickLid(); ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) entity.checkSleep(); // Leaves - Lithium Sleeping Block Entity } @Override - public boolean triggerEvent(int id, int type) { - if (id == 1) { + public boolean triggerEvent(final int b0, final int b1) { + if (b0 == 1) { + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.sleepingTicker != null) this.wakeUpNow(); // Leaves - Lithium Sleeping Block Entity - this.chestLidController.shouldBeOpen(type > 0); + this.chestLidController.shouldBeOpen(b1 > 0); return true; } else { -@@ -99,4 +101,36 @@ public class EnderChestBlockEntity extends BlockEntity implements LidBlockEntity - public float getOpenNess(float partialTick) { - return this.chestLidController.getOpenness(partialTick); +@@ -106,4 +108,36 @@ public class EnderChestBlockEntity extends BlockEntity implements LidBlockEntity + public float getOpenNess(final float a) { + return this.chestLidController.getOpenness(a); } + + // Leaves start - Lithium Sleeping Block Entity @@ -1424,7 +1416,7 @@ index 775928cfe700202a70b19589ca72afd9768b62f1..c87e57f4f0aa2ffcf5531a55d971c804 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index bf681157626ce35b5e91ca8d2de49913bbbe2dff..a0f379fbbc926c219f1274e963d65ea348dfdf26 100644 +index 7a29c9815d11fb096662debb37f229c51a4384b8..9aacac7ff96db5face041d15085402eb94280575 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java @@ -27,8 +27,29 @@ import net.minecraft.world.level.storage.ValueInput; @@ -1459,38 +1451,38 @@ index bf681157626ce35b5e91ca8d2de49913bbbe2dff..a0f379fbbc926c219f1274e963d65ea3 public static final int MOVE_ITEM_SPEED = 8; public static final int HOPPER_CONTAINER_SIZE = 5; private static final int[][] CACHED_SLOTS = new int[54][]; -@@ -119,6 +140,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -129,6 +150,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen @Override - public void setBlockState(BlockState blockState) { + public void setBlockState(final BlockState blockState) { + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.level != null && !this.level.isClientSide() && blockState.getValue(HopperBlock.FACING) != this.getBlockState().getValue(HopperBlock.FACING)) this.invalidateCachedData(); // Leaves - Lithium Sleeping Block Entity super.setBlockState(blockState); this.facing = blockState.getValue(HopperBlock.FACING); } -@@ -147,6 +169,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - boolean result = tryMoveItems(level, pos, state, blockEntity, () -> { - return suckInItems(level, blockEntity); - }); -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) blockEntity.checkSleepingConditions(); // Leaves - Lithium Sleeping Block Entity - if (!result && blockEntity.level.spigotConfig.hopperCheck > 1) { - blockEntity.setCooldown(blockEntity.level.spigotConfig.hopperCheck); +@@ -145,6 +167,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + entity.setCooldown(0); + // Spigot start + boolean result = tryMoveItems(level, pos, state, entity, () -> suckInItems(level, entity)); ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) entity.checkSleepingConditions(); // Leaves - Lithium Sleeping Block Entity + if (!result && entity.level.spigotConfig.hopperCheck > 1) { + entity.setCooldown(entity.level.spigotConfig.hopperCheck); } -@@ -236,6 +259,14 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(blockEntity); +@@ -237,6 +260,14 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + org.leavesmc.leaves.protocol.PcaSyncProtocol.syncBlockEntityToClient(entity); } // Leaves end - pca + // Leaves start - Lithium Sleeping Block Entity + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity -+ && !blockEntity.isOnCooldown() -+ && !blockEntity.isSleeping() ++ && !entity.isOnCooldown() ++ && !entity.isSleeping() + && !state.getValue(HopperBlock.ENABLED)) { -+ blockEntity.lithium$startSleeping(); ++ entity.lithium$startSleeping(); + } + // Leaves end - Lithium Sleeping Block Entity - return true; - } + return true; } -@@ -434,6 +465,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + } +@@ -431,6 +462,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen private static void applyCooldown(final Hopper hopper) { if (hopper instanceof HopperBlockEntity blockEntity && blockEntity.getLevel() != null) { blockEntity.setCooldown(blockEntity.getLevel().spigotConfig.hopperTransfer); @@ -1498,101 +1490,102 @@ index bf681157626ce35b5e91ca8d2de49913bbbe2dff..a0f379fbbc926c219f1274e963d65ea3 } } -@@ -484,11 +516,19 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -481,12 +513,20 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } } // Leaves end - hopper counter -- Container attachedContainer = getAttachedContainer(level, pos, blockEntity); -+ Container attachedContainer = org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity ? blockEntity.getInsertInventory(level) : getAttachedContainer(level, pos, blockEntity); // Leaves - Lithium Sleeping Block Entity - if (attachedContainer == null) { +- Container container = getAttachedContainer(level, blockPos, self); ++ Container container = org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity ? self.getInsertInventory(level) : getAttachedContainer(level, blockPos, self); // Leaves - Lithium Sleeping Block Entity + if (container == null) { return false; - } else { - Direction opposite = blockEntity.facing.getOpposite(); -+ // Leaves start - Lithium Sleeping Block Entity -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) { -+ Boolean res = lithiumInsert(level, pos, blockEntity, attachedContainer); -+ if (res != null) { -+ return res; -+ } + } + + Direction direction = self.facing.getOpposite(); ++ // Leaves start - Lithium Sleeping Block Entity ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) { ++ Boolean res = lithiumInsert(level, blockPos, self, container); ++ if (res != null) { ++ return res; + } -+ // Leaves end - Lithium Sleeping Block Entity - if (isFullContainer(attachedContainer, opposite)) { - return false; - } else { -@@ -617,10 +657,18 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - public static boolean suckInItems(Level level, Hopper hopper) { ++ } ++ // Leaves end - Lithium Sleeping Block Entity + if (isFullContainer(container, direction)) { + return false; + } +@@ -561,10 +601,18 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + public static boolean suckInItems(final Level level, final Hopper hopper) { BlockPos blockPos = BlockPos.containing(hopper.getLevelX(), hopper.getLevelY() + 1.0, hopper.getLevelZ()); BlockState blockState = level.getBlockState(blockPos); -- Container sourceContainer = getSourceContainer(level, hopper, blockPos, blockState); -+ Container sourceContainer = org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity ? getExtractInventory(level, hopper, blockPos, blockState) : getSourceContainer(level, hopper, blockPos, blockState); // Leaves - Lithium Sleeping Block Entity - if (sourceContainer != null) { +- Container container = getSourceContainer(level, hopper, blockPos, blockState); ++ Container container = org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity ? getExtractInventory(level, hopper, blockPos, blockState) : getSourceContainer(level, hopper, blockPos, blockState); // Leaves - Lithium Sleeping Block Entity + if (container != null) { Direction direction = Direction.DOWN; skipPullModeEventFire = skipHopperEvents; // Paper - Perf: Optimize Hoppers + // Leaves start - Lithium Sleeping Block Entity + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) { -+ Boolean res = lithiumExtract(level, hopper, sourceContainer); ++ Boolean res = lithiumExtract(level, hopper, container); + if (res != null) { + return res; + } + } + // Leaves end - Lithium Sleeping Block Entity - for (int i : getSlots(sourceContainer, direction)) { - if (tryTakeInItemFromSlot(hopper, sourceContainer, i, direction, level)) { // Spigot -@@ -632,7 +680,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - } else { - boolean flag = hopper.isGridAligned() && (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldHopperSuckInBehavior && blockState.isCollisionShapeFullBlock(level, blockPos)) && !blockState.is(BlockTags.DOES_NOT_BLOCK_HOPPERS); // Leaves - oldHopperSuckInBehavior - if (!flag) { -- for (ItemEntity itemEntity : getItemsAtAndAbove(level, hopper)) { -+ for (ItemEntity itemEntity : org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity ? lithiumGetInputItemEntities(level, hopper) : getItemsAtAndAbove(level, hopper)) { // Leaves - Lithium Sleeping Block Entity - if (addItem(hopper, itemEntity)) { + for (int slot : getSlots(container, direction)) { + if (tryTakeInItemFromSlot(hopper, container, slot, direction, level)) { // Spigot +@@ -578,7 +626,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + && (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldHopperSuckInBehavior && blockState.isCollisionShapeFullBlock(level, blockPos)) + && !blockState.is(BlockTags.DOES_NOT_BLOCK_HOPPERS); // Leaves - oldHopperSuckInBehavior + if (!isBlocked) { +- for (ItemEntity entity : getItemsAtAndAbove(level, hopper)) { ++ for (ItemEntity entity : org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity ? lithiumGetInputItemEntities(level, hopper) : getItemsAtAndAbove(level, hopper)) { // Leaves - Lithium Sleeping Block Entity + if (addItem(hopper, entity)) { return true; } -@@ -813,7 +861,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -701,7 +749,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen // CraftBukkit start private static @Nullable Container runHopperInventorySearchEvent( - Container container, -+ @Nullable Container container, ++ @Nullable Container container, // Leaves - Lithium Sleeping Block Entity org.bukkit.craftbukkit.block.CraftBlock hopper, org.bukkit.craftbukkit.block.CraftBlock searchLocation, org.bukkit.event.inventory.HopperInventorySearchEvent.ContainerType containerType -@@ -934,6 +982,19 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -829,6 +877,19 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } - public void setCooldown(int cooldownTime) { + public void setCooldown(final int time) { + // Leaves start - Lithium Sleeping Block Entity + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) { -+ if (cooldownTime == 7) { ++ if (time == 7) { + if (this.tickedGameTime == Long.MAX_VALUE) { + this.sleepOnlyCurrentTick(); + } else { + this.wakeUpNow(); + } -+ } else if (cooldownTime > 0 && this.sleepingTicker != null) { ++ } else if (time > 0 && this.sleepingTicker != null) { + this.wakeUpNow(); + } + } + // Leaves end - Lithium Sleeping Block Entity - this.cooldownTime = cooldownTime; + this.cooldownTime = time; } -@@ -953,6 +1014,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -848,6 +909,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen @Override - protected void setItems(NonNullList items) { + protected void setItems(final NonNullList items) { this.items = items; + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) this.lithium$emitStackListReplaced(); // Leaves - Lithium Sleeping Block Entity } - public static void entityInside(Level level, BlockPos pos, BlockState state, Entity entity, HopperBlockEntity blockEntity) { -@@ -967,4 +1029,757 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - protected AbstractContainerMenu createMenu(int id, Inventory player) { - return new HopperMenu(id, player, this); + public static void entityInside(final Level level, final BlockPos pos, final BlockState blockState, final Entity entity, final HopperBlockEntity hopper) { +@@ -862,4 +924,757 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + protected AbstractContainerMenu createMenu(final int containerId, final Inventory inventory) { + return new HopperMenu(containerId, inventory, this); } + + // Leaves start - Lithium Sleeping Block Entity -+ @org.jetbrains.annotations.Nullable private LevelChunk.RebindableTickingBlockEntityWrapper tickWrapper = null; -+ @org.jetbrains.annotations.Nullable private TickingBlockEntity sleepingTicker = null; ++ private LevelChunk.@org.jspecify.annotations.Nullable RebindableTickingBlockEntityWrapper tickWrapper = null; // Leaves - Paper 26.1 fix ++ @Nullable private TickingBlockEntity sleepingTicker = null; + private long myModCountAtLastInsert, myModCountAtLastExtract, myModCountAtLastItemCollect; + private boolean skipNextSleepCheckAfterCooldown = false; + @@ -1739,7 +1732,7 @@ index bf681157626ce35b5e91ca8d2de49913bbbe2dff..a0f379fbbc926c219f1274e963d65ea3 + } + + @Override -+ public @org.jetbrains.annotations.Nullable LevelChunk.RebindableTickingBlockEntityWrapper lithium$getTickWrapper() { ++ public LevelChunk.@org.jspecify.annotations.Nullable RebindableTickingBlockEntityWrapper lithium$getTickWrapper() { // Leaves - Paper 26.1 fix + return tickWrapper; + } + @@ -2028,7 +2021,7 @@ index bf681157626ce35b5e91ca8d2de49913bbbe2dff..a0f379fbbc926c219f1274e963d65ea3 + //Remember failed entity search timestamp. This allows shortcutting if no entity movement happens. + return null; + } -+ Container inventory = inventoryEntities.get(world.random.nextInt(inventoryEntities.size())); ++ Container inventory = inventoryEntities.get(world.getRandom().nextInt(inventoryEntities.size())); // Leaves - Paper 26.1 fix + if (inventory instanceof LithiumInventory optimizedInventory) { + LithiumStackList insertInventoryStackList = InventoryHelper.getLithiumStackList(optimizedInventory); + if (inventory != this.insertInventory || this.insertStackList != insertInventoryStackList) { @@ -2094,7 +2087,7 @@ index bf681157626ce35b5e91ca8d2de49913bbbe2dff..a0f379fbbc926c219f1274e963d65ea3 + //shortcutting the entity present case requires checking its change counter + return null; + } -+ Container inventory = inventoryEntities.get(world.random.nextInt(inventoryEntities.size())); ++ Container inventory = inventoryEntities.get(world.getRandom().nextInt(inventoryEntities.size())); // Leaves - Paper 26.1 fix + if (inventory instanceof LithiumInventory optimizedInventory) { + LithiumStackList extractInventoryStackList = InventoryHelper.getLithiumStackList(optimizedInventory); + if (inventory != this.extractInventory || this.extractStackList != extractInventoryStackList) { @@ -2344,7 +2337,7 @@ index bf681157626ce35b5e91ca8d2de49913bbbe2dff..a0f379fbbc926c219f1274e963d65ea3 + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -index feab1f0d6f89035f6fcc7a568bd287821eb70a5e..c96405d2c5cfa3120e26f5ee58c15e3fc2b208e3 100644 +index 29cefcc20fb5f32404bad07d3fa6ae059b706807..f54a9f02bf9edafd2f96a049ecd23a435b7bf703 100644 --- a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java @@ -32,7 +32,7 @@ import net.minecraft.world.phys.AABB; @@ -2357,7 +2350,7 @@ index feab1f0d6f89035f6fcc7a568bd287821eb70a5e..c96405d2c5cfa3120e26f5ee58c15e3f public static final int ROWS = 3; public static final int CONTAINER_SIZE = 27; @@ -134,6 +134,7 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl - doNeighborUpdates(level, pos, state); + doNeighborUpdates(level, pos, blockState); } } + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.animationStatus == ShulkerBoxBlockEntity.AnimationStatus.CLOSED && this.progressOld == 0.0f && this.progress == 0.0f) this.lithium$startSleeping(); // Leaves - Lithium Sleeping Block Entity @@ -2367,20 +2360,20 @@ index feab1f0d6f89035f6fcc7a568bd287821eb70a5e..c96405d2c5cfa3120e26f5ee58c15e3f @@ -174,6 +175,7 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl @Override - public boolean triggerEvent(int id, int type) { + public boolean triggerEvent(final int b0, final int b1) { + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && this.sleepingTicker != null) this.wakeUpNow(); // Leaves - Lithium Sleeping Block Entity - if (id == 1) { - this.openCount = type; - if (type == 0) { -@@ -265,6 +267,7 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl + if (b0 == 1) { + this.openCount = b1; + if (b1 == 0) { +@@ -279,6 +281,7 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl @Override - protected void setItems(NonNullList items) { + protected void setItems(final NonNullList items) { this.itemStacks = items; + if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) this.lithium$emitStackListReplaced(); // Leaves - Lithium Sleeping Block Entity } - // Leaves start - pca -@@ -315,4 +318,39 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl + @Override +@@ -319,4 +322,39 @@ public class ShulkerBoxBlockEntity extends RandomizableContainerBlockEntity impl OPENED, CLOSING; } @@ -2421,10 +2414,10 @@ index feab1f0d6f89035f6fcc7a568bd287821eb70a5e..c96405d2c5cfa3120e26f5ee58c15e3f + // Leaves end - Lithium Sleeping Block Entity } diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java -index 1d805ccd2bc9d74e8f15db37bcc8146b846e438e..b6e232fa850d4b5aecc4fcf7a5efecee5caac849 100644 +index 1a58fe708e4d69361991e1b5b5b2726955bde25d..3203ec36f7752a105ce78457a224897639a34ac6 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -84,7 +84,7 @@ import net.minecraft.world.phys.shapes.Shapes; +@@ -83,7 +83,7 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import org.jspecify.annotations.Nullable; @@ -2433,48 +2426,46 @@ index 1d805ccd2bc9d74e8f15db37bcc8146b846e438e..b6e232fa850d4b5aecc4fcf7a5efecee protected static final Direction[] UPDATE_SHAPE_ORDER = new Direction[]{ Direction.WEST, Direction.EAST, Direction.NORTH, Direction.SOUTH, Direction.DOWN, Direction.UP }; -@@ -156,6 +156,7 @@ public abstract class BlockBehaviour implements FeatureElement { - BlockState neighborState, - RandomSource random +@@ -157,6 +157,7 @@ public abstract class BlockBehaviour implements FeatureElement { + final BlockState neighbourState, + final RandomSource random ) { -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) this.lithium$handleShapeUpdate(level, state, pos, neighborPos, neighborState); // Leaves - Lithium Sleeping Block Entity /* Triggers when a shape update (= update that observers can detect) is sent */ ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity) this.lithium$handleShapeUpdate(level, state, pos, neighbourPos, neighbourState); // Leaves - Lithium Sleeping Block Entity /* Triggers when a shape update (= update that observers can detect) is sent */ return state; } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index d5a0a2c0a5673088e4ad1e2e7f4fac8a65f68ceb..952311cc4d3dc9e1354bcbd08287005578b6352d 100644 +index 2d14dbbbcfc54cba6034e0a4f28d116b918f7f2f..e96f762a97e7b8dc3b7a152e4bdc89331c9db00a 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -928,12 +928,14 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - (pos, ticker1) -> { - TickingBlockEntity tickingBlockEntity = this.createTicker(blockEntity, ticker); - if (ticker1 != null) { -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && blockEntity instanceof org.leavesmc.leaves.lithium.common.block.entity.SleepingBlockEntity sleepingBlockEntity) sleepingBlockEntity.lithium$setTickWrapper(ticker1); // Leaves - Lithium Sleeping Block Entity - ticker1.rebind(tickingBlockEntity); - return (LevelChunk.RebindableTickingBlockEntityWrapper)ticker1; - } else if (this.isInLevel()) { - LevelChunk.RebindableTickingBlockEntityWrapper rebindableTickingBlockEntityWrapper = new LevelChunk.RebindableTickingBlockEntityWrapper( - tickingBlockEntity - ); -+ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && blockEntity instanceof org.leavesmc.leaves.lithium.common.block.entity.SleepingBlockEntity sleepingBlockEntity) sleepingBlockEntity.lithium$setTickWrapper(rebindableTickingBlockEntityWrapper); // Leaves - Lithium Sleeping Block Entity - this.level.addBlockEntityTicker(rebindableTickingBlockEntityWrapper); - return rebindableTickingBlockEntityWrapper; - } else { +@@ -925,10 +925,12 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot + this.tickersInLevel.compute(blockEntity.getBlockPos(), (blockPos, existingTicker) -> { + TickingBlockEntity actualTicker = this.createTicker(blockEntity, ticker); + if (existingTicker != null) { ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && blockEntity instanceof org.leavesmc.leaves.lithium.common.block.entity.SleepingBlockEntity sleepingBlockEntity) sleepingBlockEntity.lithium$setTickWrapper(existingTicker); // Leaves - Lithium Sleeping Block Entity + existingTicker.rebind(actualTicker); + return (LevelChunk.RebindableTickingBlockEntityWrapper)existingTicker; + } else if (this.isInLevel()) { + LevelChunk.RebindableTickingBlockEntityWrapper result = new LevelChunk.RebindableTickingBlockEntityWrapper(actualTicker); ++ if (org.leavesmc.leaves.LeavesConfig.performance.sleepingBlockEntity && blockEntity instanceof org.leavesmc.leaves.lithium.common.block.entity.SleepingBlockEntity sleepingBlockEntity) sleepingBlockEntity.lithium$setTickWrapper(result); // Leaves - Lithium Sleeping Block Entity + this.level.addBlockEntityTicker(result); + return result; + } else { @@ -1027,14 +1029,14 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot - void run(LevelChunk chunk); + void run(LevelChunk levelChunk); } -- static class RebindableTickingBlockEntityWrapper implements TickingBlockEntity { +- private static class RebindableTickingBlockEntityWrapper implements TickingBlockEntity { - private TickingBlockEntity ticker; + public static class RebindableTickingBlockEntityWrapper implements TickingBlockEntity { // Leaves - default -> public + public TickingBlockEntity ticker; // Leaves - private -> public - RebindableTickingBlockEntityWrapper(TickingBlockEntity ticker) { + private RebindableTickingBlockEntityWrapper(final TickingBlockEntity ticker) { this.ticker = ticker; } -- void rebind(TickingBlockEntity ticker) { -+ public void rebind(TickingBlockEntity ticker) { // Leaves - default -> public +- private void rebind(final TickingBlockEntity ticker) { ++ public void rebind(final TickingBlockEntity ticker) { // Leaves - default -> public this.ticker = ticker; } diff --git a/leaves-server/minecraft-patches/features/0132-Bring-back-LivingEntity-effect-CME.patch b/leaves-server/minecraft-patches/features/0130-Bring-back-LivingEntity-effect-CME.patch similarity index 67% rename from leaves-server/minecraft-patches/features/0132-Bring-back-LivingEntity-effect-CME.patch rename to leaves-server/minecraft-patches/features/0130-Bring-back-LivingEntity-effect-CME.patch index dc7b93feb..4f3d26c54 100644 --- a/leaves-server/minecraft-patches/features/0132-Bring-back-LivingEntity-effect-CME.patch +++ b/leaves-server/minecraft-patches/features/0130-Bring-back-LivingEntity-effect-CME.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Bring back LivingEntity effect CME diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 493bbb6fb85d2b014a9f94a07409c7a73829d234..9c32e5d4d28e035abadf76512181c22e49e11401 100644 +index 45f42b7b08d0ef7127ef94ed19b2535b7ee49e63..b2f5cb5ca2f5b67fa61bf88251557adac3904781 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1161,7 +1161,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - public boolean addEffect(MobEffectInstance effectInstance, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause, boolean fireEvent) { +@@ -1162,7 +1162,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + public boolean addEffect(final MobEffectInstance newEffect, final @Nullable Entity source, final EntityPotionEffectEvent.Cause cause, final boolean fireEvent) { // Paper end - Don't fire sync event during generation // org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot // Paper - move to API - if (this.isTickingEffects) { + if (this.isTickingEffects && cause == org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PLUGIN) { // Leaves - bring back LivingEntity effect CME - this.effectsToProcess.add(new ProcessableEffect(effectInstance, cause)); + this.effectsToProcess.add(new ProcessableEffect(newEffect, cause)); return true; } diff --git a/leaves-server/minecraft-patches/features/0130-Configurable-collision-behavior.patch b/leaves-server/minecraft-patches/features/0130-Configurable-collision-behavior.patch deleted file mode 100644 index 2c034c9df..000000000 --- a/leaves-server/minecraft-patches/features/0130-Configurable-collision-behavior.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Fortern -Date: Thu, 24 Oct 2024 23:10:34 +0800 -Subject: [PATCH] Configurable collision behavior - - -diff --git a/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java b/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java -index de764da80793d272ff597b4a0742ce785838799a..c818a3a64e5f7deadd4a1ca702dd396a7c3fedde 100644 ---- a/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java -+++ b/ca/spottedleaf/moonrise/patches/collisions/CollisionUtil.java -@@ -2022,7 +2022,7 @@ public final class CollisionUtil { - continue; - } - } else { -- if (!voxelShapeIntersect(aabb, singleAABB)) { -+ if (shouldSkip(aabb, singleAABB)) { // Leaves - Configurable collision behavior - continue; - } - } -@@ -2076,6 +2076,16 @@ public final class CollisionUtil { - return ret; - } - -+ // Leaves start - Configurable collision behavior -+ private static boolean shouldSkip(net.minecraft.world.phys.AABB aabb, net.minecraft.world.phys.AABB singleAABB) { -+ return switch (org.leavesmc.leaves.LeavesConfig.fix.collisionBehavior) { -+ // Paper has changed to block shape vanilla, so we only check fully vanilla here -+ case PAPER -> !voxelShapeIntersect(aabb, singleAABB); -+ case VANILLA -> !aabb.intersects(singleAABB); -+ }; -+ } -+ // Leaves end - Configurable collision behavior -+ - public static boolean getEntityHardCollisions(final Level world, final Entity entity, AABB aabb, - final List into, final int collisionFlags, final Predicate predicate) { - final boolean checkOnly = (collisionFlags & COLLISION_FLAG_CHECK_ONLY) != 0; diff --git a/leaves-server/minecraft-patches/features/0133-Lithium-Equipment-Tracking.patch b/leaves-server/minecraft-patches/features/0131-Lithium-Equipment-Tracking.patch similarity index 75% rename from leaves-server/minecraft-patches/features/0133-Lithium-Equipment-Tracking.patch rename to leaves-server/minecraft-patches/features/0131-Lithium-Equipment-Tracking.patch index 9e93240d4..d7d1251fd 100644 --- a/leaves-server/minecraft-patches/features/0133-Lithium-Equipment-Tracking.patch +++ b/leaves-server/minecraft-patches/features/0131-Lithium-Equipment-Tracking.patch @@ -3,28 +3,9 @@ From: MC_XiaoHei Date: Tue, 9 Nov 2077 00:00:00 +0800 Subject: [PATCH] Lithium Equipment Tracking -Origin patch author: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> -Origin patch link: https://github.com/Winds-Studio/Leaf/blob/ver/1.21.8/leaf-server/minecraft-patches/features/0268-Lithium-equipment-tracking.patch - -Should have special treatment to ArmorStand, since Paper introduced the configurable -ArmorStand no-tick, and still gives it ability to update equipment changes. -Thus added a bypass condition in LivingEntity#collectEquipmentChanges, always send -ArmorStand equipment changes even if the ArmorStand is no-tick - -This patch is based on the following mixins: -* "net/caffeinemc/mods/lithium/mixin/util/item_component_and_count_tracking/PatchedDataComponentMapMixin.java" -* "net/caffeinemc/mods/lithium/mixin/util/item_component_and_count_tracking/ItemStackMixin.java" -* "net/caffeinemc/mods/lithium/mixin/entity/equipment_tracking/enchantment_ticking/LivingEntityMixin.java" -* "net/caffeinemc/mods/lithium/mixin/entity/equipment_tracking/equipment_changes/LivingEntityMixin.java" -* "net/caffeinemc/mods/lithium/mixin/entity/equipment_tracking/EntityEquipmentMixin.java" -* "net/caffeinemc/mods/lithium/common/util/change_tracking/ChangePublisher.java" -* "net/caffeinemc/mods/lithium/common/util/change_tracking/ChangeSubscriber.java" -By: 2No2Name <2No2Name@web.de> -As part of: Lithium (https://github.com/CaffeineMC/lithium) -Licensed under: LGPL-3.0 (https://www.gnu.org/licenses/lgpl-3.0.html) diff --git a/net/minecraft/world/entity/EntityEquipment.java b/net/minecraft/world/entity/EntityEquipment.java -index 1e00a7bd89d885cabb4b9ca3c86fbd8cd93cebf5..08e3d257ffdc5dfa996b1e16e477b4e0f8660c54 100644 +index 20041325ae77f16a5b77f5de7255788b52ebb3a5..1456dbc98de65da1d854a3d3c224e4dad2de0f38 100644 --- a/net/minecraft/world/entity/EntityEquipment.java +++ b/net/minecraft/world/entity/EntityEquipment.java @@ -7,7 +7,7 @@ import java.util.Objects; @@ -33,11 +14,11 @@ index 1e00a7bd89d885cabb4b9ca3c86fbd8cd93cebf5..08e3d257ffdc5dfa996b1e16e477b4e0 -public class EntityEquipment { +public class EntityEquipment implements org.leavesmc.leaves.lithium.common.util.change_tracking.ChangeSubscriber.CountChangeSubscriber { // Leaves - Lithium - equipment tracking - public static final Codec CODEC = Codec.unboundedMap(EquipmentSlot.CODEC, ItemStack.CODEC).xmap(map -> { - EnumMap map1 = new EnumMap<>(EquipmentSlot.class); - map1.putAll((Map)map); + public static final Codec CODEC = Codec.unboundedMap(EquipmentSlot.CODEC, ItemStack.CODEC).xmap(items -> { + EnumMap map = new EnumMap<>(EquipmentSlot.class); + map.putAll((Map)items); @@ -18,6 +18,11 @@ public class EntityEquipment { - return map; + return items; }); private final EnumMap items; + // Leaves start - Lithium - equipment tracking @@ -46,27 +27,27 @@ index 1e00a7bd89d885cabb4b9ca3c86fbd8cd93cebf5..08e3d257ffdc5dfa996b1e16e477b4e0 + boolean hasUnsentEquipmentChanges = true; + // Leaves end - Lithium - equipment tracking - private EntityEquipment(EnumMap items) { + private EntityEquipment(final EnumMap items) { this.items = items; @@ -28,7 +33,13 @@ public class EntityEquipment { } - public ItemStack set(EquipmentSlot slot, ItemStack stack) { -- return Objects.requireNonNullElse(this.items.put(slot, stack), ItemStack.EMPTY); + public ItemStack set(final EquipmentSlot slot, final ItemStack itemStack) { +- return Objects.requireNonNullElse(this.items.put(slot, itemStack), ItemStack.EMPTY); + // Leaves start - Lithium - equipment tracking -+ ItemStack oldStack = Objects.requireNonNullElse(this.items.put(slot, stack), ItemStack.EMPTY); ++ ItemStack oldStack = Objects.requireNonNullElse(this.items.put(slot, itemStack), ItemStack.EMPTY); + if (org.leavesmc.leaves.LeavesConfig.performance.equipmentTracking) { -+ this.onEquipmentReplaced(oldStack, stack); ++ this.onEquipmentReplaced(oldStack, itemStack); + } + return oldStack; + // Leaves end - Lithium - equipment tracking } - public ItemStack get(EquipmentSlot slot) { + public ItemStack get(final EquipmentSlot slot) { @@ -55,8 +66,23 @@ public class EntityEquipment { } - public void setAll(EntityEquipment equipment) { + public void setAll(final EntityEquipment equipment) { + if (org.leavesmc.leaves.LeavesConfig.performance.equipmentTracking) this.onClear(); // Leaves - Lithium - equipment tracking this.items.clear(); this.items.putAll(equipment.items); @@ -86,11 +67,11 @@ index 1e00a7bd89d885cabb4b9ca3c86fbd8cd93cebf5..08e3d257ffdc5dfa996b1e16e477b4e0 + // Leaves end - Lithium - equipment tracking } - public void dropAll(LivingEntity entity) { + public void dropAll(final LivingEntity dropper) { @@ -69,6 +95,7 @@ public class EntityEquipment { public void clear() { - this.items.replaceAll((equipmentSlot, itemStack) -> ItemStack.EMPTY); + this.items.replaceAll((s, v) -> ItemStack.EMPTY); + if (org.leavesmc.leaves.LeavesConfig.performance.equipmentTracking) this.onClear(); // Leaves - Lithium - equipment tracking } @@ -195,10 +176,10 @@ index 1e00a7bd89d885cabb4b9ca3c86fbd8cd93cebf5..08e3d257ffdc5dfa996b1e16e477b4e0 + // Leaves end - Lithium - equipment tracking } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 9c32e5d4d28e035abadf76512181c22e49e11401..dc5bf3422069c28e0690cf9f1523e3674ca3cd75 100644 +index b2f5cb5ca2f5b67fa61bf88251557adac3904781..4edc2b5c62b378f6ef34ff47eb436fcc74d72445 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -432,9 +432,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -426,9 +426,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.getSleepingPos().ifPresent(this::setPosToBed); } @@ -217,16 +198,16 @@ index 9c32e5d4d28e035abadf76512181c22e49e11401..dc5bf3422069c28e0690cf9f1523e367 + // Leaves end - Lithium - equipment tracking super.baseTick(); - ProfilerFiller profilerFiller = Profiler.get(); -@@ -3519,6 +3527,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + ProfilerFiller profiler = Profiler.get(); +@@ -3571,6 +3579,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin public void detectEquipmentUpdates() { - Map map = this.collectEquipmentChanges(); - if (map != null) { + Map changedItems = this.collectEquipmentChanges(); + if (changedItems != null) { + if (org.leavesmc.leaves.LeavesConfig.performance.equipmentTracking && !(this instanceof net.minecraft.world.entity.player.Player)) this.equipment.lithium$onEquipmentChangesSent(); // Leaves - Lithium - equipment tracking - this.handleHandSwap(map); - if (!map.isEmpty()) { - this.handleEquipmentChanges(map); -@@ -3527,6 +3536,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + this.handleHandSwap(changedItems); + if (!changedItems.isEmpty()) { + this.handleEquipmentChanges(changedItems); +@@ -3579,6 +3588,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } private @Nullable Map collectEquipmentChanges() { @@ -238,14 +219,14 @@ index 9c32e5d4d28e035abadf76512181c22e49e11401..dc5bf3422069c28e0690cf9f1523e367 + } + } + // Leaves end - Lithium - equipment tracking - Map map = null; + Map changedItems = null; // Paper start - EntityEquipmentChangedEvent record EquipmentChangeImpl(org.bukkit.inventory.ItemStack oldItem, org.bukkit.inventory.ItemStack newItem) implements io.papermc.paper.event.entity.EntityEquipmentChangedEvent.EquipmentChange { diff --git a/net/minecraft/world/entity/decoration/ArmorStand.java b/net/minecraft/world/entity/decoration/ArmorStand.java -index a35415dced4c15ece829cea74010f42f0cb00441..4ae5877c4622c1e7979bab4fa6d87ee4f1feea2b 100644 +index 11f15d4c9a0c4e9e4fd115bddcd947e8b5fa5b47..750ee0ea82a57dab33022f1fb928f7bc53b36d01 100644 --- a/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/net/minecraft/world/entity/decoration/ArmorStand.java -@@ -90,7 +90,7 @@ public class ArmorStand extends LivingEntity { +@@ -92,7 +92,7 @@ public class ArmorStand extends LivingEntity { // Paper start - Allow ArmorStands not to tick public boolean canTick = true; public boolean canTickSetByAPI = false; @@ -253,8 +234,8 @@ index a35415dced4c15ece829cea74010f42f0cb00441..4ae5877c4622c1e7979bab4fa6d87ee4 + public boolean noTickEquipmentDirty = false; // Leaves - private -> public // Paper end - Allow ArmorStands not to tick - public ArmorStand(EntityType type, Level level) { -@@ -531,8 +531,9 @@ public class ArmorStand extends LivingEntity { + public ArmorStand(final EntityType type, final Level level) { +@@ -555,8 +555,9 @@ public class ArmorStand extends LivingEntity { public void tick() { if (!this.canTick) { if (this.noTickEquipmentDirty) { diff --git a/leaves-server/minecraft-patches/features/0134-Allow-Inf-NaN-values-in-entity-motions.patch b/leaves-server/minecraft-patches/features/0132-Allow-Inf-NaN-values-in-entity-motions.patch similarity index 62% rename from leaves-server/minecraft-patches/features/0134-Allow-Inf-NaN-values-in-entity-motions.patch rename to leaves-server/minecraft-patches/features/0132-Allow-Inf-NaN-values-in-entity-motions.patch index cbbf14895..a8c42d581 100644 --- a/leaves-server/minecraft-patches/features/0134-Allow-Inf-NaN-values-in-entity-motions.patch +++ b/leaves-server/minecraft-patches/features/0132-Allow-Inf-NaN-values-in-entity-motions.patch @@ -5,28 +5,28 @@ Subject: [PATCH] Allow Inf NaN values in entity motions diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index f150ccb26cb191f4db68f1f4596eacd62343d117..c6d0043c99c24d4883f17815dc54b2b7d283c950 100644 +index 5645a8ace78e58288887e496ad753e4efe8a9367..e79fea2359652f58623683f737510e631b7e2de7 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -2370,7 +2370,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -2391,7 +2391,7 @@ public abstract class Entity } - public void push(Vec3 vector) { -- if (vector.isFinite()) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowInfNanMotionValues || vector.isFinite()) { // Leaves - allow Inf NaN motion values - this.push(vector.x, vector.y, vector.z); + public void push(final Vec3 impulse) { +- if (impulse.isFinite()) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowInfNanMotionValues || impulse.isFinite()) { // Leaves - allow Inf NaN motion values + this.push(impulse.x, impulse.y, impulse.z); } } -@@ -2382,7 +2382,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -2403,7 +2403,7 @@ public abstract class Entity - public void push(double x, double y, double z, @Nullable Entity pushingEntity) { + public void push(final double xa, final double ya, final double za, @Nullable Entity pushingEntity) { // Paper end - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent -- if (Double.isFinite(x) && Double.isFinite(y) && Double.isFinite(z)) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowInfNanMotionValues || (Double.isFinite(x) && Double.isFinite(y) && Double.isFinite(z))) { // Leaves - allow Inf NaN motion values +- if (Double.isFinite(xa) && Double.isFinite(ya) && Double.isFinite(za)) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowInfNanMotionValues || (Double.isFinite(xa) && Double.isFinite(ya) && Double.isFinite(za))) { // Leaves - allow Inf NaN motion values // Paper start - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent - org.bukkit.util.Vector delta = new org.bukkit.util.Vector(x, y, z); + org.bukkit.util.Vector delta = new org.bukkit.util.Vector(xa, ya, za); if (pushingEntity != null) { -@@ -2588,14 +2588,18 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -2608,13 +2608,17 @@ public abstract class Entity output.store("Motion", Vec3.CODEC, this.getDeltaMovement()); // CraftBukkit start - Checking for NaN pitch/yaw and resetting to zero // TODO: make sure this is the best way to address this. @@ -45,43 +45,41 @@ index f150ccb26cb191f4db68f1f4596eacd62343d117..c6d0043c99c24d4883f17815dc54b2b7 + this.xRot = 0; + } } - // CraftBukkit end + // Leaves end - allow Inf NaN motion values + // CraftBukkit end output.store("Rotation", Vec2.CODEC, new Vec2(this.getYRot(), this.getXRot())); output.putDouble("fall_distance", this.fallDistance); - output.putShort("Fire", (short)this.remainingFireTicks); -@@ -4984,15 +4988,15 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -4911,7 +4915,7 @@ public abstract class Entity } - public void setDeltaMovement(Vec3 deltaMovement) { + public void setDeltaMovement(final Vec3 deltaMovement) { - if (deltaMovement.isFinite()) { + if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowInfNanMotionValues || deltaMovement.isFinite()) { // Leaves - allow Inf NaN motion values synchronized (this.posLock) { // Paper - detailed watchdog information -- this.deltaMovement = deltaMovement; -+ this.deltaMovement = deltaMovement; + this.deltaMovement = deltaMovement; } // Paper - detailed watchdog information - } +@@ -4919,7 +4923,7 @@ public abstract class Entity } - public void addDeltaMovement(Vec3 addend) { -- if (addend.isFinite()) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowInfNanMotionValues || addend.isFinite()) { // Leaves - allow Inf NaN motion values - this.setDeltaMovement(this.getDeltaMovement().add(addend)); + public void addDeltaMovement(final Vec3 momentum) { +- if (momentum.isFinite()) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowInfNanMotionValues || momentum.isFinite()) { // Leaves - allow Inf NaN motion values + this.setDeltaMovement(this.getDeltaMovement().add(momentum)); } } -@@ -5213,7 +5217,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -5144,7 +5148,7 @@ public abstract class Entity } - public void setYRot(float yRot) { + public void setYRot(final float yRot) { - if (!Float.isFinite(yRot)) { + if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowInfNanMotionValues && !Float.isFinite(yRot)) { // Leaves - allow Inf NaN motion values Util.logAndPauseIfInIde("Invalid entity rotation: " + yRot + ", discarding."); } else { this.yRot = yRot; -@@ -5225,7 +5229,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -5156,7 +5160,7 @@ public abstract class Entity } - public void setXRot(float xRot) { + public void setXRot(final float xRot) { - if (!Float.isFinite(xRot)) { + if (!org.leavesmc.leaves.LeavesConfig.modify.oldMC.allowInfNanMotionValues && !Float.isFinite(xRot)) { // Leaves - allow Inf NaN motion values Util.logAndPauseIfInIde("Invalid entity rotation: " + xRot + ", discarding."); diff --git a/leaves-server/minecraft-patches/features/0135-Modify-merge-ItemEntity-logic.patch b/leaves-server/minecraft-patches/features/0133-Modify-merge-ItemEntity-logic.patch similarity index 54% rename from leaves-server/minecraft-patches/features/0135-Modify-merge-ItemEntity-logic.patch rename to leaves-server/minecraft-patches/features/0133-Modify-merge-ItemEntity-logic.patch index 4199be78f..4a4f89ed1 100644 --- a/leaves-server/minecraft-patches/features/0135-Modify-merge-ItemEntity-logic.patch +++ b/leaves-server/minecraft-patches/features/0133-Modify-merge-ItemEntity-logic.patch @@ -6,15 +6,15 @@ Subject: [PATCH] Modify merge ItemEntity logic Add followTickSequenceMerge to modify merge items, due to Paper's modification of the merge radius, when the merge radius is large and stacks containing many items get stuck in an unexpected position, individual items may never reach their destination. This configuration option is added to fix this behavior. diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index eeb34a80c1bb491caa60526c1c09e5d91c3bf373..dbd980ebc0de3e3ead5c661238bb9126536ee8b1 100644 +index d382e9ad5cb8f6ab4abf0cfab51c13bb57227ba3..f6c18f0641ea81a2c73605e5380bc1375db2cdb2 100644 --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java -@@ -294,7 +294,7 @@ public class ItemEntity extends Entity implements TraceableEntity, ChangePublish - ItemStack item = this.getItem(); - ItemStack item1 = itemEntity.getItem(); - if (Objects.equals(this.target, itemEntity.target) && areMergable(item, item1)) { -- if (item1.getCount() < item.getCount()) { -+ if (org.leavesmc.leaves.LeavesConfig.modify.followTickSequenceMerge || item1.getCount() < item.getCount()) { // Leaves - add follow Tick Sequence Merge, see Paper#13073 - merge(this, item, itemEntity, item1); +@@ -303,7 +303,7 @@ public class ItemEntity extends Entity implements TraceableEntity, ChangePublish + ItemStack thisItemStack = this.getItem(); + ItemStack otherItemStack = other.getItem(); + if (Objects.equals(this.target, other.target) && areMergable(thisItemStack, otherItemStack)) { +- if (otherItemStack.getCount() < thisItemStack.getCount()) { ++ if (org.leavesmc.leaves.LeavesConfig.modify.followTickSequenceMerge || otherItemStack.getCount() < thisItemStack.getCount()) { // Leaves - add follow Tick Sequence Merge, see Paper#13073 + merge(this, thisItemStack, other, otherItemStack); } else { - merge(itemEntity, item1, this, item); + merge(other, otherItemStack, this, thisItemStack); diff --git a/leaves-server/minecraft-patches/features/0134-Old-minecart-motion-behavior.patch b/leaves-server/minecraft-patches/features/0134-Old-minecart-motion-behavior.patch new file mode 100644 index 000000000..37daeab2b --- /dev/null +++ b/leaves-server/minecraft-patches/features/0134-Old-minecart-motion-behavior.patch @@ -0,0 +1,51 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MC_XiaoHei +Date: Wed, 8 Oct 2025 18:07:47 +0800 +Subject: [PATCH] Old minecart motion behavior + + +diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java +index e79fea2359652f58623683f737510e631b7e2de7..ad07c92d2e7c68ec09b2f31d770552d4742dc8d9 100644 +--- a/net/minecraft/world/entity/Entity.java ++++ b/net/minecraft/world/entity/Entity.java +@@ -4217,7 +4217,7 @@ public abstract class Entity + transition.relatives().contains(Relative.Y) ? 0.0 : passengerOffset.y(), + transition.relatives().contains(Relative.Z) ? 0.0 : passengerOffset.z() + ); +- return transition.withPosition(passengerPos).withRotation(passengerYRot, passengerXRot).transitionAsPassenger(); ++ return org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldMinecartMotionBehavior ? new TeleportTransition(transition.newLevel(), transition.position(), transition.deltaMovement(), 0, 0, transition.postTeleportTransition()) : transition.withPosition(passengerPos).withRotation(passengerYRot, passengerXRot).transitionAsPassenger(); // Leaves - old minecart motion behavior + } + + private void sendTeleportTransitionToRidingPlayers(final TeleportTransition transition) { +diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java +index 4fbc8e7114302004fc498329d6b9f3a0290dee76..0f3518e864c3917a0b9b173beff37af16fc0dace 100644 +--- a/net/minecraft/world/level/block/NetherPortalBlock.java ++++ b/net/minecraft/world/level/block/NetherPortalBlock.java +@@ -272,7 +272,17 @@ public class NetherPortalBlock extends Block implements Portal { + double width = foundRectangle.axis1Size; + double height = foundRectangle.axis2Size; + EntityDimensions dimensions = entity.getDimensions(entity.getPose()); +- int outputRotation = portalAxis == axis ? 0 : 90; ++ // Leaves start - old minecart motion behavior ++ int outputRotation; ++ Vec3 outputDelta; ++ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldMinecartMotionBehavior) { ++ outputDelta = portalAxis == axis ? entity.getDeltaMovement() : new Vec3(entity.getDeltaMovement().z, entity.getDeltaMovement().y, -entity.getDeltaMovement().x); ++ outputRotation = 0; ++ } else { ++ outputDelta = Vec3.ZERO; ++ outputRotation = portalAxis == axis ? 0 : 90; ++ } ++ // Leaves end - old minecart motion behavior + double offsetRight = dimensions.width() / 2.0 + (width - dimensions.width()) * offset.x(); + double offsetUp = (height - dimensions.height()) * offset.y(); + double offsetForward = 0.5 + offset.z(); +@@ -284,7 +294,7 @@ public class NetherPortalBlock extends Block implements Portal { + ); + Vec3 collisionFreePos = PortalShape.findCollisionFreePosition(targetPos, newLevel, entity, dimensions); + return new TeleportTransition( +- newLevel, collisionFreePos, Vec3.ZERO, outputRotation, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.NETHER_PORTAL // CraftBukkit ++ newLevel, collisionFreePos, outputDelta, outputRotation, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.NETHER_PORTAL // CraftBukkit // Leaves - old minecart motion behavior + ); + } + diff --git a/leaves-server/minecraft-patches/features/0137-Fix-stacked-container-destroyed-drop.patch b/leaves-server/minecraft-patches/features/0135-Fix-stacked-container-destroyed-drop.patch similarity index 62% rename from leaves-server/minecraft-patches/features/0137-Fix-stacked-container-destroyed-drop.patch rename to leaves-server/minecraft-patches/features/0135-Fix-stacked-container-destroyed-drop.patch index afab8ae97..c6a4a0c72 100644 --- a/leaves-server/minecraft-patches/features/0137-Fix-stacked-container-destroyed-drop.patch +++ b/leaves-server/minecraft-patches/features/0135-Fix-stacked-container-destroyed-drop.patch @@ -5,23 +5,24 @@ Subject: [PATCH] Fix stacked container destroyed drop diff --git a/net/minecraft/world/item/ItemUtils.java b/net/minecraft/world/item/ItemUtils.java -index 16fc5c89b652194afac64aaa29f72a25ba7ffcae..53ac755a10b2e915053feab358aa3b9fbc25547a 100644 +index cc266f88ea6d02e4bc1bb4299d83710559b0c535..9c8fd293420dd87d48ea7e4a1a5abf2a4884a2d0 100644 --- a/net/minecraft/world/item/ItemUtils.java +++ b/net/minecraft/world/item/ItemUtils.java -@@ -39,6 +39,16 @@ public class ItemUtils { +@@ -42,6 +42,17 @@ public class ItemUtils { } - public static void onContainerDestroyed(ItemEntity container, Iterable contents) { + public static void onContainerDestroyed(final ItemEntity container, final Stream contents) { + if (org.leavesmc.leaves.LeavesConfig.fix.stackedContainerDestroyedDrop) { ++ java.util.List list = contents.toList(); + for (int i = 0; i < container.getItem().getCount(); i++) { -+ createDroppedItem(container, contents); ++ createDroppedItem(container, list.stream()); + } + } else { + createDroppedItem(container, contents); + } + } + -+ private static void createDroppedItem(ItemEntity container, Iterable contents) { ++ private static void createDroppedItem(final ItemEntity container, final Stream contents) { Level level = container.level(); if (!level.isClientSide()) { // Paper start - call EntityDropItemEvent diff --git a/leaves-server/minecraft-patches/features/0138-Force-minecraft-command.patch b/leaves-server/minecraft-patches/features/0136-Force-minecraft-command.patch similarity index 85% rename from leaves-server/minecraft-patches/features/0138-Force-minecraft-command.patch rename to leaves-server/minecraft-patches/features/0136-Force-minecraft-command.patch index 0d7ec6f12..0bb2ecaa0 100644 --- a/leaves-server/minecraft-patches/features/0138-Force-minecraft-command.patch +++ b/leaves-server/minecraft-patches/features/0136-Force-minecraft-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Force minecraft command diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 668eb52d71d77f75c24d4840be9a6c49d96dfc34..f4452de35a589612c11b413f6e09524b90d2d507 100644 +index 01a9a01db6908c2f6c511be4628f518ce6a16de7..14a55006a2c6adf0e0cf7f984b60531895fb0257 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java -@@ -185,7 +185,21 @@ public class Commands { +@@ -186,7 +186,21 @@ public class Commands { return !requirement.test(this.noPermissionSource); } }; @@ -29,5 +29,5 @@ index 668eb52d71d77f75c24d4840be9a6c49d96dfc34..f4452de35a589612c11b413f6e09524b + }; + // Leaves end - force minecraft command - public Commands(Commands.CommandSelection selection, CommandBuildContext context) { + public Commands(final Commands.CommandSelection commandSelection, final CommandBuildContext context) { // Paper start - Brigadier API - modern minecraft overloads that do not use redirects but are copies instead diff --git a/leaves-server/minecraft-patches/features/0136-Old-minecart-motion-behavior.patch b/leaves-server/minecraft-patches/features/0136-Old-minecart-motion-behavior.patch deleted file mode 100644 index 4d1eca1ef..000000000 --- a/leaves-server/minecraft-patches/features/0136-Old-minecart-motion-behavior.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MC_XiaoHei -Date: Wed, 8 Oct 2025 18:07:47 +0800 -Subject: [PATCH] Old minecart motion behavior - -This patch is Powered by [CPCA](https://github.com/liuyuexiaoyu1/carpet_pc_additon) - -This patch is based on the following mixins: -* "com/pigconnon/carpet_pc_addition/mixin/MinecartMotionFix/EntityMixin.java" -* "com/pigconnon/carpet_pc_addition/mixin/MinecartMotionFix/NetherPortalBlockMixin.java" -By: liuyuexiaoyu1 -As part of: CPCA (https://github.com/liuyuexiaoyu1/carpet_pc_additon) -Licensed under: MIT (https://mit-license.org) - -diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index c6d0043c99c24d4883f17815dc54b2b7d283c950..e864a1efdc7c852983b71cb614202f5e9550873f 100644 ---- a/net/minecraft/world/entity/Entity.java -+++ b/net/minecraft/world/entity/Entity.java -@@ -4197,7 +4197,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name - teleportTransition.relatives().contains(Relative.Y) ? 0.0 : vec3.y(), - teleportTransition.relatives().contains(Relative.Z) ? 0.0 : vec3.z() - ); -- return teleportTransition.withPosition(vec31).withRotation(f, f1).transitionAsPassenger(); -+ return org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldMinecartMotionBehavior ? new TeleportTransition(teleportTransition.newLevel(), teleportTransition.position(), teleportTransition.deltaMovement(), 0, 0, teleportTransition.postTeleportTransition()) : teleportTransition.withPosition(vec31).withRotation(f, f1).transitionAsPassenger(); // Leaves - old minecart motion behavior - } - - private void sendTeleportTransitionToRidingPlayers(TeleportTransition teleportTransition) { -diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java -index 2688d5b86a77e1552e6322e7b80a0217a441afd4..d6c16096d7d975477db525640ee966ab8198d78f 100644 ---- a/net/minecraft/world/level/block/NetherPortalBlock.java -+++ b/net/minecraft/world/level/block/NetherPortalBlock.java -@@ -256,14 +256,24 @@ public class NetherPortalBlock extends Block implements Portal { - double d = rectangle.axis1Size; - double d1 = rectangle.axis2Size; - EntityDimensions dimensions = entity.getDimensions(entity.getPose()); -- int i = axis == axis1 ? 0 : 90; -+ // Leaves start - old minecart motion behavior -+ int i; -+ Vec3 vec3d3; -+ if (org.leavesmc.leaves.LeavesConfig.modify.oldMC.oldMinecartMotionBehavior) { -+ vec3d3 = axis == axis1 ? entity.getDeltaMovement() : new Vec3(entity.getDeltaMovement().z, entity.getDeltaMovement().y, -entity.getDeltaMovement().x); -+ i = 0; -+ } else { -+ vec3d3 = Vec3.ZERO; -+ i = axis == axis1 ? 0 : 90; -+ } - double d2 = dimensions.width() / 2.0 + (d - dimensions.width()) * offset.x(); - double d3 = (d1 - dimensions.height()) * offset.y(); - double d4 = 0.5 + offset.z(); - boolean flag = axis1 == Direction.Axis.X; - Vec3 vec3 = new Vec3(blockPos.getX() + (flag ? d2 : d4), blockPos.getY() + d3, blockPos.getZ() + (flag ? d4 : d2)); - Vec3 vec31 = PortalShape.findCollisionFreePosition(vec3, level, entity, dimensions); -- return new TeleportTransition(level, vec31, Vec3.ZERO, i, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.NETHER_PORTAL); // CraftBukkit -+ return new TeleportTransition(level, vec31, vec3d3, i, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), postTeleportTransition, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.NETHER_PORTAL); // CraftBukkit -+ // Leaves end - old minecart motion behavior - } - - @Override diff --git a/leaves-server/minecraft-patches/features/0140-Async-keepalive.patch b/leaves-server/minecraft-patches/features/0137-Async-keepalive.patch similarity index 84% rename from leaves-server/minecraft-patches/features/0140-Async-keepalive.patch rename to leaves-server/minecraft-patches/features/0137-Async-keepalive.patch index ae45725b2..bef012152 100644 --- a/leaves-server/minecraft-patches/features/0140-Async-keepalive.patch +++ b/leaves-server/minecraft-patches/features/0137-Async-keepalive.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Async keepalive diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index cb9a4f669ae2ff772206bffde9255d239f47e1ea..8a2a9abf61cf6ae6ea8ecbbc6d9c2155f98b4a5b 100644 +index 5cf25ed690dc06a60a95116b755b590274ea954f..389c674cffbb12c8b8a8ed1f11a4ab6f5d1da5d6 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java @@ -46,6 +46,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack @@ -16,7 +16,7 @@ index cb9a4f669ae2ff772206bffde9255d239f47e1ea..8a2a9abf61cf6ae6ea8ecbbc6d9c2155 private volatile boolean suspendFlushingOnServerThread = false; // CraftBukkit start public final org.bukkit.craftbukkit.CraftServer cserver; -@@ -73,6 +74,8 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -72,6 +73,8 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack this.keepAlive = cookie.keepAlive(); // Paper end this.profile = cookie.gameProfile(); // Leaves - protocol core @@ -25,18 +25,18 @@ index cb9a4f669ae2ff772206bffde9255d239f47e1ea..8a2a9abf61cf6ae6ea8ecbbc6d9c2155 } // Paper start - configuration phase API -@@ -90,6 +93,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -89,6 +92,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack @Override - public void onDisconnect(DisconnectionDetails details) { + public void onDisconnect(final DisconnectionDetails details) { + org.leavesmc.leaves.network.AsyncKeepaliveManager.unregister(this); // Leaves - async keepalive if (this.isSingleplayerOwner()) { LOGGER.info("Stopping singleplayer server as player logged out"); this.server.halt(false); -@@ -104,6 +108,13 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -103,6 +107,13 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack @Override - public void handleKeepAlive(ServerboundKeepAlivePacket packet) { + public void handleKeepAlive(final ServerboundKeepAlivePacket packet) { + // Leaves start - async keepalive + if (org.leavesmc.leaves.LeavesConfig.mics.asyncKeepalive.enable) { + this.handleAsyncKeepAlive(packet); @@ -47,7 +47,7 @@ index cb9a4f669ae2ff772206bffde9255d239f47e1ea..8a2a9abf61cf6ae6ea8ecbbc6d9c2155 // Paper start - improve keepalives long now = System.nanoTime(); io.papermc.paper.util.KeepAlive.PendingKeepAlive pending = this.keepAlive.pendingKeepAlives.peek(); -@@ -141,6 +152,28 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -134,6 +145,28 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack // Paper end - improve keepalives } @@ -74,29 +74,29 @@ index cb9a4f669ae2ff772206bffde9255d239f47e1ea..8a2a9abf61cf6ae6ea8ecbbc6d9c2155 + // Leaves end - async keepalive + @Override - public void handlePong(ServerboundPongPacket packet) { + public void handlePong(final ServerboundPongPacket serverboundPongPacket) { } -@@ -278,6 +311,13 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -271,6 +304,13 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack protected void keepConnectionAlive() { Profiler.get().push("keepAlive"); - long millis = Util.getMillis(); + long now = Util.getMillis(); + // Leaves start - async keepalive + if (org.leavesmc.leaves.LeavesConfig.mics.asyncKeepalive.enable) { -+ this.checkIfClosed(millis); ++ this.checkIfClosed(now); + Profiler.get().pop(); + return; + } + // Leaves end - async keepalive // Paper start - improve keepalives - if (this.checkIfClosed(millis) && !this.processedDisconnect) { + if (this.checkIfClosed(now)) { long currTime = System.nanoTime(); -@@ -301,6 +341,29 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -294,6 +334,29 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack Profiler.get().pop(); } + // Leaves start - async keepalive + public void keepConnectionAliveAsync(long currentTimeNs, long currentTimeMs) { -+ if (this.closed || this.processedDisconnect || !this.connection.isConnected()) { ++ if (this.closed || !this.connection.isConnected()) { + return; + } + @@ -117,6 +117,6 @@ index cb9a4f669ae2ff772206bffde9255d239f47e1ea..8a2a9abf61cf6ae6ea8ecbbc6d9c2155 + } + // Leaves end - async keepalive + - private boolean checkIfClosed(long time) { + private boolean checkIfClosed(final long now) { if (this.closed) { - if (time - this.closedListenerTime >= 15000L) { + if (now - this.closedListenerTime >= 15000L) { diff --git a/leaves-server/minecraft-patches/features/0141-Fix-stuck-zombified-piglin-anger-target.patch b/leaves-server/minecraft-patches/features/0138-Fix-stuck-zombified-piglin-anger-target.patch similarity index 63% rename from leaves-server/minecraft-patches/features/0141-Fix-stuck-zombified-piglin-anger-target.patch rename to leaves-server/minecraft-patches/features/0138-Fix-stuck-zombified-piglin-anger-target.patch index 53935adbd..3237f8877 100644 --- a/leaves-server/minecraft-patches/features/0141-Fix-stuck-zombified-piglin-anger-target.patch +++ b/leaves-server/minecraft-patches/features/0138-Fix-stuck-zombified-piglin-anger-target.patch @@ -6,31 +6,29 @@ Subject: [PATCH] Fix stuck zombified piglin anger target Cleans up the running anger timer whenever neither target nor persistentAngerTarget points to a valid player. - diff --git a/net/minecraft/world/entity/NeutralMob.java b/net/minecraft/world/entity/NeutralMob.java -index c2201fde32aaf8cc02b71bc90aee40ef98438066..beaad11820274a0bbaec121bc24d1c7dd9fb0230 100644 +index 3425ac4f186f144527e612bc895457ba4cd3ff93..fcf675d65424773433e5cd4c101f533a2b5fd9ea 100644 --- a/net/minecraft/world/entity/NeutralMob.java +++ b/net/minecraft/world/entity/NeutralMob.java -@@ -80,6 +80,22 @@ public interface NeutralMob { - if (persistentAngerTarget != null && !this.isAngry() && (target == null || !isValidPlayerTarget(target) || !updateAnger)) { +@@ -85,6 +85,21 @@ public interface NeutralMob { this.stopBeingAngry(); } -+ + + // Leaves start - fix stuck zombified piglin anger target + if (org.leavesmc.leaves.LeavesConfig.modify.fixStuckZombifiedPiglinAngerTarget && this.isAngry()) { -+ boolean hasValidTargetPlayer = target != null && isValidPlayerTarget(target); -+ if (!hasValidTargetPlayer) { -+ boolean hasValidPersistentPlayer = false; ++ if (target instanceof Player && !isValidPlayerTarget(target)) { ++ boolean shouldStop = true; + if (persistentAngerTarget != null) { + LivingEntity resolved = EntityReference.getLivingEntity(persistentAngerTarget, level); -+ hasValidPersistentPlayer = resolved != null && isValidPlayerTarget(resolved); ++ shouldStop = resolved instanceof Player && !isValidPlayerTarget(resolved); + } -+ if (!hasValidPersistentPlayer) { ++ if (shouldStop) { + this.stopBeingAngry(); + } + } + } + // Leaves end - fix stuck zombified piglin anger target - } - } - ++ + if (EntityReference.getLivingEntity(persistentAngerTarget, level) instanceof Player player + && (player.isCreative() || player.isSpectator() || level.getDifficulty() == Difficulty.PEACEFUL)) { + this.stopBeingAngry(); diff --git a/leaves-server/minecraft-patches/features/0139-Fix-Paper-config-preventMovingIntoUnloadedChunks.patch b/leaves-server/minecraft-patches/features/0139-Fix-Paper-config-preventMovingIntoUnloadedChunks.patch deleted file mode 100644 index 09f63ddfd..000000000 --- a/leaves-server/minecraft-patches/features/0139-Fix-Paper-config-preventMovingIntoUnloadedChunks.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> -Date: Tue, 9 Nov 2077 00:00:00 +0800 -Subject: [PATCH] Fix Paper config preventMovingIntoUnloadedChunks - -Co-authored-by: Lumine1909 <133463833+Lumine1909@users.noreply.github.com> - -diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 051e3bac4f406df379ec1fc335f351b1089bda8b..fd17ac30f22490820200f13e432aec42d47eb3c4 100644 ---- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1781,11 +1781,15 @@ public class ServerGamePacketListenerImpl - private boolean hasNewCollision(final ServerLevel level, final Entity entity, final AABB oldBox, final AABB newBox) { - final List collisionsBB = new java.util.ArrayList<>(); - final List collisionsVoxel = new java.util.ArrayList<>(); -+ // Leaves start - Fix Paper config preventMovingIntoUnloadedChunks -+ int flags = ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_FLAG_CHECK_BORDER; -+ if (level.paperConfig().chunks.preventMovingIntoUnloadedChunks) flags |= ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_FLAG_COLLIDE_WITH_UNLOADED_CHUNKS; - ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getCollisions( - level, entity, newBox, collisionsVoxel, collisionsBB, -- ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_FLAG_COLLIDE_WITH_UNLOADED_CHUNKS | ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_FLAG_CHECK_BORDER, -+ flags, - null, null - ); -+ // Leaves end - Fix Paper config preventMovingIntoUnloadedChunks - - for (int i = 0, len = collisionsBB.size(); i < len; ++i) { - final AABB box = collisionsBB.get(i); diff --git a/leaves-server/minecraft-patches/features/0139-Fix-piercing-weapon-can-attack-in-spectator-mode.patch b/leaves-server/minecraft-patches/features/0139-Fix-piercing-weapon-can-attack-in-spectator-mode.patch new file mode 100644 index 000000000..101472692 --- /dev/null +++ b/leaves-server/minecraft-patches/features/0139-Fix-piercing-weapon-can-attack-in-spectator-mode.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Lumine1909 <133463833+Lumine1909@users.noreply.github.com> +Date: Sat, 23 May 2026 14:32:26 +0800 +Subject: [PATCH] Fix piercing weapon can attack in spectator mode + + +diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index fbdc03dc4a27ec23054705a4095485e0ce5c41c3..fbdd5d712a057269aea4972dd4b68e9b5d6a635e 100644 +--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -1978,7 +1978,7 @@ public class ServerGamePacketListenerImpl + } + + PiercingWeapon piercingWeapon = itemInHand.get(DataComponents.PIERCING_WEAPON); +- if (piercingWeapon != null) { ++ if (piercingWeapon != null && this.player.gameMode() != net.minecraft.world.level.GameType.SPECTATOR) { // Leaves - fix piercing weapon can attack in spectator mode + piercingWeapon.attack(this.player, EquipmentSlot.MAINHAND); + } + diff --git a/leaves-server/paper-patches/features/0001-Build-changes.patch b/leaves-server/paper-patches/features/0001-Build-changes.patch index de7eff999..a01be2e0c 100644 --- a/leaves-server/paper-patches/features/0001-Build-changes.patch +++ b/leaves-server/paper-patches/features/0001-Build-changes.patch @@ -127,10 +127,10 @@ index bfacb856623b5cb6af4f1b65ee89200cdfb1ef13..a427a962ea90b089bef1a8177b187f4b public static LiteralCommandNode create() { diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index 9323383f7d1226d887fc9219354ac9613204cbc2..148e863b513ebfbbcd25b48ce6f3675c383cc367 100644 +index 3f903315d3c0b31a06fe90406f290b828967991b..1c5ac3df3922ddd3816aede4f37f8529e3ac9de4 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -485,7 +485,7 @@ public final class CraftMagicNumbers implements UnsafeValues { +@@ -489,7 +489,7 @@ public final class CraftMagicNumbers implements UnsafeValues { @Override public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { diff --git a/leaves-server/paper-patches/features/0003-Leaves-Server-Config.patch b/leaves-server/paper-patches/features/0003-Leaves-Server-Config.patch index 08249193d..a80472a95 100644 --- a/leaves-server/paper-patches/features/0003-Leaves-Server-Config.patch +++ b/leaves-server/paper-patches/features/0003-Leaves-Server-Config.patch @@ -18,10 +18,10 @@ index 62e2d5704c348955bc8284dc2d54c933b7bcdd06..7ef20f0138fad39a1d23edd7b26ddc88 public void executeAsync(final Runnable runnable) { MCUtil.scheduleAsyncTask(this.catching(runnable, "asynchronous")); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index da49c8005592a154946750591ce082796f24dd3b..1562a3d0b97a5ca2680ebc30bf8c71de443cad1c 100644 +index ab2224ecebc5ea185472b418f0bde6eddfa4f287..fba0488eb043985e706cd62fc6761b0bbc1372f7 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1020,6 +1020,7 @@ public final class CraftServer implements Server { +@@ -1018,6 +1018,7 @@ public final class CraftServer implements Server { playerMetadata.removeAll(plugin); } // Paper end diff --git a/leaves-server/paper-patches/features/0004-Leaves-Protocol-Core.patch b/leaves-server/paper-patches/features/0004-Leaves-Protocol-Core.patch index ee4d3208b..013f72e81 100644 --- a/leaves-server/paper-patches/features/0004-Leaves-Protocol-Core.patch +++ b/leaves-server/paper-patches/features/0004-Leaves-Protocol-Core.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Leaves Protocol Core diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index a04458eb300e003fe3f37398077371b1a75d4a89..7aa66d5285b5b793c66c88df376f7668aab55f47 100644 +index fba0488eb043985e706cd62fc6761b0bbc1372f7..c98ca25312cb2ac2573ddb1e04c51a6314bcdb43 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -485,6 +485,7 @@ public final class CraftServer implements Server { +@@ -483,6 +483,7 @@ public final class CraftServer implements Server { this.potionBrewer = new io.papermc.paper.potion.PaperPotionBrewer(console); // Paper - custom potion mixes datapackManager = new io.papermc.paper.datapack.PaperDatapackManager(console.getPackRepository()); // Paper this.spark = new io.papermc.paper.SparksFly(this); // Paper - spark @@ -16,7 +16,7 @@ index a04458eb300e003fe3f37398077371b1a75d4a89..7aa66d5285b5b793c66c88df376f7668 } public boolean getCommandBlockOverride(String command) { -@@ -1027,6 +1028,7 @@ public final class CraftServer implements Server { +@@ -1025,6 +1026,7 @@ public final class CraftServer implements Server { this.spark.registerCommandBeforePlugins(this); // Paper - spark this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); diff --git a/leaves-server/paper-patches/features/0005-Leaves-Fakeplayer.patch b/leaves-server/paper-patches/features/0005-Leaves-Fakeplayer.patch index 9c99d9d75..acf09ff73 100644 --- a/leaves-server/paper-patches/features/0005-Leaves-Fakeplayer.patch +++ b/leaves-server/paper-patches/features/0005-Leaves-Fakeplayer.patch @@ -32,10 +32,10 @@ index a589689e3a9de1fffef62e0e3dcd79bb2e848c5b..c0910f908ffad3bb94563836c032bb1d RegisteredListener[] listeners = handlers.getRegisteredListeners(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java -index 21d594a39d09b2d17f05c40ce5323d57949d0b0b..46859fc70795097366f02dba48fdaab8b9c85013 100644 +index 5339ff469a38d35e72ea7227503a84395462f84a..d75b4ecb24f2ea42afc82ac255775d8f35121fe5 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java -@@ -374,6 +374,7 @@ public abstract class CraftRegionAccessor implements RegionAccessor { +@@ -373,6 +373,7 @@ public abstract class CraftRegionAccessor implements RegionAccessor { @SuppressWarnings("unchecked") public T addEntity(T entity) { Preconditions.checkArgument(!entity.isInWorld(), "Entity has already been added to a world"); @@ -44,10 +44,10 @@ index 21d594a39d09b2d17f05c40ce5323d57949d0b0b..46859fc70795097366f02dba48fdaab8 if (nmsEntity.level() != this.getHandle().getLevel()) { throw new IllegalArgumentException(entity + " wasn't created with this world, you must create the entity with the world you want to add it to."); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 7aa66d5285b5b793c66c88df376f7668aab55f47..99d2dee2fabda85df357de7efe18f8bdfde394fe 100644 +index c98ca25312cb2ac2573ddb1e04c51a6314bcdb43..cd75dbfdab127c9c7876b3fe83f5f1c0d4129e52 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -305,6 +305,7 @@ public final class CraftServer implements Server { +@@ -303,6 +303,7 @@ public final class CraftServer implements Server { private final io.papermc.paper.potion.PaperPotionBrewer potionBrewer; public final io.papermc.paper.SparksFly spark; private final ServerConfiguration serverConfig = new PaperServerConfiguration(); @@ -55,7 +55,7 @@ index 7aa66d5285b5b793c66c88df376f7668aab55f47..99d2dee2fabda85df357de7efe18f8bd // Paper start - Folia region threading API private final io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler regionizedScheduler = new io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler(); -@@ -486,6 +487,7 @@ public final class CraftServer implements Server { +@@ -484,6 +485,7 @@ public final class CraftServer implements Server { datapackManager = new io.papermc.paper.datapack.PaperDatapackManager(console.getPackRepository()); // Paper this.spark = new io.papermc.paper.SparksFly(this); // Paper - spark org.leavesmc.leaves.protocol.core.LeavesProtocolManager.init(); // Leaves - protocol @@ -63,7 +63,7 @@ index 7aa66d5285b5b793c66c88df376f7668aab55f47..99d2dee2fabda85df357de7efe18f8bd } public boolean getCommandBlockOverride(String command) { -@@ -1341,7 +1343,7 @@ public final class CraftServer implements Server { +@@ -1337,7 +1339,7 @@ public final class CraftServer implements Server { return false; } @@ -72,7 +72,7 @@ index 7aa66d5285b5b793c66c88df376f7668aab55f47..99d2dee2fabda85df357de7efe18f8bd return false; } -@@ -2967,4 +2969,11 @@ public final class CraftServer implements Server { +@@ -2963,4 +2965,11 @@ public final class CraftServer implements Server { public void allowPausing(final Plugin plugin, final boolean value) { this.console.addPluginAllowingSleep(plugin.getName(), value); } @@ -85,10 +85,10 @@ index 7aa66d5285b5b793c66c88df376f7668aab55f47..99d2dee2fabda85df357de7efe18f8bd + // Leaves end - Bot API } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index ebc65e3338c646815416a47bf9af96fe45978caf..815825d8dfb2e4f0bbe59a815bc7045d4b508f21 100644 +index f77cb6d85c8947a96d41b96b31814c551dfd5258..8220ee9346558bc10887ea9fc320b1bbf173e227 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -247,7 +247,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -255,7 +255,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public int getPlayerCount() { @@ -97,7 +97,7 @@ index ebc65e3338c646815416a47bf9af96fe45978caf..815825d8dfb2e4f0bbe59a815bc7045d } @Override -@@ -1108,9 +1108,9 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1113,9 +1113,9 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public List getPlayers() { @@ -109,7 +109,7 @@ index ebc65e3338c646815416a47bf9af96fe45978caf..815825d8dfb2e4f0bbe59a815bc7045d HumanEntity bukkitEntity = human.getBukkitEntity(); if ((bukkitEntity != null) && (bukkitEntity instanceof Player)) { -@@ -1597,7 +1597,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1603,7 +1603,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { public void playSound(final net.kyori.adventure.sound.Sound sound) { org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper final long seed = sound.seed().orElseGet(this.world.getRandom()::nextLong); @@ -118,7 +118,7 @@ index ebc65e3338c646815416a47bf9af96fe45978caf..815825d8dfb2e4f0bbe59a815bc7045d player.connection.send(io.papermc.paper.adventure.PaperAdventure.asSoundPacket(sound, player.getX(), player.getY(), player.getZ(), seed, null)); } } -@@ -1625,7 +1625,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1631,7 +1631,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { org.spigotmc.AsyncCatcher.catchOp("play sound"); // Paper final long seed = sound.seed().orElseGet(this.getHandle().getRandom()::nextLong); if (emitter == net.kyori.adventure.sound.Sound.Emitter.self()) { @@ -127,7 +127,7 @@ index ebc65e3338c646815416a47bf9af96fe45978caf..815825d8dfb2e4f0bbe59a815bc7045d player.connection.send(io.papermc.paper.adventure.PaperAdventure.asSoundPacket(sound, player, seed, null)); } } else if (emitter instanceof CraftEntity craftEntity) { -@@ -1764,7 +1764,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { +@@ -1752,7 +1752,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { Preconditions.checkArgument(particle.getDataType().isInstance(data), "data (%s) should be %s", data.getClass(), particle.getDataType()); } this.getHandle().sendParticlesSource( @@ -137,7 +137,7 @@ index ebc65e3338c646815416a47bf9af96fe45978caf..815825d8dfb2e4f0bbe59a815bc7045d CraftParticle.createParticleParam(particle, data), // Particle force, diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 2a572ef0ba7405ecafaf6def2a2134bd71b60453..a509ced2a78fe67b57ddd37ec0521d6c74a1eb41 100644 +index 2f40476da09c0c679047978437de07a5d162fee4..6c84da26e5e8626dbe5065bc7db9aba901eba983 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -122,6 +122,8 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @@ -150,10 +150,10 @@ index 2a572ef0ba7405ecafaf6def2a2134bd71b60453..a509ced2a78fe67b57ddd37ec0521d6c if (entity instanceof EnderDragonPart complexPart) { if (complexPart.parentMob instanceof EnderDragon) { diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index cd83ca2ace1dab6c1f10e2306a0ca0bb8ae083cc..d8a8679a6e768f8a02aa58695beb0ed1c792bda7 100644 +index 7a42d1810f74a041318c8a3c53793106e872081f..73c26187a28c75a4a23ab25b7d56d4aa5e4835d8 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -1013,7 +1013,11 @@ public class CraftEventFactory { +@@ -1003,7 +1003,11 @@ public class CraftEventFactory { event.setKeepInventory(keepInventory); event.setKeepLevel(victim.keepLevel); // SPIGOT-2222: pre-set keepLevel populateFields(victim, event); // Paper - make cancellable diff --git a/leaves-server/paper-patches/features/0006-No-chat-sign.patch b/leaves-server/paper-patches/features/0006-No-chat-sign.patch index b766a5d79..de1e6046b 100644 --- a/leaves-server/paper-patches/features/0006-No-chat-sign.patch +++ b/leaves-server/paper-patches/features/0006-No-chat-sign.patch @@ -5,7 +5,7 @@ Subject: [PATCH] No chat sign diff --git a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java -index 965ddeb8f57565d68415fb6f549e6d00feed3c33..84ae6df6932d50a41147da2570cce3bef90d10a4 100644 +index f1ef191a9ca388112021959402a4912c54e177f7..e81955b8827ec9ad80a36e484acbb11e1a4040f0 100644 --- a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -317,7 +317,7 @@ public final class ChatProcessor { diff --git a/leaves-server/paper-patches/features/0007-MC-Technical-Survival-Mode.patch b/leaves-server/paper-patches/features/0007-MC-Technical-Survival-Mode.patch index 524b18057..5d94da048 100644 --- a/leaves-server/paper-patches/features/0007-MC-Technical-Survival-Mode.patch +++ b/leaves-server/paper-patches/features/0007-MC-Technical-Survival-Mode.patch @@ -6,23 +6,10 @@ Subject: [PATCH] MC Technical Survival Mode Will automatically overwrite some configuration after startup diff --git a/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java b/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java -index e0491ef5cfc06b5c23d448b8c9679a17e58bca26..004997d8dd40f45112a563edfe166cba3a49e2ee 100644 +index aa5ff7fb46b068fcb27abfdcb81f10220c5d1e89..3f42c5bf7139708c4eb04aab87e3e6602a0f7683 100644 --- a/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java +++ b/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java -@@ -317,7 +317,11 @@ public class PaperConfigurations extends Configurations -Date: Mon, 22 Jul 2024 09:05:56 +0000 +Date: Thu, 16 Apr 2026 22:59:23 +0800 Subject: [PATCH] Leaves Plugin -This patch is licensed under the MIT license. diff --git a/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java b/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java index 9c49bb7fb8c3ca4b62e73dcfca2669971defb181..b5fc7668d03cf314a8421e72e782da0cb7e6446a 100644 @@ -66,10 +65,10 @@ index 9c49bb7fb8c3ca4b62e73dcfca2669971defb181..b5fc7668d03cf314a8421e72e782da0c for (final Component component : formatProviders(spigotPlugins)) { sender.sendMessage(component); diff --git a/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java b/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java -index 3200aef1ba5d079fc3790841c826b4cf3951f2cf..440104ac53a8445ee6f729028209ae1366c3fa38 100644 +index 5741a60faba70da485053599c9370f0e27e868f4..f3b7e21e4289812482cfbfa0bda6d9b75d7fa115 100644 --- a/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java +++ b/src/main/java/io/papermc/paper/plugin/PluginInitializerManager.java -@@ -121,19 +121,30 @@ public class PluginInitializerManager { +@@ -112,19 +112,30 @@ public class PluginInitializerManager { java.util.List dirs = ((java.util.List) optionSet.valuesOf("add-plugin-dir")).stream().map(File::toPath).toList(); dirs.forEach(pluginDir -> io.papermc.paper.plugin.util.EntrypointUtil.registerProvidersFromSource(io.papermc.paper.plugin.provider.source.DirectoryProviderSource.INSTANCE_NO_CREATE, pluginDir)); @@ -241,30 +240,11 @@ index 26422904751647a061397ce978bba752149003cd..884ed63dab16acca83fe8f421762f256 this.providers.add(provider); } -diff --git a/src/main/java/io/papermc/paper/pluginremap/PluginRemapper.java b/src/main/java/io/papermc/paper/pluginremap/PluginRemapper.java -index fbad4a2242aa1ab910b2e2ae4cce973ff63fda84..89d4fa952d072dd6e071dc9eef51f4050f7e750e 100644 ---- a/src/main/java/io/papermc/paper/pluginremap/PluginRemapper.java -+++ b/src/main/java/io/papermc/paper/pluginremap/PluginRemapper.java -@@ -337,7 +337,13 @@ public final class PluginRemapper { - } - index.skip(inputFile); - return CompletableFuture.completedFuture(inputFile); -- } -+ } else if (ns == null && Files.exists(fs.getPath(PluginFileType.LEAVES_PLUGIN_JSON))) { // Leaves start - leaves plugin -+ if (DEBUG_LOGGING) { -+ LOGGER.info("Plugin '{}' is a Leaves plugin with no namespace specified.", inputFile); -+ } -+ index.skip(inputFile); -+ return CompletableFuture.completedFuture(inputFile); -+ } // Leaves end - leaves plugin - } - } catch (final IOException ex) { - return CompletableFuture.failedFuture(new RuntimeException("Failed to open plugin jar " + inputFile, ex)); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 7d74bedf91d6448dc2bf2920a84d8e93edf2a279..b22f9cf5da95435527aaae99e23f6f834727072f 100644 +index a8c195b2ad04875bde0fe0f1e3131f0b3b99ebb3..5c28c977ee40af4360e638c3adaa7184e5f43a1a 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -2973,6 +2973,13 @@ public final class CraftServer implements Server { +@@ -2969,6 +2969,13 @@ public final class CraftServer implements Server { this.console.addPluginAllowingSleep(plugin.getName(), value); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBot.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBot.java index 55b7289c8..ffed6974b 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBot.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBot.java @@ -40,9 +40,9 @@ import net.minecraft.world.inventory.ChestMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.level.gamerules.GameRules; import net.minecraft.world.level.Level; import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraft.world.level.gamerules.GameRules; import net.minecraft.world.level.portal.TeleportTransition; import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; @@ -348,7 +348,7 @@ public void updateItemInHand(InteractionHand hand) { } @Override - public @NotNull InteractionResult interact(@NotNull Player player, @NotNull InteractionHand hand) { + public @NotNull InteractionResult interact(@NotNull Player player, @NotNull InteractionHand hand, @NotNull net.minecraft.world.phys.Vec3 location) { if (LeavesConfig.modify.fakeplayer.canOpenInventory) { if (player instanceof ServerPlayer player1 && player.getMainHandItem().isEmpty()) { BotInventoryOpenEvent event = new BotInventoryOpenEvent(this.getBukkitEntity(), player1.getBukkitEntity()); @@ -359,7 +359,7 @@ public void updateItemInHand(InteractionHand hand) { } } } - return super.interact(player, hand); + return super.interact(player, hand, location); } @Override diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBotPacketListenerImpl.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBotPacketListenerImpl.java index 8929c33f6..0b2345d0d 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBotPacketListenerImpl.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/ServerBotPacketListenerImpl.java @@ -30,13 +30,14 @@ public boolean isAcceptingMessages() { return true; } + // Leaves - bots never send a client-loaded packet; report loaded so the spawn-invulnerability timer (isInvulnerableTo) isn't stuck on @Override - public void tick() { + public boolean hasClientLoaded() { + return true; } @Override - public boolean hasClientLoaded() { - return true; // Don't kick me out! + public void tick() { } public static class BotConnection extends Connection { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerUseItemToAction.java b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerUseItemToAction.java index 0f1cf6e6b..d1b200605 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerUseItemToAction.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/bot/agent/actions/ServerUseItemToAction.java @@ -34,9 +34,9 @@ public static InteractionResult useItemTo(ServerBot bot, EntityHitResult hitResu Vec3 vec3 = hitResult.getLocation().subtract(entity.getX(), entity.getY(), entity.getZ()); bot.updateItemInHand(hand); - InteractionResult interactionResult = entity.interactAt(bot, vec3, hand); + InteractionResult interactionResult = entity.interact(bot, hand, vec3); if (!interactionResult.consumesAction()) { - interactionResult = bot.interactOn(hitResult.getEntity(), hand); + interactionResult = bot.interactOn(hitResult.getEntity(), hand, vec3); } if (shouldSwing(interactionResult)) { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/lithium/common/block/entity/SleepUntilTimeBlockEntityTickInvoker.java b/leaves-server/src/main/java/org/leavesmc/leaves/lithium/common/block/entity/SleepUntilTimeBlockEntityTickInvoker.java index 9f38c9d4f..003d5b202 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/lithium/common/block/entity/SleepUntilTimeBlockEntityTickInvoker.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/lithium/common/block/entity/SleepUntilTimeBlockEntityTickInvoker.java @@ -18,6 +18,7 @@ package org.leavesmc.leaves.lithium.common.block.entity; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.TickingBlockEntity; @@ -48,6 +49,6 @@ public BlockPos getPos() { @Override public String getType() { //noinspection ConstantConditions - return BlockEntityType.getKey(this.sleepingBlockEntity.getType()).toString(); + return BuiltInRegistries.BLOCK_ENTITY_TYPE.getKey(this.sleepingBlockEntity.getType()).toString(); } } \ No newline at end of file diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/network/AsyncKeepaliveManager.java b/leaves-server/src/main/java/org/leavesmc/leaves/network/AsyncKeepaliveManager.java index 76d9ba2a1..6d8cc36b2 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/network/AsyncKeepaliveManager.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/network/AsyncKeepaliveManager.java @@ -1,5 +1,6 @@ package org.leavesmc.leaves.network; +import net.minecraft.util.Util; import net.minecraft.network.Connection; import net.minecraft.server.network.ServerCommonPacketListenerImpl; import net.minecraft.util.Util; @@ -50,7 +51,7 @@ private static void tickAll() { for (ServerCommonPacketListenerImpl listener : ACTIVE_LISTENERS.values()) { try { listener.keepConnectionAliveAsync(currentTimeNs, currentTimeMs); - if (!listener.connection.isConnected() || listener.processedDisconnect) { + if (!listener.connection.isConnected()) { ACTIVE_LISTENERS.remove(listener.connection, listener); } } catch (Throwable throwable) { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/profile/LeavesMinecraftSessionService.java b/leaves-server/src/main/java/org/leavesmc/leaves/profile/LeavesMinecraftSessionService.java index dc9045df9..5817f6f84 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/profile/LeavesMinecraftSessionService.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/profile/LeavesMinecraftSessionService.java @@ -6,6 +6,7 @@ import com.mojang.authlib.HttpAuthenticationService; import com.mojang.authlib.exceptions.AuthenticationUnavailableException; import com.mojang.authlib.exceptions.MinecraftClientException; +import com.mojang.authlib.minecraft.client.MinecraftClient; import com.mojang.authlib.yggdrasil.ProfileActionType; import com.mojang.authlib.yggdrasil.ProfileResult; import com.mojang.authlib.yggdrasil.ServicesKeySet; @@ -32,8 +33,11 @@ public class LeavesMinecraftSessionService extends PaperMinecraftSessionService { + private final MinecraftClient leavesClient; // Leaves - mirror of YggdrasilMinecraftSessionService#client (now private) + protected LeavesMinecraftSessionService(ServicesKeySet keySet, Proxy authenticationService, Environment environment) { super(keySet, authenticationService, environment); + this.leavesClient = MinecraftClient.unauthenticated(authenticationService); } private static List extraYggdrasilList = List.of(); @@ -73,7 +77,7 @@ public ProfileResult hasJoinedServer(String profileName, String serverId, @Nulla for (URL checkUrl : extraYggdrasilList) { URL url = HttpAuthenticationService.concatenateURL(checkUrl, HttpAuthenticationService.buildQuery(arguments)); try { - final HasJoinedMinecraftServerResponse response = client.get(url, HasJoinedMinecraftServerResponse.class); + final HasJoinedMinecraftServerResponse response = this.leavesClient.get(url, HasJoinedMinecraftServerResponse.class); // Leaves - use own client if (response != null && response.id() != null) { if (LeavesConfig.mics.yggdrasil.loginProtect && cache != null) { if (!response.id().equals(cache.id())) { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/REIServerProtocol.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/REIServerProtocol.java index 97e0616f8..826a9152f 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/REIServerProtocol.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/REIServerProtocol.java @@ -138,11 +138,14 @@ private static void reloadRecipe(int reiRecipeVer) { switch (holder.value()) { case ShapedRecipe ignored -> builder.add(new ShapedDisplay((RecipeHolder) holder)); case ShapelessRecipe ignored -> builder.add(new ShapelessDisplay((RecipeHolder) holder)); + // Leaves - map_cloning is a generic TransmuteRecipe; match it by id before the generic case so it gets a shapeless-style display + case TransmuteRecipe ignored when "minecraft:map_cloning".equals(holder.id().identifier().toString()) -> + builder.addAll(Display.ofMapCloningRecipe((RecipeHolder) holder)); case TransmuteRecipe ignored -> builder.addAll(Display.ofTransmuteRecipe((RecipeHolder) holder)); - case TippedArrowRecipe ignored -> builder.addAll(Display.ofTippedArrowRecipe((RecipeHolder) holder)); case FireworkRocketRecipe ignored -> builder.addAll(Display.ofFireworkRocketRecipe((RecipeHolder) holder)); - case MapCloningRecipe ignored -> builder.addAll(Display.ofMapCloningRecipe((RecipeHolder) holder)); - // ignore ArmorDyeRecipe, BannerDuplicateRecipe, BookCloningRecipe, ShieldDecorationRecipe + // Leaves - tipped_arrow is the only ImbueRecipe, so a plain type match routes it + case ImbueRecipe ignored -> builder.addAll(Display.ofTippedArrowRecipe((RecipeHolder) holder)); + // ignore ArmorDyeRecipe, BannerDuplicateRecipe, BookCloningRecipe, ShieldDecorationRecipe, RepairItemRecipe default -> { } } @@ -234,7 +237,7 @@ public static void handleCreateItem(ServerPlayer player, RegistryFriendlyByteBuf }); */ } else { - player.displayClientMessage(Component.translatable("text.rei.failed_cheat_items"), false); + player.sendSystemMessage(Component.translatable("text.rei.failed_cheat_items"), false); } }; inboundTransform(player, CREATE_ITEMS_PACKET, buf, consumer); @@ -293,7 +296,7 @@ public static void handleCreateItemHotbar(ServerPlayer player, RegistryFriendlyB }); */ } else { - player.displayClientMessage(Component.translatable("text.rei.failed_cheat_items"), false); + player.sendSystemMessage(Component.translatable("text.rei.failed_cheat_items"), false); } }; inboundTransform(player, CREATE_ITEMS_HOTBAR_PACKET, buf, consumer); @@ -367,7 +370,7 @@ private static boolean hasCheatPermission(ServerPlayer player) { if (player.getBukkitEntity().hasPermission(CHEAT_PERMISSION)) { return true; } - player.displayClientMessage(Component.translatable("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + player.sendSystemMessage(Component.translatable("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); return false; } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/CookingDisplay.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/CookingDisplay.java index 706e47a02..8064ac227 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/CookingDisplay.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/CookingDisplay.java @@ -41,7 +41,7 @@ private CookingDisplay(@NotNull List inputs, @NotNull List recipe) { this( List.of(EntryIngredient.ofIngredient(recipe.value().input())), - List.of(EntryIngredient.of(recipe.value().assemble(new SingleRecipeInput(ItemStack.EMPTY), CraftRegistry.getMinecraftRegistry()))), + List.of(EntryIngredient.of(recipe.value().assemble(new SingleRecipeInput(ItemStack.EMPTY)))), recipe.id().identifier(), recipe.value().experience(), recipe.value().cookingTime() diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/Display.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/Display.java index 5886eec41..df07052dd 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/Display.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/Display.java @@ -24,11 +24,9 @@ import net.minecraft.world.item.component.ProvidesTrimMaterial; import net.minecraft.world.item.crafting.FireworkRocketRecipe; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.MapCloningRecipe; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.item.crafting.SmithingTransformRecipe; import net.minecraft.world.item.crafting.SmithingTrimRecipe; -import net.minecraft.world.item.crafting.TippedArrowRecipe; import net.minecraft.world.item.crafting.TransmuteRecipe; import net.minecraft.world.item.crafting.display.RecipeDisplay; import net.minecraft.world.item.crafting.display.ShapedCraftingRecipeDisplay; @@ -106,7 +104,7 @@ public static Collection ofTransmuteRecipe(@NotNull RecipeHolder ofTippedArrowRecipe(@NotNull RecipeHolder recipeHolder) { + public static Collection ofTippedArrowRecipe(@NotNull RecipeHolder recipeHolder) { EntryIngredient arrowIngredient = EntryIngredient.of(Items.ARROW); Set registeredPotions = new HashSet<>(); List displays = new ArrayList<>(); @@ -157,7 +155,7 @@ public static Collection ofFireworkRocketRecipe(@NotNull RecipeHolder ofMapCloningRecipe(@NotNull RecipeHolder recipeHolder) { + public static Collection ofMapCloningRecipe(@NotNull RecipeHolder recipeHolder) { return Collections.singleton( new ShapelessDisplay( List.of(EntryIngredient.of(Items.FILLED_MAP), EntryIngredient.of(Items.MAP)), @@ -210,15 +208,15 @@ public static Collection ofSmithingTrimRecipe(@NotNull RecipeHolder> getMaterialFromIngredient(HolderLookup.Provider provider, Holder item) { - ProvidesTrimMaterial providesTrimMaterial = new ItemStack(item).get(DataComponents.PROVIDES_TRIM_MATERIAL); - return providesTrimMaterial != null ? providesTrimMaterial.unwrap(provider) : Optional.empty(); + Holder providesTrimMaterial = new ItemStack(item).get(DataComponents.PROVIDES_TRIM_MATERIAL); + return providesTrimMaterial != null ? Optional.of(providesTrimMaterial) : Optional.empty(); } public static EntryIngredient ofSlotDisplay(SlotDisplay slot) { return switch (slot) { case SlotDisplay.Empty ignored -> EntryIngredient.empty(); case SlotDisplay.ItemSlotDisplay s -> EntryIngredient.of(s.item().value()); - case SlotDisplay.ItemStackSlotDisplay s -> EntryIngredient.of(s.stack()); + case SlotDisplay.ItemStackSlotDisplay s -> EntryIngredient.of(s.stack().create()); case SlotDisplay.TagSlotDisplay s -> ofItemTag(s.tag()); case SlotDisplay.Composite s -> { ArrayList list = new ArrayList<>(); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/ShapedDisplay.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/ShapedDisplay.java index abd7222a5..c1e117182 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/ShapedDisplay.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/ShapedDisplay.java @@ -40,7 +40,7 @@ public class ShapedDisplay extends CraftingDisplay { public ShapedDisplay(@NotNull RecipeHolder recipeHolder) { super( ofIngredient(recipeHolder.value()), - List.of(EntryIngredient.of(recipeHolder.value().assemble(CraftingInput.EMPTY, CraftRegistry.getMinecraftRegistry()))), + List.of(EntryIngredient.of(recipeHolder.value().assemble(CraftingInput.EMPTY))), recipeHolder.id().identifier() ); this.width = recipeHolder.value().getWidth(); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/ShapelessDisplay.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/ShapelessDisplay.java index fc69deb86..3de6c8a2f 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/ShapelessDisplay.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/ShapelessDisplay.java @@ -38,7 +38,7 @@ public ShapelessDisplay(@NotNull List inputs, public ShapelessDisplay(@NotNull RecipeHolder recipeHolder) { this( recipeHolder.value().placementInfo().ingredients().stream().map(EntryIngredient::ofIngredient).toList(), - List.of(EntryIngredient.of(recipeHolder.value().assemble(CraftingInput.EMPTY, CraftRegistry.getMinecraftRegistry()))), + List.of(EntryIngredient.of(recipeHolder.value().assemble(CraftingInput.EMPTY))), recipeHolder.id().identifier() ); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/StoneCuttingDisplay.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/StoneCuttingDisplay.java index 273de2533..e12dac3f6 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/StoneCuttingDisplay.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/display/StoneCuttingDisplay.java @@ -38,7 +38,7 @@ public StoneCuttingDisplay(@NotNull List inputs, @NotNull List< public StoneCuttingDisplay(RecipeHolder recipeHolder) { this( List.of(EntryIngredient.ofIngredient(recipeHolder.value().input())), - List.of(EntryIngredient.of(recipeHolder.value().assemble(new SingleRecipeInput(ItemStack.EMPTY), CraftRegistry.getMinecraftRegistry()))), + List.of(EntryIngredient.of(recipeHolder.value().assemble(new SingleRecipeInput(ItemStack.EMPTY)))), recipeHolder.id().identifier() ); } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/ingredient/EntryIngredient.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/ingredient/EntryIngredient.java index 20e872506..ce1a63c81 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/ingredient/EntryIngredient.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/ingredient/EntryIngredient.java @@ -36,7 +36,7 @@ public void encode(@NotNull RegistryFriendlyByteBuf buffer, @NotNull EntryIngred buffer.writeVarInt(0); } else { buffer.writeVarInt(itemStack.getCount()); - ITEM_STREAM_CODEC.encode(buffer, itemStack.getItemHolder()); + ITEM_STREAM_CODEC.encode(buffer, itemStack.typeHolder()); DataComponentPatch.STREAM_CODEC.encode(buffer, itemStack.components.asPatch()); } }); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/transfer/ItemRecipeFinder.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/transfer/ItemRecipeFinder.java index d6f5a4cc9..1103d78e8 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/transfer/ItemRecipeFinder.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/rei/transfer/ItemRecipeFinder.java @@ -87,7 +87,7 @@ public int countRecipeCrafts(List> list, int maxCrafts, @Nullabl } private ItemKey ofKey(ItemStack itemStack) { - return keys.intern(new ItemKey(itemStack.getItemHolder(), itemStack.getComponentsPatch())); + return keys.intern(new ItemKey(itemStack.typeHolder(), itemStack.getComponentsPatch())); } private Ingredient ofKeys(int index, List itemStack) { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java index 6196ac8e6..efa2a7259 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxHudDataProtocol.java @@ -18,6 +18,7 @@ import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.gamerules.GameRules; +import net.minecraft.world.level.saveddata.WeatherData; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesConfig; import org.leavesmc.leaves.protocol.core.LeavesCustomPayload; @@ -142,22 +143,23 @@ public static void refreshWeatherData(ServerPlayer player) { nbt.putString("id", HudDataPayload.CHANNEL.toString()); nbt.putString("servux", ServuxProtocol.SERVUX_STRING); - if (level.serverLevelData.isRaining() && level.serverLevelData.getRainTime() > -1) { - nbt.putInt("SetRaining", level.serverLevelData.getRainTime()); + final WeatherData weatherData = level.getWeatherData(); + if (weatherData.isRaining() && weatherData.getRainTime() > -1) { + nbt.putInt("SetRaining", weatherData.getRainTime()); nbt.putBoolean("isRaining", true); } else { nbt.putBoolean("isRaining", false); } - if (level.serverLevelData.isThundering() && level.serverLevelData.getThunderTime() > -1) { - nbt.putInt("SetThundering", level.serverLevelData.getThunderTime()); + if (weatherData.isThundering() && weatherData.getThunderTime() > -1) { + nbt.putInt("SetThundering", weatherData.getThunderTime()); nbt.putBoolean("isThundering", true); } else { nbt.putBoolean("isThundering", false); } - if (level.serverLevelData.getClearWeatherTime() > -1) { - nbt.putInt("SetClear", level.serverLevelData.getClearWeatherTime()); + if (weatherData.getClearWeatherTime() > -1) { + nbt.putInt("SetClear", weatherData.getClearWeatherTime()); } sendPacket(player, new HudDataPayload(HudDataPayloadType.PACKET_S2C_WEATHER_TICK, nbt)); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxStructuresProtocol.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxStructuresProtocol.java index 3eafd1b02..62a943166 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxStructuresProtocol.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/ServuxStructuresProtocol.java @@ -90,7 +90,7 @@ public static void onStartedWatchingChunk(ServerPlayer player, LevelChunk chunk) private static void addChunkTimeoutIfHasReferences(final UUID uuid, LevelChunk chunk, final int tickCounter) { final ChunkPos pos = chunk.getPos(); - if (chunkHasStructureReferences(pos.x, pos.z, chunk.getLevel())) { + if (chunkHasStructureReferences(pos.x(), pos.z(), chunk.getLevel())) { final Map map = timeouts.computeIfAbsent(uuid, (u) -> new HashMap<>()); map.computeIfAbsent(pos, (p) -> new Timeout(tickCounter - timeout)); } @@ -150,8 +150,8 @@ public static void initialSyncStructures(ServerPlayer player, int chunkRadius, i public static Map getStructureReferences(ServerLevel world, ChunkPos center, int chunkRadius) { Map references = new HashMap<>(); - for (int cx = center.x - chunkRadius; cx <= center.x + chunkRadius; ++cx) { - for (int cz = center.z - chunkRadius; cz <= center.z + chunkRadius; ++cz) { + for (int cx = center.x() - chunkRadius; cx <= center.x() + chunkRadius; ++cx) { + for (int cz = center.z() - chunkRadius; cz <= center.z() + chunkRadius; ++cz) { getReferencesFromChunk(cx, cz, world, references); } } @@ -221,13 +221,13 @@ public static Map getStructureStarts(ServerLevel world LongIterator iter = startChunks.iterator(); while (iter.hasNext()) { - ChunkPos pos = new ChunkPos(iter.nextLong()); + ChunkPos pos = ChunkPos.unpack(iter.nextLong()); - if (!world.hasChunk(pos.x, pos.z)) { + if (!world.hasChunk(pos.x(), pos.z())) { continue; } - ChunkAccess chunk = world.getChunk(pos.x, pos.z, ChunkStatus.STRUCTURE_STARTS, false); + ChunkAccess chunk = world.getChunk(pos.x(), pos.z(), ChunkStatus.STRUCTURE_STARTS, false); StructureStart start = null; if (chunk != null) { start = chunk.getStartForStructure(structure); @@ -271,7 +271,7 @@ public static void sendAndRefreshExpiredStructures(ServerPlayer player, Map retainDistance || Math.abs(pos.z - center.z) > retainDistance; + return Math.abs(pos.x() - center.x()) > retainDistance || Math.abs(pos.z() - center.z()) > retainDistance; } public static void addOrRefreshTimeouts(final UUID uuid, final Map references, final int tickCounter) { @@ -296,7 +296,7 @@ public static void addOrRefreshTimeouts(final UUID uuid, final Map new Timeout(tickCounter)).setLastSync(tickCounter); } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/ServuxLitematicsProtocol.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/ServuxLitematicsProtocol.java index 42fc93765..7e403364c 100755 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/ServuxLitematicsProtocol.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/ServuxLitematicsProtocol.java @@ -170,7 +170,7 @@ public static void onBulkEntityRequest(ServerPlayer player, ChunkPos chunkPos, C } ServerLevel world = player.level(); - ChunkAccess chunk = world.getChunk(chunkPos.x, chunkPos.z, ChunkStatus.FULL, false); + ChunkAccess chunk = world.getChunk(chunkPos.x(), chunkPos.z(), ChunkStatus.FULL, false); if (chunk == null) { return; @@ -215,8 +215,8 @@ public static void onBulkEntityRequest(ServerPlayer player, ChunkPos chunkPos, C output.putString("Task", "BulkEntityReply"); output.put("TileEntities", tileList); output.put("Entities", entityList); - output.putInt("chunkX", chunkPos.x); - output.putInt("chunkZ", chunkPos.z); + output.putInt("chunkX", chunkPos.x()); + output.putInt("chunkZ", chunkPos.z()); ServuxProtocol.LOGGER.debug("process bulk entity used: {}ms", System.currentTimeMillis() - timeStart); ServuxLitematicaPayload send = new ServuxLitematicaPayload(ServuxLitematicaPayloadType.PACKET_S2C_NBT_RESPONSE_START); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/utils/SchematicPlacingUtils.java b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/utils/SchematicPlacingUtils.java index 090bfb13e..d951c2fb5 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/utils/SchematicPlacingUtils.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/protocol/servux/litematics/utils/SchematicPlacingUtils.java @@ -45,7 +45,7 @@ public static void placeToWorldWithinChunk( boolean notifyNeighbors ) { LitematicaSchematic schematic = schematicPlacement.getSchematic(); - Set regionsTouchingChunk = schematicPlacement.getRegionsTouchingChunk(chunkPos.x, chunkPos.z); + Set regionsTouchingChunk = schematicPlacement.getRegionsTouchingChunk(chunkPos.x(), chunkPos.z()); BlockPos origin = schematicPlacement.getOrigin(); for (String regionName : regionsTouchingChunk) { @@ -93,7 +93,7 @@ public static boolean placeBlocksWithinChunk( @Nullable Map> scheduledFluidTicks, ReplaceBehavior replace, boolean notifyNeighbors ) { - IntBoundingBox bounds = schematicPlacement.getBoxWithinChunkForRegion(regionName, chunkPos.x, chunkPos.z); + IntBoundingBox bounds = schematicPlacement.getBoxWithinChunkForRegion(regionName, chunkPos.x(), chunkPos.z()); Vec3i regionSize = schematicPlacement.getSchematic().getSubRegion(regionName).size(); if (bounds == null || container == null || blockEntityMap == null || regionSize == null) { @@ -303,10 +303,10 @@ public static void placeEntitiesToWorldWithinChunk( final int offX = regionPosRelTransformed.getX() + origin.getX(); final int offY = regionPosRelTransformed.getY() + origin.getY(); final int offZ = regionPosRelTransformed.getZ() + origin.getZ(); - final double minX = (chunkPos.x << 4); - final double minZ = (chunkPos.z << 4); - final double maxX = (chunkPos.x << 4) + 16; - final double maxZ = (chunkPos.z << 4) + 16; + final double minX = (chunkPos.x() << 4); + final double minZ = (chunkPos.z() << 4); + final double maxX = (chunkPos.x() << 4) + 16; + final double maxZ = (chunkPos.z() << 4) + 16; final Rotation rotationCombined = schematicPlacement.getRotation().getRotated(placement.rotation()); final Mirror mirrorMain = schematicPlacement.getMirror(); diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/region/linear/LinearRegionFile.java b/leaves-server/src/main/java/org/leavesmc/leaves/region/linear/LinearRegionFile.java index da48676c4..204cde6f7 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/region/linear/LinearRegionFile.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/region/linear/LinearRegionFile.java @@ -334,8 +334,8 @@ public boolean hasChunk(ChunkPos pos) { } readLock.lock(); try { - openBucket(pos.x, pos.z); - return this.bufferUncompressedSize[getChunkIndex(pos.x, pos.z)] > 0; + openBucket(pos.x(), pos.z()); + return this.bufferUncompressedSize[getChunkIndex(pos.x(), pos.z())] > 0; } finally { readLock.unlock(); } @@ -593,7 +593,7 @@ public void write(ChunkPos pos, ByteBuffer buffer) { try { this.lastRegionAccessTime = System.currentTimeMillis(); openRegionFile(); - openBucket(pos.x, pos.z); + openBucket(pos.x(), pos.z()); try { byte[] b = toByteArray(new ByteArrayInputStream(buffer.array())); int uncompressedSize = b.length; @@ -608,10 +608,10 @@ public void write(ChunkPos pos, ByteBuffer buffer) { b = new byte[compressedLength]; System.arraycopy(compressed, 0, b, 0, compressedLength); - int index = getChunkIndex(pos.x, pos.z); + int index = getChunkIndex(pos.x(), pos.z()); this.buffer[index] = b; this.chunkTimestamps[index] = getTimestamp(); - this.bufferUncompressedSize[getChunkIndex(pos.x, pos.z)] = uncompressedSize; + this.bufferUncompressedSize[getChunkIndex(pos.x(), pos.z())] = uncompressedSize; } } catch (IOException e) { LOGGER.error("Chunk write IOException {} {}", e, this.regionFile); @@ -626,7 +626,7 @@ public DataOutputStream getChunkDataOutputStream(ChunkPos pos) { writeLock.lock(); try { openRegionFile(); - openBucket(pos.x, pos.z); + openBucket(pos.x(), pos.z()); return new DataOutputStream(new BufferedOutputStream(new LinearRegionFile.ChunkBuffer(pos))); } finally { writeLock.unlock(); @@ -674,11 +674,11 @@ public DataInputStream getChunkDataInputStream(ChunkPos pos) { } readLock.lock(); try { - openBucket(pos.x, pos.z); + openBucket(pos.x(), pos.z()); - if (this.bufferUncompressedSize[getChunkIndex(pos.x, pos.z)] != 0) { - byte[] content = new byte[bufferUncompressedSize[getChunkIndex(pos.x, pos.z)]]; - decompressor.decompress(this.buffer[getChunkIndex(pos.x, pos.z)], 0, content, 0, bufferUncompressedSize[getChunkIndex(pos.x, pos.z)]); + if (this.bufferUncompressedSize[getChunkIndex(pos.x(), pos.z())] != 0) { + byte[] content = new byte[bufferUncompressedSize[getChunkIndex(pos.x(), pos.z())]]; + decompressor.decompress(this.buffer[getChunkIndex(pos.x(), pos.z())], 0, content, 0, bufferUncompressedSize[getChunkIndex(pos.x(), pos.z())]); return new DataInputStream(new ByteArrayInputStream(content)); } return null; @@ -692,8 +692,8 @@ public void clear(ChunkPos pos) { try { this.lastRegionAccessTime = System.currentTimeMillis(); openRegionFile(); - openBucket(pos.x, pos.z); - int i = getChunkIndex(pos.x, pos.z); + openBucket(pos.x(), pos.z()); + int i = getChunkIndex(pos.x(), pos.z()); this.buffer[i] = null; this.bufferUncompressedSize[i] = 0; this.chunkTimestamps[i] = 0; diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java b/leaves-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java index 0f56f2171..1f8e42404 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/replay/Recorder.java @@ -203,7 +203,18 @@ public void send(@NotNull Packet packet, @Nullable ChannelFutureListener call } if (recorderOption.forceDayTime != -1 && packet instanceof ClientboundSetTimePacket packet1) { - packet = new ClientboundSetTimePacket(packet1.dayTime(), recorderOption.forceDayTime, false); + // Leaves - freeze each world clock at forceDayTime within its current day, keeping the day count (mirrors ServerPlayer#getDefaultClockTime: floor to day start + offset) + packet = new ClientboundSetTimePacket( + packet1.gameTime(), + net.minecraft.util.Util.mapValues( + packet1.clockUpdates(), + state -> new net.minecraft.world.clock.ClockNetworkState( + state.totalTicks() - (state.totalTicks() % net.minecraft.SharedConstants.TICKS_PER_GAME_DAY) + recorderOption.forceDayTime, + 0.0F, + 0.0F + ) + ) + ); } if (recorderOption.forceWeather != null && packet instanceof ClientboundGameEventPacket packet1) { diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/util/FertilizableCoral.java b/leaves-server/src/main/java/org/leavesmc/leaves/util/FertilizableCoral.java index 588fac5e7..d5a236b0b 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/util/FertilizableCoral.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/util/FertilizableCoral.java @@ -63,9 +63,9 @@ default void performBonemeal(@NotNull ServerLevel worldIn, RandomSource random, if (!coral.placeFeature(worldIn, random, pos, properBlock)) { worldIn.setBlock(pos, blockUnder, 3); } else { - if (worldIn.random.nextInt(10) == 0) { - BlockPos randomPos = pos.offset(worldIn.random.nextInt(16) - 8, worldIn.random.nextInt(8), worldIn.random.nextInt(16) - 8); - if (coralBlocks.contains(worldIn.getBlockState(randomPos).getBlockHolder())) { + if (worldIn.getRandom().nextInt(10) == 0) { + BlockPos randomPos = pos.offset(worldIn.getRandom().nextInt(16) - 8, worldIn.getRandom().nextInt(8), worldIn.getRandom().nextInt(16) - 8); + if (coralBlocks.contains(worldIn.getBlockState(randomPos).typeHolder())) { worldIn.setBlock(randomPos, Blocks.WET_SPONGE.defaultBlockState(), Block.UPDATE_ALL); } } diff --git a/leaves-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java b/leaves-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java index c06a37d4a..2d1637008 100644 --- a/leaves-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java +++ b/leaves-server/src/main/java/org/leavesmc/leaves/util/HopperCounter.java @@ -11,6 +11,7 @@ import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.core.RegistryAccess; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; @@ -282,13 +283,16 @@ public static TextColor fromItem(Item item, RegistryAccess registryAccess) { if (DEFAULTS.containsKey(item)) { return TextColor.color(appropriateColor(DEFAULTS.get(item).defaultMapColor().col)); } - if (item instanceof DyeItem dye) { - return TextColor.color(appropriateColor(dye.getDyeColor().getMapColor().col)); + if (item instanceof DyeItem) { + DyeColor dyeColor = item.components().get(DataComponents.DYE); + if (dyeColor != null) { + return TextColor.color(appropriateColor(dyeColor.getMapColor().col)); + } } Block block = null; - final Registry<@NotNull Item> itemRegistry = registryAccess.lookupOrThrow(Registries.ITEM); - final Registry<@NotNull Block> blockRegistry = registryAccess.lookupOrThrow(Registries.BLOCK); + final Registry itemRegistry = registryAccess.lookupOrThrow(Registries.ITEM); + final Registry blockRegistry = registryAccess.lookupOrThrow(Registries.BLOCK); Identifier id = itemRegistry.getKey(item); if (item instanceof BlockItem blockItem) { block = blockItem.getBlock();