diff --git a/gradle.properties b/gradle.properties index 7e9810a..c5d4f36 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,6 +4,6 @@ org.gradle.configuration-cache=false kotlin.code.style=official kotlin.stdlib.default.dependency=false org.gradle.parallel=true -version=1.1.3 +version=1.2.0 authors=twisti,SLNE-Development \ No newline at end of file diff --git a/surf-queue-api/src/main/kotlin/dev/slne/surf/queue/api/SurfQueueAvailableSlotsProvider.kt b/surf-queue-api/src/main/kotlin/dev/slne/surf/queue/api/SurfQueueAvailableSlotsProvider.kt new file mode 100644 index 0000000..58f17ac --- /dev/null +++ b/surf-queue-api/src/main/kotlin/dev/slne/surf/queue/api/SurfQueueAvailableSlotsProvider.kt @@ -0,0 +1,41 @@ +package dev.slne.surf.queue.api + +import dev.slne.surf.core.api.common.server.SurfServer + +/** + * Provides the number of currently available slots for a given [SurfServer]. + */ +interface SurfQueueAvailableSlotsProvider { + + /** + * Returns the number of currently available slots on the given [server]. + * + * @param server the server whose available slots should be resolved + * @return the amount of free slots on the server + */ + suspend fun getAvailableSlots(server: SurfServer): Int + + /** + * Holds global access to the currently configured [SurfQueueAvailableSlotsProvider]. + */ + companion object { + private lateinit var instance: SurfQueueAvailableSlotsProvider + + /** + * Sets the global [SurfQueueAvailableSlotsProvider] instance. + * + * @param provider the provider instance to register + */ + fun set(provider: SurfQueueAvailableSlotsProvider) { + instance = provider + } + + /** + * Returns the globally configured [SurfQueueAvailableSlotsProvider] instance. + * + * @return the registered provider instance + * @throws UninitializedPropertyAccessException if no provider has been set yet + */ + fun get() = instance + } +} \ No newline at end of file diff --git a/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/PaperSurfQueueInstance.kt b/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/PaperSurfQueueInstance.kt index 61f04c4..3b72c4e 100644 --- a/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/PaperSurfQueueInstance.kt +++ b/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/PaperSurfQueueInstance.kt @@ -3,6 +3,7 @@ package dev.slne.surf.queue.paper import com.google.auto.service.AutoService import dev.slne.surf.api.paper.event.register import dev.slne.surf.core.api.common.server.SurfServer +import dev.slne.surf.queue.api.SurfQueueAvailableSlotsProvider import dev.slne.surf.queue.common.QueueInstance import dev.slne.surf.queue.common.queue.AbstractQueue import dev.slne.surf.queue.common.queue.tick.QueueScheduler @@ -11,6 +12,7 @@ import dev.slne.surf.queue.paper.config.SurfQueueConfig import dev.slne.surf.queue.paper.hook.startup.QueueStartHook import dev.slne.surf.queue.paper.listener.PlayerKickedDueToFullServerListener import dev.slne.surf.queue.paper.metrics.QueueMetricsLogger +import dev.slne.surf.queue.paper.queue.DefaultSurfQueueAvailableSlotsProvider import dev.slne.surf.queue.paper.queue.PaperOwnedQueueImpl import dev.slne.surf.queue.paper.queue.PaperQueueImpl @@ -25,6 +27,7 @@ class PaperSurfQueueInstance : QueueInstance() { override suspend fun load() { SurfQueueConfig.init() + SurfQueueAvailableSlotsProvider.set(DefaultSurfQueueAvailableSlotsProvider) super.load() QueueStartHook.get().onServerReady { isLoaded = true diff --git a/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/queue/DefaultSurfQueueAvailableSlotsProvider.kt b/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/queue/DefaultSurfQueueAvailableSlotsProvider.kt new file mode 100644 index 0000000..2c2c7ae --- /dev/null +++ b/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/queue/DefaultSurfQueueAvailableSlotsProvider.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.queue.paper.queue + +import dev.slne.surf.core.api.common.server.SurfServer +import dev.slne.surf.queue.api.SurfQueueAvailableSlotsProvider +import org.bukkit.Bukkit + +object DefaultSurfQueueAvailableSlotsProvider : SurfQueueAvailableSlotsProvider { + override suspend fun getAvailableSlots(server: SurfServer): Int { + return if (SurfServer.current().name == server.name) { + Bukkit.getMaxPlayers() - Bukkit.getOnlinePlayers().size + } else { + server.maxPlayers - server.getPlayers().size + } + } +} \ No newline at end of file diff --git a/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/queue/transfer/PaperQueueTransfer.kt b/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/queue/transfer/PaperQueueTransfer.kt index b97c503..f40a2d8 100644 --- a/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/queue/transfer/PaperQueueTransfer.kt +++ b/surf-queue-paper/src/main/kotlin/dev/slne/surf/queue/paper/queue/transfer/PaperQueueTransfer.kt @@ -7,6 +7,7 @@ import dev.slne.surf.core.api.common.server.connection.SurfServerConnectResult import dev.slne.surf.queue.paper.config.SurfQueueConfig import dev.slne.surf.queue.paper.listener.PlayerKickedDueToFullServerListener import dev.slne.surf.api.core.util.logger +import dev.slne.surf.queue.api.SurfQueueAvailableSlotsProvider import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.withTimeout import net.kyori.adventure.text.Component @@ -26,10 +27,10 @@ class PaperQueueTransfer( } suspend fun tryTransfer(): Int { - val availableSlots = Bukkit.getMaxPlayers() - Bukkit.getOnlinePlayers().size + val coreServer = SurfServer[serverName] ?: return 0 + val availableSlots = SurfQueueAvailableSlotsProvider.get().getAvailableSlots(coreServer) if (availableSlots <= 0) return 0 - val coreServer = SurfServer[serverName] ?: return 0 val maxTransfers = min(availableSlots, SurfQueueConfig.getConfig().maxTransfersPerSecond) return processor.processTransfers(maxTransfers) { (uuid) ->