From db39fcd0e35fd3f783c4142112420096d5e8beec Mon Sep 17 00:00:00 2001 From: Wildkins Date: Thu, 21 Apr 2022 18:51:53 -0400 Subject: [PATCH] Fix player ready count + potentially fix improper arg. crash (#13602) --- code/controllers/subsystems/ticker.dm | 20 ++++++++++++------- .../mob/abstract/new_player/new_player.dm | 5 ++++- html/changelogs/johnwildkins-fixlobby.yml | 6 ++++++ 3 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 html/changelogs/johnwildkins-fixlobby.yml diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 6391d61c63b..4cd1e9ac95e 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -330,8 +330,8 @@ var/datum/controller/subsystem/ticker/SSticker return 1 /datum/controller/subsystem/ticker/proc/update_ready_list(var/mob/abstract/new_player/NP, force_rdy = FALSE, force_urdy = FALSE) - if(current_state >= GAME_STATE_PLAYING || SSjobs?.init_state < SS_INITSTATE_DONE) - return FALSE // don't bother once the game has started + if(current_state >= GAME_STATE_PLAYING || !SSjobs.bitflag_to_job.len) + return FALSE // don't bother once the game has started or before SSjobs is available if(!LAZYLEN(ready_player_jobs)) ready_player_jobs = DEPARTMENTS_LIST_INIT @@ -358,7 +358,7 @@ var/datum/controller/subsystem/ticker/SSticker . = TRUE if(.) - total_players_ready++ + update_ready_count() /datum/controller/subsystem/ticker/proc/unready_player(var/ident, var/force_name = FALSE) if(isnull(ident)) @@ -368,11 +368,11 @@ var/datum/controller/subsystem/ticker/SSticker if(!istype(prefs) || force_name) // trawl the whole list - we only do this on logout or job swap, aka when we can't guarantee the job datum being accurate for(var/dept in ready_player_jobs) - if(ready_player_jobs[dept][ident]) + if(LAZYISIN(ready_player_jobs[dept], ident)) . = TRUE ready_player_jobs[dept] -= ident if(.) - total_players_ready-- + update_ready_count() return var/datum/job/ready_job = prefs.return_chosen_high_job() @@ -383,11 +383,17 @@ var/datum/controller/subsystem/ticker/SSticker LAZYREMOVE(ready_player_jobs[dept], prefs.real_name) if(.) - total_players_ready-- + update_ready_count() + +/datum/controller/subsystem/ticker/proc/update_ready_count() + total_players_ready = 0 + for(var/mob/abstract/new_player/NP in player_list) + if(NP.ready) + total_players_ready++ /datum/controller/subsystem/ticker/proc/cycle_player(var/mob/abstract/new_player/NP, var/datum/job/job) // exclusively used for occupation.dm, when players swap job priority while readied - if(current_state >= GAME_STATE_PLAYING || SSjobs?.init_state < SS_INITSTATE_DONE || !NP.ready) + if(current_state >= GAME_STATE_PLAYING || !SSjobs.bitflag_to_job.len || !NP.ready) return FALSE update_ready_list(NP, force_urdy = TRUE) diff --git a/code/modules/mob/abstract/new_player/new_player.dm b/code/modules/mob/abstract/new_player/new_player.dm index d82b7c7c367..ed1deee67fd 100644 --- a/code/modules/mob/abstract/new_player/new_player.dm +++ b/code/modules/mob/abstract/new_player/new_player.dm @@ -33,6 +33,9 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player) if(statpanel("Lobby")) stat("Game ID:", game_id) + if(!istype(SSticker)) + return + if(SSticker.hide_mode == ROUNDTYPE_SECRET) stat("Game Mode:", "Secret") else if (SSticker.hide_mode == ROUNDTYPE_MIXED_SECRET) @@ -43,7 +46,7 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player) if(SSticker.current_state == GAME_STATE_PREGAME) stat("Time To Start:", "[SSticker.pregame_timeleft][round_progressing ? "" : " (DELAYED)"]") stat("Players: [length(player_list)]", "Players Ready: [SSticker.total_players_ready]") - if(SSjobs.init_state >= SS_INITSTATE_DONE) + if(LAZYLEN(SSticker.ready_player_jobs)) for(var/dept in SSticker.ready_player_jobs) if(LAZYLEN(SSticker.ready_player_jobs[dept])) stat(uppertext(dept), null) diff --git a/html/changelogs/johnwildkins-fixlobby.yml b/html/changelogs/johnwildkins-fixlobby.yml new file mode 100644 index 00000000000..1ed4624cf0e --- /dev/null +++ b/html/changelogs/johnwildkins-fixlobby.yml @@ -0,0 +1,6 @@ +author: JohnWildkins + +delete-after: True + +changes: + - bugfix: "Players readied count in the lobby should now be accurate. Improper Argument crash has also (potentially) been fixed."