Files
janhouse 7fb3a82482 mapsyncer-paper: server side of MapSyncer for Xaero's World Map, discovery-limited
Paper 26.2 plugin speaking the stock MapSyncer client mod's protocol.
Renders Xaero region zips from the world's region files, but only for chunks
players have actually been sent (PlayerChunkLoadEvent), seeded once from
InhabitedTime. Shared or per-player visibility, background render cycle,
per-player streaming with hash/timestamp skipping, Gitea Actions release
workflow.

Vendors the MCA parser and Xaero writer from upstream MapSyncer (GPL-3.0),
see NOTICE.md.

Claude-Session: https://claude.ai/code/session_011FePLXwBsCGLTzaSkk1Z6V
2026-09-07 00:04:43 +03:00

90 lines
3.0 KiB
Kotlin

plugins {
`java-library`
id("io.papermc.paperweight.userdev") version "2.0.0-beta.23"
id("com.gradleup.shadow") version "9.6.1"
}
group = property("group") as String
version = property("version") as String
val javaRelease = (property("javaRelease") as String).toInt()
val paperDevBundleVersion = property("paperDevBundleVersion") as String
repositories {
mavenCentral()
maven("https://repo.papermc.io/repository/maven-public/")
}
dependencies {
paperweight.paperDevBundle(paperDevBundleVersion)
// Region files written by 1.21.2+ servers may be LZ4-compressed. The
// server bundles lz4-java (Paper's at.yawk.lz4 fork, same net.jpountz
// package) and the dev bundle exposes it, so nothing is shaded for it.
// slf4j-api is likewise provided by the server (log4j-slf4j2-impl).
compileOnly("org.slf4j:slf4j-api:2.0.18")
testImplementation(platform("org.junit:junit-bom:6.1.1"))
testImplementation("org.junit.jupiter:junit-jupiter")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
// Paper has been Mojang-mapped at runtime since 1.20.5, so the compiled jar is
// used as-is; no reobfuscation step. The manifest attribute below tells the
// server not to try remapping it either.
paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArtifactConfiguration.MOJANG_PRODUCTION
// No toolchain block on purpose (same reasoning as geoblock-limiter): any JDK
// >= javaRelease builds it, and --release pins the class-file level.
java {
withSourcesJar()
}
tasks.withType<JavaCompile>().configureEach {
options.release.set(javaRelease)
options.encoding = "UTF-8"
// Warnings are informative, not fatal: a dev-bundle bump routinely
// deprecates something and must not break a routine dependency update.
options.compilerArgs.add("-Xlint:all,-serial,-processing")
}
tasks.processResources {
val props = mapOf("version" to project.version.toString())
inputs.properties(props)
filesMatching("plugin.yml") { expand(props) }
}
tasks.jar {
// The thin jar is an intermediate; the shaded one is the deliverable.
archiveClassifier.set("thin")
}
tasks.shadowJar {
archiveBaseName.set("mapsyncer-paper")
archiveClassifier.set("")
// Nothing is bundled today; the shadow task exists so a future dependency
// can be added without changing the CI or the deploy path.
manifest {
attributes("paperweight-mappings-namespace" to "mojang")
}
}
tasks.assemble {
dependsOn(tasks.shadowJar)
}
tasks.test {
useJUnitPlatform()
// Optional: -Pmapsyncer.test.mca=/path/to/r.0.0.mca runs the conversion
// test against a real region file; without it that test is skipped.
val realMca = providers.gradleProperty("mapsyncer.test.mca").orNull
if (realMca != null) {
systemProperty("mapsyncer.test.mca", realMca)
inputs.file(realMca)
}
testLogging {
events("failed")
exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL
}
}