From dbd19e58be7a13f63e2e4f842fe47b9c53f638e9 Mon Sep 17 00:00:00 2001 From: Era <100019405+EraOSBeta@users.noreply.github.com> Date: Fri, 22 Dec 2023 23:16:22 +0330 Subject: [PATCH] Added session_max_players_override option for servers --- .../ba_data/python/baclassic/_servermode.py | 4 ++++ src/assets/ba_data/python/bascenev1/__init__.py | 5 ++++- src/assets/ba_data/python/bascenev1/_session.py | 17 +++++++++++++++-- tools/bacommon/servermanager.py | 8 ++++++-- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/assets/ba_data/python/baclassic/_servermode.py b/src/assets/ba_data/python/baclassic/_servermode.py index 45ee6eb9..60f5200c 100644 --- a/src/assets/ba_data/python/baclassic/_servermode.py +++ b/src/assets/ba_data/python/baclassic/_servermode.py @@ -427,6 +427,10 @@ class ServerController: self._config.player_rejoin_cooldown ) + bascenev1.set_max_players_override( + self._config.session_max_players_override + ) + # And here.. we.. go. if self._config.stress_test_players is not None: # Special case: run a stress test. diff --git a/src/assets/ba_data/python/bascenev1/__init__.py b/src/assets/ba_data/python/bascenev1/__init__.py index e96deb0b..6465139b 100644 --- a/src/assets/ba_data/python/bascenev1/__init__.py +++ b/src/assets/ba_data/python/bascenev1/__init__.py @@ -228,7 +228,9 @@ from bascenev1._settings import ( IntSetting, Setting, ) -from bascenev1._session import Session, set_player_rejoin_cooldown +from bascenev1._session import ( + Session, set_player_rejoin_cooldown, set_max_players_override +) from bascenev1._stats import PlayerScoredMessage, PlayerRecord, Stats from bascenev1._team import SessionTeam, Team, EmptyTeam from bascenev1._teamgame import TeamGameActivity @@ -420,6 +422,7 @@ __all__ = [ 'set_public_party_queue_enabled', 'set_public_party_stats_url', 'set_player_rejoin_cooldown', + 'set_max_players_override', 'set_replay_speed_exponent', 'set_touchscreen_editing', 'setmusic', diff --git a/src/assets/ba_data/python/bascenev1/_session.py b/src/assets/ba_data/python/bascenev1/_session.py index d561f12d..b7a203f2 100644 --- a/src/assets/ba_data/python/bascenev1/_session.py +++ b/src/assets/ba_data/python/bascenev1/_session.py @@ -23,6 +23,9 @@ if TYPE_CHECKING: # such as skipping respawn waits. _g_player_rejoin_cooldown: float = 0.0 +# overrides the session's decision of max_players +_max_players_override: int | None = None + def set_player_rejoin_cooldown(cooldown: float) -> None: """Set the cooldown for individual players rejoining after leaving.""" @@ -30,6 +33,12 @@ def set_player_rejoin_cooldown(cooldown: float) -> None: _g_player_rejoin_cooldown = max(0.0, cooldown) +def set_max_players_override(max_players: int | None) -> None: + """Set the override for how many players can join a session""" + global _max_players_override # pylint: disable=global-statement + _max_players_override = max_players + + class Session: """Defines a high level series of bascenev1.Activity-es. @@ -161,7 +170,11 @@ class Session: self.sessionteams = [] self.sessionplayers = [] self.min_players = min_players - self.max_players = max_players + self.max_players = ( + max_players + if _max_players_override is None + else _max_players_override + ) self.customdata = {} self._in_set_activity = False @@ -255,7 +268,7 @@ class Session: babase.app.classic is not None and babase.app.classic.stress_test_reset_timer is None ): - if len(self.sessionplayers) >= self.max_players: + if len(self.sessionplayers) >= self.max_players >= 0: # Print a rejection message *only* to the client trying to # join (prevents spamming everyone else in the game). _bascenev1.getsound('error').play() diff --git a/tools/bacommon/servermanager.py b/tools/bacommon/servermanager.py index 28ca0db5..295a8be8 100644 --- a/tools/bacommon/servermanager.py +++ b/tools/bacommon/servermanager.py @@ -47,10 +47,14 @@ class ServerConfig: # Max devices in the party. Note that this does *NOT* mean max players. # Any device in the party can have more than one player on it if they have # multiple controllers. Also, this number currently includes the server so - # generally make it 1 bigger than you need. Max-players is not currently - # exposed but I'll try to add that soon. + # generally make it 1 bigger than you need. max_party_size: int = 6 + # Max players that can join a session. If present this will override the + # session's preferred max_players. if a value below 0 is given player limit + # will be removed. + session_max_players_override: int | None = None + # Options here are 'ffa' (free-for-all), 'teams' and 'coop' (cooperative) # This value is ignored if you supply a playlist_code (see below). session_type: str = 'ffa'