diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 1590325df0e..15a969e7a47 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -365,7 +365,7 @@
"aha" = (/obj/machinery/computer/prisoner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"ahb" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"ahc" = (/obj/machinery/computer/secure_data,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"ahd" = (/obj/structure/table/woodentable,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/machinery/computer/med_data/laptop,/obj/item/weapon/storage/secure/safe/HoS{pixel_x = 36; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"ahd" = (/obj/structure/table/woodentable,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security RC"; pixel_x = 0; pixel_y = 30},/obj/machinery/computer/med_data/laptop,/obj/item/weapon/storage/secure/safe{pixel_x = 36; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"ahe" = (/turf/simulated/wall,/area/security/range)
"ahf" = (/obj/machinery/alarm{pixel_y = 28},/obj/structure/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/clothing/suit/armor/laserproof,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/warden)
"ahg" = (/obj/machinery/door/airlock/external{name = "Escape Pod Three"},/turf/simulated/floor/plating,/area/crew_quarters/fitness{name = "\improper Recreation Area"})
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index 460498a874b..e848eec1aca 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -27,131 +27,132 @@
max_w_class = 2
max_combined_w_class = 14
- examine(mob/user)
- if(..(user, 1))
- to_chat(user, text("The service panel is [src.open ? "open" : "closed"]."))
+/obj/item/weapon/storage/secure/examine(mob/user)
+ if(..(user, 1))
+ to_chat(user, text("The service panel is [open ? "open" : "closed"]."))
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(locked)
- if((istype(W, /obj/item/weapon/melee/energy/blade)) && (!src.emagged))
- emag_act(user, W)
+/obj/item/weapon/storage/secure/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(locked)
+ if((istype(W, /obj/item/weapon/melee/energy/blade)) && (!emagged))
+ emag_act(user, W)
- if(istype(W, /obj/item/weapon/screwdriver))
- if(do_after(user, 20, target = src))
- src.open =! src.open
- user.show_message(text("\blue You [] the service panel.", (src.open ? "open" : "close")))
- return
- if((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking))
- user.show_message(text("\red Now attempting to reset internal memory, please hold."), 1)
- src.l_hacking = 1
- if(do_after(usr, 100, target = src))
- if(prob(40))
- src.l_setshort = 1
- src.l_set = 0
- user.show_message(text("\red Internal memory reset. Please give it a few seconds to reinitialize."), 1)
- sleep(80)
- src.l_setshort = 0
- src.l_hacking = 0
- else
- user.show_message(text("\red Unable to reset internal memory."), 1)
- src.l_hacking = 0
- else src.l_hacking = 0
- return
- //At this point you have exhausted all the special things to do when locked
- // ... but it's still locked.
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if(do_after(user, 20, target = src))
+ open = !open
+ user.show_message("You [open ? "open" : "close"] the service panel.", 1)
return
- // -> storage/attackby() what with handle insertion, etc
- ..()
-
- emag_act(user as mob, weapon as obj)
- if(!emagged)
- emagged = 1
- src.overlays += image('icons/obj/storage.dmi', icon_sparking)
- sleep(6)
- src.overlays = null
- overlays += image('icons/obj/storage.dmi', icon_locking)
- locked = 0
- if(istype(weapon, /obj/item/weapon/melee/energy/blade))
- var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
- spark_system.set_up(5, 0, src.loc)
- spark_system.start()
- playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
- playsound(src.loc, "sparks", 50, 1)
- to_chat(user, "You slice through the lock on [src].")
- else
- to_chat(user, "You short out the lock on [src].")
- return
-
-
- MouseDrop(over_object, src_location, over_location)
- if(locked)
- src.add_fingerprint(usr)
- return
- ..()
-
-
- attack_self(mob/user as mob)
- user.set_machine(src)
- var/dat = text("[]
\n\nLock Status: []",src, (src.locked ? "LOCKED" : "UNLOCKED"))
- var/message = "Code"
- if((src.l_set == 0) && (!src.emagged) && (!src.l_setshort))
- dat += text("
\n5-DIGIT PASSCODE NOT SET.
ENTER NEW PASSCODE.")
- if(src.emagged)
- dat += text("
\nLOCKING SYSTEM ERROR - 1701")
- if(src.l_setshort)
- dat += text("
\nALERT: MEMORY SYSTEM ERROR - 6040 201")
- message = text("[]", src.code)
- if(!src.locked)
- message = "*****"
- dat += {"
\n>[message]
\n
- 1-
- 2-
- 3
\n
- 4-
- 5-
- 6
\n
- 7-
- 8-
- 9
\n
- R-
- 0-
- E
\n"}
- user << browse(dat, "window=caselock;size=300x280")
-
- Topic(href, href_list)
- ..()
- if((usr.stat || usr.restrained()) || (get_dist(src, usr) > 1))
- return
- if(href_list["type"])
- if(href_list["type"] == "E")
- if((src.l_set == 0) && (length(src.code) == 5) && (!src.l_setshort) && (src.code != "ERROR"))
- src.l_code = src.code
- src.l_set = 1
- else if((src.code == src.l_code) && (src.emagged == 0) && (src.l_set == 1))
- src.locked = 0
- src.overlays = null
- overlays += image('icons/obj/storage.dmi', icon_opened)
- src.code = null
+ if((istype(W, /obj/item/device/multitool)) && (open == 1) && (!l_hacking))
+ user.show_message("Now attempting to reset internal memory, please hold.", 1)
+ l_hacking = 1
+ if(do_after(usr, 100, target = src))
+ if(prob(40))
+ l_setshort = 1
+ l_set = 0
+ user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1)
+ sleep(80)
+ l_setshort = 0
+ l_hacking = 0
else
- src.code = "ERROR"
- else
- if((href_list["type"] == "R") && (src.emagged == 0) && (!src.l_setshort))
- src.locked = 1
- src.overlays = null
- src.code = null
- src.close(usr)
- else
- src.code += text("[]", href_list["type"])
- if(length(src.code) > 5)
- src.code = "ERROR"
- src.add_fingerprint(usr)
- for(var/mob/M in viewers(1, src.loc))
- if((M.client && M.machine == src))
- src.attack_self(M)
- return
+ user.show_message("Unable to reset internal memory.", 1)
+ l_hacking = 0
+ else
+ l_hacking = 0
+ return
+ //At this point you have exhausted all the special things to do when locked
+ // ... but it's still locked.
return
+ return ..()
+
+/obj/item/weapon/storage/secure/emag_act(user as mob, weapon as obj)
+ if(!emagged)
+ emagged = 1
+ overlays += image('icons/obj/storage.dmi', icon_sparking)
+ sleep(6)
+ overlays = null
+ overlays += image('icons/obj/storage.dmi', icon_locking)
+ locked = 0
+ if(istype(weapon, /obj/item/weapon/melee/energy/blade))
+ var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
+ spark_system.set_up(5, 0, src.loc)
+ spark_system.start()
+ playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(loc, "sparks", 50, 1)
+ to_chat(user, "You slice through the lock on [src].")
+ else
+ to_chat(user, "You short out the lock on [src].")
+ return
+
+
+/obj/item/weapon/storage/secure/MouseDrop(over_object, src_location, over_location)
+ if(locked)
+ add_fingerprint(usr)
+ to_chat(usr, "It's locked!")
+ return 0
+ ..()
+
+/obj/item/weapon/storage/secure/attack_self(mob/user as mob)
+ user.set_machine(src)
+ var/dat = text("[]
\n\nLock Status: []", src, (locked ? "LOCKED" : "UNLOCKED"))
+ var/message = "Code"
+ if((l_set == 0) && (!emagged) && (!l_setshort))
+ dat += text("\n5-DIGIT PASSCODE NOT SET.
ENTER NEW PASSCODE.")
+ if(emagged)
+ dat += text("
\nLOCKING SYSTEM ERROR - 1701")
+ if(l_setshort)
+ dat += text("
\nALERT: MEMORY SYSTEM ERROR - 6040 201")
+ message = text("[]", code)
+ if(!locked)
+ message = "*****"
+ dat += {"
\n>[message]
\n
+ 1-
+ 2-
+ 3
\n
+ 4-
+ 5-
+ 6
\n
+ 7-
+ 8-
+ 9
\n
+ R-
+ 0-
+ E
\n"}
+ user << browse(dat, "window=caselock;size=300x280")
+
+/obj/item/weapon/storage/secure/Topic(href, href_list)
+ ..()
+ if(usr.incapacitated() || (get_dist(src, usr) > 1))
+ return
+ if(href_list["type"])
+ if(href_list["type"] == "E")
+ if((l_set == 0) && (length(code) == 5) && (!l_setshort) && (code != "ERROR"))
+ l_code = code
+ l_set = 1
+ else if((code == l_code) && (emagged == 0) && (l_set == 1))
+ locked = 0
+ overlays = null
+ overlays += image('icons/obj/storage.dmi', icon_opened)
+ code = null
+ else
+ code = "ERROR"
+ else
+ if((href_list["type"] == "R") && (emagged == 0) && (!l_setshort))
+ locked = 1
+ overlays = null
+ code = null
+ close(usr)
+ else
+ code += text("[]", href_list["type"])
+ if(length(code) > 5)
+ code = "ERROR"
+ add_fingerprint(usr)
+ for(var/mob/M in viewers(1, loc))
+ if((M.client && M.machine == src))
+ attack_self(M)
+ return
+ return
+
/obj/item/weapon/storage/secure/can_be_inserted(obj/item/W as obj, stop_messages = 0)
if(!locked)
return ..()
@@ -160,8 +161,10 @@
return 0
/obj/item/weapon/storage/secure/hear_talk(mob/living/M as mob, msg)
+ return
/obj/item/weapon/storage/secure/hear_message(mob/living/M as mob, msg)
+ return
// -----------------------------
// Secure Briefcase
@@ -174,7 +177,7 @@
item_state = "sec-case"
flags = CONDUCT
hitsound = "swing_hit"
- force = 8.0
+ force = 8
throw_speed = 2
throw_range = 4
w_class = 4
@@ -182,36 +185,36 @@
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
- New()
- ..()
- new /obj/item/weapon/paper(src)
- new /obj/item/weapon/pen(src)
+/obj/item/weapon/storage/secure/briefcase/New()
+ ..()
+ handle_item_insertion(new /obj/item/weapon/paper, 1)
+ handle_item_insertion(new /obj/item/weapon/pen, 1)
- attack_hand(mob/user as mob)
- if((src.loc == user) && (src.locked == 1))
- to_chat(usr, "\red [src] is locked and cannot be opened!")
- else if((src.loc == user) && (!src.locked))
- playsound(src.loc, "rustle", 50, 1, -5)
- if(user.s_active)
- user.s_active.close(user) //Close and re-open
- src.show_to(user)
- else
- ..()
- for(var/mob/M in range(1))
- if(M.s_active == src)
- src.close(M)
- src.orient2hud(user)
- src.add_fingerprint(user)
- return
+/obj/item/weapon/storage/secure/briefcase/attack_hand(mob/user as mob)
+ if((loc == user) && (locked == 1))
+ to_chat(usr, "[src] is locked and cannot be opened!")
+ else if((loc == user) && !locked)
+ playsound(loc, "rustle", 50, 1, -5)
+ if(user.s_active)
+ user.s_active.close(user) //Close and re-open
+ show_to(user)
+ else
+ ..()
+ for(var/mob/M in range(1))
+ if(M.s_active == src)
+ close(M)
+ orient2hud(user)
+ add_fingerprint(user)
+ return
//Syndie variant of Secure Briefcase. Contains space cash, slightly more robust.
/obj/item/weapon/storage/secure/briefcase/syndie
- force = 15.0
+ force = 15
/obj/item/weapon/storage/secure/briefcase/syndie/New()
+ ..()
for(var/i = 0, i < storage_slots - 2, i++)
- new /obj/item/weapon/spacecash/c1000(src)
- return ..()
+ handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1)
// -----------------------------
// Secure Safe
@@ -224,30 +227,17 @@
icon_opened = "safe0"
icon_locking = "safeb"
icon_sparking = "safespark"
- force = 8.0
+ force = 8
w_class = 5
max_w_class = 8
- anchored = 1.0
+ anchored = 1
density = 0
cant_hold = list("/obj/item/weapon/storage/secure/briefcase")
- New()
- ..()
- new /obj/item/weapon/paper(src)
- new /obj/item/weapon/pen(src)
-
- attack_hand(mob/user as mob)
- return attack_self(user)
-
-// Clown planet WMD storage
-/obj/item/weapon/storage/secure/safe/clown
- name="WMD Storage"
-
-/obj/item/weapon/storage/secure/safe/clown/New()
- for(var/i=0;i<10;i++)
- new /obj/item/weapon/reagent_containers/food/snacks/pie(src)
-
-
-/obj/item/weapon/storage/secure/safe/HoS/New()
+/obj/item/weapon/storage/secure/safe/New()
..()
- //new /obj/item/weapon/storage/lockbox/clusterbang(src) This item is currently broken... and probably shouldnt exist to begin with (even though it's cool)
\ No newline at end of file
+ handle_item_insertion(new /obj/item/weapon/paper, 1)
+ handle_item_insertion(new /obj/item/weapon/pen, 1)
+
+/obj/item/weapon/storage/secure/safe/attack_hand(mob/user as mob)
+ return attack_self(user)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 37ff565f4a3..862eed1b986 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -934,11 +934,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
for(var/obj/item/briefcase_item in sec_briefcase)
qdel(briefcase_item)
for(var/i=3, i>0, i--)
- sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000
- sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
- sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
- sec_briefcase.contents += new /obj/item/ammo_box/a357
- sec_briefcase.contents += new /obj/item/weapon/grenade/plastic/c4
+ sec_briefcase.handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1)
+ sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, 1)
+ sec_briefcase.handle_item_insertion(new /obj/item/weapon/gun/projectile/revolver/mateba, 1)
+ sec_briefcase.handle_item_insertion(new /obj/item/ammo_box/a357, 1)
+ sec_briefcase.handle_item_insertion(new /obj/item/weapon/grenade/plastic/c4, 1)
// briefcase must be unlocked by setting the code.
M.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index 6fad0961ab4..1c8bd73c47f 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -189,15 +189,11 @@
to_chat(H, "You deploy your hardsuit helmet, sealing you off from the world.")
H.update_inv_head()
-/obj/item/clothing/suit/space/rig/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/clothing/suit/space/rig/attackby(obj/item/W, mob/user, params)
if(!isliving(user))
return
- if(istype(src.loc,/mob/living))
- to_chat(user, "How do you propose to modify a hardsuit while it is being worn?")
- return
-
- if(istype(W,/obj/item/weapon/screwdriver))
+ if(istype(W,/obj/item/weapon/screwdriver) && can_modify(user))
if(!helmet)
to_chat(user, "\The [src] does not have a helmet installed.")
else
@@ -213,7 +209,7 @@
boots = null
return
- else if(istype(W,/obj/item/clothing/head/helmet/space))
+ else if(istype(W,/obj/item/clothing/head/helmet/space) && can_modify(user))
if(!attached_helmet)
to_chat(user, "\The [src] does not have a helmet mount.")
return
@@ -226,7 +222,7 @@
src.helmet = W
return
- else if(istype(W,/obj/item/clothing/shoes/magboots))
+ else if(istype(W,/obj/item/clothing/shoes/magboots) && can_modify(user))
if(!attached_boots)
to_chat(user, "\The [src] does not have boot mounts.")
return
@@ -242,6 +238,13 @@
return ..()
..()
+
+/obj/item/clothing/suit/space/rig/proc/can_modify(mob/living/user)
+ if(isliving(loc))
+ to_chat(user, "You can not modify the hardsuit while it is being worn.")
+ return 0
+
+ return 1
//Engineering rig
/obj/item/clothing/head/helmet/space/rig/engineering
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 4c974c46c16..47c243e970e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -466,6 +466,9 @@
return
if(istype(target, /obj/mecha/working/ripley))
var/obj/mecha/D = target
+ if(D.icon_state != "ripley-open")
+ to_chat(user, "You can't add armour onto the mech while someone is inside!")
+ return
var/list/damage_absorption = D.damage_absorption
if(damage_absorption["brute"] > 0.3)
damage_absorption["brute"] = max(damage_absorption["brute"] - 0.1, 0.3)
@@ -474,17 +477,11 @@
damage_absorption["laser"] = damage_absorption["laser"] - 0.025
to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
qdel(src)
- if(D.icon_state == "ripley-open")
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
- D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
- else
- to_chat(user, "You can't add armour onto the mech while someone is inside!")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-open")
+ D.desc = "Autonomous Power Loader Unit. Its armour is enhanced with some goliath hide plates."
if(damage_absorption.["brute"] == 0.3)
- if(D.icon_state == "ripley-open")
- D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
- D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
- else
- to_chat(user, "You can't add armour onto the mech while someone is inside!")
+ D.overlays += image("icon"="mecha.dmi", "icon_state"="ripley-g-full-open")
+ D.desc = "Autonomous Power Loader Unit. It's wearing a fearsome carapace entirely composed of goliath hide plates - the pilot must be an experienced monster hunter."
else
to_chat(user, "You can't improve [D] any further!")
return