From 40ea8ffcd78935001a504b48bb7fabd6320a8377 Mon Sep 17 00:00:00 2001 From: twisti-dev <76837088+twisti-dev@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:56:35 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(minestom):=20add=20Minestom=20?= =?UTF-8?q?platform=20support=20and=20update=20version=20to=203.35.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - introduce MinestomSurfPlugin and MinestomSurfExtension for Minestom integration - add MinestomSpongeConfigSerializer for configuration serialization - update version in gradle.properties to 3.35.0 - include Minestom dependencies in build.gradle.kts --- gradle.properties | 2 +- gradle/libs.versions.toml | 3 ++ settings.gradle.kts | 2 + surf-api-gradle-plugin/build.gradle.kts | 7 +++- .../api/gradle/platform/SurfApiPlatform.kt | 1 + .../minestom/MinestomSurfExtension.kt | 9 ++++ .../platform/minestom/MinestomSurfPlugin.kt | 11 +++++ surf-api-minestom/build.gradle.kts | 32 ++++++++++++++ .../api/minestom/SurfApiMinestomEntrypoint.kt | 33 +++++++++++++++ .../api/minestom/SurfApiMinestomPlugin.kt | 9 ++++ .../impl/MinestomSpongeConfigSerializer.kt | 7 ++++ .../api/minestom/impl/SurfMinestomApiImpl.kt | 42 +++++++++++++++++++ .../api/minestom/impl/SurfMinestomInstance.kt | 5 +++ 13 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/minestom/MinestomSurfExtension.kt create mode 100644 surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/minestom/MinestomSurfPlugin.kt create mode 100644 surf-api-minestom/build.gradle.kts create mode 100644 surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/SurfApiMinestomEntrypoint.kt create mode 100644 surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/SurfApiMinestomPlugin.kt create mode 100644 surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/MinestomSpongeConfigSerializer.kt create mode 100644 surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/SurfMinestomApiImpl.kt create mode 100644 surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/SurfMinestomInstance.kt diff --git a/gradle.properties b/gradle.properties index cc684ad4c..48b0c0d73 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled javaVersion=25 mcVersion=26.2 group=dev.slne.surf.api -version=3.34.0 +version=3.35.0 relocationPrefix=dev.slne.surf.api.libs snapshot=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ef68ba3ce..f19d9ee58 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -77,6 +77,9 @@ dokka = "2.2.0" paper-api = { module = "io.papermc.paper:paper-api", version.ref = "paper-api" } canvas-api = { module = "io.canvasmc.canvas:canvas-api", version.ref = "canvas-api" } +# Minestom +surf-minestom-lobby-api = { module = "dev.slne.minestom.lobby:surf-minestom-lobby-api", version = "+" } + # Kotlin kotlinxCoroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } kotlinxCoroutines-reactor = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactor", version.ref = "kotlinxCoroutines" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 5ebfa14e4..6b75ee732 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -35,6 +35,8 @@ include("surf-api-shared") include("surf-api-shared:surf-api-shared-public") include("surf-api-shared:surf-api-shared-internal") +include("surf-api-minestom") + val ci = System.getenv("CI")?.toBoolean() ?: false if (!ci) { diff --git a/surf-api-gradle-plugin/build.gradle.kts b/surf-api-gradle-plugin/build.gradle.kts index c47ea602f..a634e9cf9 100644 --- a/surf-api-gradle-plugin/build.gradle.kts +++ b/surf-api-gradle-plugin/build.gradle.kts @@ -20,7 +20,7 @@ plugins { group = groupId version = buildString { - append("2.0.8") + append("2.1.0") if (snapshot) append("-SNAPSHOT") } @@ -81,6 +81,11 @@ gradlePlugin { id = "dev.slne.surf.api.gradle.velocity" implementationClass = "dev.slne.surf.api.gradle.platform.velocity.VelocitySurfPlugin" } + + create("minestom") { + id = "dev.slne.surf.api.gradle.minestom" + implementationClass = "dev.slne.surf.api.gradle.platform.minestom.MinestomSurfPlugin" + } } publishing { diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/SurfApiPlatform.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/SurfApiPlatform.kt index 3e20fce7c..0648e4db7 100644 --- a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/SurfApiPlatform.kt +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/SurfApiPlatform.kt @@ -8,5 +8,6 @@ enum class SurfApiPlatform(val dependency: String, val scope: String = COMPILE_O CORE("dev.slne.surf.api:surf-api-core:${Constants.SURF_API_VERSION}"), PAPER("dev.slne.surf.api:surf-api-paper:${Constants.SURF_API_VERSION}"), VELOCITY("dev.slne.surf.api:surf-api-velocity:${Constants.SURF_API_VERSION}"), + MINESTOM("dev.slne.surf.api:surf-api-minestom:${Constants.SURF_API_VERSION}"), STANDALONE("dev.slne.surf.api:surf-api-standalone:${Constants.SURF_API_VERSION}", API), } \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/minestom/MinestomSurfExtension.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/minestom/MinestomSurfExtension.kt new file mode 100644 index 000000000..e6bd0c28a --- /dev/null +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/minestom/MinestomSurfExtension.kt @@ -0,0 +1,9 @@ +package dev.slne.surf.api.gradle.platform.minestom + +import dev.slne.surf.api.gradle.platform.core.CoreSurfExtension +import org.gradle.api.model.ObjectFactory +import javax.inject.Inject + +open class MinestomSurfExtension @Inject constructor( + objects: ObjectFactory, +) : CoreSurfExtension(objects) \ No newline at end of file diff --git a/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/minestom/MinestomSurfPlugin.kt b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/minestom/MinestomSurfPlugin.kt new file mode 100644 index 000000000..a753b96b3 --- /dev/null +++ b/surf-api-gradle-plugin/src/main/kotlin/dev/slne/surf/api/gradle/platform/minestom/MinestomSurfPlugin.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.api.gradle.platform.minestom + +import dev.slne.surf.api.gradle.platform.SurfApiPlatform +import dev.slne.surf.api.gradle.platform.core.AbstractCoreSurfPlugin + +internal class MinestomSurfPlugin : AbstractCoreSurfPlugin( + platformName = "minestom", + platform = SurfApiPlatform.MINESTOM, +) { + override val extensionClass = MinestomSurfExtension::class.java +} \ No newline at end of file diff --git a/surf-api-minestom/build.gradle.kts b/surf-api-minestom/build.gradle.kts new file mode 100644 index 000000000..6f4c6674a --- /dev/null +++ b/surf-api-minestom/build.gradle.kts @@ -0,0 +1,32 @@ +plugins { + `core-convention` + `api-validation` +} + +dependencies { + api(projects.surfApiCore.surfApiCore) { + exclude(libs.commandapi.core) + exclude(libs.brigadier) + } + + implementation(projects.surfApiCore.surfApiCoreServer) + compileOnlyApi(libs.surf.minestom.lobby.api) + + api(libs.guava) + api(libs.dazzleconf) + api(libs.spongepowered.math) + api(libs.commons.lang3) + api(libs.commons.text) + api(libs.okhttp) + api(libs.fastutil) + api(libs.flogger) + api(libs.commons.math4.core) + api(libs.commons.math3) + implementation(libs.packetevents.netty.common) + runtimeOnly(libs.flogger.slf4j.backend) +} + +description = "surf-api-minestom" + +private fun T.exclude(provider: Provider) = + provider.get().module.apply { exclude(group, name) } \ No newline at end of file diff --git a/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/SurfApiMinestomEntrypoint.kt b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/SurfApiMinestomEntrypoint.kt new file mode 100644 index 000000000..eb4d0e4c4 --- /dev/null +++ b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/SurfApiMinestomEntrypoint.kt @@ -0,0 +1,33 @@ +package dev.slne.surf.api.minestom + +import com.github.retrooper.packetevents.PacketEvents +import com.google.inject.Inject +import com.google.inject.Singleton +import dev.slne.minestom.lobby.api.plugin.MinestomPluginEntrypoint +import dev.slne.surf.api.core.extensions.packetEvents +import dev.slne.surf.api.core.server.packet.NoopPacketEvents +import dev.slne.surf.api.minestom.impl.SurfMinestomInstance + +@Singleton +internal class SurfApiMinestomEntrypoint @Inject constructor() : MinestomPluginEntrypoint { + override suspend fun start() { + preparePacketEvents() + SurfMinestomInstance.bootstrap() + SurfMinestomInstance.onLoad() + SurfMinestomInstance.onEnable() + } + + override suspend fun stop() { + SurfMinestomInstance.onDisable() + } + + private fun preparePacketEvents() { + PacketEvents.setAPI(NoopPacketEvents()) + packetEvents.load() + packetEvents.init() + } + + private fun destroyPacketEvents() { + packetEvents.terminate() + } +} \ No newline at end of file diff --git a/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/SurfApiMinestomPlugin.kt b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/SurfApiMinestomPlugin.kt new file mode 100644 index 000000000..b02bec0c8 --- /dev/null +++ b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/SurfApiMinestomPlugin.kt @@ -0,0 +1,9 @@ +package dev.slne.surf.api.minestom + +import com.google.auto.service.AutoService +import dev.slne.minestom.lobby.api.plugin.MinestomPlugin +import dev.slne.minestom.lobby.api.plugin.annotation.MinestomPluginMeta + +@AutoService(MinestomPlugin::class) +@MinestomPluginMeta("surf-api-minestom") +internal class SurfApiMinestomPlugin: MinestomPlugin(SurfApiMinestomEntrypoint::class.java) \ No newline at end of file diff --git a/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/MinestomSpongeConfigSerializer.kt b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/MinestomSpongeConfigSerializer.kt new file mode 100644 index 000000000..c2fae9d57 --- /dev/null +++ b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/MinestomSpongeConfigSerializer.kt @@ -0,0 +1,7 @@ +package dev.slne.surf.api.minestom.impl + +import com.google.auto.service.AutoService +import dev.slne.surf.api.core.config.serializer.SpongeConfigSerializers + +@AutoService(SpongeConfigSerializers::class) +internal class MinestomSpongeConfigSerializer : SpongeConfigSerializers() \ No newline at end of file diff --git a/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/SurfMinestomApiImpl.kt b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/SurfMinestomApiImpl.kt new file mode 100644 index 000000000..b99c954f3 --- /dev/null +++ b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/SurfMinestomApiImpl.kt @@ -0,0 +1,42 @@ +package dev.slne.surf.api.minestom.impl + +import com.google.auto.service.AutoService +import dev.slne.surf.api.core.SurfApiCore +import dev.slne.surf.api.core.server.impl.SurfApiCoreImpl +import dev.slne.surf.api.core.util.checkInstantiationByServiceLoader +import net.kyori.adventure.audience.Audience +import net.minestom.server.MinecraftServer +import net.minestom.server.entity.Player +import net.minestom.server.network.NetworkBuffer +import java.util.* + + +@AutoService(SurfApiCore::class) +internal class SurfMinestomApiImpl : SurfApiCoreImpl() { + init { + checkInstantiationByServiceLoader() + } + + override fun isPlayer(audience: Audience): Boolean { + return audience is Player + } + + override fun sendPlayerToServer(playerUuid: UUID, server: String) { + MinecraftServer + .getConnectionManager() + .getOnlinePlayerByUuid(playerUuid) + ?.sendPluginMessage( + "bungeecord:main", + NetworkBuffer.makeArray { buffer -> + buffer.write(NetworkBuffer.STRING_IO_UTF8, "Connect") + buffer.write(NetworkBuffer.STRING_IO_UTF8, server) + } + ) + } + + override fun getPlayer(playerUuid: UUID): Any? { + return MinecraftServer + .getConnectionManager() + .getOnlinePlayerByUuid(playerUuid) + } +} \ No newline at end of file diff --git a/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/SurfMinestomInstance.kt b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/SurfMinestomInstance.kt new file mode 100644 index 000000000..1af43da1e --- /dev/null +++ b/surf-api-minestom/src/main/kotlin/dev/slne/surf/api/minestom/impl/SurfMinestomInstance.kt @@ -0,0 +1,5 @@ +package dev.slne.surf.api.minestom.impl + +import dev.slne.surf.api.core.server.CoreInstance + +internal object SurfMinestomInstance: CoreInstance() \ No newline at end of file