Blank Mail Envelopes (#8621)

This commit is contained in:
Guti
2024-07-18 07:53:11 +02:00
committed by GitHub
parent c3b129f1a3
commit 869b327c73
7 changed files with 185 additions and 12 deletions

View File

@@ -7,6 +7,7 @@ SUBSYSTEM_DEF(mail)
var/mail_waiting = 0 // Pending mail var/mail_waiting = 0 // Pending mail
var/mail_per_process = 0.45 // Mail to be generated var/mail_per_process = 0.45 // Mail to be generated
var/admin_mail = list() // Mail added by Spawn Mail
/datum/controller/subsystem/mail/fire() /datum/controller/subsystem/mail/fire()
mail_waiting += mail_per_process mail_waiting += mail_per_process
@@ -42,5 +43,10 @@ SUBSYSTEM_DEF(mail)
mail_recipients -= mail_to mail_recipients -= mail_to
else else
new_mail.junk_mail() new_mail.junk_mail()
// Admin mail
if(admin_mail)
for(var/obj/item/mail/ad_mail in admin_mail)
ad_mail.loc = mailcrate
clearlist(admin_mail)
mail_waiting = 0 mail_waiting = 0
return mailcrate return mailcrate

View File

@@ -44,6 +44,11 @@
var/stamp_offset_y = 2 var/stamp_offset_y = 2
var/opening = FALSE var/opening = FALSE
/obj/item/mail/container_resist(mob/living/M)
if(istype(M, /mob/living/voice)) return
M.forceMove(get_turf(src))
to_chat(M, span_warning("You climb out of \the [src]."))
/obj/item/mail/envelope /obj/item/mail/envelope
name = "envelope" name = "envelope"
icon_state = "mail_large" icon_state = "mail_large"
@@ -62,6 +67,76 @@
for(var/i = 1, i <= stamp_count, i++) for(var/i = 1, i <= stamp_count, i++)
stamps += list("stamp_[rand(2, 8)]") stamps += list("stamp_[rand(2, 8)]")
/obj/item/mail/blank
desc = "A blank envelope."
description_info = "An object can be placed into the envelope, click on it with an empty hand to seal it. Alt-Click to retrieve the items from inside before sealing."
stamped = FALSE
postmarked = FALSE
var/set_recipient = FALSE
var/set_content = FALSE
var/sealed = FALSE
var/list/mail_recipients = list()
/obj/item/mail/blank/attackby(obj/item/W, mob/user)
..()
if(istype(W, /obj/item/weapon/pen) && sealed && !set_recipient)
if(setRecipient(user))
set_recipient = TRUE
add_fingerprint(user)
return
if(!set_content && !sealed)
if(!do_after(user, 1.5 SECONDS, target = user))
set_content = FALSE
user.drop_item()
W.forceMove(src)
balloon_alert(user, "Placed the [W] into the [src]")
set_content = TRUE
description_info = "Click with an empty hand to seal it, or Alt-Click to retrieve the object out."
return
return
/obj/item/mail/proc/setRecipient(mob/user)
var/list/recipients = list()
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)
if(recipients)
initialize_for_recipient(recipients, preset_goodies = TRUE)
return TRUE
/obj/item/mail/blank/AltClick(mob/user)
if(sealed)
return
for(var/obj/stuff as anything in contents)
if(isitem(stuff))
user.put_in_hands(stuff)
else
stuff.forceMove(drop_location())
set_content = FALSE
description_info = initial(description_info)
/obj/item/mail/blank/ShiftClick(mob/user)
..()
if(!sealed)
var/sender = tgui_input_text(user, "Write name", "Name", user.name)
if(sender)
desc = "A signed envelope, from [sender]."
/obj/item/mail/blank/attack_self(mob/user)
if(!sealed)
balloon_alert(user, "Sealing the envelope...")
if(!do_after(user, 1.5 SECONDS, target = user))
sealed = FALSE
sealed = TRUE
description_info = "Shift Click to add the sender's name to the envelope, or attack with a pen to set a receiver."
return
. = ..()
/obj/item/mail/update_icon() /obj/item/mail/update_icon()
. = ..() . = ..()
var/bonus_stamp_offset = 0 var/bonus_stamp_offset = 0
@@ -132,7 +207,7 @@
playsound(loc, 'sound/items/poster_ripped.ogg', 100, TRUE) playsound(loc, 'sound/items/poster_ripped.ogg', 100, TRUE)
qdel(src) qdel(src)
/obj/item/mail/proc/initialize_for_recipient(mob/new_recipient) /obj/item/mail/proc/initialize_for_recipient(mob/new_recipient, var/preset_goodies = FALSE)
recipient = new_recipient recipient = new_recipient
var/current_title = new_recipient.mind.role_alt_title ? new_recipient.mind.role_alt_title : new_recipient.mind.assigned_role 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])" name = "[initial(name)] for [new_recipient.real_name] ([current_title])"
@@ -144,6 +219,7 @@
var/image/envelope = image(icon, icon_state) var/image/envelope = image(icon, icon_state)
envelope.color = this_job.get_mail_color() envelope.color = this_job.get_mail_color()
add_overlay(envelope) add_overlay(envelope)
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(new_recipient, current_title)
if(LAZYLEN(job_goodies)) if(LAZYLEN(job_goodies))
if(this_job.exclusive_mail_goodies) if(this_job.exclusive_mail_goodies)
@@ -151,10 +227,12 @@
else else
goodies += job_goodies goodies += job_goodies
if(!preset_goodies)
for(var/iterator in 1 to goodie_count) for(var/iterator in 1 to goodie_count)
var/target_good = pickweight(goodies) var/target_good = pickweight(goodies)
var/atom/movable/target_atom = new target_good(src) 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(new_recipient)] received [target_atom.name] in the mail ([target_good])")
update_icon() update_icon()
return TRUE return TRUE
@@ -163,6 +241,54 @@
if(!hasmob) if(!hasmob)
disposal_holder.destinationTag = sortTag disposal_holder.destinationTag = sortTag
// Mail spawn for events
/datum/admins/proc/spawn_mail(var/object as text)
set name = "Spawn Mail"
set category = "Fun.Event Kit"
set desc = "Spawn mail for a specific player, with a specific item."
if(!check_rights(R_SPAWN)) return
var/obj/item/mail/new_mail = new
var/list/types = typesof(/atom)
var/list/matches = new()
var/list/recipients = list()
for(var/path in types)
if(findtext("[path]", object))
matches += path
if(matches.len==0)
return
var/chosen
if(matches.len==1)
chosen = matches[1]
else
chosen = tgui_input_list(usr, "Select an atom type", "Spawn Atom in Mail", matches)
if(!chosen)
return
for(var/mob/living/player in player_list)
recipients += player
recipients = tgui_input_list(usr, "Choose recipient", "Recipients", recipients, recipients)
if(recipients)
new_mail.initialize_for_recipient(recipients, TRUE)
new chosen(new_mail)
var/shuttle_spawn = tgui_alert(usr, "Spawn mail at location or in the shuttle?", "Spawn mail", list("Location", "Shuttle"))
if(shuttle_spawn == "Shuttle")
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)
new chosen(ground_mail)
log_and_message_admins("spawned [chosen] inside an envelope at ([usr.x],[usr.y],[usr.z])")
feedback_add_details("admin_verb","SE")
// Mail Crate // Mail Crate
/obj/structure/closet/crate/mail /obj/structure/closet/crate/mail
name = "mail crate" name = "mail crate"

