From 578894262980477c75f8d713058d494b5d4121cd Mon Sep 17 00:00:00 2001 From: AlphaKR93 Date: Wed, 22 Jan 2025 13:54:35 +0900 Subject: [PATCH] Some fixes --- build-data/dev-imports.txt | 3 + build.gradle.kts | 34 +-- buildSrc/build.gradle.kts | 31 --- .../plazmamc/alwaysuptodate/AlwaysUpToDate.kt | 79 ------ .../alwaysuptodate/AlwaysUpToDateException.kt | 6 - .../alwaysuptodate/AlwaysUpToDateExtension.kt | 20 -- .../tasks/CheckUpstreamCommit.kt | 40 --- .../tasks/CreateCompareComment.kt | 48 ---- .../tasks/GenerateMergedAPIPatch.kt | 38 --- .../tasks/GenerateMergedServerPatch.kt | 51 ---- .../alwaysuptodate/tasks/PurpurUpdateTask.kt | 252 ------------------ .../tasks/SimpleUpstreamUpdateTask.kt | 48 ---- .../org/plazmamc/alwaysuptodate/tasks/Task.kt | 13 - .../org/plazmamc/alwaysuptodate/utils/Git.kt | 33 --- .../plazmamc/alwaysuptodate/utils/Gradle.kt | 36 --- .../plazmamc/alwaysuptodate/utils/Tasks.kt | 116 -------- .../plazmamc/alwaysuptodate/utils/Utils.kt | 3 - .../always-up-to-date.properties | 1 - gradle.properties | 9 - libs/api.versions.toml | 2 +- .../0002-Use-Gradle-Version-Catalogs.patch | 7 +- .../0009-Temporary-javadoc-build-fix.patch | 4 +- ...054-SparklyPaper-Optimize-farm-check.patch | 36 ++- .../server/0062-Register-every-commands.patch | 111 ++++++++ ...mand.patch => 0063-Add-heal-command.patch} | 27 +- patches/server/0064-Bundle-as-quivers.patch | 225 ++++++++++++++++ ...-argument-place-for-compass-command.patch} | 0 settings.gradle.kts | 7 - 28 files changed, 386 insertions(+), 894 deletions(-) delete mode 100644 buildSrc/build.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDate.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDateException.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDateExtension.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/CheckUpstreamCommit.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/CreateCompareComment.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/GenerateMergedAPIPatch.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/GenerateMergedServerPatch.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/PurpurUpdateTask.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/SimpleUpstreamUpdateTask.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/Task.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Git.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Gradle.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Tasks.kt delete mode 100644 buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Utils.kt delete mode 100644 buildSrc/src/main/resources/META-INF/gradle-plugins/always-up-to-date.properties create mode 100644 patches/server/0062-Register-every-commands.patch rename patches/server/{0062-Add-heal-command.patch => 0063-Add-heal-command.patch} (79%) create mode 100644 patches/server/0064-Bundle-as-quivers.patch rename patches/server/{0063-Add-missing-argument-place-for-compass-command.patch => 0065-Add-missing-argument-place-for-compass-command.patch} (100%) diff --git a/build-data/dev-imports.txt b/build-data/dev-imports.txt index 1d9862a..603912e 100644 --- a/build-data/dev-imports.txt +++ b/build-data/dev-imports.txt @@ -12,3 +12,6 @@ # mc_data chat_type/chat.json # mc_data dimension_type/overworld.json # + +minecraft net.minecraft.server.commands.PardonCommand +minecraft net.minecraft.server.commands.PardonIpCommand diff --git a/build.gradle.kts b/build.gradle.kts index 20824da..b4f13fa 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,16 +3,11 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent plugins { java - `kotlin-dsl` `maven-publish` - `always-up-to-date` alias(libs.plugins.shadow) apply false alias(libs.plugins.paperweight) } -val jdkVersion = property("jdkVersion").toString().toInt() -kotlin.jvmToolchain(jdkVersion) - repositories { mavenCentral() maven("https://repo.papermc.io/repository/maven-public/") { name = "papermc" @@ -67,7 +62,7 @@ tasks { apiCoordinates.set("${project.group}:${brandName.lowercase()}-api") libraryRepositories.addAll( "https://repo1.maven.org/maven2/", - "https://papermc.io/repo/repository/maven-public/", + "https://repo.papermc.io/repository/maven-public/", "https://repo.codemc.io/repository/maven-public/", "https://jitpack.io", ) @@ -84,7 +79,7 @@ allprojects { apply(plugin = "java") apply(plugin = "maven-publish") - java.toolchain.languageVersion.set(JavaLanguageVersion.of(jdkVersion)) + java.toolchain.languageVersion.set(JavaLanguageVersion.of(21)) publishing.repositories.maven("https://maven.pkg.github.com/$providerRepo") { name = "github" @@ -116,7 +111,7 @@ subprojects { tasks { withType().configureEach { options.encoding = Charsets.UTF_8.name() - options.release = jdkVersion + options.release = 21 } withType { @@ -136,26 +131,3 @@ subprojects { } } } - -val paperRepoVal = property("paperRepo").toString() -val paperBranch = property("paperBranch").toString() -val purpurRepoVal = property("purpurRepo").toString() -val purpurBranch = property("purpurBranch").toString() -val pufferfishRepoVal = property("pufferfishRepo").toString() -val pufferfishBranch = property("pufferfishBranch").toString() -val isUsePufferfish = property("usePufferfish").toString().toBoolean() -alwaysUpToDate { - - paperRepo.set(paperRepoVal) - paperRef.set(paperBranch) - paperCommitName.set("paperCommit") - - purpurRepo.set(purpurRepoVal) - purpurRef.set(purpurBranch) - purpurCommitName.set("purpurCommit") - - pufferfishRepo.set(pufferfishRepoVal) - pufferfishRef.set(pufferfishBranch) - usePufferfish.set(isUsePufferfish) - -} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index 31f5357..0000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,31 +0,0 @@ -plugins { - java - `kotlin-dsl` - id("com.gradleup.shadow") version "8.3.5" -} - -kotlin.jvmToolchain(21) - -repositories { - mavenCentral() - maven("https://papermc.io/repo/repository/maven-public/") -} - -dependencies { - shadow("io.papermc.paperweight:paperweight-patcher:1.6.2-SNAPSHOT") -} - -tasks { - jar { - finalizedBy(shadowJar) - } - - shadowJar { - archiveFileName.set("buildSrc.jar") - configurations = listOf(project.configurations["shadow"]) - - exclude("META-INF/gradle-plugins/io.papermc.paperweight.patcher.properties") - relocate("io.papermc.paperweight", "org.plazmamc.alwaysuptodate.internal.paperweight") - minimize() - } -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDate.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDate.kt deleted file mode 100644 index cc88a7a..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDate.kt +++ /dev/null @@ -1,79 +0,0 @@ -package org.plazmamc.alwaysuptodate - -import io.papermc.paperweight.util.Git -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.provider.Property -import org.gradle.api.tasks.TaskProvider -import org.plazmamc.alwaysuptodate.tasks.* -import org.plazmamc.alwaysuptodate.utils.CheckGitTask -import org.plazmamc.alwaysuptodate.utils.configureTask -import org.plazmamc.alwaysuptodate.utils.flatten -import org.plazmamc.alwaysuptodate.utils.registerTask - -class AlwaysUpToDate : Plugin { - - @Suppress("UNUSED_VARIABLE") - override fun apply(target: Project): Unit = with(target) { - - Git.checkForGit() - - val extension = extensions.create("alwaysUpToDate", AlwaysUpToDateExtension::class.java) - - val git = configureTask("checkGitStatus", "Verify that Git is available") - - fun generateTasks( - upstream: String, - provider: AlwaysUpToDateExtension.() -> Pair, Property>, Property> - ): Triple, TaskProvider, TaskProvider> { - val i = registerTask("check$upstream", "Check if the $upstream commit is up to date") { - dependsOn(git) - val (repo, ref, commitProperty) = extension.provider().flatten() - this.repo.set(repo) - this.ref.set(ref) - this.commitPropertyName.set(commitProperty) - } - - val j = registerTask("compare$upstream", "Create a comment comparing the $upstream commit") { - dependsOn(git) - val (repo, ref, commitProperty) = extension.provider().flatten() - this.repo.set(repo) - this.ref.set(ref) - this.commitPropertyName.set(commitProperty) - this.clear.set(false) - } - - val k = registerTask( - "cleanCompare$upstream", - "Create a comment comparing the $upstream commit" - ) { - dependsOn(git) - val (repo, ref, commitProperty) = extension.provider().flatten() - this.repo.set(repo) - this.ref.set(ref) - this.commitPropertyName.set(commitProperty) - this.clear.set(true) - } - - return (i to j to k).flatten() - } - - val (checkPaper, comparePaper, cleanComparePaper) = generateTasks("Paper") { paperRepo to paperRef to paperCommitName } - val (checkPurpur, comparePurpur, cleanComparePurpur) = generateTasks("Purpur") { purpurRepo to purpurRef to purpurCommitName } - - registerTask("updateUpstream", "Update the upstream commit") { - dependsOn(git) - repo.convention(extension.paperRepo) - ref.convention(extension.paperRef) - workDir.set(layout.projectDirectory) - regex.convention("paperCommit = ") - } - - registerTask("updateImplementation", "Update the implementation") { - dependsOn(git) - workDir.set(layout.projectDirectory) - } - - } - -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDateException.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDateException.kt deleted file mode 100644 index 4e0d0fa..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDateException.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.plazmamc.alwaysuptodate - -class AlwaysUpToDateException : Exception { - constructor(message: String) : super(message) - constructor(message: String, cause: Throwable?) : super(message, cause) -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDateExtension.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDateExtension.kt deleted file mode 100644 index b5813c4..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/AlwaysUpToDateExtension.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.plazmamc.alwaysuptodate - -import org.gradle.api.provider.Property - -interface AlwaysUpToDateExtension { - - val paperRepo: Property - val paperRef: Property - - val purpurRepo: Property - val purpurRef: Property - - val pufferfishRepo: Property - val pufferfishRef: Property - val usePufferfish: Property - - val paperCommitName: Property - val purpurCommitName: Property - -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/CheckUpstreamCommit.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/CheckUpstreamCommit.kt deleted file mode 100644 index 5a231d4..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/CheckUpstreamCommit.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.plazmamc.alwaysuptodate.tasks - -import org.gradle.api.Project -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.plazmamc.alwaysuptodate.AlwaysUpToDateException -import org.plazmamc.alwaysuptodate.AlwaysUpToDateExtension -import org.plazmamc.alwaysuptodate.utils.extension -import org.plazmamc.alwaysuptodate.utils.flatten -import org.plazmamc.alwaysuptodate.utils.git -import org.plazmamc.alwaysuptodate.utils.property - -abstract class CheckUpstreamCommit : Task() { - - @get:Input - abstract val repo: Property - - @get:Input - abstract val ref: Property - - @get:Input - abstract val commitPropertyName: Property - - override fun init(): Unit = with(project) { - outputs.upToDateWhen { checkCommitFor { repo to ref to commitPropertyName } } - - doLast { - println(checkCommitFor { repo to ref to commitPropertyName }) - } - } - -} - -private fun Project.getLatest(repository: String, branch: String) = - git("ls-remote", repository).readText()?.lines() - ?.first("[a-z0-9]{40}\trefs/heads/$branch".toRegex()::matches)?.split("\t")?.first() - ?: throw AlwaysUpToDateException("Failed to get latest commit of $repository") - -fun Project.checkCommitFor(block: AlwaysUpToDateExtension.() -> Pair, Property>, Property>): Boolean = - extension.block().flatten().let { getLatest(extension { it.first }, extension { it.second }) == property { it.third } } diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/CreateCompareComment.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/CreateCompareComment.kt deleted file mode 100644 index 844ae40..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/CreateCompareComment.kt +++ /dev/null @@ -1,48 +0,0 @@ -package org.plazmamc.alwaysuptodate.tasks - -import io.papermc.paperweight.util.fromJson -import io.papermc.paperweight.util.gson -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.TaskAction -import org.plazmamc.alwaysuptodate.utils.property -import paper.libs.com.google.gson.JsonObject -import java.net.URI - -abstract class CreateCompareComment : Task() { - - @get:Input - abstract val clear: Property - - @get:Input - abstract val repo: Property - - @get:Input - abstract val ref: Property - - @get:Input - abstract val commitPropertyName: Property - - @TaskAction - fun create() = with(project) { - val builder = StringBuilder() - val rawRepo = URI.create(repo.get()).path.substring(1) - - if (clear.get() || !file("compare.txt").exists()) - builder.append("\n\nUpstream has released updates that appear to apply and compile correctly.") - else - builder.append(file("compare.txt").readText()) - - builder.append("\n\n[${rawRepo.split("/").last()} Changes]\n") - - gson.fromJson( - URI.create("https://api.github.com/repos/$rawRepo/compare/${property { commitPropertyName }}...${ref.get()}").toURL().readText() - )["commits"].asJsonArray.forEach { obj -> - obj.asJsonObject.let { - builder.append("$rawRepo@${it["sha"].asString.subSequence(0, 7)}: ${it["commit"].asJsonObject["message"].asString.split("\n")[0]}\n") - } - } - file("compare.txt").writeText(builder.toString()) - } - -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/GenerateMergedAPIPatch.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/GenerateMergedAPIPatch.kt deleted file mode 100644 index 40c0170..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/GenerateMergedAPIPatch.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.plazmamc.alwaysuptodate.tasks - -import io.papermc.paperweight.util.Git -import io.papermc.paperweight.util.path -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputDirectory -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.TaskAction -import org.plazmamc.alwaysuptodate.utils.addCommit - -abstract class GenerateMergedAPIPatch : Task() { - - @get:InputDirectory - abstract val inputDir: DirectoryProperty - - @get:Internal - abstract val workDir: DirectoryProperty - - @get:Input - abstract val commitTitle: Property - - @get:Input - abstract val author: Property - - @get:Input - abstract val license: Property - - @TaskAction - fun generate() = with(workDir.path) { - val dotGit = resolve(".git").toFile().also(java.io.File::deleteRecursively) - - inputDir.path.toFile().copyRecursively(dotGit, overwrite = true) - Git(this).addCommit("${commitTitle.get()}\n\n${license.get()}", "--author=${author.get()}") - } - -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/GenerateMergedServerPatch.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/GenerateMergedServerPatch.kt deleted file mode 100644 index e5d339f..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/GenerateMergedServerPatch.kt +++ /dev/null @@ -1,51 +0,0 @@ -package org.plazmamc.alwaysuptodate.tasks - -import io.papermc.paperweight.util.Git -import io.papermc.paperweight.util.path -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.TaskAction -import org.plazmamc.alwaysuptodate.utils.addCommit -import java.io.File -import java.nio.file.Path - -abstract class GenerateMergedServerPatch : Task() { - - @get:Internal - abstract val workDir: DirectoryProperty - - @get:Input - abstract val commitTitle: Property - - @get:Input - abstract val author: Property - - @get:Input - abstract val license: Property - - @TaskAction - fun generate() = with(workDir.path) { - val dotGit = resolve(".git").toFile().also(java.io.File::deleteRecursively) - - copySource(this) - - val paper = resolve("../.gradle/caches/paperweight/upstreams/paper/Paper-Server") - copySource(paper) - - Git(paper).addCommit("Vanilla Sources", "--author=Automated ") - - paper.resolve(".git").toFile().copyRecursively(dotGit, overwrite = true) - Git(this).addCommit("${commitTitle.get()}\n\n${license.get()}", "--author=${author.get()}") - } - -} - -internal fun copySource(dir: Path) = with(dir.resolve(".gradle/caches/paperweight/mc-dev-sources")) { - val target = dir.resolve("src/main") - resolve("net").toFile().copyRecursively(target.resolve("java/net").toFile(), overwrite = true) - resolve("com").toFile().copyRecursively(target.resolve("java/com").toFile(), overwrite = true) - resolve("data").toFile().copyRecursively(target.resolve("resources/data").toFile(), overwrite = true) - resolve("assets").toFile().copyRecursively(target.resolve("resources/assets").toFile(), overwrite = true) -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/PurpurUpdateTask.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/PurpurUpdateTask.kt deleted file mode 100644 index f32f0c0..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/PurpurUpdateTask.kt +++ /dev/null @@ -1,252 +0,0 @@ -package org.plazmamc.alwaysuptodate.tasks - -import io.papermc.paperweight.patcher.tasks.CheckoutRepo -import io.papermc.paperweight.util.Git -import io.papermc.paperweight.util.cache -import io.papermc.paperweight.util.path -import io.papermc.paperweight.util.set -import org.gradle.api.file.Directory -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Provider -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction -import org.gradle.api.tasks.TaskProvider -import org.plazmamc.alwaysuptodate.utils.* -import java.io.File -import java.nio.file.Path -import java.util.* -import kotlin.io.path.ExperimentalPathApi -import kotlin.io.path.name -import kotlin.io.path.walk - -@Deprecated("It will soon be changed to be available for other upstreams.") -abstract class PurpurUpdateTask : Task() { - - private val pufferfishHeader = """ - Pufferfish - Copyright (C) ${Calendar.getInstance().get(Calendar.YEAR)} Pufferfish Studios LLC - - This program 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. - - This program 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 this program. If not, see . - """.trimIndent() - private val pufferfishAuthor = "Kevin Raneri " - private val purpurHeader = """ - PurpurMC - Copyright (C) ${Calendar.getInstance().get(Calendar.YEAR)} PurpurMC - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - """.trimIndent() - private val purpurAuthor = "granny " - - @get:Internal - abstract val workDir: DirectoryProperty - - @get:OutputDirectory - abstract val purpurDir: DirectoryProperty - - @get:OutputDirectory - abstract val pufferfishDir: DirectoryProperty - - override fun init(): Unit = with(project) { - val wd = layout.cache.resolve("alwaysUpToDate/update/purpur").also { it.toFile().deleteRecursively() } - workDir.set(wd) - - val compare = - configureTask("createPurpurCompareComment", "Create Purpur Compare Comment") { - clear.convention(true) - repo.convention(extension.purpurRepo) - ref.convention(extension.purpurRef) - commitPropertyName.convention(extension.purpurCommitName) - } - - val paper = dependsOn("updatePaper", "Update Paper") { - outputs.upToDateWhen { checkCommitFor { repo to ref to paperCommitName } } - dependsOn(compare) - repo.convention(extension.paperRepo) - ref.convention(extension.paperRef) - regex.convention("paperCommit = ") - workDir.set(layout.projectDirectory) - } - - fun checkout( - name: String, repo: Provider, ref: Provider, regex: String, block: CheckoutRepo.() -> Unit - ): Pair, Directory> { - val updatePaper = configureTask("update${name}Paper", "Update $name's Paper") { - this.repo.convention(extension.paperRepo) - this.ref.convention(extension.paperRef) - this.regex.convention(regex) - this.workDir.set(wd.resolve(name)) - } - - val checkout = dependsOn("checkout$name", "Checkout $name") { - this.dependsOn(paper) - this.repoName.convention(name) - this.url.convention(repo) - this.ref.convention(ref) - this.workDir.set(wd) - - this.block() - // this.finalizedBy(updatePaper) - } - - return checkout to checkout.flatMap { it.outputDir }.get() - } - - val (checkoutPufferfish, pufferfish) = - checkout("Pufferfish", extension.pufferfishRepo, extension.pufferfishRef, "paperRef=") { - onlyIf { extension { usePufferfish } } - } - val (checkoutPurpur, purpur) = - checkout("Purpur", extension.purpurRepo, extension.purpurRef, "paperCommit = ") {} - - pufferfishDir.set(pufferfish) - purpurDir.set(purpur) - - val preparePurpur = configureTask("preparePurpur", "Prepare Purpur Sources") { - mustRunAfter(paper) - dependsOn(checkoutPurpur) - doLast { Gradle(purpur.path)("applyPatches").executeOut() } - } - val preparePufferfish = configureTask("preparePufferfish", "Prepare Pufferfish Sources") { - onlyIf { extension { usePufferfish } } - mustRunAfter(paper) - dependsOn(checkoutPurpur, checkoutPufferfish) - doLast { - val base = pufferfish.path.resolve("patches").also { it.toFile().deleteRecursively() } - val source = purpur.path.resolve("patches") - source.resolve("server").copyPatch(base.resolve("server"), "Pufferfish-Server-Changes") - source.resolve("api").copyPatch(base.resolve("api"), "Pufferfish-API-Changes") - Gradle(pufferfish.path)("applyPatches").executeOut() - } - } - - dependsOn(preparePurpur, preparePufferfish) - - val serverPatch = - configureTask("generateMergedServerPatches", "Generate Merged Server Patch") { - dependsOn(preparePurpur) - if (!extension { usePufferfish }) { - workDir.convention(purpur.dir("Purpur-Server")) - commitTitle.convention("Purpur Server Changes") - license.convention(purpurHeader) - author.convention(purpurAuthor) - return@configureTask - } - - dependsOn(preparePufferfish) - workDir.convention(pufferfish.dir("pufferfish-server")) - commitTitle.convention("Pufferfish Server Changes") - license.convention(pufferfishHeader) - author.convention(pufferfishAuthor) - - doLast { - val dotGit = pufferfish.dir("pufferfish-server/.git").path.toFile() - - purpur.path.resolve("Purpur-Server").let { - val purpurDotGit = it.resolve(".git").toFile().also(File::deleteRecursively) - - copySource(it) - dotGit.copyRecursively(purpurDotGit, overwrite = true) - Git(it).addCommit("Purpur Server Changes\n\n$purpurHeader", "--author=$purpurAuthor") - } - } - } - - val pufferfishAPIChanges = configureTask( - "generateMergedPufferfishAPIPatch", - "Generate Merged Pufferfish API Patch" - ) { - dependsOn(preparePufferfish) - inputDir.convention(pufferfish.dir(".gradle/caches/paperweight/upstreams/paper/Paper-API/.git")) - workDir.convention(pufferfish.dir("pufferfish-api")) - commitTitle.convention("Pufferfish API Changes") - license.convention(pufferfishHeader) - author.convention(pufferfishAuthor) - } - - val apiPatch = configureTask( - "generateMergedAPIPatches", - "Generate Merged API Patches" - ) { - dependsOn(preparePurpur) - if (extension { usePufferfish }) dependsOn(pufferfishAPIChanges) - - workDir.convention(purpur.dir("Purpur-API")) - commitTitle.convention("Purpur API Changes") - license.convention(purpurHeader) - author.convention(purpurAuthor) - inputDir.convention( - if (extension { usePufferfish }) pufferfish.dir("pufferfish-api/.git") - else purpur.dir(".gradle/caches/paperweight/upstreams/paper/Paper-API/.git") - ) - } - - dependsOn("buildPatches", "Build Merged Patches") { - dependsOn(serverPatch, apiPatch) - doLast { Gradle(purpur.path)("rebuildPatches").executeOut() } - } - } - - @TaskAction - fun update() = with(project) { - val purpur = purpurDir.path - val pufferfish = if (extension { usePufferfish }) pufferfishDir.path else null - - val patches = purpur.resolve("patches") - with(layout.projectDirectory.path.resolve("patches")) { - patches.resolve("server").copyPatch( resolve("server"), - if (pufferfish == null) "" else "Pufferfish-Server-Changes", - "Purpur-Server-Changes" - ) - - patches.resolve("api").copyPatch( resolve("api"), - if (pufferfish == null) "" else "Pufferfish-API-Changes", - "Purpur-API-Changes" - ) - } - - file("gradle.properties").let { - it.writeText( - it.readText().replace("purpurCommit = .*".toRegex(), "purpurCommit = ${Git(purpur).revParse()}") - ) - } - } - -} - -@OptIn(ExperimentalPathApi::class) -private fun Path.copyPatch(to: Path, vararg name: String) = walk().sorted() - .filter { entry -> name.filter { it != "" }.any { entry.name.endsWith("$it.patch") } }.map(Path::toFile) - .forEachIndexed { count, patch -> - patch.copyTo( - to.resolve("${count + 1}".padStart(4, '0') + "-" + name.first { patch.name.substring(5) == "$it.patch" } + ".patch").toFile(), - overwrite = true - ) - } diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/SimpleUpstreamUpdateTask.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/SimpleUpstreamUpdateTask.kt deleted file mode 100644 index 652bbde..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/SimpleUpstreamUpdateTask.kt +++ /dev/null @@ -1,48 +0,0 @@ -package org.plazmamc.alwaysuptodate.tasks - -import io.papermc.paperweight.util.Git -import io.papermc.paperweight.util.path -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputDirectory -import org.gradle.api.tasks.Optional -import org.gradle.api.tasks.TaskAction -import org.plazmamc.alwaysuptodate.AlwaysUpToDateException -import org.plazmamc.alwaysuptodate.utils.dependsOn -import org.plazmamc.alwaysuptodate.utils.extension - -abstract class SimpleUpstreamUpdateTask : Task() { - - @get:Input - abstract val repo: Property - - @get:Input - abstract val ref: Property - - @get:InputDirectory - abstract val workDir: DirectoryProperty - - @get:Input - abstract val regex: Property - - override fun init(): Unit = with(project) { - dependsOn("createCompareComment", "Create Paper Compare Comment") { - onlyIf { !this@SimpleUpstreamUpdateTask.state.upToDate } - clear.convention(false) - repo.convention(extension.paperRepo) - ref.convention(extension.paperRef) - commitPropertyName.convention(extension.paperCommitName) - } - } - - @TaskAction - fun update() = (Git(workDir.path)("ls-remote", repo.get()).readText()?.lines() - ?.filterNot("[a-z0-9]{40}\trefs/heads/${ref.get()}".toRegex()::matches)?.first()?.split("\t")?.first() - ?: throw AlwaysUpToDateException("Failed to get latest commit")).let { commit -> - workDir.file("gradle.properties").path.toFile().let { - it.writeText(it.readText().replace("${regex.get()}.*".toRegex(), "${regex.get()}$commit")) - } - } - -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/Task.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/Task.kt deleted file mode 100644 index 0cea6e7..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/tasks/Task.kt +++ /dev/null @@ -1,13 +0,0 @@ -package org.plazmamc.alwaysuptodate.tasks - -import org.gradle.api.DefaultTask - -abstract class Task : DefaultTask() { - - protected open fun init() {} - - init { - this.init() - } - -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Git.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Git.kt deleted file mode 100644 index a5f1bab..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Git.kt +++ /dev/null @@ -1,33 +0,0 @@ -package org.plazmamc.alwaysuptodate.utils - -import io.papermc.paperweight.util.Git -import org.gradle.api.tasks.TaskAction -import org.plazmamc.alwaysuptodate.tasks.Task -import java.nio.file.Path -import kotlin.io.path.exists - -val Git.path: Path - get() = Git::class.java.getDeclaredField("repo").apply { isAccessible = true }.get(this) as Path - -abstract class CheckGitTask : Task() { - - @TaskAction - fun checkGit() = Git.checkForGit() - -} - -fun Git.revParse(): String = this("rev-parse", "HEAD").captureOut(true).out.trim() - -fun Git.addCommit(vararg args: String) { - this("add", ".").executeSilently() - this("commit", "-m", *args).executeSilently() - this.wait() -} - -fun Git.wait() { - val lockFile = path.resolve(".git/gc.pid") - while (lockFile.exists()) { - println("detected lockfile, waiting for it to be removed") - Thread.sleep(1000) - } -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Gradle.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Gradle.kt deleted file mode 100644 index 591803f..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Gradle.kt +++ /dev/null @@ -1,36 +0,0 @@ -package org.plazmamc.alwaysuptodate.utils - -import io.papermc.paperweight.util.Command -import io.papermc.paperweight.util.directory -import org.plazmamc.alwaysuptodate.AlwaysUpToDateException -import java.nio.file.Path -import kotlin.io.path.notExists - -class Gradle(private val repo: Path) { - - init { - if (repo.resolve("gradle").notExists()) - throw AlwaysUpToDateException("Git repository does not exist: $repo") - } - - operator fun invoke(vararg args: String): Command { - val builder = ProcessBuilder( - "java", - "-cp", - "gradle/wrapper/gradle-wrapper.jar", - "org.gradle.wrapper.GradleWrapperMain", - *args, - "--no-daemon", - "--stacktrace" - ).directory(repo) - val command = builder.command() - .joinToString(" ") { if (it.codePoints().anyMatch(Character::isWhitespace)) "\"$it\"" else it } - - return try { - Command(builder, command) - } catch (e: Exception) { - throw AlwaysUpToDateException("Failed to execute command: $command", e) - } - } - -} diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Tasks.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Tasks.kt deleted file mode 100644 index caab45e..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Tasks.kt +++ /dev/null @@ -1,116 +0,0 @@ -package org.plazmamc.alwaysuptodate.utils - -import io.papermc.paperweight.util.Git -import io.papermc.paperweight.util.configureTask -import io.papermc.paperweight.util.path -import org.gradle.api.DefaultTask -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.provider.Property -import org.gradle.api.tasks.TaskProvider -import org.gradle.kotlin.dsl.get -import org.plazmamc.alwaysuptodate.AlwaysUpToDateExtension - -private var extensionAccessor: AlwaysUpToDateExtension? = null - set(value) { - if (field != null) throw IllegalAccessException("ExtensionAccessor already initialized") - field = value - } - -val Project.extension: AlwaysUpToDateExtension - get() { - if (extensionAccessor == null) extensionAccessor = - project.extensions["alwaysUpToDate"] as AlwaysUpToDateExtension - return extensionAccessor!! - } - -val Project.git: Git get() = Git(layout.projectDirectory.path) - -fun Project.extension(block: AlwaysUpToDateExtension.() -> Property): T = - extension.block().get() - -fun Project.property(block: AlwaysUpToDateExtension.() -> Property) = - this.property(extension(block)) as String - -inline fun Task.dependsOn( - name: String, - description: String, - noinline block: T.() -> Unit = {} -): TaskProvider = - project.configureTask(name, description, block).also { this.dependsOn(it) } - -@JvmName("dependsOnDefaultTask") -fun Task.dependsOn( - name: String, - description: String, - block: DefaultTask.() -> Unit = {} -): TaskProvider = - this.dependsOn(name, description, block) - -inline fun Task.finalizedBy( - name: String, - description: String, - noinline block: T.() -> Unit = {} -): TaskProvider = - project.configureTask(name, description, block).also { this.finalizedBy(it) } - -@JvmName("finalizedByDefaultTask") -fun Task.finalizedBy( - name: String, - description: String, - block: DefaultTask.() -> Unit = {} -): TaskProvider = - this.finalizedBy(name, description, block) - -inline fun Task.mustRunAfter( - name: String, - description: String, - noinline block: T.() -> Unit = {} -): TaskProvider = - project.configureTask(name, description, block).also { this.mustRunAfter(it) } - -@JvmName("mustRunAfterDefaultTask") -fun Task.mustRunAfter( - name: String, - description: String, - block: DefaultTask.() -> Unit = {} -): TaskProvider = - this.mustRunAfter(name, description, block) - -inline fun Project.configureTask( - name: String, - description: String, - noinline block: T.() -> Unit = {} -): TaskProvider = - tasks.configureTask(name) { - this.group = "always up to date" - this.description = description - this.block() - } - -@JvmName("configureDefaultTask") -fun Project.configureTask( - name: String, - description: String, - block: DefaultTask.() -> Unit = {} -): TaskProvider = - this.configureTask(name, description, block) - -inline fun Project.registerTask( - name: String, - description: String, - crossinline block: T.() -> Unit = {} -): TaskProvider = - tasks.register(name, T::class.java) { - this.group = "always up to date" - this.description = description - this.block() - } - -@JvmName("registerDefaultTask") -fun Project.registerTask( - name: String, - description: String, - block: DefaultTask.() -> Unit = {} -): TaskProvider = - this.registerTask(name, description, block) diff --git a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Utils.kt b/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Utils.kt deleted file mode 100644 index e3032b0..0000000 --- a/buildSrc/src/main/kotlin/org/plazmamc/alwaysuptodate/utils/Utils.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.plazmamc.alwaysuptodate.utils - -fun Pair, C>.flatten() = Triple(first.first, first.second, second) diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/always-up-to-date.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/always-up-to-date.properties deleted file mode 100644 index d2f93e5..0000000 --- a/buildSrc/src/main/resources/META-INF/gradle-plugins/always-up-to-date.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=org.plazmamc.alwaysuptodate.AlwaysUpToDate diff --git a/gradle.properties b/gradle.properties index 8d566aa..c07e90b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,15 +15,6 @@ providerRepo = PlazmaMC/PlazmaBukkit version = 1.21.4-R0.1-SNAPSHOT mcVersion = 1.21.4 -jdkVersion = 21 - -paperRepo = https://github.com/PaperMC/Paper-archive -paperBranch = ver/1.21.4 -purpurRepo = https://github.com/PlazmaMC/Purpur -purpurBranch = ver/1.21.4 -pufferfishRepo = https://github.com/pufferfish-gg/Pufferfish -pufferfishBranch = ver/1.21 -usePufferfish = false paperCommit = b746d9df0b6b7765478b2a72c2d963b6e668fa35 purpurCommit = f06fd5bb3880e660ecfb43beaadf8ddac175fa8f diff --git a/libs/api.versions.toml b/libs/api.versions.toml index 32136e4..ea68e49 100644 --- a/libs/api.versions.toml +++ b/libs/api.versions.toml @@ -43,5 +43,5 @@ jspecify = { group = "org.jspecify", name = "jspecify", version.ref = "jspecify" [bundles] -api = [ "brigadier", "guava", "gson", "joml", "fastutil", "slf4j", "sentry", "jspecify" ] +api = [ "brigadier", "guava", "gson", "fastutil", "slf4j", "sentry", "jspecify" ] annotations = [ "annotations", "checkerqual" ] diff --git a/patches/api/0002-Use-Gradle-Version-Catalogs.patch b/patches/api/0002-Use-Gradle-Version-Catalogs.patch index 98f18d2..9b9bbff 100644 --- a/patches/api/0002-Use-Gradle-Version-Catalogs.patch +++ b/patches/api/0002-Use-Gradle-Version-Catalogs.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Use Gradle Version Catalogs diff --git a/build.gradle.kts b/build.gradle.kts -index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..6963a76b9040c01dc60d0f24c9eef4738e93f753 100644 +index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..d3c92a382acbf414bf7e704870d252cc88c5d9db 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -9,11 +9,13 @@ java { @@ -22,7 +22,7 @@ index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..6963a76b9040c01dc60d0f24c9eef473 val apiAndDocs: Configuration by configurations.creating { attributes { attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) -@@ -39,60 +41,30 @@ abstract class MockitoAgentProvider : CommandLineArgumentProvider { +@@ -39,60 +41,31 @@ abstract class MockitoAgentProvider : CommandLineArgumentProvider { // Paper end - configure mockito agent that is needed in newer java versions dependencies { @@ -84,6 +84,7 @@ index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..6963a76b9040c01dc60d0f24c9eef473 + api(api.bundles.api) + api(api.bungeechat) { exclude("com.google.guava", "guava") } + api(common.snakeyaml) ++ api(api.joml) { isTransitive = false } + api(api.jsonsimple) { isTransitive = false } + apiAndDocs(platform(common.adventure.bom)) + apiAndDocs(common.bundles.adventure) @@ -107,7 +108,7 @@ index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..6963a76b9040c01dc60d0f24c9eef473 } // Paper start -@@ -177,27 +149,25 @@ tasks.withType { +@@ -177,27 +150,25 @@ tasks.withType { options.use() options.isDocFilesSubDirs = true options.links( diff --git a/patches/api/0009-Temporary-javadoc-build-fix.patch b/patches/api/0009-Temporary-javadoc-build-fix.patch index 719fb8e..9b789c4 100644 --- a/patches/api/0009-Temporary-javadoc-build-fix.patch +++ b/patches/api/0009-Temporary-javadoc-build-fix.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Temporary javadoc build fix diff --git a/build.gradle.kts b/build.gradle.kts -index 6963a76b9040c01dc60d0f24c9eef4738e93f753..1f3d951a69cd6a9ea5fa7ddbe60aaa5e8d9f0974 100644 +index d3c92a382acbf414bf7e704870d252cc88c5d9db..64639737e96f0a0b41899fef09677a89d319c2eb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -165,7 +165,7 @@ tasks.withType { +@@ -166,7 +166,7 @@ tasks.withType { "https://jd.advntr.dev/text-logger-slf4j/${common.adventure.api.orNull?.version}/", "https://javadoc.io/doc/org.yaml/snakeyaml/${common.snakeyaml.orNull?.version}/", "https://javadoc.io/doc/org.slf4j/slf4j-api/${api.slf4j.orNull?.version}/", diff --git a/patches/server/0054-SparklyPaper-Optimize-farm-check.patch b/patches/server/0054-SparklyPaper-Optimize-farm-check.patch index 2a6b83b..c719ed0 100644 --- a/patches/server/0054-SparklyPaper-Optimize-farm-check.patch +++ b/patches/server/0054-SparklyPaper-Optimize-farm-check.patch @@ -146,10 +146,10 @@ index f1ef2eda3282b3bcd99e388dc56d5542cd93bedb..0843c87af0d090872dee21e637b8e37a int xOff = pos.getX(); int yOff = pos.getY(); diff --git a/src/main/java/net/minecraft/world/level/block/StemBlock.java b/src/main/java/net/minecraft/world/level/block/StemBlock.java -index 23802becefaa0a4536364884bb0d39e59b8664e1..0f90a4645a53b95db21ca8d94f3f03dea4c0cd0d 100644 +index 23802becefaa0a4536364884bb0d39e59b8664e1..2575af5649d91d28272ee5b956e6a52f2e52fc52 100644 --- a/src/main/java/net/minecraft/world/level/block/StemBlock.java +++ b/src/main/java/net/minecraft/world/level/block/StemBlock.java -@@ -72,38 +72,66 @@ public class StemBlock extends BushBlock implements BonemealableBlock { +@@ -72,38 +72,63 @@ public class StemBlock extends BushBlock implements BonemealableBlock { @Override protected void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { @@ -183,64 +183,60 @@ index 23802becefaa0a4536364884bb0d39e59b8664e1..0f90a4645a53b95db21ca8d94f3f03de - } - } + if (world.getRawBrightness(pos, 0) < 9) return; -+// PLAZMA - REMOVE THIS ++ + if (world.plazmaConfig().block.optimizedFarmCheck.enabled) { + final BlockPos below = pos.below(); + final BlockState belowState = world.getBlockState(below); -+// PLAZMA - REMOVE THIS ++ + boolean isMoist = false; + float growthSpeed = world.plazmaConfig().block.optimizedFarmCheck.growthSpeed.base; + if (belowState.is(Blocks.FARMLAND) && belowState.getValue(BlockStateProperties.MOISTURE) > 0) { + growthSpeed = world.plazmaConfig().block.optimizedFarmCheck.growthSpeed.moist; + isMoist = true; } -- -+// PLAZMA - REMOVE THIS + + if (random.nextFloat() >= ((this == Blocks.PUMPKIN_STEM ? world.spigotConfig.pumpkinModifier : world.spigotConfig.melonModifier) / (100.0f * (Math.floor((25.0F / growthSpeed) + 1))))) return; -+// PLAZMA - REMOVE THIS ++ + int age = state.getValue(StemBlock.AGE); + if (age < 7) { + CraftEventFactory.handleBlockGrowEvent(world, pos, state.setValue(StemBlock.AGE, age + 1), 2); + return; + } -+// PLAZMA - REMOVE THIS ++ + final Direction direction = Direction.Plane.HORIZONTAL.getRandomDirection(random); + final BlockPos blockPos = pos.relative(direction); + final BlockState belowState1 = world.getBlockState(blockPos.below()); + if (!world.getBlockState(blockPos).isAir() || (!belowState1.is(Blocks.FARMLAND) && !belowState1.is(BlockTags.DIRT))) return; -+// PLAZMA - REMOVE THIS ++ + final Registry registry = world.registryAccess().lookupOrThrow(Registries.BLOCK); + final Optional fruit = registry.getOptional(this.fruit); + final Optional stem = registry.getOptional(this.attachedStem); + if (fruit.isEmpty() || stem.isEmpty()) return; -+// PLAZMA - REMOVE THIS ++ + if (!CraftEventFactory.handleBlockGrowEvent(world, blockPos, fruit.get().defaultBlockState())) return; // CraftBukkit -+ if (isMoist && !FarmBlock.isNearWater(world, blockPos)) -+ CraftEventFactory.handleMoistureChangeEvent(world, blockPos, belowState1.setValue(BlockStateProperties.MOISTURE, 0), 2); -+// PLAZMA - REMOVE THIS + world.setBlockAndUpdate(pos, stem.get().defaultBlockState().setValue(HorizontalDirectionalBlock.FACING, direction)); + return; -+ } -+// PLAZMA - REMOVE THIS + } ++ + if (random.nextFloat() >= ((this == Blocks.PUMPKIN_STEM ? world.spigotConfig.pumpkinModifier : world.spigotConfig.melonModifier) / (100.0f * (Math.floor((25.0F / CropBlock.getGrowthSpeed(this, world, pos)) + 1))))) return; // Spigot - SPIGOT-7159: Better modifier resolution -+// PLAZMA - REMOVE THIS ++ + final int age = state.getValue(StemBlock.AGE); + if (age < 7) { + state = state.setValue(StemBlock.AGE, age + 1); + CraftEventFactory.handleBlockGrowEvent(world, pos, state, 2); // CraftBukkit + return; - } -+// PLAZMA - REMOVE THIS ++ } ++ + final Direction direction = Direction.Plane.HORIZONTAL.getRandomDirection(random); + final BlockPos blockPos = pos.relative(direction); + final BlockState belowState = world.getBlockState(blockPos.below()); + if (!world.getBlockState(blockPos).isAir() || (!belowState.is(Blocks.FARMLAND) && !belowState.is(BlockTags.DIRT))) return; -+// PLAZMA - REMOVE THIS ++ + final Registry registry = world.registryAccess().lookupOrThrow(Registries.BLOCK); + final Optional fruit = registry.getOptional(this.fruit); + final Optional stem = registry.getOptional(this.attachedStem); + if (fruit.isEmpty() || stem.isEmpty()) return; -+// PLAZMA - REMOVE THIS ++ + if (!CraftEventFactory.handleBlockGrowEvent(world, blockPos, fruit.get().defaultBlockState())) return; // CraftBukkit + world.setBlockAndUpdate(pos, stem.get().defaultBlockState().setValue(HorizontalDirectionalBlock.FACING, direction)); } diff --git a/patches/server/0062-Register-every-commands.patch b/patches/server/0062-Register-every-commands.patch new file mode 100644 index 0000000..066758d --- /dev/null +++ b/patches/server/0062-Register-every-commands.patch @@ -0,0 +1,111 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: AlphaKR93 +Date: Wed, 22 Jan 2025 11:32:58 +0900 +Subject: [PATCH] Register every commands + + +diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java +index 2ef4dc9169a9bec304b4922a2e91c31b966c711d..c416b1eaf27699de59aaa6b352ff1aa991d3f660 100644 +--- a/src/main/java/net/minecraft/commands/Commands.java ++++ b/src/main/java/net/minecraft/commands/Commands.java +@@ -44,91 +44,7 @@ import net.minecraft.network.chat.MutableComponent; + import net.minecraft.network.protocol.game.ClientboundCommandsPacket; + import net.minecraft.resources.ResourceKey; + import net.minecraft.server.MinecraftServer; +-import net.minecraft.server.commands.AdvancementCommands; +-import net.minecraft.server.commands.AttributeCommand; +-import net.minecraft.server.commands.BanIpCommands; +-import net.minecraft.server.commands.BanListCommands; +-import net.minecraft.server.commands.BanPlayerCommands; +-import net.minecraft.server.commands.BossBarCommands; +-import net.minecraft.server.commands.ClearInventoryCommands; +-import net.minecraft.server.commands.CloneCommands; +-import net.minecraft.server.commands.DamageCommand; +-import net.minecraft.server.commands.DataPackCommand; +-import net.minecraft.server.commands.DeOpCommands; +-import net.minecraft.server.commands.DebugCommand; +-import net.minecraft.server.commands.DebugConfigCommand; +-import net.minecraft.server.commands.DebugMobSpawningCommand; +-import net.minecraft.server.commands.DebugPathCommand; +-import net.minecraft.server.commands.DefaultGameModeCommands; +-import net.minecraft.server.commands.DifficultyCommand; +-import net.minecraft.server.commands.EffectCommands; +-import net.minecraft.server.commands.EmoteCommands; +-import net.minecraft.server.commands.EnchantCommand; +-import net.minecraft.server.commands.ExecuteCommand; +-import net.minecraft.server.commands.ExperienceCommand; +-import net.minecraft.server.commands.FillBiomeCommand; +-import net.minecraft.server.commands.FillCommand; +-import net.minecraft.server.commands.ForceLoadCommand; +-import net.minecraft.server.commands.FunctionCommand; +-import net.minecraft.server.commands.GameModeCommand; +-import net.minecraft.server.commands.GameRuleCommand; +-import net.minecraft.server.commands.GiveCommand; +-import net.minecraft.server.commands.HelpCommand; +-import net.minecraft.server.commands.ItemCommands; +-import net.minecraft.server.commands.JfrCommand; +-import net.minecraft.server.commands.KickCommand; +-import net.minecraft.server.commands.KillCommand; +-import net.minecraft.server.commands.ListPlayersCommand; +-import net.minecraft.server.commands.LocateCommand; +-import net.minecraft.server.commands.LootCommand; +-import net.minecraft.server.commands.MsgCommand; +-import net.minecraft.server.commands.OpCommand; +-import net.minecraft.server.commands.PardonCommand; +-import net.minecraft.server.commands.PardonIpCommand; +-import net.minecraft.server.commands.ParticleCommand; +-import net.minecraft.server.commands.PerfCommand; +-import net.minecraft.server.commands.PlaceCommand; +-import net.minecraft.server.commands.PlaySoundCommand; +-import net.minecraft.server.commands.PublishCommand; +-import net.minecraft.server.commands.RaidCommand; +-import net.minecraft.server.commands.RandomCommand; +-import net.minecraft.server.commands.RecipeCommand; +-import net.minecraft.server.commands.ReloadCommand; +-import net.minecraft.server.commands.ReturnCommand; +-import net.minecraft.server.commands.RideCommand; +-import net.minecraft.server.commands.RotateCommand; +-import net.minecraft.server.commands.SaveAllCommand; +-import net.minecraft.server.commands.SaveOffCommand; +-import net.minecraft.server.commands.SaveOnCommand; +-import net.minecraft.server.commands.SayCommand; +-import net.minecraft.server.commands.ScheduleCommand; +-import net.minecraft.server.commands.ScoreboardCommand; +-import net.minecraft.server.commands.SeedCommand; +-import net.minecraft.server.commands.ServerPackCommand; +-import net.minecraft.server.commands.SetBlockCommand; +-import net.minecraft.server.commands.SetPlayerIdleTimeoutCommand; +-import net.minecraft.server.commands.SetSpawnCommand; +-import net.minecraft.server.commands.SetWorldSpawnCommand; +-import net.minecraft.server.commands.SpawnArmorTrimsCommand; +-import net.minecraft.server.commands.SpectateCommand; +-import net.minecraft.server.commands.SpreadPlayersCommand; +-import net.minecraft.server.commands.StopCommand; +-import net.minecraft.server.commands.StopSoundCommand; +-import net.minecraft.server.commands.SummonCommand; +-import net.minecraft.server.commands.TagCommand; +-import net.minecraft.server.commands.TeamCommand; +-import net.minecraft.server.commands.TeamMsgCommand; +-import net.minecraft.server.commands.TeleportCommand; +-import net.minecraft.server.commands.TellRawCommand; +-import net.minecraft.server.commands.TickCommand; +-import net.minecraft.server.commands.TimeCommand; +-import net.minecraft.server.commands.TitleCommand; +-import net.minecraft.server.commands.TransferCommand; +-import net.minecraft.server.commands.TriggerCommand; +-import net.minecraft.server.commands.WardenSpawnTrackerCommand; +-import net.minecraft.server.commands.WeatherCommand; +-import net.minecraft.server.commands.WhitelistCommand; +-import net.minecraft.server.commands.WorldBorderCommand; ++import net.minecraft.server.commands.*; // Plazma - Register all commands + import net.minecraft.server.commands.data.DataCommands; + import net.minecraft.server.level.ServerPlayer; + import net.minecraft.tags.TagKey; +@@ -234,6 +150,7 @@ public class Commands { + WardenSpawnTrackerCommand.register(this.dispatcher); + SpawnArmorTrimsCommand.register(this.dispatcher); + ServerPackCommand.register(this.dispatcher); ++ ChaseCommand.register(this.dispatcher); // Plazma - Register all commands + if (environment.includeDedicated) { + DebugConfigCommand.register(this.dispatcher); + } diff --git a/patches/server/0062-Add-heal-command.patch b/patches/server/0063-Add-heal-command.patch similarity index 79% rename from patches/server/0062-Add-heal-command.patch rename to patches/server/0063-Add-heal-command.patch index 825f4e9..178a272 100644 --- a/patches/server/0062-Add-heal-command.patch +++ b/patches/server/0063-Add-heal-command.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add heal command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 2ef4dc9169a9bec304b4922a2e91c31b966c711d..6d7af7e8923219145e79a6b5673566634740023c 100644 +index c416b1eaf27699de59aaa6b352ff1aa991d3f660..90ecfc550324521a7aece274bab330f8dc2de3f3 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java -@@ -263,6 +263,7 @@ public class Commands { +@@ -180,6 +180,7 @@ public class Commands { org.purpurmc.purpur.command.CompassCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.RamBarCommand.register(this.dispatcher); // Purpur - Implement ram and rambar commands org.purpurmc.purpur.command.RamCommand.register(this.dispatcher); // Purpur - Implement ram and rambar commands @@ -18,10 +18,10 @@ index 2ef4dc9169a9bec304b4922a2e91c31b966c711d..6d7af7e8923219145e79a6b567356663 if (environment.includeIntegrated) { diff --git a/src/main/java/org/plazmamc/plazma/commands/HealCommand.java b/src/main/java/org/plazmamc/plazma/commands/HealCommand.java new file mode 100644 -index 0000000000000000000000000000000000000000..2e9f1c95b5532eb020f5d1466c4f7aed8fc1b3d6 +index 0000000000000000000000000000000000000000..b10725af7ec4433e98557cfbafb563822cd4f908 --- /dev/null +++ b/src/main/java/org/plazmamc/plazma/commands/HealCommand.java -@@ -0,0 +1,65 @@ +@@ -0,0 +1,66 @@ +package org.plazmamc.plazma.commands; + +import com.mojang.brigadier.CommandDispatcher; @@ -32,6 +32,7 @@ index 0000000000000000000000000000000000000000..2e9f1c95b5532eb020f5d1466c4f7aed +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.minecraft.commands.CommandSourceStack; ++import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; @@ -50,10 +51,10 @@ index 0000000000000000000000000000000000000000..2e9f1c95b5532eb020f5d1466c4f7aed +public class HealCommand { + + public static void register(final CommandDispatcher dispatcher) { -+ dispatcher.register(net.minecraft.commands.Commands.literal("heal") ++ dispatcher.register(Commands.literal("heal") + .requires(source -> source.hasPermission(2, "bukkit.command.heal")) + .executes(ctx -> execute(ctx.getSource(), Collections.singleton(ctx.getSource().getEntityOrException()))) -+ .then(net.minecraft.commands.Commands.argument("targets", EntityArgument.entities()) ++ .then(Commands.argument("targets", EntityArgument.entities()) + .requires(source -> source.hasPermission(3, "bukkit.command.heal.others")) + .executes(ctx -> execute(ctx.getSource(), EntityArgument.getEntities(ctx, "targets"))) + ) @@ -105,3 +106,17 @@ index 898f9e6ec6f306a15639ee0d03bcfe7bf55e2c6c..02a164ff2c855864e246dcaaf8186274 } +diff --git a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java +index 180c0a532bbac10a8280b63eb7aa783a1bfbb237..75ddd1a811d0a07c6fe5431a527b3a74e52ad53a 100644 +--- a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java ++++ b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java +@@ -78,7 +78,8 @@ public class MinecraftCommandPermissionsTest { + "minecraft.command.gamemode.survival", + "minecraft.command.gamemode.survival.other", + // Purpur end +- "minecraft.command.selector" ++ "minecraft.command.selector", ++ "minecraft.command.heal" // Plazma + ); + + private static Set collectMinecraftCommandPerms() { diff --git a/patches/server/0064-Bundle-as-quivers.patch b/patches/server/0064-Bundle-as-quivers.patch new file mode 100644 index 0000000..22c950d --- /dev/null +++ b/patches/server/0064-Bundle-as-quivers.patch @@ -0,0 +1,225 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: AlphaKR93 +Date: Wed, 22 Jan 2025 11:50:19 +0900 +Subject: [PATCH] Bundle as quivers + + +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index ee6ad451ba8755cf296e9c0a01404a5ed025e749..53c62f51bcdaecba265eb2e0f5e69e890b1b0b03 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -4774,7 +4774,13 @@ public abstract class LivingEntity extends Entity implements Attackable { + return !this.isSleeping() && super.isInWall(); + } + +- public ItemStack getProjectile(ItemStack stack) { ++ // Plazma start - Bundle as quivers! ++ public final ItemStack getProjectile(final ItemStack stack) { ++ return this.getProjectile(stack, false, false); ++ } ++ ++ public ItemStack getProjectile(final ItemStack stack, final boolean bundle, final boolean shrink) { ++ // Plazma end - Bundle as quivers! + return ItemStack.EMPTY; + } + +diff --git a/src/main/java/net/minecraft/world/entity/monster/Monster.java b/src/main/java/net/minecraft/world/entity/monster/Monster.java +index c2061f575c731ecc6071384b007517c08e0cf983..a9f7a1ef69fa6fb8ce45237dd812a4827eb5940d 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Monster.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Monster.java +@@ -143,7 +143,7 @@ public abstract class Monster extends PathfinderMob implements Enemy { + } + + @Override +- public ItemStack getProjectile(ItemStack stack) { ++ public final ItemStack getProjectile(final ItemStack stack, final boolean bundle, final boolean shrink) { // Plazma - Bundle as quivers! + if (stack.getItem() instanceof ProjectileWeaponItem) { + Predicate predicate = ((ProjectileWeaponItem)stack.getItem()).getSupportedHeldProjectiles(); + ItemStack itemStack = ProjectileWeaponItem.getHeldProjectile(this, predicate); +diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java +index 4ea1a327c80f915aa45ccf3a5955ed6ff42692c1..121c2a78b0ae30785dcb3587cfd228d049e10993 100644 +--- a/src/main/java/net/minecraft/world/entity/player/Player.java ++++ b/src/main/java/net/minecraft/world/entity/player/Player.java +@@ -2321,30 +2321,49 @@ public abstract class Player extends LivingEntity { + // Paper end - PlayerReadyArrowEvent + + @Override +- public ItemStack getProjectile(ItemStack stack) { +- if (!(stack.getItem() instanceof ProjectileWeaponItem)) { +- return ItemStack.EMPTY; +- } else { +- Predicate predicate = ((ProjectileWeaponItem) stack.getItem()).getSupportedHeldProjectiles().and(item -> tryReadyArrow(stack, item)); // Paper - PlayerReadyArrowEvent +- ItemStack itemstack1 = ProjectileWeaponItem.getHeldProjectile(this, predicate); ++ // Plazma start - Bundle as quivers! ++ public final ItemStack getProjectile(final ItemStack stack, final boolean bundle, final boolean shrink) { ++ if (!(stack.getItem() instanceof ProjectileWeaponItem weapon)) return ItemStack.EMPTY; + +- if (!itemstack1.isEmpty()) { +- return itemstack1; +- } else { +- predicate = ((ProjectileWeaponItem) stack.getItem()).getAllSupportedProjectiles().and(item -> tryReadyArrow(stack, item)); // Paper - PlayerReadyArrowEvent ++ Predicate predicate = weapon.getSupportedHeldProjectiles().and(item -> tryReadyArrow(stack, item)); // Paper - PlayerReadyArrowEvent ++ final ItemStack held = ProjectileWeaponItem.getHeldProjectile(this, predicate); ++ if (!held.isEmpty()) return held; ++ ++ predicate = weapon.getAllSupportedProjectiles().and(item -> tryReadyArrow(stack, item)); // Paper - PlayerReadyArrowEvent ++ for (int i = 0; i < this.inventory.getContainerSize(); ++i) { ++ ItemStack item = this.inventory.getItem(i); + +- for (int i = 0; i < this.inventory.getContainerSize(); ++i) { +- ItemStack itemstack2 = this.inventory.getItem(i); ++ if (bundle && item.getItem() instanceof net.minecraft.world.item.BundleItem) { ++ final net.minecraft.world.item.component.BundleContents contents = item.get(net.minecraft.core.component.DataComponents.BUNDLE_CONTENTS); ++ if (contents == null || contents.isEmpty()) continue; + +- if (predicate.test(itemstack2)) { +- return itemstack2; +- } ++ final Optional optional = contents.itemCopyStream().filter(predicate).findFirst(); ++ if (optional.isEmpty()) continue; ++ ++ final ItemStack first = optional.get(); ++ if (shrink) { ++ final net.minecraft.world.item.component.BundleContents.Mutable mutable = new net.minecraft.world.item.component.BundleContents.Mutable(contents); ++ final ItemStack next = mutable.removeOne(first.copyAndClear()); ++ if (next == null) continue; ++ ++ next.shrink(1); ++ if (next.getCount() != 0) mutable.tryInsert(next); ++ ++ item.set(net.minecraft.core.component.DataComponents.BUNDLE_CONTENTS, mutable.toImmutable()); + } + +- return this.abilities.instabuild ? new ItemStack(Items.ARROW) : ItemStack.EMPTY; ++ first.setCount(1); ++ return first; ++ } ++ ++ if (predicate.test(item)) { ++ return item; + } + } ++ ++ return this.abilities.instabuild ? new ItemStack(Items.ARROW) : ItemStack.EMPTY; + } ++ // Plazma end - Bundle as quivers! + + @Override + public Vec3 getRopeHoldPosition(float delta) { +diff --git a/src/main/java/net/minecraft/world/item/BowItem.java b/src/main/java/net/minecraft/world/item/BowItem.java +index 58fa528e4b2589d362eb976afd6221cd94f2623c..6a2381e37709b05a9c5e49c34d549a6da1b8f388 100644 +--- a/src/main/java/net/minecraft/world/item/BowItem.java ++++ b/src/main/java/net/minecraft/world/item/BowItem.java +@@ -27,7 +27,7 @@ public class BowItem extends ProjectileWeaponItem { + if (!(user instanceof Player player)) { + return false; + } else { +- ItemStack itemStack = player.getProjectile(stack); ++ ItemStack itemStack = player.getProjectile(stack, world.plazmaConfig().item.bundleAsQuivers.enableForBow, net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.INFINITY, stack) == 0); // Plazma - Bundle as quivers! + // Purpur start + if (world.purpurConfig.infinityWorksWithoutArrows && itemStack.isEmpty() && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.INFINITY, stack) > 0) { + itemStack = new ItemStack(Items.ARROW); +@@ -93,7 +93,7 @@ public class BowItem extends ProjectileWeaponItem { + @Override + public InteractionResult use(Level world, Player user, InteractionHand hand) { + ItemStack itemStack = user.getItemInHand(hand); +- boolean bl = !user.getProjectile(itemStack).isEmpty(); ++ boolean bl = !user.getProjectile(itemStack, world.plazmaConfig().item.bundleAsQuivers.enableForBow, false).isEmpty(); + if (!user.hasInfiniteMaterials() && !bl && !(world.purpurConfig.infinityWorksWithoutArrows && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.INFINITY, itemStack) > 0)) { // Purpur + return InteractionResult.FAIL; + } else { +diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java +index f8946704838d96ad522182d2b9f41ac8bfe92ac4..c46b5e6fb007280b1ff264414c9acaf8a5f49101 100644 +--- a/src/main/java/net/minecraft/world/item/CrossbowItem.java ++++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java +@@ -72,7 +72,7 @@ public class CrossbowItem extends ProjectileWeaponItem { + if (chargedProjectiles != null && !chargedProjectiles.isEmpty()) { + this.performShooting(world, user, hand, itemStack, getShootingPower(chargedProjectiles), (float) world.purpurConfig.crossbowProjectileOffset, null); // Purpur + return InteractionResult.CONSUME; +- } else if (!user.getProjectile(itemStack).isEmpty()) { ++ } else if (!user.getProjectile(itemStack, world.plazmaConfig().item.bundleAsQuivers.enableForCrossbow, false).isEmpty() || net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.INFINITY, itemStack) > 0 && world.plazmaConfig().item.allowCrossbowInfinity) { // Plazma - Bundle as quivers! + this.startSoundPlayed = false; + this.midLoadSoundPlayed = false; + user.startUsingItem(hand); +@@ -124,7 +124,11 @@ public class CrossbowItem extends ProjectileWeaponItem { + return CrossbowItem.tryLoadProjectiles(shooter, crossbow, true); + } + private static boolean tryLoadProjectiles(LivingEntity shooter, ItemStack crossbow, boolean consume) { +- List list = draw(crossbow, shooter.getProjectile(crossbow), shooter, consume); ++ // Plazma start - Bundle as quivers! ++ boolean infinity = net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.INFINITY, crossbow) > 0 && shooter.level().plazmaConfig().item.allowCrossbowInfinity; ++ List list = draw(crossbow, shooter.getProjectile(crossbow, shooter.level().plazmaConfig().item.bundleAsQuivers.enableForBow, !infinity), shooter, consume); ++ if (list.isEmpty() && infinity) list = List.of(new ItemStack(Items.ARROW)); ++ // Plazma end - Bundle as quivers! + // Paper end - Add EntityLoadCrossbowEvent + if (!list.isEmpty()) { + crossbow.set(DataComponents.CHARGED_PROJECTILES, ChargedProjectiles.of(list)); +diff --git a/src/main/java/net/minecraft/world/item/component/BundleContents.java b/src/main/java/net/minecraft/world/item/component/BundleContents.java +index d4e7e92875162b67226a20c5add8973e09fd882c..6e57ed3b395b0155bdf13129c11ee8ddf4a68199 100644 +--- a/src/main/java/net/minecraft/world/item/component/BundleContents.java ++++ b/src/main/java/net/minecraft/world/item/component/BundleContents.java +@@ -157,7 +157,13 @@ public final class BundleContents implements TooltipComponent { + } + + private int findStackIndex(ItemStack stack) { +- if (!stack.isStackable()) { ++ // Plazma start - Bundle as quivers! ++ return this.findStackIndex(stack, false); ++ } ++ ++ private int findStackIndex(final ItemStack stack, final boolean skipStackableCheck) { ++ if (!skipStackableCheck && !stack.isStackable()) { ++ // Plazma end - Bundle as quivers! + return -1; + } else { + for (int i = 0; i < this.items.size(); i++) { +@@ -211,11 +217,20 @@ public final class BundleContents implements TooltipComponent { + + @Nullable + public ItemStack removeOne() { ++ // Plazma start - Bundle as quivers! ++ return this.removeOne(null); ++ } ++ ++ @Nullable ++ public ItemStack removeOne(final @Nullable ItemStack stack) { ++ // Plazma end - Bundle as quivers! + if (this.items.isEmpty()) { + return null; + } else { +- int i = this.selectedItem != -1 && this.selectedItem < this.items.size() ? this.selectedItem : 0; +- ItemStack itemStack = this.items.remove(i).copy(); ++ // Plazma start - Bundle as quivers! ++ int i = stack != null ? this.findStackIndex(stack, true) : this.selectedItem != -1 && this.selectedItem < this.items.size() ? this.selectedItem : 0; ++ ItemStack itemStack = this.items.remove(i != -1 ? i : 0).copy(); ++ // Plazma end - Bundle as quivers! + this.weight = this.weight.subtract(BundleContents.getWeight(itemStack).multiplyBy(Fraction.getFraction(itemStack.getCount(), 1))); + this.toggleSelectedItem(-1); + return itemStack; +diff --git a/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java b/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java +index e88b18ff76bf21d9fa340a1d58abedefbf30ec91..8daf361f82af8d41661d8c5afe717c8a90803dfe 100644 +--- a/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java ++++ b/src/main/java/org/plazmamc/plazma/configurations/WorldConfigurations.java +@@ -104,6 +104,7 @@ public class WorldConfigurations extends ConfigurationPart { + public class Item extends ConfigurationPart { + + public boolean skipMapUpdateIfCraftRenderIsNull = true; ++ public boolean allowCrossbowInfinity = false; + + public ShootableFireCharge shootableFireCharge; + public class ShootableFireCharge extends ConfigurationPart { +@@ -125,6 +126,14 @@ public class WorldConfigurations extends ConfigurationPart { + + } + ++ public BundleAsQuivers bundleAsQuivers; ++ public class BundleAsQuivers extends ConfigurationPart { ++ ++ public boolean enableForBow = false; ++ public boolean enableForCrossbow = false; ++ ++ } ++ + } + + } diff --git a/patches/server/0063-Add-missing-argument-place-for-compass-command.patch b/patches/server/0065-Add-missing-argument-place-for-compass-command.patch similarity index 100% rename from patches/server/0063-Add-missing-argument-place-for-compass-command.patch rename to patches/server/0065-Add-missing-argument-place-for-compass-command.patch diff --git a/settings.gradle.kts b/settings.gradle.kts index 650ffac..65e1519 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,13 +2,6 @@ import java.util.Locale val projectName = "Plazma" -pluginManagement { - repositories { - gradlePluginPortal() - maven("https://papermc.io/repo/repository/maven-public/") - } -} - dependencyResolutionManagement { versionCatalogs { create("libs") {}