Some fixes
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
package org.plazmamc.alwaysuptodate
|
|
||||||
|
|
||||||
class AlwaysUpToDateException : Exception {
|
|
||||||
constructor(message: String) : super(message)
|
|
||||||
constructor(message: String, cause: Throwable?) : super(message, cause)
|
|
||||||
}
|
|
||||||
@@ -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>
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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 } }
|
|
||||||
@@ -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())
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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()}")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -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"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
@@ -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)
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
implementation-class=org.plazmamc.alwaysuptodate.AlwaysUpToDate
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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" ]
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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}/",
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
111
patches/server/0062-Register-every-commands.patch
Normal file
111
patches/server/0062-Register-every-commands.patch
Normal 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);
|
||||||
|
}
|
||||||
@@ -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() {
|
||||||
225
patches/server/0064-Bundle-as-quivers.patch
Normal file
225
patches/server/0064-Bundle-as-quivers.patch
Normal 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;
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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") {}
|
||||||
|
|||||||
Reference in New Issue
Block a user