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).
This commit is contained in:
TDSTOS
2026-04-13 01:34:59 +02:00
parent 7589b05433
commit cb038f48c4
2 changed files with 47 additions and 3 deletions

View File

@@ -167,6 +167,7 @@ class GameManager(
pitManager.reset() pitManager.reset()
plugin.lobbyItemManager.clearAll() plugin.lobbyItemManager.clearAll()
assignTeamlessPlayers()
setGameState( GameState.INVINCIBILITY ) setGameState( GameState.INVINCIBILITY )
timer = invincibilityTime timer = invincibilityTime
@@ -361,6 +362,52 @@ class GameManager(
// --- Helfer Methoden --- // --- 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 { private fun buildWinnerName(anyAliveUUID: UUID?): String {
anyAliveUUID ?: return "N/A" anyAliveUUID ?: return "N/A"

View File

@@ -165,9 +165,6 @@ class PresetTeamManager(
) { ) {
val team = teamByPlayer.remove( player.uniqueId ) ?: return val team = teamByPlayer.remove( player.uniqueId ) ?: return
team.members.remove( player.uniqueId ) team.members.remove( player.uniqueId )
// Tab-Prefix zurücksetzen
plugin.tablistManager.refreshTeamPrefix( player )
} }
/** Setzt alle Team-Slots zurück (Spielstart / Runden-Reset). */ /** Setzt alle Team-Slots zurück (Spielstart / Runden-Reset). */