View File

@@ -189,6 +189,7 @@ var/list/admin_verbs_spawn = list(
/datum/admins/proc/check_custom_items, /datum/admins/proc/check_custom_items,
/datum/admins/proc/spawn_plant, /datum/admins/proc/spawn_plant,
/datum/admins/proc/spawn_atom, //allows us to spawn instances, /datum/admins/proc/spawn_atom, //allows us to spawn instances,
/datum/admins/proc/spawn_mail, // CHOMPStation Add
/client/proc/cmd_admin_droppod_spawn, /client/proc/cmd_admin_droppod_spawn,
/client/proc/respawn_character, /client/proc/respawn_character,
/client/proc/spawn_character_mob, //VOREStation Add, /client/proc/spawn_character_mob, //VOREStation Add,

View File

@@ -1786,6 +1786,21 @@
dir = 4 dir = 4
}, },
/obj/structure/closet/crate/mail, /obj/structure/closet/crate/mail,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/turf/simulated/floor/tiled, /turf/simulated/floor/tiled,
/area/quartermaster/delivery) /area/quartermaster/delivery)
"ahk" = ( "ahk" = (
@@ -32239,6 +32254,7 @@
pixel_x = -5; pixel_x = -5;
pixel_y = -5 pixel_y = -5
}, },
/obj/item/mail/blank,
/turf/simulated/floor/tiled, /turf/simulated/floor/tiled,
/area/quartermaster/delivery) /area/quartermaster/delivery)
"vbP" = ( "vbP" = (

View File

@@ -24599,6 +24599,8 @@
/obj/effect/floor_decal/corner/brown/border{ /obj/effect/floor_decal/corner/brown/border{
dir = 9 dir = 9
}, },
/obj/item/mail/blank,
/obj/item/mail/blank,
/turf/simulated/floor/tiled, /turf/simulated/floor/tiled,
/area/quartermaster/office) /area/quartermaster/office)
"bxA" = ( "bxA" = (
@@ -26628,6 +26630,7 @@
/obj/effect/floor_decal/corner/brown/border{ /obj/effect/floor_decal/corner/brown/border{
dir = 8 dir = 8
}, },
/obj/item/mail/blank,
/turf/simulated/floor/tiled, /turf/simulated/floor/tiled,
/area/quartermaster/office) /area/quartermaster/office)
"bCU" = ( "bCU" = (
@@ -55322,6 +55325,11 @@
/obj/machinery/light{ /obj/machinery/light{
dir = 8 dir = 8
}, },
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/turf/simulated/floor/wood/alt/parquet, /turf/simulated/floor/wood/alt/parquet,
/area/library) /area/library)
"iQe" = ( "iQe" = (
@@ -61001,6 +61009,9 @@
pixel_y = 5 pixel_y = 5
}, },
/obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment,
/obj/item/mail/blank,
/obj/item/mail/blank,
/obj/item/mail/blank,
/turf/simulated/floor/carpet, /turf/simulated/floor/carpet,
/area/hallway/secondary/entry/docking_lounge) /area/hallway/secondary/entry/docking_lounge)
"lVD" = ( "lVD" = (

View File

@@ -0,0 +1,12 @@
/datum/supply_pack/supply/postal_service
name = "Postal Service Supplies"
contains = list(
/obj/item/mail/blank = 10,
/obj/item/weapon/pen/fountain,
/obj/item/weapon/pen/multi,
/obj/item/device/destTagger,
/obj/item/weapon/storage/bag/mail
)
cost = 15
containertype = /obj/structure/closet/crate/nanotrasen
containername = "Postal Service crate"

View File

@@ -4705,6 +4705,7 @@
#include "modular_chomp\code\datums\supplypacks\misc.dm" #include "modular_chomp\code\datums\supplypacks\misc.dm"
#include "modular_chomp\code\datums\supplypacks\science.dm" #include "modular_chomp\code\datums\supplypacks\science.dm"
#include "modular_chomp\code\datums\supplypacks\security.dm" #include "modular_chomp\code\datums\supplypacks\security.dm"
#include "modular_chomp\code\datums\supplypacks\supply.dm"
#include "modular_chomp\code\datums\underwear\socks.dm" #include "modular_chomp\code\datums\underwear\socks.dm"
#include "modular_chomp\code\game\atoms\atoms.dm" #include "modular_chomp\code\game\atoms\atoms.dm"
#include "modular_chomp\code\game\gamemodes\meteor\meteors.dm" #include "modular_chomp\code\game\gamemodes\meteor\meteors.dm"