diff --git a/src/main/kotlin/club/mcscrims/speedhg/game/GameManager.kt b/src/main/kotlin/club/mcscrims/speedhg/game/GameManager.kt index eccf12c..392c2b6 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/game/GameManager.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/game/GameManager.kt @@ -167,6 +167,7 @@ class GameManager( pitManager.reset() plugin.lobbyItemManager.clearAll() + assignTeamlessPlayers() setGameState( GameState.INVINCIBILITY ) timer = invincibilityTime @@ -361,6 +362,52 @@ class GameManager( // --- Helfer Methoden --- + /** + * Weist alle Spieler ohne Team einem zufälligen Team mit freiem Platz zu. + * + * Aufruf: direkt am Anfang von [startGame], **bevor** Spieler teleportiert + * oder Kits verteilt werden. + */ + private fun assignTeamlessPlayers() + { + if ( !plugin.presetTeamManager.isEnabled ) return + + val teamManager = plugin.presetTeamManager + + val teamlessPlayers = Bukkit.getOnlinePlayers() + .filter { teamManager.getTeam( it ) == null } + .shuffled() + + if ( teamlessPlayers.isEmpty() ) return + + // Berechne wie viele Teams wir tatsächlich brauchen, um alle unterzubringen. + // ceil( gesamtSpieler / maxSize ) → minimale Teamanzahl für volle Teams. + val totalPlayers = Bukkit.getOnlinePlayers().size + val maxSize = teamManager.maxTeamSize + val teamsNeeded = ( totalPlayers + maxSize - 1 ) / maxSize + + // Nur die ersten N Teams befüllen — der Rest bleibt leer. + val activeTeams = teamManager.presetTeams.take( teamsNeeded ) + + // Spieler die bereits in einem der aktiven Teams sind, zählen mit. + // Teamlose Spieler werden der Reihe nach in den ersten nicht-vollen Slot gesteckt. + teamlessPlayers.forEach { player -> + val target = activeTeams + .filter { !it.isFull } + .minByOrNull { it.size } + ?: run { + plugin.logger.warning( "[GameManager] Kein aktives Team mehr frei für ${player.name}!" ) + return@forEach + } + + teamManager.join( player, target ) + + plugin.logger.info( + "[GameManager] ${player.name} wurde automatisch '${target.name}' zugewiesen." + ) + } + } + private fun buildWinnerName(anyAliveUUID: UUID?): String { anyAliveUUID ?: return "N/A" diff --git a/src/main/kotlin/club/mcscrims/speedhg/team/gui/PresetTeamManager.kt b/src/main/kotlin/club/mcscrims/speedhg/team/gui/PresetTeamManager.kt index bbae030..e56246a 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/team/gui/PresetTeamManager.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/team/gui/PresetTeamManager.kt @@ -165,9 +165,6 @@ class PresetTeamManager( ) { val team = teamByPlayer.remove( player.uniqueId ) ?: return team.members.remove( player.uniqueId ) - - // Tab-Prefix zurücksetzen - plugin.tablistManager.refreshTeamPrefix( player ) } /** Setzt alle Team-Slots zurück (Spielstart / Runden-Reset). */