diff --git a/code/__DEFINES/do_afters.dm b/code/__DEFINES/do_afters.dm
new file mode 100644
index 00000000000..456cf940400
--- /dev/null
+++ b/code/__DEFINES/do_afters.dm
@@ -0,0 +1,4 @@
+#define DOAFTER_SOURCE_SURGERY "doafter_surgery"
+#define DOAFTER_SOURCE_MECHADRILL "doafter_mechadrill"
+#define DOAFTER_SOURCE_SURVIVALPEN "doafter_survivalpen"
+#define DOAFTER_SOURCE_GETTING_UP "doafter_gettingup"
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 2186f226d06..d6f110b0d38 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -535,9 +535,8 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE)))
#define NO_BUCKLE_LYING -1
-// timed_action_flags parameter for `/proc/do_atom`, `/proc/do_after_mob`, `/proc/do_mob` and `/proc/do_after`
-#define IGNORE_TARGET_IN_DOAFTERS (1<<0)
-#define IGNORE_USER_LOC_CHANGE (1<<1)
-#define IGNORE_TARGET_LOC_CHANGE (1<<2)
-#define IGNORE_HELD_ITEM (1<<3)
-#define IGNORE_INCAPACITATED (1<<4)
+// timed_action_flags parameter for `/proc/do_after_mob`, `/proc/do_mob` and `/proc/do_after`
+#define IGNORE_USER_LOC_CHANGE (1<<0)
+#define IGNORE_TARGET_LOC_CHANGE (1<<1)
+#define IGNORE_HELD_ITEM (1<<2)
+#define IGNORE_INCAPACITATED (1<<3)
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 306b4724401..d407fbd5458 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -361,7 +361,11 @@
#define DEFIB_REVIVABLE_STATES (DEFIB_FAIL_NO_HEART | DEFIB_FAIL_FAILING_HEART | DEFIB_FAIL_HUSK | DEFIB_FAIL_TISSUE_DAMAGE | DEFIB_FAIL_FAILING_BRAIN | DEFIB_POSSIBLE)
#define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return;
-#define INTERACTING_WITH(X, Y) (Y in X.do_afters)
+
+#define DOING_INTERACTION(user, interaction_key) (LAZYACCESS(user.do_afters, interaction_key))
+#define DOING_INTERACTION_LIMIT(user, interaction_key, max_interaction_count) ((LAZYACCESS(user.do_afters, interaction_key) || 0) >= max_interaction_count)
+#define DOING_INTERACTION_WITH_TARGET(user, target) (LAZYACCESS(user.do_afters, target))
+#define DOING_INTERACTION_WITH_TARGET_LIMIT(user, target, max_interaction_count) ((LAZYACCESS(user.do_afters, target) || 0) >= max_interaction_count)
/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine()
#define EXAMINE_MORE_TIME 1 SECONDS
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 03c82024a6d..104c9610f2e 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -177,8 +177,8 @@ GLOBAL_LIST_EMPTY(species_list)
return "unknown"
-///Timed action involving two mobs, the user and the target.
-/proc/do_mob(mob/user, mob/target, time = 3 SECONDS, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks)
+///Timed action involving two mobs, the user and the target. interaction_key is the assoc key under which the do_after is capped under, and the max interaction count is how many of this interaction you can do at once.
+/proc/do_mob(mob/user, mob/target, time = 3 SECONDS, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1)
if(!user || !target)
return FALSE
var/user_loc = user.loc
@@ -189,8 +189,14 @@ GLOBAL_LIST_EMPTY(species_list)
var/target_loc = target.loc
- LAZYADD(user.do_afters, target)
- LAZYADD(target.targeted_by, user)
+ if(!interaction_key && target)
+ interaction_key = target //Use the direct ref to the target
+ if(interaction_key) //Do we have a interaction_key now?
+ var/current_interaction_count = LAZYACCESS(user.do_afters, interaction_key) || 0
+ if(current_interaction_count >= max_interact_count) //We are at our peak
+ return
+ LAZYSET(user.do_afters, interaction_key, current_interaction_count + 1)
+
var/holding = user.get_active_held_item()
var/datum/progressbar/progbar
if (progress)
@@ -214,7 +220,6 @@ GLOBAL_LIST_EMPTY(species_list)
if(
QDELETED(user) || QDELETED(target) \
- || (!(timed_action_flags & IGNORE_TARGET_IN_DOAFTERS) && !(target in user.do_afters)) \
|| (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \
|| (!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) && target.loc != target_loc) \
|| (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \
@@ -227,9 +232,8 @@ GLOBAL_LIST_EMPTY(species_list)
if(!QDELETED(progbar))
progbar.end_progress()
- if(!QDELETED(target))
- LAZYREMOVE(user.do_afters, target)
- LAZYREMOVE(target.targeted_by, user)
+ if(interaction_key)
+ LAZYREMOVE(user.do_afters, interaction_key)
//some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action
@@ -252,17 +256,22 @@ GLOBAL_LIST_EMPTY(species_list)
*
* Checks that `user` does not move, change hands, get stunned, etc. for the
* given `delay`. Returns `TRUE` on success or `FALSE` on failure.
+ * Interaction_key is the assoc key under which the do_after is capped, with max_interact_count being the cap. Interaction key will default to target if not set.
*/
-/proc/do_after(mob/user, delay, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks)
+/proc/do_after(mob/user, delay, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1)
if(!user)
return FALSE
var/atom/target_loc = null
if(target && !isturf(target))
target_loc = target.loc
- if(target)
- LAZYADD(user.do_afters, target)
- LAZYADD(target.targeted_by, user)
+ if(!interaction_key && target)
+ interaction_key = target //Use the direct ref to the target
+ if(interaction_key) //Do we have a interaction_key now?
+ var/current_interaction_count = LAZYACCESS(user.do_afters, interaction_key) || 0
+ if(current_interaction_count >= max_interact_count) //We are at our peak
+ return
+ LAZYSET(user.do_afters, interaction_key, current_interaction_count + 1)
var/atom/user_loc = user.loc
@@ -311,20 +320,15 @@ GLOBAL_LIST_EMPTY(species_list)
. = FALSE
break
- if(target && !(timed_action_flags & IGNORE_TARGET_IN_DOAFTERS) && !(target in user.do_afters))
- . = FALSE
- break
-
if(!QDELETED(progbar))
progbar.end_progress()
- if(!QDELETED(target))
- LAZYREMOVE(user.do_afters, target)
- LAZYREMOVE(target.targeted_by, user)
+ if(interaction_key)
+ LAZYREMOVE(user.do_afters, interaction_key)
-///Timed action involving at least one mob user and a list of targets.
-/proc/do_after_mob(mob/user, list/targets, time = 3 SECONDS, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks)
+///Timed action involving at least one mob user and a list of targets. interaction_key is the assoc key under which the do_after is capped under, and the max interaction count is how many of this interaction you can do at once.
+/proc/do_after_mob(mob/user, list/targets, time = 3 SECONDS, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1)
if(!user)
return FALSE
if(!islist(targets))
@@ -340,10 +344,17 @@ GLOBAL_LIST_EMPTY(species_list)
drifting = TRUE
var/list/originalloc = list()
+
for(var/atom/target in targets)
originalloc[target] = target.loc
- LAZYADD(user.do_afters, target)
- LAZYADD(target.targeted_by, user)
+
+ if(interaction_key)
+ var/current_interaction_count = LAZYACCESS(user.do_afters, interaction_key) || 0
+ if(current_interaction_count >= max_interact_count) //We are at our peak
+ to_chat(user, "You can't do this at the moment!")
+ return
+ LAZYSET(user.do_afters, interaction_key, current_interaction_count + 1)
+
var/holding = user.get_active_held_item()
var/datum/progressbar/progbar
@@ -390,12 +401,8 @@ GLOBAL_LIST_EMPTY(species_list)
if(!QDELETED(progbar))
progbar.end_progress()
- for(var/thing in targets)
- var/atom/target = thing
- if(!QDELETED(target))
- LAZYREMOVE(user.do_afters, target)
- LAZYREMOVE(target.targeted_by, user)
-
+ if(interaction_key)
+ LAZYREMOVE(user.do_afters, interaction_key)
/proc/is_species(A, species_datum)
. = FALSE
@@ -452,7 +459,7 @@ GLOBAL_LIST_EMPTY(species_list)
return spawned_mobs
-// Displays a message in deadchat, sent by source. Source is not linkified, message is, to avoid stuff like character names to be linkified.
+// Displays a message in deadchat, sent by source. source is not linkified, message is, to avoid stuff like character names to be linkified.
// Automatically gives the class deadsay to the whole message (message + source)
/proc/deadchat_broadcast(message, source=null, mob/follow_target=null, turf/turf_target=null, speaker_key=null, message_type=DEADCHAT_REGULAR)
message = "[source][message]"
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index ce3046280f6..0ff99cc3d60 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1255,47 +1255,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
temp = ((temp + (temp>>3))&29127) % 63 //070707
return temp
-//same as do_mob except for movables and it allows both to drift and doesn't draw progressbar
-/proc/do_atom(atom/movable/user, atom/movable/target, time = 3 SECONDS, timed_action_flags = NONE, datum/callback/extra_checks)
- if(!user || !target)
- return TRUE
- var/user_loc = user.loc
-
- var/drifting = FALSE
- if(!user.Process_Spacemove(0) && user.inertia_dir)
- drifting = TRUE
-
- var/target_drifting = FALSE
- if(!target.Process_Spacemove(0) && target.inertia_dir)
- target_drifting = TRUE
-
- var/target_loc = target.loc
-
- var/endtime = world.time+time
- . = TRUE
- while (world.time < endtime)
- stoplag(1)
-
- if(QDELETED(user) || QDELETED(target))
- . = FALSE
- break
-
- if(drifting && !user.inertia_dir)
- drifting = FALSE
- user_loc = user.loc
-
- if(target_drifting && !target.inertia_dir)
- target_drifting = FALSE
- target_loc = target.loc
-
- if(
- (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \
- || (!(timed_action_flags& IGNORE_TARGET_LOC_CHANGE) && !target_drifting && target.loc != target_loc) \
- || (extra_checks && !extra_checks.Invoke()) \
- )
- . = FALSE
- break
-
//returns a GUID like identifier (using a mostly made up record format)
//guids are not on their own suitable for access or security tokens, as most of their bits are predictable.
// (But may make a nice salt to one)
diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm
index 0d3c84ae0ce..70f13376639 100644
--- a/code/datums/components/butchering.dm
+++ b/code/datums/components/butchering.dm
@@ -49,7 +49,7 @@
Butcher(user, M)
/datum/component/butchering/proc/startNeckSlice(obj/item/source, mob/living/carbon/human/H, mob/living/user)
- if(INTERACTING_WITH(user, H))
+ if(DOING_INTERACTION_WITH_TARGET(user, H))
to_chat(user, "You're already interacting with [H]!")
return
diff --git a/code/datums/elements/art.dm b/code/datums/elements/art.dm
index 54048c0126d..87f827c21f1 100644
--- a/code/datums/elements/art.dm
+++ b/code/datums/elements/art.dm
@@ -38,7 +38,7 @@
/datum/element/art/proc/on_examine(atom/source, mob/user, list/examine_texts)
SIGNAL_HANDLER
- if(!INTERACTING_WITH(user, source))
+ if(!DOING_INTERACTION_WITH_TARGET(user, source))
INVOKE_ASYNC(src, .proc/appraise, source, user) //Do not sleep the proc.
/datum/element/art/proc/appraise(atom/source, mob/user)
diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm
index 340650c09aa..1fe723f779c 100644
--- a/code/datums/wounds/_wounds.dm
+++ b/code/datums/wounds/_wounds.dm
@@ -283,7 +283,7 @@
return FALSE
// now that we've determined we have a valid attempt at treating, we can stomp on their dreams if we're already interacting with the patient or if their part is obscured
- if(INTERACTING_WITH(user, victim))
+ if(DOING_INTERACTION_WITH_TARGET(user, victim))
to_chat(user, "You're already interacting with [victim]!")
return TRUE
diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm
index d24facedc2a..0f091cb95ec 100644
--- a/code/datums/wounds/slash.dm
+++ b/code/datums/wounds/slash.dm
@@ -145,7 +145,7 @@
/datum/wound/slash/try_handling(mob/living/carbon/human/user)
if(user.pulling != victim || user.zone_selected != limb.body_zone || user.a_intent == INTENT_GRAB || !isfelinid(user) || !victim.can_inject(user, TRUE))
return FALSE
- if(INTERACTING_WITH(user, victim))
+ if(DOING_INTERACTION_WITH_TARGET(user, victim))
to_chat(user, "You're already interacting with [victim]!")
return
if(user.is_mouth_covered())
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 34a47332f96..90aa43059fc 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -90,8 +90,6 @@
var/list/alternate_appearances
- ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy()
- var/list/targeted_by
/// Last appearance of the atom for demo saving purposes
var/image/demo_last_appearance
@@ -279,11 +277,6 @@
LAZYCLEARLIST(overlays)
- for(var/i in targeted_by)
- var/mob/M = i
- LAZYREMOVE(M.do_afters, src)
-
- targeted_by = null
QDEL_NULL(light)
if(smoothing_flags & SMOOTH_QUEUED)
diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm
index 7b40b96292c..6b8da326d90 100644
--- a/code/game/objects/items/RPD.dm
+++ b/code/game/objects/items/RPD.dm
@@ -386,7 +386,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
var/queued_p_flipped = p_flipped
//Unwrench pipe before we build one over/paint it, but only if we're not already running a do_after on it already to prevent a potential runtime.
- if((mode & DESTROY_MODE) && (upgrade_flags & RPD_UPGRADE_UNWRENCH) && istype(attack_target, /obj/machinery/atmospherics) && !(attack_target in user.do_afters))
+ if((mode & DESTROY_MODE) && (upgrade_flags & RPD_UPGRADE_UNWRENCH) && istype(attack_target, /obj/machinery/atmospherics) && !(DOING_INTERACTION_WITH_TARGET(user, attack_target)))
attack_target = attack_target.wrench_act(user, src)
if(!isatom(attack_target))
CRASH("When attempting to call [A.type].wrench_act(), received the following non-atom return value: [attack_target]")
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index a139f89a5b6..e984901a698 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -395,7 +395,7 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
force = 0
throwforce = 0
merge_type = /obj/item/stack/sheet/cotton
- var/pull_effort = 30
+ var/pull_effort = 10
var/loom_result = /obj/item/stack/sheet/cloth
grind_results = list(/datum/reagent/cellulose = 20)
@@ -405,7 +405,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \
singular_name = "raw durathread ball"
icon_state = "sheet-durathreadraw"
merge_type = /obj/item/stack/sheet/cotton/durathread
- pull_effort = 70
loom_result = /obj/item/stack/sheet/durathread
grind_results = list()
diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm
index 28ff5a8de73..e2c3b890991 100644
--- a/code/game/objects/structures/loom.dm
+++ b/code/game/objects/structures/loom.dm
@@ -31,11 +31,9 @@
user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", MSG_VISUAL)
return FALSE
user.show_message("You start weaving \the [W.name] through the loom..", MSG_VISUAL)
- if(W.use_tool(src, user, W.pull_effort))
- if(W.amount >= FABRIC_PER_SHEET)
- new W.loom_result(drop_location())
- W.use(FABRIC_PER_SHEET)
- user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL)
+ while(W.use_tool(src, user, W.pull_effort) && W.use(FABRIC_PER_SHEET))
+ new W.loom_result(drop_location())
+ user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL)
return TRUE
#undef FABRIC_PER_SHEET
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 68af6bacf78..296b715c650 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -141,7 +141,7 @@
return
if(user == loc && tied != SHOES_TIED) // if they're our own shoes, go tie-wards
- if(INTERACTING_WITH(user, our_guy))
+ if(DOING_INTERACTION_WITH_TARGET(user, our_guy))
to_chat(user, "You're already interacting with [src]!")
return
user.visible_message("[user] begins [tied ? "unknotting" : "tying"] the laces of [user.p_their()] [src.name].", "You begin [tied ? "unknotting" : "tying"] the laces of your [src.name]...")
@@ -161,7 +161,7 @@
if(tied == SHOES_KNOTTED)
to_chat(user, "The laces on [loc]'s [src.name] are already a hopelessly tangled mess!")
return
- if(INTERACTING_WITH(user, our_guy))
+ if(DOING_INTERACTION_WITH_TARGET(user, our_guy))
to_chat(user, "You're already interacting with [src]!")
return
@@ -247,7 +247,7 @@
/obj/item/clothing/shoes/attack_self(mob/user)
. = ..()
- if(INTERACTING_WITH(user, src))
+ if(DOING_INTERACTION_WITH_TARGET(user, src))
to_chat(user, "You're already interacting with [src]!")
return
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index c1b661db374..c0f4a19ac18 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -646,7 +646,7 @@
do
CHECK_DNA_AND_SPECIES(target)
- if (INTERACTING_WITH(src, target))
+ if (DOING_INTERACTION_WITH_TARGET(src,target))
return FALSE
if (target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH))
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index bbcaf307eae..50168b3b8a5 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -525,7 +525,7 @@
/mob/living/proc/get_up(instant = FALSE)
set waitfor = FALSE
- if(!instant && !do_mob(src, src, 1 SECONDS, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM), extra_checks = CALLBACK(src, /mob/living/proc/rest_checks_callback)))
+ if(!instant && !do_mob(src, src, 1 SECONDS, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM), extra_checks = CALLBACK(src, /mob/living/proc/rest_checks_callback), interaction_key = DOAFTER_SOURCE_GETTING_UP))
return
if(resting || body_position == STANDING_UP || HAS_TRAIT(src, TRAIT_FLOORED))
return
@@ -985,7 +985,7 @@
who.log_message("[key_name(who)] is being stripped of [what] by [key_name(src)]", LOG_ATTACK, color="red")
log_message("[key_name(who)] is being stripped of [what] by [key_name(src)]", LOG_ATTACK, color="red", log_globally=FALSE)
what.add_fingerprint(src)
- if(do_mob(src, who, what.strip_delay))
+ if(do_mob(src, who, what.strip_delay, interaction_key = what))
if(what && Adjacent(who))
if(islist(where))
var/list/L = where
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index ba201216052..25818a18019 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -450,7 +450,7 @@
return TRUE
/mob/living/simple_animal/bot/medbot/attack_hand(mob/living/carbon/human/H)
- if(INTERACTING_WITH(H, src))
+ if(DOING_INTERACTION_WITH_TARGET(H, src))
to_chat(H, "You're already interacting with [src].")
return
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 820659b3a1d..550e57e4051 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -494,7 +494,7 @@
return FALSE
//you can only queue up one examine on something at a time
- if(examined_thing in do_afters)
+ if(DOING_INTERACTION_WITH_TARGET(src, examined_thing))
return FALSE
to_chat(src, "You start feeling around for something...")
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index cbaea918645..40c10f1f5df 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -196,7 +196,7 @@
///List of progress bars this mob is currently seeing for actions
var/list/progressbars = null //for stacking do_after bars
- ///For storing what do_after's someone has, in case we want to restrict them to only one of a certain do_after at a time
+ ///For storing what do_after's someone has, key = string, value = amount of interactions of that type happening.
var/list/do_afters
///Allows a datum to intercept all click calls this mob is the source of
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index cfab7fc9bb3..9c5c5b0a9cc 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -231,12 +231,12 @@
amount_per_transfer_from_this = initial(amount_per_transfer_from_this)
return ..()
- if(M in user.do_afters)
+ if(DOING_INTERACTION(user, DOAFTER_SOURCE_SURVIVALPEN))
to_chat(user,"You are too busy to use \the [src]!")
return
to_chat(user,"You start manually releasing the low-pressure gauge...")
- if(!do_mob(user, M, 10 SECONDS))
+ if(!do_mob(user, M, 10 SECONDS, interaction_key = DOAFTER_SOURCE_SURVIVALPEN))
return
amount_per_transfer_from_this = initial(amount_per_transfer_from_this) * 0.5
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index af653e74d82..3a15bc500d0 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -61,8 +61,6 @@
/datum/surgery_step/proc/initiate(mob/living/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
// Only followers of Asclepius have the ability to use Healing Touch and perform miracle feats of surgery.
// Prevents people from performing multiple simultaneous surgeries unless they're holding a Rod of Asclepius.
- if(LAZYLEN(user.do_afters) && !user.has_status_effect(STATUS_EFFECT_HIPPOCRATIC_OATH))
- return
surgery.step_in_progress = TRUE
var/speed_mod = 1
@@ -92,7 +90,7 @@
var/was_sleeping = (target.stat != DEAD && target.IsSleeping())
- if(do_after(user, modded_time, target = target))
+ if(do_after(user, modded_time, target = target, interaction_key = user.has_status_effect(STATUS_EFFECT_HIPPOCRATIC_OATH) ? target : DOAFTER_SOURCE_SURGERY)) //If we have the hippocratic oath, we can perform one surgery on each target, otherwise we can only do one surgery in total.
var/chem_check_result = chem_check(target)
if((prob(100-fail_prob) || (iscyborg(user) && !silicons_obey_prob)) && chem_check_result && !try_to_fail)
diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm
index f58db78715e..c6382b5cc15 100644
--- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm
+++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm
@@ -96,12 +96,12 @@
chassis.use_power(energy_drain)
return TRUE
-/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user)
+/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user, interaction_key)
if(!chassis)
return
var/C = chassis.loc
chassis.use_power(energy_drain)
- . = do_after(user, equip_cooldown, target=target)
+ . = do_after(user, equip_cooldown, target=target, interaction_key = interaction_key)
if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir))
return FALSE
diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm
index 4f2e47fb3cf..86ac78f68cd 100644
--- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm
+++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm
@@ -40,12 +40,13 @@
if(target_obj.resistance_flags & (UNACIDABLE | INDESTRUCTIBLE))
return
- target.visible_message("[chassis] starts to drill [target].", \
- "[chassis] starts to drill [target]...", \
- "You hear drilling.")
-
// You can't drill harder by clicking more.
- if(!(target in source.do_afters) && do_after_cooldown(target, source))
+ if(!DOING_INTERACTION_WITH_TARGET(source, target) && do_after_cooldown(target, source, DOAFTER_SOURCE_MECHADRILL))
+
+ target.visible_message("[chassis] starts to drill [target].", \
+ "[chassis] starts to drill [target]...", \
+ "You hear drilling.")
+
log_message("Started drilling [target]", LOG_MECHA)
// Drilling a turf is a one-and-done procedure.
if(isturf(target))
diff --git a/tgstation.dme b/tgstation.dme
index effecf33d8e..df8c7fc0865 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -45,6 +45,7 @@
#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
+#include "code\__DEFINES\do_afters.dm"
#include "code\__DEFINES\dye_keys.dm"
#include "code\__DEFINES\economy.dm"
#include "code\__DEFINES\events.dm"