diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 5bf3ff38129d..fab52f9408d2 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -1148,14 +1148,29 @@ var/list/discounted_items_of_the_round = list()
/datum/uplink_item/jobspecific/clown_mime/invisible_spray
name = "Can of Invisible Spray"
desc = "Spray something to render it invisible for five minutes! Can only be used once. Permanence not guaranteed when exposed to water, may not render all parts invisible, especially for humans."
- item = /obj/item/weapon/invisible_spray
+ item = /obj/item/weapon/syndie_spray/invisible_spray
+ cost = 6
+ jobs_excluded = list("Clown", "Mime")
+
+/datum/uplink_item/jobspecific/clown_mime/silent_spray
+ name = "Can of Silencing Spray"
+ desc = "Spray something to render it silent for five minutes! Can only be used once. Permanence not guaranteed when exposed to water."
+ item = /obj/item/weapon/syndie_spray/silent_spray
cost = 6
jobs_excluded = list("Clown", "Mime")
/datum/uplink_item/jobspecific/clown_mime/invisible_spray/permanent
name = "Can of Permanent Invisible Spray"
desc = "Spray something to render it permanently invisible! Can only be used once. Permanence not guaranteed when exposed to water, may not render all parts invisible, especially for humans."
- item = /obj/item/weapon/invisible_spray/permanent
+ item = /obj/item/weapon/syndie_spray/invisible_spray/permanent
+ cost = 4
+ jobs_excluded = list()
+ jobs_exclusive = list("Clown", "Mime")
+
+/datum/uplink_item/jobspecific/clown_mime/silent_spray/permanent
+ name = "Can of Permanent Silencing Spray"
+ desc = "Spray something to render it permanently silent! Can only be used once. Permanence not guaranteed when exposed to water."
+ item = /obj/item/weapon/syndie_spray/silent_spray/permanent
cost = 4
jobs_excluded = list()
jobs_exclusive = list("Clown", "Mime")
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index be61d4d353f2..8d6e4695019a 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -58,6 +58,7 @@ var/global/list/ghdel_profiling = list()
var/arcanetampered = 0 //A looot of things can be
+
var/image/moody_light
var/list/moody_lights
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index a0ed0d8210f1..def3709762f7 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -59,6 +59,8 @@
var/atom/movable/border_dummy/border_dummy //Used for border objects. The old Uncross() method fails miserably with pixel movement or large hitboxes.
+ var/silence_sprayed = FALSE //sprayed by silencing spray
+
/atom/movable/New()
. = ..()
if((flags & HEAR) && !ismob(src))
@@ -1350,3 +1352,12 @@
change_dir(new_dir)
sleep(1)
change_dir(prev_dir)
+
+/atom/movable/proc/make_silent(var/duration)
+ silence_sprayed = TRUE
+ if(duration > 0)
+ spawn(duration)
+ silence_sprayed = FALSE
+
+/atom/movable/proc/remove_silence()
+ silence_sprayed = FALSE
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index 29308dbfe1fc..62217073bf0e 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -418,20 +418,21 @@
..()
H.reagents.add_reagent(TOXIN,1)
-/obj/item/weapon/invisible_spray
- name = "can of invisible spray"
- desc = "A can of... invisibility? The label reads: \"Wears off after five minutes.\""
+/obj/item/weapon/syndie_spray
+ name = "syndicate spray"
+ desc = "A can of... nothing?"
icon = 'icons/obj/items.dmi'
icon_state = "invisible_spray"
flags = FPRINT
w_class = W_CLASS_SMALL
var/permanent = 0
- var/invisible_time = 5 MINUTES
+ var/effect_time = 5 MINUTES
var/sprays_left = 1
+ var/effect_adjective = ""
var/static/list/prohibited_objects = list( //For fun removal
)
-/obj/item/weapon/invisible_spray/examine(var/mob/user)
+/obj/item/weapon/syndie_spray/examine(var/mob/user)
..()
if(loc != user)
return
@@ -440,8 +441,7 @@
else
to_chat(user, "The can feels empty.")
-
-/obj/item/weapon/invisible_spray/preattack(atom/movable/target, mob/user, proximity_flag, click_parameters)
+/obj/item/weapon/syndie_spray/preattack(atom/movable/target, mob/user, proximity_flag, click_parameters)
if (!proximity_flag)
return 0
if(!istype(target))
@@ -449,8 +449,8 @@
if(!sprays_left)
to_chat(user, "\The [src] is empty.")
return
- if(target.invisibility || target.alpha <= 1)
- to_chat(user, "\The [target] is already invisible!")
+ if(effect_active(target))
+ to_chat(user, "\The [target] is already [effect_adjective]!")
return
if(is_type_in_list(target,prohibited_objects))
to_chat(user, "For some reason, you don't think that would work.")
@@ -461,35 +461,91 @@
to_chat(user, "\The [src] is empty.")
return
if(permanent)
- invisible_time = 0
+ effect_time = 0
var/mob/M = target
if(M == user)
to_chat(user, "You spray yourself with \the [src].")
- user.make_invisible(INVISIBLESPRAY, invisible_time, FALSE, 1)
+ apply_spray_effect(user, effect_time)
else if (ismob(M))
to_chat(user, "You spray [M] with \the [src].")
- M.make_invisible(INVISIBLESPRAY, invisible_time, FALSE, 1)
+ apply_spray_effect(M, effect_time)
var/obj/O = target
if(isobj(O))
if(locate(O) in get_contents_in_object(user))
- O.make_invisible(INVISIBLESPRAY, invisible_time, 1)
+ apply_spray_effect(O, effect_time)
else
- O.make_invisible(INVISIBLESPRAY, invisible_time, 1)
+ apply_spray_effect(O, effect_time)
to_chat(user, "You spray \the [O] with \the [src].")
-
playsound(src, 'sound/effects/spray2.ogg', 50, 1, -6)
sprays_left--
+ return 1
+
+/obj/item/weapon/syndie_spray/proc/effect_active(atom/movable/target)
+ return 0
+
+/obj/item/weapon/syndie_spray/proc/apply_spray_effect(atom/movable/target,var/duration)
+ return 1
+
+/obj/item/weapon/syndie_spray/invisible_spray
+ name = "can of invisible spray"
+ desc = "A can of... invisibility? The label reads: \"Wears off after five minutes.\""
+ icon_state = "invisible_spray"
+ effect_adjective = "invisible"
+
+/obj/item/weapon/syndie_spray/invisible_spray/effect_active(atom/movable/target)
+ if(target.invisibility || target.alpha <= 1)
+ return 1
+
+/obj/item/weapon/syndie_spray/invisible_spray/apply_spray_effect(atom/movable/target, duration)
+ if(ismob(target))
+ var/mob/M = target
+ M.make_invisible(INVISIBLESPRAY, duration, FALSE, 1)
+ return 1
+ else if(isobj(target))
+ var/obj/O = target
+ O.make_invisible(INVISIBLESPRAY, duration, FALSE, 1)
+ return 1
+
+/obj/item/weapon/syndie_spray/invisible_spray/preattack(atom/movable/target, mob/user, proximity_flag, click_parameters)
+ if(!..())
+ return
if(istype(target, /obj/machinery/power/supermatter))
return 0
if(istype(target, /obj/machinery/singularity))
animate(target, color = grayscale, time = 6 SECONDS)
return 0
- return 1
-/obj/item/weapon/invisible_spray/permanent
+/obj/item/weapon/syndie_spray/invisible_spray/permanent
desc = "A can of... invisibility?"
permanent = 1
+/obj/item/weapon/syndie_spray/silent_spray
+ name = "can of silencing spray"
+ desc = "A can of... silence? The label reads: \"Wears off after five minutes.\""
+ icon_state = "silent_spray"
+ effect_adjective = "silent"
+
+/obj/item/weapon/syndie_spray/silent_spray/effect_active(atom/movable/target)
+ if(target.silence_sprayed)
+ return 1
+
+/obj/item/weapon/syndie_spray/silent_spray/apply_spray_effect(atom/movable/target, duration)
+ target.make_silent(duration)
+ return 1
+
+/obj/item/weapon/syndie_spray/silent_spray/preattack(atom/movable/target, mob/user, proximity_flag, click_parameters)
+ if(!..())
+ return
+ if(istype(target, /obj/machinery/power/supermatter))
+ return 0
+ if(istype(target, /obj/machinery/singularity))
+ animate(target, color = grayscale, time = 6 SECONDS)
+ return 0
+
+/obj/item/weapon/syndie_spray/silent_spray/permanent
+ desc = "A can of... silence?"
+ permanent = 1
+
/obj/item/weapon/razor
name = "electric razor"
desc = "The latest and greatest power razor born from the science of shaving."
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 906291095ac7..08b8e3a6bcac 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -21,6 +21,7 @@
new /obj/item/weapon/pen/paralysis(src)
new /obj/item/device/chameleon(src)
new /obj/item/weapon/soap/syndie(src)
+ new /obj/item/weapon/syndie_spray/silent_spray(src)
if("Screwed")//6?+6?+10+4=26
new /obj/effect/spawner/newbomb/timer(src)
@@ -175,7 +176,7 @@
new /obj/item/weapon/spellbook/oneuse/mutate/highlander(src)
if("Clown") //4 + 4 + 6 + 14 + 6 + ? = 34?
- new /obj/item/weapon/invisible_spray/permanent(src)
+ new /obj/item/weapon/syndie_spray/invisible_spray/permanent(src)
new /obj/item/weapon/glue(src)
new /obj/item/weapon/glue(src)
new /obj/item/weapon/gun/hookshot/whip/windup_box/clownbox(src)
diff --git a/code/game/say.dm b/code/game/say.dm
index c28439b12b07..ab23b518cb2d 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -39,6 +39,8 @@ var/global/lastDecTalkUse = 0
return
/atom/movable/proc/can_speak()
+ if(silence_sprayed)
+ return
return 1
/atom/movable/proc/send_speech(var/datum/speech/speech, var/range=7, var/bubble_type)
@@ -378,4 +380,4 @@ var/global/resethearers = 0
if(turf)
for(var/mob/virtualhearer/VH in hearers(radio.canhear_range, turf))
- . |= VH.attached
\ No newline at end of file
+ . |= VH.attached
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 094036b4e025..3771df8fa312 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -63,6 +63,10 @@ var/list/trayhit_sound = list('sound/items/trayhit1.ogg', 'sound/items/trayhit2.
extrarange = 0
if(!vol) //don't do that
return
+ if(istype(source,/atom/movable))
+ var/atom/movable/AM = source
+ if(AM.silence_sprayed) //shhhh
+ return
if(turf_source)
vol *= turf_source.volume_mult
diff --git a/code/modules/reagents/reagents/reagents_basic.dm b/code/modules/reagents/reagents/reagents_basic.dm
index 458dfb29aee1..bd6c50e9679e 100644
--- a/code/modules/reagents/reagents/reagents_basic.dm
+++ b/code/modules/reagents/reagents/reagents_basic.dm
@@ -263,11 +263,13 @@
var/mob/living/carbon/C = M
var/datum/disease2/effect/E = C.has_active_symptom(/datum/disease2/effect/thick_skin)
C.make_visible(INVISIBLESPRAY,FALSE)
+ M.remove_silence()
if(E)
E.multiplier = max(E.multiplier - rand(1,3), 1)
to_chat(C, "The water quenches your dry skin.")
else
M.make_visible(INVISIBLESPRAY)
+ M.remove_silence()
if(isliving(M))
var/mob/living/L = M
L.ExtinguishMob()
@@ -325,6 +327,8 @@
if(O.invisibility)
O.make_visible(INVISIBLESPRAY)
+ O.remove_silence()
+
O.clean_act(CLEANLINESS_WATER)//removes glue and extinguishes fire
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index df49ac48177e..618059aba3f6 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/maps/RandomZLevels/hive.dm b/maps/RandomZLevels/hive.dm
index 46cb19b2faf6..51454c49125c 100644
--- a/maps/RandomZLevels/hive.dm
+++ b/maps/RandomZLevels/hive.dm
@@ -58,7 +58,7 @@
/obj/item/weapon/gun/stickybomb,
/obj/item/weapon/gun/projectile/rocketlauncher/nikita,
/obj/item/weapon/cloakingcloak/hive,
- /obj/item/weapon/invisible_spray,
+ /obj/item/weapon/syndie_spray/invisible_spray,
/obj/item/clothing/gloves/powerfist,
/obj/item/clothing/glasses/hud/thermal/eyepatch
)
diff --git a/maps/RandomZLevels/hive.dmm b/maps/RandomZLevels/hive.dmm
index 690299cbfdb7..63938db94792 100644
--- a/maps/RandomZLevels/hive.dmm
+++ b/maps/RandomZLevels/hive.dmm
@@ -1077,7 +1077,7 @@
/turf/unsimulated/floor/evil,
/area/awaymission/hive)
"ep" = (
-/obj/item/weapon/invisible_spray,
+/obj/item/weapon/syndie_spray/invisible_spray,
/turf/unsimulated/floor/evil/breathing,
/area/awaymission/hive)
"eq" = (