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 1/6] 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' From 2c66a5f2451335150fdeb458a3bae3e409ae9e61 Mon Sep 17 00:00:00 2001 From: Era <100019405+EraOSBeta@users.noreply.github.com> Date: Fri, 22 Dec 2023 23:32:02 +0330 Subject: [PATCH 2/6] Updated CHANGELOG and CONTRIBUTORS --- CHANGELOG.md | 9 +++++---- CONTRIBUTORS.md | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d84b9b62..d657d2e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,5 @@ ### 1.7.33 (build 21743, api 8, 2023-12-21) +- Exposed an override for `bascenev1.Session`'s max players on servers (by EraOSBeta) ### 1.7.32 (build 21741, api 8, 2023-12-20) - Fixed a screen message that no one will ever see (Thanks vishal332008?...) @@ -42,7 +43,7 @@ intended. Now, however, such commands get scheduled to a current 'ui-operation' and then run *almost* immediately, which should prevent such situations. Please holler if you run into any UI weirdness at this point. - + ### 1.7.30 (build 21697, api 8, 2023-12-08) - Continued work on the big 1.7.28 update. - Got the Android version back up and running. There's been lots of cleanup and @@ -319,7 +320,7 @@ - Added a 'glow_type' arg to `bauiv1.textwidget()` to adjust the glow used when the text is selected. The default is 'gradient' but there is now a 'uniform' option which may look better in some circumstances. - + ### 1.7.27 (build 21282, api 8, 2023-08-30) - Fixed a rare crash that could occur if the app shuts down while a background @@ -440,7 +441,7 @@ Visual Studio Code (and potentially other editors), so am seeing if it is worth officially supporting in addition to or as a replacement for Mypy. See `tools/pcommand pyright` - + ### 1.7.24 (build 21199, api 8, 2023-07-27) - Fixed an issue where respawn icons could disappear in epic mode (Thanks for @@ -495,7 +496,7 @@ can be useful for core engine code to directly and clearly point out problems that cannot be recovered from (Exceptions in such cases can tend to be 'handled' which leads to a broken or crashing app). - + ### 1.7.23 (build 21178, api 8, 2023-07-19) - Network security improvements. (Thanks Dliwk!) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 8fccc544..a097222f 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -37,12 +37,12 @@ - Added feature ### Vishal332008 -- Bug Fixer +- QoL and Bug Fixer - Modder ### Era0S - Community Suggestions Implementer -- Bug Fixer +- QoL and Bug Fixer - Modder ### VinniTR From c2f34bac3a809d1eafa503399e6018484b8345cf Mon Sep 17 00:00:00 2001 From: Era <100019405+EraOSBeta@users.noreply.github.com> Date: Sat, 23 Dec 2023 21:14:37 +0330 Subject: [PATCH 3/6] UI for series length --- .../ba_data/python/baclassic/_servermode.py | 4 +++ .../ba_data/python/baclassic/_subsystem.py | 4 +-- .../python/bascenev1/_multiteamsession.py | 4 +-- src/assets/ba_data/python/bauiv1lib/config.py | 10 ++++-- .../ba_data/python/bauiv1lib/playoptions.py | 31 +++++++++++++++++-- 5 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/assets/ba_data/python/baclassic/_servermode.py b/src/assets/ba_data/python/baclassic/_servermode.py index 60f5200c..65720ae3 100644 --- a/src/assets/ba_data/python/baclassic/_servermode.py +++ b/src/assets/ba_data/python/baclassic/_servermode.py @@ -406,6 +406,10 @@ class ServerController: else: raise RuntimeError(f'Unknown session type {sessiontype}') + appcfg['Teams Series Length'] = self._config.teams_series_length + appcfg['FFA Series Length'] = self._config.ffa_series_length + + # deprecated, left here in order to not break mods classic.teams_series_length = self._config.teams_series_length classic.ffa_series_length = self._config.ffa_series_length diff --git a/src/assets/ba_data/python/baclassic/_subsystem.py b/src/assets/ba_data/python/baclassic/_subsystem.py index 16299bdc..65c799d6 100644 --- a/src/assets/ba_data/python/baclassic/_subsystem.py +++ b/src/assets/ba_data/python/baclassic/_subsystem.py @@ -101,8 +101,8 @@ class ClassicSubsystem(babase.AppSubsystem): self.maps: dict[str, type[bascenev1.Map]] = {} # Gameplay. - self.teams_series_length = 7 - self.ffa_series_length = 24 + self.teams_series_length = 7 # deprecated, left for old mods + self.ffa_series_length = 24 # deprecated, left for old mods self.coop_session_args: dict = {} # UI. diff --git a/src/assets/ba_data/python/bascenev1/_multiteamsession.py b/src/assets/ba_data/python/bascenev1/_multiteamsession.py index cdd1bf2a..ce816888 100644 --- a/src/assets/ba_data/python/bascenev1/_multiteamsession.py +++ b/src/assets/ba_data/python/bascenev1/_multiteamsession.py @@ -65,8 +65,8 @@ class MultiTeamSession(Session): max_players=self.get_max_players(), ) - self._series_length: int = classic.teams_series_length - self._ffa_series_length: int = classic.ffa_series_length + self._series_length: int = int(cfg.get('Teams Series Length', 7)) + self._ffa_series_length: int = int(cfg.get('FFA Series Length', 24)) show_tutorial = cfg.get('Show Tutorial', True) diff --git a/src/assets/ba_data/python/bauiv1lib/config.py b/src/assets/ba_data/python/bauiv1lib/config.py index 763a3704..255dd6d3 100644 --- a/src/assets/ba_data/python/bauiv1lib/config.py +++ b/src/assets/ba_data/python/bauiv1lib/config.py @@ -94,6 +94,8 @@ class ConfigNumberEdit: changesound: bool = True, textscale: float = 1.0, as_percent: bool = False, + fallback_value: float = 0.0, + f: int = 1, ): if displayname is None: displayname = configkey @@ -103,8 +105,12 @@ class ConfigNumberEdit: self._maxval = maxval self._increment = increment self._callback = callback - self._value = bui.app.config.resolve(configkey) + try: + self._value = bui.app.config.resolve(configkey) + except ValueError: + self._value = bui.app.config.get(configkey, fallback_value) self._as_percent = as_percent + self._f = f self.nametext = bui.textwidget( parent=parent, @@ -171,5 +177,5 @@ class ConfigNumberEdit: if self._as_percent: val = f'{round(self._value*100.0)}%' else: - val = f'{self._value:.1f}' + val = f'{self._value:.{self._f}f}' bui.textwidget(edit=self.valuetext, text=val) diff --git a/src/assets/ba_data/python/bauiv1lib/playoptions.py b/src/assets/ba_data/python/bauiv1lib/playoptions.py index ea58e4d6..88935bf3 100644 --- a/src/assets/ba_data/python/bauiv1lib/playoptions.py +++ b/src/assets/ba_data/python/bauiv1lib/playoptions.py @@ -32,6 +32,7 @@ class PlayOptionsWindow(PopupWindow): # pylint: disable=too-many-locals from bascenev1 import filter_playlist, get_map_class from bauiv1lib.playlist import PlaylistTypeVars + from bauiv1lib.config import ConfigNumberEdit self._r = 'gameListWindow' self._delegate = delegate @@ -51,7 +52,7 @@ class PlayOptionsWindow(PopupWindow): self._playlist = playlist self._width = 500.0 - self._height = 330.0 - 50.0 + self._height = 370.0 - 50.0 # In teams games, show the custom names/colors button. if self._sessiontype is bs.DualTeamSession: @@ -274,13 +275,37 @@ class PlayOptionsWindow(PopupWindow): texture=bui.gettexture('lock'), ) + y_offs = 50 if show_shuffle_check_box else 0 + + # Series Length + y_offs2 = 40 if self._sessiontype is bs.DualTeamSession else 0 + self._series_length_numedit = ConfigNumberEdit( + parent=self.root_widget, + position=(100, 200 + y_offs + y_offs2), + configkey=( + 'FFA' if self._sessiontype is bs.FreeForAllSession else 'Teams' + ) + ' Series Length', + displayname=bui.Lstr( + resource=self._r + ( + '.pointsToWinText' + if self._sessiontype is bs.FreeForAllSession + else '.seriesLengthText' + ) + ), + minval=1.0, + increment=1.0 if self._sessiontype is bs.FreeForAllSession else 2.0, + fallback_value=( + 24 if self._sessiontype is bs.FreeForAllSession else 7 + ), + f=0, + ) + # Team names/colors. self._custom_colors_names_button: bui.Widget | None if self._sessiontype is bs.DualTeamSession: - y_offs = 50 if show_shuffle_check_box else 0 self._custom_colors_names_button = bui.buttonwidget( parent=self.root_widget, - position=(100, 200 + y_offs), + position=(100, 195 + y_offs), size=(290, 35), on_activate_call=bui.WeakCall(self._custom_colors_names_press), autoselect=True, From 1018a158c7097bae845766c418198b4e223fb914 Mon Sep 17 00:00:00 2001 From: Era <100019405+EraOSBeta@users.noreply.github.com> Date: Sat, 23 Dec 2023 21:58:03 +0330 Subject: [PATCH 4/6] Added temp to CONTRIBUTORS --- CONTRIBUTORS.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index a097222f..4c8e0f2d 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -50,3 +50,6 @@ ### Rikko - Created the original "reject_recently_left_players" plugin + +### 3alTemp +- Original idea for customizable series length on GUI builds From b925aa31f9b3cf6c11c6d444d05295bf9de2845f Mon Sep 17 00:00:00 2001 From: Era <100019405+EraOSBeta@users.noreply.github.com> Date: Sat, 23 Dec 2023 21:59:56 +0330 Subject: [PATCH 5/6] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d657d2e1..8b2ee065 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### 1.7.33 (build 21743, api 8, 2023-12-21) - Exposed an override for `bascenev1.Session`'s max players on servers (by EraOSBeta) +- Added UI for customizing teams and FFA series length (by EraOSBeta, idea by 3alTemp) ### 1.7.32 (build 21741, api 8, 2023-12-20) - Fixed a screen message that no one will ever see (Thanks vishal332008?...) From 5c0d768dcc29d40e9524c3a71b0803a8a9d524b1 Mon Sep 17 00:00:00 2001 From: Era <100019405+EraOSBeta@users.noreply.github.com> Date: Sun, 11 Feb 2024 12:38:49 +0330 Subject: [PATCH 6/6] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8f5910a..7b5a399d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ classes forget to adapt to the change. - Implemented `efro.dataclassio.IOMultiType` which will make my life a lot easier. + ### 1.7.32 (build 21741, api 8, 2023-12-20) - Fixed a screen message that no one will ever see (Thanks vishal332008?...) - Plugins window now displays 'No Plugins Installed' when no plugins are present (Thanks vishal332008!)