Files
Bubberstation/code/datums/components/keep_me_secure.dm
SkyratBot c529b754fb [MIRROR] Fixes a bunch of callbacks that were being qdeleted, and code cleanup [MDB IGNORE] (#23319)
* Fixes a bunch of callbacks that were being qdeleted, and code cleanup (#77904)

## About The Pull Request

![image](https://github.com/tgstation/tgstation/assets/13398309/559eb50a-461c-4220-b628-55412baaffc3)

Continuing the work of
https://github.com/tgstation/tgstation/pull/77850.

it started with finding one that was being missed and causing a
runtime...then I noticed a whole lot more. While I was doing this I
found callbacks that weren't being nulled in `Destroy()`, so I added
that wherever I found these spots as well as some general code cleanup.

There were a lot more of these than I initially hoped to encounter so
I'm labeling it as a refactor.

## Why It's Good For The Game

Fixes lots of runtimes, improves code resiliency.

## Changelog

🆑
refactor: fixed a bunch of instances of callbacks being qdeleted and
cleaned up related code
/🆑

* Fixes a bunch of callbacks that were being qdeleted, and code cleanup

---------

Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
2023-08-25 19:06:07 -04:00

82 lines
2.8 KiB
Plaintext

/**
* ### Keep Me Secure component!
*
* Component that attaches to items, invoking a function to react when left unmoved and unsecured for too long.
* Used for Nuclear Authentication Disks, and whiny plushy as an example (which changes sprites depending on whether it considers itself secure.)
*/
/datum/component/keep_me_secure
/// callback for the parent being secure
var/datum/callback/secured_callback
/// callback for the parent being unsecured
var/datum/callback/unsecured_callback
/// The last secure location the parent was at.
var/turf/last_secured_location
/// The last world time the parent moved.
var/last_move
/datum/component/keep_me_secure/Initialize(secured_callback, unsecured_callback)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
src.secured_callback = secured_callback
src.unsecured_callback = unsecured_callback
/datum/component/keep_me_secure/Destroy(force, silent)
secured_callback = null
unsecured_callback = null
return ..()
/datum/component/keep_me_secure/RegisterWithParent()
last_move = world.time
if (secured_callback || unsecured_callback)
START_PROCESSING(SSobj, src)
RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(on_examine_more))
/datum/component/keep_me_secure/UnregisterFromParent()
STOP_PROCESSING(SSobj, src)
UnregisterSignal(parent, COMSIG_ATOM_EXAMINE)
/// Returns whether the game is supposed to consider the parent "secure".
/datum/component/keep_me_secure/proc/is_secured()
var/obj/item/item_parent = parent
if (last_secured_location == get_turf(item_parent))
return FALSE
var/mob/holder = item_parent.pulledby || get(parent, /mob)
if (isnull(holder?.client))
return FALSE
return TRUE
/datum/component/keep_me_secure/process(seconds_per_tick)
if(is_secured())
last_secured_location = get_turf(parent)
last_move = world.time
if(secured_callback)
secured_callback.Invoke(last_move)
else
if(unsecured_callback)
unsecured_callback.Invoke(last_move)
/// signal sent when parent is examined
/datum/component/keep_me_secure/proc/on_examine(mob/living/source, mob/examiner, list/examine_list)
SIGNAL_HANDLER
examine_list += span_boldnotice("[parent] should be secured at all times.")
if(is_secured())
examine_list += span_notice("Right now, it is.")
else
examine_list += span_warning("Right now, it isn't...")
examine_list += span_notice("Examine closer for more info.")
/// signal sent when parent is examined more
/datum/component/keep_me_secure/proc/on_examine_more(mob/living/source, mob/examiner, list/examine_list)
SIGNAL_HANDLER
examine_list += span_notice("For [parent] to be secure, it needs to be:")
examine_list += span_notice("1. Always on the move, and...")
examine_list += span_notice("2. Held or dragged by someone.")