From 03aa232235a733ebf667950461cba91725830815 Mon Sep 17 00:00:00 2001 From: morrowwolf <8919187+morrowwolf@users.noreply.github.com> Date: Thu, 28 Mar 2024 13:37:20 -0400 Subject: [PATCH] Prime Priority Rolls for Discord Linked Players (#163) --- code/datums/entities/player.dm | 20 ++++++ .../game/jobs/job/command/cic/staffofficer.dm | 1 + code/game/jobs/job/job.dm | 3 + code/game/jobs/job/marine/squad/leader.dm | 1 + code/game/jobs/role_authority.dm | 68 +++++++++++-------- code/modules/client/preferences.dm | 20 +++++- code/modules/client/preferences_savefile.dm | 18 ++++- .../mob/new_player/preferences_setup.dm | 14 ++-- 8 files changed, 108 insertions(+), 37 deletions(-) diff --git a/code/datums/entities/player.dm b/code/datums/entities/player.dm index 00c76d7b95..ddb52cb8d0 100644 --- a/code/datums/entities/player.dm +++ b/code/datums/entities/player.dm @@ -469,6 +469,7 @@ BSQL_PROTECT_DATUM(/datum/entity/player) set waitfor=0 WAIT_DB_READY load_player_data_info(get_player_from_key(ckey)) + check_discord_link() /client/proc/load_player_data_info(datum/entity/player/player) if(ckey != player.ckey) @@ -482,6 +483,25 @@ BSQL_PROTECT_DATUM(/datum/entity/player) record_login_triplet(player.ckey, address, computer_id) player_data.sync() +/client/proc/check_discord_link() + var/datum/view_record/discord_link/current_link = locate() in DB_VIEW(/datum/view_record/discord_link, DB_COMP("player_id", DB_EQUALS, player_data.id)) + + if(!current_link) + + if(player_data.discord_link_id != null) + player_data.discord_link_id = null + player_data.save() + player_data.sync() + + return + + if(player_data.discord_link_id == current_link.id) + return + + player_data.discord_link_id = current_link.id + player_data.save() + player_data.sync() + /datum/entity/player/proc/check_ban(computer_id, address, is_telemetry) . = list() diff --git a/code/game/jobs/job/command/cic/staffofficer.dm b/code/game/jobs/job/command/cic/staffofficer.dm index 0a243a99b8..8e4e7c0cfa 100644 --- a/code/game/jobs/job/command/cic/staffofficer.dm +++ b/code/game/jobs/job/command/cic/staffofficer.dm @@ -52,6 +52,7 @@ AddTimelock(/datum/job/command/bridge, list( /datum/job/command/bridge/ai total_positions = 1 spawn_positions = 1 + prime_priority = TRUE /datum/job/command/bridge/ai/set_spawn_positions(count) return spawn_positions diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 34671be60f..103c826ce5 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -41,6 +41,9 @@ /// If TRUE, this job will spawn w/ a cryo emergency kit during evac/red alert var/gets_emergency_kit = TRUE + /// Whether or not linking your discord account can let you get prime priority for this role + var/prime_priority = FALSE + /datum/job/New() . = ..() diff --git a/code/game/jobs/job/marine/squad/leader.dm b/code/game/jobs/job/marine/squad/leader.dm index 8e1122b166..ebb0cd25a9 100644 --- a/code/game/jobs/job/marine/squad/leader.dm +++ b/code/game/jobs/job/marine/squad/leader.dm @@ -53,6 +53,7 @@ AddTimelock(/datum/job/marine/leader, list( /datum/job/marine/leader/ai total_positions = 1 spawn_positions = 1 + prime_priority = TRUE /datum/job/marine/leader/ai/upp title = JOB_SQUAD_LEADER_UPP diff --git a/code/game/jobs/role_authority.dm b/code/game/jobs/role_authority.dm index a50e25ae9e..42ffc22570 100644 --- a/code/game/jobs/role_authority.dm +++ b/code/game/jobs/role_authority.dm @@ -18,9 +18,10 @@ var/global/datum/authority/branch/role/RoleAuthority #define RETURN_TO_LOBBY 2 #define NEVER_PRIORITY 0 -#define HIGH_PRIORITY 1 -#define MED_PRIORITY 2 -#define LOW_PRIORITY 3 +#define PRIME_PRIORITY 1 +#define HIGH_PRIORITY 2 +#define MED_PRIORITY 3 +#define LOW_PRIORITY 4 #define SHIPSIDE_ROLE_WEIGHT 0.25 @@ -245,37 +246,19 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou if(!length(roles_to_assign) || !length(unassigned_players)) return + log_debug("ASSIGNMENT: Starting prime priority assignments.") + for(var/mob/new_player/cycled_unassigned in shuffle(unassigned_players)) + assign_role_to_player_by_priority(cycled_unassigned, roles_to_assign, unassigned_players, PRIME_PRIORITY) + + log_debug("ASSIGNMENT: Starting regular priority assignments.") for(var/mob/new_player/cycled_unassigned in shuffle(unassigned_players)) var/player_assigned_job = FALSE - log_debug("ASSIGNMENT: We have started assigning for [cycled_unassigned].") for(var/priority in HIGH_PRIORITY to LOW_PRIORITY) - var/wanted_jobs_by_name = shuffle(cycled_unassigned.client?.prefs?.get_jobs_by_priority(priority)) - log_debug("ASSIGNMENT: We have started cycled through priority [priority] for [cycled_unassigned].") - - for(var/job_name in wanted_jobs_by_name) - log_debug("ASSIGNMENT: We are cycling through wanted jobs and are at [job_name] for [cycled_unassigned].") - if(job_name in roles_to_assign) - log_debug("ASSIGNMENT: We have found [job_name] in roles to assign for [cycled_unassigned].") - var/datum/job/actual_job = roles_to_assign[job_name] - - if(assign_role(cycled_unassigned, actual_job)) - log_debug("ASSIGNMENT: We have assigned [job_name] to [cycled_unassigned].") - unassigned_players -= cycled_unassigned - - if(actual_job.spawn_positions != -1 && actual_job.current_positions >= actual_job.spawn_positions) - roles_to_assign -= job_name - log_debug("ASSIGNMENT: We have ran out of slots for [job_name] and it has been removed from roles to assign.") - - player_assigned_job = TRUE - break - + player_assigned_job = assign_role_to_player_by_priority(cycled_unassigned, roles_to_assign, unassigned_players, priority) if(player_assigned_job) - log_debug("ASSIGNMENT: [cycled_unassigned] has been assigned a job and we are breaking.") break - log_debug("ASSIGNMENT: [cycled_unassigned] did not get a job at priority [priority], moving to next priority level.") - if(!length(roles_to_assign)) log_debug("ASSIGNMENT: No more roles to assign, breaking.") break @@ -321,10 +304,39 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou log_debug("ASSIGNMENT: [cycled_unassigned] has opted for return to lobby alternate option.") cycled_unassigned.ready = 0 - log_debug("ASSIGNMENT: Assigning complete. Players unassigned: [length(unassigned_players)] Jobs unassigned: [length(roles_to_assign)]") + log_debug("ASSIGNMENT: Assignment complete. Players unassigned: [length(unassigned_players)] Jobs unassigned: [length(roles_to_assign)]") return roles_to_assign +/datum/authority/branch/role/proc/assign_role_to_player_by_priority(mob/new_player/cycled_unassigned, list/roles_to_assign, list/unassigned_players, priority) + log_debug("ASSIGNMENT: We have started cycled through priority [priority] for [cycled_unassigned].") + var/wanted_jobs_by_name = shuffle(cycled_unassigned.client?.prefs?.get_jobs_by_priority(priority)) + var/player_assigned_job = FALSE + + for(var/job_name in wanted_jobs_by_name) + log_debug("ASSIGNMENT: We are cycling through wanted jobs and are at [job_name] for [cycled_unassigned].") + if(job_name in roles_to_assign) + log_debug("ASSIGNMENT: We have found [job_name] in roles to assign for [cycled_unassigned].") + var/datum/job/actual_job = roles_to_assign[job_name] + + if(assign_role(cycled_unassigned, actual_job)) + log_debug("ASSIGNMENT: We have assigned [job_name] to [cycled_unassigned].") + unassigned_players -= cycled_unassigned + + if(actual_job.spawn_positions != -1 && actual_job.current_positions >= actual_job.spawn_positions) + roles_to_assign -= job_name + log_debug("ASSIGNMENT: We have ran out of slots for [job_name] and it has been removed from roles to assign.") + + player_assigned_job = TRUE + break + + if(player_assigned_job) + log_debug("ASSIGNMENT: [cycled_unassigned] has been assigned a job.") + return player_assigned_job + + log_debug("ASSIGNMENT: [cycled_unassigned] did not get a job at priority [priority].") + return player_assigned_job + /** * Calculate role balance weight for one person joining as that role. This weight is used * when calculating the number of xenos both roundstart and burrowed larva they get for diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 16b88e6293..262ae11219 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -648,10 +648,14 @@ var/const/MAX_SAVE_SLOTS = 10 //splitJobs - Allows you split the table by job. You can make different tables for each department by including their heads. Defaults to CE to make it look nice. //width - Screen' width. //height - Screen's height. -/datum/preferences/proc/SetChoices(mob/user, limit = 19, list/splitJobs = list(JOB_CHIEF_REQUISITION), width = 450, height = 450) +/datum/preferences/proc/SetChoices(mob/user, limit = 19, list/splitJobs = list(JOB_CHIEF_REQUISITION), width = 480, height = 450) if(!RoleAuthority) return + var/host_bypass = FALSE + if(user.client?.admin_holder?.check_for_rights(R_HOST)) + host_bypass = TRUE + var/HTML = "
" HTML += "" + HTML += " | ||
"
if(jobban_isbanned(user, job.title))
HTML += " | BANNED |