Updated Upstream (Paper, Purpur)

Upstream has released updates that appear to apply and compile correctly.

[Purpur Changes]
PlazmaMC/Purpur@69d3bb4: Updated Upstream (Paper)
PlazmaMC/Purpur@ad32b22: fix version command throwing an exception
PlazmaMC/Purpur@9dcfdf1: [ci skip] missed this from the upstream
PlazmaMC/Purpur@88aa731: Updated Upstream (Paper)
PlazmaMC/Purpur@3d25693: Updated Upstream (Paper)
PlazmaMC/Purpur@248ba17: Updated Upstream (Paper)
PlazmaMC/Purpur@ed1e0ec: Updated Upstream (Paper)
PlazmaMC/Purpur@1bbb033: Updated Upstream (Paper)
PlazmaMC/Purpur@222387f: Updated Upstream (Paper)
PlazmaMC/Purpur@692ff89: [ci skip] specify purpur in version command
PlazmaMC/Purpur@7b850ef: [ci skip] Fix version inconsistency in README (#1517)
PlazmaMC/Purpur@22fc5f9: Updated Upstream (Paper)
PlazmaMC/Purpur@2842b97: Updated Upstream (Paper)
PlazmaMC/Purpur@ec1b4fa: Updated Upstream (Paper)
PlazmaMC/Purpur@b1464f3: Updated Upstream (Paper)
PlazmaMC/Purpur@ee56117: Updated Upstream (Paper)
PlazmaMC/Purpur@847719c: one punch!! improvements
PlazmaMC/Purpur@1af7456: [ci skip] document mods that patches took inspiration from
PlazmaMC/Purpur@224e7c7: Updated Upstream (Paper)
PlazmaMC/Purpur@7095128: Add back Pufferfish patches

[Paper Changes]
PaperMC/Paper@23fe116: Fix missing debug trace
PaperMC/Paper@b0c9b9c: Only remove worldgen block entity on changed block (#10794)
PaperMC/Paper@9c917fe: [ci skip] Clean up paperclip build-pr workflow (#10802)
PaperMC/Paper@9d6f2cc: [ci skip] Rebuild patches (#10803)
PaperMC/Paper@84f6e6e: Fix max temper API for llama (#10823)
PaperMC/Paper@672c077: handle BODY slot for non-mobs (#10822)
PaperMC/Paper@716b868: Use RegistryOps for loadAdvancement (#10799)
PaperMC/Paper@d9e659a: Allow firework effects with no colors (#10814)
PaperMC/Paper@7e2b682: Fix skipping custom block entity tag (#10812)
PaperMC/Paper@ed85aac: Flatten namespaced vanilla command alias redirects (#10821)
PaperMC/Paper@a31dc90: Several fixes and new api for experience merging/stacking (#9242)
PaperMC/Paper@efd91e5: Add registry-related argument types (#10770)
PaperMC/Paper@27d2ed8: Extend fishing API (#10634)
PaperMC/Paper@0fcf3e3: Deprecate InvAction#HOTBAR_MOVE_AND_READD (#10784)
PaperMC/Paper@8e6554a: Fix sending disconnect packet in phases where it doesn't exist
PaperMC/Paper@06e69c8: Use CommandSourceStack in AsyncPlayerSendCommandsEvent (#10826)
PaperMC/Paper@a47e11d: fix knockback events (#10831)
PaperMC/Paper@3181470: Add entity heal API (#10267)
PaperMC/Paper@0513374: Fire TabCompleteEvent for legacy commands (#10834)
PaperMC/Paper@5d8e53d: Fix CommandSourceStack#bypassSelectorPermissions (#10837)
This commit is contained in:
AlphaKR93
2024-06-02 20:24:47 +09:00
parent b099cccffb
commit 4f2deab03f
25 changed files with 764 additions and 425 deletions

View File

@@ -107,17 +107,17 @@ paperweight {
alwaysUpToDate {
paperRepoName.set("paperRepo")
paperBranchName.set("paperBranch")
paperRepo.set("https://github.com/PaperMC/Paper")
paperRef.set("master")
paperCommitName.set("paperCommit")
purpurRepoName.set("purpurRepo")
purpurBranchName.set("purpurBranch")
purpurRepo.set("https://github.com/PlazmaMC/Purpur")
purpurRef.set("ver/1.20.6")
purpurCommitName.set("purpurCommit")
pufferfishRepoName.set("pufferfishRepo")
pufferfishBranchName.set("pufferfishBranch")
pufferfishToggleName.set("usePufferfish")
pufferfishRepo.set("https://github.com/PlazmaMC/Pufferfish")
pufferfishRef.set("ver/1.20")
usePufferfish.set(true)
}

View File

@@ -1,24 +1,72 @@
package org.plazmamc.alwaysuptodate
import io.papermc.paperweight.util.Git
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.plazmamc.alwaysuptodate.tasks.CheckPaperCommitTask
import org.plazmamc.alwaysuptodate.tasks.CheckPurpurCommitTask
import org.plazmamc.alwaysuptodate.tasks.PaperUpdateTask
import org.gradle.api.provider.Property
import org.plazmamc.alwaysuptodate.utils.*
import org.plazmamc.alwaysuptodate.tasks.CheckUpstreamCommit
import org.plazmamc.alwaysuptodate.tasks.SimpleUpstreamUpdateTask
import org.plazmamc.alwaysuptodate.tasks.CreateCompareComment
import org.plazmamc.alwaysuptodate.tasks.PurpurUpdateTask
class AlwaysUpToDate : Plugin<Project> {
override fun apply(target: Project) = with(target) {
override fun apply(target: Project): Unit = with(target) {
extensions.create("alwaysUpToDate", AlwaysUpToDateExtension::class.java)
Git.checkForGit()
arrayOf(
"updatePaper" to PaperUpdateTask::class.java,
"updatePurpur" to PurpurUpdateTask::class.java,
"checkPaperCommit" to CheckPaperCommitTask::class.java,
"checkPurpurCommit" to CheckPurpurCommitTask::class.java,
).forEach { tasks.register(it.first, it.second) }
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>>
) {
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)
}
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)
}
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)
}
}
generateTasks("Paper") { paperRepo to paperRef to paperCommitName }
generateTasks("Purpur") { purpurRepo to purpurRef to purpurCommitName }
registerTask<SimpleUpstreamUpdateTask>("updateUpstream", "Update the upstream commit") {
dependsOn(git)
repo.convention(extension.paperRepo)
ref.convention(extension.paperRef)
commitPropertyName.convention(extension.paperCommitName)
workDir.set(layout.projectDirectory)
regex.convention("paperCommit = ")
}
registerTask<PurpurUpdateTask>("updateImplementation", "Update the implementation commit") {
dependsOn(git)
workDir.set(layout.projectDirectory)
}
}

View File

@@ -4,16 +4,17 @@ import org.gradle.api.provider.Property
interface AlwaysUpToDateExtension {
val paperBranchName: Property<String>
val paperRepoName: Property<String>
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 pufferfishToggleName: Property<String>
val pufferfishBranchName: Property<String>
val pufferfishRepoName: Property<String>
val purpurBranchName: Property<String>
val purpurRepoName: Property<String>
val purpurCommitName: Property<String>
}

View File

@@ -0,0 +1,33 @@
package org.plazmamc.alwaysuptodate.tasks
import org.gradle.api.Project
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.plazmamc.alwaysuptodate.AlwaysUpToDateException
import org.plazmamc.alwaysuptodate.AlwaysUpToDateExtension
import org.plazmamc.alwaysuptodate.utils.*
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>
@TaskAction
fun check() = with(project) { 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,61 +0,0 @@
package org.plazmamc.alwaysuptodate.tasks
import io.papermc.paperweight.util.Git
import io.papermc.paperweight.util.fromJson
import io.papermc.paperweight.util.gson
import org.gradle.api.Project
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.get
import org.plazmamc.alwaysuptodate.AlwaysUpToDateException
import org.plazmamc.alwaysuptodate.AlwaysUpToDateExtension
import org.plazmamc.alwaysuptodate.utils.pathIO
import paper.libs.com.google.gson.JsonObject
import java.net.URI.create
abstract class CheckPaperCommitTask : Task() {
private val property = project.extensions["alwaysUpToDate"] as AlwaysUpToDateExtension
@TaskAction
fun check() = println(project.checkCommit(
project.property(property.paperRepoName.get()).toString(),
project.property(property.paperBranchName.get()).toString(),
property.paperCommitName.get()
))
}
abstract class CheckPurpurCommitTask : Task() {
private val property = project.extensions["alwaysUpToDate"] as AlwaysUpToDateExtension
@TaskAction
fun check() = println(project.checkCommit(
project.property(property.purpurRepoName.get()).toString(),
project.property(property.purpurBranchName.get()).toString(),
property.purpurCommitName.get()
))
}
fun Project.getLatest(repository: String, branch: String) =
Git(project.pathIO)("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.checkCommit(repository: String, branch: String, propertyName: String) =
project.getLatest(repository, branch) == project.properties[propertyName] as String
fun Project.createCompareComment(repository: String, branch: String, before: String, clear: Boolean = false) {
val builder = StringBuilder()
val rawRepo = create(repository).path.substring(1)
if (clear) builder.append("\n\nUpstream has released updates that appear to apply and compile correctly.")
else builder.append(project.file("compare.txt").readText())
builder.append("\n\n[${rawRepo.split("/").last()} Changes]\n")
gson.fromJson<JsonObject>(create("https://api.github.com/repos/$rawRepo/compare/$before...$branch").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") }
}
project.file("compare.txt").writeText(builder.toString())
}

View File

@@ -0,0 +1,46 @@
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

@@ -0,0 +1,39 @@
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
import java.io.File
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

@@ -0,0 +1,51 @@
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,53 +0,0 @@
package org.plazmamc.alwaysuptodate.tasks
import io.papermc.paperweight.util.Git
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.get
import org.plazmamc.alwaysuptodate.AlwaysUpToDateException
import org.plazmamc.alwaysuptodate.AlwaysUpToDateExtension
import java.io.File
abstract class PaperUpdateTask : Task() {
private val property = project.extensions["alwaysUpToDate"] as AlwaysUpToDateExtension
override fun init() = outputs.upToDateWhen {
project.checkCommit(
project.property(property.paperRepoName.get()).toString(),
project.property(property.paperBranchName.get()).toString(),
property.paperCommitName.get()
)
}
@TaskAction
fun update() = with(project) {
if (
checkCommit(
property(property.paperRepoName.get()).toString(),
property(property.paperBranchName.get()).toString(),
property.purpurCommitName.get()
)
) return
createCompareComment(
property(property.paperRepoName.get()).toString(),
property(property.paperBranchName.get()).toString(),
property(property.paperCommitName.get()).toString(),
true
)
updatePaperCommit(
property(property.paperRepoName.get()).toString(),
property(property.paperBranchName.get()).toString(),
file("gradle.properties")
)
}
}
fun updatePaperCommit(repo: String, branch: String, properties: File, regexRule: String = "paperCommit = ") =
(Git(properties.parentFile.toPath())("ls-remote", repo).readText()?.lines()
?.filterNot("[a-z0-9]{40}\trefs/heads/$branch".toRegex()::matches)?.first()?.split("\t")?.first()
?: throw AlwaysUpToDateException("Failed to get latest Paper commit")).let {
properties.writeText(properties.readText().replace("$regexRule.*".toRegex(), "$regexRule$it"))
}

View File

@@ -1,24 +1,23 @@
package org.plazmamc.alwaysuptodate.tasks
import io.papermc.paperweight.util.Git
import io.papermc.paperweight.util.cache
import io.papermc.paperweight.util.path
import org.gradle.api.Project
import io.papermc.paperweight.patcher.tasks.CheckoutRepo
import io.papermc.paperweight.util.*
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.kotlin.dsl.get
import org.plazmamc.alwaysuptodate.AlwaysUpToDateExtension
import org.plazmamc.alwaysuptodate.utils.Gradle
import org.plazmamc.alwaysuptodate.utils.addCommit
import org.plazmamc.alwaysuptodate.utils.clone
import org.plazmamc.alwaysuptodate.utils.propValue
import org.gradle.api.tasks.TaskProvider
import org.plazmamc.alwaysuptodate.utils.*
import java.io.File
import java.nio.file.Path
import java.util.Calendar
import kotlin.io.path.*
@Deprecated("It will soon be changed to be available for other upstreams.")
abstract class PurpurUpdateTask : Task() {
private val property = project.extensions["alwaysUpToDate"] as AlwaysUpToDateExtension
private val pufferfishHeader = """
Pufferfish
Copyright (C) ${Calendar.getInstance().get(Calendar.YEAR)} Pufferfish Studios LLC
@@ -36,6 +35,7 @@ abstract class PurpurUpdateTask : Task() {
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 = "--author=Kevin Raneri <kevin.raneri@gmail.com>"
private val purpurHeader = """
PurpurMC
Copyright (C) ${Calendar.getInstance().get(Calendar.YEAR)} PurpurMC
@@ -58,90 +58,151 @@ abstract class PurpurUpdateTask : Task() {
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
""".trimIndent()
private val purpurAuthor = "--author=granny <contact@granny.dev>"
override fun init() = outputs.upToDateWhen {
project.checkCommit(
project.propValue(property.purpurRepoName),
project.propValue(property.purpurBranchName),
property.purpurCommitName.get()
)
@get:Internal
abstract val workDir: DirectoryProperty
@get:OutputDirectory
abstract val purpurDir: DirectoryProperty
@get:OutputDirectory
abstract val pufferfishDir: DirectoryProperty
override fun init(): Unit = with(project) {
outputs.upToDateWhen { checkCommitFor { purpurRepo to purpurRef to purpurCommitName } }
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") {
dependsOn(compare)
repo.convention(extension.paperRepo)
ref.convention(extension.paperRef)
regex.convention("paperCommit = ")
commitPropertyName.convention(extension.paperCommitName)
workDir.set(layout.projectDirectory)
}
fun checkout(name: String, repo: Provider<String>, ref: Provider<String>, regex: String, block: CheckoutRepo.() -> Unit): Pair<TaskProvider<out Task>, 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 updatePaper 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 = ") { dependsOn(checkoutPufferfish) }
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", 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) {
Git.checkForGit()
val purpur = purpurDir.path
val pufferfish = if (extension { usePufferfish }) pufferfishDir.path else null
if (checkCommit(propValue(property.purpurRepoName), propValue(property.purpurBranchName), property.purpurCommitName.get()))
return
createCompareComment(
propValue(property.purpurRepoName), propValue(property.purpurBranchName), propValue(property.purpurCommitName), true
)
val dir = layout.cache.resolve("AlwaysUpToDate/UpdatePurpur")
if (dir.exists()) dir.toFile().deleteRecursively()
dir.createDirectories()
val git = Git(dir)
val purpur = git.clone("Purpur", propValue(property.purpurRepoName), propValue(property.purpurBranchName), dir)
val pufferfish = if (propValue(property.pufferfishToggleName).toBoolean()) git.clone("Pufferfish", propValue(property.pufferfishRepoName), propValue(property.pufferfishBranchName), dir) else null
updateSourceBase(purpur)
if (pufferfish != null) updateSourceBase(pufferfish, "paperRef=")
val latest = getLatest(property.purpurRepoName.get(), property.purpurBranchName.get())
val gradle = Gradle(purpur)
val patches = purpur.resolve("patches").also { patch ->
if (pufferfish == null) return@also
val base = pufferfish.resolve("patches").also { it.toFile().deleteRecursively() }
patch.resolve("server").copyPatch(base.resolve("server"), "Pufferfish-Server-Changes")
patch.resolve("api").copyPatch(base.resolve("api"), "Pufferfish-API-Changes")
Gradle(pufferfish)("applyPatches").executeOut()
}
gradle("applyPatches").executeOut()
(pufferfish?.resolve("pufferfish-server") ?: purpur.resolve("Purpur-Server")).let {
val dotGit = it.resolve(".git").toFile().also(File::deleteRecursively)
copySource(it)
val paper = it.resolve("../.gradle/caches/paperweight/upstreams/paper/Paper-Server")
copySource(paper)
Git(paper).addCommit("Vanilla Sources", "--author=Vanilla <auto@mated.null>")
Thread.sleep(1_000)
paper.resolve(".git").toFile().copyRecursively(dotGit, overwrite = true)
if (pufferfish == null)
return@let Git(it).addCommit("Purpur Server Changes\n\n$purpurHeader", "--author=granny <contact@granny.dev>")
Git(it).addCommit("Pufferfish Server Changes\n\n$pufferfishHeader", "--author=Kevin Raneri <kevin.raneri@gmail.com>")
purpur.resolve("Purpur-Server").let { that ->
val purpurDotGit = that.resolve(".git").toFile().also(File::deleteRecursively)
copySource(that)
dotGit.copyRecursively(purpurDotGit, overwrite = true)
Git(that).addCommit("Purpur Server Changes\n\n$purpurHeader", "--author=granny <contact@granny.dev>")
}
}
with(purpur.resolve("Purpur-API")) {
val dotGit = resolve(".git").toFile().also(File::deleteRecursively)
(pufferfish?.resolve("pufferfish-api/.git")?.toFile()?.also {
it.deleteRecursively()
it.resolve("../.gradle/caches/paperweight/upstreams/paper/Paper-API/.git").copyRecursively(it, overwrite = true)
Git(it).addCommit("Pufferfish API Changes\n\n$pufferfishHeader", "--author=Kevin Raneri <kevin.raneri@gmail.com>")
} ?: resolve("../.gradle/caches/paperweight/upstreams/paper/Paper-API/.git").toFile())
.copyRecursively(dotGit, overwrite = true)
Git(this).addCommit("Purpur API Changes\n\n$purpurHeader", "--author=granny <contact@granny.dev>")
}
gradle("rebuildPatches").executeOut()
val patches = purpur.resolve("patches")
with(layout.projectDirectory.path.resolve("patches")) {
patches.resolve("server").copyPatch(resolve("server"),
if (pufferfish == null) "" else "Pufferfish-Server-Changes",
@@ -155,34 +216,18 @@ abstract class PurpurUpdateTask : Task() {
}
file("gradle.properties").let {
it.writeText(it.readText().replace("purpurCommit = .*".toRegex(), "purpurCommit = $latest"))
it.writeText(it.readText().replace("purpurCommit = .*".toRegex(), "purpurCommit = ${Git(purpur).revParse()}"))
}
}
private fun Project.updateSourceBase(source: Path, regex: String? = null) = properties
.let { it[property.paperRepoName.get()].toString() to it[property.paperBranchName.get()].toString() }
.let {
updatePaperCommit(it.first, it.second, source.resolve("gradle.properties").toFile(), regex ?: "paperCommit = ")
if (checkCommit(it.first, it.second, property.paperCommitName.get())) return@let
createCompareComment(it.first, it.second, propValue(property.paperCommitName))
updatePaperCommit(it.first, it.second, file("gradle.properties"))
}
private 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("data").toFile().copyRecursively(target.resolve("resources/data").toFile(), overwrite = true)
}
private fun Path.copyPatch(to: Path, vararg name: String) = listDirectoryEntries()
.filter { entry -> name.any { it.endsWith(entry.name.substring(5) + ".patch") } }.map(Path::toFile)
.forEachIndexed { count, patch ->
patch.copyTo(
to.resolve(count.toString().padStart(4, '0') + "-" + name.first { patch.name.substring(5) == "$it.patch" }).toFile(),
overwrite = true
)
}
}
@OptIn(ExperimentalPathApi::class)
private fun Path.copyPatch(to: Path, vararg name: String) = walk().sorted()
.filter { entry -> name.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

@@ -0,0 +1,57 @@
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.*
abstract class SimpleUpstreamUpdateTask : Task() {
@get:Input
abstract val repo: Property<String>
@get:Input
abstract val ref: Property<String>
@get:Input
@get:Optional
abstract val commitPropertyName: Property<String>
@get:InputDirectory
abstract val workDir: DirectoryProperty
@get:Input
abstract val regex: Property<String>
override fun init(): Unit = with(project) {
outputs.upToDateWhen {
if (commitPropertyName.orNull != null)
checkCommitFor { repo to ref to (commitPropertyName) }
else
false
}
dependsOn<CreateCompareComment>("createCompareComment", "Create Paper Compare Comment") {
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,18 +1,37 @@
package org.plazmamc.alwaysuptodate.utils
import io.papermc.paperweight.util.Git
import org.gradle.api.tasks.TaskAction
import org.plazmamc.alwaysuptodate.AlwaysUpToDateException
import org.plazmamc.alwaysuptodate.tasks.Task
import java.nio.file.Path
import kotlin.io.path.ExperimentalPathApi
import kotlin.io.path.exists
import kotlin.io.path.notExists
import kotlin.io.path.walk
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.clone(name: String, uri: String, branch: String, dir: Path): Path {
val target = dir.resolve(name)
this("clone", "--depth", "1", "--branch", branch, uri, target.toString()).executeSilently(silenceErr = true)
if (target.notExists()) throw AlwaysUpToDateException("Failed to clone repository")
return target
}
fun Git.revParse(): String = this("rev-parse", "HEAD").captureOut(true).out.trim()
fun Git.addCommit(vararg args: String) {
this("add", ".").executeOut()
this("commit", "-m", *args).executeOut()
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

@@ -0,0 +1,75 @@
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> =
project.configureTask(name, description, block).also { this.dependsOn(it) }
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> =
project.configureTask(name, description, block).also { this.finalizedBy(it) }
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> =
project.configureTask(name, description, block).also { this.mustRunAfter(it) }
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> =
tasks.configureTask<DefaultTask>(name) {
this.group = "always up to date"
this.description = description
this.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()
}

View File

@@ -1,11 +1,3 @@
package org.plazmamc.alwaysuptodate.utils
import io.papermc.paperweight.util.path
import org.gradle.api.Project
import org.gradle.api.provider.Property
import java.nio.file.Path
val Project.pathIO: Path get() = layout.projectDirectory.path
fun Project.propValue(name: Property<String>) =
this.property(name.get()) as String
fun <A, B, C> Pair<Pair<A, B>, C>.flatten() = Triple(first.first, first.second, second)

View File

@@ -25,5 +25,8 @@ pufferfishRepo = https://github.com/PlazmaMC/Pufferfish
pufferfishBranch = ver/1.20
usePufferfish = true
#paperCommit = 5d8e53d78d0089894c9552b95b7b8ad9dcc8cb6f
#purpurCommit = 7095128d494cf55d8de10bece0a05f444fda183e
paperCommit = 347bbe389786d5cdae7cd1c6ec32cacba2a9aac7
purpurCommit = a5b3783e35e3486ec3b0829e54d3eff665030bb7

13
initDev
View File

@@ -1,3 +1,4 @@
#!/bin/bash
# To initialize your development environment,
# run below command in your terminal:
# source ./initDev
@@ -23,7 +24,7 @@ alias rcc="git rebase --continue"
# generate Fixup patches for Server
function fs() {
cd *-Server
cd ./*-Server || exit 1
git add .
git commit -m "fixup"
@@ -35,7 +36,7 @@ function fs() {
# generate Fixup patches for API
function fa() {
cd *-API
cd ./*-API || exit 1
git add .
git commit -m "fixup"
@@ -47,6 +48,12 @@ function fa() {
# ReApply Server Patches
function rasp() {
rm -rf *-Server
rm -rf ./*-Server
./gradlew applyServerPatches
}
# Commit Updated Upstream
function cuu() {
# shellcheck disable=SC2059
printf "Updated Upstream ($1)$(/bin/cat compare.txt)" | git commit -F -
}

View File

@@ -1,8 +1,23 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: AlphaKR93 <dev@alpha93.kr>
Date: Sun, 26 May 2024 19:50:35 +0900
From: --author=Kevin Raneri <kevin.raneri@gmail.com>
Date: Sun, 2 Jun 2024 20:00:52 +0900
Subject: [PATCH] Pufferfish API Changes
Pufferfish
Copyright (C) 2024 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/>.
diff --git a/build.gradle.kts b/build.gradle.kts
index fd39ed209b20c927054b8482c400beeeeab460a3..1336685fde70c4a88a1fb591cdfcd781a8f06d0b 100644
@@ -373,6 +388,24 @@ index 0000000000000000000000000000000000000000..ae2464920c9412ac90b819a540ee58be
+ }
+
+}
diff --git a/src/main/java/io/papermc/paper/ServerBuildInfo.java b/src/main/java/io/papermc/paper/ServerBuildInfo.java
index 9df9d09aa477d4cd3c496ba0933c816df1ef0964..ad81341bdd1eb73554cd24f27ac5d655d89db791 100644
--- a/src/main/java/io/papermc/paper/ServerBuildInfo.java
+++ b/src/main/java/io/papermc/paper/ServerBuildInfo.java
@@ -17,6 +17,13 @@ public interface ServerBuildInfo {
* The brand id for Paper.
*/
Key BRAND_PAPER_ID = Key.key("papermc", "paper");
+
+ // Pufferfish start
+ /**
+ * The brand id for Paper.
+ */
+ Key BRAND_PUFFERFISH_ID = Key.key("pufferfishgg", "pufferfish");
+ // Pufferfish end
/**
* Gets the {@code ServerBuildInfo}.
diff --git a/src/main/java/org/bukkit/map/MapPalette.java b/src/main/java/org/bukkit/map/MapPalette.java
index c80faa079eca1564847070f0338fc98024639829..e632d51d3487eb4807243b6705999ad124466bf5 100644
--- a/src/main/java/org/bukkit/map/MapPalette.java

View File

@@ -1,6 +1,6 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: granny <contact@granny.dev>
Date: Mon, 27 May 2024 13:23:14 +0900
From: --author=granny <contact@granny.dev>
Date: Sun, 2 Jun 2024 20:02:16 +0900
Subject: [PATCH] Purpur API Changes
PurpurMC
@@ -199,12 +199,12 @@ index ab5fea0b03224bf249352ce340e94704ff713345..3441cdad70da1bd523c5933b1a914688
} else {
SIMDDetection.testRun = true;
diff --git a/src/main/java/io/papermc/paper/ServerBuildInfo.java b/src/main/java/io/papermc/paper/ServerBuildInfo.java
index 9df9d09aa477d4cd3c496ba0933c816df1ef0964..7107eabf02d9d9b69d97c978ba421ad52031ec3f 100644
index ad81341bdd1eb73554cd24f27ac5d655d89db791..fe23268c418cccbd45caf2870f7931cfed978d28 100644
--- a/src/main/java/io/papermc/paper/ServerBuildInfo.java
+++ b/src/main/java/io/papermc/paper/ServerBuildInfo.java
@@ -18,6 +18,13 @@ public interface ServerBuildInfo {
*/
Key BRAND_PAPER_ID = Key.key("papermc", "paper");
@@ -25,6 +25,13 @@ public interface ServerBuildInfo {
Key BRAND_PUFFERFISH_ID = Key.key("pufferfishgg", "pufferfish");
// Pufferfish end
+ // Purpur start
+ /**
@@ -3785,7 +3785,7 @@ index 12946bd55fcf7c40d39081779a7fa30049ee6165..9c2d605c50cbf9aefa56ec209df9f6ce
}
diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java
index 88f1ca89fa640a686231b8eec87e70419b2d73ef..d6b91c49a267c89d7df2ddee7ccfe64675d117be 100644
index 057dc3ebea3516863dda24252fe05d344c16fab3..5b341346cb9582ad5a0bb77a0d4046d8527797a3 100644
--- a/src/test/java/org/bukkit/AnnotationTest.java
+++ b/src/test/java/org/bukkit/AnnotationTest.java
@@ -47,6 +47,10 @@ public class AnnotationTest {

View File

@@ -45,10 +45,10 @@ index 199789d56d22fcb1b77ebd56805cc28aa5a5ab0a..3b3bcfa6fa2dbcc7fef899cc7570da09
Logger.getGlobal().log(Level.SEVERE, "TIMING_STACK_CORRUPTION - Report this to the plugin " + last.identifier.group + " (Look for errors above this in the logs) (" + last.identifier + " did not stopTiming)", new Throwable());
}
diff --git a/src/main/java/io/papermc/paper/ServerBuildInfo.java b/src/main/java/io/papermc/paper/ServerBuildInfo.java
index 7107eabf02d9d9b69d97c978ba421ad52031ec3f..098125a57409b480f045c3a8c3b58db74a6605f3 100644
index fe23268c418cccbd45caf2870f7931cfed978d28..bcf09f735e98f8bbce7c7dfab802ad20e2f17548 100644
--- a/src/main/java/io/papermc/paper/ServerBuildInfo.java
+++ b/src/main/java/io/papermc/paper/ServerBuildInfo.java
@@ -25,6 +25,29 @@ public interface ServerBuildInfo {
@@ -32,6 +32,29 @@ public interface ServerBuildInfo {
Key BRAND_PURPUR_ID = Key.key("purpurmc", "purpur");
// Purpur end

View File

@@ -1,6 +1,6 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Kevin Raneri <kevin.raneri@gmail.com>
Date: Mon, 27 May 2024 13:23:13 +0900
From: --author=Kevin Raneri <kevin.raneri@gmail.com>
Date: Sun, 2 Jun 2024 20:02:21 +0900
Subject: [PATCH] Pufferfish Server Changes
Pufferfish
@@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/build.gradle.kts b/build.gradle.kts
index 4998aff0b7cb084dcda15c6a18bbe45e99b6000a..d877dbae82b775250739b5b8d84e163d37a39e35 100644
index 4998aff0b7cb084dcda15c6a18bbe45e99b6000a..74425cec45d784566cb53eeb5391a5cc00d777e5 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -13,7 +13,7 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) {
@@ -61,15 +61,26 @@ index 4998aff0b7cb084dcda15c6a18bbe45e99b6000a..d877dbae82b775250739b5b8d84e163d
tasks.jar {
archiveClassifier.set("dev")
@@ -75,7 +90,7 @@ tasks.jar {
val mcVersion = rootProject.providers.gradleProperty("mcVersion").get()
val build = System.getenv("BUILD_NUMBER") ?: null
val gitHash = git("rev-parse", "--short=7", "HEAD").getText().trim()
- val implementationVersion = "$mcVersion-${build ?: "DEV"}-$gitHash"
+ val implementationVersion = "git-Pufferfish-$gitHash" // Pufferfish
val date = git("show", "-s", "--format=%ci", gitHash).getText().trim() // Paper
@@ -80,14 +95,14 @@ tasks.jar {
val gitBranch = git("rev-parse", "--abbrev-ref", "HEAD").getText().trim() // Paper
attributes(
"Main-Class" to "org.bukkit.craftbukkit.Main",
- "Implementation-Title" to "Paper",
+ "Implementation-Title" to "Pufferfish", // Pufferfish
"Implementation-Version" to implementationVersion,
"Implementation-Vendor" to date, // Paper
- "Specification-Title" to "Paper",
+ "Specification-Title" to "Pufferfish", // Pufferfish
"Specification-Version" to project.version,
- "Specification-Vendor" to "Paper Team",
- "Brand-Id" to "papermc:paper",
- "Brand-Name" to "Paper",
+ "Specification-Vendor" to "Pufferfish Team", // Pufferfish
+ "Brand-Id" to "pufferfishgg:pufferfish", // Pufferfish
+ "Brand-Name" to "Pufferfish", // Pufferfish
"Build-Number" to (build ?: ""),
"Build-Time" to Instant.now().toString(),
"Git-Branch" to gitBranch, // Paper
diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java
index 7620c72a4c243cbeea245203ce03a97cbfa7d922..b35a9f4c5f8960864c402ede8a51fb5ab9c4fcc0 100644
--- a/src/main/java/co/aikar/timings/TimingsExport.java
@@ -2181,6 +2192,30 @@ index 0000000000000000000000000000000000000000..facd55463d44cb7e3d2ca6892982f549
+ return backingMap.size();
+ }
+}
diff --git a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
index 790bad0494454ca12ee152e3de6da3da634d9b20..12d52f6677a1c19084a8d5c7d56850efbe203877 100644
--- a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
+++ b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
@@ -31,6 +31,7 @@ public record ServerBuildInfoImpl(
private static final String ATTRIBUTE_GIT_COMMIT = "Git-Commit";
private static final String BRAND_PAPER_NAME = "Paper";
+ private static final String BRAND_PUFFERFISH_NAME = "Pufferfish"; // Pufferfish
private static final String BUILD_DEV = "DEV";
@@ -42,9 +43,9 @@ public record ServerBuildInfoImpl(
this(
getManifestAttribute(manifest, ATTRIBUTE_BRAND_ID)
.map(Key::key)
- .orElse(BRAND_PAPER_ID),
+ .orElse(BRAND_PUFFERFISH_ID), // Pufferfish
getManifestAttribute(manifest, ATTRIBUTE_BRAND_NAME)
- .orElse(BRAND_PAPER_NAME),
+ .orElse(BRAND_PUFFERFISH_NAME), // Pufferfish
SharedConstants.getCurrentVersion().getId(),
SharedConstants.getCurrentVersion().getName(),
getManifestAttribute(manifest, ATTRIBUTE_BUILD_NUMBER)
diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
index 2874bc3001c4e7d9191e47ba512c5a68369c21f1..32035e37b39ba42232fea948166e7c1d4d06190c 100644
--- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
@@ -2251,7 +2286,7 @@ index 300929a406905f5ff1ede664d5b99fb0938d4d2e..01a6b1135420ea659d092ddca499f281
throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.OUT_OF_ORDER_CHAT, org.bukkit.event.player.PlayerKickEvent.Cause.OUT_OF_ORDER_CHAT); // Paper - kick event causes
} else {
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 0ed42fa899721f83b598db05be1b5f321af3614a..d3ac9185d16099daac9144d7adf6dc38827ab0dc 100644
index 0ed42fa899721f83b598db05be1b5f321af3614a..c110559de69f61c56445f12e733021b6acbcfb4a 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -316,6 +316,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -2275,15 +2310,6 @@ index 0ed42fa899721f83b598db05be1b5f321af3614a..d3ac9185d16099daac9144d7adf6dc38
this.startMeasuringTaskExecutionTime();
this.waitUntilNextTick();
this.finishMeasuringTaskExecutionTime();
@@ -1920,7 +1927,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@DontObfuscate
public String getServerModName() {
- return io.papermc.paper.ServerBuildInfo.buildInfo().brandName(); // Paper
+ return "Pufferfish"; // Paper // Pufferfish - Use dedicated VersionFetcher
}
public SystemReport fillSystemReport(SystemReport details) {
@@ -2555,6 +2562,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
@@ -2546,7 +2572,7 @@ index ca56a0b596976448da6bb2a0e82b3d5cd4133e12..377ca8c01864d6817eff30d33403bc15
if (this.isRainingAt(blockposition)) {
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index c450447585af4c8cdc87abe871c229ff895c3e53..81a20529f66883166ebfbebd001d2330bb0070d2 100644
index 4ae88bfcead40cd05f9514a48a922a37767cb3cf..24257e653672a7632bca4f9eb55f127588604498 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -1154,6 +1154,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
@@ -2669,7 +2695,7 @@ index f402dbbfe3a443e6bc51f88b85abe937852b52f0..c960ddfe628051257cca0d25da385c1d
float DEFAULT_DISTANCE_BUFFER = 4.0F;
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 4ee843dfd826772c9157ca421d8fe1f36f814b51..645a2b045af1bcd3d25d799a08e5e024fd131370 100644
index 7ef9f67d27cc240191dd5d07e8dcf5fbdebe1049..8ae15962f4f52e436041731094f62550fdae2b73 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -311,7 +311,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
@@ -2825,7 +2851,7 @@ index a46bf73c608641bf1f00fd55242de71a0f2ee06e..e6edbe6177b168d85759bd9c414dc87e
private String descriptionId;
@Nullable
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index 0ddf2e1a6d2ea836f8a140a435721e0ce96bd8d2..1405bfc9cf22265a975cca1d8abfae6020a5dd49 100644
index ce01fe82dc1eaaf06ca317ddbc62b7d1b87a48b2..60d8fddfecdcd0fe3609a3851230aa06ce5297a0 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -150,7 +150,6 @@ import org.bukkit.event.entity.EntityTeleportEvent;
@@ -2865,7 +2891,7 @@ index 0ddf2e1a6d2ea836f8a140a435721e0ce96bd8d2..1405bfc9cf22265a975cca1d8abfae60
@Override
public boolean hurt(DamageSource source, float amount) {
if (this.isInvulnerableTo(source)) {
@@ -2050,6 +2062,20 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -2040,6 +2052,20 @@ public abstract class LivingEntity extends Entity implements Attackable {
return this.lastClimbablePos;
}
@@ -2887,7 +2913,7 @@ index 0ddf2e1a6d2ea836f8a140a435721e0ce96bd8d2..1405bfc9cf22265a975cca1d8abfae60
if (this.isSpectator()) {
return false;
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index 9f42563699508fcb3d8a96cfdfc25a7bffd99759..706555cb6b56372411d1ec607d25300d57789b7d 100644
index 8b612b772ca87c852d0b108c2afd6785c261c9b9..5e42bfa9e98215ecb8aca4da2486a4b3d94b38aa 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -237,14 +237,16 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Targeti
@@ -4058,18 +4084,9 @@ index 88a4a72bb390947dc17e5da09a99b2d1b3ac4621..284c76ddb9724b44bb2e93f590685c72
@Nullable
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index af015237214cebc4d1c4bb9e9c5f939d433e365c..49794050997ee1f0511ce4fa6c191906e4f4ca47 100644
index 94a31c8f903eb61eb6d203e8e6fe8fb0beca28b1..5562e2a34d6baf5949435d6c9e233d86a51d8da3 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -264,7 +264,7 @@ import javax.annotation.Nullable; // Paper
import javax.annotation.Nonnull; // Paper
public final class CraftServer implements Server {
- private final String serverName = io.papermc.paper.ServerBuildInfo.buildInfo().brandName(); // Paper
+ private final String serverName = "Pufferfish"; // Paper // Pufferfish - Use dedicated VersionFetcher
private final String serverVersion;
private final String bukkitVersion = Versioning.getBukkitVersion();
private final Logger logger = Logger.getLogger("Minecraft");
@@ -1124,6 +1124,11 @@ public final class CraftServer implements Server {
plugin.getPluginMeta().getDisplayName(),
"This plugin is not properly shutting down its async tasks when it is being shut down. This task may throw errors during the final shutdown logs and might not complete before process dies."
@@ -4079,9 +4096,9 @@ index af015237214cebc4d1c4bb9e9c5f939d433e365c..49794050997ee1f0511ce4fa6c191906
+ for (StackTraceElement element : stackTrace) {
+ getLogger().log(Level.SEVERE, " " + element.toString());
+ }
if (console.isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread(worker.getThread(), "still running"); // Paper - Debugging
}
}
// Paper end - Wait for Async Tasks during shutdown
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java
index 96d772eb02f79f8c478f5e6f065e387aa7665b18..c5ce412f321b8b4f31cc042893659e213b081f29 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java
@@ -4132,10 +4149,10 @@ index 66bdac50130f523f9dc4379b103b7a469f9ca36b..ef780e0566dbac07da88ba26dc595b49
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
index e46714f38df931350d81c30907560c381c8d2725..d9f1164ab63017124a9601f980ee6a6ddb3626eb 100644
index 4788a591f40f506d81b10fd9f6ab68f308a68e23..aa9e901b243a0296966254f802437cb7c1a3a846 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -502,7 +502,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
@@ -503,7 +503,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
@Override
public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() {

View File

@@ -1,6 +1,6 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: granny <contact@granny.dev>
Date: Mon, 27 May 2024 13:23:14 +0900
Date: Sun, 2 Jun 2024 20:02:23 +0900
Subject: [PATCH] Purpur Server Changes
PurpurMC
@@ -25,7 +25,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
diff --git a/build.gradle.kts b/build.gradle.kts
index d877dbae82b775250739b5b8d84e163d37a39e35..e4c14967c18b4f2a623c17b5ba72fc076b904755 100644
index 74425cec45d784566cb53eeb5391a5cc00d777e5..df11a8da57f07c3efef3f834b3ee724ccaffd8ed 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -13,7 +13,7 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) {
@@ -48,26 +48,20 @@ index d877dbae82b775250739b5b8d84e163d37a39e35..e4c14967c18b4f2a623c17b5ba72fc07
testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
testImplementation("org.hamcrest:hamcrest:2.2")
@@ -90,19 +94,19 @@ tasks.jar {
val mcVersion = rootProject.providers.gradleProperty("mcVersion").get()
val build = System.getenv("BUILD_NUMBER") ?: null
val gitHash = git("rev-parse", "--short=7", "HEAD").getText().trim()
- val implementationVersion = "git-Pufferfish-$gitHash" // Pufferfish
+ val implementationVersion = "$mcVersion-${build ?: "DEV"}-$gitHash" // Pufferfish // Purpur
val date = git("show", "-s", "--format=%ci", gitHash).getText().trim() // Paper
@@ -95,14 +99,14 @@ tasks.jar {
val gitBranch = git("rev-parse", "--abbrev-ref", "HEAD").getText().trim() // Paper
attributes(
"Main-Class" to "org.bukkit.craftbukkit.Main",
- "Implementation-Title" to "Paper",
- "Implementation-Title" to "Pufferfish", // Pufferfish
+ "Implementation-Title" to "Purpur", // Purpur
"Implementation-Version" to implementationVersion,
"Implementation-Vendor" to date, // Paper
- "Specification-Title" to "Paper",
- "Specification-Title" to "Pufferfish", // Pufferfish
+ "Specification-Title" to "Purpur", // Purpur
"Specification-Version" to project.version,
- "Specification-Vendor" to "Paper Team",
- "Brand-Id" to "papermc:paper",
- "Brand-Name" to "Paper",
- "Specification-Vendor" to "Pufferfish Team", // Pufferfish
- "Brand-Id" to "pufferfishgg:pufferfish", // Pufferfish
- "Brand-Name" to "Pufferfish", // Pufferfish
+ "Specification-Vendor" to "Purpur Team", // Purpur
+ "Brand-Id" to "purpurmc:purpur", // Purpur
+ "Brand-Name" to "Purpur", // Purpur
@@ -385,30 +379,30 @@ index 1ca25529245ed369b8705075a8c2e32fa4d9b1d1..cba3d725245223c5d9e8e59dcceec61f
"This can improve performance by a few percent, but has minor gameplay implications.");
}
diff --git a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
index 790bad0494454ca12ee152e3de6da3da634d9b20..a6e5950b5875cafd734300cdfbf58f5d3736f3c8 100644
index 12d52f6677a1c19084a8d5c7d56850efbe203877..a27797afd0dc262a72dbd7906c6f00641619c7eb 100644
--- a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
+++ b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
@@ -31,6 +31,7 @@ public record ServerBuildInfoImpl(
private static final String ATTRIBUTE_GIT_COMMIT = "Git-Commit";
@@ -32,6 +32,7 @@ public record ServerBuildInfoImpl(
private static final String BRAND_PAPER_NAME = "Paper";
private static final String BRAND_PUFFERFISH_NAME = "Pufferfish"; // Pufferfish
+ private static final String BRAND_PURPUR_NAME = "Purpur"; // Purpur
private static final String BUILD_DEV = "DEV";
@@ -42,9 +43,9 @@ public record ServerBuildInfoImpl(
@@ -43,9 +44,9 @@ public record ServerBuildInfoImpl(
this(
getManifestAttribute(manifest, ATTRIBUTE_BRAND_ID)
.map(Key::key)
- .orElse(BRAND_PAPER_ID),
- .orElse(BRAND_PUFFERFISH_ID), // Pufferfish
+ .orElse(BRAND_PURPUR_ID), // Purpur
getManifestAttribute(manifest, ATTRIBUTE_BRAND_NAME)
- .orElse(BRAND_PAPER_NAME),
- .orElse(BRAND_PUFFERFISH_NAME), // Pufferfish
+ .orElse(BRAND_PURPUR_NAME), // Purpur
SharedConstants.getCurrentVersion().getId(),
SharedConstants.getCurrentVersion().getName(),
getManifestAttribute(manifest, ATTRIBUTE_BUILD_NUMBER)
@@ -61,7 +62,7 @@ public record ServerBuildInfoImpl(
@@ -62,7 +63,7 @@ public record ServerBuildInfoImpl(
@Override
public boolean isBrandCompatible(final @NotNull Key brandId) {
@@ -579,10 +573,10 @@ index f0fce4113fb07c64adbec029d177c236cbdcbae8..e94224ed280247ee69dfdff8dc960f2b
}
diff --git a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java b/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java
index 10a113b057b0a4d27cce3bae975e1108aaa7b517..02597f890ac7f2dc12c94c283356b8309638dd17 100644
index 0c3c82b28e581286b798ee58ca4193efc2faff4a..24121a43aeb5e9bce013f30c92dddd15f99736c6 100644
--- a/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java
+++ b/src/main/java/io/papermc/paper/command/brigadier/bukkit/BukkitCommandNode.java
@@ -75,16 +75,16 @@ public class BukkitCommandNode extends LiteralCommandNode<CommandSourceStack> {
@@ -80,16 +80,16 @@ public class BukkitCommandNode extends LiteralCommandNode<CommandSourceStack> {
// Plugins do weird things to workaround normal registration
if (this.command.timings == null) {
@@ -822,7 +816,7 @@ index 59d7e8a3d83d3ab7aa28606401bb129ccaeff240..684536f600cca94ea346129a139ec4aa
boolean flag1 = this.source.acceptsSuccess() && !this.silent;
boolean flag2 = broadcastToOps && this.source.shouldInformAdmins() && !this.silent;
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
index 86af3494f3d86c7b9fb90ce5a877ec23f5a79e7f..36f65fd7b3b291daf2d0138278b47a9d74560a89 100644
index 0126906e2afc8dd525f27a0c5e82116075c9d352..f3aad0d2411fcdde2845720e7d66a57a33b22742 100644
--- a/src/main/java/net/minecraft/commands/Commands.java
+++ b/src/main/java/net/minecraft/commands/Commands.java
@@ -166,7 +166,7 @@ public class Commands {
@@ -860,7 +854,7 @@ index 86af3494f3d86c7b9fb90ce5a877ec23f5a79e7f..36f65fd7b3b291daf2d0138278b47a9d
}
if (environment.includeIntegrated) {
@@ -339,9 +347,9 @@ public class Commands {
@@ -345,9 +353,9 @@ public class Commands {
// Paper end
CommandSourceStack commandlistenerwrapper = (CommandSourceStack) parseresults.getContext().getSource();
@@ -872,7 +866,7 @@ index 86af3494f3d86c7b9fb90ce5a877ec23f5a79e7f..36f65fd7b3b291daf2d0138278b47a9d
ContextChain contextchain = this.finishParsing(parseresults, s, commandlistenerwrapper, label); // CraftBukkit // Paper - Add UnknownCommandEvent
try {
@@ -371,7 +379,7 @@ public class Commands {
@@ -377,7 +385,7 @@ public class Commands {
Commands.LOGGER.error("'/{}' threw an exception", s, exception);
}
} finally {
@@ -881,7 +875,7 @@ index 86af3494f3d86c7b9fb90ce5a877ec23f5a79e7f..36f65fd7b3b291daf2d0138278b47a9d
}
}
@@ -514,6 +522,7 @@ public class Commands {
@@ -520,6 +528,7 @@ public class Commands {
private void runSync(ServerPlayer player, Collection<String> bukkit, RootCommandNode<SharedSuggestionProvider> rootcommandnode) {
// Paper end - Perf: Async command map building
new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent<CommandSourceStack>(player.getBukkitEntity(), (RootCommandNode) rootcommandnode, false).callEvent(); // Paper - Brigadier API
@@ -889,7 +883,7 @@ index 86af3494f3d86c7b9fb90ce5a877ec23f5a79e7f..36f65fd7b3b291daf2d0138278b47a9d
PlayerCommandSendEvent event = new PlayerCommandSendEvent(player.getBukkitEntity(), new LinkedHashSet<>(bukkit));
event.getPlayer().getServer().getPluginManager().callEvent(event);
@@ -524,6 +533,7 @@ public class Commands {
@@ -530,6 +539,7 @@ public class Commands {
}
}
// CraftBukkit end
@@ -898,7 +892,7 @@ index 86af3494f3d86c7b9fb90ce5a877ec23f5a79e7f..36f65fd7b3b291daf2d0138278b47a9d
}
diff --git a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java
index 676a1499747b071515479130875157263d3a8352..fc1bba350030c076405711716e9830f8ae7f3953 100644
index d78ad5eccd18d89050a486a0c40090a09683bd16..2a0d54f06de7b959055459349365c85c67c11a3f 100644
--- a/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java
+++ b/src/main/java/net/minecraft/commands/arguments/selector/EntitySelector.java
@@ -200,10 +200,10 @@ public class EntitySelector {
@@ -1093,10 +1087,10 @@ index a024c697a65bbab27408da1d6a75e531d9719b47..e4fab82b369f2c2ea0d8c8acd814d061
// Paper end - Add drops to shear events
continue;
diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
index 02833deaa2bb7e5abc655bc1bdbe15c4b3ac7119..71b021513f30376c7b09d83059deea89cc92385f 100644
index f40420a6841f03983b0837e177ea2ae7c3a37ca1..3b66ecc4f110d0f2dc0ef6c560801296d7e0be64 100644
--- a/src/main/java/net/minecraft/network/Connection.java
+++ b/src/main/java/net/minecraft/network/Connection.java
@@ -608,11 +608,20 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
@@ -609,11 +609,20 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world
private static int joinAttemptsThisTick; // Paper - Buffer joins to world
private static int currTick; // Paper - Buffer joins to world
@@ -1161,7 +1155,7 @@ index 244a19ecd0234fa1d7a6ecfea20751595688605d..0f7d6da8685716604f0749d4f5b60730
Bootstrap.bootStrap();
Bootstrap.validate();
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index d3ac9185d16099daac9144d7adf6dc38827ab0dc..4c192b138810650ca0ab5e5d4f2407c0dc3d9fd0 100644
index c110559de69f61c56445f12e733021b6acbcfb4a..4c192b138810650ca0ab5e5d4f2407c0dc3d9fd0 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -297,6 +297,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1606,7 +1600,7 @@ index d3ac9185d16099daac9144d7adf6dc38827ab0dc..4c192b138810650ca0ab5e5d4f2407c0
@DontObfuscate
public String getServerModName() {
- return "Pufferfish"; // Paper // Pufferfish - Use dedicated VersionFetcher
- return io.papermc.paper.ServerBuildInfo.buildInfo().brandName(); // Paper
+ return org.purpurmc.purpur.PurpurConfig.serverModName; // Paper // Pufferfish - Use dedicated VersionFetcher // Purpur
}
@@ -3229,7 +3223,7 @@ index 1047027610624c9ba4bb5afd5d7f0714a062b198..7424246750d6ceca1acd5d9ebfd48f0d
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
index 1351423a12c19a01f602a202832372a399e6a867..1e2025674eafcf56460c741083c91e2e42d61b19 100644
index a6c31a558794a6e626e83176a1cbe78b6bd90f6e..8487a793e7bb2f491f47a061f413246387bc25b0 100644
--- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java
+++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
@@ -326,6 +326,7 @@ public class WorldGenRegion implements WorldGenLevel {
@@ -3328,7 +3322,7 @@ index 308aef9c4933b2bcdd622a34b68efab4a220fe4d..b82a72775f9de5ad65ae46a8b97f93a7
private boolean checkIfClosed(long time) {
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index 81a20529f66883166ebfbebd001d2330bb0070d2..972d8975d1bc04eb6c0c05f9ca8044f699c504a8 100644
index 24257e653672a7632bca4f9eb55f127588604498..176e54f1c5f4feb98bee8876c304f6e248909e9c 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -332,6 +332,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
@@ -4187,7 +4181,7 @@ index f43bf280999ff3860cc702def50cc62b131eb1bd..66d9e99a351f5fc6cf58be3bee4397d9
}
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 645a2b045af1bcd3d25d799a08e5e024fd131370..c9b3577a3992c11f6c299945362ac9be6c0c96e1 100644
index 8ae15962f4f52e436041731094f62550fdae2b73..f7201a74f66892c9d93616e9afb99d9499f0cdbc 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -163,7 +163,7 @@ import org.bukkit.plugin.PluginManager;
@@ -4673,10 +4667,10 @@ index e6edbe6177b168d85759bd9c414dc87ea8a394fe..32a1b5a1d01fd4dc603a76fde259f3a0
}
diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
index a207a31d80a302dbdfe80f8727222542d3a78da2..f5debc8ddc496cd3e2d8b253511ee5cc9a723b38 100644
index 46d8bcad1545953757659870901cbbdf3340bc15..40d168d225932717b8ac8bdd27dfe2a202bc2808 100644
--- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
+++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java
@@ -320,7 +320,7 @@ public class ExperienceOrb extends Entity {
@@ -326,7 +326,7 @@ public class ExperienceOrb extends Entity {
public void playerTouch(Player player) {
if (!this.level().isClientSide) {
if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent
@@ -4685,7 +4679,7 @@ index a207a31d80a302dbdfe80f8727222542d3a78da2..f5debc8ddc496cd3e2d8b253511ee5cc
player.take(this, 1);
int i = this.repairPlayerItems(player, this.value);
@@ -338,7 +338,7 @@ public class ExperienceOrb extends Entity {
@@ -344,7 +344,7 @@ public class ExperienceOrb extends Entity {
}
private int repairPlayerItems(Player player, int amount) {
@@ -4694,7 +4688,7 @@ index a207a31d80a302dbdfe80f8727222542d3a78da2..f5debc8ddc496cd3e2d8b253511ee5cc
if (entry != null) {
ItemStack itemstack = (ItemStack) entry.getValue();
@@ -366,13 +366,15 @@ public class ExperienceOrb extends Entity {
@@ -372,13 +372,15 @@ public class ExperienceOrb extends Entity {
}
}
@@ -4757,7 +4751,7 @@ index 09fdea983772612ef3fff6b2da3cf469a34e4ec0..3e2ea26c23e88c395856b65001f2895d
protected ParticleOptions getInkParticle() {
return ParticleTypes.GLOW_SQUID_INK;
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b50e63661 100644
index 60d8fddfecdcd0fe3609a3851230aa06ce5297a0..f0d611f370966c12e076252ffd020a05c40f3588 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -228,9 +228,9 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -4974,7 +4968,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
}
// CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment
org.bukkit.event.entity.EntityDeathEvent deathEvent = CraftEventFactory.callEntityDeathEvent(this, source, this.drops, () -> {
@@ -2389,6 +2438,21 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -2379,6 +2428,21 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
}
@@ -4996,7 +4990,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
if (f > 0 || !human) {
if (human) {
// PAIL: Be sure to drag all this code from the EntityHuman subclass each update.
@@ -2612,7 +2676,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -2602,7 +2666,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@Override
protected void onBelowWorld() {
@@ -5005,7 +4999,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
}
protected void updateSwingTime() {
@@ -2807,7 +2871,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -2797,7 +2861,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
protected long lastJumpTime = 0L; // Paper - Prevent excessive velocity through repeated crits
@@ -5014,7 +5008,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
float f = this.getJumpPower();
if (f > 1.0E-5F) {
@@ -2967,6 +3031,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -2957,6 +3021,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
if (f3 > 0.0F) {
this.playSound(this.getFallDamageSound((int) f3), 1.0F, 1.0F);
@@ -5022,7 +5016,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
this.hurt(this.damageSources().flyIntoWall(), f3);
}
}
@@ -3189,10 +3254,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -3179,10 +3244,10 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
this.run += (f3 - this.run) * 0.3F;
@@ -5036,7 +5030,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
// Paper start - stop large pitch and yaw changes from crashing the server
this.yRotO += Math.round((this.getYRot() - this.yRotO) / 360.0F) * 360.0F;
@@ -3204,7 +3269,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -3194,7 +3259,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.yHeadRotO += Math.round((this.yHeadRot - this.yHeadRotO) / 360.0F) * 360.0F;
// Paper end
@@ -5045,7 +5039,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
this.animStep += f2;
if (this.isFallFlying()) {
++this.fallFlyTicks;
@@ -3427,19 +3492,19 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -3417,19 +3482,19 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
this.setDeltaMovement(d0, d1, d2);
@@ -5070,7 +5064,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
if (this.jumping && this.isAffectedByFluids()) {
double d3;
@@ -3466,8 +3531,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -3456,8 +3521,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.noJumpDelay = 0;
}
@@ -5081,7 +5075,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
this.xxa *= 0.98F;
this.zza *= 0.98F;
this.updateFallFlying();
@@ -3492,8 +3557,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -3482,8 +3547,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.travel(vec3d1);
}
@@ -5092,7 +5086,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
if (!this.level().isClientSide && !this.isDeadOrDying() && !this.freezeLocked) { // Paper - Freeze Tick Lock API
int i = this.getTicksFrozen();
@@ -3510,18 +3575,20 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -3500,18 +3565,20 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.hurt(this.damageSources().freeze(), 1.0F);
}
@@ -5118,7 +5112,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO);
Location to = new Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot());
io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent(this.getBukkitLivingEntity(), from, to.clone());
@@ -3531,12 +3598,48 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -3521,12 +3588,48 @@ public abstract class LivingEntity extends Entity implements Attackable {
this.absMoveTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch());
}
}
@@ -5167,7 +5161,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
}
public boolean isSensitiveToWater() {
@@ -3557,7 +3660,16 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -3547,7 +3650,16 @@ public abstract class LivingEntity extends Entity implements Attackable {
int j = i / 10;
if (j % 2 == 0) {
@@ -5186,7 +5180,7 @@ index 1405bfc9cf22265a975cca1d8abfae6020a5dd49..7894a41a212c31f96c758608f4f8fc2b
this.gameEvent(GameEvent.ELYTRA_GLIDE);
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index 706555cb6b56372411d1ec607d25300d57789b7d..9245a9d38ae6985fee36ab0efea006c9e2b0632a 100644
index 5e42bfa9e98215ecb8aca4da2486a4b3d94b38aa..1708d9b3500d907449bce86040bf5baea5b269b8 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -75,6 +75,7 @@ import net.minecraft.world.item.SpawnEggItem;
@@ -9789,10 +9783,10 @@ index 6e299770fca78699f7e1988db4cdef37b99d74c1..fdf9ec418b0fc567e286ac79dbdbedda
protected void randomizeAttributes(RandomSource random) {
this.getAttribute(Attributes.MAX_HEALTH).setBaseValue((double)generateMaxHealth(random::nextInt));
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
index 1dd4290287725898ace29e46b439b55df8fdd1af..7d2a5c806fd0f1228c45b8a8b56d7ba13b899a2d 100644
index 36d654073ab4058db54830d9447d7d959a0b25f1..f452e18829e2b05cf742a4239cba293263b3a88a 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
@@ -75,9 +75,84 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
@@ -75,10 +75,85 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
private Llama caravanHead;
@Nullable
public Llama caravanTail; // Paper
@@ -9800,6 +9794,7 @@ index 1dd4290287725898ace29e46b439b55df8fdd1af..7d2a5c806fd0f1228c45b8a8b56d7ba1
public Llama(EntityType<? extends Llama> type, Level world) {
super(type, world);
this.maxDomestication = 30; // Paper - Missing entity API; configure max temper instead of a hardcoded value
+ // Purpur start
+ this.moveControl = new org.purpurmc.purpur.controller.MoveControllerWASD(this) {
+ @Override
@@ -9877,7 +9872,7 @@ index 1dd4290287725898ace29e46b439b55df8fdd1af..7d2a5c806fd0f1228c45b8a8b56d7ba1
}
public boolean isTraderLlama() {
@@ -108,6 +183,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
@@ -109,6 +184,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
super.addAdditionalSaveData(nbt);
nbt.putInt("Variant", this.getVariant().id);
nbt.putInt("Strength", this.getStrength());
@@ -9885,7 +9880,7 @@ index 1dd4290287725898ace29e46b439b55df8fdd1af..7d2a5c806fd0f1228c45b8a8b56d7ba1
}
@Override
@@ -115,11 +191,13 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
@@ -116,11 +192,13 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
this.setStrength(nbt.getInt("Strength"));
super.readAdditionalSaveData(nbt);
this.setVariant(Llama.Variant.byId(nbt.getInt("Variant")));
@@ -9899,7 +9894,7 @@ index 1dd4290287725898ace29e46b439b55df8fdd1af..7d2a5c806fd0f1228c45b8a8b56d7ba1
this.goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2D));
this.goalSelector.addGoal(2, new LlamaFollowCaravanGoal(this, 2.0999999046325684D));
this.goalSelector.addGoal(3, new RangedAttackGoal(this, 1.25D, 40, 20.0F));
@@ -132,6 +210,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
@@ -133,6 +211,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 0.7D));
this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F));
this.goalSelector.addGoal(9, new RandomLookAroundGoal(this));
@@ -9907,7 +9902,7 @@ index 1dd4290287725898ace29e46b439b55df8fdd1af..7d2a5c806fd0f1228c45b8a8b56d7ba1
this.targetSelector.addGoal(1, new Llama.LlamaHurtByTargetGoal(this));
this.targetSelector.addGoal(2, new Llama.LlamaAttackWolfGoal(this));
}
@@ -399,6 +478,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
@@ -400,6 +479,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
public void leaveCaravan() {
if (this.caravanHead != null) {
@@ -9915,7 +9910,7 @@ index 1dd4290287725898ace29e46b439b55df8fdd1af..7d2a5c806fd0f1228c45b8a8b56d7ba1
this.caravanHead.caravanTail = null;
}
@@ -406,6 +486,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
@@ -407,6 +487,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
}
public void joinCaravan(Llama llama) {
@@ -15139,7 +15134,7 @@ index c72b6ea5530e54fc373c701028e1c147cea34b59..96e9fce5f9084737d2fcf4deb8330573
if (spawnplacementtype.isSpawnPositionOk(world, blockposition2, EntityType.WANDERING_TRADER)) {
blockposition1 = blockposition2;
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 686374e89e41b0917791264f3281f7384835bca8..28ced14143e1c6bd4e8490a98619165357e644dc 100644
index 25595bef64199c4ddbe69c65fd149eec33e778ad..30c6f3ee109207c4eaa4244b6838f56514113d38 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
@@ -195,17 +195,40 @@ public abstract class Player extends LivingEntity {
@@ -15296,7 +15291,7 @@ index 686374e89e41b0917791264f3281f7384835bca8..28ced14143e1c6bd4e8490a986191653
CriteriaTriggers.CONSUME_ITEM.trigger((ServerPlayer) this, stack);
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
index 31b8a8bf78d52b5f11b68e780ec09bf78e7bda84..06f7bc4d8d6679d6625a8d392777722fc97739ba 100644
index 5bc4ba7c055992a32197db96d86a3906c11900d8..fac67ebbba6b4295c2ac03697cda25209037587d 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
@@ -77,6 +77,7 @@ public abstract class AbstractArrow extends Projectile {
@@ -17081,7 +17076,7 @@ index ea0aee88c7d901034427db201c1b2430f8a1d522..1f28bfb435c1e4d97da713f96c452aba
if (range < 0.0 || d < range * range) {
return true;
diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
index 082b804f4793f72e76361f5427f0358273454b3d..133d994d9ac9d4f9527135ac0c77e5749917f8c3 100644
index 638447e8cb74b26f4f8e3862c2fb4a3048979ebc..0022263a41b74fc339c5a5629aee3cd2cd05c5ae 100644
--- a/src/main/java/net/minecraft/world/level/Explosion.java
+++ b/src/main/java/net/minecraft/world/level/Explosion.java
@@ -98,7 +98,7 @@ public class Explosion {
@@ -17124,7 +17119,7 @@ index 082b804f4793f72e76361f5427f0358273454b3d..133d994d9ac9d4f9527135ac0c77e574
this.level.gameEvent(this.source, (Holder) GameEvent.EXPLODE, new Vec3(this.x, this.y, this.z));
Set<BlockPos> set = Sets.newHashSet();
boolean flag = true;
@@ -681,7 +700,7 @@ public class Explosion {
@@ -668,7 +687,7 @@ public class Explosion {
}
if (flag1) {
@@ -17133,7 +17128,7 @@ index 082b804f4793f72e76361f5427f0358273454b3d..133d994d9ac9d4f9527135ac0c77e574
List<Pair<ItemStack, BlockPos>> list = new ArrayList();
Util.shuffle(this.toBlow, this.level.random);
@@ -759,7 +778,7 @@ public class Explosion {
@@ -746,7 +765,7 @@ public class Explosion {
Block.popResource(this.level, (BlockPos) pair.getSecond(), (ItemStack) pair.getFirst());
}
@@ -18957,7 +18952,7 @@ index 7b263fab4f0014400b3b8e7e33db32f9a125f6ba..f7a6ab35c95ffda73f17843916ddb624
private int ticksInHive;
diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
index 6349f2e0a5ba30d250f5ffe43771f325c0999a76..8dc1436fe78759cee5247cc28e8a18999e738a1b 100644
index c0563260277f9f4bd9ff08993b2efb4bca9a0c60..cd0e43f4c53a746dd6183a8406269f9b11ad3571 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
@@ -87,6 +87,12 @@ public abstract class BlockEntity {
@@ -19840,18 +19835,9 @@ index 9d93130f23addb18b97d7f5ec013faef17a74529..29d2fb87a65778926aea2cfc7a5b486c
+ // Purpur end - OfflinePlayer API
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 49794050997ee1f0511ce4fa6c191906e4f4ca47..54c42f43981aee3da869343b078775fd39994b9e 100644
index 5562e2a34d6baf5949435d6c9e233d86a51d8da3..3c505f631f15fe97e380c96ac719b1f61ed22690 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -264,7 +264,7 @@ import javax.annotation.Nullable; // Paper
import javax.annotation.Nonnull; // Paper
public final class CraftServer implements Server {
- private final String serverName = "Pufferfish"; // Paper // Pufferfish - Use dedicated VersionFetcher
+ private final String serverName = io.papermc.paper.ServerBuildInfo.buildInfo().brandName(); // Paper // Pufferfish - Use dedicated VersionFetcher // Purpur
private final String serverVersion;
private final String bukkitVersion = Versioning.getBukkitVersion();
private final Logger logger = Logger.getLogger("Minecraft");
@@ -405,6 +405,20 @@ public final class CraftServer implements Server {
this.paperPluginManager = new io.papermc.paper.plugin.manager.PaperPluginManagerImpl(this, this.commandMap, pluginManager);
this.pluginManager.paperPluginManager = this.paperPluginManager;
@@ -19897,7 +19883,7 @@ index 49794050997ee1f0511ce4fa6c191906e4f4ca47..54c42f43981aee3da869343b078775fd
this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*");
this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions");
@@ -1572,6 +1589,55 @@ public final class CraftServer implements Server {
@@ -1573,6 +1590,55 @@ public final class CraftServer implements Server {
return true;
}
@@ -19953,7 +19939,7 @@ index 49794050997ee1f0511ce4fa6c191906e4f4ca47..54c42f43981aee3da869343b078775fd
@Override
public List<Recipe> getRecipesFor(ItemStack result) {
Preconditions.checkArgument(result != null, "ItemStack cannot be null");
@@ -3034,6 +3100,18 @@ public final class CraftServer implements Server {
@@ -3035,6 +3101,18 @@ public final class CraftServer implements Server {
return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console);
}
@@ -19972,7 +19958,7 @@ index 49794050997ee1f0511ce4fa6c191906e4f4ca47..54c42f43981aee3da869343b078775fd
@Override
public void restart() {
org.spigotmc.RestartCommand.restart();
@@ -3063,6 +3141,7 @@ public final class CraftServer implements Server {
@@ -3064,6 +3142,7 @@ public final class CraftServer implements Server {
@Override
public double[] getTPS() {
return new double[] {
@@ -19980,7 +19966,7 @@ index 49794050997ee1f0511ce4fa6c191906e4f4ca47..54c42f43981aee3da869343b078775fd
net.minecraft.server.MinecraftServer.getServer().tps1.getAverage(),
net.minecraft.server.MinecraftServer.getServer().tps5.getAverage(),
net.minecraft.server.MinecraftServer.getServer().tps15.getAverage()
@@ -3261,4 +3340,16 @@ public final class CraftServer implements Server {
@@ -3262,4 +3341,16 @@ public final class CraftServer implements Server {
return this.potionBrewer;
}
// Paper end
@@ -20384,10 +20370,10 @@ index 30d62ee4d5cd2ddacb8783b5bbbf475d592b3e02..5c1cda88080850314dac196dbe71ff12
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
index 2d4e49f386be35ee8912c1bca38f74b8d8926f3a..9060380754e5553b1628f17402bcb80ba9042fae 100644
index 18af8736f30780b48313257a09973e30df6d0e2f..1284c941a4c863c287098a0a04efcc723e727bb3 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -505,7 +505,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
@@ -512,7 +512,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
net.minecraft.server.level.ServerPlayer entityPlayer = killer == null ? null : ((CraftPlayer) killer).getHandle();
getHandle().lastHurtByPlayer = entityPlayer;
getHandle().lastHurtByMob = entityPlayer;
@@ -20396,7 +20382,7 @@ index 2d4e49f386be35ee8912c1bca38f74b8d8926f3a..9060380754e5553b1628f17402bcb80b
}
// Paper end
@@ -1173,4 +1173,22 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
@@ -1180,4 +1180,22 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
this.getHandle().setYBodyRot(bodyYaw);
}
// Paper end - body yaw API
@@ -20654,7 +20640,7 @@ index 86574da257731de7646a712ed73384955fe35aa3..e223234dd64b0e41441c3b9f649f0b64
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 34b91eff3190848bae38b20e1d956ece497b1473..e650b85464ac886b4adb1a8924026d34f805aba6 100644
index dfbe0914ab2771ac632fd064719878ac47559e9f..5308dc55bcc334ad6bef927de6c2d9b9364d99ff 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -592,6 +592,15 @@ public class CraftEventFactory {
@@ -20894,10 +20880,10 @@ index b3e1adeb932da9b3bed16acd94e2f16da48a7c72..d3ec817e95628f1fc8be4a29c9a0f13c
// Paper end - add timings for scoreboard search
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
index d9f1164ab63017124a9601f980ee6a6ddb3626eb..6f24422beb7d3db6dbed0efcba2935f542519827 100644
index aa9e901b243a0296966254f802437cb7c1a3a846..5f4dbd71fbf9ac498e8cd23ea8801360ce442d3b 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -502,7 +502,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
@@ -503,7 +503,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
@Override
public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() {

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Fork-friendly Rebranding
diff --git a/build.gradle.kts b/build.gradle.kts
index 80343712d0cb4e10d31581f36e487a0b35711cfe..afa4877ade6cf8b615ba70c1cf7a8c92040e924a 100644
index 732670587ecf0877be2493f67baade9c27b88f2b..54a30184392815a01f20b8fc841690e4ae5b3cc6 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -13,7 +13,7 @@ configurations.named(log4jPlugins.compileClasspathConfigurationName) {
@@ -164,20 +164,21 @@ index 0000000000000000000000000000000000000000..af534fb15be2be3e5b4258c522e0e6c9
+
+}
diff --git a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
index a6e5950b5875cafd734300cdfbf58f5d3736f3c8..a337e2c9576fb70a8ee9082e9b69719c804b286e 100644
index a27797afd0dc262a72dbd7906c6f00641619c7eb..a4af02bddf744b6ab271096d1b526cc4c0ec97eb 100644
--- a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
+++ b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java
@@ -30,9 +30,6 @@ public record ServerBuildInfoImpl(
@@ -30,10 +30,6 @@ public record ServerBuildInfoImpl(
private static final String ATTRIBUTE_GIT_BRANCH = "Git-Branch";
private static final String ATTRIBUTE_GIT_COMMIT = "Git-Commit";
- private static final String BRAND_PAPER_NAME = "Paper";
- private static final String BRAND_PUFFERFISH_NAME = "Pufferfish"; // Pufferfish
- private static final String BRAND_PURPUR_NAME = "Purpur"; // Purpur
-
private static final String BUILD_DEV = "DEV";
public ServerBuildInfoImpl() {
@@ -43,9 +40,9 @@ public record ServerBuildInfoImpl(
@@ -44,9 +40,9 @@ public record ServerBuildInfoImpl(
this(
getManifestAttribute(manifest, ATTRIBUTE_BRAND_ID)
.map(Key::key)
@@ -185,11 +186,11 @@ index a6e5950b5875cafd734300cdfbf58f5d3736f3c8..a337e2c9576fb70a8ee9082e9b69719c
+ .orElse(BRAND_ID), // Purpur // Plazma - Fork-friendly Rebranding
getManifestAttribute(manifest, ATTRIBUTE_BRAND_NAME)
- .orElse(BRAND_PURPUR_NAME), // Purpur
+ .orElse(ServerBrandConstants.BRAND_NAME), // Purpur // Plazma - Fork-friendly Rebranding
+ .orElse(BRAND_NAME), // Purpur // Plazma - Fork-friendly Rebranding
SharedConstants.getCurrentVersion().getId(),
SharedConstants.getCurrentVersion().getName(),
getManifestAttribute(manifest, ATTRIBUTE_BUILD_NUMBER)
@@ -62,7 +59,7 @@ public record ServerBuildInfoImpl(
@@ -63,7 +59,7 @@ public record ServerBuildInfoImpl(
@Override
public boolean isBrandCompatible(final @NotNull Key brandId) {

View File

@@ -693,7 +693,7 @@ index 6fab30d186d64d51f7dd9af00fccded4c388844c..df73867ee5682fb966b69dd85da61a69
this.playerBreedingCooldowns = this.getNewBreedingCooldownCache(); // Purpur
this.generator = gen;
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 54c42f43981aee3da869343b078775fd39994b9e..58878900a1985d4dd23104ac594d52368db580d5 100644
index 3c505f631f15fe97e380c96ac719b1f61ed22690..02037da80f2f3cada359bbe0f58160fd15761b77 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -1047,6 +1047,7 @@ public final class CraftServer implements Server {
@@ -704,7 +704,7 @@ index 54c42f43981aee3da869343b078775fd39994b9e..58878900a1985d4dd23104ac594d5236
org.purpurmc.purpur.PurpurConfig.init((File) console.options.valueOf("purpur-settings")); // Purpur
for (ServerLevel world : this.console.getAllLevels()) {
// world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty
@@ -3112,6 +3113,13 @@ public final class CraftServer implements Server {
@@ -3113,6 +3114,13 @@ public final class CraftServer implements Server {
}
// Purpur end

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Completely remove Mojang Profiler
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
index 36f65fd7b3b291daf2d0138278b47a9d74560a89..dd81cea56d00f576e0b611b212fd17c18d4f9659 100644
index f3aad0d2411fcdde2845720e7d66a57a33b22742..17608cfa1e742761928e70c64f36a6bfeb77f104 100644
--- a/src/main/java/net/minecraft/commands/Commands.java
+++ b/src/main/java/net/minecraft/commands/Commands.java
@@ -442,7 +442,7 @@ public class Commands {
@@ -448,7 +448,7 @@ public class Commands {
int j = minecraftserver.getGameRules().getInt(GameRules.RULE_MAX_COMMAND_FORK_COUNT);
try {
@@ -2618,7 +2618,7 @@ index 97c129f5949ca7cb7430e1cf56e881c00f129530..5c4d902a6febe8ffadecbbc64b50ecdc
+ */ // Plazma - Completely remove Mojang's Profiler
}
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index 9245a9d38ae6985fee36ab0efea006c9e2b0632a..2f5250d3baba15e914290ce30f813ad63f6bd943 100644
index 1708d9b3500d907449bce86040bf5baea5b269b8..05c41e1c2f4a1c714dc842dc019acda46fc41e7b 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -37,7 +37,7 @@ import net.minecraft.sounds.SoundEvent;

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Improve SwingTime ticking
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index 7894a41a212c31f96c758608f4f8fc2b50e63661..43673b4edeae610196950c088d916e87b008647e 100644
index f0d611f370966c12e076252ffd020a05c40f3588..8da257e5d305e4ec978f4933d5011f84976e6bb9 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -2680,6 +2680,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -2670,6 +2670,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
}
protected void updateSwingTime() {