Various upports (#17061)

* Mail

* Updoot

* Stuffs

* Updoot

* oops

* Change

* usr + span_notice

* fix

* Forgot the gelatin :(

* MORE gelatin

* Proper Gelatin :)

* Gelatin shall not be a juice

* And gives it an ID of course

* deconf

* adds the missing worn sprites

* enables this since guti's pr gets merged

---------

Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com>
Co-authored-by: C.L. <killer65311@gmail.com>
This commit is contained in:
Guti
2025-03-03 10:39:38 -05:00
committed by GitHub
co-authored by Selis C.L.
parent cce0a5b8d0
commit 4fe99bd865
42 changed files with 2053 additions and 23 deletions
+29 -1
View File
@@ -1,4 +1,4 @@
/*
//########################## CONTRABAND ;3333333333333333333 -Agouri ###################################################
/obj/item/contraband
@@ -240,3 +240,31 @@
/obj/structure/sign/poster/custom
roll_type = /obj/item/contraband/poster/custom
*/
/obj/item/contraband/package
name = "contraband"
desc = "A tightly sealed package. Dare to look inside?"
icon = 'icons/obj/storage.dmi'
icon_state = "deliverycrate5"
item_state = "table_parts"
w_class = ITEMSIZE_HUGE
/obj/item/contraband/package/attack_self(mob/user)
var/contraband = pick(
/obj/item/reagent_containers/glass/beaker/vial/macrocillin,
/obj/item/reagent_containers/glass/beaker/vial/microcillin,
/obj/item/gun/energy/sizegun,
/obj/item/clothing/mask/muzzle,
/obj/item/pda/clown,
/obj/item/pda/mime,
/obj/item/storage/fancy/cigar/havana,
/obj/item/card/emag_broken,
/obj/item/sleevemate,
/obj/item/disk/nifsoft/compliance,
/obj/item/seeds/ambrosiadeusseed,
/obj/item/seeds/ambrosiavulgarisseed,
/obj/item/bodysnatcher)
user.put_in_hands(new contraband(user.loc))
to_chat(user, span_notice("You unwrap the package."))
qdel(src)
@@ -219,3 +219,76 @@
return 1
else
return 0
// Light Painter.
/obj/item/lightpainter
name = "light painter"
desc = "A device to configure the emission color of lighting fixtures. Use this device in-hand to set/reset the color. Use the device on a light fixture to assign the color."
icon = 'icons/obj/janitor.dmi'
icon_state = "lightreplacer0"
color = "#bbbbff"
slot_flags = SLOT_BELT
matter = list(MAT_STEEL = 5000,MAT_GLASS = 1500)
var/static/dcolor = "#e0eff0"
var/static/dnightcolor = "#efcc86"
//set color values.
var/setcolor = "#e0eff0"
var/setnightcolor = "#efcc86"
var/resetmode = 1
var/dimming = 0.7 // multiply value to dim lights from setcolor to nightcolor
/obj/item/lightpainter/New()
. = ..()
/obj/item/lightpainter/examine(mob/user)
. = ..()
if(get_dist(user, src) <= 2)
if(resetmode)
. += "It is currently resetting light colors."
else
. += "It is currently coloring lights."
/obj/item/lightpainter/attack_self(mob/user)
if(!resetmode)
resetmode = 1
to_chat(user, span_infoplain("Painter reset."))
else
var/color_input = tgui_color_picker(user,"","Choose Light Color",setcolor)
if(color_input)
setcolor = sanitize_hexcolor(color_input)
var/list/setcolorRGB = hex2rgb(setcolor)
var/setcolorR = num2hex(setcolorRGB[1] * dimming, 2)
var/setcolorG = num2hex(setcolorRGB[2] * dimming, 2)
var/setcolorB = num2hex(setcolorRGB[3] * dimming, 2)
setnightcolor = addtext("#", setcolorR, setcolorG, setcolorB)
resetmode = 0
to_chat(user, span_infoplain("Painter color set."))
/obj/item/lightpainter/proc/ColorLight(var/obj/machinery/light/target, var/mob/living/U)
src.add_fingerprint(U)
if(resetmode)
to_chat(U, span_notice("You reset the color of the [target.get_fitting_name()]."))
target.brightness_color = dcolor
target.brightness_color_ns = dnightcolor
else
to_chat(U, span_notice("You set the color of the [target.get_fitting_name()]."))
target.brightness_color = setcolor
target.brightness_color_ns = setnightcolor
if(target.nightshift_enabled)
target.light_color = target.brightness_color_ns
else
target.light_color = target.brightness_color
target.set_light(0)
target.update()
@@ -0,0 +1,72 @@
/obj/item/holosign_creator
name = "holographic sign projector"
desc = "A handy-dandy holographic projector that displays a janitorial sign."
icon = 'icons/obj/device.dmi'
icon_state = "signmaker"
item_state = "electronic"
force = 0
w_class = 2
throwforce = 0
throw_speed = 3
throw_range = 7
var/list/signs = list()
var/max_signs = 10
var/creation_time = 0 //time to create a holosign in deciseconds.
var/holosign_type = /obj/structure/holosign/wetsign
var/holocreator_busy = FALSE //to prevent placing multiple holo barriers at once
/obj/item/holosign_creator/afterattack(atom/target, mob/user, clickchain_flags, list/params)
. = ..()
if(!check_allowed_items(target, 1))
return
var/turf/T = get_turf(target)
var/obj/structure/holosign/H = locate(holosign_type) in T
if(H)
to_chat(user, span_notice("You use [src] to deactivate [H]."))
qdel(H)
else
if(holocreator_busy)
to_chat(user, span_notice("[src] is busy creating a hologram."))
return
if(signs.len < max_signs)
playsound(src.loc, 'sound/machines/click.ogg', 20, 1)
if(creation_time)
holocreator_busy = TRUE
if(!do_after(user, creation_time, target = target))
holocreator_busy = FALSE
return
holocreator_busy = FALSE
if(signs.len >= max_signs)
return
if(is_blocked_turf(T, TRUE)) //don't try to sneak dense stuff on our tile during the wait.
return
H = new holosign_type(get_turf(target), src)
to_chat(user, span_notice("You create \a [H] with [src]."))
else
to_chat(user, span_notice("[src] is projecting at max capacity!"))
/obj/item/holosign_creator/attack_self(mob/user)
. = ..()
if(.)
return
if(signs.len)
for(var/H in signs)
qdel(H)
to_chat(user, span_notice("You clear all active holograms."))
/obj/item/holosign_creator/combifan
name = "ATMOS holo-combifan projector"
desc = "A holographic projector that creates holographic combi-fans that prevent changes in atmosphere and temperature conditions. Somehow."
icon_state = "signmaker_engi"
holosign_type = /obj/structure/holosign/barrier/combifan
creation_time = 0
max_signs = 3
/obj/item/holosign_creator/medical
name = "Vey-Med barrier projector"
desc = "A holographic projector that creates Vey-Medical holobarriers. Useful during quarantines since they halt those with malicious diseases."
icon = 'icons/obj/device.dmi'
icon_state = "signmaker_med"
holosign_type = /obj/structure/holosign/barrier/medical
creation_time = 0
max_signs = 6
@@ -0,0 +1,12 @@
/obj/item/storage/briefcase/target_toy
starts_with = list(
/obj/item/paper/target,
/obj/item/gun/projectile/revolver/toy/big_iron,
/obj/item/grenade/confetti = 2
)
/obj/item/paper/target
name = "target notice"
/obj/item/paper/target/New()
info = "Your target is " + span_bold("[random_name(pick(MALE,FEMALE))]") + ". Make sure they don't get out of there alive."
@@ -766,3 +766,338 @@ CIGARETTE PACKETS ARE IN FANCY.DM
name = "\improper badass Zippo lighter"
desc = "An absolutely badass zippo lighter. Just look at that skull!"
icon_state = "skullzippo"
/obj/item/flame/lighter/supermatter
name = "Hardlight Supermatter Zippo" // Base SM Lighter
desc = "State of the Art Supermatter Lighter."
description_fluff = "A zippo style lighter with a tiny supermatter sliver held by a hardlight shield. When lighting a cigar, make sure to hover the tip near the sliver, not against it!"
icon_state = "SMzippo"
item_state = "SMzippo"
activation_sound = 'sound/items/zippo_on_alt.ogg'
deactivation_sound = 'sound/items/zippo_off.ogg'
/obj/item/flame/lighter/supermatter/syndismzippo
name = "Phoron Supermatter Zippo" // Syndicate SM Lighter
desc = "State of the Art Supermatter Lighter."
description_fluff = "A red zippo style lighter with a tiny supermatter sliver held by a phoron field."
icon_state = "SyndiSMzippo"
item_state = "SyndiSMzippo"
activation_sound = 'sound/items/zippo_on_alt.ogg'
deactivation_sound = 'sound/items/zippo_off.ogg'
/obj/item/flame/lighter/supermatter/expsmzippo
name = "Experimental SM Lighter" // Dangerous WIP (admin/event only ATM)
desc = "State of the Art Supermatter Lighter"
description_fluff = "A unique take originating from the zippo design, a shard of supermatter placed within lead-lined walls. Cautious, VERY DANGEROUS do NOT touch!"
icon_state = "ExpSMzippo"
item_state = "ExpSMzippo"
activation_sound = 'sound/items/button-open.ogg'
deactivation_sound = 'sound/items/button-close.ogg'
// safe smzippo
/obj/item/flame/lighter/supermatter/attack_self(mob/living/user)
if(!base_state)
base_state = icon_state
if(!lit)
lit = 1
icon_state = "[base_state]on"
item_state = "[base_state]on"
playsound(src, activation_sound, 75, 1)
if(prob(50))
user.visible_message(span_rose("[user] safely activates the [src] with a push of a button!"))
else
if(prob(95))
user.visible_message(span_notice("After a few attempts, [user] manages to excite the supermatter within the [src]."))
else // Just like the cheap lighter, this time you can shock/burn yourself a little on the hardlight shield
to_chat(user, span_warning("You hurt yourself on the shielding!"))
if (user.get_left_hand() == src)
user.apply_damage(1,SEARING,"l_hand")
user.apply_damage(2,ELECTROCUTE,"l_hand")
user.apply_damage(3,CLONE,"l_hand")
user.apply_damage(4,ELECTROMAG,"l_hand")
else
user.apply_damage(1,SEARING,"r_hand")
user.apply_damage(2,ELECTROCUTE,"r_hand")
user.apply_damage(3,CLONE,"r_hand")
user.apply_damage(4,ELECTROMAG,"r_hand")
user.visible_message(span_notice("After a few attempts, [user] manages to activate the [src], they however sting themselves on the shielding!"))
set_light(2)
START_PROCESSING(SSobj, src)
else
lit = 0
icon_state = "[base_state]"
item_state = "[base_state]"
playsound(src, deactivation_sound, 75, 1)
if(istype(src, /obj/item/flame/lighter/supermatter) )
user.visible_message(span_rose("You hear a quiet click, as [user] shuts the [src] without even looking at what they're doing."))
else
user.visible_message(span_notice("[user] quietly shuts the [src]."))
set_light(0)
STOP_PROCESSING(SSobj, src)
return
/obj/item/flame/lighter/supermatter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
if(lit == 1)
M.IgniteMob()
add_attack_logs(user,M,"Lit on fire with [src]")
if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit)
var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask
if(M == user)
cig.attackby(src, user)
else
if(istype(src, /obj/item/flame/lighter/supermatter))
cig.light(span_rose("[user] whips the [name] out and holds it for [M]."))
else
cig.light(span_notice("[user] holds the [name] out for [M], and lights the [cig.name]."))
else
..()
/obj/item/flame/lighter/supermatter/process()
var/turf/location = get_turf(src)
if(location)
location.hotspot_expose(700, 5)
return
// syndicate smzippo
/obj/item/flame/lighter/supermatter/syndismzippo/attack_self(mob/living/user)
if(!base_state)
base_state = icon_state
if(!lit)
lit = 1
icon_state = "[base_state]on"
item_state = "[base_state]on"
playsound(src, activation_sound, 75, 1)
if(prob(50))
user.visible_message(span_rose("[user] safely activates the [src] with a push of a button!"))
else
if(prob(95))
user.visible_message(span_notice("After a few attempts, [user] manages to excite the supermatter within the [src]."))
else // Just like with the cheap lighter, but this time you can hurt yourself on the heated phoron field
to_chat(user, span_warning("You singe yourself on the phoron shielding the excited supermatter!"))
if (user.get_left_hand() == src)
user.apply_damage(30,HALLOSS,"l_hand")
user.apply_effect(20,IRRADIATE)
user.apply_damage(5,BURN,"l_hand")
user.apply_damage(5,ELECTROCUTE,"l_hand")
else
user.apply_damage(30,HALLOSS,"r_hand")
user.apply_effect(20,IRRADIATE)
user.apply_damage(5,BURN,"r_hand")
user.apply_damage(5,ELECTROCUTE,"r_hand")
user.visible_message(span_notice("After a few attempts, [user] manages to activate the [src], they however burn themselves with the heated phoron field!"))
set_light(2)
START_PROCESSING(SSobj, src)
else
lit = 0
icon_state = "[base_state]"
item_state = "[base_state]"
playsound(src, deactivation_sound, 75, 1)
if(istype(src, /obj/item/flame/lighter/supermatter/syndismzippo) )
user.visible_message(span_rose("You hear a quiet click, as [user] shuts the [src] without even looking at what they're doing."))
else
user.visible_message(span_notice("[user] quietly shuts the [src]."))
set_light(0)
STOP_PROCESSING(SSobj, src)
return
/obj/item/flame/lighter/supermatter/syndismzippo/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
if(lit == 1)
M.IgniteMob()
add_attack_logs(user,M,"Lit on fire with [src]")
if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit)
var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask
if(M == user)
cig.attackby(src, user)
else
if(istype(src, /obj/item/flame/lighter/supermatter/syndismzippo))
cig.light(span_rose("[user] whips the [name] out and holds it for [M]."))
else
cig.light(span_notice("[user] holds the [name] out for [M], and lights the [cig.name]."))
else
..()
/obj/item/flame/lighter/process()
var/turf/location = get_turf(src)
if(location)
location.hotspot_expose(700, 5)
return
// Experimental smzippo
/obj/item/flame/lighter/supermatter/expsmzippo/attack_self(mob/living/user)
if (!base_state)
base_state = icon_state
if (!lit)
lit = 1
icon_state = "[base_state]on"
item_state = "[base_state]on"
playsound(src, activation_sound, 75, 1)
var/i = rand(1, 100)
switch(i)
if(1 to 22)
to_chat(user, span_rose("[user] safely reveals the supermatter shard within the [src]!"))
user.visible_message(span_rose("You safely revealed the supermatter shard within the [src]!"))
if (user.get_left_hand() == src)
user.apply_damage(1, IRRADIATE, "l_hand")
else // Even using this safely will irradiate you a tiny tiny bit.
user.apply_damage(1, IRRADIATE, "r_hand")
if(23 to 33)
to_chat(user, span_warning("[user]'s hand slipped and they brush against the supermatter within [src]!"))
user.visible_message(span_notice("You accidentally grazed your hand across the supermatter!"))
if (user.get_left_hand() == src)
user.apply_damage(10, IRRADIATE, "l_hand")
user.apply_damage(20, BURN, "l_hand")
user.apply_damage(20, ELECTROCUTE, "l_hand")
user.apply_damage(50, AGONY, "l_hand")
else // One of the outcomes will burn and shock you, the pain is the worst part of this one though.
user.apply_damage(10, IRRADIATE, "r_hand")
user.apply_damage(20, BURN, "r_hand")
user.apply_damage(20, ELECTROCUTE, "r_hand")
user.apply_damage(50, AGONY, "r_hand")
if(34 to 44)
to_chat(user, span_warning("[user] burned themselves on the [src]!"))
user.visible_message(span_notice("You accidentally burn yourself on the [src]!"))
if (user.get_left_hand() == src)
user.apply_damage(30, IRRADIATE, "l_hand")
user.apply_damage(20, SEARING, "l_hand")
user.apply_damage(15, BURN, "l_hand")
else // One of the outcomes is pure burn and radiation.
user.apply_damage(30, IRRADIATE, "r_hand")
user.apply_damage(20, SEARING, "r_hand")
user.apply_damage(15, BURN, "r_hand")
if(45 to 55)
to_chat(user, span_warning("[user] fumbled the [src] and the supermatter let out sparks!"))
user.visible_message(span_notice("You fumble the [src], letting the supermatter spark as the case opens!"))
if (user.get_left_hand() == src)
user.apply_damage(1, ELECTROCUTE, "l_hand")
user.apply_damage(100, ELECTROMAG, "l_hand")
else // This one is mostly dangerous to synthetics and it will EMP you. But otherwise it's safe.
user.apply_damage(1, ELECTROCUTE, "r_hand")
user.apply_damage(100, ELECTROMAG, "r_hand")
if(56 to 66)
to_chat(user, span_warning("[user] struggles to open their [src], but when they do they get burned by the extreme heat within!"))
user.visible_message(span_notice("You struggle to get the case to open, and when it does the heat that pours out of the [src] burns!"))
if (user.get_left_hand() == src)
user.apply_damage(1, IRRADIATE, "l_hand")
user.apply_damage(1, BRUISE, "l_hand")
user.apply_damage(200, BURN, "l_hand")
user.drop_l_hand()
else // This will INSTA-DUST your hand that you're holding the item in, and then make you drop the lighter.
user.apply_damage(1, IRRADIATE, "r_hand")
user.apply_damage(1, BRUISE, "r_hand")
user.apply_damage(200, BURN, "r_hand")
user.drop_r_hand()
if(67 to 77)
to_chat(user, span_warning("Ouch! While pushing on the release to open the [src], [user]'s finger slipped right as the case opened, pressing their finger firm against the supermatter!"))
user.visible_message(span_notice("You accidentally pushed your finger against the supermatter!"))
if (user.get_left_hand() == src)
user.apply_damage(50, HALLOSS, "l_hand")
user.apply_damage(40, IRRADIATE, "l_hand")
user.apply_damage(30, BURN, "l_hand")
user.apply_damage(20, TOX, "l_hand")
user.apply_damage(10, ELECTROCUTE, "l_hand")
user.apply_effect(25, STUTTER)
user.apply_effect(15, SLUR)
user.apply_effect(5, STUN)
else // This one is VERY punishing, you get a ton of damage, a lot of pain, and a minor stun. Once the stun goes away you'll be stuttering for awhile as if in crit.
user.apply_damage(50, HALLOSS, "r_hand")
user.apply_damage(40, IRRADIATE, "r_hand")
user.apply_damage(30, BURN, "r_hand")
user.apply_damage(20, TOX, "r_hand")
user.apply_damage(10, ELECTROCUTE, "r_hand")
user.apply_effect(25, STUTTER)
user.apply_effect(15, SLUR)
user.apply_effect(5, STUN)
if(78 to 88)
to_chat(user, span_notice("[user] managed to pinch themselves on the case of their [src]... it could have been worse."))
user.visible_message(span_notice("You manage to pinch yourself on the case!"))
if (user.get_left_hand() == src)
user.apply_damage(1, CLONE, "l_hand")
user.apply_damage(1, HALLOSS, "l_hand")
else // Aside from the base, this one isn't punishing outside of giving you genetic damage.
user.apply_damage(1, CLONE, "r_hand")
user.apply_damage(1, HALLOSS, "r_hand")
if(89 to 99)
to_chat(user, span_notice("[user] opened the [src] but forgot that you aren't supposed to look at supermatter!"))
user.visible_message(span_notice("You find yourself looking at the supermatter for longer than you should..."))
if (user.get_left_hand() == src)
user.apply_damage(15, HALLOSS, "l_hand")
user.apply_effect(5, WEAKEN)
user.apply_damage(15, IRRADIATE, "l_hand")
user.apply_effect(100, EYE_BLUR)
user.apply_effect(50, AGONY)
user.apply_damage(5, OXY)
user.eye_blurry = 10
else // This one just blinds and blurs your screen, but otherwise doesn't actually risk harming you. Even the oxy damage heals on its own.
user.apply_damage(15, HALLOSS, "r_hand")
user.apply_effect(5, WEAKEN)
user.apply_damage(15, IRRADIATE, "l_hand")
user.apply_effect(100, EYE_BLUR)
user.apply_effect(50, AGONY)
user.apply_damage(15, OXY)
user.eye_blurry = 10
if(100) // This is the part that makes it admin only for the moment, it spawns 500 rads from the carbon's position, and dusts the carbon instantly. It does also drop everything unlike the supermatter crystal though, so hopefully you won't lose any items if you fumble this badly!
to_chat(user, span_warning("OH NO! [user] almost dropped their live [src]! Thank goodness they caught it... by the glowing yellow crystal... oh."))
user.visible_message(span_danger("You almost dropped your [src], thank goodness you caught it! By the glowing crystal within. You find your ears filled with unearthly ringing and your last thought is \"Oh, fuck.\""))
user.drop_r_hand() // To ensure the lighter is dropped <3
user.drop_l_hand() // To ensure the lighter is dropped <3
for(var/obj/item/e in user)
user.drop_from_inventory(e)
log_and_message_admins("[user] dusted themselves and caused massive radiation with [src]!",user)
user.dust()
var/rads = 500
SSradiation.radiate(src, rads)
set_light(5)
START_PROCESSING(SSobj, src)
else
lit = 0
icon_state = "[base_state]"
item_state = "[base_state]"
playsound(src, deactivation_sound, 75, 1)
if (istype(src, /obj/item/flame/lighter/supermatter/expsmzippo))
user.visible_message(span_rose("You hear a quiet click, as [user] closes the [src]."))
else
user.visible_message(span_notice("[user] quietly shuts the [src]."))
set_light(0)
STOP_PROCESSING(SSobj, src)
/obj/item/flame/lighter/supermatter/expsmzippo/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if (!istype(M, /mob))
return
if (lit == 1)
M.IgniteMob()
add_attack_logs(user, M, "Lit on fire with [src]")
if (istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit)
var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask
if (M == user)
cig.attackby(src, user)
else
if (istype(src, /obj/item/flame/lighter/supermatter/expsmzippo))
cig.light(span_rose("[user] whips the [name] out and holds it for [M]."))
else
cig.light(span_notice("[user] holds the [name] out for [M], and lights the [cig.name]."))
else
..()
/obj/item/flame/lighter/supermatter/expsmzippo/process()
var/turf/location = get_turf(src)
if (location)
location.hotspot_expose(700, 5)
return
+509
View File
@@ -0,0 +1,509 @@
/obj/item/mail
name = "mail"
desc = "An officially postmarked, tamper-evident parcel regulated by CentCom and made of high-quality materials."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "mail_small"
item_flags = NOBLUDGEON
w_class = ITEMSIZE_SMALL
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
// Destination tagging for the mail sorter.
var/sortTag = 0
// Who this mail is for and who can open it.
var/datum/weakref/recipient
// How many goodies this mail contains.
var/goodie_count = 1
// Goodies which can be given to anyone.
// Weight sum will be 1000
var/list/generic_goodies = list(
/obj/item/spacecash/c50 = 75,
/obj/item/reagent_containers/food/drinks/cans/cola = 75,
/obj/item/reagent_containers/food/snacks/chips = 75,
/obj/item/reagent_containers/food/drinks/coffee = 75,
/obj/item/reagent_containers/food/drinks/tea = 75,
/obj/item/reagent_containers/food/drinks/glass2/coffeemug/nt = 50,
/obj/item/spacecash/c100 = 40,
/obj/item/spacecash/c200 = 25,
/obj/item/spacecash/c500 = 15,
/obj/item/spacecash/c1000 = 5,
/obj/item/reagent_containers/food/drinks/bluespace_coffee = 5
)
// Overlays (pure fluff)
// Does the letter have the postmark overlay?
var/postmarked = TRUE
// Does the letter have a stamp overlay?
var/stamped = TRUE
// List of all stamp overlays on the letter.
var/list/stamps = list()
// Maximum number of stamps on the letter.
var/stamp_max = 1
// Physical offset of stamps on the object. X direction.
var/stamp_offset_x = 0
// Physical offset of stamps on the object. Y direction.
var/stamp_offset_y = 2
// If the mail is actively being opened right now
var/opening = FALSE
// If the mail has been scanned with a mail scanner
var/scanned
// Does it have a colored envelope?
var/colored_envelope
/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
name = "envelope"
icon_state = "mail_large"
goodie_count = 2
stamp_max = 2
stamp_offset_y = 5
/obj/item/mail/Initialize()
. = ..()
RegisterSignal(src, COMSIG_MOVABLE_DISPOSING, PROC_REF(disposal_handling))
// Icons
// Add some random stamps.
if(stamped == TRUE)
var/stamp_count = rand(1, stamp_max)
for(var/i = 1, i <= stamp_count, i++)
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
/obj/item/mail/blank/attackby(obj/item/W, mob/user)
..()
if(istype(W, /obj/item/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)
to_chat(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)
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()
. = ..()
cut_overlays()
if(colored_envelope)
var/image/envelope = image(icon, icon_state)
envelope.color = colored_envelope
add_overlay(envelope)
var/bonus_stamp_offset = 0
for(var/stamp in stamps)
var/image/stamp_image = image(
icon_state = stamp,
pixel_x = stamp_offset_x,
pixel_y = stamp_offset_y + bonus_stamp_offset
)
stamp_image.appearance_flags |= RESET_COLOR
add_overlay(stamp_image)
bonus_stamp_offset -= 5
if(postmarked == TRUE)
var/image/postmark_image = image(
icon = icon,
icon_state = "postmark",
pixel_x = stamp_offset_x + rand(-4, 0),
pixel_y = stamp_offset_y + rand(bonus_stamp_offset + 3, 1)
)
postmark_image.appearance_flags |= RESET_COLOR
add_overlay(postmark_image)
/obj/item/mail/attackby(obj/item/W as obj, mob/user as mob)
. = ..()
// Destination tagging
if(istype(W, /obj/item/destTagger))
var/obj/item/destTagger/O = W
if(O.currTag)
if(src.sortTag != O.currTag)
to_chat(user, span_notice("You have labeled the destination as [O.currTag]."))
src.sortTag = O.currTag
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
W.description_info = " It is labeled for [O.currTag]"
else
to_chat(user, span_notice("The mail is already labeled for [O.currTag]."))
else
to_chat(user, span_danger("You need to set a destination first!"))
return
/obj/item/mail/attack_self(mob/user)
if(!unwrap(user))
return FALSE
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 <em>illegal</em>"))
return FALSE
if(opening)
to_chat(user, span_danger("You are already opening that!"))
return FALSE
opening = TRUE
if(!do_after(user, 1.5 SECONDS, target = user))
opening = FALSE
return FALSE
return TRUE
/obj/item/mail/proc/after_unwrap(mob/user)
user.temporarilyRemoveItemFromInventory(src, TRUE)
for(var/obj/stuff as anything in contents)
if(isitem(stuff))
user.put_in_hands(stuff)
else
stuff.forceMove(drop_location())
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])"
var/datum/job/this_job = SSjob.name_occupations[new_recipient.job]
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)
if(LAZYLEN(job_goodies))
if(this_job.get_mail_goodies())
goodies = job_goodies
else
goodies += job_goodies
if(!preset_goodies)
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])")
update_icon()
return TRUE
/obj/item/mail/proc/disposal_handling(disposal_source, obj/structure/disposalholder/disposal_holder, obj/machinery/disposal/deliveryChute, hasmob)
SIGNAL_HANDLER
if(!hasmob)
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/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)
return
var/shuttle_spawn = tgui_alert(usr, "Spawn mail at location or in the shuttle?", "Spawn mail", list("Location", "Shuttle"))
if(!shuttle_spawn)
return
if(shuttle_spawn == "Shuttle")
var/obj/item/mail/new_mail = new
new_mail.initialize_for_recipient(recipients, 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)
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","SM")
// Mail Crate
/obj/structure/closet/crate/mail
name = "mail crate"
desc = "An official mail crate from CentCom"
points_per_crate = 0
closet_appearance = /decl/closet_appearance/crate/nanotrasen
/obj/structure/closet/crate/mail/full/Initialize()
. = ..()
var/list/mail_recipients = list()
for(var/mob/living/carbon/human/alive in player_list)
if(alive.stat != DEAD && alive.client && alive.client.inactivity <= 10 MINUTES)
mail_recipients += alive
for(var/iterator in 1 to storage_capacity)
var/obj/item/mail/new_mail
if(prob(70))
new_mail = new /obj/item/mail(src)
else
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)
mail_recipients -= mail_to
else
new_mail.junk_mail()
// Mailbag
/obj/item/storage/bag/mail
name = "mail bag"
desc = "A bag for letters, envelopes and other postage."
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "mailbag"
slot_flags = SLOT_BELT | SLOT_POCKET
w_class = ITEMSIZE_NORMAL
storage_slots = 31
max_storage_space = 50
max_w_class = ITEMSIZE_NORMAL
use_to_pickup = TRUE
allow_quick_gather = TRUE
can_hold = list(
/obj/item/mail,
/obj/item/smallDelivery,
/obj/item/paper,
/obj/item/stolenpackage,
/obj/item/contraband,
/obj/item/mail_scanner,
/obj/item/pen
)
// Mail Scanner
/obj/item/mail_scanner
name = "mail scanner"
desc = "Sponsored by the Intergalactic Mail Service, this device logs mail deliveries in exchance for financial compensation."
force = 0
throwforce = 0
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "mail_scanner"
slot_flags = SLOT_BELT
w_class = ITEMSIZE_SMALL
var/cargo_points = 5
var/obj/item/mail/saved
/obj/item/mail_scanner/examine(mob/user)
. = ..()
. += span_notice("Scan a letter to log it into the active database, then scan the person you wish to hand the letter to. Correctly scanning the recipient of the letter logged into the active database will add points to the supply budget.")
/obj/item/mail_scanner/attack()
return
/obj/item/mail_scanner/afterattack(atom/A, mob/user)
if(istype(A, /obj/item/mail))
var/obj/item/mail/saved_mail = A
if(saved_mail.scanned)
to_chat(user, span_danger("This letter has already been scanned!"))
playsound(loc, 'sound/items/mail/maildenied.ogg', 50, TRUE)
return
to_chat(user, span_notice("Mail added to database"))
playsound(loc, 'sound/items/mail/mailscanned.ogg', 50, TRUE)
saved = A
return
if(isliving(A))
var/mob/living/M = A
if(!saved)
to_chat(user, span_danger("No logged mail!"))
playsound(loc, 'sound/items/mail/maildenied.ogg', 50, TRUE)
return
var/mob/living/recipient = saved.recipient
if(M.stat == DEAD)
to_chat(user, span_warning("Consent Verification failed: You can't deliver mail to a corpse!"))
playsound(loc, 'sound/items/mail/maildenied.ogg', 50, TRUE)
return
if(M.real_name != recipient.real_name)
to_chat(user, span_warning("Identity Verification failed: Target is not authorized recipient of this envelope!"))
playsound(loc, 'sound/items/mail/maildenied.ogg', 50, TRUE)
return
if(!M.client)
to_chat(user, span_warning("Consent Verification failed: The scanner does not accept orders from SSD crewmemmbers!"))
playsound(loc, 'sound/items/mail/maildenied.ogg', 50, TRUE)
return
saved.scanned = TRUE
saved = null
cargo_points = rand(5, 10)
to_chat(user, span_notice("Succesful delivery acknowledged! [cargo_points] points added to Supply."))
playsound(loc, 'sound/items/mail/mailapproved.ogg', 50, TRUE)
SSsupply.points += cargo_points
// JUNK MAIL STUFF
/obj/item/mail/junkmail/Initialize()
. = ..()
junk_mail()
/obj/item/mail/proc/junk_mail()
var/obj/junk = /obj/item/paper/fluff/junkmail_generic
var/special_name = FALSE
if(prob(25))
special_name = TRUE
junk = pick(list(
/obj/item/paper/pamphlet/gateway,
/obj/item/paper/pamphlet/violent_video_games,
/obj/item/paper/pamphlet/radstorm,
/obj/item/paper/fluff/junkmail_redpill,
/obj/effect/decal/cleanable/ash,
/obj/item/paper/fluff/love_letter,
/obj/item/reagent_containers/food/snacks/donkpocket/berry,
/obj/item/reagent_containers/food/snacks/donkpocket/dankpocket,
/obj/item/reagent_containers/food/snacks/donkpocket/gondola,
/obj/item/reagent_containers/food/snacks/donkpocket/honk,
/obj/item/reagent_containers/food/snacks/donkpocket/pizza,
/obj/item/reagent_containers/food/snacks/donkpocket/spicy,
/obj/item/reagent_containers/food/snacks/donkpocket/teriyaki,
/obj/item/toy/figure,
/obj/item/contraband/package,
/obj/item/tool/screwdriver/sdriver,
/obj/item/storage/briefcase/target_toy
))
var/list/junk_names = list(
/obj/item/paper/pamphlet/gateway = "[initial(name)] for BRAVE adventurers",
/obj/item/paper/pamphlet/violent_video_games = "[initial(name)] for the truth about the arcade CentComm doesn't want to hear",
/obj/item/paper/pamphlet/radstorm = "[initial(name)] for the threats in space",
/obj/item/paper/fluff/junkmail_redpill = "[initial(name)] for those feeling tired working at Nanotrasen",
/obj/effect/decal/cleanable/ash = "[initial(name)] with INCREDIBLY IMPORTANT ARTIFACT- DELIVER TO SCIENCE DIVISION. HANDLE WITH CARE.",
/obj/item/paper/fluff/love_letter = "[initial(name)] for STUPID CARGO MAILMEN.",
/obj/item/reagent_containers/food/snacks/donkpocket/berry = "[initial(name)] with NEW BERRY-POCKET.",
/obj/item/reagent_containers/food/snacks/donkpocket/dankpocket = "[initial(name)] with NEW DANK-POCKET.",
/obj/item/reagent_containers/food/snacks/donkpocket/gondola = "[initial(name)] with NEW GONDOLA-POCKET.",
/obj/item/reagent_containers/food/snacks/donkpocket/honk = "[initial(name)] with NEW HONK-POCKET.",
/obj/item/reagent_containers/food/snacks/donkpocket/pizza = "[initial(name)] with NEW PIZZA-POCKET.",
/obj/item/reagent_containers/food/snacks/donkpocket/spicy = "[initial(name)] with NEW SPICY-POCKET.",
/obj/item/reagent_containers/food/snacks/donkpocket/teriyaki = "[initial(name)] with NEW TERIYAKI-POCKET.",
/obj/item/toy/figure = "[initial(name)] from DoN**K*oC",
/obj/item/contraband/package = "[pick("oddly shaped", "strangely wrapped", "weird", "bulging")] [initial(name)]",
/obj/item/tool/screwdriver/sdriver = "[initial(name)] for Proffesor Who",
/obj/item/storage/briefcase/target_toy = "[initial(name)] for SIMPATHY, SUCCESS, MANHATTAN, BELIEFS"
)
name = special_name ? junk_names[junk] : "important [initial(name)]"
junk = new junk(src)
update_icon()
return TRUE
/obj/item/paper/fluff/junkmail_generic/Initialize()
. = ..()
info = pick(
prob(5);"Hello! I am executive at Nanotrasen Nigel Takall. Due to accounting error all of my salary is stored in an account unreachable. In order to withdraw I am required to utilize your account to make a deposit to confirm my reality situation. In exchange for a temporary deposit I will give you a payment 1000 credits. All I need is access to your account. Will you be assistant please?",
prob(5);"WE NEED YOUR BLOOD! WE ARE AN ANARCHO-COMMUNIST VAMPIRE COMMUNE. BLOOD ONLY LASTS 42 DAYS BEFORE IT GOES BAD! WE DO NOT HAVE NANOTRASEN STASIS! PLEASE, SEND BLOOD! THANK YOU! OR WE KILL YOU!",
prob(5);"Triple deposits are waiting for you at MaxBet Online when you register to play with us. You can qualify for a 200% Welcome Bonus at MaxBet Online when you sign up today. Once you are a player with MaxBet, you will also receive lucrative weekly and monthly promotions. You will be able to enjoy over 450 top-flight casino games at MaxBet.",
prob(5);"Hello !, I'm the former HoS of your deerest station accused by the Nanotrasen of being a traitor . I was the best we had to offer but it seems that nanotramsen has turned their back on me. I need 2000 credits to pay for my bail and then we can restore order on space station 14!",
prob(5);"Hello, I noticed you riding in a 2555 Ripley and wondered if you'd be interested in selling. Low mileage mechs sell very well in our current market. Please call 223-334-3245 if you're interested",
prob(5);"Resign Now. I'm on you now. You are fucking with me now Let's see who you are. Watch your back , bitch. Call me. Don't be afraid, you piece of shit. Stand up. If you don't call, you're just afraid. And later: I already know where you live, I'm on you. You might as well call me. You will see me. I promise. Bro.",
prob(5);"Clown Planet Is Going To Become Awesome Possum Again! If This Wasn't Sent To A Clown, Disregard. If This Was Sent To A Mime, Blow It Out Your Ass, Space Frenchie! Anyway! We Make Big Progress On Clown Planet After Stupid Mimes BLOW IT ALL TO SAM HELL!!!!! Sorry I Am Mad.. Anyway Come And Visit, Honkles! We Thought You Were Dead Long Time :^()",
prob(5);"MONTHPEOPLE ARE REAL, THE NANOTRASEN DEEP STATE DOESN'T WANT YOU TO SEE THIS! I'VE SEEN THEM IN REAL LIFE, THEY HAVE HUGE EYEBALLS AND NO HEAD. THEY'RE SENTIENT CALENDARS. I'M NOT CRAZY. SEARCH THE CALENDAR INCIDENT ON NTNET. USE A PROXY! #BIGTRUTHS #WAKEYWAKEYSPACEMEN #21STOFSEPTEMBER",
prob(5);"hello :wave::wave: nanotrasens! fuck :point_left::ok_hand: the syndicate! they :older_woman: got ☄ me :heart_eyes::cold_sweat: questioning my :pregnant_woman: loyalty to nanotraben! so :ok_hand::100: please :tired_face: lets :no_entry::eyes: gather our :camera_with_flash::poop: energy :sunglasses: and :moneybag::symbols: QUICK. :astonished: send this :wastebasket::point_left: to :sweat_drops::pill: 10 :joy::joy: other loyal :100: nanotraysens to :sweat_drops::thinking: show we :dog: dont :person_gesturing_no::no_entry_sign: take :shopping_bags: nothing from :joy: the ✝ syndicate!! bless your :point_right_tone2: heart :heart_eyes::broken_heart:",
prob(5);"Hello, my name is Immigration officer Mimi Sashimi from the American-Felinid Homeworld consulate. It appears your current documents are either inaccurate if not entirely fraudulent. This action in it's current state is a federal offense as listed in the United Earth Commission charter section NY-4. Please pay a fine of 300,000 Space credits or $3000 United States Dollars or face deportation",
prob(5);"Hi %name%, We are unable to validate your billing information for the next billing cycle of your subscription to HONK Weekly therefore we'll suspend your membership if we do not receive a response from you within 48 hours. Obviously we'd love to have you back, simply mail %address% to update your details and continue to enjoy all the best pranks & gags without interruption.",
prob(5);"Loyal customer, DonkCo Customer Service. We appreciate your brand loyalty support. As such, it is our responsibility and pleasure to inform you of the status of your package. Your package for one \"Moth-Fuzz Parka\" has been delayed. Due to local political tensions, an animal rights group has seized and eaten your package. We appreciate the patience, DonkCo",
prob(5);"MESSAGE FROM CENTCOMM HIGH COMMAND: DO NOT ACCEPT THE FRIEND REQUEST OF TICKLEBALLS THE CLOWN. HE IS NOT FUNNY AND ON TOP OF THAT HE WILL HACK YOUR NTNET ACCOUNT AND MAKE YOU UNFUNNY TOO. YOU WILL LOSE ALL YOUR SPACECREDITS!!!!! SPREAD THE WORD. ANYONE WHO BECOMES FRIENDS WITH TINKLEBALLS THE CLOWN IS GOING TO LOSE ALL OF THEIR SPACECREDITS AND LOOK LIKE A HUGE IDIOT.",
prob(5);"i WAS A NORMAL BOY AND I CAME HOME FROM SCHOOL AND I WANTED TO PLAY SOME ORION TRAIL WHICH IS A VERY FUN GAME BUT WHEN WENT TO ARCADE MACHINE SOMETHING WAS WEIRD TEH LOGO HASD BLOD IN IT AND I BECAME VERY SCARE AND I CHECK OPTIONS AND TEHRES ONLY 1 \"GO BACK\" I CKLICK IT AND I SEE CHAT SI EMPTY THERE'S ONLY ONE CHARACTER CALLED \"CLOSE TEH GAME \" AND I GO TO ANOTHER MACHINE AND PLAY THERE BUT WHEN I PLAY GAME IS FULL OF BLOOD AND DEAD BODIES FROM SPACEMAN LOOK CLOSER AND SEE CLOWN AND CLOWN COMES CLOSER AND LOOKS AT ME AND SAYS \"DON'T SAY I DIKDNT' WWARN YOU\" AND CLOWN CLOSEUP APPEARS WITH BLOOD-RED HYPERREALISTIC EYES AND HE TELLS ME \"YOU WILL BE THE NEXT ONE\" AND ARCADE MACHINE POWER SHUT OFF AND THAT NITE CLOWN APPEAR AT MY WINDOW AND KILL ME AT 3 AM AND NOW IM DEAD AND YOU WILL BE TRHNE NEXT OEN UNLESS YOU PASTE THIS STORY TO 10 NTNET FRIENDS",
)
/obj/item/paper/fluff/junkmail_redpill
name = "smudged paper"
icon_state = "scrap"
/obj/item/paper/fluff/junkmail_redpill/Initialize()
. = ..()
info = "You need to escape the simulation. Don't forget the numbers, they help you remember: '[rand(0,9)]*[rand(0,9)][rand(0,9)]...'"
/obj/item/paper/fluff/love_letter
name = "love letter"
icon_state = "paper_words"
/obj/item/paper/fluff/love_letter/Initialize()
. = ..()
info = "I HATE CARGO MAIL\n\"GRAA LEMME BREAK YOUR DOORS DOWN I GOTTA GIVE YOU MAIL\nREE YOU GOTTA GET YOUR MAIL I SORTED IT\nYOU'RE WASTIN YOUR TIME IF YOU DONT GET MAIL YOU NEED TO GET YOUR MAIL NOW\nWHY ARENT YO UGETTING YOUR MAIL RAAA\""
/obj/item/paper/fluff/junkmail_generic
name = "important document"
icon_state = "paper_words"
+108
View File
@@ -0,0 +1,108 @@
/obj/structure/holosign
name = "holo sign"
icon = 'icons/effects/effects.dmi'
anchored = TRUE
var/obj/item/holosign_creator/projector
var/health = 10
explosion_resistance = 1
/obj/structure/holosign/Initialize(mapload, source_projector)
. = ..()
if(source_projector)
projector = source_projector
projector.signs += src
/* if(overlays) // Fucking god damnit why do we have to have an entire different subsystem for this shit from other codebases.
overlays.add_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, alpha, RESET_ALPHA) //you see mobs under it, but you hit them like they are above it
alpha = 0
*/
/obj/structure/holosign/Destroy()
if(projector)
projector.signs -= src
projector = null
return ..()
/obj/structure/holosign/attack_hand(mob/user, list/params)
. = ..()
if(.)
return
user.setClickCooldown(user.get_attack_speed())
user.do_attack_animation(src)
take_damage(5)
playsound(loc, 'sound/weapons/egloves.ogg', 80, 1)
/obj/structure/holosign/attackby(obj/item/W as obj, mob/user as mob)
user.setClickCooldown(user.get_attack_speed(W))
user.do_attack_animation(src)
playsound(loc, 'sound/weapons/egloves.ogg', 80, 1)
take_damage(W.force)
/obj/structure/holosign/take_damage(var/damage)
health -= damage
spawn(1) healthcheck()
return 1
/obj/structure/holosign/proc/healthcheck()
if(health <= 0)
qdel(src)
/obj/structure/holosign/wetsign
name = "wet floor sign"
desc = "The words flicker as if they mean nothing."
icon_state = "holosign"
/obj/structure/holosign/barrier/combifan
name = "holo combifan"
desc = "A holographic barrier resembling a blue-accented tiny fan. Though it does not prevent solid objects from passing through, gas and temperature changes are kept out."
icon_state = "holo_firelock"
anchored = TRUE
density = FALSE
layer = ABOVE_TURF_LAYER
can_atmos_pass = ATMOS_PASS_NO
alpha = 150
/obj/structure/holosign/barrier/combifan/Destroy()
update_nearby_tiles()
return ..()
/obj/structure/holosign/barrier/combifan/Initialize(mapload)
.=..()
update_nearby_tiles()
/obj/structure/holosign/barrier/medical
name = "\improper Vey-Med holobarrier"
desc = "A holobarrier that uses biometrics to detect viruses. Denies passing to personnel with easily-detected, malicious viruses. Good for quarantines."
icon_state = "holo_medical"
alpha = 125
var/buzzed = 0
/obj/structure/holosign/barrier/medical/CanPass(atom/movable/mover, border_dir)
. = ..()
if(mover.has_buckled_mobs())
for(var/mob/living/L as anything in buckled_mobs)
if(ishuman(L))
if(CheckHuman(L))
return FALSE
if(ishuman(mover))
return CheckHuman(mover)
return TRUE
/obj/structure/holosign/barrier/medical/Bumped(atom/movable/AM)
. = ..()
if(ishuman(AM) && !CheckHuman(AM))
if(buzzed < world.time)
playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 1)
buzzed = (world.time + 60)
icon_state = "holo_medical-deny"
addtimer(VARSET_CALLBACK(src, icon_state, "holo_medical"), 10 SECONDS, TIMER_DELETE_ME)
/obj/structure/holosign/barrier/medical/proc/CheckHuman(mob/living/carbon/human/H)
if(istype(H.get_species(), SPECIES_XENOCHIMERA))
return FALSE
if(H.GetViruses())
for(var/datum/disease/D in H.GetViruses())
if(D.severity == NONTHREAT)
continue
return FALSE
return TRUE