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