Some fixes

This commit is contained in:
AlphaKR93
2025-01-22 13:54:35 +09:00
parent 0c58a0b04a
commit 5788942629
28 changed files with 386 additions and 894 deletions

View File

@@ -12,3 +12,6 @@
# mc_data chat_type/chat.json # mc_data chat_type/chat.json
# mc_data dimension_type/overworld.json # mc_data dimension_type/overworld.json
# #
minecraft net.minecraft.server.commands.PardonCommand
minecraft net.minecraft.server.commands.PardonIpCommand

View File

@@ -3,16 +3,11 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent
plugins { plugins {
java java
`kotlin-dsl`
`maven-publish` `maven-publish`
`always-up-to-date`
alias(libs.plugins.shadow) apply false alias(libs.plugins.shadow) apply false
alias(libs.plugins.paperweight) alias(libs.plugins.paperweight)
} }
val jdkVersion = property("jdkVersion").toString().toInt()
kotlin.jvmToolchain(jdkVersion)
repositories { repositories {
mavenCentral() mavenCentral()
maven("https://repo.papermc.io/repository/maven-public/") { name = "papermc" maven("https://repo.papermc.io/repository/maven-public/") { name = "papermc"
@@ -67,7 +62,7 @@ tasks {
apiCoordinates.set("${project.group}:${brandName.lowercase()}-api") apiCoordinates.set("${project.group}:${brandName.lowercase()}-api")
libraryRepositories.addAll( libraryRepositories.addAll(
"https://repo1.maven.org/maven2/", "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://repo.codemc.io/repository/maven-public/",
"https://jitpack.io", "https://jitpack.io",
) )
@@ -84,7 +79,7 @@ allprojects {
apply(plugin = "java") apply(plugin = "java")
apply(plugin = "maven-publish") 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") { publishing.repositories.maven("https://maven.pkg.github.com/$providerRepo") {
name = "github" name = "github"
@@ -116,7 +111,7 @@ subprojects {
tasks { tasks {
withType<JavaCompile>().configureEach { withType<JavaCompile>().configureEach {
options.encoding = Charsets.UTF_8.name() options.encoding = Charsets.UTF_8.name()
options.release = jdkVersion options.release = 21
} }
withType<Javadoc> { withType<Javadoc> {
@@ -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)
}

View File

@@ -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()
}
}

View File

@@ -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<Project> {
@Suppress("UNUSED_VARIABLE")
override fun apply(target: Project): Unit = with(target) {
Git.checkForGit()
val extension = extensions.create("alwaysUpToDate", AlwaysUpToDateExtension::class.java)
val git = configureTask<CheckGitTask>("checkGitStatus", "Verify that Git is available")
fun generateTasks(
upstream: String,
provider: AlwaysUpToDateExtension.() -> Pair<Pair<Property<String>, Property<String>>, Property<String>>
): Triple<TaskProvider<CheckUpstreamCommit>, TaskProvider<CreateCompareComment>, TaskProvider<CreateCompareComment>> {
val i = registerTask<CheckUpstreamCommit>("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<CreateCompareComment>("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<CreateCompareComment>(
"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<SimpleUpstreamUpdateTask>("updateUpstream", "Update the upstream commit") {
dependsOn(git)
repo.convention(extension.paperRepo)
ref.convention(extension.paperRef)
workDir.set(layout.projectDirectory)
regex.convention("paperCommit = ")
}
registerTask<PurpurUpdateTask>("updateImplementation", "Update the implementation") {
dependsOn(git)
workDir.set(layout.projectDirectory)
}
}
}

View File

@@ -1,6 +0,0 @@
package org.plazmamc.alwaysuptodate
class AlwaysUpToDateException : Exception {
constructor(message: String) : super(message)
constructor(message: String, cause: Throwable?) : super(message, cause)
}

View File

@@ -1,20 +0,0 @@
package org.plazmamc.alwaysuptodate
import org.gradle.api.provider.Property
interface AlwaysUpToDateExtension {
val paperRepo: Property<String>
val paperRef: Property<String>
val purpurRepo: Property<String>
val purpurRef: Property<String>
val pufferfishRepo: Property<String>
val pufferfishRef: Property<String>
val usePufferfish: Property<Boolean>
val paperCommitName: Property<String>
val purpurCommitName: Property<String>
}

View File

@@ -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<String>
@get:Input
abstract val ref: Property<String>
@get:Input
abstract val commitPropertyName: Property<String>
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<Pair<Property<String>, Property<String>>, Property<String>>): Boolean =
extension.block().flatten().let { getLatest(extension { it.first }, extension { it.second }) == property { it.third } }

View File

@@ -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<Boolean>
@get:Input
abstract val repo: Property<String>
@get:Input
abstract val ref: Property<String>
@get:Input
abstract val commitPropertyName: Property<String>
@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<JsonObject>(
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())
}
}

View File

@@ -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<String>
@get:Input
abstract val author: Property<String>
@get:Input
abstract val license: Property<String>
@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()}")
}
}

View File

@@ -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<String>
@get:Input
abstract val author: Property<String>
@get:Input
abstract val license: Property<String>
@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 <auto@mated.null>")
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)
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
""".trimIndent()
private val pufferfishAuthor = "Kevin Raneri <kevin.raneri@gmail.com>"
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 <contact@granny.dev>"
@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<CreateCompareComment>("createPurpurCompareComment", "Create Purpur Compare Comment") {
clear.convention(true)
repo.convention(extension.purpurRepo)
ref.convention(extension.purpurRef)
commitPropertyName.convention(extension.purpurCommitName)
}
val paper = dependsOn<SimpleUpstreamUpdateTask>("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<String>, ref: Provider<String>, regex: String, block: CheckoutRepo.() -> Unit
): Pair<TaskProvider<CheckoutRepo>, Directory> {
val updatePaper = configureTask<SimpleUpstreamUpdateTask>("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<CheckoutRepo>("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<GenerateMergedServerPatch>("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<GenerateMergedAPIPatch>(
"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<GenerateMergedAPIPatch>(
"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
)
}

View File

@@ -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<String>
@get:Input
abstract val ref: Property<String>
@get:InputDirectory
abstract val workDir: DirectoryProperty
@get:Input
abstract val regex: Property<String>
override fun init(): Unit = with(project) {
dependsOn<CreateCompareComment>("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"))
}
}
}

View File

@@ -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()
}
}

View File

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

View File

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

View File

@@ -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 <T> Project.extension(block: AlwaysUpToDateExtension.() -> Property<T>): T =
extension.block().get()
fun Project.property(block: AlwaysUpToDateExtension.() -> Property<String>) =
this.property(extension(block)) as String
inline fun <reified T : Task> Task.dependsOn(
name: String,
description: String,
noinline block: T.() -> Unit = {}
): TaskProvider<T> =
project.configureTask<T>(name, description, block).also { this.dependsOn(it) }
@JvmName("dependsOnDefaultTask")
fun Task.dependsOn(
name: String,
description: String,
block: DefaultTask.() -> Unit = {}
): TaskProvider<DefaultTask> =
this.dependsOn<DefaultTask>(name, description, block)
inline fun <reified T : Task> Task.finalizedBy(
name: String,
description: String,
noinline block: T.() -> Unit = {}
): TaskProvider<T> =
project.configureTask<T>(name, description, block).also { this.finalizedBy(it) }
@JvmName("finalizedByDefaultTask")
fun Task.finalizedBy(
name: String,
description: String,
block: DefaultTask.() -> Unit = {}
): TaskProvider<DefaultTask> =
this.finalizedBy<DefaultTask>(name, description, block)
inline fun <reified T : Task> Task.mustRunAfter(
name: String,
description: String,
noinline block: T.() -> Unit = {}
): TaskProvider<T> =
project.configureTask<T>(name, description, block).also { this.mustRunAfter(it) }
@JvmName("mustRunAfterDefaultTask")
fun Task.mustRunAfter(
name: String,
description: String,
block: DefaultTask.() -> Unit = {}
): TaskProvider<DefaultTask> =
this.mustRunAfter<DefaultTask>(name, description, block)
inline fun <reified T : Task> Project.configureTask(
name: String,
description: String,
noinline block: T.() -> Unit = {}
): TaskProvider<T> =
tasks.configureTask<T>(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<DefaultTask> =
this.configureTask<DefaultTask>(name, description, block)
inline fun <reified T : Task> Project.registerTask(
name: String,
description: String,
crossinline block: T.() -> Unit = {}
): TaskProvider<T> =
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<DefaultTask> =
this.registerTask<DefaultTask>(name, description, block)

View File

@@ -1,3 +0,0 @@
package org.plazmamc.alwaysuptodate.utils
fun <A, B, C> Pair<Pair<A, B>, C>.flatten() = Triple(first.first, first.second, second)

View File

@@ -1 +0,0 @@
implementation-class=org.plazmamc.alwaysuptodate.AlwaysUpToDate

View File

@@ -15,15 +15,6 @@ providerRepo = PlazmaMC/PlazmaBukkit
version = 1.21.4-R0.1-SNAPSHOT version = 1.21.4-R0.1-SNAPSHOT
mcVersion = 1.21.4 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 paperCommit = b746d9df0b6b7765478b2a72c2d963b6e668fa35
purpurCommit = f06fd5bb3880e660ecfb43beaadf8ddac175fa8f purpurCommit = f06fd5bb3880e660ecfb43beaadf8ddac175fa8f

View File

@@ -43,5 +43,5 @@ jspecify = { group = "org.jspecify", name = "jspecify", version.ref = "jspecify"
[bundles] [bundles]
api = [ "brigadier", "guava", "gson", "joml", "fastutil", "slf4j", "sentry", "jspecify" ] api = [ "brigadier", "guava", "gson", "fastutil", "slf4j", "sentry", "jspecify" ]
annotations = [ "annotations", "checkerqual" ] annotations = [ "annotations", "checkerqual" ]

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Use Gradle Version Catalogs
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..6963a76b9040c01dc60d0f24c9eef4738e93f753 100644 index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..d3c92a382acbf414bf7e704870d252cc88c5d9db 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -9,11 +9,13 @@ java { @@ -9,11 +9,13 @@ java {
@@ -22,7 +22,7 @@ index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..6963a76b9040c01dc60d0f24c9eef473
val apiAndDocs: Configuration by configurations.creating { val apiAndDocs: Configuration by configurations.creating {
attributes { attributes {
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.DOCUMENTATION)) 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 // Paper end - configure mockito agent that is needed in newer java versions
dependencies { dependencies {
@@ -84,6 +84,7 @@ index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..6963a76b9040c01dc60d0f24c9eef473
+ api(api.bundles.api) + api(api.bundles.api)
+ api(api.bungeechat) { exclude("com.google.guava", "guava") } + api(api.bungeechat) { exclude("com.google.guava", "guava") }
+ api(common.snakeyaml) + api(common.snakeyaml)
+ api(api.joml) { isTransitive = false }
+ api(api.jsonsimple) { isTransitive = false } + api(api.jsonsimple) { isTransitive = false }
+ apiAndDocs(platform(common.adventure.bom)) + apiAndDocs(platform(common.adventure.bom))
+ apiAndDocs(common.bundles.adventure) + apiAndDocs(common.bundles.adventure)
@@ -107,7 +108,7 @@ index 49546dfbb4dd006b5a2419908890ba4c2a0e207a..6963a76b9040c01dc60d0f24c9eef473
} }
// Paper start // Paper start
@@ -177,27 +149,25 @@ tasks.withType<Javadoc> { @@ -177,27 +150,25 @@ tasks.withType<Javadoc> {
options.use() options.use()
options.isDocFilesSubDirs = true options.isDocFilesSubDirs = true
options.links( options.links(

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Temporary javadoc build fix
diff --git a/build.gradle.kts b/build.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts
index 6963a76b9040c01dc60d0f24c9eef4738e93f753..1f3d951a69cd6a9ea5fa7ddbe60aaa5e8d9f0974 100644 index d3c92a382acbf414bf7e704870d252cc88c5d9db..64639737e96f0a0b41899fef09677a89d319c2eb 100644
--- a/build.gradle.kts --- a/build.gradle.kts
+++ b/build.gradle.kts +++ b/build.gradle.kts
@@ -165,7 +165,7 @@ tasks.withType<Javadoc> { @@ -166,7 +166,7 @@ tasks.withType<Javadoc> {
"https://jd.advntr.dev/text-logger-slf4j/${common.adventure.api.orNull?.version}/", "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.yaml/snakeyaml/${common.snakeyaml.orNull?.version}/",
"https://javadoc.io/doc/org.slf4j/slf4j-api/${api.slf4j.orNull?.version}/", "https://javadoc.io/doc/org.slf4j/slf4j-api/${api.slf4j.orNull?.version}/",

View File

@@ -146,10 +146,10 @@ index f1ef2eda3282b3bcd99e388dc56d5542cd93bedb..0843c87af0d090872dee21e637b8e37a
int xOff = pos.getX(); int xOff = pos.getX();
int yOff = pos.getY(); 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 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 --- a/src/main/java/net/minecraft/world/level/block/StemBlock.java
+++ b/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 @Override
protected void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { 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; + if (world.getRawBrightness(pos, 0) < 9) return;
+// PLAZMA - REMOVE THIS +
+ if (world.plazmaConfig().block.optimizedFarmCheck.enabled) { + if (world.plazmaConfig().block.optimizedFarmCheck.enabled) {
+ final BlockPos below = pos.below(); + final BlockPos below = pos.below();
+ final BlockState belowState = world.getBlockState(below); + final BlockState belowState = world.getBlockState(below);
+// PLAZMA - REMOVE THIS +
+ boolean isMoist = false; + boolean isMoist = false;
+ float growthSpeed = world.plazmaConfig().block.optimizedFarmCheck.growthSpeed.base; + float growthSpeed = world.plazmaConfig().block.optimizedFarmCheck.growthSpeed.base;
+ if (belowState.is(Blocks.FARMLAND) && belowState.getValue(BlockStateProperties.MOISTURE) > 0) { + if (belowState.is(Blocks.FARMLAND) && belowState.getValue(BlockStateProperties.MOISTURE) > 0) {
+ growthSpeed = world.plazmaConfig().block.optimizedFarmCheck.growthSpeed.moist; + growthSpeed = world.plazmaConfig().block.optimizedFarmCheck.growthSpeed.moist;
+ isMoist = true; + 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; + 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); + int age = state.getValue(StemBlock.AGE);
+ if (age < 7) { + if (age < 7) {
+ CraftEventFactory.handleBlockGrowEvent(world, pos, state.setValue(StemBlock.AGE, age + 1), 2); + CraftEventFactory.handleBlockGrowEvent(world, pos, state.setValue(StemBlock.AGE, age + 1), 2);
+ return; + return;
+ } + }
+// PLAZMA - REMOVE THIS +
+ final Direction direction = Direction.Plane.HORIZONTAL.getRandomDirection(random); + final Direction direction = Direction.Plane.HORIZONTAL.getRandomDirection(random);
+ final BlockPos blockPos = pos.relative(direction); + final BlockPos blockPos = pos.relative(direction);
+ final BlockState belowState1 = world.getBlockState(blockPos.below()); + final BlockState belowState1 = world.getBlockState(blockPos.below());
+ if (!world.getBlockState(blockPos).isAir() || (!belowState1.is(Blocks.FARMLAND) && !belowState1.is(BlockTags.DIRT))) return; + if (!world.getBlockState(blockPos).isAir() || (!belowState1.is(Blocks.FARMLAND) && !belowState1.is(BlockTags.DIRT))) return;
+// PLAZMA - REMOVE THIS +
+ final Registry<Block> registry = world.registryAccess().lookupOrThrow(Registries.BLOCK); + final Registry<Block> registry = world.registryAccess().lookupOrThrow(Registries.BLOCK);
+ final Optional<Block> fruit = registry.getOptional(this.fruit); + final Optional<Block> fruit = registry.getOptional(this.fruit);
+ final Optional<Block> stem = registry.getOptional(this.attachedStem); + final Optional<Block> stem = registry.getOptional(this.attachedStem);
+ if (fruit.isEmpty() || stem.isEmpty()) return; + if (fruit.isEmpty() || stem.isEmpty()) return;
+// PLAZMA - REMOVE THIS +
+ if (!CraftEventFactory.handleBlockGrowEvent(world, blockPos, fruit.get().defaultBlockState())) return; // CraftBukkit + 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)); + world.setBlockAndUpdate(pos, stem.get().defaultBlockState().setValue(HorizontalDirectionalBlock.FACING, direction));
+ return; + 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 + 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); + final int age = state.getValue(StemBlock.AGE);
+ if (age < 7) { + if (age < 7) {
+ state = state.setValue(StemBlock.AGE, age + 1); + state = state.setValue(StemBlock.AGE, age + 1);
+ CraftEventFactory.handleBlockGrowEvent(world, pos, state, 2); // CraftBukkit + CraftEventFactory.handleBlockGrowEvent(world, pos, state, 2); // CraftBukkit
+ return; + return;
} + }
+// PLAZMA - REMOVE THIS +
+ final Direction direction = Direction.Plane.HORIZONTAL.getRandomDirection(random); + final Direction direction = Direction.Plane.HORIZONTAL.getRandomDirection(random);
+ final BlockPos blockPos = pos.relative(direction); + final BlockPos blockPos = pos.relative(direction);
+ final BlockState belowState = world.getBlockState(blockPos.below()); + final BlockState belowState = world.getBlockState(blockPos.below());
+ if (!world.getBlockState(blockPos).isAir() || (!belowState.is(Blocks.FARMLAND) && !belowState.is(BlockTags.DIRT))) return; + if (!world.getBlockState(blockPos).isAir() || (!belowState.is(Blocks.FARMLAND) && !belowState.is(BlockTags.DIRT))) return;
+// PLAZMA - REMOVE THIS +
+ final Registry<Block> registry = world.registryAccess().lookupOrThrow(Registries.BLOCK); + final Registry<Block> registry = world.registryAccess().lookupOrThrow(Registries.BLOCK);
+ final Optional<Block> fruit = registry.getOptional(this.fruit); + final Optional<Block> fruit = registry.getOptional(this.fruit);
+ final Optional<Block> stem = registry.getOptional(this.attachedStem); + final Optional<Block> stem = registry.getOptional(this.attachedStem);
+ if (fruit.isEmpty() || stem.isEmpty()) return; + if (fruit.isEmpty() || stem.isEmpty()) return;
+// PLAZMA - REMOVE THIS +
+ if (!CraftEventFactory.handleBlockGrowEvent(world, blockPos, fruit.get().defaultBlockState())) return; // CraftBukkit + if (!CraftEventFactory.handleBlockGrowEvent(world, blockPos, fruit.get().defaultBlockState())) return; // CraftBukkit
+ world.setBlockAndUpdate(pos, stem.get().defaultBlockState().setValue(HorizontalDirectionalBlock.FACING, direction)); + world.setBlockAndUpdate(pos, stem.get().defaultBlockState().setValue(HorizontalDirectionalBlock.FACING, direction));
} }

View File

@@ -0,0 +1,111 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: AlphaKR93 <dev@alpha93.kr>
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);
}

View File

@@ -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 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 --- a/src/main/java/net/minecraft/commands/Commands.java
+++ b/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.CompassCommand.register(this.dispatcher); // Purpur
org.purpurmc.purpur.command.RamBarCommand.register(this.dispatcher); // Purpur - Implement ram and rambar commands 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 org.purpurmc.purpur.command.RamCommand.register(this.dispatcher); // Purpur - Implement ram and rambar commands
@@ -18,10 +18,10 @@ index 2ef4dc9169a9bec304b4922a2e91c31b966c711d..6d7af7e8923219145e79a6b567356663
if (environment.includeIntegrated) { 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 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 new file mode 100644
index 0000000000000000000000000000000000000000..2e9f1c95b5532eb020f5d1466c4f7aed8fc1b3d6 index 0000000000000000000000000000000000000000..b10725af7ec4433e98557cfbafb563822cd4f908
--- /dev/null --- /dev/null
+++ b/src/main/java/org/plazmamc/plazma/commands/HealCommand.java +++ b/src/main/java/org/plazmamc/plazma/commands/HealCommand.java
@@ -0,0 +1,65 @@ @@ -0,0 +1,66 @@
+package org.plazmamc.plazma.commands; +package org.plazmamc.plazma.commands;
+ +
+import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.CommandDispatcher;
@@ -32,6 +32,7 @@ index 0000000000000000000000000000000000000000..2e9f1c95b5532eb020f5d1466c4f7aed
+import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.TextComponent;
+import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
+import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.commands.arguments.EntityArgument;
+import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.LivingEntity;
@@ -50,10 +51,10 @@ index 0000000000000000000000000000000000000000..2e9f1c95b5532eb020f5d1466c4f7aed
+public class HealCommand { +public class HealCommand {
+ +
+ public static void register(final CommandDispatcher<CommandSourceStack> dispatcher) { + public static void register(final CommandDispatcher<CommandSourceStack> dispatcher) {
+ dispatcher.register(net.minecraft.commands.Commands.literal("heal") + dispatcher.register(Commands.literal("heal")
+ .requires(source -> source.hasPermission(2, "bukkit.command.heal")) + .requires(source -> source.hasPermission(2, "bukkit.command.heal"))
+ .executes(ctx -> execute(ctx.getSource(), Collections.singleton(ctx.getSource().getEntityOrException()))) + .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")) + .requires(source -> source.hasPermission(3, "bukkit.command.heal.others"))
+ .executes(ctx -> execute(ctx.getSource(), EntityArgument.getEntities(ctx, "targets"))) + .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<String> collectMinecraftCommandPerms() {

View File

@@ -0,0 +1,225 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: AlphaKR93 <dev@alpha93.kr>
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<ItemStack> 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<ItemStack> 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<ItemStack> 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<ItemStack> 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<ItemStack> 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<ItemStack> 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;
+
+ }
+
}
}

View File

@@ -2,13 +2,6 @@ import java.util.Locale
val projectName = "Plazma" val projectName = "Plazma"
pluginManagement {
repositories {
gradlePluginPortal()
maven("https://papermc.io/repo/repository/maven-public/")
}
}
dependencyResolutionManagement { dependencyResolutionManagement {
versionCatalogs { versionCatalogs {
create("libs") {} create("libs") {}