From 2688d24510a685f66df971c0b8f78d921884152a Mon Sep 17 00:00:00 2001 From: CHOMPStation2StaffMirrorBot <94713762+CHOMPStation2StaffMirrorBot@users.noreply.github.com> Date: Sun, 6 Apr 2025 07:34:14 -0700 Subject: [PATCH] [MIRROR] Various Mail fixes (#10592) Co-authored-by: Guti <32563288+TheCaramelion@users.noreply.github.com> --- code/controllers/subsystems/mail.dm | 4 +-- code/game/jobs/job/job_goodies.dm | 22 ++++++------ code/game/objects/mail.dm | 53 +++++++++++++++++------------ 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/code/controllers/subsystems/mail.dm b/code/controllers/subsystems/mail.dm index 874319a427..40a9ace721 100644 --- a/code/controllers/subsystems/mail.dm +++ b/code/controllers/subsystems/mail.dm @@ -24,7 +24,7 @@ SUBSYSTEM_DEF(mail) // Collect recipients var/list/mail_recipients = list() for(var/mob/living/carbon/human/player_human in player_list) - if(player_human.stat != DEAD && player_human.client && player_human.client.inactivity <= 10 MINUTES && player_human.job != JOB_OUTSIDER && player_human.job != JOB_ANOMALY && player_human.job != JOB_VR && !player_is_antag(player_human.mind)) // Only alive, active and NT employeers should be getting mail. + if(player_human.stat != DEAD && player_human.client && player_human.client.inactivity <= 10 MINUTES && player_human.job != JOB_OUTSIDER && player_human.job != JOB_ANOMALY && player_human.job != JOB_VR && !player_is_antag(player_human.mind) && !isbelly(player_human.loc)) // Only alive, active and NT employeers should be getting mail. mail_recipients += player_human // Creates mail for all the mail waiting to arrive, if there's nobody to receive it, it will be a chance of junk mail. @@ -39,7 +39,7 @@ SUBSYSTEM_DEF(mail) var/mob/living/carbon/human/mail_to if(mail_recipients.len) mail_to = pick(mail_recipients) - new_mail.initialize_for_recipient(mail_to) + new_mail.initialize_for_recipient(mail_to.mind) mail_recipients -= mail_to else new_mail.junk_mail() diff --git a/code/game/jobs/job/job_goodies.dm b/code/game/jobs/job/job_goodies.dm index 3415162f1c..f4512d39fc 100644 --- a/code/game/jobs/job/job_goodies.dm +++ b/code/game/jobs/job/job_goodies.dm @@ -371,12 +371,11 @@ /obj/item/stack/material/steel{amount = 10} = 235, /obj/item/stack/material/lead{amount = 10} = 235, /obj/item/stack/material/glass/reinforced{amount = 10} = 235, - /obj/item/rcd_ammo = 155, + /obj/item/rcd_ammo = 165, /obj/item/stack/material/plasteel{amount = 10} = 100, - /obj/item/tool/screwdriver/power = 10, - /obj/item/tool/wirecutters/power = 10, + /obj/item/tool/transforming/jawsoflife = 10, + /obj/item/tool/transforming/powerdrill = 10, /obj/item/weldingtool/experimental = 10, - /obj/item/tool/wrench/power = 10, ) mail_color = COMMS_COLOR_ENGINEER @@ -384,12 +383,11 @@ mail_goodies = list( /obj/item/storage/box/lights/mixed = 250, /obj/item/stack/cable_coil = 250, - /obj/item/clothing/gloves/yellow = 200, + /obj/item/clothing/gloves/yellow = 210, /obj/item/stack/cable_coil/heavyduty = 210, - /obj/item/tool/screwdriver/power = 10, - /obj/item/tool/wirecutters/power = 10, + /obj/item/tool/transforming/jawsoflife = 10, + /obj/item/tool/transforming/powerdrill = 10, /obj/item/weldingtool/experimental = 10, - /obj/item/tool/wrench/power = 10, ) /datum/job/atmos @@ -398,8 +396,8 @@ /obj/item/analyzer = 300, /obj/item/holosign_creator/combifan = 230, /obj/item/pipe_dispenser = 130, - /obj/item/tool/screwdriver/power = 10, - /obj/item/tool/wirecutters/power = 10, + /obj/item/tool/transforming/jawsoflife = 10, + /obj/item/tool/transforming/powerdrill = 10, /obj/item/weldingtool/experimental = 10, ) mail_color = COMMS_COLOR_ENGINEER @@ -632,8 +630,8 @@ /obj/item/kit/paint/ripley/flames_red = 30, /obj/item/kit/paint/gygax/recitence = 25, /obj/item/kit/paint/ripley/flames_blue = 25, - /obj/item/tool/screwdriver/power = 10, - /obj/item/tool/wirecutters/power = 10, + /obj/item/tool/transforming/jawsoflife = 10, + /obj/item/tool/transforming/powerdrill = 10, /obj/item/weldingtool/experimental = 10, ) mail_color = COMMS_COLOR_SCIENCE diff --git a/code/game/objects/mail.dm b/code/game/objects/mail.dm index 9e4d451e2f..60559f1b4f 100644 --- a/code/game/objects/mail.dm +++ b/code/game/objects/mail.dm @@ -11,7 +11,7 @@ // Destination tagging for the mail sorter. var/sortTag = 0 // Who this mail is for and who can open it. - var/datum/weakref/recipient + var/datum/weakref/recipient_ref // How many goodies this mail contains. var/goodie_count = 1 // Goodies which can be given to anyone. @@ -103,14 +103,15 @@ /obj/item/mail/proc/setRecipient(mob/user) var/list/recipients = list() + var/mob/living/recipient_mob for(var/mob/living/player in player_list) if(!player_is_antag(player.mind) && player.mind.show_in_directory) recipients += player - recipients = tgui_input_list(usr, "Choose recipient", "Recipients", recipients, recipients) + recipient_mob = tgui_input_list(usr, "Choose recipient", "Recipients", recipients, recipients) - if(recipients) - initialize_for_recipient(recipients, preset_goodies = TRUE) + if(recipient_mob) + initialize_for_recipient(recipient_mob.mind, preset_goodies = TRUE) return TRUE /obj/item/mail/blank/AltClick(mob/user) @@ -192,9 +193,11 @@ return after_unwrap(user) /obj/item/mail/proc/unwrap(mob/user) - if(recipient && user != recipient) - to_chat(user, span_danger("You can't open somebody's mail! That's illegal")) - return FALSE + if(recipient_ref) + var/datum/mind/recipient = recipient_ref.resolve() + if(recipient && recipient.current.dna.unique_enzymes != user.dna.unique_enzymes) + to_chat(user, span_danger("You can't open somebody's mail! That's illegal")) + return FALSE if(opening) to_chat(user, span_danger("You are already opening that!")) @@ -216,20 +219,20 @@ playsound(loc, 'sound/items/poster_ripped.ogg', 100, TRUE) qdel(src) -/obj/item/mail/proc/initialize_for_recipient(mob/new_recipient, var/preset_goodies = FALSE) - recipient = new_recipient - var/current_title = new_recipient.mind.role_alt_title ? new_recipient.mind.role_alt_title : new_recipient.mind.assigned_role - name = "[initial(name)] for [new_recipient.real_name] ([current_title])" +/obj/item/mail/proc/initialize_for_recipient(var/datum/mind/recipient, var/preset_goodies = FALSE) + var/current_title = recipient.role_alt_title ? recipient.role_alt_title : recipient.assigned_role + name = "[initial(name)] for [recipient.name] ([current_title])" + recipient_ref = WEAKREF(recipient) - var/datum/job/this_job = SSjob.name_occupations[new_recipient.job] + var/datum/job/this_job = SSjob.name_occupations[recipient.assigned_role] var/list/goodies = generic_goodies if(this_job) colored_envelope = this_job.get_mail_color() if(!preset_goodies) - var/list/job_goodies = this_job.get_mail_goodies(new_recipient, current_title) + var/list/job_goodies = this_job.get_mail_goodies(recipient.current, current_title) if(LAZYLEN(job_goodies)) - if(this_job.get_mail_goodies()) + if(this_job.get_mail_goodies(recipient.current, current_title)) goodies = job_goodies else goodies += job_goodies @@ -238,7 +241,7 @@ for(var/iterator in 1 to goodie_count) var/target_good = pickweight(goodies) var/atom/movable/target_atom = new target_good(src) - log_game("[key_name(new_recipient)] received [target_atom.name] in the mail ([target_good])") + log_game("[key_name(recipient)] received [target_atom.name] in the mail ([target_good])") update_icon() return TRUE @@ -259,6 +262,7 @@ var/list/types = typesof(/atom) var/list/matches = new() var/list/recipients = list() + var/datum/mind/recipient_mind for(var/path in types) if(findtext("[path]", object)) @@ -277,9 +281,11 @@ for(var/mob/living/player in player_list) recipients += player - recipients = tgui_input_list(usr, "Choose recipient", "Recipients", recipients, recipients) + var/mob/living/chosen_player = tgui_input_list(usr, "Choose recipient", "Recipients", recipients, recipients) - if(!recipients) + recipient_mind = chosen_player.mind + + if(!recipient_mind) return var/shuttle_spawn = tgui_alert(usr, "Spawn mail at location or in the shuttle?", "Spawn mail", list("Location", "Shuttle")) @@ -287,13 +293,13 @@ return if(shuttle_spawn == "Shuttle") var/obj/item/mail/new_mail = new - new_mail.initialize_for_recipient(recipients, TRUE) + new_mail.initialize_for_recipient(recipient_mind, TRUE) new chosen(new_mail) SSmail.admin_mail += new_mail log_and_message_admins("spawned [chosen] inside an envelope at the shuttle") else var/obj/item/mail/ground_mail = new /obj/item/mail(usr.loc) - ground_mail.initialize_for_recipient(recipients, TRUE) + ground_mail.initialize_for_recipient(recipient_mind, TRUE) new chosen(ground_mail) log_and_message_admins("spawned [chosen] inside an envelope at ([usr.x],[usr.y],[usr.z])") @@ -320,7 +326,7 @@ new_mail = new /obj/item/mail/envelope(src) var/mob/living/carbon/human/mail_to if(mail_to) - new_mail.initialize_for_recipient(mail_to) + new_mail.initialize_for_recipient(mail_to.mind) mail_recipients -= mail_to else new_mail.junk_mail() @@ -387,7 +393,12 @@ playsound(loc, 'sound/items/mail/maildenied.ogg', 50, TRUE) return - var/mob/living/recipient = saved.recipient + var/mob/living/recipient + if(saved.recipient_ref) + recipient = saved.recipient_ref.resolve() + + if(isnull(recipient)) + return if(M.stat == DEAD) to_chat(user, span_warning("Consent Verification failed: You can't deliver mail to a corpse!"))