Custodial Additions (#13612)

This commit is contained in:
SleepyGemmy
2022-06-09 12:46:14 +02:00
committed by GitHub
parent 3d9a17098c
commit 85298bc510
36 changed files with 513 additions and 290 deletions
@@ -1,3 +1,6 @@
//
// Holsters
//
/obj/item/clothing/accessory/holster
name = "shoulder holster"
desc = "A handgun holster."
@@ -33,9 +36,9 @@
playsound(get_turf(src), sound_in, 50)
if(istype(user))
user.stop_aiming(no_message=1)
user.stop_aiming(no_message = TRUE)
holstered = I
user.drop_from_inventory(holstered,src)
user.drop_from_inventory(holstered, src)
holstered.add_fingerprint(user)
w_class = max(w_class, holstered.w_class)
user.visible_message("<span class='notice'>[user] holsters \the [holstered].</span>", "<span class='notice'>You holster \the [holstered].</span>")
@@ -45,11 +48,11 @@
holstered = null
update_name()
/obj/item/clothing/accessory/holster/proc/unholster(mob/user as mob)
/obj/item/clothing/accessory/holster/proc/unholster(mob/user)
if(!holstered)
return
if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj))
if(istype(user.get_active_hand(), /obj) && istype(user.get_inactive_hand(), /obj))
to_chat(user, "<span class='warning'>You need an empty hand to draw \the [holstered]!</span>")
else if (use_check(user))
to_chat(user, "<span class='warning'>You can't draw \the [holstered] in your current state!</span>")
@@ -57,15 +60,15 @@
var/sound_vol = 25
if(user.a_intent == I_HURT)
sound_vol = 50
usr.visible_message(
user.visible_message(
"<span class='danger'>[user] draws \the [holstered], ready to shoot!</span>",
"<span class='warning'>You draw \the [holstered], ready to shoot!</span>"
)
)
else
user.visible_message(
"<span class='notice'>[user] draws \the [holstered], pointing it at the ground.</span>",
"<span class='notice'>You draw \the [holstered], pointing it at the ground.</span>"
)
)
if(sound_out)
playsound(get_turf(src), sound_out, sound_vol)
@@ -75,15 +78,15 @@
w_class = initial(w_class)
clear_holster()
/obj/item/clothing/accessory/holster/attack_hand(mob/user as mob)
if (has_suit) //if we are part of a suit
/obj/item/clothing/accessory/holster/attack_hand(mob/user)
if (has_suit) // If we are part of a suit.
if (holstered)
unholster(user)
return
..(user)
/obj/item/clothing/accessory/holster/attackby(obj/item/W as obj, mob/user as mob)
/obj/item/clothing/accessory/holster/attackby(obj/item/W, mob/user)
holster(W, user)
/obj/item/clothing/accessory/holster/emp_act(severity)
@@ -98,24 +101,27 @@
else
to_chat(user, "It is empty.")
/obj/item/clothing/accessory/holster/on_attached(obj/item/clothing/under/S, mob/user as mob)
/obj/item/clothing/accessory/holster/on_attached(obj/item/clothing/under/S, mob/user)
..()
has_suit.verbs += /obj/item/clothing/accessory/holster/verb/holster_verb
/obj/item/clothing/accessory/holster/on_removed(mob/user as mob)
/obj/item/clothing/accessory/holster/on_removed(mob/user)
if(has_suit)
has_suit.verbs -= /obj/item/clothing/accessory/holster/verb/holster_verb
..()
//For the holster hotkey
/obj/item/clothing/accessory/holster/verb/holster_verb()
/obj/item/clothing/accessory/holster/verb/holster_verb() //For the holster hotkey.
set name = "Holster"
set category = "Object"
set src in usr
if(!istype(usr, /mob/living)) return
if(usr.stat) return
//can't we just use src here?
if(!istype(usr, /mob/living))
return
if(usr.stat)
return
// Can't we just use src here?
var/obj/item/clothing/accessory/holster/H = get_accessory(/obj/item/clothing/accessory/holster)
if(!H && istype(src, /obj/item/clothing/suit/armor/tactical)) // This armor is a snowflake and has an integrated holster.
var/obj/item/clothing/suit/armor/tactical/tacticool = src
@@ -127,7 +133,7 @@
if(!H.holstered)
var/obj/item/W = usr.get_active_hand()
if(!istype(W, /obj/item))
to_chat(usr, "<span class='warning'>You need your gun equiped to holster it.</span>")
to_chat(usr, "<span class='warning'>You need your gun equipped to holster it.</span>")
return
H.holster(W, usr)
else
@@ -145,7 +151,7 @@
/obj/item/clothing/accessory/holster/hip
name = "black hip holster"
desc = "<i>No one dared to ask his business, no one dared to make a slip. The stranger there among them had a big iron on his hip.</i>"
desc = "A black firearm hip holster."
icon_state = "holster_hip"
/obj/item/clothing/accessory/holster/thigh
@@ -171,3 +177,33 @@
name = "brown thigh holster"
icon_state = "holster_brown_thigh"
//
// Utility Holsters
//
/obj/item/clothing/accessory/holster/utility
name = "utility holster"
desc = "A utility holster."
var/list/allowed_items = list() // A list of allowed items.
/obj/item/clothing/accessory/holster/utility/holster(var/obj/item/I, var/mob/living/user)
if(!is_type_in_list(I, allowed_items))
to_chat(user, "<span class='notice'>\The [I] won't fit in \the [src].</span>")
return
..()
// Custodial Holster
/obj/item/clothing/accessory/holster/utility/custodial/armpit/brown
name = "brown custodial armpit holster"
desc = "A brown utility holster which can't hold actual firearms. This particular one is designed for custodial personnel."
desc_fluff = "In a universe where various utility firearms and tools have become more common for diverse applications, it is important that there are ways to store them where \
they are kept safe from wear and tear as well as from misuse. Thus as an alternative to regular firearm holsters, specialized utility firearm and tool holsters exist, which \
allow non-standard firearms to be stored inside, whilst at the same time keeping individuals from storing actual firearms in one."
icon_state = "holster_brown"
allowed_items = list(
/obj/item/gun/energy/mousegun,
/obj/item/gun/energy/mousegun/xenofauna,
/obj/item/gun/projectile/revolver/capgun,
/obj/item/toy/crossbow,
/obj/item/reagent_containers/food/snacks/grown/banana
)
+2 -2
View File
@@ -91,8 +91,8 @@
if(.)
return TRUE
if(load && usr != load)
to_chat(usr, SPAN_WARNING("You can't interact with \the [src] unless you're the driver, or you're adjacent to it while it has no driver."))
if(load && load != usr)
to_chat(usr, SPAN_WARNING("You can't interact with \the [src] while its in use."))
return TRUE
if(href_list["toggle_engine"])
+129 -58
View File
@@ -1,32 +1,34 @@
//
// Custodial Truck a.k.a. Pussy Wagon
//
/obj/vehicle/train/cargo/engine/pussywagon
name = "janicart deluxe engine"
desc = "The engine for the janicart deluxe trolley, the bread to your butter."
name = "\improper C8000 deluxe custodial truck"
desc = "A C8000 deluxe custodial truck. The bread to the custodians' butter."
desc_info = "Click-drag yourself onto the truck to climb onto it.<br>\
- CTRL-click the truck to open the ignition and controls menu.<br>\
- ALT-click the truck to remove the key from the ignition.<br>\
- Click the truck to open a UI menu.<br>\
- Click the resist button or type \"resist\" in the command bar at the bottom of your screen to get off the truck."
icon = 'icons/obj/vehicles.dmi'
icon_state = "janicart_off"
light_range = 0 // Turn off the light inherited from the parent.
move_delay = 3
mob_offset_y = 7
load_offset_x = -13
vueui_template = "pussywagon"
// Unique Variables
var/cart_icon = "janicart"
/obj/item/key/janicart
name = "key"
desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"."
icon = 'icons/obj/vehicles.dmi'
icon_state = "keys"
w_class = ITEMSIZE_TINY
var/ignition = FALSE
/obj/vehicle/train/cargo/engine/pussywagon/setup_engine()
cell = new /obj/item/cell/high(src)
key = null
update_icon()
turn_off()
toggle_ignition()
/obj/vehicle/train/cargo/engine/pussywagon/vueui_data_change(list/data, mob/user, datum/vueui/ui)
data = ..()
data["has_proper_trolley"] = FALSE
if(istype(tow, /obj/vehicle/train/cargo/trolley/pussywagon))
data["has_proper_trolley"] = TRUE
@@ -41,67 +43,134 @@
var/obj/item/reagent_containers/B = PT.bucket
data["bucket_capacity"] = B.reagents.total_volume
data["max_bucket_capacity"] = B.volume
return data
/obj/vehicle/train/cargo/engine/pussywagon/Topic(href, href_list, datum/topic_state/state)
. = ..()
if(.)
return
return TRUE
if(href_list["toggle_hoover"])
toggle_hoover(usr)
if(href_list["empty_hoover"])
var/obj/vehicle/train/cargo/trolley/pussywagon/PT = tow
PT.empty_hoover(usr)
if(href_list["toggle_mops"])
if(href_list["toggle_mop"])
toggle_mop(usr)
SSvueui.check_uis_for_change(src)
/obj/vehicle/train/cargo/engine/pussywagon/attackby(obj/item/W as obj, mob/user as mob)
/obj/vehicle/train/cargo/engine/pussywagon/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/key/janicart))
if(!key)
user.drop_from_inventory(W, src)
key = W
to_chat(user, SPAN_NOTICE("You slide the key into the ignition."))
to_chat(user, SPAN_NOTICE("You slide \the [W] into \the [src]'s ignition."))
playsound(src, 'sound/machines/vehicles/pussywagon/key_in.ogg', 50, FALSE)
else
to_chat(user, SPAN_WARNING("\The [src] already has a key inserted."))
to_chat(user, SPAN_NOTICE("There is already a key in [src]'s ignition."))
return
..()
/obj/vehicle/train/cargo/engine/pussywagon/turn_on()
if(!key)
audible_message("\The [src] whirrs, but the lack of a key causes the engine to shut down.")
/obj/vehicle/train/cargo/engine/pussywagon/CtrlClick(mob/user)
if(load && load != user)
to_chat(user, SPAN_WARNING("You can't interact with \the [src] while its in use."))
return
var/list/options = list(
"Toggle Ignition" = image('icons/mob/screen/radial.dmi', "custodial_key"),
"Toggle Mopping" = image('icons/mob/screen/radial.dmi', "custodial_mop"),
"Toggle Vacuuming" = image('icons/mob/screen/radial.dmi', "custodial_vacuum")
)
var/chosen_option = show_radial_menu(user, src, options, radius = 42, require_near = TRUE, tooltips = TRUE)
if (!chosen_option)
return
switch(chosen_option)
if("Toggle Ignition")
toggle_ignition(user)
if("Toggle Mopping")
toggle_mop(user)
if("Toggle Vacuuming")
toggle_hoover(user)
/obj/vehicle/train/cargo/engine/pussywagon/AltClick(mob/user)
if(Adjacent(user))
remove_key(user)
else
..()
update_stats()
return ..()
/obj/vehicle/train/cargo/engine/pussywagon/turn_off()
..()
/obj/vehicle/train/cargo/engine/pussywagon/remove_key(mob/user)
if(!key)
to_chat(user, SPAN_NOTICE("There is no key in \the [src]'s ignition."))
return
if(tow)
if(load && load != user)
to_chat(usr, SPAN_WARNING("You can't remove \the [key] from \the [src] while its in use."))
return
to_chat(user, SPAN_NOTICE("You take out \the [key] out of \the [src]'s ignition."))
playsound(src, 'sound/machines/vehicles/pussywagon/key_out.ogg', 50, FALSE)
user.put_in_hands(key)
key = null
if(ignition)
toggle_ignition()
/obj/vehicle/train/cargo/engine/pussywagon/proc/toggle_ignition(mob/user)
if(!ignition)
if(!key)
to_chat(user, SPAN_NOTICE("There is no key in \the [src]'s ignition."))
return
else
if(stat)
return FALSE
if(powered && cell.charge < charge_use)
return FALSE
to_chat(user, SPAN_NOTICE("You turn on \the [src]'s ignition."))
playsound(src, 'sound/machines/vehicles/pussywagon/button.ogg', 50, FALSE)
playsound_in(src, 'sound/machines/vehicles/pussywagon/start.ogg', 50, FALSE, time = 1 SECOND)
on = TRUE
ignition = TRUE
update_stats()
update_icon()
return TRUE
else
to_chat(user, SPAN_NOTICE("You turn off \the [src]'s ignition."))
if(key)
playsound(src, 'sound/machines/vehicles/pussywagon/button.ogg', 50, FALSE)
on = FALSE
ignition = FALSE
update_icon()
if(tow)
if(istype(tow, /obj/vehicle/train/cargo/trolley/pussywagon))
var/obj/vehicle/train/cargo/trolley/pussywagon/PW = tow
PW.trolley_off()
/obj/vehicle/train/cargo/engine/pussywagon/proc/toggle_mop(mob/user)
if(on && tow)
if(istype(tow, /obj/vehicle/train/cargo/trolley/pussywagon))
var/obj/vehicle/train/cargo/trolley/pussywagon/PW = tow
PW.engine_off()
/obj/vehicle/train/cargo/engine/pussywagon/proc/toggle_mop(var/mob/user)
if(on && tow)
if(istype(tow,/obj/vehicle/train/cargo/trolley/pussywagon))
var/obj/vehicle/train/cargo/trolley/pussywagon/PW = tow
if(!PW.bucket)
to_chat(user, SPAN_WARNING("You must insert a reagent container first!"))
to_chat(user, SPAN_NOTICE("You must insert a reagent container first."))
return
PW.mop_toggle()
if(!PW.mopping)
to_chat(user, SPAN_NOTICE("You turn on \the [src]'s rotary mop."))
else
to_chat(user, SPAN_NOTICE("You turn off \the [src]'s rotary mop."))
PW.toggle_mop()
/obj/vehicle/train/cargo/engine/pussywagon/proc/toggle_hoover(var/mob/user)
/obj/vehicle/train/cargo/engine/pussywagon/proc/toggle_hoover(mob/user)
if(use_check_and_message(user))
return
if(on && tow)
if(istype(tow,/obj/vehicle/train/cargo/trolley/pussywagon))
if(istype(tow, /obj/vehicle/train/cargo/trolley/pussywagon))
var/obj/vehicle/train/cargo/trolley/pussywagon/PW = tow
PW.hoover_toggle()
if(!PW.hoover)
to_chat(user, SPAN_NOTICE("You turn on \the [src]'s vacuum cleaner."))
else
to_chat(user, SPAN_NOTICE("You turn off \the [src]'s vacuum cleaner."))
PW.toggle_hoover()
/obj/vehicle/train/cargo/engine/pussywagon/update_icon()
cut_overlays()
@@ -139,11 +208,11 @@
..()
/obj/vehicle/train/cargo/trolley/pussywagon
name = "janicart deluxe trolley"
desc = "The trolley of the janicart deluxe, equipped with dual rotary mop and a NT-X1 Vacuum Cleaner."
desc_info = "You can unlatch this from the control console of the janicart."
name = "\improper C8000 deluxe custodial trolley"
desc = "The trolley of the C8000 deluxe custodial truck, equipped with a dual rotary mop and a industrial vacuum cleaner."
icon = 'icons/obj/vehicles.dmi'
icon_state = "jantrolley"
light_range = 0 // Turn off the light inherited from the parent.
var/obj/item/reagent_containers/bucket
var/list/hoovered = list()
@@ -152,11 +221,10 @@
var/mopping = 0
var/hoover = 0
/obj/vehicle/train/cargo/trolley/pussywagon/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/reagent_containers))
if(!open)
to_chat(user, SPAN_WARNING("\The [src]'s panel isn't open."))
to_chat(user, SPAN_WARNING("\The [src]'s maintenance panel isn't open."))
return
if(!bucket)
user.drop_from_inventory(W,src)
@@ -166,7 +234,7 @@
if(W.iswrench())
if(!open)
to_chat(user, SPAN_WARNING("\The [src]'s panel isn't open."))
to_chat(user, SPAN_WARNING("\The [src]'s maintenance panel isn't open."))
return
if(bucket)
bucket.forceMove(user.loc)
@@ -186,7 +254,7 @@
return
..()
/obj/vehicle/train/cargo/trolley/pussywagon/proc/empty_hoover(var/mob/user)
/obj/vehicle/train/cargo/trolley/pussywagon/proc/empty_hoover(mob/user)
for(var/obj/item/I in hoovered)
I.forceMove(user.loc)
hoovered -= I
@@ -201,7 +269,7 @@
tile.clean(bucket)
lead.cell.use(charge_use, load)
else
mop_toggle()
toggle_mop()
if(hoover)
var/current_len = hoovered.len
for(var/obj/item/I in tile)
@@ -211,35 +279,31 @@
vacuum_capacity -= I.w_class
lead.cell.use(charge_use)
if(!vacuum_capacity)
hoover_toggle()
toggle_hoover()
if(hoovered.len > current_len)
playsound(src, 'sound/machines/disposalflush.ogg', 100, 1)
playsound(src, 'sound/machines/disposalflush.ogg', 50, TRUE)
return ..()
/obj/vehicle/train/cargo/trolley/pussywagon/proc/engine_off()
/obj/vehicle/train/cargo/trolley/pussywagon/proc/trolley_off()
if(mopping)
mop_toggle()
toggle_mop()
if(hoover)
hoover_toggle()
toggle_hoover()
/obj/vehicle/train/cargo/trolley/pussywagon/proc/mop_toggle()
/obj/vehicle/train/cargo/trolley/pussywagon/proc/toggle_mop()
if(!mopping)
playsound(src, 'sound/machines/hydraulic_long.ogg', 20, TRUE)
mopping = 1
audible_message("\The [src]'s mop-o-matic rumbles to life.", "You hear something rumble deeply.")
playsound(src, 'sound/machines/hydraulic_long.ogg', 100, 1)
else
mopping = 0
audible_message("\The [src]'s mop-o-matic putters before turning off.", "You hear something putter slowly.")
update_icon()
/obj/vehicle/train/cargo/trolley/pussywagon/proc/hoover_toggle()
/obj/vehicle/train/cargo/trolley/pussywagon/proc/toggle_hoover()
if(!hoover)
playsound(src, 'sound/machines/hydraulic_long.ogg', 20, TRUE)
hoover = 1
audible_message("\The [src]'s space hoover rumbles to life.", "You hear something rumble deeply.")
playsound(src, 'sound/machines/hydraulic_long.ogg', 100, 1)
else
hoover = 0
audible_message("\The [src]'s space hoover putters before turning off.", "You hear something putter slowly.")
update_icon()
/obj/vehicle/train/cargo/trolley/pussywagon/update_icon()
@@ -247,3 +311,10 @@
if(mopping)
add_overlay(image('icons/obj/vehicles.dmi', "[icon_state]_mop_overlay", MOB_LAYER + 1))
/obj/item/key/janicart
name = "\improper C8000 deluxe custodial truck key fob"
desc = "A stainless steel key fob with a chromed top attached to a small steel key ring. The key ring has a pink tag hanging on it, with the text \"Pussy Wagon\"."
icon = 'icons/obj/vehicles.dmi'
icon_state = "keys"
w_class = ITEMSIZE_TINY