mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-25 13:09:11 +01:00
Refactors do_after w/ TG's do_after (#18282)
* part1 * keeps range ability * no cog vore
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
+82
-57
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
+139
-50
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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!"))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" : ""]"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!"))
|
||||
|
||||
@@ -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."))
|
||||
|
||||
@@ -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."))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 //////////////
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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]!"))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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!"),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -464,7 +464,7 @@
|
||||
return
|
||||
|
||||
visible_message("<b>\The [src]</b> 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("<b>\The [src]</b> ceases shifting their form.")
|
||||
return 0
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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].")
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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!
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 571 B After Width: | Height: | Size: 1.2 KiB |
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user