diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 2330ed3d88..4e45bf4ac2 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -60,13 +60,27 @@
throwforce = 8
attack_verb = list("drilled", "screwed", "jabbed")
toolspeed = 0.25
+ var/obj/item/weapon/screwdriver/power/counterpart = null
+
+/obj/item/weapon/wrench/power/New(newloc, no_counterpart = TRUE)
+ ..(newloc)
+ if(!counterpart && no_counterpart)
+ counterpart = new(src, FALSE)
+ counterpart.counterpart = src
+
+/obj/item/weapon/wrench/power/Destroy()
+ if(counterpart)
+ counterpart.counterpart = null // So it can qdel cleanly.
+ qdel_null(counterpart)
+ return ..()
/obj/item/weapon/wrench/power/attack_self(mob/user)
playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
- var/obj/item/weapon/screwdriver/power/s_drill = new /obj/item/weapon/screwdriver/power
+ user.drop_item(src)
+ counterpart.forceMove(get_turf(src))
+ src.forceMove(counterpart)
+ user.put_in_active_hand(counterpart)
to_chat(user, "You attach the screw driver bit to [src].")
- qdel(src)
- user.put_in_active_hand(s_drill)
/*
* Screwdriver
@@ -168,13 +182,27 @@
usesound = 'sound/items/drill_use.ogg'
toolspeed = 0.25
random_color = FALSE
+ var/obj/item/weapon/wrench/power/counterpart = null
+
+/obj/item/weapon/screwdriver/power/New(newloc, no_counterpart = TRUE)
+ ..(newloc)
+ if(!counterpart && no_counterpart)
+ counterpart = new(src, FALSE)
+ counterpart.counterpart = src
+
+/obj/item/weapon/screwdriver/power/Destroy()
+ if(counterpart)
+ counterpart.counterpart = null // So it can qdel cleanly.
+ qdel_null(counterpart)
+ return ..()
/obj/item/weapon/screwdriver/power/attack_self(mob/user)
playsound(get_turf(user),'sound/items/change_drill.ogg',50,1)
- var/obj/item/weapon/wrench/power/w_drill = new /obj/item/weapon/wrench/power
+ user.drop_item(src)
+ counterpart.forceMove(get_turf(src))
+ src.forceMove(counterpart)
+ user.put_in_active_hand(counterpart)
to_chat(user, "You attach the bolt driver bit to [src].")
- qdel(src)
- user.put_in_active_hand(w_drill)
/*
* Wirecutters
@@ -245,13 +273,27 @@
force = 15
toolspeed = 0.25
random_color = FALSE
+ var/obj/item/weapon/crowbar/power/counterpart = null
+
+/obj/item/weapon/wirecutters/power/New(newloc, no_counterpart = TRUE)
+ ..(newloc)
+ if(!counterpart && no_counterpart)
+ counterpart = new(src, FALSE)
+ counterpart.counterpart = src
+
+/obj/item/weapon/wirecutters/power/Destroy()
+ if(counterpart)
+ counterpart.counterpart = null // So it can qdel cleanly.
+ qdel_null(counterpart)
+ return ..()
/obj/item/weapon/wirecutters/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
- var/obj/item/weapon/crowbar/power/pryjaws = new /obj/item/weapon/crowbar/power
+ user.drop_item(src)
+ counterpart.forceMove(get_turf(src))
+ src.forceMove(counterpart)
+ user.put_in_active_hand(counterpart)
to_chat(user, "You attach the pry jaws to [src].")
- qdel(src)
- user.put_in_active_hand(pryjaws)
/*
* Welding Tool
@@ -910,13 +952,28 @@
usesound = 'sound/items/jaws_pry.ogg'
force = 15
toolspeed = 0.25
+ var/obj/item/weapon/wirecutters/power/counterpart = null
+
+/obj/item/weapon/crowbar/power/New(newloc, no_counterpart = TRUE)
+ ..(newloc)
+ if(!counterpart && no_counterpart)
+ counterpart = new(src, FALSE)
+ counterpart.counterpart = src
+
+/obj/item/weapon/crowbar/power/Destroy()
+ if(counterpart)
+ counterpart.counterpart = null // So it can qdel cleanly.
+ qdel_null(counterpart)
+ return ..()
/obj/item/weapon/crowbar/power/attack_self(mob/user)
playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
- var/obj/item/weapon/wirecutters/power/cutjaws = new /obj/item/weapon/wirecutters/power
+ user.drop_item(src)
+ counterpart.forceMove(get_turf(src))
+ src.forceMove(counterpart)
+ user.put_in_active_hand(counterpart)
to_chat(user, "You attach the cutting jaws to [src].")
- qdel(src)
- user.put_in_active_hand(cutjaws)
+
/*/obj/item/weapon/combitool
name = "combi-tool"
diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm
index c1aa244d55..60be7fb8b5 100644
--- a/code/modules/mob/living/inventory.dm
+++ b/code/modules/mob/living/inventory.dm
@@ -149,6 +149,11 @@
set category = "Object"
set src = usr
+ if(world.time <= next_click) // This isn't really a 'click' but it'll work for our purposes.
+ return
+
+ next_click = world.time + 1
+
if(istype(loc,/obj/mecha)) return
if(hand)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 837f94b5f3..c12975eb3d 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -936,6 +936,11 @@
set category = "IC"
set src = usr
+ if(world.time <= next_click) // Hard check, before anything else, to avoid crashing
+ return
+
+ next_click = world.time + 1
+
var/obj/item/W = get_active_hand()
if (W)
W.attack_self(src)