Make more use of <tool>_act (#64375)

Replaces a bunch of tool behavior checks in attackby to instead use the respective procs.
For instance, the behavior under a if(I.tool_behaviour == TOOL_SCREWDRIVER) check in attackby() will instead be found under that same object's screwdriver_act() proc. This is the first of a few PRs that I'd like to make to address this, since there's going to be a lot of code shuffled around.

This shouldn't have any impact on players, though some super observant folks might notice that they don't bash some items with tools when they meant to interact with them. I've tested all of these in game and they seem to still have the same behavior as before.
This commit is contained in:
Luc
2022-01-25 10:17:30 -05:00
committed by GitHub
parent 4626105bf9
commit 4fd16bcbdb
29 changed files with 624 additions and 523 deletions
+17 -14
View File
@@ -53,20 +53,23 @@ GLOBAL_LIST_EMPTY(announcement_systems)
GLOB.announcement_systems -= src //"OH GOD WHY ARE THERE 100,000 LISTED ANNOUNCEMENT SYSTEMS?!!"
return ..()
/obj/machinery/announcement_system/attackby(obj/item/P, mob/user, params)
if(P.tool_behaviour == TOOL_SCREWDRIVER)
P.play_tool_sound(src)
panel_open = !panel_open
to_chat(user, span_notice("You [panel_open ? "open" : "close"] the maintenance hatch of [src]."))
update_appearance()
else if(default_deconstruction_crowbar(P))
return
else if(P.tool_behaviour == TOOL_MULTITOOL && panel_open && (machine_stat & BROKEN))
to_chat(user, span_notice("You reset [src]'s firmware."))
set_machine_stat(machine_stat & ~BROKEN)
update_appearance()
else
return ..()
/obj/machinery/announcement_system/screwdriver_act(mob/living/user, obj/item/tool)
tool.play_tool_sound(src)
panel_open = !panel_open
to_chat(user, span_notice("You [panel_open ? "open" : "close"] the maintenance hatch of [src]."))
update_appearance()
return TRUE
/obj/machinery/announcement_system/crowbar_act(mob/living/user, obj/item/tool)
if(default_deconstruction_crowbar(tool))
return TRUE
/obj/machinery/announcement_system/multitool_act(mob/living/user, obj/item/tool)
if(!panel_open || !(machine_stat & BROKEN))
return FALSE
to_chat(user, span_notice("You reset [src]'s firmware."))
set_machine_stat(machine_stat & ~BROKEN)
update_appearance()
/obj/machinery/announcement_system/proc/CompileText(str, user, rank) //replaces user-given variables with actual thingies.
str = replacetext(str, "%PERSON", "[user]")
+10 -9
View File
@@ -59,16 +59,17 @@
if(board)
. += "button-board"
/obj/machinery/button/attackby(obj/item/W, mob/living/user, params)
if(W.tool_behaviour == TOOL_SCREWDRIVER)
if(panel_open || allowed(user))
default_deconstruction_screwdriver(user, "button-open", "[skin]",W)
update_appearance()
else
to_chat(user, span_alert("Maintenance Access Denied."))
flick("[skin]-denied", src)
return
/obj/machinery/button/screwdriver_act(mob/living/user, obj/item/tool)
if(panel_open || allowed(user))
default_deconstruction_screwdriver(user, "button-open", "[skin]", tool)
update_appearance()
else
to_chat(user, span_alert("Maintenance Access Denied."))
flick("[skin]-denied", src)
return TRUE
/obj/machinery/button/attackby(obj/item/W, mob/living/user, params)
if(panel_open)
if(!device && istype(W, /obj/item/assembly))
if(!user.transferItemToLoc(W, src))
+24 -17
View File
@@ -762,6 +762,30 @@
else
updateDialog()
/obj/machinery/door/airlock/screwdriver_act(mob/living/user, obj/item/tool)
. = TRUE
if(panel_open && detonated)
to_chat(user, span_warning("[src] has no maintenance panel!"))
return
panel_open = !panel_open
to_chat(user, span_notice("You [panel_open ? "open":"close"] the maintenance panel of the airlock."))
tool.play_tool_sound(src)
update_appearance()
/obj/machinery/door/airlock/wirecutter_act(mob/living/user, obj/item/tool)
if(note)
if(user.CanReach(src))
user.visible_message(span_notice("[user] cuts down [note] from [src]."), span_notice("You remove [note] from [src]."))
else //telekinesis
visible_message(span_notice("[tool] cuts down [note] from [src]."))
tool.play_tool_sound(src)
note.forceMove(tool.drop_location())
note = null
update_appearance()
return TRUE
else
return FALSE
/obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params)
if(!issilicon(user) && !isAdminGhostAI(user))
@@ -885,23 +909,6 @@
span_notice("You cut through \the [src]'s outer grille."))
security_level = AIRLOCK_SECURITY_PLASTEEL_O
return
if(C.tool_behaviour == TOOL_SCREWDRIVER)
if(panel_open && detonated)
to_chat(user, span_warning("[src] has no maintenance panel!"))
return
panel_open = !panel_open
to_chat(user, span_notice("You [panel_open ? "open":"close"] the maintenance panel of the airlock."))
C.play_tool_sound(src)
update_appearance()
else if((C.tool_behaviour == TOOL_WIRECUTTER) && note)
if(user.CanReach(src))
user.visible_message(span_notice("[user] cuts down [note] from [src]."), span_notice("You remove [note] from [src]."))
else //telekinesis
visible_message(span_notice("[C] cuts down [note] from [src]."))
C.play_tool_sound(src)
note.forceMove(C.drop_location())
note = null
update_appearance()
else if(is_wire_tool(C) && panel_open)
attempt_wire_interaction(user)
return
+10 -7
View File
@@ -117,6 +117,16 @@
efficiency = (cap + 1) * 0.5 //used in the amount of charge in power cell uses
/obj/machinery/electrolyzer/screwdriver_act(mob/living/user, obj/item/tool)
tool.play_tool_sound(src, 50)
panel_open = !panel_open
user.visible_message(span_notice("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src]."), span_notice("You [panel_open ? "open" : "close"] the hatch on \the [src]."))
update_appearance()
return TRUE
/obj/machinery/electrolyzer/crowbar_act(mob/living/user, obj/item/tool)
return default_deconstruction_crowbar(tool)
/obj/machinery/electrolyzer/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
if(default_unfasten_wrench(user, I))
@@ -136,13 +146,6 @@
user.visible_message(span_notice("\The [user] inserts a power cell into \the [src]."), span_notice("You insert the power cell into \the [src]."))
SStgui.update_uis(src)
return
if(I.tool_behaviour == TOOL_SCREWDRIVER)
panel_open = !panel_open
user.visible_message(span_notice("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src]."), span_notice("You [panel_open ? "open" : "close"] the hatch on \the [src]."))
update_appearance()
return
if(default_deconstruction_crowbar(I))
return
return ..()
+10 -11
View File
@@ -96,17 +96,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/sparker, 26)
return FALSE
return ..()
/obj/machinery/sparker/attackby(obj/item/W, mob/user, params)
if (W.tool_behaviour == TOOL_SCREWDRIVER)
add_fingerprint(user)
disable = !disable
if (disable)
user.visible_message(span_notice("[user] disables \the [src]!"), span_notice("You disable the connection to \the [src]."))
if (!disable)
user.visible_message(span_notice("[user] reconnects \the [src]!"), span_notice("You fix the connection to \the [src]."))
update_appearance()
else
return ..()
/obj/machinery/sparker/screwdriver_act(mob/living/user, obj/item/tool)
add_fingerprint(user)
tool.play_tool_sound(src, 50)
disable = !disable
if (disable)
user.visible_message(span_notice("[user] disables \the [src]!"), span_notice("You disable the connection to \the [src]."))
if (!disable)
user.visible_message(span_notice("[user] reconnects \the [src]!"), span_notice("You fix the connection to \the [src]."))
update_appearance()
return TRUE
/obj/machinery/sparker/attack_ai()
if (anchored)
+8 -7
View File
@@ -96,18 +96,19 @@
icon_state = "[base_icon_state][open]"
return ..()
/obj/machinery/navbeacon/screwdriver_act(mob/living/user, obj/item/tool)
add_fingerprint(user)
open = !open
user.visible_message(span_notice("[user] [open ? "opens" : "closes"] the beacon's cover."), span_notice("You [open ? "open" : "close"] the beacon's cover."))
update_appearance()
tool.play_tool_sound(src, 50)
return TRUE
/obj/machinery/navbeacon/attackby(obj/item/I, mob/user, params)
var/turf/T = loc
if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE)
return // prevent intraction when T-scanner revealed
if(I.tool_behaviour == TOOL_SCREWDRIVER)
open = !open
user.visible_message(span_notice("[user] [open ? "opens" : "closes"] the beacon's cover."), span_notice("You [open ? "open" : "close"] the beacon's cover."))
update_appearance()
else if (istype(I, /obj/item/card/id)||istype(I, /obj/item/pda))
if(open)
if (src.allowed(user))
+25 -21
View File
@@ -409,28 +409,32 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/requests_console, 30)
Radio.set_frequency(radio_freq)
Radio.talk_into(src, "[alert]: <i>[message]</i>", radio_freq)
/obj/machinery/requests_console/attackby(obj/item/O, mob/user, params)
if(O.tool_behaviour == TOOL_CROWBAR)
if(open)
to_chat(user, span_notice("You close the maintenance panel."))
open = FALSE
else
to_chat(user, span_notice("You open the maintenance panel."))
open = TRUE
update_appearance()
return
if(O.tool_behaviour == TOOL_SCREWDRIVER)
if(open)
hackState = !hackState
if(hackState)
to_chat(user, span_notice("You modify the wiring."))
else
to_chat(user, span_notice("You reset the wiring."))
update_appearance()
else
to_chat(user, span_warning("You must open the maintenance panel first!"))
return
/obj/machinery/requests_console/crowbar_act(mob/living/user, obj/item/tool)
tool.play_tool_sound(src, 50)
if(open)
to_chat(user, span_notice("You close the maintenance panel."))
open = FALSE
else
to_chat(user, span_notice("You open the maintenance panel."))
open = TRUE
update_appearance()
return TRUE
/obj/machinery/requests_console/screwdriver_act(mob/living/user, obj/item/tool)
if(open)
hackState = !hackState
if(hackState)
to_chat(user, span_notice("You modify the wiring."))
else
to_chat(user, span_notice("You reset the wiring."))
update_appearance()
tool.play_tool_sound(src, 50)
else
to_chat(user, span_warning("You must open the maintenance panel first!"))
return TRUE
/obj/machinery/requests_console/attackby(obj/item/O, mob/user, params)
var/obj/item/card/id/ID = O.GetID()
if(ID)
if(screen == REQ_SCREEN_AUTHENTICATE)
+28 -24
View File
@@ -184,15 +184,35 @@
to_chat(user, span_warning("The device must first be secured to the floor!"))
return
/obj/machinery/shieldgen/screwdriver_act(mob/living/user, obj/item/tool)
tool.play_tool_sound(src, 100)
panel_open = !panel_open
if(panel_open)
to_chat(user, span_notice("You open the panel and expose the wiring."))
else
to_chat(user, span_notice("You close the panel."))
return TRUE
/obj/machinery/shieldgen/wrench_act(mob/living/user, obj/item/tool)
. = TRUE
if(locked)
to_chat(user, span_warning("The bolts are covered! Unlocking this would retract the covers."))
return
if(!anchored && !isinspace())
tool.play_tool_sound(src, 100)
to_chat(user, span_notice("You secure \the [src] to the floor!"))
set_anchored(TRUE)
else if(anchored)
tool.play_tool_sound(src, 100)
to_chat(user, span_notice("You unsecure \the [src] from the floor!"))
if(active)
to_chat(user, span_notice("\The [src] shuts off!"))
shields_down()
set_anchored(FALSE)
/obj/machinery/shieldgen/attackby(obj/item/W, mob/user, params)
if(W.tool_behaviour == TOOL_SCREWDRIVER)
W.play_tool_sound(src, 100)
panel_open = !panel_open
if(panel_open)
to_chat(user, span_notice("You open the panel and expose the wiring."))
else
to_chat(user, span_notice("You close the panel."))
else if(istype(W, /obj/item/stack/cable_coil) && (machine_stat & BROKEN) && panel_open)
if(istype(W, /obj/item/stack/cable_coil) && (machine_stat & BROKEN) && panel_open)
var/obj/item/stack/cable_coil/coil = W
if (coil.get_amount() < 1)
to_chat(user, span_warning("You need one length of cable to repair [src]!"))
@@ -207,22 +227,6 @@
to_chat(user, span_notice("You repair \the [src]."))
update_appearance()
else if(W.tool_behaviour == TOOL_WRENCH)
if(locked)
to_chat(user, span_warning("The bolts are covered! Unlocking this would retract the covers."))
return
if(!anchored && !isinspace())
W.play_tool_sound(src, 100)
to_chat(user, span_notice("You secure \the [src] to the floor!"))
set_anchored(TRUE)
else if(anchored)
W.play_tool_sound(src, 100)
to_chat(user, span_notice("You unsecure \the [src] from the floor!"))
if(active)
to_chat(user, span_notice("\The [src] shuts off!"))
shields_down()
set_anchored(FALSE)
else if(W.GetID())
if(allowed(user) && !(obj_flags & EMAGGED))
locked = !locked
+22 -20
View File
@@ -57,30 +57,32 @@
else
to_chat(user, span_warning("You need to screw \the [src] to the floor first!"))
/obj/machinery/power/singularity_beacon/attackby(obj/item/W, mob/user, params)
if(W.tool_behaviour == TOOL_WRENCH)
if(active)
to_chat(user, span_warning("You need to deactivate \the [src] first!"))
return
/obj/machinery/power/singularity_beacon/wrench_act(mob/living/user, obj/item/tool)
. = TRUE
if(active)
to_chat(user, span_warning("You need to deactivate \the [src] first!"))
return
if(anchored)
set_anchored(FALSE)
to_chat(user, span_notice("You unbolt \the [src] from the floor and detach it from the cable."))
disconnect_from_network()
if(anchored)
tool.play_tool_sound(src, 50)
set_anchored(FALSE)
to_chat(user, span_notice("You unbolt \the [src] from the floor and detach it from the cable."))
disconnect_from_network()
return
else
if(!connect_to_network())
to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!"))
return
else
if(!connect_to_network())
to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!"))
return
set_anchored(TRUE)
to_chat(user, span_notice("You bolt \the [src] to the floor and attach it to the cable."))
return
else if(W.tool_behaviour == TOOL_SCREWDRIVER)
user.visible_message( \
tool.play_tool_sound(src, 50)
set_anchored(TRUE)
to_chat(user, span_notice("You bolt \the [src] to the floor and attach it to the cable."))
return
/obj/machinery/power/singularity_beacon/screwdriver_act(mob/living/user, obj/item/tool)
user.visible_message( \
"[user] messes with \the [src] for a bit.", \
span_notice("You can't fit the screwdriver into \the [src]'s bolts! Try using a wrench."))
else
return ..()
return TRUE
/obj/machinery/power/singularity_beacon/Destroy()
if(active)
+60 -47
View File
@@ -110,45 +110,70 @@
else
. = timer_set
/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WRENCH && can_unanchor)
if(!anchored)
if(!isturf(loc) || isspaceturf(loc))
to_chat(user, span_notice("The bomb must be placed on solid ground to attach it."))
else
to_chat(user, span_notice("You firmly wrench the bomb to the floor."))
I.play_tool_sound(src)
set_anchored(TRUE)
if(active)
to_chat(user, span_notice("The bolts lock in place."))
/obj/machinery/syndicatebomb/wrench_act(mob/living/user, obj/item/tool)
if(!can_unanchor)
return FALSE
if(!anchored)
if(!isturf(loc) || isspaceturf(loc))
to_chat(user, span_notice("The bomb must be placed on solid ground to attach it."))
else
if(!active)
to_chat(user, span_notice("You wrench the bomb from the floor."))
I.play_tool_sound(src)
set_anchored(FALSE)
else
to_chat(user, span_warning("The bolts are locked down!"))
to_chat(user, span_notice("You firmly wrench the bomb to the floor."))
tool.play_tool_sound(src)
set_anchored(TRUE)
if(active)
to_chat(user, span_notice("The bolts lock in place."))
else
if(!active)
to_chat(user, span_notice("You wrench the bomb from the floor."))
tool.play_tool_sound(src)
set_anchored(FALSE)
else
to_chat(user, span_warning("The bolts are locked down!"))
else if(I.tool_behaviour == TOOL_SCREWDRIVER)
open_panel = !open_panel
update_appearance()
to_chat(user, span_notice("You [open_panel ? "open" : "close"] the wire panel."))
return TRUE
else if(is_wire_tool(I) && open_panel)
/obj/machinery/syndicatebomb/screwdriver_act(mob/living/user, obj/item/tool)
tool.play_tool_sound(src, 50)
open_panel = !open_panel
update_appearance()
to_chat(user, span_notice("You [open_panel ? "open" : "close"] the wire panel."))
return TRUE
/obj/machinery/syndicatebomb/crowbar_act(mob/living/user, obj/item/tool)
. = TRUE
if(open_panel && wires.is_all_cut())
if(payload)
tool.play_tool_sound(src, 25) // sshhh
to_chat(user, span_notice("You carefully pry out [payload]."))
payload.forceMove(drop_location())
payload = null
else
to_chat(user, span_warning("There isn't anything in here to remove!"))
else if (open_panel)
to_chat(user, span_warning("The wires connecting the shell to the explosives are holding it down!"))
else
to_chat(user, span_warning("The cover is screwed on, it won't pry off!"))
/obj/machinery/syndicatebomb/welder_act(mob/living/user, obj/item/tool)
if(payload || !wires.is_all_cut() || !open_panel)
return FALSE
if(!tool.tool_start_check(user, amount=5)) //uses up 5 fuel
return TRUE
to_chat(user, span_notice("You start to cut [src] apart..."))
if(tool.use_tool(src, user, 20, volume=50, amount=5)) // uses up 5 fuel
to_chat(user, span_notice("You cut [src] apart."))
new /obj/item/stack/sheet/plasteel(loc, 5)
qdel(src)
return TRUE
/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, params)
if(is_wire_tool(I) && open_panel)
wires.interact(user)
else if(I.tool_behaviour == TOOL_CROWBAR)
if(open_panel && wires.is_all_cut())
if(payload)
to_chat(user, span_notice("You carefully pry out [payload]."))
payload.forceMove(drop_location())
payload = null
else
to_chat(user, span_warning("There isn't anything in here to remove!"))
else if (open_panel)
to_chat(user, span_warning("The wires connecting the shell to the explosives are holding it down!"))
else
to_chat(user, span_warning("The cover is screwed on, it won't pry off!"))
else if(istype(I, /obj/item/bombcore))
if(!payload)
if(!user.transferItemToLoc(I, src))
@@ -157,22 +182,10 @@
to_chat(user, span_notice("You place [payload] into [src]."))
else
to_chat(user, span_warning("[payload] is already loaded into [src]! You'll have to remove it first."))
else if(I.tool_behaviour == TOOL_WELDER)
if(payload || !wires.is_all_cut() || !open_panel)
return
if(!I.tool_start_check(user, amount=5)) //uses up 5 fuel
return
to_chat(user, span_notice("You start to cut [src] apart..."))
if(I.use_tool(src, user, 20, volume=50, amount=5)) //uses up 5 fuel
to_chat(user, span_notice("You cut [src] apart."))
new /obj/item/stack/sheet/plasteel( loc, 5)
qdel(src)
else
var/old_integ = atom_integrity
. = ..()
if((old_integ > atom_integrity) && active && (payload in src))
if((old_integ > atom_integrity) && active && (payload in src))
to_chat(user, span_warning("That seems like a really bad idea..."))
/obj/machinery/syndicatebomb/interact(mob/user)
@@ -39,13 +39,12 @@
var/customjob = "Admin"
var/custommessage = "This is a test, please ignore."
/obj/machinery/computer/message_monitor/attackby(obj/item/O, mob/living/user, params)
if(O.tool_behaviour == TOOL_SCREWDRIVER && (obj_flags & EMAGGED))
/obj/machinery/computer/message_monitor/screwdriver_act(mob/living/user, obj/item/I)
if(obj_flags & EMAGGED)
//Stops people from just unscrewing the monitor and putting it back to get the console working again.
to_chat(user, span_warning("It is too hot to mess with!"))
else
return ..()
return TRUE
return ..()
/obj/machinery/computer/message_monitor/emag_act(mob/user)
if(obj_flags & EMAGGED)
+34 -31
View File
@@ -45,6 +45,40 @@
active = FALSE
/obj/item/rcl/screwdriver_act(mob/living/user, obj/item/tool)
if(!loaded)
return FALSE
. = TRUE
if(ghetto && prob(10)) //Is it a ghetto RCL? If so, give it a 10% chance to fall apart
to_chat(user, span_warning("You attempt to loosen the securing screws on the side, but it falls apart!"))
while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
var/diff = loaded.amount % 30
if(diff)
loaded.use(diff)
new /obj/item/stack/pipe_cleaner_coil(get_turf(user), diff)
else
loaded.use(30)
new /obj/item/stack/pipe_cleaner_coil(get_turf(user), 30)
qdel(src)
return
tool.play_tool_sound(src)
to_chat(user, span_notice("You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires."))
while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
var/diff = loaded.amount % 30
if(diff)
loaded.use(diff)
new /obj/item/stack/pipe_cleaner_coil(get_turf(user), diff)
else
loaded.use(30)
new /obj/item/stack/pipe_cleaner_coil(get_turf(user), 30)
loaded.max_amount = initial(loaded.max_amount)
if(!user.put_in_hands(loaded))
loaded.forceMove(get_turf(user))
loaded = null
update_appearance()
/obj/item/rcl/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/stack/pipe_cleaner_coil))
var/obj/item/stack/pipe_cleaner_coil/C = W
@@ -66,37 +100,6 @@
return
update_appearance()
to_chat(user, span_notice("You add the pipe cleaners to [src]. It now contains [loaded.amount]."))
else if(W.tool_behaviour == TOOL_SCREWDRIVER)
if(!loaded)
return
if(ghetto && prob(10)) //Is it a ghetto RCL? If so, give it a 10% chance to fall apart
to_chat(user, span_warning("You attempt to loosen the securing screws on the side, but it falls apart!"))
while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
var/diff = loaded.amount % 30
if(diff)
loaded.use(diff)
new /obj/item/stack/pipe_cleaner_coil(get_turf(user), diff)
else
loaded.use(30)
new /obj/item/stack/pipe_cleaner_coil(get_turf(user), 30)
qdel(src)
return
to_chat(user, span_notice("You loosen the securing screws on the side, allowing you to lower the guiding edge and retrieve the wires."))
while(loaded.amount > 30) //There are only two kinds of situations: "nodiff" (60,90), or "diff" (31-59, 61-89)
var/diff = loaded.amount % 30
if(diff)
loaded.use(diff)
new /obj/item/stack/pipe_cleaner_coil(get_turf(user), diff)
else
loaded.use(30)
new /obj/item/stack/pipe_cleaner_coil(get_turf(user), 30)
loaded.max_amount = initial(loaded.max_amount)
if(!user.put_in_hands(loaded))
loaded.forceMove(get_turf(user))
loaded = null
update_appearance()
else
..()
+29 -32
View File
@@ -926,42 +926,39 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.visible_message(span_suicide("[user] is puffin hard on dat vape, [user.p_they()] trying to join the vape life on a whole notha plane!"))//it doesn't give you cancer, it is cancer
return (TOXLOSS|OXYLOSS)
/obj/item/clothing/mask/vape/attackby(obj/item/O, mob/user, params)
if(O.tool_behaviour == TOOL_SCREWDRIVER)
if(!screw)
screw = TRUE
to_chat(user, span_notice("You open the cap on [src]."))
reagents.flags |= OPENCONTAINER
if(obj_flags & EMAGGED)
add_overlay("vapeopen_high")
else if(super)
add_overlay("vapeopen_med")
else
add_overlay("vapeopen_low")
/obj/item/clothing/mask/vape/screwdriver_act(mob/living/user, obj/item/tool)
if(!screw)
screw = TRUE
to_chat(user, span_notice("You open the cap on [src]."))
reagents.flags |= OPENCONTAINER
if(obj_flags & EMAGGED)
add_overlay("vapeopen_high")
else if(super)
add_overlay("vapeopen_med")
else
screw = FALSE
to_chat(user, span_notice("You close the cap on [src]."))
reagents.flags &= ~(OPENCONTAINER)
add_overlay("vapeopen_low")
else
screw = FALSE
to_chat(user, span_notice("You close the cap on [src]."))
reagents.flags &= ~(OPENCONTAINER)
cut_overlays()
/obj/item/clothing/mask/vape/multitool_act(mob/living/user, obj/item/tool)
. = TRUE
if(screw && !(obj_flags & EMAGGED))//also kinky
if(!super)
cut_overlays()
if(O.tool_behaviour == TOOL_MULTITOOL)
if(screw && !(obj_flags & EMAGGED))//also kinky
if(!super)
cut_overlays()
super = TRUE
to_chat(user, span_notice("You increase the voltage of [src]."))
add_overlay("vapeopen_med")
else
cut_overlays()
super = FALSE
to_chat(user, span_notice("You decrease the voltage of [src]."))
add_overlay("vapeopen_low")
if(screw && (obj_flags & EMAGGED))
to_chat(user, span_warning("[src] can't be modified!"))
super = TRUE
to_chat(user, span_notice("You increase the voltage of [src]."))
add_overlay("vapeopen_med")
else
..()
cut_overlays()
super = FALSE
to_chat(user, span_notice("You decrease the voltage of [src]."))
add_overlay("vapeopen_low")
if(screw && (obj_flags & EMAGGED))
to_chat(user, span_warning("[src] can't be modified!"))
/obj/item/clothing/mask/vape/emag_act(mob/user)// I WON'T REGRET WRITTING THIS, SURLY.
if(screw)
+9 -7
View File
@@ -132,6 +132,15 @@
var/atom/movable/screen/inventory/hand/H = over_object
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
/obj/item/defibrillator/screwdriver_act(mob/living/user, obj/item/tool)
if(cell)
cell.update_appearance()
cell.forceMove(get_turf(src))
cell = null
tool.play_tool_sound(src, 50)
to_chat(user, span_notice("You remove the cell from [src]."))
update_power()
/obj/item/defibrillator/attackby(obj/item/W, mob/user, params)
if(W == paddles)
toggle_paddles()
@@ -148,13 +157,6 @@
cell = W
to_chat(user, span_notice("You install a cell in [src]."))
update_power()
else if(W.tool_behaviour == TOOL_SCREWDRIVER)
if(cell)
cell.update_appearance()
cell.forceMove(get_turf(src))
cell = null
to_chat(user, span_notice("You remove the cell from [src]."))
update_power()
else
return ..()
@@ -39,6 +39,14 @@
. = ..()
diode = new /obj/item/stock_parts/micro_laser/ultra
/obj/item/laser_pointer/screwdriver_act(mob/living/user, obj/item/tool)
if(diode)
tool.play_tool_sound(src)
to_chat(user, span_notice("You remove the [diode.name] from \the [src]."))
diode.forceMove(drop_location())
diode = null
return TRUE
/obj/item/laser_pointer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/micro_laser))
if(!diode)
@@ -48,12 +56,6 @@
to_chat(user, span_notice("You install a [diode.name] in [src]."))
else
to_chat(user, span_warning("[src] already has a diode installed!"))
else if(W.tool_behaviour == TOOL_SCREWDRIVER)
if(diode)
to_chat(user, span_notice("You remove the [diode.name] from \the [src]."))
diode.forceMove(drop_location())
diode = null
else
return ..()
+25 -26
View File
@@ -74,35 +74,34 @@
update_appearance()
set_light(0)
/obj/item/powersink/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WRENCH)
if(mode == DISCONNECTED)
var/turf/T = loc
if(isturf(T) && T.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE)
attached = locate() in T
if(!attached)
to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!"))
else
set_mode(CLAMPED_OFF)
user.visible_message( \
"[user] attaches \the [src] to the cable.", \
span_notice("You bolt \the [src] into the floor and connect it to the cable."),
span_hear("You hear some wires being connected to something."))
else
/obj/item/powersink/wrench_act(mob/living/user, obj/item/tool)
. = TRUE
if(mode == DISCONNECTED)
var/turf/T = loc
if(isturf(T) && T.underfloor_accessibility >= UNDERFLOOR_INTERACTABLE)
attached = locate() in T
if(!attached)
to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!"))
else
set_mode(CLAMPED_OFF)
user.visible_message( \
"[user] attaches \the [src] to the cable.", \
span_notice("You bolt \the [src] into the floor and connect it to the cable."),
span_hear("You hear some wires being connected to something."))
else
set_mode(DISCONNECTED)
user.visible_message( \
"[user] detaches \the [src] from the cable.", \
span_notice("You unbolt \the [src] from the floor and detach it from the cable."),
span_hear("You hear some wires being disconnected from something."))
else if(I.tool_behaviour == TOOL_SCREWDRIVER)
user.visible_message( \
"[user] messes with \the [src] for a bit.", \
span_notice("You can't fit the screwdriver into \the [src]'s bolts! Try using a wrench."))
to_chat(user, span_warning("\The [src] must be placed over an exposed, powered cable node!"))
else
return ..()
set_mode(DISCONNECTED)
user.visible_message( \
"[user] detaches \the [src] from the cable.", \
span_notice("You unbolt \the [src] from the floor and detach it from the cable."),
span_hear("You hear some wires being disconnected from something."))
/obj/item/powersink/screwdriver_act(mob/living/user, obj/item/tool)
user.visible_message( \
"[user] messes with \the [src] for a bit.", \
span_notice("You can't fit the screwdriver into \the [src]'s bolts! Try using a wrench."))
return TRUE
/obj/item/powersink/attack_paw(mob/user, list/modifiers)
return
@@ -286,29 +286,32 @@ GLOBAL_LIST_INIT(channel_tokens, list(
keyslot2 = new /obj/item/encryptionkey/ai
command = TRUE
/obj/item/radio/headset/screwdriver_act(mob/living/user, obj/item/tool)
user.set_machine(src)
if(keyslot || keyslot2)
for(var/ch_name in channels)
SSradio.remove_object(src, GLOB.radiochannels[ch_name])
secure_radio_connections[ch_name] = null
if(keyslot)
user.put_in_hands(keyslot)
keyslot = null
if(keyslot2)
user.put_in_hands(keyslot2)
keyslot2 = null
recalculateChannels()
to_chat(user, span_notice("You pop out the encryption keys in the headset."))
else
to_chat(user, span_warning("This headset doesn't have any unique encryption keys! How useless..."))
tool.play_tool_sound(src, 10)
return TRUE
/obj/item/radio/headset/attackby(obj/item/W, mob/user, params)
user.set_machine(src)
if(W.tool_behaviour == TOOL_SCREWDRIVER)
if(keyslot || keyslot2)
for(var/ch_name in channels)
SSradio.remove_object(src, GLOB.radiochannels[ch_name])
secure_radio_connections[ch_name] = null
if(keyslot)
user.put_in_hands(keyslot)
keyslot = null
if(keyslot2)
user.put_in_hands(keyslot2)
keyslot2 = null
recalculateChannels()
to_chat(user, span_notice("You pop out the encryption keys in the headset."))
else
to_chat(user, span_warning("This headset doesn't have any unique encryption keys! How useless..."))
else if(istype(W, /obj/item/encryptionkey))
if(istype(W, /obj/item/encryptionkey))
if(keyslot && keyslot2)
to_chat(user, span_warning("The headset can't hold another key!"))
return
@@ -31,32 +31,31 @@
else
. += span_notice("It's <i>unscrewed</i> from the wall, and can be <b>detached</b>.")
/obj/item/radio/intercom/attackby(obj/item/I, mob/living/user, params)
if(I.tool_behaviour == TOOL_SCREWDRIVER)
if(unscrewed)
user.visible_message(span_notice("[user] starts tightening [src]'s screws..."), span_notice("You start screwing in [src]..."))
if(I.use_tool(src, user, 30, volume=50))
user.visible_message(span_notice("[user] tightens [src]'s screws!"), span_notice("You tighten [src]'s screws."))
unscrewed = FALSE
else
user.visible_message(span_notice("[user] starts loosening [src]'s screws..."), span_notice("You start unscrewing [src]..."))
if(I.use_tool(src, user, 40, volume=50))
user.visible_message(span_notice("[user] loosens [src]'s screws!"), span_notice("You unscrew [src], loosening it from the wall."))
unscrewed = TRUE
/obj/item/radio/intercom/screwdriver_act(mob/living/user, obj/item/tool)
if(unscrewed)
user.visible_message(span_notice("[user] starts tightening [src]'s screws..."), span_notice("You start screwing in [src]..."))
if(tool.use_tool(src, user, 30, volume=50))
user.visible_message(span_notice("[user] tightens [src]'s screws!"), span_notice("You tighten [src]'s screws."))
unscrewed = FALSE
else
user.visible_message(span_notice("[user] starts loosening [src]'s screws..."), span_notice("You start unscrewing [src]..."))
if(tool.use_tool(src, user, 40, volume=50))
user.visible_message(span_notice("[user] loosens [src]'s screws!"), span_notice("You unscrew [src], loosening it from the wall."))
unscrewed = TRUE
return TRUE
/obj/item/radio/intercom/wrench_act(mob/living/user, obj/item/tool)
. = TRUE
if(!unscrewed)
to_chat(user, span_warning("You need to unscrew [src] from the wall first!"))
return
else if(I.tool_behaviour == TOOL_WRENCH)
if(!unscrewed)
to_chat(user, span_warning("You need to unscrew [src] from the wall first!"))
return
user.visible_message(span_notice("[user] starts unsecuring [src]..."), span_notice("You start unsecuring [src]..."))
I.play_tool_sound(src)
if(I.use_tool(src, user, 80))
user.visible_message(span_notice("[user] unsecures [src]!"), span_notice("You detach [src] from the wall."))
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
new/obj/item/wallframe/intercom(get_turf(src))
qdel(src)
return
return ..()
user.visible_message(span_notice("[user] starts unsecuring [src]..."), span_notice("You start unsecuring [src]..."))
tool.play_tool_sound(src)
if(tool.use_tool(src, user, 80))
user.visible_message(span_notice("[user] unsecures [src]!"), span_notice("You detach [src] from the wall."))
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
new/obj/item/wallframe/intercom(get_turf(src))
qdel(src)
/**
* Override attack_tk_grab instead of attack_tk because we actually want attack_tk's
@@ -422,12 +422,13 @@
else if(icon_state == "[initial_icon_state]_reverse") //so flipping doesn't overwrite an unexpected icon_state (e.g. an admin's)
icon_state = initial_icon_state
/obj/item/tape/attackby(obj/item/I, mob/user, params)
if(unspooled && (I.tool_behaviour == TOOL_SCREWDRIVER))
to_chat(user, span_notice("You start winding the tape back in..."))
if(I.use_tool(src, user, 120))
to_chat(user, span_notice("You wind the tape back in."))
respool()
/obj/item/tape/screwdriver_act(mob/living/user, obj/item/tool)
if(!unspooled)
return FALSE
to_chat(user, span_notice("You start winding the tape back in..."))
if(tool.use_tool(src, user, 120))
to_chat(user, span_notice("You wind the tape back in."))
respool()
//Random colour tapes
/obj/item/tape/random
+23 -18
View File
@@ -87,29 +87,34 @@
log_combat(user, target, "flamethrowered", src)
flame_turf(turflist)
/obj/item/flamethrower/attackby(obj/item/W, mob/user, params)
if(W.tool_behaviour == TOOL_WRENCH && !status)//Taking this apart
var/turf/T = get_turf(src)
if(weldtool)
weldtool.forceMove(T)
weldtool = null
if(igniter)
igniter.forceMove(T)
igniter = null
if(ptank)
ptank.forceMove(T)
ptank = null
new /obj/item/stack/rods(T)
qdel(src)
return
/obj/item/flamethrower/wrench_act(mob/living/user, obj/item/tool)
. = TRUE
if(status)
return FALSE
tool.play_tool_sound(src)
var/turf/T = get_turf(src)
if(weldtool)
weldtool.forceMove(T)
weldtool = null
if(igniter)
igniter.forceMove(T)
igniter = null
if(ptank)
ptank.forceMove(T)
ptank = null
new /obj/item/stack/rods(T)
qdel(src)
else if(W.tool_behaviour == TOOL_SCREWDRIVER && igniter && !lit)
/obj/item/flamethrower/screwdriver_act(mob/living/user, obj/item/tool)
if(igniter && !lit)
tool.play_tool_sound(src)
status = !status
to_chat(user, span_notice("[igniter] is now [status ? "secured" : "unsecured"]!"))
update_appearance()
return
return TRUE
else if(isigniter(W))
/obj/item/flamethrower/attackby(obj/item/W, mob/user, params)
if(isigniter(W))
var/obj/item/assembly/igniter/I = W
if(I.secured)
return
@@ -99,26 +99,56 @@
if(stage == GRENADE_WIRED)
wires.interact(user)
/obj/item/grenade/chem_grenade/screwdriver_act(mob/living/user, obj/item/tool)
. = TRUE
if(stage == GRENADE_WIRED)
if(beakers.len)
stage_change(GRENADE_READY)
to_chat(user, span_notice("You lock the [initial(name)] assembly."))
tool.play_tool_sound(src, 25)
else
to_chat(user, span_warning("You need to add at least one beaker before locking the [initial(name)] assembly!"))
else if(stage == GRENADE_READY)
det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50
if(landminemode)
landminemode.time = det_time * 0.1 //overwrites the proxy sensor activation timer
tool.play_tool_sound(src, 25)
to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)]."))
else
to_chat(user, span_warning("You need to add a wire!"))
return TRUE
/obj/item/grenade/chem_grenade/wirecutter_act(mob/living/user, obj/item/tool)
if(stage == GRENADE_READY && !active)
tool.play_tool_sound(src)
stage_change(GRENADE_WIRED)
to_chat(user, span_notice("You unlock the [initial(name)] assembly."))
return TRUE
/obj/item/grenade/chem_grenade/wrench_act(mob/living/user, obj/item/tool)
if(stage != GRENADE_WIRED)
return FALSE
if(beakers.len)
for(var/obj/beaker in beakers)
beaker.forceMove(drop_location())
if(!beaker.reagents)
continue
var/reagent_list = pretty_string_from_reagent_list(beaker.reagents)
user.log_message("removed [beaker] ([reagent_list]) from [src]", LOG_GAME)
beakers = list()
to_chat(user, span_notice("You open the [initial(name)] assembly and remove the payload."))
return
tool.play_tool_sound(src)
wires.detach_assembly(wires.get_wire(1))
new /obj/item/stack/cable_coil(get_turf(src), 1)
stage_change(GRENADE_EMPTY)
to_chat(user, span_notice("You remove the activation mechanism from the [initial(name)] assembly."))
/obj/item/grenade/chem_grenade/attackby(obj/item/item, mob/user, params)
if(istype(item, /obj/item/assembly) && stage == GRENADE_WIRED)
wires.interact(user)
if(item.tool_behaviour == TOOL_SCREWDRIVER)
if(stage == GRENADE_WIRED)
if(beakers.len)
stage_change(GRENADE_READY)
to_chat(user, span_notice("You lock the [initial(name)] assembly."))
item.play_tool_sound(src, 25)
else
to_chat(user, span_warning("You need to add at least one beaker before locking the [initial(name)] assembly!"))
else if(stage == GRENADE_READY)
det_time = det_time == 50 ? 30 : 50 //toggle between 30 and 50
if(landminemode)
landminemode.time = det_time * 0.1 //overwrites the proxy sensor activation timer
to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)]."))
else
to_chat(user, span_warning("You need to add a wire!"))
return
else if(stage == GRENADE_WIRED && is_type_in_list(item, allowed_containers))
. = TRUE //no afterattack
if(is_type_in_list(item, banned_containers))
@@ -147,26 +177,6 @@
else
to_chat(user, span_warning("You need one length of coil to wire the assembly!"))
return
else if(stage == GRENADE_READY && item.tool_behaviour == TOOL_WIRECUTTER && !active)
stage_change(GRENADE_WIRED)
to_chat(user, span_notice("You unlock the [initial(name)] assembly."))
else if(stage == GRENADE_WIRED && item.tool_behaviour == TOOL_WRENCH)
if(beakers.len)
for(var/obj/beaker in beakers)
beaker.forceMove(drop_location())
if(!beaker.reagents)
continue
var/reagent_list = pretty_string_from_reagent_list(beaker.reagents)
user.log_message("removed [beaker] ([reagent_list]) from [src]", LOG_GAME)
beakers = list()
to_chat(user, span_notice("You open the [initial(name)] assembly and remove the payload."))
return
wires.detach_assembly(wires.get_wire(1))
new /obj/item/stack/cable_coil(get_turf(src), 1)
stage_change(GRENADE_EMPTY)
to_chat(user, span_notice("You remove the activation mechanism from the [initial(name)] assembly."))
else
return ..()
+23 -17
View File
@@ -144,26 +144,32 @@
var/mob/mob = loc
mob.dropItemToGround(src)
/obj/item/grenade/attackby(obj/item/weapon, mob/user, params)
/obj/item/grenade/screwdriver_act(mob/living/user, obj/item/tool)
if(active)
return ..()
return FALSE
if(change_det_time())
tool.play_tool_sound(src)
to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)]."))
return TRUE
if(weapon.tool_behaviour == TOOL_MULTITOOL)
var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", list("Instant", 3, 4, 5))
if (isnull(newtime))
return
if(!user.canUseTopic(src, BE_CLOSE))
return
if(newtime == "Instant" && change_det_time(0))
to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous."))
return
newtime = round(newtime)
if(change_det_time(newtime))
to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)]."))
/obj/item/grenade/multitool_act(mob/living/user, obj/item/tool)
. = ..()
if(active)
return FALSE
. = TRUE
var/newtime = tgui_input_list(user, "Please enter a new detonation time", "Detonation Timer", list("Instant", 3, 4, 5))
if (isnull(newtime))
return
else if(weapon.tool_behaviour == TOOL_SCREWDRIVER)
if(change_det_time())
to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)]."))
if(!user.canUseTopic(src, BE_CLOSE))
return
if(newtime == "Instant" && change_det_time(0))
to_chat(user, span_notice("You modify the time delay. It's set to be instantaneous."))
return
newtime = round(newtime)
if(change_det_time(newtime))
to_chat(user, span_notice("You modify the time delay. It's set for [DisplayTimeText(det_time)]."))
/obj/item/grenade/proc/change_det_time(time) //Time uses real time.
. = TRUE
+5 -3
View File
@@ -34,10 +34,12 @@
target = null
return ..()
/obj/item/grenade/c4/screwdriver_act(mob/living/user, obj/item/tool)
to_chat(user, span_notice("The wire panel can be accessed without a screwdriver."))
return TRUE
/obj/item/grenade/c4/attackby(obj/item/item, mob/user, params)
if(item.tool_behaviour == TOOL_SCREWDRIVER)
to_chat(user, span_notice("The wire panel can be accessed without a screwdriver."))
else if(is_wire_tool(item))
if(is_wire_tool(item))
wires.interact(user)
else
return ..()
+13 -12
View File
@@ -59,20 +59,21 @@
return TRUE
return FALSE
/obj/item/inducer/screwdriver_act(mob/living/user, obj/item/tool)
. = TRUE
tool.play_tool_sound(src)
if(!opened)
to_chat(user, span_notice("You unscrew the battery compartment."))
opened = TRUE
update_appearance()
return
else
to_chat(user, span_notice("You close the battery compartment."))
opened = FALSE
update_appearance()
return
/obj/item/inducer/attackby(obj/item/W, mob/user)
if(W.tool_behaviour == TOOL_SCREWDRIVER)
W.play_tool_sound(src)
if(!opened)
to_chat(user, span_notice("You unscrew the battery compartment."))
opened = TRUE
update_appearance()
return
else
to_chat(user, span_notice("You close the battery compartment."))
opened = FALSE
update_appearance()
return
if(istype(W, /obj/item/stock_parts/cell))
if(opened)
if(!cell)
+7 -3
View File
@@ -427,6 +427,11 @@
else
. += span_warning("\The [src] does not have a power source installed.")
/obj/item/melee/baton/security/screwdriver_act(mob/living/user, obj/item/tool)
if(tryremovecell(user))
tool.play_tool_sound(src)
return TRUE
/obj/item/melee/baton/security/attackby(obj/item/item, mob/user, params)
if(istype(item, /obj/item/stock_parts/cell))
var/obj/item/stock_parts/cell/active_cell = item
@@ -441,9 +446,6 @@
cell = item
to_chat(user, span_notice("You install a cell in [src]."))
update_appearance()
else if(item.tool_behaviour == TOOL_SCREWDRIVER)
tryremovecell(user)
else
return ..()
@@ -451,6 +453,8 @@
if(cell && can_remove_cell)
cell.forceMove(drop_location())
to_chat(user, span_notice("You remove the cell from [src]."))
return TRUE
return FALSE
/obj/item/melee/baton/security/attack_self(mob/user)
if(cell?.charge >= cell_hit_cost)
+18 -3
View File
@@ -70,6 +70,24 @@
out += span_notice("[icon2html(tank, user)] It has \a [tank] mounted onto it.")
. += out.Join("\n")
/obj/item/pneumatic_cannon/screwdriver_act(mob/living/user, obj/item/tool)
if(tank)
tool.play_tool_sound(src)
updateTank(tank, 1, user)
return TRUE
/obj/item/pneumatic_cannon/wrench_act(mob/living/user, obj/item/tool)
playsound(src, 'sound/items/ratchet.ogg', 50, TRUE)
switch(pressureSetting)
if(1)
pressureSetting = 2
if(2)
pressureSetting = 3
if(3)
pressureSetting = 1
to_chat(user, span_notice("You tweak \the [src]'s pressure output to [pressureSetting]."))
return TRUE
/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/living/user, params)
if(user.combat_mode)
return ..()
@@ -92,9 +110,6 @@
if(3)
pressureSetting = 1
to_chat(user, span_notice("You tweak \the [src]'s pressure output to [pressureSetting]."))
else if(W.tool_behaviour == TOOL_SCREWDRIVER)
if(tank)
updateTank(tank, 1, user)
else if(loadedWeightClass >= maxWeightClass)
to_chat(user, span_warning("\The [src] can't hold any more items!"))
else if(isitem(W))
+16 -13
View File
@@ -28,6 +28,22 @@
if(tank)
. += span_notice("[icon2html(tank, user)] It has \a [tank] mounted onto it.")
/obj/item/melee/powerfist/wrench_act(mob/living/user, obj/item/tool)
switch(fisto_setting)
if(1)
fisto_setting = 2
if(2)
fisto_setting = 3
if(3)
fisto_setting = 1
tool.play_tool_sound(src)
to_chat(user, span_notice("You tweak \the [src]'s piston valve to [fisto_setting]."))
return TRUE
/obj/item/melee/powerfist/screwdriver_act(mob/living/user, obj/item/tool)
if(tank)
updateTank(tank, 1, user)
return TRUE
/obj/item/melee/powerfist/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/tank/internals))
@@ -37,19 +53,6 @@
to_chat(user, span_warning("\The [IT] is too small for \the [src]."))
return
updateTank(W, 0, user)
else if(W.tool_behaviour == TOOL_WRENCH)
switch(fisto_setting)
if(1)
fisto_setting = 2
if(2)
fisto_setting = 3
if(3)
fisto_setting = 1
W.play_tool_sound(src)
to_chat(user, span_notice("You tweak \the [src]'s piston valve to [fisto_setting]."))
else if(W.tool_behaviour == TOOL_SCREWDRIVER)
if(tank)
updateTank(tank, 1, user)
/obj/item/melee/powerfist/proc/updateTank(obj/item/tank/internals/thetank, removing = 0, mob/living/carbon/human/user)
if(removing)
+28 -25
View File
@@ -44,35 +44,38 @@
if(can_hack_open)
. += "The service panel is currently <b>[panel_open ? "unscrewed" : "screwed shut"]</b>."
/obj/item/storage/secure/attackby(obj/item/weapon, mob/user, params)
/obj/item/storage/secure/tool_act(mob/living/user, obj/item/tool)
if(can_hack_open && SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED))
if (weapon.tool_behaviour == TOOL_SCREWDRIVER)
if (weapon.use_tool(src, user, 20))
panel_open = !panel_open
to_chat(user, span_notice("You [panel_open ? "open" : "close"] the service panel."))
return
if (weapon.tool_behaviour == TOOL_WIRECUTTER)
to_chat(user, span_danger("[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be <b>pulsed</b>."))
return
if (weapon.tool_behaviour == TOOL_MULTITOOL)
if(lock_hacking)
to_chat(user, span_danger("This safe is already being hacked."))
return
if(panel_open == TRUE)
to_chat(user, span_danger("Now attempting to reset internal memory, please hold."))
lock_hacking = TRUE
if (weapon.use_tool(src, user, 400))
to_chat(user, span_danger("Internal memory reset - lock has been disengaged."))
lock_set = FALSE
return ..()
else
return FALSE
lock_hacking = FALSE
return
/obj/item/storage/secure/wirecutter_act(mob/living/user, obj/item/tool)
to_chat(user, span_danger("[src] is protected from this sort of tampering, yet it appears the internal memory wires can still be <b>pulsed</b>."))
return
to_chat(user, span_warning("You must <b>unscrew</b> the service panel before you can pulse the wiring!"))
return
/obj/item/storage/secure/screwdriver_act(mob/living/user, obj/item/tool)
if(tool.use_tool(src, user, 20))
panel_open = !panel_open
to_chat(user, span_notice("You [panel_open ? "open" : "close"] the service panel."))
return TRUE
// -> storage/attackby() what with handle insertion, etc
return ..()
/obj/item/storage/secure/multitool_act(mob/living/user, obj/item/tool)
. = TRUE
if(lock_hacking)
to_chat(user, span_danger("This safe is already being hacked."))
return
if(panel_open == TRUE)
to_chat(user, span_danger("Now attempting to reset internal memory, please hold."))
lock_hacking = TRUE
if (tool.use_tool(src, user, 400))
to_chat(user, span_danger("Internal memory reset - lock has been disengaged."))
lock_set = FALSE
lock_hacking = FALSE
return
to_chat(user, span_warning("You must <b>unscrew</b> the service panel before you can pulse the wiring!"))
/obj/item/storage/secure/attack_self(mob/user)
var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
@@ -5,23 +5,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
)))
/mob/living/silicon/robot/attackby(obj/item/W, mob/living/user, params)
if(W.tool_behaviour == TOOL_WELDER && (!user.combat_mode || user == src))
user.changeNext_move(CLICK_CD_MELEE)
if (!getBruteLoss())
to_chat(user, span_warning("[src] is already in good condition!"))
return
if (!W.tool_start_check(user, amount=0)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
return
if(src == user)
to_chat(user, span_notice("You start fixing yourself..."))
if(!W.use_tool(src, user, 50))
return
adjustBruteLoss(-30)
add_fingerprint(user)
visible_message(span_notice("[user] fixes some of the dents on [src]."))
return
if(istype(W, /obj/item/stack/cable_coil) && wiresexposed)
user.changeNext_move(CLICK_CD_MELEE)
var/obj/item/stack/cable_coil/coil = W
@@ -39,20 +22,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
to_chat(user, span_warning("The wires seem fine, there's no need to fix them."))
return
if(W.tool_behaviour == TOOL_CROWBAR) // crowbar means open or close the cover
if(opened)
to_chat(user, span_notice("You close the cover."))
opened = FALSE
update_icons()
else
if(locked)
to_chat(user, span_warning("The cover is locked and cannot be opened!"))
else
to_chat(user, span_notice("You open the cover."))
opened = TRUE
update_icons()
return
if(istype(W, /obj/item/stock_parts/cell) && opened) // trying to put a cell inside
if(wiresexposed)
to_chat(user, span_warning("Close the cover first!"))
@@ -74,31 +43,6 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
to_chat(user, span_warning("You can't reach the wiring!"))
return
if(W.tool_behaviour == TOOL_SCREWDRIVER && opened) // wire hacking or radio management
if(!cell) //haxing
wiresexposed = !wiresexposed
to_chat(user, span_notice("The wires have been [wiresexposed ? "exposed" : "unexposed"]."))
else //radio
if(shell)
to_chat(user, span_warning("You cannot seem to open the radio compartment!")) //Prevent AI radio key theft
else if(radio)
radio.screwdriver_act(user, W)//Push it to the radio to let it handle everything
else
to_chat(user, span_warning("Unable to locate a radio!"))
update_icons()
return
if(W.tool_behaviour == TOOL_WRENCH && opened && !cell) //Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module.
if(!lockcharge)
to_chat(user, span_warning("[src]'s bolts spark! Maybe you should lock them down first!"))
spark_system.start()
return
to_chat(user, span_notice("You start to unfasten [src]'s securing bolts..."))
if(W.use_tool(src, user, 50, volume=50) && !cell)
user.visible_message(span_notice("[user] deconstructs [src]!"), span_notice("You unfasten the securing bolts, and [src] falls to pieces!"))
deconstruct()
return
if(W.slot_flags & ITEM_SLOT_HEAD && hat_offset != INFINITY && !user.combat_mode && !is_type_in_typecache(W, GLOB.blacklisted_borg_hats))
if(user == src)
to_chat(user, span_notice("You can't seem to manage to place [W] on your head by yourself!") )
@@ -112,6 +56,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
if (user.temporarilyRemoveItemFromInventory(W, TRUE))
place_on_head(W)
return
if(istype(W, /obj/item/defibrillator) && !user.combat_mode)
if(!opened)
to_chat(user, span_warning("You must access the cyborg's internals!"))
@@ -183,7 +128,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
to_chat(user, span_danger("Access denied."))
return
if(istype(W, /obj/item/borg/upgrade/))
if(istype(W, /obj/item/borg/upgrade))
var/obj/item/borg/upgrade/U = W
if(!opened)
to_chat(user, span_warning("You must access the cyborg's internals!"))
@@ -300,6 +245,71 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real
step_away(src, user, 15)
addtimer(CALLBACK(GLOBAL_PROC, .proc/_step_away, src, get_turf(user), 15), 3)
/mob/living/silicon/robot/welder_act(mob/living/user, obj/item/tool)
if(user.combat_mode && usr != src)
return FALSE
. = TRUE
user.changeNext_move(CLICK_CD_MELEE)
if (!getBruteLoss())
to_chat(user, span_warning("[src] is already in good condition!"))
return
if (!tool.tool_start_check(user, amount=1)) //The welder has 1u of fuel consumed by it's afterattack, so we don't need to worry about taking any away.
return
if(src == user)
to_chat(user, span_notice("You start fixing yourself..."))
if(!tool.use_tool(src, user, 50))
return
adjustBruteLoss(-30)
add_fingerprint(user)
visible_message(span_notice("[user] fixes some of the dents on [src]."))
/mob/living/silicon/robot/crowbar_act(mob/living/user, obj/item/tool)
. = TRUE
if(opened)
to_chat(user, span_notice("You close the cover."))
opened = FALSE
update_icons()
else
if(locked)
to_chat(user, span_warning("The cover is locked and cannot be opened!"))
else
to_chat(user, span_notice("You open the cover."))
opened = TRUE
update_icons()
return TRUE
/mob/living/silicon/robot/screwdriver_act(mob/living/user, obj/item/tool)
if(!opened)
return FALSE
. = TRUE
if(!cell) // haxing
wiresexposed = !wiresexposed
to_chat(user, span_notice("The wires have been [wiresexposed ? "exposed" : "unexposed"]."))
else // radio
if(shell)
to_chat(user, span_warning("You cannot seem to open the radio compartment!")) //Prevent AI radio key theft
else if(radio)
radio.screwdriver_act(user, tool) // Push it to the radio to let it handle everything
else
to_chat(user, span_warning("Unable to locate a radio!"))
update_icons()
/mob/living/silicon/robot/wrench_act(mob/living/user, obj/item/tool)
if(!(opened && !cell)) // Deconstruction. The flashes break from the fall, to prevent this from being a ghetto reset module.
return FALSE
. = TRUE
if(!lockcharge)
to_chat(user, span_warning("[src]'s bolts spark! Maybe you should lock them down first!"))
spark_system.start()
return
to_chat(user, span_notice("You start to unfasten [src]'s securing bolts..."))
if(tool.use_tool(src, user, 50, volume=50) && !cell)
user.visible_message(span_notice("[user] deconstructs [src]!"), span_notice("You unfasten the securing bolts, and [src] falls to pieces!"))
deconstruct()
return
/mob/living/silicon/robot/fire_act()
if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them
IgniteMob()