diff --git a/code/__DEFINES/devices.dm b/code/__DEFINES/devices.dm
index a392f06cb1e..de17154df5c 100644
--- a/code/__DEFINES/devices.dm
+++ b/code/__DEFINES/devices.dm
@@ -6,15 +6,14 @@
#define CART_MANIFEST (1<<4)
#define CART_CLOWN (1<<5)
#define CART_MIME (1<<6)
-#define CART_JANITOR (1<<7)
-#define CART_REAGENT_SCANNER (1<<8)
-#define CART_NEWSCASTER (1<<9)
-#define CART_REMOTE_DOOR (1<<10)
-#define CART_STATUS_DISPLAY (1<<11)
-#define CART_QUARTERMASTER (1<<12)
-#define CART_HYDROPONICS (1<<13)
-#define CART_DRONEPHONE (1<<14)
-#define CART_DRONEACCESS (1<<15)
+#define CART_REAGENT_SCANNER (1<<7)
+#define CART_NEWSCASTER (1<<8)
+#define CART_REMOTE_DOOR (1<<9)
+#define CART_STATUS_DISPLAY (1<<10)
+#define CART_QUARTERMASTER (1<<11)
+#define CART_HYDROPONICS (1<<12)
+#define CART_DRONEPHONE (1<<13)
+#define CART_DRONEACCESS (1<<14)
/// PDA ui menu defines
#define PDA_UI_HUB 0
@@ -39,11 +38,10 @@
#define PDA_UI_SUPPLY_RECORDS 46
#define PDA_UI_SILO_LOGS 47
#define PDA_UI_BOTS_ACCESS 48
-#define PDA_UI_JANNIE_LOCATOR 49
-#define PDA_UI_EMOJI_GUIDE 50
-#define PDA_UI_SIGNALER 51
-#define PDA_UI_NEWSCASTER 52
-#define PDA_UI_NEWSCASTER_ERROR 53
+#define PDA_UI_EMOJI_GUIDE 49
+#define PDA_UI_SIGNALER 50
+#define PDA_UI_NEWSCASTER 51
+#define PDA_UI_NEWSCASTER_ERROR 52
// Used by PDA and cartridge code to reduce repetitiveness of spritesheets
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 142fa9ac264..1fcba885809 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -36,6 +36,7 @@ GLOBAL_LIST_EMPTY(zombie_infection_list) // A list of all zombie_infection organ
GLOBAL_LIST_EMPTY(meteor_list) // List of all meteors.
GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers
GLOBAL_LIST_EMPTY(ladders)
+GLOBAL_LIST_EMPTY(janitor_devices)
GLOBAL_LIST_EMPTY(trophy_cases)
GLOBAL_LIST_EMPTY(experiment_handlers)
///This is a global list of all signs you can change an existing sign or new sign backing to, when using a pen on them.
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 7d3c0180fcd..7feee44b75c 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -342,8 +342,6 @@ GLOBAL_LIST_EMPTY(PDAs)
if (cartridge)
if(!isnull(cartridge.bot_access))
dat += "
[PDAIMG(medbot)]Bots Access"
- if (cartridge.access & CART_JANITOR)
- dat += "[PDAIMG(bucket)]Custodial Locator"
if(cartridge.access & CART_MIME)
dat += "[PDAIMG(emoji)]Emoji Guidebook"
if (istype(cartridge.radio))
diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm
index 0242f9a1fad..f64e650eeaf 100644
--- a/code/game/objects/items/devices/PDA/PDA_types.dm
+++ b/code/game/objects/items/devices/PDA/PDA_types.dm
@@ -105,7 +105,6 @@
/obj/item/pda/janitor
name = "janitor PDA"
- default_cartridge = /obj/item/cartridge/janitor
greyscale_colors = "#933ea8#235AB2"
ttone = "slip"
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 742b3b1e568..324d2889ca3 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -86,15 +86,6 @@
ADVANCED_SEC_BOT,
)
-/obj/item/cartridge/janitor
- name = "\improper CustodiPRO cartridge"
- desc = "The ultimate in clean-room design."
- icon_state = "cart-j"
- access = CART_JANITOR | CART_DRONEPHONE
- bot_access = list(
- CLEAN_BOT,
- )
-
/obj/item/cartridge/lawyer
name = "\improper P.R.O.V.E. cartridge"
icon_state = "cart-s"
@@ -149,7 +140,7 @@
/obj/item/cartridge/hop
name = "\improper HumanResources9001 cartridge"
icon_state = "cart-h"
- access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_JANITOR | CART_SECURITY | CART_NEWSCASTER | CART_QUARTERMASTER | CART_DRONEPHONE
+ access = CART_MANIFEST | CART_STATUS_DISPLAY | CART_SECURITY | CART_NEWSCASTER | CART_QUARTERMASTER | CART_DRONEPHONE
bot_access = list(
MULE_BOT,
CLEAN_BOT,
@@ -485,68 +476,6 @@
menu += "No ore silo detected!"
menu = jointext(menu, "")
- if (PDA_UI_JANNIE_LOCATOR)
- menu = "[PDAIMG(bucket)] Persistent Custodial Object Locator
"
-
- var/turf/cl = get_turf(src)
- if (cl)
- menu += "Current Orbital Location: \[[cl.x],[cl.y]\]"
-
- menu += "Located Mops:
"
-
- var/ldat
- for (var/obj/item/mop/M in world)
- var/turf/ml = get_turf(M)
-
- if(ml)
- if (ml.z != cl.z)
- continue
- var/direction = get_dir(src, M)
- ldat += "Mop - \[[ml.x],[ml.y] ([uppertext(dir2text(direction))])\] - [M.reagents.total_volume ? "Wet" : "Dry"]
"
-
- if (!ldat)
- menu += "None"
- else
- menu += "[ldat]"
-
- menu += "Located Janitorial Cart:
"
-
- ldat = null
- for (var/obj/structure/janitorialcart/B in world)
- var/turf/bl = get_turf(B)
-
- if(bl)
- if (bl.z != cl.z)
- continue
- var/direction = get_dir(src, B)
- ldat += "Cart - \[[bl.x],[bl.y] ([uppertext(dir2text(direction))])\] - Water level: [B.reagents.total_volume]/100
"
-
- if (!ldat)
- menu += "None"
- else
- menu += "[ldat]"
-
- menu += "Located Cleanbots:
"
-
- ldat = null
- for (var/mob/living/simple_animal/bot/cleanbot/B in GLOB.alive_mob_list)
- var/turf/bl = get_turf(B)
-
- if(bl)
- if (bl.z != cl.z)
- continue
- var/direction = get_dir(src, B)
- ldat += "Cleanbot - \[[bl.x],[bl.y] ([uppertext(dir2text(direction))])\] - [B.bot_mode_flags & BOT_MODE_ON ? "Online" : "Offline"]
"
-
- if (!ldat)
- menu += "None"
- else
- menu += "[ldat]"
-
- else
- menu += "ERROR: Unable to determine current location."
- menu += "
Refresh GPS Locator"
-
if (PDA_UI_NEWSCASTER)
menu = "[PDAIMG(notes)] Newscaster Access
"
menu += "
Current Newsfeed: [current_channel ? current_channel : "None"]
"
diff --git a/code/game/objects/items/devices/PDA/virus_cart.dm b/code/game/objects/items/devices/PDA/virus_cart.dm
index 7ed4f95ccec..c47ca33b63a 100644
--- a/code/game/objects/items/devices/PDA/virus_cart.dm
+++ b/code/game/objects/items/devices/PDA/virus_cart.dm
@@ -68,7 +68,7 @@
var/difficulty = 0
if(target.cartridge)
- difficulty += bit_count(target.cartridge.access&(CART_MEDICAL | CART_SECURITY | CART_ENGINE | CART_CLOWN | CART_JANITOR | CART_MANIFEST))
+ difficulty += bit_count(target.cartridge.access&(CART_MEDICAL | CART_SECURITY | CART_ENGINE | CART_CLOWN | CART_MANIFEST))
if(target.cartridge.access & CART_MANIFEST)
difficulty++ //if cartridge has manifest access it has extra snowflake difficulty
if(SEND_SIGNAL(target, COMSIG_PDA_CHECK_DETONATE) & COMPONENT_PDA_NO_DETONATE || prob(difficulty * 15))
diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm
index 31a2816b9ab..7f164584bc6 100644
--- a/code/game/objects/items/mop.dm
+++ b/code/game/objects/items/mop.dm
@@ -23,7 +23,11 @@
/obj/item/mop/Initialize(mapload)
. = ..()
create_reagents(max_reagent_volume)
+ GLOB.janitor_devices += src
+/obj/item/mop/Destroy(force)
+ GLOB.janitor_devices -= src
+ return ..()
/obj/item/mop/proc/clean(turf/A, mob/living/cleaner)
if(reagents.has_chemical_flag(REAGENT_CLEANS, 1))
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 69991d161c1..ca49aa6c008 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -53,7 +53,6 @@
/obj/structure/closet/jcloset/PopulateContents()
..()
new /obj/item/clothing/under/rank/civilian/janitor(src)
- new /obj/item/cartridge/janitor(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/head/soft/purple(src)
new /obj/item/paint/paint_remover(src)
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 2d8413b41ac..a62a87573c6 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -19,6 +19,11 @@
/obj/structure/janitorialcart/Initialize(mapload)
. = ..()
create_reagents(100, OPENCONTAINER)
+ GLOB.janitor_devices += src
+
+/obj/structure/janitorialcart/Destroy()
+ GLOB.janitor_devices -= src
+ return ..()
/obj/structure/janitorialcart/examine(mob/user)
. = ..()
diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm
index 6da67c51043..3e71b02852a 100644
--- a/code/modules/jobs/job_types/janitor.dm
+++ b/code/modules/jobs/job_types/janitor.dm
@@ -38,7 +38,7 @@
id_trim = /datum/id_trim/job/janitor
uniform = /obj/item/clothing/under/rank/civilian/janitor
backpack_contents = list(
- /obj/item/modular_computer/tablet/preset/advanced = 1,
+ /obj/item/modular_computer/tablet/preset/advanced/custodial = 1,
)
belt = /obj/item/pda/janitor
ears = /obj/item/radio/headset/headset_srv
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 7d20e084021..8395dc4fb09 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -124,8 +124,10 @@
COMSIG_ATOM_ENTERED = .proc/on_entered,
)
AddElement(/datum/element/connect_loc, loc_connections)
+ GLOB.janitor_devices += src
/mob/living/simple_animal/bot/cleanbot/Destroy()
+ GLOB.janitor_devices -= src
if(weapon)
var/atom/Tsec = drop_location()
weapon.force = weapon_orig_force
diff --git a/code/modules/modular_computers/computers/item/tablet_presets.dm b/code/modules/modular_computers/computers/item/tablet_presets.dm
index a212103476c..2fb140be35d 100644
--- a/code/modules/modular_computers/computers/item/tablet_presets.dm
+++ b/code/modules/modular_computers/computers/item/tablet_presets.dm
@@ -59,6 +59,11 @@
hard_drive.store_file(new /datum/computer_file/program/alarm_monitor)
hard_drive.store_file(new /datum/computer_file/program/atmosscan)
+/obj/item/modular_computer/tablet/preset/advanced/custodial/Initialize(mapload)
+ . = ..()
+ var/obj/item/computer_hardware/hard_drive/small/hard_drive = find_hardware_by_name("solid state drive")
+ hard_drive.store_file(new /datum/computer_file/program/radar/custodial_locator)
+
/obj/item/modular_computer/tablet/preset/advanced/engineering/Initialize(mapload)
. = ..()
var/obj/item/computer_hardware/hard_drive/small/hard_drive = find_hardware_by_name("solid state drive")
diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm
index c0d8d4df643..9ae7777a0f4 100644
--- a/code/modules/modular_computers/file_system/programs/radar.dm
+++ b/code/modules/modular_computers/file_system/programs/radar.dm
@@ -248,6 +248,48 @@
return TRUE
return FALSE
+///Tracks all janitor equipment
+/datum/computer_file/program/radar/custodial_locator
+ filename = "custodiallocator"
+ filedesc = "Custodial Locator"
+ extended_desc = "This program allows for tracking of custodial equipment."
+ requires_ntnet = TRUE
+ transfer_access = list(ACCESS_JANITOR)
+ available_on_ntnet = TRUE
+ program_icon = "broom"
+ size = 2
+
+/datum/computer_file/program/radar/custodial_locator/find_atom()
+ return locate(selected) in GLOB.janitor_devices
+
+/datum/computer_file/program/radar/custodial_locator/scan()
+ if(world.time < next_scan)
+ return
+ next_scan = world.time + (2 SECONDS)
+ objects = list()
+ for(var/obj/custodial_tools as anything in GLOB.janitor_devices)
+ if(!trackable(custodial_tools))
+ continue
+ var/tool_name = custodial_tools.name
+
+ if(istype(custodial_tools, /obj/item/mop))
+ var/obj/item/mop/wet_mop = custodial_tools
+ tool_name = "[wet_mop.reagents.total_volume ? "Wet" : "Dry"] [wet_mop.name]"
+
+ if(istype(custodial_tools, /obj/structure/janitorialcart))
+ var/obj/structure/janitorialcart/janicart = custodial_tools
+ tool_name = "[janicart.name] - Water level: [janicart.reagents.total_volume] / [janicart.reagents.maximum_volume]"
+
+ if(istype(custodial_tools, /mob/living/simple_animal/bot/cleanbot))
+ var/mob/living/simple_animal/bot/cleanbot/cleanbots = custodial_tools
+ tool_name = "[cleanbots.name] - [cleanbots.bot_mode_flags & BOT_MODE_ON ? "Online" : "Offline"]"
+
+ var/list/tool_information = list(
+ ref = REF(custodial_tools),
+ name = tool_name,
+ )
+ objects += list(tool_information)
+
////////////////////////
//Nuke Disk Finder App//
////////////////////////
diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm
index 4b0457e5457..71bcc07c792 100644
--- a/code/modules/vehicles/pimpin_ride.dm
+++ b/code/modules/vehicles/pimpin_ride.dm
@@ -16,10 +16,12 @@
. = ..()
update_appearance()
AddElement(/datum/element/ridable, /datum/component/riding/vehicle/janicart)
+ GLOB.janitor_devices += src
if (installed_upgrade)
installed_upgrade.install(src)
/obj/vehicle/ridden/janicart/Destroy()
+ GLOB.janitor_devices -= src
if (trash_bag)
QDEL_NULL(trash_bag)
if (installed_upgrade)
diff --git a/code/modules/vending/cartridge.dm b/code/modules/vending/cartridge.dm
index fbdae52323d..0780210f680 100644
--- a/code/modules/vending/cartridge.dm
+++ b/code/modules/vending/cartridge.dm
@@ -10,7 +10,6 @@
/obj/item/cartridge/medical = 10,
/obj/item/cartridge/engineering = 10,
/obj/item/cartridge/security = 10,
- /obj/item/cartridge/janitor = 10,
/obj/item/cartridge/signal/ordnance = 10,
/obj/item/pda/heads = 10,
/obj/item/cartridge/captain = 3,
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index c2bc34cfe4b..d8925c3595d 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -315,7 +315,6 @@
product_ads = "Come and get your janitorial clothing, now endorsed by lizard janitors everywhere!"
vend_reply = "Thank you for using the JaniDrobe!"
products = list(/obj/item/clothing/under/rank/civilian/janitor = 2,
- /obj/item/cartridge/janitor = 2,
/obj/item/clothing/under/rank/civilian/janitor/skirt = 2,
/obj/item/clothing/suit/hooded/wintercoat/janitor = 2,
/obj/item/clothing/gloves/color/black = 2,