From cb038f48c4e8530b1c74685b6874ca6dcef15607 Mon Sep 17 00:00:00 2001 From: TDSTOS Date: Mon, 13 Apr 2026 01:34:59 +0200 Subject: [PATCH] Auto-assign teamless players; remove tablist reset Call assignTeamlessPlayers() at game start and add helper to auto-assign online players without a team into preset teams. The helper computes the minimal number of active teams based on maxTeamSize, fills non-full teams (choosing the smallest), logs assignments, and is a no-op if preset teams are disabled. Also remove the automatic tab-prefix refresh when a player leaves a team in PresetTeamManager (prefix handling moved/changed elsewhere). --- .../club/mcscrims/speedhg/game/GameManager.kt | 47 +++++++++++++++++++ .../speedhg/team/gui/PresetTeamManager.kt | 3 -- 2 files changed, 47 insertions(+), 3 deletions(-) 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). */