From 364766fae4ef15d8b94dbb8c4c355e6fb18fe7e5 Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 19 Apr 2019 05:11:56 +1000 Subject: [PATCH 1/4] Adds generation of onduty jobs for timeclock --- code/game/machinery/computer/timeclock_vr.dm | 34 ++++++++++++++++++-- nano/templates/timeclock_vr.tmpl | 13 +++----- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index caeecb2e27b..65b3a5af67f 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -85,8 +85,8 @@ "timeoff_factor" = job.timeoff_factor ) // TODO - Once job changing is implemented, we will want to list jobs to change into. - // if(job && job.timeoff_factor < 0) // Currently are Off Duty, so gotta lookup what on-duty jobs are open - // data["job_choices"] = getOpenOnDutyJobs(user, job.department) + if(job && job.timeoff_factor < 0) // Currently are Off Duty, so gotta lookup what on-duty jobs are open + data["job_choices"] = getOpenOnDutyJobs(user, job.department) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -101,7 +101,7 @@ src.add_fingerprint(usr) if (href_list["id"]) - if (card) + if(card) usr.put_in_hands(card) card = null else @@ -110,8 +110,27 @@ I.forceMove(src) card = I update_icon() + return + if(href_list["switch-to-onduty"]) + if(card) + makeOnDuty(href_list["switch-to-onduty"]) + usr.put_in_hands(card) return 1 // Return 1 to update UI +/obj/machinery/computer/timeclock/proc/getOpenOnDutyJobs(var/mob/user, var/department) + var/list/available_jobs = list() + for(var/datum/job/job in job_master.occupations) + if(job && job.is_position_available() && !job.whitelist_only) // && job.player_old_enough(user.client) && !jobban_isbanned(user,job.title) + if(job.department == department && !job.head_position && job.timeoff_factor > 0 && !(job.title == "Internal Affairs Agent")) + available_jobs += job.title + if(job.alt_titles) + for(var/alt_job in job.alt_titles) + available_jobs += alt_job + return available_jobs + +/obj/machinery/computer/timeclock/proc/makeOnDuty(var/newjob) + return + // // Frame type for construction // @@ -145,3 +164,12 @@ /obj/machinery/computer/timeclock/premade/west dir = 4 pixel_x = -26 + +/mob/verb/gain_pto() + set name = "Gain PTO" + set category = "Debug" + + if(!client) + return FALSE + else + client.department_hours += list("Security" = 30) diff --git a/nano/templates/timeclock_vr.tmpl b/nano/templates/timeclock_vr.tmpl index 0ca409a1d2a..9add5f6c918 100644 --- a/nano/templates/timeclock_vr.tmpl +++ b/nano/templates/timeclock_vr.tmpl @@ -56,24 +56,21 @@ {{/if}} -{{if data.allow_change_job && data.job_datum && data.job_datum.timeoff_factor != 0 }} +{{if data.job_datum && data.job_datum.timeoff_factor != 0 }}

Employment Actions

- {{if data.job_datum.head_position }} - - NT policy does not permit head positions to go off duty mid-shift. - {{else (data.job_datum.timeoff_factor > 0) }} + {{if (data.job_datum.timeoff_factor > 0) }} {{if helper.round(data.department_hours[data.job_datum.department]) > 0 }} - {{:helper.link('Go Off Duty', 'alert', {'switch-to-offduty': 1})}} + {{:helper.link('Go Off-Duty', 'alert', {'switch-to-offduty': 1})}} {{else}} Insufficent Time Off Accrued {{/if}} {{else (data.job_datum.timeoff_factor < 0) }} - {{for data.job_choices }} + {{props data.job_choices }}
{{:value}}
-
{{:helper.link("Issue Guest Pass", 'suitcase', {'guest-pass' : value})}}
+
{{:helper.link("Go On-Duty", 'suitcase', {'switch-to-onduty' : value})}}
{{empty}}
No Open Positions - See Head of Personnel
{{/for}} From 5f494a8470d2753c52b09f1ff8de1b81a8f0ae6d Mon Sep 17 00:00:00 2001 From: Heroman Date: Fri, 19 Apr 2019 07:50:53 +1000 Subject: [PATCH 2/4] Implements ability to move On-Duty --- code/game/machinery/computer/timeclock_vr.dm | 20 ++++++++++++++++++++ nano/templates/timeclock_vr.tmpl | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index 65b3a5af67f..59c30359733 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -18,6 +18,12 @@ clicksound = null var/obj/item/weapon/card/id/card // Inserted Id card + var/obj/item/device/radio/intercom/announce // Integreated announcer + + +/obj/machinery/computer/timeclock/New() + announce = new /obj/item/device/radio/intercom(src) + ..() /obj/machinery/computer/timeclock/Destroy() if(card) @@ -115,6 +121,7 @@ if(card) makeOnDuty(href_list["switch-to-onduty"]) usr.put_in_hands(card) + card = null return 1 // Return 1 to update UI /obj/machinery/computer/timeclock/proc/getOpenOnDutyJobs(var/mob/user, var/department) @@ -129,6 +136,19 @@ return available_jobs /obj/machinery/computer/timeclock/proc/makeOnDuty(var/newjob) + var/datum/job/foundjob = null + for(var/datum/job/job in job_master.occupations) + if(job.title == newjob || newjob in job.alt_titles) + foundjob = job + break + if(foundjob) + card.access = foundjob.get_access() + card.rank = foundjob.title + card.assignment = newjob + card.name = text("[card.registered_name]'s ID Card ([card.assignment])") + data_core.manifest_modify(card.registered_name, card.assignment) + callHook("reassign_employee", list(card)) + announce.autosay("[card.registered_name] has moved On-Duty as [card.assignment]", "Employee Oversight") return // diff --git a/nano/templates/timeclock_vr.tmpl b/nano/templates/timeclock_vr.tmpl index 9add5f6c918..fbd5ea3aab2 100644 --- a/nano/templates/timeclock_vr.tmpl +++ b/nano/templates/timeclock_vr.tmpl @@ -56,7 +56,7 @@ {{/if}}
-{{if data.job_datum && data.job_datum.timeoff_factor != 0 }} +{{if data.job_datum && data.job_datum.timeoff_factor != 0 && !(data.assignment == "Terminated")}}

