diff --git a/code/game/objects/items/weapons/holosign.dm b/code/game/objects/items/weapons/holosign.dm
index 72f11f6f992..9e0d05549ce 100644
--- a/code/game/objects/items/weapons/holosign.dm
+++ b/code/game/objects/items/weapons/holosign.dm
@@ -1,6 +1,6 @@
/obj/item/holosign_creator
name = "holographic sign projector"
- desc = "A handy-dandy holographic projector that displays a janitorial sign."
+ desc = "This shouldnt exist, if it does, tell a coder"
icon = 'icons/obj/device.dmi'
icon_state = "signmaker"
item_state = "electronic"
@@ -15,7 +15,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/holosign_type = null
var/holocreator_busy = FALSE //to prevent placing multiple holo barriers at once
/obj/item/holosign_creator/afterattack(atom/target, mob/user, flag)
@@ -46,6 +46,7 @@
return
H = new holosign_type(get_turf(target), src)
to_chat(user, "You create [H] with [src].")
+ return H
else
to_chat(user, "[src] is projecting at max capacity!")
@@ -58,6 +59,30 @@
qdel(H)
to_chat(user, "You clear all active holograms.")
+/obj/item/holosign_creator/janitor
+ name = "Janitorial Holosign projector"
+ desc = "A handy-dandy holographic projector that displays a janitorial sign."
+ holosign_type = /obj/structure/holosign/wetsign
+ var/wet_enabled = FALSE
+
+/obj/item/holosign_creator/janitor/AltClick(mob/user)
+ wet_enabled = !wet_enabled
+ playsound(loc, 'sound/weapons/empty.ogg', 20)
+ if(wet_enabled)
+ to_chat(user, "You enable the W.E.T. (wet evaporation timer)\nAny newly placed holographic signs will clear after the likely time it takes for a mopped tile to dry.")
+ else
+ to_chat(user, "You disable the W.E.T. (wet evaporation timer)\nAny newly placed holographic signs will now stay indefinitely.")
+
+/obj/item/holosign_creator/janitor/examine(mob/user)
+ . = ..()
+ if(ishuman(user))
+ . += "Alt Click to [wet_enabled ? "deactivate" : "activate"] its built-in wet evaporation timer."
+
+
+/obj/item/holosign_creator/janitor/afterattack(atom/target, mob/user, flag)
+ var/obj/structure/holosign/wetsign/WS = ..()
+ if(WS && wet_enabled)
+ WS.wet_timer_start(src)
/obj/item/holosign_creator/security
name = "security holobarrier projector"
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 3221f0f637c..a833f591972 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -24,6 +24,17 @@
GLOB.janitorial_equipment -= src
return ..()
+/obj/item/mop/proc/wet_mop(obj/o, mob/user)
+ if(o.reagents.total_volume < 1)
+ to_chat(user, "[o] is out of water!")
+ if(!istype(o, /obj/item/reagent_containers/glass/bucket))
+ janicart_insert(user, o)
+ return
+
+ o.reagents.trans_to(src, 5)
+ to_chat(user, "You wet [src] in [o].")
+ playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
+
/obj/item/mop/proc/clean(turf/simulated/A)
if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1))
A.clean_blood()
@@ -42,7 +53,7 @@
var/turf/simulated/T = get_turf(A)
- if(istype(A, /obj/item/reagent_containers/glass/bucket) || istype(A, /obj/structure/janitorialcart))
+ if(istype(A, /obj/item/reagent_containers/glass/bucket) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/structure/mopbucket))
return
if(istype(T))
@@ -52,14 +63,12 @@
to_chat(user, "You finish mopping.")
clean(T)
-
/obj/effect/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/mop) || istype(I, /obj/item/soap))
return
else
return ..()
-
/obj/item/mop/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J)
J.put_in_cart(src, user)
J.mymop=src
@@ -113,7 +122,6 @@
STOP_PROCESSING(SSobj, src)
return ..()
-
/obj/item/mop/advanced/cyborg
/obj/item/mop/advanced/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 1d2334a69eb..821e8e1f936 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -402,14 +402,14 @@
/obj/item/flashlight,
/obj/item/reagent_containers/spray,
/obj/item/soap,
- /obj/item/holosign_creator,
+ /obj/item/holosign_creator/janitor,
/obj/item/melee/flyswatter,
/obj/item/storage/bag/trash
)
/obj/item/storage/belt/janitor/full/populate_contents()
new /obj/item/lightreplacer(src)
- new /obj/item/holosign_creator(src)
+ new /obj/item/holosign_creator/janitor(src)
new /obj/item/reagent_containers/spray/cleaner(src)
new /obj/item/soap(src)
new /obj/item/grenade/chem_grenade/cleaner(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 505ae16b3f7..7a1e8aa515d 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -89,8 +89,8 @@
new /obj/item/storage/bag/trash(src)
new /obj/item/lightreplacer(src)
new /obj/item/lightreplacer(src)
- new /obj/item/holosign_creator(src)
- new /obj/item/holosign_creator(src)
+ new /obj/item/holosign_creator/janitor(src)
+ new /obj/item/holosign_creator/janitor(src)
new /obj/item/watertank/janitor(src)
new /obj/item/watertank/janitor(src)
new /obj/item/storage/belt/janitor(src)
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index 13b5ba64140..ec57df2adf0 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -41,6 +41,13 @@
desc = "The words flicker as if they mean nothing."
icon_state = "holosign"
+/obj/structure/holosign/wetsign/proc/wet_timer_start(obj/item/holosign_creator/HS_C)
+ addtimer(CALLBACK(src, .proc/wet_timer_finish, HS_C), 82 SECONDS, TIMER_UNIQUE)
+
+/obj/structure/holosign/wetsign/proc/wet_timer_finish(obj/item/holosign_creator/HS_C)
+ playsound(HS_C.loc, 'sound/machines/chime.ogg', 20, 1)
+ qdel(src)
+
/obj/structure/holosign/barrier
name = "holo barrier"
desc = "A short holographic barrier which can only be passed by walking."
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 5c9b3393808..7cd8f5c1917 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -32,21 +32,15 @@
QDEL_NULL(myreplacer)
return ..()
-/obj/structure/janitorialcart/proc/wet_mop(obj/item/mop, mob/user)
- if(reagents.total_volume < 1)
- to_chat(user, "[src] is out of water!")
- else
- reagents.trans_to(mop, 5) //
- to_chat(user, "You wet [mop] in [src].")
- playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
-
/obj/structure/janitorialcart/proc/put_in_cart(obj/item/I, mob/user)
user.drop_item()
- I.loc = src
+ I.forceMove(src)
updateUsrDialog()
to_chat(user, "You put [I] into [src].")
return
+/obj/structure/janitorialcart/on_reagent_change()
+ update_icon()
/obj/structure/janitorialcart/attackby(obj/item/I, mob/user, params)
var/fail_msg = "There is already one of those in [src]."
@@ -55,7 +49,7 @@
if(istype(I, /obj/item/mop))
var/obj/item/mop/m=I
if(m.reagents.total_volume < m.reagents.maximum_volume)
- wet_mop(m, user)
+ m.wet_mop(src, user)
return
if(!mymop)
m.janicart_insert(user, src)
@@ -185,3 +179,17 @@
overlays += "cart_replacer"
if(signs)
overlays += "cart_sign[signs]"
+ if(reagents.total_volume > 0)
+ var/image/reagentsImage = image(icon,src,"cart_reagents0")
+ reagentsImage.alpha = 150
+ switch((reagents.total_volume/reagents.maximum_volume)*100)
+ if(1 to 25)
+ reagentsImage.icon_state = "cart_reagents1"
+ if(26 to 50)
+ reagentsImage.icon_state = "cart_reagents2"
+ if(51 to 75)
+ reagentsImage.icon_state = "cart_reagents3"
+ if(76 to 100)
+ reagentsImage.icon_state = "cart_reagents4"
+ reagentsImage.icon += mix_color_from_reagents(reagents.reagent_list)
+ add_overlay(reagentsImage)
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index cec34f384df..a99832bae49 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -5,6 +5,8 @@
icon_state = "mopbucket"
density = 1
container_type = OPENCONTAINER
+ face_while_pulling = FALSE
+ var/obj/item/mop/mymop = null
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
/obj/structure/mopbucket/Initialize(mapload)
@@ -27,11 +29,52 @@
/obj/structure/mopbucket/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/mop))
- if(src.reagents.total_volume >= 2)
- src.reagents.trans_to(W, 2)
- to_chat(user, "You wet the mop")
- playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1)
- if(src.reagents.total_volume < 1)
- to_chat(user, "Out of water!")
+ var/obj/item/mop/m = W
+ if(m.reagents.total_volume < m.reagents.maximum_volume)
+ m.wet_mop(src, user)
+ return
+ if(!mymop)
+ m.janicart_insert(user, src)
+ return
+ to_chat(user, "Theres already a mop in the mopbucket.")
return
return ..()
+
+/obj/structure/mopbucket/proc/put_in_cart(obj/item/mop/I, mob/user)
+ user.drop_item()
+ I.forceMove(src)
+ to_chat(user, "You put [I] into [src].")
+ return
+
+/obj/structure/mopbucket/on_reagent_change()
+ update_icon()
+
+/obj/structure/mopbucket/update_icon()
+ overlays.Cut()
+ if(mymop)
+ overlays += image(icon,"mopbucket_mop")
+ if(reagents.total_volume > 0)
+ var/image/reagentsImage = image(icon, src, "mopbucket_reagents0")
+ reagentsImage.alpha = 150
+ switch((reagents.total_volume/reagents.maximum_volume)*100)
+ if(1 to 25)
+ reagentsImage.icon_state = "mopbucket_reagents1"
+ if(26 to 50)
+ reagentsImage.icon_state = "mopbucket_reagents2"
+ if(51 to 75)
+ reagentsImage.icon_state = "mopbucket_reagents3"
+ if(76 to 100)
+ reagentsImage.icon_state = "mopbucket_reagents4"
+ reagentsImage.icon += mix_color_from_reagents(reagents.reagent_list)
+ add_overlay(reagentsImage)
+
+/obj/structure/mopbucket/attack_hand(mob/living/user)
+ . = ..()
+ if(mymop)
+ user.put_in_hands(mymop)
+ to_chat(user, "You take [mymop] from [src].")
+ mymop = null
+ update_icon()
+ return
+
+
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 66baf0cbbc6..ebe9152add1 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -419,7 +419,7 @@
/obj/item/storage/bag/trash/cyborg,
/obj/item/mop/advanced/cyborg,
/obj/item/lightreplacer/cyborg,
- /obj/item/holosign_creator,
+ /obj/item/holosign_creator/janitor,
/obj/item/extinguisher/mini
)
emag_modules = list(/obj/item/reagent_containers/spray/cyborg_lube, /obj/item/restraints/handcuffs/cable/zipties/cyborg)
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 5c64a4782ba..7dc15e82155 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -283,7 +283,6 @@
/obj/item/reagent_containers/glass/beaker/drugs/meth
list_reagents = list("methamphetamine" = 10)
-
/obj/item/reagent_containers/glass/bucket
desc = "It's a bucket."
name = "bucket"
@@ -317,6 +316,10 @@
reagents.clear_reagents()
/obj/item/reagent_containers/glass/bucket/attackby(obj/D, mob/user, params)
+ if(istype(D, /obj/item/mop))
+ var/obj/item/mop/m = D
+ m.wet_mop(src, user)
+ return
if(isprox(D))
to_chat(user, "You add [D] to [src].")
qdel(D)
diff --git a/code/modules/research/designs/janitorial_designs.dm b/code/modules/research/designs/janitorial_designs.dm
index 8ac988a51e9..9b06e77d04e 100644
--- a/code/modules/research/designs/janitorial_designs.dm
+++ b/code/modules/research/designs/janitorial_designs.dm
@@ -32,13 +32,13 @@
category = list("Janitorial")
/datum/design/holosign
- name = "Holographic Sign Projector"
- desc = "A holograpic projector used to project various warning signs."
+ name = "Janitorial Holographic Sign Projector"
+ desc = "A holograpic projector used to project wet warning signs."
id = "holosign"
req_tech = list("programming" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000, MAT_GLASS = 1000)
- build_path = /obj/item/holosign_creator
+ build_path = /obj/item/holosign_creator/janitor
category = list("Janitorial")
/datum/design/light_replacer
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index e9182fd0cb3..c04b4a1f8ab 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -296,7 +296,7 @@
/obj/item/organ/internal/cyberimp/arm/janitorial
name = "janitorial toolset implant"
desc = "A set of janitorial tools hidden behind a concealed panel on the user's arm"
- contents = newlist(/obj/item/mop/advanced, /obj/item/soap, /obj/item/lightreplacer, /obj/item/holosign_creator, /obj/item/melee/flyswatter, /obj/item/reagent_containers/spray/cleaner/safety)
+ contents = newlist(/obj/item/mop/advanced, /obj/item/soap, /obj/item/lightreplacer, /obj/item/holosign_creator/janitor, /obj/item/melee/flyswatter, /obj/item/reagent_containers/spray/cleaner/safety)
origin_tech = "materials=3;engineering=4;biotech=3"
action_icon = list(/datum/action/item_action/organ_action/toggle = 'icons/obj/clothing/belts.dmi')
action_icon_state = list(/datum/action/item_action/organ_action/toggle = "janibelt")
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 09f8a6cc748..0f05067b4f3 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index e2a1f7cfae2..65a688c8543 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