diff --git a/gradle.properties b/gradle.properties index cc684ad4..48b0c0d7 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 ef68ba3c..f19d9ee5 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 5ebfa14e..6b75ee73 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 c47ea602..a634e9cf 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 3e20fce7..0648e4db 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 00000000..e6bd0c28 --- /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 00000000..a753b96b --- /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 00000000..6f4c6674 --- /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 00000000..eb4d0e4c --- /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 00000000..b02bec0c --- /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 00000000..c2fae9d5 --- /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 00000000..b99c954f --- /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 00000000..1af43da1 --- /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