diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 1ca1fe01036..13ee3c9e5ef 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -372,6 +372,27 @@ This is always put in the attack log.
if(progress)
qdel(progbar)
+#define DOAFTERONCE_MAGIC "Magic~~"
+GLOBAL_LIST_INIT(do_after_once_tracker, list())
+/proc/do_after_once(mob/user, delay, needhand = 1, atom/target = null, progress = 1, attempt_cancel_message = "Attempt cancelled.")
+ if(!user || !target)
+ return
+
+ var/cache_key = "[user.UID()][target.UID()]"
+ if(GLOB.do_after_once_tracker[cache_key])
+ GLOB.do_after_once_tracker[cache_key] = DOAFTERONCE_MAGIC
+ to_chat(user, "[attempt_cancel_message]")
+ return FALSE
+ GLOB.do_after_once_tracker[cache_key] = TRUE
+ . = do_after(user, delay, needhand, target, progress, extra_checks = CALLBACK(GLOBAL_PROC, .proc/do_after_once_checks, cache_key))
+ GLOB.do_after_once_tracker[cache_key] = FALSE
+
+/proc/do_after_once_checks(cache_key)
+ if(GLOB.do_after_once_tracker[cache_key] && GLOB.do_after_once_tracker[cache_key] == DOAFTERONCE_MAGIC)
+ GLOB.do_after_once_tracker[cache_key] = FALSE
+ return FALSE
+ return TRUE
+
/proc/is_species(A, species_datum)
. = FALSE
if(ishuman(A))
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 1704fecd7a1..aa0c9495cbe 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -43,8 +43,6 @@
var/lights_power = 6
var/emagged = FALSE
- var/list/repairers = new
-
//inner atmos
var/use_internal_tank = 0
var/internal_tank_valve = ONE_ATMOSPHERE
@@ -778,22 +776,16 @@
else if(iswelder(W) && user.a_intent != INTENT_HARM)
var/obj/item/weldingtool/WT = W
- if(health[user] starts repairing some damage to [name].", "You start repairing some damage to [name]")
- playsound(user, WT.usesound, 50, 1)
- if(do_after(user, 15 * WT.toolspeed, target = src)) // Takes 1.5 seconds to repair
- if (internal_damage & MECHA_INT_TANK_BREACH)
- clearInternalDamage(MECHA_INT_TANK_BREACH)
- user.visible_message("[user] repairs the damaged gas tank.", "You repair the damaged gas tank.")
- else
- user.visible_message("[user] repairs some damage to [name].", "You repair some damage to [name]")
- health += min(20, initial(health)-health)
- repairers -= user
- else
- to_chat(user, "You are already repairing [name]!")
+ if(health < initial(health))
+ if(WT.remove_fuel(0,user))
+ user.visible_message("[user] starts repairing some damage to [name].", "You start repairing some damage to [name]")
+ if(do_after_once(user, 15 * WT.toolspeed, target = src, attempt_cancel_message = "You stop repairing [name]."))
+ if(internal_damage & MECHA_INT_TANK_BREACH)
+ clearInternalDamage(MECHA_INT_TANK_BREACH)
+ user.visible_message("[user] repairs the damaged gas tank.", "You repair the damaged gas tank.")
+ else
+ user.visible_message("[user] repairs some damage to [name].", "You repair some damage to [name].")
+ health += min(20, initial(health) - health)
else
to_chat(user, "The welder must be on for this task!")
else