diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 5e36abac15..e8ab7899db 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -532,7 +532,7 @@ // /datum/component/storage signals #define COMSIG_CONTAINS_STORAGE "is_storage" //() - returns bool. #define COMSIG_TRY_STORAGE_INSERT "storage_try_insert" //(obj/item/inserting, mob/user, silent, force) - returns bool -#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force) - returns bool. +#define COMSIG_TRY_STORAGE_SHOW "storage_show_to" //(mob/show_to, force, trigger_on_found) - returns bool. #define COMSIG_TRY_STORAGE_HIDE_FROM "storage_hide_from" //(mob/hide_from) - returns bool #define COMSIG_TRY_STORAGE_HIDE_ALL "storage_hide_all" //returns bool #define COMSIG_TRY_STORAGE_SET_LOCKSTATE "storage_lock_set_state" //(newstate) diff --git a/code/datums/components/storage/concrete/rped.dm b/code/datums/components/storage/concrete/rped.dm index 8014cf17c2..3744e833ac 100644 --- a/code/datums/components/storage/concrete/rped.dm +++ b/code/datums/components/storage/concrete/rped.dm @@ -37,7 +37,7 @@ to_chat(M, "You start dumping out tier/cell rating [lowest_rating] parts from [parent].") var/turf/T = get_turf(A) var/datum/progressbar/progress = new(M, length(things), T) - while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress))) + while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) stoplag(1) qdel(progress) A.do_squish(0.8, 1.2) @@ -81,7 +81,7 @@ to_chat(M, "You start dumping out tier/cell rating [lowest_rating] parts from [parent].") var/turf/T = get_turf(A) var/datum/progressbar/progress = new(M, length(things), T) - while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress))) + while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) stoplag(1) qdel(progress) A.do_squish(0.8, 1.2) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 7968caed54..cf0b3d6920 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -271,20 +271,20 @@ var/turf/T = get_turf(A) var/list/things = contents() var/datum/progressbar/progress = new(M, length(things), T) - while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress))) + while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, .proc/mass_remove_from_storage, T, things, progress, TRUE, M))) stoplag(1) qdel(progress) A.do_squish(0.8, 1.2) -/datum/component/storage/proc/mass_remove_from_storage(atom/target, list/things, datum/progressbar/progress, trigger_on_found = TRUE) +/datum/component/storage/proc/mass_remove_from_storage(atom/target, list/things, datum/progressbar/progress, trigger_on_found = TRUE, mob/user) var/atom/real_location = real_location() for(var/obj/item/I in things) things -= I if(I.loc != real_location) continue - remove_from_storage(I, target) - if(trigger_on_found && I.on_found()) + if(trigger_on_found && user && (user.active_storage != src) && I.on_found(user)) return FALSE + remove_from_storage(I, target) if(TICK_CHECK) progress.update(progress.goal - length(things)) return TRUE @@ -429,7 +429,7 @@ return FALSE // this must come before the screen objects only block, dunno why it wasn't before if(over_object == M) - user_show_to_mob(M) + user_show_to_mob(M, trigger_on_found = TRUE) return if(isrevenant(M)) RevenantThrow(over_object, M, source) @@ -448,15 +448,28 @@ return A.add_fingerprint(M) -/datum/component/storage/proc/user_show_to_mob(mob/M, force = FALSE) +/datum/component/storage/proc/user_show_to_mob(mob/M, force = FALSE, trigger_on_found = FALSE) var/atom/A = parent if(!istype(M)) return FALSE A.add_fingerprint(M) if(!force && (check_locked(null, M) || !M.CanReach(parent, view_only = TRUE))) return FALSE + if(trigger_on_found) + if(check_on_found(M)) + return ui_show(M) +/** + * Check if we should trigger on_found() + * If this returns TRUE, it means an on_found() returned TRUE and immediately broke the chain. + * In most contexts, this should mean to stop. + */ +/datum/component/storage/proc/check_on_found(mob/user) + for(var/obj/item/I in contents()) + if(I.on_found(user)) + return TRUE + /datum/component/storage/proc/mousedrop_receive(datum/source, atom/movable/O, mob/M) if(isitem(O)) var/obj/item/I = O @@ -579,8 +592,8 @@ /datum/component/storage/proc/show_to_ghost(datum/source, mob/dead/observer/M) return user_show_to_mob(M, TRUE) -/datum/component/storage/proc/signal_show_attempt(datum/source, mob/showto, force = FALSE) - return user_show_to_mob(showto, force) +/datum/component/storage/proc/signal_show_attempt(datum/source, mob/showto, force = FALSE, trigger_on_found = TRUE) + return user_show_to_mob(showto, force, trigger_on_found = trigger_on_found) /datum/component/storage/proc/on_check() return TRUE @@ -649,7 +662,7 @@ if(A.loc == user) . = COMPONENT_NO_ATTACK_HAND if(!check_locked(source, user, TRUE)) - ui_show(user) + user_show_to_mob(user, trigger_on_found = TRUE) A.do_jiggle() /datum/component/storage/proc/signal_on_pickup(datum/source, mob/user) @@ -679,7 +692,7 @@ var/atom/A = parent if(!quickdraw) A.add_fingerprint(user) - user_show_to_mob(user) + user_show_to_mob(user, trigger_on_found = TRUE) if(rustle_sound) playsound(A, "rustle", 50, 1, -5) return TRUE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 3009831da7..7752dfb8d5 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -800,6 +800,8 @@ var/list/things = src_object.contents() var/datum/progressbar/progress = new(user, things.len, src) var/datum/component/storage/STR = GetComponent(/datum/component/storage) + if(STR == src_object) + return while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress))) stoplag(1) qdel(progress) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 93735f1079..fa566c5225 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -386,7 +386,7 @@ GLOBAL_LIST_EMPTY(station_turfs) var/list/things = src_object.contents() var/datum/progressbar/progress = new(user, things.len, src) - while (do_after(usr, 1 SECONDS, TRUE, src, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress))) + while (do_after(usr, 1 SECONDS, TRUE, src, FALSE, CALLBACK(src_object, /datum/component/storage.proc/mass_remove_from_storage, src, things, progress, TRUE, user))) stoplag(1) qdel(progress)