Employment Actions

From 1a9cdecb32052b282beea074da49653429b2236f Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Fri, 19 Apr 2019 10:28:38 +1000 Subject: [PATCH 3/4] Finishes timeclock duty switching functionality --- code/controllers/configuration_vr.dm | 3 + code/game/machinery/computer/timeclock_vr.dm | 92 +++++++++++++++----- config/example/config.txt | 3 + nano/templates/timeclock_vr.tmpl | 4 +- 4 files changed, 80 insertions(+), 22 deletions(-) diff --git a/code/controllers/configuration_vr.dm b/code/controllers/configuration_vr.dm index 804fbc4ec8c..673cff74fc2 100644 --- a/code/controllers/configuration_vr.dm +++ b/code/controllers/configuration_vr.dm @@ -5,6 +5,7 @@ /datum/configuration var/list/engine_map // Comma separated list of engines to choose from. Blank means fully random. var/time_off = FALSE + var/pto_job_change = FALSE var/limit_interns = -1 //Unlimited by default var/limit_visitors = -1 //Unlimited by default var/pto_cap = 100 //Hours @@ -52,5 +53,7 @@ config.pto_cap = text2num(value) if ("time_off") config.time_off = TRUE + if ("pto_job_change") + config.pto_job_change = TRUE return 1 diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index 59c30359733..27b2d9112c9 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -90,9 +90,10 @@ "head_position" = job.head_position, "timeoff_factor" = job.timeoff_factor ) - // TODO - Once job changing is implemented, we will want to list jobs to change into. - if(job && job.timeoff_factor < 0) // Currently are Off Duty, so gotta lookup what on-duty jobs are open - data["job_choices"] = getOpenOnDutyJobs(user, job.department) + if(config.time_off && config.pto_job_change) + data["allow_change_job"] = TRUE + if(job && job.timeoff_factor < 0) // Currently are Off Duty, so gotta lookup what on-duty jobs are open + data["job_choices"] = getOpenOnDutyJobs(user, job.department) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -116,18 +117,29 @@ I.forceMove(src) card = I update_icon() - return + return 1 if(href_list["switch-to-onduty"]) if(card) - makeOnDuty(href_list["switch-to-onduty"]) - usr.put_in_hands(card) - card = null + if(checkCardCooldown()) + makeOnDuty(href_list["switch-to-onduty"]) + usr.put_in_hands(card) + card = null + update_icon() + return 1 + if(href_list["switch-to-offduty"]) + if(card) + if(checkCardCooldown()) + makeOffDuty() + usr.put_in_hands(card) + card = null + update_icon() + return 1 return 1 // Return 1 to update UI /obj/machinery/computer/timeclock/proc/getOpenOnDutyJobs(var/mob/user, var/department) var/list/available_jobs = list() for(var/datum/job/job in job_master.occupations) - if(job && job.is_position_available() && !job.whitelist_only) // && job.player_old_enough(user.client) && !jobban_isbanned(user,job.title) + if(job && job.is_position_available() && !job.whitelist_only && !jobban_isbanned(user,job.title) && job.player_old_enough(user.client)) if(job.department == department && !job.head_position && job.timeoff_factor > 0 && !(job.title == "Internal Affairs Agent")) available_jobs += job.title if(job.alt_titles) @@ -138,19 +150,68 @@ /obj/machinery/computer/timeclock/proc/makeOnDuty(var/newjob) var/datum/job/foundjob = null for(var/datum/job/job in job_master.occupations) - if(job.title == newjob || newjob in job.alt_titles) + if(newjob == job.title) foundjob = job break - if(foundjob) + if(newjob in job.alt_titles) + foundjob = job + break + if(foundjob && card) card.access = foundjob.get_access() card.rank = foundjob.title card.assignment = newjob card.name = text("[card.registered_name]'s ID Card ([card.assignment])") data_core.manifest_modify(card.registered_name, card.assignment) + card.last_job_switch = world.time callHook("reassign_employee", list(card)) - announce.autosay("[card.registered_name] has moved On-Duty as [card.assignment]", "Employee Oversight") + foundjob.current_positions++ + announce.autosay("[card.registered_name] has moved On-Duty as [card.assignment].", "Employee Oversight") return +/obj/machinery/computer/timeclock/proc/makeOffDuty() + var/datum/job/foundjob = null + for(var/datum/job/job in job_master.occupations) + if(card.rank == job.title) + foundjob = job + break + if(!foundjob) + return + var/real_dept = foundjob.department + if(real_dept && real_dept == "Command") + real_dept = "Civilian" + var/datum/job/ptojob = null + for(var/datum/job/job in job_master.occupations) + if(job.department == real_dept && job.timeoff_factor < 0) + ptojob = job + break + if(ptojob && card) + var/oldtitle = card.assignment + card.access = ptojob.get_access() + card.rank = ptojob.title + card.assignment = ptojob.title + card.name = text("[card.registered_name]'s ID Card ([card.assignment])") + data_core.manifest_modify(card.registered_name, card.assignment) + card.last_job_switch = world.time + callHook("reassign_employee", list(card)) + foundjob.current_positions-- + announce.autosay("[card.registered_name], [oldtitle], has moved Off-Duty.", "Employee Oversight") + return + +/obj/machinery/computer/timeclock/proc/checkCardCooldown() + if(!card) + return FALSE + if((world.time - card.last_job_switch) < 15 MINUTES) + to_chat(usr, "You need to wait at least 15 minutes after last duty switch.") + return FALSE + return TRUE + +/obj/item/weapon/card/id + var/last_job_switch + +/obj/item/weapon/card/id/New() + .=..() + last_job_switch = world.time + // // Frame type for construction // @@ -184,12 +245,3 @@ /obj/machinery/computer/timeclock/premade/west dir = 4 pixel_x = -26 - -/mob/verb/gain_pto() - set name = "Gain PTO" - set category = "Debug" - - if(!client) - return FALSE - else - client.department_hours += list("Security" = 30) diff --git a/config/example/config.txt b/config/example/config.txt index 535b0bc6a86..9de273bda29 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -407,6 +407,9 @@ ENGINE_MAP Supermatter Engine,Edison's Bane # Controls if the 'time off' system is used for determining if players can play 'Off-Duty' jobs (requires SQL) # TIME_OFF +# If 'time off' system is on, controls whether or not players can switch on/off duty midround using timeclocks +# PTO_JOB_CHANGE + # Applies a limit to the number of assistants and visitors respectively # LIMIT_INTERNS 6 # LIMIT_VISITORS 6 diff --git a/nano/templates/timeclock_vr.tmpl b/nano/templates/timeclock_vr.tmpl index fbd5ea3aab2..19cbffe33fa 100644 --- a/nano/templates/timeclock_vr.tmpl +++ b/nano/templates/timeclock_vr.tmpl @@ -56,12 +56,12 @@ {{/if}}
-{{if data.job_datum && data.job_datum.timeoff_factor != 0 && !(data.assignment == "Terminated")}} +{{if data.allow_change_job && data.job_datum && data.job_datum.timeoff_factor != 0 && !(data.assignment == "Terminated")}}

