diff --git a/code/__defines/dcs/signals/signals_datum.dm b/code/__defines/dcs/signals/signals_datum.dm
index eb7a00aac5..72439b6f79 100644
--- a/code/__defines/dcs/signals/signals_datum.dm
+++ b/code/__defines/dcs/signals/signals_datum.dm
@@ -10,7 +10,7 @@
/// before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation
#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted"
/// just before a datum's Destroy() is called: (force), at this point none of the other components chose to interrupt qdel and Destroy will be called
-#define COMSIG_PARENT_QDELETING "parent_qdeleting"
+#define COMSIG_QDELETING "parent_qdeleting"
/// Called whenever an admin manually deletes an object, via the "Delete" verb, before qdel() is called: (client/deleting_admin)
#define COMSIG_ADMIN_DELETING "parent_admin_deleting"
/// generic topic handler (usr, href_list)
diff --git a/code/__defines/do_afters.dm b/code/__defines/do_afters.dm
new file mode 100644
index 0000000000..cba02d6cf6
--- /dev/null
+++ b/code/__defines/do_afters.dm
@@ -0,0 +1,10 @@
+#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"
+#define DOAFTER_SOURCE_CLIMBING_LADDER "doafter_climbingladder"
+#define DOAFTER_SOURCE_SPIDER "doafter_spider"
+#define DOAFTER_SOURCE_HEAL_TOUCH "doafter_heal_touch"
+#define DOAFTER_SOURCE_PLANTING_DEVICE "doafter_planting_device"
+#define DOAFTER_SOURCE_CHARGE_CRANKRECHARGE "doafter_charge_crank_recharge"
+#define DOAFTER_SOURCE_REMOVING_HOOK "doafter_removing_hook"
diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm
index 19a67310f1..2dbc836c2b 100644
--- a/code/__defines/flags.dm
+++ b/code/__defines/flags.dm
@@ -54,6 +54,18 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define PASSBLOB (1<<3)
#define PASSMOB (1<<4)
+// timed_action_flags parameter for `/proc/do_after`
+/// Can do the action even if mob moves location
+#define IGNORE_USER_LOC_CHANGE (1<<0)
+/// Can do the action even if the target moves location
+#define IGNORE_TARGET_LOC_CHANGE (1<<1)
+/// Can do the action even if the item is no longer being held
+#define IGNORE_HELD_ITEM (1<<2)
+/// Can do the action even if the mob is incapacitated (ex. handcuffed)
+#define IGNORE_INCAPACITATED (1<<3)
+/// Used to prevent important slowdowns from being abused by drugs like kronkaine
+#define IGNORE_SLOWDOWNS (1<<4)
+
// Flags for do_after/do_mob exclusivity.
#define TASK_TARGET_EXCLUSIVE (1<<1)
#define TASK_USER_EXCLUSIVE (1<<2)
diff --git a/code/__defines/traits/declarations.dm b/code/__defines/traits/declarations.dm
index 8936a3d55d..f95a6a5c28 100644
--- a/code/__defines/traits/declarations.dm
+++ b/code/__defines/traits/declarations.dm
@@ -15,3 +15,5 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Prevents the affected object from opening a loot window via alt click. See atom/AltClick()
#define TRAIT_ALT_CLICK_BLOCKER "no_alt_click"
+
+#define TRAIT_INCAPACITATED "incapacitated"
diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm
index b8a4ecbb14..4e25e962cb 100644
--- a/code/_helpers/mobs.dm
+++ b/code/_helpers/mobs.dm
@@ -249,90 +249,115 @@ Proc for attack log creation, because really why not
if (progbar)
qdel(progbar)
-/proc/do_after(mob/user, delay, atom/target = null, needhand = TRUE, progress = TRUE, incapacitation_flags = INCAPACITATION_DEFAULT, ignore_movement = FALSE, max_distance = null, exclusive = FALSE)
+/**
+ * Timed action involving one mob user. Target is optional.
+ *
+ * Checks that `user` does not move, change hands, get stunned, etc. for the
+ * given `delay`. Returns `TRUE` on success or `FALSE` on failure.
+ *
+ * @param {mob} user - The mob performing the action.
+ *
+ * @param {number} delay - The time in deciseconds. Use the SECONDS define for readability. `1 SECONDS` is 10 deciseconds.
+ *
+ * @param {atom} target - The target of the action. This is where the progressbar will display.
+ *
+ * @param {flag} timed_action_flags - Flags to control the behavior of the timed action.
+ *
+ * @param {boolean} progress - Whether to display a progress bar / cogbar.
+ *
+ * @param {datum/callback} extra_checks - Additional checks to perform before the action is executed.
+ *
+ * @param {string} interaction_key - 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.
+ *
+ * @param {number} max_interact_count - The maximum amount of interactions allowed.
+ *
+ * @param {boolean} hidden - By default, any action 1 second or longer shows a cog over the user while it is in progress. If hidden is set to TRUE, the cog will not be shown.
+ *
+ * @param {icon} icon - The icon file of the cog. Default: 'icons/effects/progressbar.dmi'
+ *
+ * @param {iconstate} iconstate - The icon state of the cog. Default: "Cog"
+ */
+/proc/do_after(mob/user, delay, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1, hidden = FALSE, icon = 'icons/effects/progressbar.dmi', iconstate = "cog", max_distance = null)
if(!user)
return FALSE
- if(!delay)
- return TRUE //Okay. Done.
- if(user.status_flags & DOING_TASK)
- to_chat(user, span_warning("You're in the middle of doing something else already."))
- return FALSE //Performing an exclusive do_after or do_mob already
- if(target?.flags & IS_BUSY)
- to_chat(user, span_warning("Someone is already doing something with \the [target]."))
- return FALSE
+ if(!isnum(delay))
+ CRASH("do_after was passed a non-number delay: [delay || "null"].")
- var/atom/target_loc = null
- if(target)
- target_loc = target.loc
+ 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/original_loc = user.loc
+ var/atom/user_loc = user.loc
+ var/atom/target_loc = target?.loc
- var/obj/mecha/M = null
-
- if(istype(user.loc, /obj/mecha))
- original_loc = get_turf(original_loc)
- M = user.loc
+ var/drifting = FALSE
+ /* //We don't have a drift handler yet, sadly.
+ if(!isnull(user.drift_handler))
+ drifting = TRUE*/
var/holding = user.get_active_hand()
+ if(!(timed_action_flags & IGNORE_SLOWDOWNS))
+ var/slowdown = user.calculate_item_encumbrance()
+ if(slowdown)
+ delay *= slowdown
+
var/datum/progressbar/progbar
- if (progress)
- progbar = new(user, delay, target)
+ var/datum/cogbar/cog
+
+ if(progress)
+ if(user.client)
+ progbar = new(user, delay, target || user)
+
+ if(!hidden && delay >= 1 SECONDS)
+ cog = new(user, icon, iconstate)
SEND_SIGNAL(user, COMSIG_DO_AFTER_BEGAN)
var/endtime = world.time + delay
var/starttime = world.time
-
- if(exclusive & TASK_USER_EXCLUSIVE)
- user.status_flags |= DOING_TASK
-
- if(target && (exclusive & TASK_TARGET_EXCLUSIVE))
- target.flags |= IS_BUSY
-
. = TRUE
while (world.time < endtime)
stoplag(1)
- if(progress)
+
+ if(!QDELETED(progbar))
progbar.update(world.time - starttime)
- if(!user || user.incapacitated(incapacitation_flags))
+ /*if(drifting && isnull(user.drift_handler)) //We don't have a drift handler yet, sadly.
+ drifting = FALSE
+ user_loc = user.loc*/
+
+ if(QDELETED(user) \
+ || (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \
+ || (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_hand() != holding) \
+ || (!(timed_action_flags & IGNORE_INCAPACITATED) && HAS_TRAIT(user, TRAIT_INCAPACITATED)) \
+ || (max_distance && target && get_dist(user, target) > max_distance) \
+ || (extra_checks && !extra_checks.Invoke()))
. = FALSE
break
- if(M)
- if(user.loc != M || (M.loc != original_loc && !ignore_movement)) // Mech coooooode.
- . = FALSE
- break
-
- else if(user.loc != original_loc && !ignore_movement)
+ if(target && (user != target) && \
+ (QDELETED(target) \
+ || (!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) && target.loc != target_loc)))
. = FALSE
break
- if(target_loc && (QDELETED(target)))
- . = FALSE
- break
+ if(!QDELETED(progbar))
+ progbar.end_progress()
- if(target && target_loc != target.loc && !ignore_movement)
- . = FALSE
- break
+ cog?.remove()
- if(needhand)
- if(user.get_active_hand() != holding)
- . = FALSE
- break
-
- if(max_distance && target && get_dist(user, target) > max_distance)
- . = FALSE
- break
-
- if(exclusive & TASK_USER_EXCLUSIVE)
- user.status_flags &= ~DOING_TASK
- if(target && (exclusive & TASK_TARGET_EXCLUSIVE))
- target.flags &= ~IS_BUSY
-
- if(progbar)
- qdel(progbar)
+ if(interaction_key)
+ var/reduced_interaction_count = (LAZYACCESS(user.do_afters, interaction_key) || 0) - 1
+ if(reduced_interaction_count > 0) // Not done yet!
+ LAZYSET(user.do_afters, interaction_key, reduced_interaction_count)
+ return
+ // all out, let's clear er out fully
+ LAZYREMOVE(user.do_afters, interaction_key)
SEND_SIGNAL(user, COMSIG_DO_AFTER_ENDED)
/atom/proc/living_mobs(var/range = world.view)
diff --git a/code/_onclick/hud/action/action.dm b/code/_onclick/hud/action/action.dm
index 77975659e4..d1d6a3a6bb 100644
--- a/code/_onclick/hud/action/action.dm
+++ b/code/_onclick/hud/action/action.dm
@@ -52,7 +52,7 @@
/// Links the passed target to our action, registering any relevant signals
/datum/action/proc/link_to(Target)
target = Target
- RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(clear_ref), override = TRUE)
+ RegisterSignal(target, COMSIG_QDELETING, PROC_REF(clear_ref), override = TRUE)
if(isatom(target))
RegisterSignal(target, COMSIG_ATOM_UPDATED_ICON, PROC_REF(on_target_icon_update))
@@ -90,7 +90,7 @@
SEND_SIGNAL(src, COMSIG_ACTION_GRANTED, grant_to)
SEND_SIGNAL(grant_to, COMSIG_MOB_GRANTED_ACTION, src)
owner = grant_to
- RegisterSignal(owner, COMSIG_PARENT_QDELETING, PROC_REF(clear_ref), override = TRUE)
+ RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(clear_ref), override = TRUE)
GiveAction(grant_to)
@@ -109,9 +109,9 @@
SEND_SIGNAL(src, COMSIG_ACTION_REMOVED, owner)
SEND_SIGNAL(owner, COMSIG_MOB_REMOVED_ACTION, src)
- UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(owner, COMSIG_QDELETING)
if(target == owner)
- RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(clear_ref))
+ RegisterSignal(target, COMSIG_QDELETING, PROC_REF(clear_ref))
owner = null
diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm
index b803227325..888710de73 100644
--- a/code/_onclick/hud/radial.dm
+++ b/code/_onclick/hud/radial.dm
@@ -12,10 +12,10 @@ GLOBAL_LIST_EMPTY(radial_menus)
/obj/screen/radial/proc/set_parent(new_value)
if(parent)
- UnregisterSignal(parent, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(parent, COMSIG_QDELETING)
parent = new_value
if(parent)
- RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(handle_parent_del))
+ RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(handle_parent_del))
/obj/screen/radial/proc/handle_parent_del()
SIGNAL_HANDLER
diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm
index 3780495812..0e5c5277af 100644
--- a/code/controllers/subsystems/garbage.dm
+++ b/code/controllers/subsystems/garbage.dm
@@ -365,7 +365,7 @@ SUBSYSTEM_DEF(garbage)
to_delete.gc_destroyed = GC_CURRENTLY_BEING_QDELETED
var/start_time = world.time
var/start_tick = world.tick_usage
- SEND_SIGNAL(to_delete, COMSIG_PARENT_QDELETING, force) // Let the (remaining) components know about the result of Destroy
+ SEND_SIGNAL(to_delete, COMSIG_QDELETING, force) // Let the (remaining) components know about the result of Destroy
var/hint = to_delete.Destroy(force) // Let our friend know they're about to get fucked up.
if(world.time != start_time)
diff --git a/code/datums/browser.dm b/code/datums/browser.dm
index 081016629f..c66ddb4be5 100644
--- a/code/datums/browser.dm
+++ b/code/datums/browser.dm
@@ -20,7 +20,7 @@
var/client/client_user = user
user = client_user.mob
src.user = user
- RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(user_deleted))
+ RegisterSignal(user, COMSIG_QDELETING, PROC_REF(user_deleted))
src.window_id = window_id
if (title)
src.title = strip_improper(title)
diff --git a/code/datums/chat_message.dm b/code/datums/chat_message.dm
index 8c16e3e631..0260aa1138 100644
--- a/code/datums/chat_message.dm
+++ b/code/datums/chat_message.dm
@@ -80,7 +80,7 @@ var/list/runechat_image_cache = list()
/datum/chatmessage/Destroy()
if(istype(owned_by, /client)) // hopefully the PARENT_QDELETING on client should beat this if it's a disconnect
- UnregisterSignal(owned_by, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(owned_by, COMSIG_QDELETING)
if(owned_by.seen_messages)
LAZYREMOVEASSOC(owned_by.seen_messages, message_loc, src)
owned_by.images.Remove(message)
@@ -112,7 +112,7 @@ var/list/runechat_image_cache = list()
// Register client who owns this message
owned_by = owner.client
- RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, PROC_REF(unregister_qdel_self)) // this should only call owned_by if the client is destroyed
+ RegisterSignal(owned_by, COMSIG_QDELETING, PROC_REF(unregister_qdel_self)) // this should only call owned_by if the client is destroyed
var/extra_length = owned_by.prefs?.read_preference(/datum/preference/toggle/runechat_long_messages)
var/maxlen = extra_length ? CHAT_MESSAGE_EXT_LENGTH : CHAT_MESSAGE_LENGTH
@@ -202,7 +202,7 @@ var/list/runechat_image_cache = list()
if(!owned_by)
qdel(src)
return
- RegisterSignal(message_loc, COMSIG_PARENT_QDELETING, PROC_REF(qdel_self))
+ RegisterSignal(message_loc, COMSIG_QDELETING, PROC_REF(qdel_self))
if(owned_by.seen_messages)
var/idx = 1
var/combined_height = approx_lines
@@ -294,7 +294,7 @@ var/list/runechat_image_cache = list()
/datum/chatmessage/proc/unregister_qdel_self() // this should only call owned_by if the client is destroyed
SIGNAL_HANDLER
- UnregisterSignal(owned_by, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(owned_by, COMSIG_QDELETING)
owned_by = null
qdel_self()
diff --git a/code/datums/cinematics/_cinematic.dm b/code/datums/cinematics/_cinematic.dm
index 6a49548f1f..f73ade4d7a 100644
--- a/code/datums/cinematics/_cinematic.dm
+++ b/code/datums/cinematics/_cinematic.dm
@@ -121,7 +121,7 @@
watching += watching_client
watching_mob.overlay_fullscreen("cinematic", /obj/screen/fullscreen/cinematic_backdrop)
watching_client.screen += screen
- RegisterSignal(watching_client, COMSIG_PARENT_QDELETING, PROC_REF(remove_watcher))
+ RegisterSignal(watching_client, COMSIG_QDELETING, PROC_REF(remove_watcher))
/// Simple helper for playing sounds from the cinematic.
/datum/cinematic/proc/play_cinematic_sound(sound_to_play)
@@ -170,7 +170,7 @@
if(!(no_longer_watching in watching))
CRASH("cinematic remove_watcher was passed a client which wasn't watching.")
- UnregisterSignal(no_longer_watching, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(no_longer_watching, COMSIG_QDELETING)
// We'll clear the cinematic if they have a mob which has one,
// but we won't remove TRAIT_NO_TRANSFORM. Wait for the cinematic end to do that.
no_longer_watching.mob?.clear_fullscreen("cinematic")
diff --git a/code/datums/cogbar.dm b/code/datums/cogbar.dm
new file mode 100644
index 0000000000..0bf9ded161
--- /dev/null
+++ b/code/datums/cogbar.dm
@@ -0,0 +1,100 @@
+#define COGBAR_ANIMATION_TIME (0.5 SECONDS)
+
+/**
+ * ### Cogbar
+ * Represents that the user is busy doing something.
+ */
+/datum/cogbar
+ /// Who's doing the thing
+ var/mob/user
+ /// The user client
+ var/client/user_client
+ /// The visible element to other players
+ var/obj/effect/overlay/vis/cog
+ /// The blank image that overlaps the cog - hides it from the source user
+ var/image/blank
+ /// The offset of the icon
+ var/offset_y
+ /// Icon path of the cog
+ var/cogicon
+ /// The icon state
+ var/cogiconstate
+
+
+/datum/cogbar/New(mob/user, cogicon, cogiconstate)
+ src.user = user
+ src.user_client = user.client
+ src.cogicon = cogicon
+ src.cogiconstate = cogiconstate
+ var/list/icon_offsets = user.get_oversized_icon_offsets()
+ offset_y = icon_offsets["y"]
+ if(isnull(cogicon))
+ stack_trace("/datum/cogbar was created with a null icon.")
+ qdel(src)
+ return
+ if(isnull(cogiconstate))
+ stack_trace("/datum/cogbar was created with a null icon state.")
+ qdel(src)
+ return
+
+ add_cog_to_user()
+
+ RegisterSignal(user, COMSIG_QDELETING, PROC_REF(on_user_delete))
+
+
+/datum/cogbar/Destroy()
+ if(user)
+ SSvis_overlays.remove_vis_overlay(user, user.managed_vis_overlays)
+ user_client?.images -= blank
+
+ user = null
+ user_client = null
+ cog = null
+ QDEL_NULL(blank)
+
+ return ..()
+
+
+/// Adds the cog to the user, visible by other players
+/datum/cogbar/proc/add_cog_to_user()
+ cog = SSvis_overlays.add_vis_overlay(user,
+ icon = cogicon,
+ iconstate = cogiconstate,
+ plane = ABOVE_PLANE,
+ add_appearance_flags = APPEARANCE_UI_IGNORE_ALPHA,
+ unique = TRUE,
+ alpha = 0,
+ )
+ cog.pixel_y = ICON_SIZE_Y + offset_y
+ animate(cog, alpha = user.alpha, time = COGBAR_ANIMATION_TIME)
+
+ if(isnull(user_client))
+ return
+
+ blank = image('icons/blanks/32x32.dmi', cog, "nothing")
+ blank.plane = ABOVE_PLANE //Change to SET_PLANE_EXPLICIT(blank, HIGH_GAME_PLANE, user)
+ blank.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
+ blank.override = TRUE
+
+ user_client.images += blank
+
+
+/// Removes the cog from the user
+/datum/cogbar/proc/remove()
+ if(isnull(cog))
+ qdel(src)
+ return
+
+ animate(cog, alpha = 0, time = COGBAR_ANIMATION_TIME)
+
+ QDEL_IN(src, COGBAR_ANIMATION_TIME)
+
+
+/// When the user is deleted, remove the cog
+/datum/cogbar/proc/on_user_delete(datum/source)
+ SIGNAL_HANDLER
+
+ qdel(src)
+
+
+#undef COGBAR_ANIMATION_TIME
diff --git a/code/datums/components/connect_loc_behalf.dm b/code/datums/components/connect_loc_behalf.dm
index 6709668f77..af5022328e 100644
--- a/code/datums/components/connect_loc_behalf.dm
+++ b/code/datums/components/connect_loc_behalf.dm
@@ -19,20 +19,20 @@
/datum/component/connect_loc_behalf/RegisterWithParent()
RegisterSignal(tracked, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved))
- RegisterSignal(tracked, COMSIG_PARENT_QDELETING, PROC_REF(handle_tracked_qdel))
+ RegisterSignal(tracked, COMSIG_QDELETING, PROC_REF(handle_tracked_qdel))
update_signals()
/datum/component/connect_loc_behalf/UnregisterFromParent()
unregister_signals()
UnregisterSignal(tracked, list(
COMSIG_MOVABLE_MOVED,
- COMSIG_PARENT_QDELETING,
+ COMSIG_QDELETING,
))
tracked = null
/datum/component/connect_loc_behalf/proc/handle_tracked_qdel()
- SIGNAL_HANDLER // COMSIG_PARENT_QDELETING
+ SIGNAL_HANDLER // COMSIG_QDELETING
qdel(src)
/datum/component/connect_loc_behalf/proc/update_signals()
diff --git a/code/datums/components/connect_mob_behalf.dm b/code/datums/components/connect_mob_behalf.dm
index 1c1a8a6523..b8aa014f81 100644
--- a/code/datums/components/connect_mob_behalf.dm
+++ b/code/datums/components/connect_mob_behalf.dm
@@ -19,12 +19,12 @@
src.tracked = tracked
/datum/component/connect_mob_behalf/RegisterWithParent()
- RegisterSignal(tracked, COMSIG_PARENT_QDELETING, PROC_REF(handle_tracked_qdel))
+ RegisterSignal(tracked, COMSIG_QDELETING, PROC_REF(handle_tracked_qdel))
update_signals()
/datum/component/connect_mob_behalf/UnregisterFromParent()
unregister_signals()
- UnregisterSignal(tracked, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(tracked, COMSIG_QDELETING)
tracked = null
tracked_mob = null
diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm
index 3385ae0323..680c3ea2a4 100644
--- a/code/datums/components/overlay_lighting.dm
+++ b/code/datums/components/overlay_lighting.dm
@@ -227,15 +227,15 @@
parent_attached_to = new_parent_attached_to
if(.)
var/atom/movable/old_parent_attached_to = .
- UnregisterSignal(old_parent_attached_to, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_LIGHT_EATER_QUEUE))
+ UnregisterSignal(old_parent_attached_to, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_LIGHT_EATER_QUEUE))
if(old_parent_attached_to == current_holder)
- RegisterSignal(old_parent_attached_to, COMSIG_PARENT_QDELETING, PROC_REF(on_holder_qdel))
+ RegisterSignal(old_parent_attached_to, COMSIG_QDELETING, PROC_REF(on_holder_qdel))
RegisterSignal(old_parent_attached_to, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved))
RegisterSignal(old_parent_attached_to, COMSIG_LIGHT_EATER_QUEUE, PROC_REF(on_light_eater))
if(parent_attached_to)
if(parent_attached_to == current_holder)
- UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_LIGHT_EATER_QUEUE))
- RegisterSignal(parent_attached_to, COMSIG_PARENT_QDELETING, PROC_REF(on_parent_attached_to_qdel))
+ UnregisterSignal(current_holder, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_LIGHT_EATER_QUEUE))
+ RegisterSignal(parent_attached_to, COMSIG_QDELETING, PROC_REF(on_parent_attached_to_qdel))
RegisterSignal(parent_attached_to, COMSIG_MOVABLE_MOVED, PROC_REF(on_parent_attached_to_moved))
RegisterSignal(parent_attached_to, COMSIG_LIGHT_EATER_QUEUE, PROC_REF(on_light_eater))
check_holder()
@@ -249,7 +249,7 @@
new_holder = null // Forbid crates from holding lights, this only applies to contents 'holding', when you put a flashlight into a crate for example. Not crates with lights... Not that there are any.
if(current_holder)
if(current_holder != parent && current_holder != parent_attached_to)
- UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_LIGHT_EATER_QUEUE))
+ UnregisterSignal(current_holder, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_LIGHT_EATER_QUEUE))
if(directional)
UnregisterSignal(current_holder, COMSIG_ATOM_DIR_CHANGE)
if(overlay_lighting_flags & LIGHTING_ON)
@@ -259,7 +259,7 @@
clean_old_turfs()
return
if(new_holder != parent && new_holder != parent_attached_to)
- RegisterSignal(new_holder, COMSIG_PARENT_QDELETING, PROC_REF(on_holder_qdel))
+ RegisterSignal(new_holder, COMSIG_QDELETING, PROC_REF(on_holder_qdel))
RegisterSignal(new_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved))
RegisterSignal(new_holder, COMSIG_LIGHT_EATER_QUEUE, PROC_REF(on_light_eater))
if(directional)
@@ -288,7 +288,7 @@
///Called when the current_holder is qdeleted, to remove the light effect.
/datum/component/overlay_lighting/proc/on_holder_qdel(atom/movable/source, force)
SIGNAL_HANDLER
- UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED))
+ UnregisterSignal(current_holder, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED))
if(directional)
UnregisterSignal(current_holder, COMSIG_ATOM_DIR_CHANGE)
set_holder(null)
@@ -317,7 +317,7 @@
///Called when the current_holder is qdeleted, to remove the light effect.
/datum/component/overlay_lighting/proc/on_parent_attached_to_qdel(atom/movable/source, force)
SIGNAL_HANDLER
- UnregisterSignal(parent_attached_to, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED))
+ UnregisterSignal(parent_attached_to, list(COMSIG_QDELETING, COMSIG_MOVABLE_MOVED))
if(directional)
UnregisterSignal(parent_attached_to, COMSIG_ATOM_DIR_CHANGE)
if(parent_attached_to == current_holder)
diff --git a/code/datums/components/recursive_move.dm b/code/datums/components/recursive_move.dm
index c3cd13bb62..a3e1b70d44 100644
--- a/code/datums/components/recursive_move.dm
+++ b/code/datums/components/recursive_move.dm
@@ -12,7 +12,7 @@
/datum/component/recursive_move/RegisterWithParent()
. = ..()
holder = parent
- RegisterSignal(holder, COMSIG_PARENT_QDELETING, PROC_REF(on_holder_qdel))
+ RegisterSignal(holder, COMSIG_QDELETING, PROC_REF(on_holder_qdel))
spawn(0) // Delayed action if our holder is spawned in nullspace and then loc = target, hopefully this catches it. VV Add item does this, for example.
if(!QDELETED(src))
setup_parents()
@@ -35,7 +35,7 @@
recursion++
parents += cur_parent
RegisterSignal(cur_parent, COMSIG_ATOM_EXITED, PROC_REF(heirarchy_changed))
- RegisterSignal(cur_parent, COMSIG_PARENT_QDELETING, PROC_REF(on_qdel))
+ RegisterSignal(cur_parent, COMSIG_QDELETING, PROC_REF(on_qdel))
cur_parent = cur_parent.loc
@@ -65,7 +65,7 @@
if(!length(parents))
return
for(var/atom/movable/cur_parent in parents)
- UnregisterSignal(cur_parent, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(cur_parent, COMSIG_QDELETING)
UnregisterSignal(cur_parent, COMSIG_ATOM_EXITED)
UnregisterSignal(parents[parents.len], COMSIG_ATOM_ENTERING)
@@ -93,7 +93,7 @@
/datum/component/recursive_move/proc/on_holder_qdel()
SIGNAL_HANDLER
- UnregisterSignal(holder, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(holder, COMSIG_QDELETING)
reset_parents()
holder = null
qdel(src)
@@ -101,7 +101,7 @@
/datum/component/recursive_move/Destroy()
. = ..()
reset_parents()
- if(holder) UnregisterSignal(holder, COMSIG_PARENT_QDELETING)
+ if(holder) UnregisterSignal(holder, COMSIG_QDELETING)
holder = null
/datum/component/recursive_move/proc/reset_parents()
diff --git a/code/datums/components/species/shadekin/powers/dark_maw.dm b/code/datums/components/species/shadekin/powers/dark_maw.dm
index edf5cdda4a..cbe5596ca5 100644
--- a/code/datums/components/species/shadekin/powers/dark_maw.dm
+++ b/code/datums/components/species/shadekin/powers/dark_maw.dm
@@ -72,7 +72,7 @@
owner = user
if(owner.vore_selected)
target = owner.vore_selected
- RegisterSignal(owner, COMSIG_PARENT_QDELETING, PROC_REF(drop_everything_and_delete))
+ RegisterSignal(owner, COMSIG_QDELETING, PROC_REF(drop_everything_and_delete))
has_signal = TRUE
SK = owner.get_shadekin_component()
@@ -112,7 +112,7 @@
STOP_PROCESSING(SSobj, src)
if(owner)
if(has_signal)
- UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(owner, COMSIG_QDELETING)
var/datum/component/shadekin/SK = owner.get_shadekin_component()
if(SK)
SK.active_dark_maws -= src
diff --git a/code/datums/components/traits/weaver.dm b/code/datums/components/traits/weaver.dm
index 84505901d6..24b712745a 100644
--- a/code/datums/components/traits/weaver.dm
+++ b/code/datums/components/traits/weaver.dm
@@ -115,7 +115,7 @@
to_chat(owner, span_warning("You can't weave here!"))
return
- if(do_after(owner, desired_result.time, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(owner, desired_result.time))
if(desired_result.cost > silk_reserve)
to_chat(owner, span_warning("You don't have enough silk to weave that!"))
return
@@ -168,7 +168,7 @@
to_chat(owner, span_warning("You can't weave here!"))
return
- if(do_after(owner, desired_result.time, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(owner, desired_result.time))
if(desired_result.cost > silk_reserve)
to_chat(owner, span_warning("You don't have enough silk to weave that!"))
return
diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm
index 7f019508a3..b2e021ad2b 100644
--- a/code/datums/elements/_element.dm
+++ b/code/datums/elements/_element.dm
@@ -26,7 +26,7 @@
return ELEMENT_INCOMPATIBLE
SEND_SIGNAL(target, COMSIG_ELEMENT_ATTACH, src)
if(element_flags & ELEMENT_DETACH_ON_HOST_DESTROY)
- RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(OnTargetDelete), override = TRUE)
+ RegisterSignal(target, COMSIG_QDELETING, PROC_REF(OnTargetDelete), override = TRUE)
/datum/element/proc/OnTargetDelete(datum/source)
SIGNAL_HANDLER
@@ -38,7 +38,7 @@
SHOULD_CALL_PARENT(TRUE)
SEND_SIGNAL(source, COMSIG_ELEMENT_DETACH, src)
- UnregisterSignal(source, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(source, COMSIG_QDELETING)
/datum/element/Destroy(force)
if(!force)
diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm
index b0825c6329..ebc4c4de4f 100644
--- a/code/datums/progressbar.dm
+++ b/code/datums/progressbar.dm
@@ -1,69 +1,158 @@
#define PROGRESSBAR_HEIGHT 6
+#define PROGRESSBAR_ANIMATION_TIME 5
/datum/progressbar
- var/goal = 1
+ ///The progress bar visual element.
var/image/bar
- var/shown = 0
+ ///The target where this progress bar is applied and where it is shown.
+ var/atom/bar_loc
+ ///The mob whose client sees the progress bar.
var/mob/user
- var/client/client
- var/listindex
+ ///The client seeing the progress bar.
+ var/client/user_client
+ ///Effectively the number of steps the progress bar will need to do before reaching completion.
+ var/goal = 1
+ ///Control check to see if the progress was interrupted before reaching its goal.
+ var/last_progress = 0
+ ///Variable to ensure smooth visual stacking on multiple progress bars.
+ var/listindex = 0
+ ///The type of our last value for bar_loc, for debugging
+ var/location_type
+ ///Where to draw the progress bar above the icon
+ var/offset_y
-/datum/progressbar/New(mob/User, goal_number, atom/target)
+/datum/progressbar/New(mob/User, goal_number, atom/target, starting_amount)
. = ..()
- if(!istype(target))
- target = User
- if(goal_number)
- goal = goal_number
- bar = image('icons/effects/progressbar.dmi', target, "prog_bar_0")
- bar.alpha = 0
- bar.plane = PLANE_PLAYER_HUD
+ if (!istype(target))
+ stack_trace("Invalid target [target] passed in")
+ qdel(src)
+ return
+ if(QDELETED(User) || !istype(User))
+ stack_trace("/datum/progressbar created with [isnull(User) ? "null" : "invalid"] user")
+ qdel(src)
+ return
+ if(!isnum(goal_number))
+ stack_trace("/datum/progressbar created with [isnull(User) ? "null" : "invalid"] goal_number")
+ qdel(src)
+ return
+ goal = goal_number
+ bar_loc = target
+ location_type = bar_loc.type
+
+ var/list/icon_offsets = target.get_oversized_icon_offsets()
+ var/offset_x = icon_offsets["x"]
+ offset_y = icon_offsets["y"]
+
+ bar = image('icons/effects/progressbar.dmi', bar_loc, "prog_bar_0", pixel_x = offset_x)
+ bar.plane = PLANE_PLAYER_HUD //Swap to SET_PLANE_EXPLICIT(bar, LAYER_HUD_ITEM, User) if we ever get the plane update
bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
user = User
- if(user)
- client = user.client
- LAZYINITLIST(user.progressbars)
- LAZYINITLIST(user.progressbars[bar.loc])
- var/list/bars = user.progressbars[bar.loc]
- bars.Add(src)
+ LAZYADDASSOCLIST(user.progressbars, bar_loc, src)
+ var/list/bars = user.progressbars[bar_loc]
listindex = bars.len
- animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = 5, easing = SINE_EASING)
-/datum/progressbar/proc/update(progress)
- if(!user || !user.client)
- shown = 0
- return
- if(user.client != client)
- if(client)
- client.images -= bar
- if(user.client)
- user.client.images += bar
+ if(user.client)
+ user_client = user.client
+ add_prog_bar_image_to_client()
- progress = CLAMP(progress, 0, goal)
- bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]"
- if(!shown && user.client?.prefs?.read_preference(/datum/preference/toggle/show_progress_bar))
- user.client.images += bar
- shown = 1
+ RegisterSignal(user, COMSIG_QDELETING, PROC_REF(on_user_delete))
+ RegisterSignal(user, COMSIG_MOB_LOGOUT, PROC_REF(clean_user_client))
+ RegisterSignal(user, COMSIG_MOB_LOGIN, PROC_REF(on_user_login))
-/datum/progressbar/proc/shiftDown()
- --listindex
- var/shiftheight = bar.pixel_y - PROGRESSBAR_HEIGHT
- animate(bar, pixel_y = shiftheight, time = 5, easing = SINE_EASING)
+ if(starting_amount)
+ update(starting_amount)
/datum/progressbar/Destroy()
- for(var/datum/progressbar/P as anything in user.progressbars[bar.loc])
- if(P != src && P.listindex > listindex)
- P.shiftDown()
+ if(user)
+ for(var/pb in user.progressbars[bar_loc])
+ var/datum/progressbar/progress_bar = pb
+ if(progress_bar == src || progress_bar.listindex <= listindex)
+ continue
+ progress_bar.listindex--
- var/list/bars = user.progressbars[bar.loc]
- bars.Remove(src)
- if(!bars.len)
- LAZYREMOVE(user.progressbars, bar.loc)
- animate(bar, alpha = 0, time = 5)
- spawn(5)
- if(client)
- client.images -= bar
- qdel(bar)
- . = ..()
+ progress_bar.bar.pixel_z = ICON_SIZE_Y + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1))
+ var/dist_to_travel = ICON_SIZE_Y + offset_y + (PROGRESSBAR_HEIGHT * (progress_bar.listindex - 1)) - PROGRESSBAR_HEIGHT
+ animate(progress_bar.bar, pixel_z = dist_to_travel, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING)
+ LAZYREMOVEASSOC(user.progressbars, bar_loc, src)
+ user = null
+
+ if(user_client)
+ clean_user_client()
+
+ bar_loc = null
+ bar = null
+
+ return ..()
+
+
+///Called right before the user's Destroy()
+/datum/progressbar/proc/on_user_delete(datum/source)
+ SIGNAL_HANDLER
+
+ user.progressbars = null //We can simply nuke the list and stop worrying about updating other prog bars if the user itself is gone.
+ user = null
+ qdel(src)
+
+
+///Removes the progress bar image from the user_client and nulls the variable, if it exists.
+/datum/progressbar/proc/clean_user_client(datum/source)
+ SIGNAL_HANDLER
+
+ if(!user_client) //Disconnected, already gone.
+ return
+ user_client.images -= bar
+ user_client = null
+
+
+///Called by user's Login(), it transfers the progress bar image to the new client.
+/datum/progressbar/proc/on_user_login(datum/source)
+ SIGNAL_HANDLER
+
+ if(user_client)
+ if(user_client == user.client) //If this was not client handling I'd condemn this sanity check. But clients are fickle things.
+ return
+ clean_user_client()
+ if(!user.client) //Clients can vanish at any time, the bastards.
+ return
+ user_client = user.client
+ add_prog_bar_image_to_client()
+
+
+///Adds a smoothly-appearing progress bar image to the player's screen.
+/datum/progressbar/proc/add_prog_bar_image_to_client()
+ bar.pixel_z = 0
+ bar.alpha = 0
+ user_client.images += bar
+ animate(bar, pixel_z = ICON_SIZE_Y + offset_y + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING)
+
+
+///Updates the progress bar image visually.
+/datum/progressbar/proc/update(progress)
+ progress = clamp(progress, 0, goal)
+ if(progress == last_progress)
+ return
+ last_progress = progress
+ bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]"
+
+
+///Called on progress end, be it successful or a failure. Wraps up things to delete the datum and bar.
+/datum/progressbar/proc/end_progress()
+ if(last_progress != goal)
+ bar.icon_state = "[bar.icon_state]_fail"
+
+ animate(bar, alpha = 0, time = PROGRESSBAR_ANIMATION_TIME)
+
+ QDEL_IN(src, PROGRESSBAR_ANIMATION_TIME)
+
+///Progress bars are very generic, and what hangs a ref to them depends heavily on the context in which they're used
+///So let's make hunting harddels easier yeah?
+/datum/progressbar/dump_harddel_info()
+ if(harddel_deets_dumped)
+ return
+ harddel_deets_dumped = TRUE
+ return "Owner's type: [location_type]"
+
+#undef PROGRESSBAR_ANIMATION_TIME
#undef PROGRESSBAR_HEIGHT
diff --git a/code/datums/weakrefs.dm b/code/datums/weakrefs.dm
index 27bd5d9433..dedc0d8eff 100644
--- a/code/datums/weakrefs.dm
+++ b/code/datums/weakrefs.dm
@@ -87,7 +87,7 @@
* adding it to an atom's contents or vis_contents, giving it a key (if it's a mob), attaching it to an atom (if it's an image),
* or assigning it to a datum or list referenced somewhere other than a temporary value.
*
- * Unless you're resolving a weakref to a datum in a COMSIG_PARENT_QDELETING signal handler registered on that very same datum,
+ * Unless you're resolving a weakref to a datum in a COMSIG_QDELETING signal handler registered on that very same datum,
* just use resolve instead.
*/
/datum/weakref/proc/hard_resolve()
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index c306e0c7f7..aea7c7657c 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -48,7 +48,7 @@
render_target = ref(src)
em_block = new(src, render_target)
add_overlay(list(em_block), TRUE)
- RegisterSignal(em_block, COMSIG_PARENT_QDELETING, PROC_REF(emblocker_gc))
+ RegisterSignal(em_block, COMSIG_QDELETING, PROC_REF(emblocker_gc))
if(opacity)
AddElement(/datum/element/light_blocking)
if(icon_scale_x != DEFAULT_ICON_SCALE_X || icon_scale_y != DEFAULT_ICON_SCALE_Y || icon_rotation != DEFAULT_ICON_ROTATION)
@@ -67,7 +67,7 @@
/atom/movable/Destroy()
if(em_block)
cut_overlay(em_block)
- UnregisterSignal(em_block, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(em_block, COMSIG_QDELETING)
QDEL_NULL(em_block)
. = ..()
@@ -658,7 +658,7 @@
/atom/movable/proc/emblocker_gc(var/datum/source)
SIGNAL_HANDLER
- UnregisterSignal(source, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(source, COMSIG_QDELETING)
cut_overlay(source)
if(em_block == source)
em_block = null
diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
index c1f4d36ec4..d6f8095933 100644
--- a/code/game/machinery/medical_kiosk.dm
+++ b/code/game/machinery/medical_kiosk.dm
@@ -103,7 +103,7 @@
// Service begins, delay
visible_message(span_bold("\The [src]") + " scans [user] thoroughly!")
flick("kiosk_active", src)
- if(!do_after(user, 5 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
+ if(!do_after(user, 5 SECONDS, src) || inoperable())
suspend()
return
diff --git a/code/game/mecha/equipment/tools/passenger.dm b/code/game/mecha/equipment/tools/passenger.dm
index c5730b810a..c25e541565 100644
--- a/code/game/mecha/equipment/tools/passenger.dm
+++ b/code/game/mecha/equipment/tools/passenger.dm
@@ -26,7 +26,7 @@
if (chassis)
chassis.visible_message(span_notice("[user] starts to climb into [chassis]."))
- if(do_after(user, 40, needhand=0))
+ if(do_after(user, 40))
if(!src.occupant)
user.forceMove(src)
occupant = user
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 3d60661cc8..d36c72c5f9 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -211,7 +211,7 @@
CRASH("item add_item_action got a type or instance of something that wasn't an action.")
LAZYADD(actions, action)
- RegisterSignal(action, COMSIG_PARENT_QDELETING, PROC_REF(on_action_deleted))
+ RegisterSignal(action, COMSIG_QDELETING, PROC_REF(on_action_deleted))
if(ismob(loc))
// We're being held or are equipped by someone while adding an action?
// Then they should also probably be granted the action, given it's in a correct slot
@@ -225,7 +225,7 @@
if(!action)
return
- UnregisterSignal(action, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(action, COMSIG_QDELETING)
LAZYREMOVE(actions, action)
qdel(action)
diff --git a/code/game/objects/items/devices/denecrotizer_vr.dm b/code/game/objects/items/devices/denecrotizer_vr.dm
index d5072045ac..fa80d1ab99 100644
--- a/code/game/objects/items/devices/denecrotizer_vr.dm
+++ b/code/game/objects/items/devices/denecrotizer_vr.dm
@@ -155,7 +155,7 @@
return FALSE
if(!target.mind)
user.visible_message("[user] gently presses [src] to [target]...", runemessage = "presses [src] to [target]")
- if(do_after(user, revive_time, exclusive = TASK_USER_EXCLUSIVE, target = target))
+ if(do_after(user, revive_time, target = target))
target.faction = user.faction
target.revivedby = user.name
target.ghostjoin = 1
@@ -176,7 +176,7 @@
/obj/item/denecrotizer/proc/ghostjoin_rez(mob/living/simple_mob/target, mob/living/user)
user.visible_message("[user] gently presses [src] to [target]...", runemessage = "presses [src] to [target]")
- if(do_after(user, revive_time, exclusive = TASK_ALL_EXCLUSIVE, target = target))
+ if(do_after(user, revive_time, target = target))
target.faction = user.faction
target.revivedby = user.name
target.ai_holder.returns_home = FALSE
@@ -200,7 +200,7 @@
/obj/item/denecrotizer/proc/basic_rez(mob/living/simple_mob/target, mob/living/user) //so medical can have a way to bring back people's pets or whatever, does not change any settings about the mob or offer it to ghosts.
user.visible_message("[user] presses [src] to [target]...", runemessage = "presses [src] to [target]")
- if(do_after(user, revive_time, exclusive = TASK_ALL_EXCLUSIVE, target = target))
+ if(do_after(user, revive_time, target = target))
target.revive()
target.sight = initial(target.sight)
target.see_in_dark = initial(target.see_in_dark)
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index a880e8330b..bf7f174744 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -413,7 +413,7 @@
balloon_alert(user, "you can't apply a splint to the arm you're using!")
return
user.balloon_alert_visible("[user] starts to apply \the [src] to their [limb].", "applying \the [src] to your [limb].", "You hear something being wrapped.")
- if(do_after(user, 50, M, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user, 50, M))
if(affecting.splinted)
balloon_alert(user, "[M]'s [limb] is already splinted!")
return
diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm
index 86f0937b2d..8a0d57f541 100644
--- a/code/game/objects/items/stacks/nanopaste.dm
+++ b/code/game/objects/items/stacks/nanopaste.dm
@@ -17,7 +17,7 @@
if (istype(M,/mob/living/silicon/robot)) //Repairing cyborgs
var/mob/living/silicon/robot/R = M
if (R.getBruteLoss() || R.getFireLoss())
- if(do_after(user, 7 * toolspeed, R, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 7 * toolspeed, R))
R.adjustBruteLoss(-15)
R.adjustFireLoss(-15)
R.updatehealth()
@@ -51,9 +51,9 @@
else if(can_use(1))
user.setClickCooldown(user.get_attack_speed(src))
if(S.open >= 2)
- if(do_after(user, 5 * toolspeed, S, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 5 * toolspeed, S))
S.heal_damage(restoration_internal, restoration_internal, robo_repair = 1)
- else if(do_after(user, 5 * toolspeed, S, exclusive = TASK_ALL_EXCLUSIVE))
+ else if(do_after(user, 5 * toolspeed, S))
S.heal_damage(restoration_external,restoration_external, robo_repair =1)
H.updatehealth()
use(1)
diff --git a/code/game/objects/items/weapons/capture_crystal.dm b/code/game/objects/items/weapons/capture_crystal.dm
index 096a0d08a2..51d09432db 100644
--- a/code/game/objects/items/weapons/capture_crystal.dm
+++ b/code/game/objects/items/weapons/capture_crystal.dm
@@ -31,11 +31,11 @@
if(bound_mob in contents)
unleash()
to_chat(bound_mob, span_notice("You feel like yourself again. You are no longer under the influence of \the [src]'s command."))
- UnregisterSignal(bound_mob, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(bound_mob, COMSIG_QDELETING)
bound_mob.capture_caught = FALSE
bound_mob = null
if(owner)
- UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(owner, COMSIG_QDELETING)
owner = null
return ..()
@@ -156,7 +156,7 @@
else
M.visible_message("\The [src] flickers in \the [M]'s hand and emits a little tone.", "\The [src] flickers in your hand and emits a little tone.")
playsound(src, 'sound/effects/capture-crystal-out.ogg', 75, 1, -1)
- UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(owner, COMSIG_QDELETING)
owner = null
//Let's make inviting ghosts be an option you can do instead of an automatic thing!
@@ -251,8 +251,8 @@
//Make it so the crystal knows if its mob references get deleted to make sure things get cleaned up
/obj/item/capture_crystal/proc/knowyoursignals(mob/living/M, mob/living/U)
- RegisterSignal(M, COMSIG_PARENT_QDELETING, PROC_REF(mob_was_deleted), TRUE)
- RegisterSignal(U, COMSIG_PARENT_QDELETING, PROC_REF(owner_was_deleted), TRUE)
+ RegisterSignal(M, COMSIG_QDELETING, PROC_REF(mob_was_deleted), TRUE)
+ RegisterSignal(U, COMSIG_QDELETING, PROC_REF(owner_was_deleted), TRUE)
//The basic capture command does most of the registration work.
/obj/item/capture_crystal/proc/capture(mob/living/M, mob/living/U)
@@ -337,8 +337,8 @@
//The clean up procs!
/obj/item/capture_crystal/proc/mob_was_deleted()
SIGNAL_HANDLER
- UnregisterSignal(bound_mob, COMSIG_PARENT_QDELETING)
- UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(bound_mob, COMSIG_QDELETING)
+ UnregisterSignal(owner, COMSIG_QDELETING)
bound_mob.capture_caught = FALSE
bound_mob = null
owner = null
@@ -348,7 +348,7 @@
/obj/item/capture_crystal/proc/owner_was_deleted()
SIGNAL_HANDLER
- UnregisterSignal(owner, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(owner, COMSIG_QDELETING)
owner = null
active = FALSE
update_icon()
diff --git a/code/game/objects/items/weapons/storage/pouches.dm b/code/game/objects/items/weapons/storage/pouches.dm
index 8158e479ba..19d9123399 100644
--- a/code/game/objects/items/weapons/storage/pouches.dm
+++ b/code/game/objects/items/weapons/storage/pouches.dm
@@ -23,7 +23,7 @@
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
return TRUE // Skip delay
- if(insert_delay && !do_after(user, insert_delay, src, needhand = TRUE, exclusive = TASK_USER_EXCLUSIVE))
+ if(insert_delay && !do_after(user, insert_delay, src))
return FALSE // Moved while there is a delay
return TRUE //Now we're allowed to put the item in the pouch
@@ -33,7 +33,7 @@
if(user.get_active_hand() == src || user.get_inactive_hand() == src)
return TRUE // Skip delay
- if(remove_delay && !do_after(user, remove_delay, src, needhand = TRUE, exclusive = TASK_USER_EXCLUSIVE))
+ if(remove_delay && !do_after(user, remove_delay, src))
return FALSE // Moved while there is a delay
if(W in src)
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 1464fc43ef..d244e53763 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -121,7 +121,7 @@
/obj/effect/energy_net/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
user.setClickCooldown(user.get_attack_speed())
visible_message(span_danger("[user] begins to tear at \the [src]!"))
- if(do_after(user, escape_time, src, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY)))
+ if(do_after(user, escape_time, src, timed_action_flags = IGNORE_INCAPACITATED))
if(!has_buckled_mobs())
return
visible_message(span_danger("[user] manages to tear \the [src] apart!"))
diff --git a/code/game/objects/micro_structures.dm b/code/game/objects/micro_structures.dm
index 257d754ac9..de5e07bc74 100644
--- a/code/game/objects/micro_structures.dm
+++ b/code/game/objects/micro_structures.dm
@@ -145,7 +145,7 @@ GLOBAL_LIST_EMPTY(micro_tunnels)
if(!choice)
return
to_chat(user,span_notice("You begin moving..."))
- if(!do_after(user, 10 SECONDS, exclusive = TRUE))
+ if(!do_after(user, 10 SECONDS))
return
user.forceMove(choice)
user.cancel_camera()
@@ -179,7 +179,7 @@ GLOBAL_LIST_EMPTY(micro_tunnels)
if(!can_enter(user))
user.visible_message(span_warning("\The [user] reaches into \the [src]. . ."),span_warning("You reach into \the [src]. . ."))
- if(!do_after(user, 3 SECONDS, exclusive = TRUE))
+ if(!do_after(user, 3 SECONDS))
user.visible_message(span_notice("\The [user] pulls their hand out of \the [src]."),span_warning("You pull your hand out of \the [src]"))
return
if(!src.contents.len)
@@ -218,7 +218,7 @@ GLOBAL_LIST_EMPTY(micro_tunnels)
return
user.visible_message(span_notice("\The [user] begins climbing into \the [src]!"))
- if(!do_after(user, 10 SECONDS, exclusive = TRUE))
+ if(!do_after(user, 10 SECONDS))
to_chat(user, span_warning("You didn't go into \the [src]!"))
return
@@ -245,7 +245,7 @@ GLOBAL_LIST_EMPTY(micro_tunnels)
var/mob/living/k = M
k.visible_message(span_notice("\The [k] begins climbing into \the [src]!"))
- if(!do_after(k, 3 SECONDS, exclusive = TRUE))
+ if(!do_after(k, 3 SECONDS))
to_chat(k, span_warning("You didn't go into \the [src]!"))
return
@@ -337,7 +337,7 @@ GLOBAL_LIST_EMPTY(micro_tunnels)
if(!choice)
return
to_chat(usr,span_notice("You begin moving..."))
- if(!do_after(usr, 10 SECONDS, exclusive = TRUE))
+ if(!do_after(usr, 10 SECONDS))
return
if(QDELETED(src))
return
@@ -375,7 +375,7 @@ GLOBAL_LIST_EMPTY(micro_tunnels)
if(!(usr.mob_size <= MOB_TINY || usr.get_effective_size(TRUE) <= micro_accepted_scale))
usr.visible_message(span_warning("\The [usr] reaches into \the [src]. . ."),span_warning("You reach into \the [src]. . ."))
- if(!do_after(usr, 3 SECONDS, exclusive = TRUE))
+ if(!do_after(usr, 3 SECONDS))
usr.visible_message(span_notice("\The [usr] pulls their hand out of \the [src]."),span_warning("You pull your hand out of \the [src]"))
return
@@ -416,7 +416,7 @@ GLOBAL_LIST_EMPTY(micro_tunnels)
return
usr.visible_message(span_notice("\The [usr] begins climbing into \the [src]!"))
- if(!do_after(usr, 10 SECONDS, exclusive = TRUE))
+ if(!do_after(usr, 10 SECONDS))
to_chat(usr, span_warning("You didn't go into \the [src]!"))
return
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 94b04e7111..b24664e859 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -177,7 +177,7 @@
playsound(src, WT.usesound, 50, 1)
if(istext(glass))
user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.")
- if(do_after(user, 4 SECONDS * WT.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 4 SECONDS * WT.toolspeed, src))
if(!src || !WT.isOn()) return
to_chat(user, span_notice("You welded the [glass] plating off!"))
var/M = text2path("/obj/item/stack/material/[glass]")
@@ -185,14 +185,14 @@
glass = 0
else if(glass == 1)
user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.")
- if(do_after(user, 4 SECONDS * WT.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 4 SECONDS * WT.toolspeed, src))
if(!src || !WT.isOn()) return
to_chat(user, span_notice("You welded the glass panel out!"))
new /obj/item/stack/material/glass/reinforced(src.loc)
glass = 0
else if(!anchored)
user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
- if(do_after(user, 4 SECONDS * WT.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 4 SECONDS * WT.toolspeed, src))
if(!src || !WT.isOn()) return
to_chat(user, span_notice("You dissasembled the airlock assembly!"))
new /obj/item/stack/material/steel(src.loc, 4)
@@ -208,7 +208,7 @@
else
user.visible_message("[user] begins securing the airlock assembly to the floor.", "You starts securing the airlock assembly to the floor.")
- if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 4 SECONDS * W.toolspeed, src))
if(!src) return
to_chat(user, span_notice("You [anchored? "un" : ""]secured the airlock assembly!"))
anchored = !anchored
@@ -219,7 +219,7 @@
to_chat(user, span_warning("You need one length of coil to wire the airlock assembly."))
return
user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.")
- if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) && state == 0 && anchored)
+ if(do_after(user, 4 SECONDS, src) && state == 0 && anchored)
if (C.use(1))
src.state = 1
to_chat(user, span_notice("You wire the airlock."))
@@ -228,7 +228,7 @@
playsound(src, W.usesound, 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
- if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 4 SECONDS * W.toolspeed, src))
if(!src) return
to_chat(user, span_notice("You cut the airlock wires.!"))
new/obj/item/stack/cable_coil(src.loc, 1)
@@ -238,7 +238,7 @@
playsound(src, W.usesound, 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
- if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 4 SECONDS, src))
if(!src) return
user.drop_item()
W.loc = src
@@ -256,7 +256,7 @@
playsound(src, W.usesound, 100, 1)
user.visible_message("\The [user] starts removing the electronics from the airlock assembly.", "You start removing the electronics from the airlock assembly.")
- if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 4 SECONDS * W.toolspeed, src))
if(!src) return
to_chat(user, span_notice("You removed the airlock electronics!"))
src.state = 1
@@ -271,7 +271,7 @@
if(material_name == MAT_RGLASS)
playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
- if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) && !glass)
+ if(do_after(user, 4 SECONDS, src) && !glass)
if (S.use(1))
to_chat(user, span_notice("You installed reinforced glass windows into the airlock assembly."))
glass = 1
@@ -283,7 +283,7 @@
if(S.get_amount() >= 2)
playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
- if(do_after(user, 4 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) && !glass)
+ if(do_after(user, 4 SECONDS, src) && !glass)
if (S.use(2))
to_chat(user, span_notice("You installed [material_display_name(material_name)] plating into the airlock assembly."))
glass = material_name
@@ -292,7 +292,7 @@
playsound(src, W.usesound, 100, 1)
to_chat(user, span_notice("Now finishing the airlock."))
- if(do_after(user, 4 SECONDS * W.toolspeed, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 4 SECONDS * W.toolspeed, src))
if(!src) return
to_chat(user, span_notice("You finish the airlock!"))
var/path
diff --git a/code/game/objects/structures/droppod.dm b/code/game/objects/structures/droppod.dm
index 047481647e..d14d14c865 100644
--- a/code/game/objects/structures/droppod.dm
+++ b/code/game/objects/structures/droppod.dm
@@ -120,7 +120,7 @@
if(O.has_tool_quality(TOOL_WRENCH))
if(finished)
to_chat(user, span_notice("You start breaking down \the [src]."))
- if(do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 10 SECONDS, src))
new /obj/item/stack/material/plasteel(loc, 10)
playsound(user, O.usesound, 50, 1)
qdel(src)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 0e0d773089..db5d7b9ee0 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -152,20 +152,20 @@
if(anchored && !reinf_material)
playsound(src, W.usesound, 100, 1)
to_chat(user, span_notice("Now disassembling the girder..."))
- if(do_after(user,(35 + round(max_health/50)) * W.toolspeed, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user,(35 + round(max_health/50)) * W.toolspeed))
if(!src) return
to_chat(user, span_notice("You dissasembled the girder!"))
dismantle()
else if(!anchored)
playsound(src, W.usesound, 100, 1)
to_chat(user, span_notice("Now securing the girder..."))
- if(do_after(user, 40 * W.toolspeed, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user, 40 * W.toolspeed, src))
to_chat(user, span_notice("You secured the girder!"))
reset_girder()
else if(istype(W, /obj/item/pickaxe/plasmacutter))
to_chat(user, span_notice("Now slicing apart the girder..."))
- if(do_after(user,30 * W.toolspeed, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user,30 * W.toolspeed))
if(!src) return
to_chat(user, span_notice("You slice apart the girder!"))
dismantle()
@@ -178,7 +178,7 @@
if(state == 2)
playsound(src, W.usesound, 100, 1)
to_chat(user, span_notice("Now unsecuring support struts..."))
- if(do_after(user,40 * W.toolspeed, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user,40 * W.toolspeed))
if(!src) return
to_chat(user, span_notice("You unsecured the support struts!"))
state = 1
@@ -190,7 +190,7 @@
else if(W.has_tool_quality(TOOL_WIRECUTTER) && state == 1)
playsound(src, W.usesound, 100, 1)
to_chat(user, span_notice("Now removing support struts..."))
- if(do_after(user,40 * W.toolspeed, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user,40 * W.toolspeed))
if(!src) return
to_chat(user, span_notice("You removed the support struts!"))
reinf_material.place_dismantled_product(get_turf(src))
@@ -200,7 +200,7 @@
else if(W.has_tool_quality(TOOL_CROWBAR) && state == 0 && anchored)
playsound(src, W.usesound, 100, 1)
to_chat(user, span_notice("Now dislodging the girder..."))
- if(do_after(user, 40 * W.toolspeed, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user, 40 * W.toolspeed))
if(!src) return
to_chat(user, span_notice("You dislodged the girder!"))
displace()
@@ -251,7 +251,7 @@
to_chat(user, span_notice("You begin adding the plating..."))
- if(!do_after(user,time_to_reinforce, exclusive = TASK_USER_EXCLUSIVE) || !S.use(amount_to_use))
+ if(!do_after(user,time_to_reinforce) || !S.use(amount_to_use))
return TRUE //once we've gotten this far don't call parent attackby()
if(anchored)
@@ -285,7 +285,7 @@
return 0
to_chat(user, span_notice("Now reinforcing..."))
- if (!do_after(user,40, exclusive = TASK_USER_EXCLUSIVE) || !S.use(1))
+ if (!do_after(user,40) || !S.use(1))
return 1 //don't call parent attackby() past this point
to_chat(user, span_notice("You added reinforcement!"))
@@ -351,13 +351,13 @@
if(W.has_tool_quality(TOOL_WRENCH))
playsound(src, W.usesound, 100, 1)
to_chat(user, span_notice("Now disassembling the girder..."))
- if(do_after(user,40 * W.toolspeed, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user,40 * W.toolspeed))
to_chat(user, span_notice("You dissasembled the girder!"))
dismantle()
else if(istype(W, /obj/item/pickaxe/plasmacutter))
to_chat(user, span_notice("Now slicing apart the girder..."))
- if(do_after(user,30 * W.toolspeed, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user,30 * W.toolspeed))
to_chat(user, span_notice("You slice apart the girder!"))
dismantle()
diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm
index f8bcf03e0f..3a974c52f1 100644
--- a/code/game/objects/structures/low_wall.dm
+++ b/code/game/objects/structures/low_wall.dm
@@ -172,7 +172,7 @@
to_chat(user, span_warning("You need at least two rods to do this."))
return
to_chat(user, span_notice("Assembling grille..."))
- if(!do_after(user, 1 SECONDS, R, exclusive = TASK_ALL_EXCLUSIVE))
+ if(!do_after(user, 1 SECONDS, R))
return
if(!R.use(2))
return
@@ -192,7 +192,7 @@
to_chat(user, span_warning("You need at least four sheets of glass to do this."))
return
to_chat(user, span_notice("Assembling window..."))
- if(!do_after(user, 4 SECONDS, G, exclusive = TASK_ALL_EXCLUSIVE))
+ if(!do_after(user, 4 SECONDS, G))
return
if(!G.use(4))
return
diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm
index 67b68f8518..78a12b67a7 100644
--- a/code/game/turfs/simulated/floor_attackby.dm
+++ b/code/game/turfs/simulated/floor_attackby.dm
@@ -153,7 +153,7 @@
user.visible_message(span_warning("[user] begins cutting through [src]."), span_warning("You begin cutting through [src]."))
// This is slow because it's a potentially hostile action to just cut through places into space in the middle of the bar and such
// Presumably also the structural floor is thick?
- if(do_after(user, 10 SECONDS, src, TRUE, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 10 SECONDS, src, TRUE))
if(!can_remove_plating(user))
return // Someone slapped down some flooring or cables or something
do_remove_plating(C, user, base_type)
diff --git a/code/game/turfs/simulated/outdoors/survival_action_vr.dm b/code/game/turfs/simulated/outdoors/survival_action_vr.dm
index 3e527ff13a..0e03fea59d 100644
--- a/code/game/turfs/simulated/outdoors/survival_action_vr.dm
+++ b/code/game/turfs/simulated/outdoors/survival_action_vr.dm
@@ -9,7 +9,7 @@ var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
return ..()
if(icon_state in has_rocks)
user.visible_message("[user] loosens rocks from \the [src]...", "You loosen rocks from \the [src]...")
- if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user, 5 SECONDS))
var/obj/item/stack/material/flint/R = new(get_turf(src), rand(1,4))
R.pixel_x = rand(-6,6)
R.pixel_y = rand(-6,6)
@@ -23,7 +23,7 @@ var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
if(!choice||choice=="No")
return
user.visible_message("[user] starts piling up \the [src]...", "You start piling up \the [src]...")
- if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user, 5 SECONDS))
new /obj/machinery/portable_atmospherics/hydroponics/soil(src)
/turf/simulated/floor/outdoors
@@ -34,7 +34,7 @@ var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
to_chat(user, span_notice("The [name] isn't clear."))
return
user.visible_message("[user] starts digging around in \the [src]...", "You start digging around in \the [src]...")
- if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user, 5 SECONDS))
if(prob(rock_chance))
var/obj/item/stack/material/flint/R = new(get_turf(src), rand(1,4))
to_chat(user, span_notice("You found some [R]"))
@@ -73,7 +73,7 @@ var/static/list/has_rocks = list("dirt5", "dirt6", "dirt7", "dirt8", "dirt9")
/obj/structure/flora/tree/attack_hand(mob/user)
if(sticks)
user.visible_message("[user] searches \the [src] for loose sticks...", "You search \the [src] for loose sticks...")
- if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user, 5 SECONDS))
var/obj/item/stack/material/stick/S = new(get_turf(user), rand(1,3))
S.pixel_x = rand(-6,6)
S.pixel_y = rand(-6,6)
diff --git a/code/modules/admin/tag.dm b/code/modules/admin/tag.dm
index 37a455327d..d253124d38 100644
--- a/code/modules/admin/tag.dm
+++ b/code/modules/admin/tag.dm
@@ -10,7 +10,7 @@
return
LAZYADD(tagged_datums, target_datum)
- RegisterSignal(target_datum, COMSIG_PARENT_QDELETING, PROC_REF(handle_tagged_del), override = TRUE)
+ RegisterSignal(target_datum, COMSIG_QDELETING, PROC_REF(handle_tagged_del), override = TRUE)
to_chat(owner, span_notice("[target_datum] has been tagged."))
/// Get ahead of the curve with deleting
diff --git a/code/modules/admin/view_variables/mark_datum.dm b/code/modules/admin/view_variables/mark_datum.dm
index d519fedc41..4995c7b7b2 100644
--- a/code/modules/admin/view_variables/mark_datum.dm
+++ b/code/modules/admin/view_variables/mark_datum.dm
@@ -2,10 +2,10 @@
if(!holder)
return
if(holder.marked_datum)
- holder.UnregisterSignal(holder.marked_datum, COMSIG_PARENT_QDELETING)
+ holder.UnregisterSignal(holder.marked_datum, COMSIG_QDELETING)
vv_update_display(holder.marked_datum, "marked", "")
holder.marked_datum = D
- holder.RegisterSignal(holder.marked_datum, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/datum/admins, handle_marked_del))
+ holder.RegisterSignal(holder.marked_datum, COMSIG_QDELETING, TYPE_PROC_REF(/datum/admins, handle_marked_del))
vv_update_display(D, "marked", VV_MSG_MARKED)
ADMIN_VERB_ONLY_CONTEXT_MENU(mark_datum, R_HOLDER, "Mark Object", datum/target as mob|obj|turf|area in view())
@@ -13,5 +13,5 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(mark_datum, R_HOLDER, "Mark Object", datum/target a
/datum/admins/proc/handle_marked_del(datum/source)
SIGNAL_HANDLER
- UnregisterSignal(marked_datum, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(marked_datum, COMSIG_QDELETING)
marked_datum = null
diff --git a/code/modules/ai/ai_holder_targeting.dm b/code/modules/ai/ai_holder_targeting.dm
index 6d0bf4c686..db1d8157b2 100644
--- a/code/modules/ai/ai_holder_targeting.dm
+++ b/code/modules/ai/ai_holder_targeting.dm
@@ -86,7 +86,7 @@
target = new_target
- RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(remove_target))
+ RegisterSignal(target, COMSIG_QDELETING, PROC_REF(remove_target))
if(target != null)
lose_target_time = 0
@@ -195,7 +195,7 @@
ai_log("lose_target() : Entering.", AI_LOG_TRACE)
if(target)
ai_log("lose_target() : Had a target, setting to null and LTT.", AI_LOG_DEBUG)
- UnregisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(remove_target))
+ UnregisterSignal(target, COMSIG_QDELETING, PROC_REF(remove_target))
target = null
lose_target_time = world.time
@@ -212,7 +212,7 @@
SIGNAL_HANDLER
ai_log("remove_target() : Entering.", AI_LOG_TRACE)
if(target)
- UnregisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(remove_target))
+ UnregisterSignal(target, COMSIG_QDELETING, PROC_REF(remove_target))
target = null
lose_target_time = 0
diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm
index 79b477e82f..e25469ead3 100644
--- a/code/modules/catalogue/cataloguer.dm
+++ b/code/modules/catalogue/cataloguer.dm
@@ -116,7 +116,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers)
// The delay, and test for if the scan succeeds or not.
var/scan_start_time = world.time
- if(do_after(user, scan_delay, target, ignore_movement = TRUE, max_distance = scan_range))
+ if(do_after(user, scan_delay, target, timed_action_flags = IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE, max_distance = scan_range))
if(target.can_catalogue(user))
to_chat(user, span_notice("You successfully scan \the [target] with \the [src]."))
playsound(src, 'sound/machines/ping.ogg', 50)
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 3d4591f080..859b7d6d0e 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -371,7 +371,7 @@
// Yes this is the same as what's found in qdel(). Yes it does need to be here
// Get off my back
- SEND_SIGNAL(src, COMSIG_PARENT_QDELETING, TRUE)
+ SEND_SIGNAL(src, COMSIG_QDELETING, TRUE)
Destroy() //Clean up signals and timers.
return ..()
diff --git a/code/modules/client/stored_item.dm b/code/modules/client/stored_item.dm
index 6c45950f7a..d38d5d56a5 100644
--- a/code/modules/client/stored_item.dm
+++ b/code/modules/client/stored_item.dm
@@ -96,7 +96,7 @@
busy_bank = FALSE
icon_state = "item_bank"
return
- else if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
+ else if(!do_after(user, 10 SECONDS, src) || inoperable())
busy_bank = FALSE
icon_state = "item_bank"
return
@@ -145,7 +145,7 @@
return
user.visible_message(span_notice("\The [user] begins storing \the [O] in \the [src]."),span_notice("You begin storing \the [O] in \the [src]."))
icon_state = "item_bank_o"
- if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
+ if(!do_after(user, 10 SECONDS, src) || inoperable())
busy_bank = FALSE
icon_state = "item_bank"
return
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index dac44c9d77..228ba5db97 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -345,7 +345,7 @@
if(!failed_to_seal && (M.back == src || M.belt == src) && piece == compare_piece)
- if(seal_delay && !instant && !do_after(M,seal_delay,needhand=0))
+ if(seal_delay && !instant && !do_after(M,seal_delay,timed_action_flags = IGNORE_SLOWDOWNS))
failed_to_seal = 1
piece.icon_state = "[suit_state][!seal_target ? "_sealed" : ""]"
diff --git a/code/modules/entrepreneur/entrepreneur_items.dm b/code/modules/entrepreneur/entrepreneur_items.dm
index 70dd320184..f2dfd654f2 100644
--- a/code/modules/entrepreneur/entrepreneur_items.dm
+++ b/code/modules/entrepreneur/entrepreneur_items.dm
@@ -294,7 +294,7 @@
if(M.nutrition <= 100)
to_chat(user, span_notice("You are too hungry to exercise right now."))
return 0
- if(!do_after(user, 3 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(user, 3 SECONDS, src))
return 0
M.adjust_nutrition(-10)
to_chat(user, span_notice("You successfully perform a [src] exercise!"))
@@ -362,7 +362,7 @@
to_chat(user, span_notice("You need some sort of glass, bottle or cup to contact the spirit world."))
return 0
var/result = 0
- if(!do_after(user, 3 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(user, 3 SECONDS, src))
return 0
if(next_result)
result = next_result
diff --git a/code/modules/eventkit/generic_objects/generic_item.dm b/code/modules/eventkit/generic_objects/generic_item.dm
index cd83e46c0e..f496c35b13 100644
--- a/code/modules/eventkit/generic_objects/generic_item.dm
+++ b/code/modules/eventkit/generic_objects/generic_item.dm
@@ -21,7 +21,7 @@
if(activatable_hand)
if(!on)
if(delay_time)
- if(!do_after(user, delay_time, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(user, delay_time, src))
return 0
on = 1
if(icon_on)
@@ -76,7 +76,7 @@
playsound(src, sound_activated, 50, 1)
else if(togglable)
if(delay_time)
- if(!do_after(user, delay_time, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(user, delay_time, src))
return 0
on = 0
icon_state = icon_state_off
diff --git a/code/modules/eventkit/generic_objects/generic_structure.dm b/code/modules/eventkit/generic_objects/generic_structure.dm
index 02d3fa75be..123793c864 100644
--- a/code/modules/eventkit/generic_objects/generic_structure.dm
+++ b/code/modules/eventkit/generic_objects/generic_structure.dm
@@ -25,7 +25,7 @@
if(activatable_hand)
if(!on)
if(delay_time)
- if(!do_after(user, delay_time, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(user, delay_time, src))
return 0
on = 1
icon_state = icon_state_on
@@ -88,7 +88,7 @@
playsound(src, sound_activated, 50, 1)
else if(togglable)
if(delay_time)
- if(!do_after(user, delay_time, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(user, delay_time, src))
return 0
on = 0
icon_state = icon_state_off
diff --git a/code/modules/food/drinkingglass/extras.dm b/code/modules/food/drinkingglass/extras.dm
index 1b9832a9e8..3a913af7c4 100644
--- a/code/modules/food/drinkingglass/extras.dm
+++ b/code/modules/food/drinkingglass/extras.dm
@@ -96,7 +96,7 @@
return
user.visible_message(span_infoplain(span_bold("[user]") + " starts sipping on [victim] with [src]!"), span_info("You start sipping on [victim] with [src]."))
- if(!do_after(user, 3 SECONDS, victim, exclusive = TASK_ALL_EXCLUSIVE))
+ if(!do_after(user, 3 SECONDS, victim))
return
user.visible_message(span_infoplain(span_bold("[user]") + " sips some of [victim] with [src]!"), span_info("You take a sip of [victim] with [src]. Yum!"))
diff --git a/code/modules/food/food/superfoods.dm b/code/modules/food/food/superfoods.dm
index d9025aa5bc..cc4b9fb761 100644
--- a/code/modules/food/food/superfoods.dm
+++ b/code/modules/food/food/superfoods.dm
@@ -310,7 +310,7 @@
/obj/structure/theonepizza/attackby(var/obj/item/W, var/mob/living/user)
if(istype(W,/obj/item/material/knife))
user.visible_message(span_infoplain(span_bold("\The [user]") + " starts to slowly cut through The One Pizza."), span_notice("You start to slowly cut through The One Pizza."))
- if(do_after(user, slicetime, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user, slicetime))
if(!src)
return // We got disappeared already
user.visible_message(span_infoplain(span_bold("\The [user]") + " successfully cuts The One Pizza."), span_notice("You successfully cut The One Pizza."))
diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm
index 731d8ff75d..d3e719951c 100644
--- a/code/modules/hydroponics/trays/tray_soil.dm
+++ b/code/modules/hydroponics/trays/tray_soil.dm
@@ -16,7 +16,7 @@
if(!choice||choice=="No")
return
user.visible_message("[user] starts dispersing the [src]...", runemessage = "disperses the [src]")
- if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(user, 5 SECONDS))
qdel(src)
else
to_chat(user, span_notice("There is something growing here."))
diff --git a/code/modules/lootpanel/contents.dm b/code/modules/lootpanel/contents.dm
index 7121910354..c59431ae3d 100644
--- a/code/modules/lootpanel/contents.dm
+++ b/code/modules/lootpanel/contents.dm
@@ -1,6 +1,6 @@
/// Adds the item to contents and to_image (if needed)
/datum/lootpanel/proc/add_to_index(datum/search_object/index)
- RegisterSignal(index, COMSIG_PARENT_QDELETING, PROC_REF(on_searchable_deleted))
+ RegisterSignal(index, COMSIG_QDELETING, PROC_REF(on_searchable_deleted))
if(isnull(index.icon))
to_image += index
@@ -50,5 +50,5 @@
if(QDELETED(index))
continue
- UnregisterSignal(index, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(index, COMSIG_QDELETING)
qdel(index)
diff --git a/code/modules/lootpanel/search_object.dm b/code/modules/lootpanel/search_object.dm
index 60249f12f0..d442268804 100644
--- a/code/modules/lootpanel/search_object.dm
+++ b/code/modules/lootpanel/search_object.dm
@@ -32,7 +32,7 @@
RegisterSignals(item, list(
COMSIG_ITEM_PICKUP,
COMSIG_MOVABLE_MOVED,
- COMSIG_PARENT_QDELETING,
+ COMSIG_QDELETING,
), PROC_REF(on_item_moved))
// Icon generation conditions //////////////
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 3d9e38da41..1497c85559 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -135,7 +135,11 @@
// It is in a seperate place to avoid an infinite loop situation with dragging mobs dragging each other.
// Also its nice to have these things seperated.
-/mob/living/carbon/human/proc/calculate_item_encumbrance()
+//Return FALSE for no encumberance
+/mob/proc/calculate_item_encumbrance()
+ return FALSE
+
+/mob/living/carbon/human/calculate_item_encumbrance()
/// We check for all the items the wearer has that cause slowdown (positive or negative)
/// We then multiply the postive ones by our species.item_slowdown_mod to slow us down more, while we leave negative ones untouched.
/// Heavy things in your hands are affected by this change, UNLESS the thing in your hand speeds you up, in which case it doesn't.
diff --git a/code/modules/mob/living/carbon/human/human_powers_vr.dm b/code/modules/mob/living/carbon/human/human_powers_vr.dm
index ca37a328e8..c10ed8a6d6 100644
--- a/code/modules/mob/living/carbon/human/human_powers_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_powers_vr.dm
@@ -176,7 +176,7 @@
var/score2 = (scale2 * strength2)
var/competition = pick(score1;player1, score2;player2)
- if(!do_after(player1, 50, player2, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(player1, 50, player2))
player2.visible_message(span_notice("The players cancelled their competition!"))
return 0
if(!hand_games_check(player1,player2))
@@ -223,7 +223,7 @@
var/score2 = (scale2 * strength2)
var/competition = pick(score1;player1, score2;player2)
- if(!do_after(player1, 10, player2, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(player1, 10, player2))
player2.visible_message(span_notice("The players cancelled their competition!"))
return 0
if(!hand_games_check(player1,player2))
@@ -248,7 +248,7 @@
if(!hand_games_check(player1,player2))
return
player1.visible_message(span_notice("[player1] challenges [player2] to a thumb war!"))
- if(!do_after(player1, 50, player2, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(player1, 50, player2))
player2.visible_message(span_notice("The players cancelled their thumb war!"))
return 0
if(!hand_games_check(player1,player2))
diff --git a/code/modules/mob/living/carbon/human/human_resist.dm b/code/modules/mob/living/carbon/human/human_resist.dm
index 153a5d39ca..4b3bc3964f 100644
--- a/code/modules/mob/living/carbon/human/human_resist.dm
+++ b/code/modules/mob/living/carbon/human/human_resist.dm
@@ -51,7 +51,7 @@
span_warning("You gnaw on \the [SJ]. (This will take around [round(breakouttime / 600)] minutes and you need to stand still.)")
)
- if(do_after(src, breakouttime, incapacitation_flags = INCAPACITATION_DISABLED & INCAPACITATION_KNOCKDOWN))
+ if(do_after(src, breakouttime, timed_action_flags = IGNORE_INCAPACITATED))
if(!wear_suit)
return
visible_message(
@@ -74,7 +74,7 @@
span_warning("You attempt to rip your [wear_suit.name] apart. (This will take around 5 seconds and you need to stand still)")
)
- if(do_after(src, 20 SECONDS, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED)) // Same scaling as breaking cuffs, 5 seconds to 120 seconds, 20 seconds to 480 seconds.
+ if(do_after(src, 20 SECONDS, timed_action_flags = IGNORE_INCAPACITATED)) // Same scaling as breaking cuffs, 5 seconds to 120 seconds, 20 seconds to 480 seconds.
if(!wear_suit || buckled)
return
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm
index 4efc311cd3..37bafb7071 100644
--- a/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm
@@ -145,7 +145,7 @@
return
else
visible_message(span_infoplain(span_bold("\The [src]") + " begins to change the form of \the [I]."))
- if(!do_after(src, 10 SECONDS, I, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(src, 10 SECONDS, I))
visible_message(span_infoplain(span_bold("\The [src]") + " leaves \the [I] in its original form."))
return 0
visible_message(span_infoplain(span_bold("\The [src]") + " transmutes \the [I] into \the [transmute_product.name]."))
@@ -185,7 +185,7 @@
if(species.lleill_energy < energy_cost_spawn)
to_chat(src, span_warning("You do not have enough energy to do that!"))
return
- if(!do_after(src, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(src, 10 SECONDS, src))
src.visible_message(span_infoplain(span_bold("\The [src]") + " begins to form white rings on the ground."))
return 0
to_chat(src, span_warning("You place a new glamour ring at your feet."))
@@ -315,7 +315,7 @@
src.visible_message(span_infoplain(span_bold("\The [src]") + " boops [chosen_target] on the nose."))
if(contact_type == "Custom")
src.visible_message(span_infoplain("[custom_text]"))
- if(!do_after(src, 10 SECONDS, chosen_target, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(src, 10 SECONDS, chosen_target))
src.visible_message(span_infoplain(span_bold("\The [src]") + " and \the [chosen_target] break contact before energy has been transferred."))
return
src.visible_message(span_infoplain(span_bold("\The [src]") + " and \the [chosen_target] complete their contact."))
@@ -366,7 +366,7 @@
return
else
visible_message(span_infoplain(span_bold("\The [src]") + " begins to change the form of \the [I]."))
- if(!do_after(src, 10 SECONDS, I, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(src, 10 SECONDS, I))
visible_message(span_infoplain(span_bold("\The [src]") + " leaves \the [I] in its original form."))
return 0
visible_message(span_infoplain(span_bold("\The [src]") + " transmutes \the [I] into \the [transmute_product.name]."))
@@ -457,7 +457,7 @@
return
visible_message(span_infoplain(span_bold("\The [src]") + " begins significantly shifting their form."))
- if(!do_after(src, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(src, 10 SECONDS, src))
visible_message(span_infoplain(span_bold("\The [src]") + " ceases shifting their form."))
return 0
@@ -548,7 +548,7 @@
return
visible_message(span_infoplain(span_bold("\The [src]") + " begins significantly shifting their form."))
- if(!do_after(src, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(src, 10 SECONDS, src))
visible_message(span_infoplain(span_bold("\The [src]") + " ceases shifting their form."))
return 0
visible_message(span_infoplain(span_bold("\The [src]") + " has reverted to their original form."))
@@ -666,7 +666,7 @@
return
visible_message(span_infoplain(span_bold("\The [src]") + " begins significantly shifting their form."))
- if(!do_after(src, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(src, 10 SECONDS, src))
visible_message(span_infoplain(span_bold("\The [src]") + " ceases shifting their form."))
return 0
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm
index 1cca104c57..f67e39b9b4 100644
--- a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm
@@ -255,7 +255,7 @@
if(m_action == "Yes")
to_chat(M, span_warning("You begin to break the lines of the glamour ring."))
- if(!do_after(M, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(M, 10 SECONDS, src))
to_chat(M, span_warning("You leave the glamour ring alone."))
return
to_chat(M, span_warning("You have destroyed \the [src]."))
@@ -270,7 +270,7 @@
if(LL.ring_cooldown + 10 MINUTES > world.time)
to_chat(M, span_warning("You must wait a while before drawing energy from the glamour again."))
return
- if(!do_after(M, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(M, 10 SECONDS, src))
to_chat(M, span_warning("You stop drawing energy."))
return
LL.lleill_energy = min((LL.lleill_energy + 75),LL.lleill_energy_max)
diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
index 0aa4afa791..176db45c6a 100644
--- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
+++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
@@ -595,7 +595,7 @@ var/list/wrapped_species_by_ref = list()
oocnotes = 1
to_chat(character, span_notify("You begin to reform. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform."))
- if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(character, 40))
if(character.client.prefs) //Make sure we didn't d/c
character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE, FALSE)
character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed."))
@@ -653,7 +653,7 @@ var/list/wrapped_species_by_ref = list()
to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still."))
character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim]."))
- if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(character, 40))
checking = FALSE
for(var/obj/item/grab/G in character)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
diff --git a/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm
index f1f7585fc8..d7ef90bcca 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean/protean_blob.dm
@@ -440,7 +440,7 @@
to_chat(src,span_warning("You can't change forms while inside something."))
return
to_chat(src, span_notice("You rapidly disassociate your form."))
- if(force || do_after(src,20,exclusive = TASK_ALL_EXCLUSIVE))
+ if(force || do_after(src,20))
handle_grasp() //It's possible to blob out before some key parts of the life loop. This results in things getting dropped at null. TODO: Fix the code so this can be done better.
remove_micros(src, src) //Living things don't fare well in roblobs.
if(buckled)
@@ -554,7 +554,7 @@
to_chat(blob,span_warning("You can't change forms while inside something."))
return
to_chat(src, span_notice("You rapidly reassemble your form."))
- if(force || do_after(blob,20,exclusive = TASK_ALL_EXCLUSIVE))
+ if(force || do_after(blob,20))
if(buckled)
buckled.unbuckle_mob()
if(LAZYLEN(buckled_mobs))
diff --git a/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm
index 0d6fb24013..5e34d9ae96 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm
@@ -53,7 +53,7 @@
else
blob = temporary_form
active_regen = 1
- if(do_after(blob,50,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(blob,50))
var/list/limblist = species.has_limbs[choice]
var/limbpath = limblist["path"]
var/obj/item/organ/external/new_eo = new limbpath(src)
@@ -106,7 +106,7 @@
var/obj/item/organ/internal/nano/refactory/refactory = nano_get_refactory()
if(refactory.get_stored_material(MAT_STEEL) >= 10000)
to_chat(protie, span_notify("You begin to rebuild. You will need to remain still."))
- if(do_after(protie, 400,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(protie, 400))
if(species?:OurRig) //Unsafe, but we should only ever be using this with a Protean
species?:OurRig?:make_alive(src,1) //Re-using this proc
refactory.use_stored_material(MAT_STEEL,refactory.get_stored_material(MAT_STEEL)) //Use all of our steel
@@ -129,7 +129,7 @@
oocnotes = 1
to_chat(protie, span_notify("You begin to reassemble. You will need to remain still."))
protie.visible_message(span_notify("[protie] rapidly contorts and shifts!"), span_danger("You begin to reassemble."))
- if(do_after(protie, 40,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(protie, 40))
if(protie.client.prefs) //Make sure we didn't d/c
var/obj/item/rig/protean/Rig = species?:OurRig
protie.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, TRUE, FALSE)
@@ -191,7 +191,7 @@
to_chat(protie, span_notify("You begin to reassemble into [victim]. You will need to remain still."))
protie.visible_message(span_notify("[protie] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim]."))
- if(do_after(protie, 40,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(protie, 40))
checking = FALSE
for(var/obj/item/grab/G in protie)
if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE)
@@ -327,7 +327,7 @@
to_chat(protie, span_warning("You need to be repaired first before you can act!"))
return
to_chat(protie, span_notice("You rapidly condense into your module."))
- if(forced || do_after(protie,20,exclusive = TASK_ALL_EXCLUSIVE))
+ if(forced || do_after(protie,20))
if(!temporary_form) //If you're human, force you into blob form before rig'ing
nano_blobform(forced)
spawn(2)
@@ -700,7 +700,7 @@
return
if(G.loc == protie && G.state >= GRAB_AGGRESSIVE)
protie.visible_message(span_warning("[protie] is attempting to latch onto [target]!"), span_danger("You attempt to latch onto [target]!"))
- if(do_after(protie, 50, target,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(protie, 50, target))
if(G.loc == protie && G.state >= GRAB_AGGRESSIVE)
target.drop_from_inventory(target.back)
protie.visible_message(span_danger("[protie] latched onto [target]!"), span_danger("You latch yourself onto [target]!"))
diff --git a/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm b/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm
index d12b2eb05d..0c09393cbe 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean/protean_rig.dm
@@ -250,13 +250,13 @@
if(1)
if(W.has_tool_quality(TOOL_SCREWDRIVER))
playsound(src, W.usesound, 50, 1)
- if(do_after(user,50,src,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user,50,src))
to_chat(user, span_notice("You unscrew the maintenace panel on the [src]."))
dead +=1
return
if(2)
if(istype(W, /obj/item/protean_reboot))//placeholder
- if(do_after(user,50,src,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user,50,src))
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
to_chat(user, span_notice("You carefully slot [W] in the [src]."))
dead +=1
@@ -264,7 +264,7 @@
return
if(3)
if(istype(W, /obj/item/stack/nanopaste))
- if(do_after(user,50,src,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user,50,src))
playsound(src, 'sound/effects/ointment.ogg', 50, 1)
to_chat(user, span_notice("You slather the interior confines of the [src] with the [W]."))
dead +=1
@@ -274,7 +274,7 @@
if(istype(W, /obj/item/shockpaddles))
if(W?:can_use(user))
to_chat(user, span_notice("You hook up the [W] to the contact points in the maintenance assembly"))
- if(do_after(user,50,src,exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user,50,src))
playsound(src, 'sound/machines/defib_charge.ogg', 50, 0)
if(do_after(user,10,src))
playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1)
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm
index febf1716f9..7760b4441c 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities.dm
@@ -634,7 +634,7 @@
to_chat(src, span_warning("You can't do that in your current state."))
return
- if(do_after(src, 25, exclusive = TASK_USER_EXCLUSIVE))
+ if(do_after(src, 25))
var/obj/item/storage/vore_egg/bugcocoon/C = new(loc)
forceMove(C)
diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm
index 102540207c..6f39910694 100644
--- a/code/modules/mob/living/carbon/resist.dm
+++ b/code/modules/mob/living/carbon/resist.dm
@@ -45,7 +45,7 @@
visible_message(span_danger("[src] is trying to break [I]!"),
span_warning("You attempt to break your [I]. (This will take around 5 seconds and you need to stand still)"))
- if(do_after(src, 5 SECONDS, target = src, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED))
+ if(do_after(src, 5 SECONDS, target = src, timed_action_flags = IGNORE_INCAPACITATED))
if(!I || buckled)
return
visible_message(span_danger("[src] manages to break [I]!"),
@@ -69,7 +69,7 @@
visible_message(span_danger("[src] attempts to remove [I]!"),
span_warning("You attempt to remove [I]. (This will take around [displaytime] seconds and you need to stand still)"))
- if(do_after(src, breakouttime, target = src, incapacitation_flags = INCAPACITATION_DISABLED & INCAPACITATION_KNOCKDOWN))
+ if(do_after(src, breakouttime, target = src, timed_action_flags = IGNORE_INCAPACITATED))
visible_message(span_danger("[src] manages to remove [I]!"),
span_notice("You successfully remove [I]."))
drop_from_inventory(I)
@@ -87,7 +87,7 @@
span_warning("You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)")
)
- if(do_after(src, 2 MINUTES, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY)))
+ if(do_after(src, 2 MINUTES, timed_action_flags = IGNORE_INCAPACITATED))
if(!buckled)
return
visible_message(span_danger("[src] manages to unbuckle themself!"),
diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm
index bf5d66746c..5e4cdc08ae 100644
--- a/code/modules/mob/living/living_powers.dm
+++ b/code/modules/mob/living/living_powers.dm
@@ -117,7 +117,7 @@
return
visible_message(span_warning("[src] begins chargin' their lazor!"))
- if(!do_after(src, 5 SECONDS, chosen_target, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(src, 5 SECONDS, chosen_target))
return
if(chosen_target.z != src.z || get_dist(src,chosen_target) > 7)
return
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 15d3dce7db..a1b8e0e774 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -847,7 +847,7 @@
if(bolt)
if(!bolt.malfunction)
visible_message(span_danger("[src] is trying to break their [bolt]!"), span_warning("You attempt to break your [bolt]. (This will take around 90 seconds and you need to stand still)"))
- if(do_after(src, 1.5 MINUTES, src, incapacitation_flags = INCAPACITATION_DISABLED))
+ if(do_after(src, 1.5 MINUTES, src, timed_action_flags = IGNORE_INCAPACITATED))
visible_message(span_danger("[src] manages to break \the [bolt]!"), span_warning("You successfully break your [bolt]."))
bolt.malfunction = MALFUNCTION_PERMANENT
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm
index cf4c23a292..8574603a60 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm
@@ -266,7 +266,7 @@
to_chat(src, span_notice("You begin to eat \the [E]..."))
- if(!do_after(src, 20 SECONDS, E, exclusive = TRUE))
+ if(!do_after(src, 20 SECONDS, E))
return
to_chat(src, span_notice("[msg]"))
if(nut || aff)
@@ -332,7 +332,7 @@
to_chat(src, span_warning("You decide not to transition."))
return
to_chat(src, span_notice("You begin to transition down to \the [our_dest], stay still..."))
- if(!do_after(src, 15 SECONDS, exclusive = TRUE))
+ if(!do_after(src, 15 SECONDS))
to_chat(src, span_warning("You were interrupted."))
return
visible_message(span_warning("\The [src] disappears!!!"))
@@ -343,7 +343,7 @@
else
to_chat(src, span_notice("You begin to transition back to space, stay still..."))
- if(!do_after(src, 15 SECONDS, exclusive = TRUE))
+ if(!do_after(src, 15 SECONDS))
to_chat(src, span_warning("You were interrupted."))
return
@@ -1060,7 +1060,7 @@
to_chat(user, span_warning("You can see \the [controller] inside! Tendrils of nerves seem to have attached themselves to \the [controller]! There's no room for you right now!"))
return
user.visible_message(span_notice("\The [user] reaches out to touch \the [src]..."),span_notice("You reach out to touch \the [src]..."))
- if(!do_after(user, 10 SECONDS, src, exclusive = TRUE))
+ if(!do_after(user, 10 SECONDS, src))
user.visible_message(span_warning("\The [user] pulls back from \the [src]."),span_warning("You pull back from \the [src]."))
return
if(controller) //got busy while you were waiting, get rekt
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
index 7acfe1e220..fb752ff87b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
@@ -562,7 +562,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
return ..()
if(resting)
user.visible_message(span_attack("\The [user] approaches \the [src]'s neck with \the [O]."),span_attack("You approach \the [src]'s neck with \the [O]."))
- if(do_after(user, 5 SECONDS, exclusive = TASK_USER_EXCLUSIVE, target = src))
+ if(do_after(user, 5 SECONDS, target = src))
if(resting)
death()
return
@@ -747,7 +747,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
sheartime *= 2
else
return FALSE
- if(do_after(user, sheartime, exclusive = TASK_USER_EXCLUSIVE, target = src))
+ if(do_after(user, sheartime, target = src))
user.visible_message(span_notice("\The [user] shears \the [src] with \the [tool]."),span_notice("You shear \the [src] with \the [tool]."))
amount_grown = rand(0,250)
var/obj/item/stack/material/fur/F = new(get_turf(user), rand(10,15))
diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm
index 62d0770f1d..8db916f2f2 100644
--- a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm
@@ -464,7 +464,7 @@
return
visible_message("\The [src] begins significantly shifting their form.")
- if(!do_after(src, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(src, 10 SECONDS, src))
visible_message("\The [src] ceases shifting their form.")
return 0
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
index 3e98f41d5d..a19ad3d882 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
@@ -51,8 +51,8 @@
/mob/living/dominated_brain/proc/lets_register_our_signals()
if(prey_body)
- RegisterSignal(prey_body, COMSIG_PARENT_QDELETING, PROC_REF(prey_was_deleted), TRUE)
- RegisterSignal(pred_body, COMSIG_PARENT_QDELETING, PROC_REF(pred_was_deleted), TRUE)
+ RegisterSignal(prey_body, COMSIG_QDELETING, PROC_REF(prey_was_deleted), TRUE)
+ RegisterSignal(pred_body, COMSIG_QDELETING, PROC_REF(pred_was_deleted), TRUE)
/mob/living/dominated_brain/proc/lets_unregister_our_signals()
prey_was_deleted()
@@ -61,13 +61,13 @@
/mob/living/dominated_brain/proc/prey_was_deleted()
SIGNAL_HANDLER
if(prey_body)
- UnregisterSignal(prey_body, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(prey_body, COMSIG_QDELETING)
prey_body = null
/mob/living/dominated_brain/proc/pred_was_deleted()
SIGNAL_HANDLER
if(pred_body)
- UnregisterSignal(pred_body, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(pred_body, COMSIG_QDELETING)
pred_body = null
/mob/living/dominated_brain/Destroy()
@@ -86,7 +86,7 @@
to_chat(src, span_danger("You begin to resist \the [prey_name]'s control!!!"))
to_chat(pred_body, span_danger("You feel the captive mind of [src] begin to resist your control."))
- if(do_after(src, 10 SECONDS, exclusive = TRUE))
+ if(do_after(src, 10 SECONDS))
restore_control()
else
to_chat(src, span_notice("Your attempt to regain control has been interrupted..."))
@@ -243,7 +243,7 @@
to_chat(pred, span_warning("You can feel the will of another overwriting your own, control of your body being sapped away from you..."))
to_chat(prey, span_warning("You can feel the will of your host diminishing as you exert your will over them!"))
- if(!do_after(prey, 10 SECONDS, exclusive = TRUE))
+ if(!do_after(prey, 10 SECONDS))
to_chat(prey, span_notice("Your attempt to regain control has been interrupted..."))
to_chat(pred, span_notice("The dominant sensation fades away..."))
return
@@ -338,7 +338,7 @@
to_chat(src, span_danger("You begin to resist \the [prey_name]'s control!!!"))
to_chat(pred_body, span_danger("You feel the captive mind of [src] begin to resist your control."))
- if(do_after(src, 10 SECONDS, exclusive = TRUE))
+ if(do_after(src, 10 SECONDS))
restore_control()
else
to_chat(src, span_notice("Your attempt to regain control has been interrupted..."))
@@ -394,7 +394,7 @@
if(istype(G) && M == G.affecting)
src.visible_message(span_danger("[src] seems to be doing something to [M], resulting in [M]'s body looking increasingly drowsy with every passing moment!"))
- if(!do_after(src, 10 SECONDS, exclusive = TRUE))
+ if(!do_after(src, 10 SECONDS))
to_chat(M, span_notice("The alien presence fades, and you are left along in your body..."))
to_chat(src, span_notice("Your attempt to gather [M]'s mind has been interrupted."))
return
@@ -445,7 +445,7 @@
if(prey_body && prey_body.loc.loc == pred_body)
to_chat(src, span_notice("You exert your will and attempt to return to yout body!!!"))
to_chat(pred_body, span_warning("\The [src] resists your hold and attempts to return to their body!"))
- if(do_after(src, 10 SECONDS, exclusive = TRUE))
+ if(do_after(src, 10 SECONDS))
if(prey_body && prey_body.loc.loc == pred_body)
prey_body.ckey = prey_ckey
@@ -512,7 +512,7 @@
return
to_chat(pred, span_warning("You diminish your will, reducing it and allowing will of your prey to take over..."))
to_chat(prey, span_warning("You can feel the will of your host diminishing as you are given control over them!"))
- if(!do_after(pred, 10 SECONDS, exclusive = TRUE))
+ if(!do_after(pred, 10 SECONDS))
to_chat(pred, span_notice("Your attempt to share control has been interrupted..."))
to_chat(prey, span_notice("The dominant sensation fades away..."))
return
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm b/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm
index eea9b74fb5..4953e27074 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm
@@ -251,7 +251,7 @@
return ..()
if(M.a_intent == I_HELP)
M.visible_message("[M] pets [src].", runemessage = "pets [src]")
- if(do_after(M, 30 SECONDS, exclusive = TASK_USER_EXCLUSIVE, target = src))
+ if(do_after(M, 30 SECONDS, target = src))
faction = M.faction
revive()
sight = initial(sight)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index c48ccd8752..cddac46e88 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -232,7 +232,11 @@
var/in_enclosed_vehicle = 0 //For mechs and fighters ambiance. Can be used in other cases.
- var/list/progressbars = null //VOREStation Edit
+ ///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, key = string, value = amount of interactions of that type happening.
+ var/list/do_afters
var/datum/focus //What receives our keyboard inputs. src by default
/// dict of custom stat tabs with data
diff --git a/code/modules/overmap/ships/ship_vr.dm b/code/modules/overmap/ships/ship_vr.dm
index 0d41c4aec4..213faf4e34 100644
--- a/code/modules/overmap/ships/ship_vr.dm
+++ b/code/modules/overmap/ships/ship_vr.dm
@@ -19,7 +19,7 @@
var/obj/belly/bellychoice = tgui_input_list(L, "Which belly?","Select A Belly", L.vore_organs)
if(bellychoice)
L.visible_message(span_warning("[L] is trying to stuff \the [src] into [L.gender == MALE ? "his" : L.gender == FEMALE ? "her" : "their"] [bellychoice]!"),span_notice("You begin putting \the [src] into your [bellychoice]!"))
- if(do_after(L, 5 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(L, 5 SECONDS, src))
forceMove(bellychoice)
SSskybox.rebuild_skyboxes(map_z)
L.visible_message(span_warning("[L] eats a spaceship! This is totally normal."),"You eat the the spaceship! Yum, metal.")
diff --git a/code/modules/projectiles/guns/launcher/bows.dm b/code/modules/projectiles/guns/launcher/bows.dm
index 63a8387bb3..648214c2c6 100644
--- a/code/modules/projectiles/guns/launcher/bows.dm
+++ b/code/modules/projectiles/guns/launcher/bows.dm
@@ -95,7 +95,7 @@
current_user = user
user.visible_message(span_infoplain(span_bold("[user]") + " begins to draw back the string of [src]."),span_notice("You begin to draw back the string of [src]."))
- if(do_after(user, 25, src, exclusive = TASK_ALL_EXCLUSIVE))
+ if(do_after(user, 25, src))
drawn = TRUE
user.visible_message(span_infoplain(span_bold("[user]") + "draws the string on [src] back fully!"), span_infoplain("You draw the string on [src] back fully!"))
update_icon()
diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm
index 948bdab560..4270a786eb 100644
--- a/code/modules/tooltip/tooltip.dm
+++ b/code/modules/tooltip/tooltip.dm
@@ -54,9 +54,9 @@ Notes:
return FALSE
if (!isnull(last_target))
- UnregisterSignal(last_target, COMSIG_PARENT_QDELETING)
+ UnregisterSignal(last_target, COMSIG_QDELETING)
- RegisterSignal(thing, COMSIG_PARENT_QDELETING, PROC_REF(on_target_qdel))
+ RegisterSignal(thing, COMSIG_QDELETING, PROC_REF(on_target_qdel))
last_target = thing
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 56239200d7..1d2f24a8a4 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -1275,7 +1275,7 @@
to_chat(R, escape_attempt_prey_message)
to_chat(owner, escape_attempt_owner_message)
- if(do_after(R, escapetime, owner, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED))
+ if(do_after(R, escapetime, owner, timed_action_flags = IGNORE_INCAPACITATED))
if((owner.stat || escapable)) //Can still escape?
if(C)
release_specific_contents(C)
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 7461ed0ca8..833a458fe0 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -928,7 +928,7 @@
playsound(src, 'sound/items/eatfood.ogg', rand(10,50), 1)
var/T = (istype(M) ? M.hardness/40 : 1) SECONDS //1.5 seconds to eat a sheet of metal. 2.5 for durasteel and diamond & 1 by default (applies to some ores like raw carbon, slag, etc.
to_chat(src, span_notice("You start crunching on [I] with your powerful jaws, attempting to tear it apart..."))
- if(do_after(feeder, T, ignore_movement = TRUE, exclusive = TASK_ALL_EXCLUSIVE)) //Eat on the move, but not multiple things at once.
+ if(do_after(feeder, T, timed_action_flags = IGNORE_USER_LOC_CHANGE)) //Eat on the move, but not multiple things at once.
if(feeder != src)
to_chat(feeder, span_notice("You feed [I] to [src]."))
log_admin("VORE: [feeder] fed [src] [I].")
diff --git a/code/modules/vore/eating/silicon_vr.dm b/code/modules/vore/eating/silicon_vr.dm
index 06dc9c2e0f..5b3174ff44 100644
--- a/code/modules/vore/eating/silicon_vr.dm
+++ b/code/modules/vore/eating/silicon_vr.dm
@@ -56,7 +56,7 @@
hologram.visible_message("[hologram] starts engulfing [prey] in hardlight holograms!")
to_chat(src, span_vnotice("You begin engulfing [prey] in hardlight holograms.")) //Can't be part of the above, because the above is from the hologram.
- if(do_after(user = eyeobj,delay = 50,target = prey, needhand = 0) && holo && hologram) //Didn't move and still projecting and effect exists and no other bellied people
+ if(do_after(user = eyeobj,delay = 50,target = prey) && holo && hologram) //Didn't move and still projecting and effect exists and no other bellied people
feed_grabbed_to_self(src, prey)
/mob/living/AIShiftClick(var/mob/user) //Shift-click as AI overridden on mobs to examine.
diff --git a/code/modules/vore/eating/vore_procs.dm b/code/modules/vore/eating/vore_procs.dm
index bf6fdab893..23977a4f07 100644
--- a/code/modules/vore/eating/vore_procs.dm
+++ b/code/modules/vore/eating/vore_procs.dm
@@ -57,7 +57,7 @@
//Timer and progress bar
if(!user.client && prey.weakened > 0) // stop crwaling instantly break swallow attempt for mobvore
prey.Stun(min(prey.weakened, 2)) // stop crawling instantly break swallow attempt for mobvore
- if(!do_after(user, swallow_time, prey, exclusive = TASK_USER_EXCLUSIVE))
+ if(!do_after(user, swallow_time, prey, hidden = TRUE))
return FALSE // Prey escaped (or user disabled) before timer expired.
// If we got this far, nom successful! Announce it and move the prey!
diff --git a/icons/effects/progressbar.dmi b/icons/effects/progressbar.dmi
index 99284060aa..3eed14db70 100644
Binary files a/icons/effects/progressbar.dmi and b/icons/effects/progressbar.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 3d341ffed9..df78a8bf6b 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -76,6 +76,7 @@
#include "code\__defines\database.dm"
#include "code\__defines\diseases.dm"
#include "code\__defines\dna.dm"
+#include "code\__defines\do_afters.dm"
#include "code\__defines\economy_misc.dm"
#include "code\__defines\equipment_vendor.dm"
#include "code\__defines\events.dm"
@@ -498,6 +499,7 @@
#include "code\datums\category.dm"
#include "code\datums\chat_message.dm"
#include "code\datums\chat_payload.dm"
+#include "code\datums\cogbar.dm"
#include "code\datums\colormate.dm"
#include "code\datums\datacore.dm"
#include "code\datums\datum.dm"