diff --git a/aurorastation.dme b/aurorastation.dme
index b6aa3c4d96d..dbdfd1fb4f3 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -833,7 +833,6 @@
#include "code\game\objects\items\weapons\cards_ids_syndicate.dm"
#include "code\game\objects\items\weapons\cigs_lighters.dm"
#include "code\game\objects\items\weapons\cloaking_device.dm"
-#include "code\game\objects\items\weapons\clown_items.dm"
#include "code\game\objects\items\weapons\cosmetics.dm"
#include "code\game\objects\items\weapons\dice.dm"
#include "code\game\objects\items\weapons\dna_injector.dm"
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 44c3dd553c1..7d95f8bbddd 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -37,6 +37,15 @@
attack_verb = list("HONKED")
var/spam_flag = 0
+/obj/item/weapon/bikehorn/attack_self(mob/user as mob)
+ if (spam_flag == 0)
+ spam_flag = 1
+ playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
+ src.add_fingerprint(user)
+ spawn(20)
+ spam_flag = 0
+ return
+
/obj/item/weapon/cane
name = "cane"
desc = "A cane used by a true gentlemen. Or a clown."
diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm
deleted file mode 100644
index 682d0104dac..00000000000
--- a/code/game/objects/items/weapons/clown_items.dm
+++ /dev/null
@@ -1,94 +0,0 @@
-/* Clown Items
- * Contains:
- * Banana Peels
- * Soap
- * Bike Horns
- */
-
-/*
- * Banana Peals
- */
-/obj/item/weapon/bananapeel/Crossed(AM as mob|obj)
- if (istype(AM, /mob/living))
- var/mob/living/M = AM
- M.slip("the [src.name]",4)
-/*
- * Soap
- */
-/obj/item/weapon/soap/New()
- ..()
- create_reagents(10)
- wet()
-
-/obj/item/weapon/soap/proc/wet()
- playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
- reagents.add_reagent("cleaner", 10)
-
-/obj/item/weapon/soap/attackby(var/obj/item/I, var/mob/user)
- if(istype(I, /obj/item/weapon/key))
- if(!key_data)
- to_chat(user, "You imprint \the [I] into \the [src].")
- var/obj/item/weapon/key/K = I
- key_data = K.key_data
- update_icon()
- return
- ..()
-
-/obj/item/weapon/soap/update_icon()
- overlays.Cut()
- if(key_data)
- overlays += image('icons/obj/items.dmi', icon_state = "soap_key_overlay")
-
-/obj/item/weapon/soap/Crossed(AM as mob|obj)
- if (istype(AM, /mob/living))
- var/mob/living/M = AM
- M.slip("the [src.name]",3)
-
-/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity)
- if(!proximity) return
- //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing.
- //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
- if(user.client && (target in user.client.screen))
- to_chat(user, "You need to take that [target.name] off before cleaning it.")
- else if(istype(target,/obj/effect/decal/cleanable))
- to_chat(user, "You scrub \the [target.name] out.")
- qdel(target)
- else if(istype(target,/turf))
- to_chat(user, "You start scrubbing the [target.name]")
- if (do_after(user, 30, needhand = 0))
- to_chat(user, "You scrub \the [target.name] clean.")
- var/turf/T = target
- T.clean(src, user)
- else if(istype(target,/obj/structure/sink) || istype(target,/obj/structure/sink))
- to_chat(user, "You wet \the [src] in the sink.")
- wet()
- else if (istype(target, /obj/structure/mopbucket) || istype(target, /obj/item/weapon/reagent_containers/glass) || istype(target, /obj/structure/reagent_dispensers/watertank))
- if (target.reagents && target.reagents.total_volume)
- to_chat(user, "You wet \the [src] in the [target].")
- wet()
- else
- to_chat(user, "\The [target] is empty!")
- else
- to_chat(user, "You clean \the [target.name].")
- target.clean_blood()
- return
-
-//attack_as_weapon
-/obj/item/weapon/soap/attack(mob/living/target, mob/living/user, var/target_zone)
- if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" )
- user.visible_message("\The [user] washes \the [target]'s mouth out with soap!")
- user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //prevent spam
- return
- ..()
-
-/*
- * Bike Horns
- */
-/obj/item/weapon/bikehorn/attack_self(mob/user as mob)
- if (spam_flag == 0)
- spam_flag = 1
- playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
- src.add_fingerprint(user)
- spawn(20)
- spam_flag = 0
- return
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 603602ce272..de98ea48d4e 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -6,15 +6,16 @@
item_state = "mop"
force = 3.0
throwforce = 10.0
- throw_speed = 5
- throw_range = 10
+ throw_speed = 3
+ throw_range = 7
w_class = 3.0
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
var/mopping = 0
var/mopcount = 0
+ var/cleantime = 25
-/obj/item/weapon/mop/New()
- ..()
+/obj/item/weapon/mop/Initialize()
+ . = ..()
create_reagents(30)
janitorial_supplies |= src
@@ -23,21 +24,21 @@
return ..()
/obj/item/weapon/mop/afterattack(atom/A, mob/user, proximity)
- update_icon()
if(!proximity) return
if(istype(A, /turf) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune))
if(reagents.total_volume < 1)
to_chat(user, "Your mop is dry!")
return
- user.visible_message("[user] begins to clean \the [get_turf(A)].")
+ user.visible_message("[user] begins to mop \the [get_turf(A)].")
playsound(loc, 'sound/effects/mop.ogg', 25, 1)
- if(do_after(user, 40))
+ if(do_after(user, cleantime))
var/turf/T = get_turf(A)
if(T)
T.clean(src, user)
to_chat(user, "You have finished mopping!")
+ update_icon()
/obj/effect/attackby(obj/item/I, mob/user)
@@ -47,11 +48,52 @@
/obj/item/weapon/mop/update_icon()
if(reagents.total_volume < 1)
- icon_state = "mop"
- item_state = "mop"
+ icon_state = "[initial(icon_state)]"
+ item_state = icon_state
if(reagents.total_volume > 1)
- icon_state = "mop_wet"
- item_state = "mop_wet"
+ icon_state = "[initial(icon_state)]_wet"
+ item_state = icon_state
/obj/item/weapon/mop/on_reagent_change()
update_icon()
+
+/obj/item/weapon/mop/advanced
+ name = "advanced mop"
+ desc = "The most advanced tool in a custodian's arsenal, complete with a condenser for self-wetting! Just think of all the viscera you will clean up with this!"
+ icon = 'icons/obj/janitor.dmi'
+ icon_state = "advmop"
+ item_state = "advmop"
+ force = 6.0
+ throwforce = 14
+ throw_range = 8
+ cleantime = 15
+ var/refill_enabled = TRUE //Self-refill toggle for when a janitor decides to mop with something other than water.
+ var/refill_rate = 0.5 //Rate per process() tick mop refills itself
+ var/refill_reagent = "water" //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING
+
+/obj/item/weapon/mop/advanced/New()
+ ..()
+ START_PROCESSING(SSprocessing, src)
+
+/obj/item/weapon/mop/advanced/attack_self(mob/user)
+ refill_enabled = !refill_enabled
+ if(refill_enabled)
+ START_PROCESSING(SSprocessing, src)
+ else
+ STOP_PROCESSING(SSprocessing,src)
+ to_chat(user, "You set the condenser switch to the '[refill_enabled ? "ON" : "OFF"]' position.")
+ playsound(user, 'sound/machines/click.ogg', 25, 1)
+
+/obj/item/weapon/mop/advanced/process()
+ if(reagents.total_volume < 30)
+ reagents.add_reagent(refill_reagent, refill_rate)
+
+/obj/item/weapon/mop/advanced/examine(mob/user)
+ ..()
+ to_chat(user, "The condenser switch is set to [refill_enabled ? "ON" : "OFF"].")
+
+/obj/item/weapon/mop/advanced/Destroy()
+ if(refill_enabled)
+ STOP_PROCESSING(SSprocessing, src)
+ return ..()
+
diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm
index 60ea7d0944b..e8f2b76fc73 100644
--- a/code/game/objects/items/weapons/soap.dm
+++ b/code/game/objects/items/weapons/soap.dm
@@ -6,6 +6,7 @@
gender = PLURAL
icon = 'icons/obj/soap.dmi'
icon_state = "soap"
+ item_state = "soap"
w_class = 2.0
throwforce = 0
throw_speed = 4
@@ -14,15 +15,81 @@
var/key_data
drop_sound = 'sound/misc/slip.ogg'
+/obj/item/weapon/soap/New()
+ ..()
+ create_reagents(10)
+ wet()
+
+/obj/item/weapon/soap/proc/wet()
+ playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
+ reagents.add_reagent("cleaner", 10)
+
+/obj/item/weapon/soap/attackby(var/obj/item/I, var/mob/user)
+ if(istype(I, /obj/item/weapon/key))
+ if(!key_data)
+ to_chat(user, "You imprint \the [I] into \the [src].")
+ var/obj/item/weapon/key/K = I
+ key_data = K.key_data
+ update_icon()
+ return
+ ..()
+
+/obj/item/weapon/soap/update_icon()
+ overlays.Cut()
+ if(key_data)
+ overlays += image('icons/obj/items.dmi', icon_state = "soap_key_overlay")
+
+/obj/item/weapon/soap/Crossed(AM as mob|obj)
+ if (istype(AM, /mob/living))
+ var/mob/living/M = AM
+ M.slip("the [src.name]",3)
+
+/obj/item/weapon/soap/afterattack(atom/target, mob/user as mob, proximity)
+ if(!proximity) return
+ //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing.
+ //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
+ if(user.client && (target in user.client.screen))
+ to_chat(user, "You need to take that [target.name] off before cleaning it.")
+ else if(istype(target,/obj/structure/sink) || istype(target,/obj/structure/sink))
+ to_chat(user, "You wet \the [src] in the sink.")
+ wet()
+ else if (istype(target, /obj/structure/mopbucket) || istype(target, /obj/item/weapon/reagent_containers/glass) || istype(target, /obj/structure/reagent_dispensers/watertank))
+ if (target.reagents && target.reagents.total_volume)
+ to_chat(user, "You wet \the [src] in the [target].")
+ wet()
+ else
+ to_chat(user, "\The [target] is empty!")
+ else
+ to_chat(user, "You start scrubbing the [target.name]")
+ playsound(loc, 'sound/effects/mop.ogg', 25, 1)
+ if (do_after(user, 25, needhand = 0))
+ target.clean_blood()
+ to_chat(user, "You scrub \the [target.name] out.")
+ if(istype(target, /turf) || istype(target, /obj/effect/decal/cleanable) || istype(target, /obj/effect/overlay))
+ var/turf/T = get_turf(target)
+ if(T)
+ T.clean(src, user)
+ return
+
+//attack_as_weapon
+/obj/item/weapon/soap/attack(mob/living/target, mob/living/user, var/target_zone)
+ if(target && user && ishuman(target) && ishuman(user) && !target.stat && !user.stat && user.zone_sel &&user.zone_sel.selecting == "mouth" )
+ user.visible_message("\The [user] washes \the [target]'s mouth out with soap!")
+ user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //prevent spam
+ return
+ ..()
+
/obj/item/weapon/soap/nanotrasen
desc = "A NanoTrasen-brand bar of soap. Smells of phoron."
icon_state = "soapnt"
+ item_state = "soapnt"
/obj/item/weapon/soap/plant
desc = "A green bar of soap. Smells like dirt and plants."
/obj/item/weapon/soap/deluxe
icon_state = "soapdeluxe"
+ item_state = "soapdeluxe"
/obj/item/weapon/soap/deluxe/Initialize()
@@ -32,6 +99,7 @@
/obj/item/weapon/soap/syndie
desc = "An untrustworthy bar of soap. Smells of fear."
icon_state = "soapsyndie"
+ item_state = "soapsyndie"
/obj/item/weapon/soap/space_soap
name = "Soap"
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index e78e1c6a134..bed93031068 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -78,6 +78,21 @@
return 1
..()
+/obj/item/weapon/storage/bag/trash/bluespace
+ name = "bluespace trash bag"
+ desc = "A highly advanced trashbag with a huge storage capacity!"
+ icon_state = "trashbagb0"
+
+ max_storage_space = 128
+
+/obj/item/weapon/storage/bag/trash/bluespace/update_icon()
+ if(contents.len == 0)
+ icon_state = "trashbagb0"
+ else if(contents.len < 42)
+ icon_state = "trashbagb1"
+ else if(contents.len < 84)
+ icon_state = "trashbagb2"
+ else icon_state = "trashbagb3"
// -----------------------------
// Plastic Bag
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 0681e9a5da8..b9619fcf5f2 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -233,15 +233,20 @@
w_class = 3
max_w_class = 3
can_hold = list(
- /obj/item/weapon/grenade/chem_grenade, //if I'm going to be doing a full allowance on one belt, I need to do the other.
- /obj/item/device/lightreplacer,
- /obj/item/device/flashlight,
- /obj/item/weapon/reagent_containers/spray,
- /obj/item/weapon/soap,
- /obj/item/weapon/storage/bag/trash,
+ /obj/item/weapon/crowbar,
/obj/item/weapon/screwdriver,
/obj/item/weapon/wrench,
- /obj/item/weapon/crowbar
+ /obj/item/device/flashlight,
+ /obj/item/weapon/extinguisher/mini,
+ /obj/item/device/radio,
+ /obj/item/clothing/gloves,
+ /obj/item/clothing/glasses/material,
+ /obj/item/weapon/reagent_containers/spray,
+ /obj/item/weapon/grenade/chem_grenade, //if I'm going to be doing a full allowance on one belt, I need to do the other.
+ /obj/item/device/lightreplacer,
+ /obj/item/weapon/soap,
+ /obj/item/weapon/storage/bag/trash,
+ /obj/item/weapon/reagent_containers/glass/rag
)
/obj/item/weapon/storage/belt/wands
@@ -273,7 +278,8 @@
storage_slots = 9
w_class = 4
max_w_class = 4 //Pickaxes are big.
- can_hold = list(/obj/item/weapon/crowbar,
+ can_hold = list(
+ /obj/item/weapon/crowbar,
/obj/item/weapon/screwdriver,
/obj/item/weapon/weldingtool,
/obj/item/weapon/wirecutters,
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 f5b21a1baac..0c9db7dca3d 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -86,6 +86,7 @@
new /obj/item/weapon/reagent_containers/spray/cleaner(src)
new /obj/item/weapon/reagent_containers/glass/rag(src)
new /obj/item/weapon/soap/nanotrasen(src)
+ new /obj/item/weapon/reagent_containers/glass/rag/advanced(src)
/*
* Lawyer
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 6d17adfbc62..e5d24084f24 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -271,6 +271,7 @@
if(mybucket)
mybucket.forceMove(get_turf(user))
to_chat(user, "You unmount [mybucket] from [src].")
+ mybucket.update_icon()
mybucket = null
update_icon()
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index 243fb503aae..8f8cbd5bf79 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -7,11 +7,11 @@
w_class = 3
flags = OPENCONTAINER
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
+ var/bucketsize = 360 //about 3x the size relative to a regular bucket.
-
-/obj/structure/mopbucket/New()
- ..()
- create_reagents(100)
+/obj/structure/mopbucket/Initialize()
+ . = ..()
+ create_reagents(bucketsize)
janitorial_supplies |= src
/obj/structure/mobbucket/Destroy()
diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm
index 8c0d2814b02..d7aa643cb1f 100644
--- a/code/modules/detectivework/tools/rag.dm
+++ b/code/modules/detectivework/tools/rag.dm
@@ -17,7 +17,7 @@
name = "rag"
desc = "For cleaning up messes, you suppose."
w_class = 1
- icon = 'icons/obj/toy.dmi'
+ icon = 'icons/obj/janitor.dmi'
icon_state = "rag"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(5)
@@ -28,11 +28,13 @@
var/on_fire = 0
var/burn_time = 20 //if the rag burns for too long it turns to ashes
+ var/cleantime = 30
drop_sound = 'sound/items/drop/clothing.ogg'
/obj/item/weapon/reagent_containers/glass/rag/Initialize()
. = ..()
update_name()
+ update_icon()
/obj/item/weapon/reagent_containers/glass/rag/Destroy()
STOP_PROCESSING(SSprocessing, src) //so we don't continue turning to ash while gc'd
@@ -58,6 +60,7 @@
. = ..()
update_name()
+ update_icon()
/obj/item/weapon/reagent_containers/glass/rag/proc/update_name()
if(on_fire)
@@ -69,14 +72,20 @@
/obj/item/weapon/reagent_containers/glass/rag/update_icon()
if(on_fire)
- icon_state = "raglit"
+ icon_state = "[initial(icon_state)]_lit"
+ else if(reagents.total_volume)
+ icon_state = "[initial(icon_state)]_wet"
else
- icon_state = "rag"
+ icon_state = "[initial(icon_state)]"
var/obj/item/weapon/reagent_containers/food/drinks/bottle/B = loc
if(istype(B))
B.update_icon()
+/obj/item/weapon/reagent_containers/glass/rag/on_reagent_change()
+ update_name()
+ update_icon()
+
/obj/item/weapon/reagent_containers/glass/rag/proc/remove_contents(mob/user, atom/trans_dest = null)
if(!trans_dest && !user.loc)
return
@@ -92,15 +101,18 @@
reagents.splash(user.loc, reagents.total_volume)
user.visible_message("\The [user] wrings out [src] over [target_text].", "You finish to wringing out [src].")
update_name()
+ update_icon()
/obj/item/weapon/reagent_containers/glass/rag/proc/wipe_down(atom/A, mob/user)
if(!reagents.total_volume)
to_chat(user, "The [initial(name)] is dry!")
else
user.visible_message("\The [user] starts to wipe down [A] with [src]!")
+ playsound(loc, 'sound/effects/mop.ogg', 25, 1)
reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping.
update_name()
- if(do_after(user,30))
+ update_icon()
+ if(do_after(user,cleantime))
user.visible_message("\The [user] finishes wiping off \the [A]!")
A.clean_blood()
@@ -153,6 +165,7 @@
//^HA HA HA
reagents.trans_to_mob(target, amount_per_transfer_from_this, CHEM_BREATHE)
update_name()
+ update_icon()
else
wipe_down(target, user)
return
@@ -172,6 +185,7 @@
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
user.visible_message("\The [user] soaks [src] using [A].", "You soak [src] using [A].")
update_name()
+ update_icon()
return
if(!on_fire && istype(A) && (src in user))
@@ -250,4 +264,17 @@
reagents.remove_reagent("fuel", reagents.maximum_volume/25)
update_name()
+ update_icon()
burn_time--
+
+/obj/item/weapon/reagent_containers/glass/rag/advanced
+ name = "microfiber cloth"
+ desc = "A synthetic fiber cloth; the split fibers and the size of the individual filaments make it more effective for cleaning purposes."
+ w_class = 1
+ icon = 'icons/obj/janitor.dmi'
+ icon_state = "advrag"
+ amount_per_transfer_from_this = 10
+ possible_transfer_amounts = list(5)
+ volume = 10
+ cleantime = 15
+
diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm
index f3c64dbf0cb..8613ecac61a 100644
--- a/code/modules/hydroponics/grown_inedible.dm
+++ b/code/modules/hydroponics/grown_inedible.dm
@@ -60,3 +60,8 @@
throwforce = 0
throw_speed = 4
throw_range = 20
+
+/obj/item/weapon/bananapeel/Crossed(AM as mob|obj)
+ if (istype(AM, /mob/living))
+ var/mob/living/M = AM
+ M.slip("the [src.name]",4)
diff --git a/code/modules/reagents/reagent_containers/tooth_paste.dm b/code/modules/reagents/reagent_containers/tooth_paste.dm
index 3d109229066..f02b427840d 100644
--- a/code/modules/reagents/reagent_containers/tooth_paste.dm
+++ b/code/modules/reagents/reagent_containers/tooth_paste.dm
@@ -45,20 +45,80 @@
add_overlay("toothpaste_overlay")
/obj/item/weapon/reagent_containers/toothbrush/attack_self(mob/user as mob)
+ if(!reagents.total_volume)
+ to_chat(user, "The [initial(name)] is dry!")
+ else
+ playsound(loc, 'sound/effects/toothbrush.ogg', 15, 1)
+ if(do_after(user, 30))
+ user.visible_message(
+ "\The [user] brushes [user.get_pronoun(1)] teeth with \the [src]",
+ "You brush your teeth with \the [src].")
+ reagents.trans_to_mob(user, amount_per_transfer_from_this, CHEM_BREATHE)
+ update_icon()
return
-/obj/item/weapon/reagent_containers/toothbrush/self_feed_message(var/mob/user)
- user.visible_message("\The [user] brushes [user.get_pronoun(1)] teeth with \the [src]","You brush your teeth with \the [src]")
-
-/obj/item/weapon/reagent_containers/toothbrush/other_feed_message_start(var/mob/user, var/mob/target)
- user.visible_message("[user] is trying to brush \the [target]'s teeth \the [src]!")
-
-/obj/item/weapon/reagent_containers/toothbrush/other_feed_message_finish(var/mob/user, var/mob/target)
- user.visible_message("[user] has brushed \the [target]'s teeth with \the [src]!")
-
/obj/item/weapon/reagent_containers/toothbrush/feed_sound(var/mob/user)
return
+/obj/item/weapon/reagent_containers/toothbrush/proc/remove_contents(mob/user, atom/trans_dest = null)
+ if(!trans_dest && !user.loc)
+ return
+
+/obj/item/weapon/reagent_containers/toothbrush/attack(atom/target as obj|turf|area, mob/user as mob , flag)
+ if(isliving(target))
+ var/mob/living/M = target
+ if(ishuman(M))
+ if(!reagents.total_volume)
+ to_chat(user, "The [initial(name)] is dry!")
+ else if(reagents.total_volume)
+ if(user.zone_sel.selecting == "mouth" && !(M.wear_mask && M.wear_mask.item_flags & AIRTIGHT))
+ user.do_attack_animation(src)
+ user.visible_message("[user] is trying to brush \the [target]'s teeth \the [src]!")
+ playsound(loc, 'sound/effects/toothbrush.ogg', 15, 1)
+ if(do_after(user, 30))
+ user.visible_message("[user] has brushed \the [target]'s teeth with \the [src]!")
+
+ reagents.trans_to_mob(target, amount_per_transfer_from_this, CHEM_BREATHE)
+ update_icon()
+ else
+ wipe_down(target, user)
+ return
+
+ return ..()
+
+/obj/item/weapon/reagent_containers/toothbrush/afterattack(atom/A as obj|turf|area, mob/user as mob, proximity)
+ if(!proximity)
+ return
+
+ if(istype(A, /obj/structure/reagent_dispensers) || istype(A, /obj/structure/mopbucket) || istype(A, /obj/item/weapon/reagent_containers/glass))
+ if(!reagents.get_free_space())
+ return
+
+ if(A.reagents && A.reagents.trans_to_obj(src, reagents.maximum_volume))
+ playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
+ user.visible_message("\The [user] soaks [src] using [A].", "You soak [src] using [A].")
+ update_icon()
+ return
+
+ if(istype(A) && (src in user))
+ if(A.is_open_container() && !(A in user))
+ remove_contents(user, A)
+ else if(!ismob(A)) //mobs are handled in attack()
+ wipe_down(A, user)
+ return
+
+/obj/item/weapon/reagent_containers/toothbrush/proc/wipe_down(atom/A, mob/user)
+ if(!reagents.total_volume)
+ to_chat(user, "The [initial(name)] is dry!")
+ else
+ user.visible_message("\The [user] starts to brush down [A] with [src]!")
+ playsound(loc, 'sound/effects/mop.ogg', 25, 1)
+ update_icon()
+ if(do_after(user, 120))
+ user.visible_message("\The [user] finishes brushing off \the [A]!")
+ reagents.splash(A, 5)
+ A.clean_blood()
+
/obj/item/weapon/reagent_containers/toothbrush/green
icon_state = "toothbrush_g"
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index ddb53593c69..b3de47de145 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -170,6 +170,24 @@ other types of metals and chemistry for reagents).
build_path =/obj/item/device/lightreplacer/advanced
sort_string = "VAAAH"
+/datum/design/advmop
+ name = "Advanced Mop"
+ desc = "The most advanced tool in a custodian's arsenal, complete with a condenser for self-wetting! Just think of all the viscera you will clean up with this!"
+ id = "advmop"
+ build_type = PROTOLATHE
+ materials = list(DEFAULT_WALL_MATERIAL = 2500, "glass" = 200)
+ build_path = /obj/item/weapon/mop/advanced
+ sort_string = "VAAAI"
+
+/datum/design/blutrash
+ name = "Trashbag of Holding"
+ desc = "An advanced trash bag with bluespace properties; capable of holding a plethora of garbage."
+ id = "blutrash"
+ build_type = PROTOLATHE
+ materials = list("gold" = 1500, "uranium" = 250, "phoron" = 1500)
+ build_path = /obj/item/weapon/storage/bag/trash/bluespace
+ sort_string = "VAAAJ"
+
/datum/design/item/experimental_welder
name = "Experimental Welding Tool"
desc = "A scientifically-enhanced welding tool that uses fuel-producing microbes to gradually replenish its fuel supply"
@@ -448,4 +466,4 @@ other types of metals and chemistry for reagents).
req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 5)
materials = list(DEFAULT_WALL_MATERIAL = 320, "glass" = 800)
build_path = /obj/item/weapon/implanter
- sort_string = "VCBAC"
\ No newline at end of file
+ sort_string = "VCBAC"
diff --git a/html/changelogs/janitor_stuff-wezzy.yml b/html/changelogs/janitor_stuff-wezzy.yml
new file mode 100644
index 00000000000..75193ed163b
--- /dev/null
+++ b/html/changelogs/janitor_stuff-wezzy.yml
@@ -0,0 +1,46 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+# admin
+# backend
+# security
+# refactor
+#################################
+
+# Your name.
+author: Wowzewow
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Increases the size of the mop bucket by 3x, and makes mop mop faster, like, 1.5x faster."
+ - tweak: "Buffs the janibelt ( You can finally put gloves, rags and radios in them! )"
+ - imageadd: "Cooler rag sprites, and some tweaks to other sprites."
+ - rscadd: "New bluespace trashbag and advanced mop, available in the protolathe."
+ - rscadd: "Adds special janitor rags to their lockers."
+
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index a35d8485d8a..7029efba7c2 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index 84f62d919d8..537aaca71bc 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 0347ab765af..84c6a552aaa 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index 33fc8a63520..bcb7d5bb99a 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index b2a597b7eeb..9ef15a77114 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/sound/effects/mop.ogg b/sound/effects/mop.ogg
index c4abbe69819..fc81358e795 100644
Binary files a/sound/effects/mop.ogg and b/sound/effects/mop.ogg differ
diff --git a/sound/effects/toothbrush.ogg b/sound/effects/toothbrush.ogg
new file mode 100644
index 00000000000..9d832bf0d12
Binary files /dev/null and b/sound/effects/toothbrush.ogg differ