diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 6a603bd7235..166083b36ff 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -25,9 +25,9 @@ SUBSYSTEM_DEF(jobs) // Only fires every 5 minutes /datum/controller/subsystem/jobs/fire() if(!config.sql_enabled || !config.use_exp_tracking) - return + return update_exp(5,0) - + /datum/controller/subsystem/jobs/proc/SetupOccupations(var/list/faction = list("Station")) occupations = list() var/list/all_jobs = subtypesof(/datum/job) @@ -284,7 +284,7 @@ SUBSYSTEM_DEF(jobs) //Get the players who are ready for(var/mob/new_player/player in GLOB.player_list) - if(player.ready && player.mind && !player.mind.assigned_role) + if(player.ready && player.has_valid_preferences() && player.mind && !player.mind.assigned_role) unassigned += player if(player.client.prefs.randomslot) player.client.prefs.load_random_character_slot(player.client) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 4f583abdfed..e344c2b2029 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -228,7 +228,7 @@ // Assemble a list of active players without jobbans. for(var/mob/new_player/player in GLOB.player_list) - if(player.client && player.ready) + if(player.client && player.ready && player.has_valid_preferences()) if(!jobban_isbanned(player, "Syndicate") && !jobban_isbanned(player, roletext)) if(player_old_enough_antag(player.client,role)) players += player diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm index 75e0f549a1d..9c310fc29ee 100644 --- a/code/modules/client/preference/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -81,7 +81,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts var/lastchangelog = "" //Saved changlog filesize to detect if there was a change var/exp var/ooccolor = "#b82e00" - var/be_special = list() //Special role selection + var/list/be_special = list() //Special role selection var/UI_style = "Midnight" var/nanoui_fancy = TRUE var/toggles = TOGGLES_DEFAULT @@ -2280,3 +2280,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts /datum/preferences/proc/close_load_dialog(mob/user) user << browse(null, "window=saves") + +//Check if the user has ANY job selected. +/datum/preferences/proc/check_any_job() + return(job_support_high || job_support_med || job_support_low || job_medsci_high || job_medsci_med || job_medsci_low || job_engsec_high || job_engsec_med || job_engsec_low || job_karma_high || job_karma_med || job_karma_low) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index beb474539f1..38f980afdac 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -641,5 +641,26 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) // Cast to 1/0 return !!(client.prefs.toggles & toggleflag) +// Used to make sure that a player has a valid job preference setup, used to knock players out of eligibility for anything if their prefs don't make sense. +// A "valid job preference setup" in this situation means at least having one job set to low, or not having "return to lobby" enabled +// Prevents "antag rolling" by setting antag prefs on, all jobs to never, and "return to lobby if preferences not availible" +// Doing so would previously allow you to roll for antag, then send you back to lobby if you didn't get an antag role +// This also does some admin notification and logging as well +/mob/proc/has_valid_preferences() + if(!client) + return FALSE //Not sure how this would get run without the mob having a client, but let's just be safe. + if(client.prefs.alternate_option != RETURN_TO_LOBBY) + return TRUE + // If they have antags enabled, they're potentially doing this on purpose instead of by accident. Notify admins if so. + var/has_antags = FALSE + if(client.prefs.be_special.len > 0) + has_antags = TRUE + if(!client.prefs.check_any_job()) + to_chat(src, "You have no jobs enabled, along with return to lobby if job is unavailable. This makes you ineligible for any round start role, please update your job preferences.") + if(has_antags) + log_admin("[src.ckey] just got booted back to lobby with no jobs, but antags enabled.") + message_admins("[src.ckey] just got booted back to lobby with no jobs enabled, but antag rolling enabled. Likely antag rolling abuse.") + return FALSE //This is the only case someone should actually be completely blocked from antag rolling as well + return TRUE #define isterrorspider(A) (istype((A), /mob/living/simple_animal/hostile/poison/terror_spider))