From e866ec6b5a37ca6e0e9b38174f98ede558853ed2 Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Sun, 12 Aug 2018 16:48:01 -0400 Subject: [PATCH 1/2] Make the signal redirect component a bit more transfer proof (#39612) The turf change signal needed to get moved properly in transfer. It also needed to have code to deal with the creator wanting to listen to the turf change signal. --- code/datums/components/signal_redirect.dm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/datums/components/signal_redirect.dm b/code/datums/components/signal_redirect.dm index 170774c53b3c..7f2935694b9a 100644 --- a/code/datums/components/signal_redirect.dm +++ b/code/datums/components/signal_redirect.dm @@ -4,13 +4,20 @@ /datum/component/redirect dupe_mode = COMPONENT_DUPE_ALLOWED var/list/signals + var/datum/callback/turfchangeCB /datum/component/redirect/Initialize(list/_signals, flags=NONE) //It's not our job to verify the right signals are registered here, just do it. if(!LAZYLEN(_signals)) return COMPONENT_INCOMPATIBLE if(flags & REDIRECT_TRANSFER_WITH_TURF && isturf(parent)) - RegisterSignal(parent, COMSIG_TURF_CHANGE, .proc/turf_change) + // If they also want to listen to the turf change then we need to set it up so both callbacks run + if(_signals[COMSIG_TURF_CHANGE]) + turfchangeCB = _signals[COMSIG_TURF_CHANGE] + if(!istype(turfchangeCB)) + . = COMPONENT_INCOMPATIBLE + CRASH("Redirect components must be given instanced callbacks, not proc paths.") + _signals[COMSIG_TURF_CHANGE] = CALLBACK(src, .proc/turf_change) signals = _signals @@ -23,3 +30,4 @@ /datum/component/redirect/proc/turf_change(path, new_baseturfs, flags, list/transfers) transfers += src + return turfchangeCB?.InvokeAsync(arglist(args))