From 44c7026e18775dd24489514bbde99797261009f3 Mon Sep 17 00:00:00 2001 From: twisti Date: Wed, 11 Mar 2026 16:47:49 +0100 Subject: [PATCH 1/2] feat: add support for CanvasMC integration with configuration options --- gradle.properties | 2 +- gradle/libs.versions.toml | 2 ++ .../surf/surfapi/bukkit/api/SurfBukkitApi.kt | 3 +++ .../bukkit/server/impl/SurfBukkitApiImpl.kt | 3 +++ surf-api-gradle-plugin/build.gradle.kts | 12 +++++---- .../paper/AbstractPaperSurfExtension.kt | 10 ++++++- .../platform/paper/AbstractPaperSurfPlugin.kt | 26 ++++++++++++++++++- .../paper/plugin/PaperPluginSurfPlugin.kt | 2 +- .../surfapi/gradle/util/repo-extensions.kt | 6 +++++ 9 files changed, 57 insertions(+), 9 deletions(-) diff --git a/gradle.properties b/gradle.properties index adfa42174..dbf572a80 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled javaVersion=25 mcVersion=1.21.11 group=dev.slne.surf -version=1.21.11-2.61.0 +version=1.21.11-2.62.0 relocationPrefix=dev.slne.surf.surfapi.libs snapshot=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fab525b34..16bcf8df0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,7 @@ [versions] # Paper paper-api = "1.21.11-R0.1-SNAPSHOT" +canvas-api = "1.21.11-R0.1-SNAPSHOT" # Hytale hytale-server = "1.0.0" @@ -77,6 +78,7 @@ dokka = "2.1.0" [libraries] # Paper paper-api = { module = "io.papermc.paper:paper-api", version.ref = "paper-api" } +canvas-api = { module = "io.canvasmc.canvas:canvas-api", version.ref = "canvas-api" } # Hytale hytale-server = { module = "dev.hypixel:hytale-server", version.ref = "hytale-server" } diff --git a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/SurfBukkitApi.kt b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/SurfBukkitApi.kt index 69b929c1b..e8fbdbce7 100644 --- a/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/SurfBukkitApi.kt +++ b/surf-api-bukkit/surf-api-bukkit-api/src/main/kotlin/dev/slne/surf/surfapi/bukkit/api/SurfBukkitApi.kt @@ -17,6 +17,9 @@ import org.jetbrains.annotations.ApiStatus @ApiStatus.NonExtendable interface SurfBukkitApi : SurfCoreApi { + val isFolia: Boolean + val isCanvasMc: Boolean + @ObsoleteScoreboardApi fun scoreboardLibrary(): ScoreboardLibrary diff --git a/surf-api-bukkit/surf-api-bukkit-server/src/main/kotlin/dev/slne/surf/surfapi/bukkit/server/impl/SurfBukkitApiImpl.kt b/surf-api-bukkit/surf-api-bukkit-server/src/main/kotlin/dev/slne/surf/surfapi/bukkit/server/impl/SurfBukkitApiImpl.kt index 2bd4b342d..30c31638c 100644 --- a/surf-api-bukkit/surf-api-bukkit-server/src/main/kotlin/dev/slne/surf/surfapi/bukkit/server/impl/SurfBukkitApiImpl.kt +++ b/surf-api-bukkit/surf-api-bukkit-server/src/main/kotlin/dev/slne/surf/surfapi/bukkit/server/impl/SurfBukkitApiImpl.kt @@ -32,6 +32,9 @@ class SurfBukkitApiImpl : SurfCoreApiImpl(), SurfBukkitApi { SurfBukkitHookManager.onEnable() } + override val isFolia: Boolean by lazy { runCatching { Class.forName("io.papermc.paper.threadedregions.RegionizedServer") }.isSuccess } + override val isCanvasMc: Boolean by lazy { runCatching { Class.forName("io.canvasmc.canvas.event.EntityPortalAsyncEvent") }.isSuccess } + @ObsoleteScoreboardApi override fun scoreboardLibrary() = plugin.getScoreboardLibrary() diff --git a/surf-api-gradle-plugin/build.gradle.kts b/surf-api-gradle-plugin/build.gradle.kts index a6d02b560..c990a8c1b 100644 --- a/surf-api-gradle-plugin/build.gradle.kts +++ b/surf-api-gradle-plugin/build.gradle.kts @@ -21,7 +21,7 @@ plugins { group = groupId version = buildString { append(mcVersion) - append("-1.12.3") + append("-1.13.0") if (snapshot) append("-SNAPSHOT") } @@ -109,14 +109,15 @@ val generateConstants by tasks.registering { inputs.property("javaVersion", javaVersion) inputs.property("mcVersion", mcVersion) inputs.property("libs.paper.api", libs.paper.api.get().toString()) + inputs.property("libs.canvas.api", libs.canvas.api.get().toString()) inputs.property("libs.velocity.api", libs.velocity.api.get().toString()) inputs.property("libs.auto.service.annotations", libs.auto.service.annotations.get().toString()) - inputs.property("libs.versions.commandapi", libs.versions.commandapi.get().toString()) - inputs.property("libs.versions.placeholder.api", libs.versions.placeholder.api.get().toString()) - inputs.property("libs.versions.luckperms", libs.versions.luckperms.get().toString()) + inputs.property("libs.versions.commandapi", libs.versions.commandapi.get()) + inputs.property("libs.versions.placeholder.api", libs.versions.placeholder.api.get()) + inputs.property("libs.versions.luckperms", libs.versions.luckperms.get()) inputs.property( "libs.versions.packetevents", - libs.versions.packetevents.plugin.get().toString() + libs.versions.packetevents.plugin.get() ) inputs.property( "version", @@ -134,6 +135,7 @@ val generateConstants by tasks.registering { | const val SNAPSHOT_REPO_ID = "maven-releases" | const val SNAPSHOT_REPO = "https://repo.slne.dev/repository/maven-releases" | const val PAPER_API = "${libs.paper.api.get()}" + | const val CANVAS_API = "${libs.canvas.api.get()}" | const val VELOCITY_API = "${libs.velocity.api.get()}" | const val AUTO_SERVICE_ANNOTATIONS = "${libs.auto.service.annotations.get()}" | const val AUTO_SERVICE = "${generator.group}:${generator.name}:${generator.version}" diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/AbstractPaperSurfExtension.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/AbstractPaperSurfExtension.kt index c7e4b2180..a3d705ac5 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/AbstractPaperSurfExtension.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/AbstractPaperSurfExtension.kt @@ -2,5 +2,13 @@ package dev.slne.surf.surfapi.gradle.platform.paper import dev.slne.surf.surfapi.gradle.platform.core.CoreSurfExtension import org.gradle.api.model.ObjectFactory +import org.gradle.kotlin.dsl.property -abstract class AbstractPaperSurfExtension(objects: ObjectFactory) : CoreSurfExtension(objects) \ No newline at end of file +abstract class AbstractPaperSurfExtension(objects: ObjectFactory) : CoreSurfExtension(objects) { + val useCanvasMc = objects.property().convention(false) + + fun useCanvasMc() { + useCanvasMc.set(true) + useCanvasMc.finalizeValue() + } +} \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/AbstractPaperSurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/AbstractPaperSurfPlugin.kt index e79952334..032bf7771 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/AbstractPaperSurfPlugin.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/AbstractPaperSurfPlugin.kt @@ -3,8 +3,10 @@ package dev.slne.surf.surfapi.gradle.platform.paper import dev.slne.surf.surfapi.gradle.generated.Constants import dev.slne.surf.surfapi.gradle.platform.SurfApiPlatform import dev.slne.surf.surfapi.gradle.platform.core.AbstractCoreSurfPlugin +import dev.slne.surf.surfapi.gradle.util.canvasMaven import org.gradle.api.Project import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.repositories import org.jetbrains.kotlin.gradle.utils.COMPILE_ONLY internal abstract class AbstractPaperSurfPlugin(platformName: String) : @@ -15,8 +17,30 @@ internal abstract class AbstractPaperSurfPlugin( } override fun Project.configure0() { + } + + override fun Project.afterEvaluated1(extension: E) { + if (extension.useCanvasMc.get()) { + repositories { + canvasMaven() + } + } + dependencies { - add(COMPILE_ONLY, Constants.PAPER_API) + if (extension.useCanvasMc.get()) { + add(COMPILE_ONLY, Constants.CANVAS_API) + } else { + add(COMPILE_ONLY, Constants.PAPER_API) + } + } + + if (extension.useCanvasMc.get()) { + configurations.all { + resolutionStrategy.capabilitiesResolution.withCapability("org.bukkit:bukkit") { + select(Constants.CANVAS_API) + } + } } } + } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/plugin/PaperPluginSurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/plugin/PaperPluginSurfPlugin.kt index d64fcd519..5717c2524 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/plugin/PaperPluginSurfPlugin.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/platform/paper/plugin/PaperPluginSurfPlugin.kt @@ -43,7 +43,7 @@ internal class PaperPluginSurfPlugin : main = extension.mainClass.get() bootstrapper = extension.bootstrapper.orNull apiVersion = Constants.MINECRAFT_VERSION - foliaSupported = extension.foliaSupported.get() + foliaSupported = extension.useCanvasMc.get() || extension.foliaSupported.get() if (extension.generateLibraryLoader.get()) { generateLibrariesJson = true diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/util/repo-extensions.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/util/repo-extensions.kt index 0c4978bd4..715d6b55c 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/util/repo-extensions.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/surfapi/gradle/util/repo-extensions.kt @@ -16,6 +16,12 @@ inline fun RepositoryHandler.slnePublic(crossinline block: MavenArtifactReposito block() } +inline fun RepositoryHandler.canvasMaven(crossinline block: MavenArtifactRepository.() -> Unit = {}) = + maven("https://maven.canvasmc.io/snapshots") { + name = "Canvas" + block() + } + inline fun RepositoryHandler.slneReleases(crossinline block: MavenArtifactRepository.() -> Unit = {}) = maven("https://repo.slne.dev/repository/maven-releases/") { name = "maven-releases" From 062080896e350ef523070d3785db289dbcb6ca32 Mon Sep 17 00:00:00 2001 From: twisti Date: Wed, 11 Mar 2026 16:49:24 +0100 Subject: [PATCH 2/2] chore: update legacy abi --- surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api | 2 ++ 1 file changed, 2 insertions(+) diff --git a/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api b/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api index fbbedc5ce..8455b90c1 100644 --- a/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api +++ b/surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api @@ -2,6 +2,8 @@ public abstract interface class dev/slne/surf/surfapi/bukkit/api/SurfBukkitApi : public static final field Companion Ldev/slne/surf/surfapi/bukkit/api/SurfBukkitApi$Companion; public abstract fun createScoreboard (Lnet/kyori/adventure/text/Component;)Ldev/slne/surf/surfapi/bukkit/api/scoreboard/SurfScoreboardBuilder; public static fun getInstance ()Ldev/slne/surf/surfapi/bukkit/api/SurfBukkitApi; + public abstract fun isCanvasMc ()Z + public abstract fun isFolia ()Z public abstract fun scoreboardLibrary ()Lnet/megavex/scoreboardlibrary/api/ScoreboardLibrary; public fun sendPlayerToServer (Lorg/bukkit/entity/Player;Ljava/lang/String;)V public abstract fun skipTimeSmoothly (JJLkotlin/coroutines/Continuation;)Ljava/lang/Object;