Employment Actions

{{if (data.job_datum.timeoff_factor > 0) }} - {{if helper.round(data.department_hours[data.job_datum.department]) > 0 }} + {{if helper.round(data.department_hours[data.job_datum.department]) > 0 || (data.job_datum.department == "Command" && helper.round(data.department_hours["Civilian"]) > 0)}} {{:helper.link('Go Off-Duty', 'alert', {'switch-to-offduty': 1})}} {{else}} From 33b1d7b5a834e71119687863d19b3c72cac758b6 Mon Sep 17 00:00:00 2001 From: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Date: Fri, 19 Apr 2019 12:58:30 +1000 Subject: [PATCH 4/4] Fixes potential exploit nobody would know about --- code/game/jobs/job/offduty_vr.dm | 2 +- code/game/machinery/computer/timeclock_vr.dm | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/jobs/job/offduty_vr.dm b/code/game/jobs/job/offduty_vr.dm index 420943c5621..d246c013d8c 100644 --- a/code/game/jobs/job/offduty_vr.dm +++ b/code/game/jobs/job/offduty_vr.dm @@ -3,7 +3,7 @@ // /datum/job/offduty_civilian - title = "Off-Duty Worker" + title = "Off-duty Worker" latejoin_only = TRUE timeoff_factor = -1 total_positions = -1 diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index 27b2d9112c9..64a42c98cb1 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -156,6 +156,8 @@ if(newjob in job.alt_titles) foundjob = job break + if(!newjob in getOpenOnDutyJobs(usr, job_master.GetJob(card.rank).department)) + return if(foundjob && card) card.access = foundjob.get_access() card.rank = foundjob.title @@ -244,4 +246,4 @@ /obj/machinery/computer/timeclock/premade/west dir = 4 - pixel_x = -26 + pixel_x = -26 \ No newline at end of file