diff --git a/code/datums/observation/move.dm b/code/datums/observation/move.dm index a8800c1bc44..d9888246d67 100644 --- a/code/datums/observation/move.dm +++ b/code/datums/observation/move.dm @@ -1,19 +1,33 @@ +/datum/observ/moved/New(var/atom/movable/event_holder) + if(!istype(event_holder)) + CRASH("Improper event holder type: '[event_holder]'/[event_holder.type]") + ..() + +/datum/observ/moved/register(var/datum/procOwner, var/proc_call) + . = ..() + var/atom/movable/child = event_holder + if(.) + var/atom/movable/parent = child.loc + while(istype(parent) && parent.moved && !parent.moved.is_listening(child)) + parent.moved.register(child, /atom/movable/proc/recursive_move) + child = parent + parent = child.loc /*********************** * Movement Handling * ***********************/ /atom/movable - var/datum/observ/moved + var/datum/observ/moved/moved /atom/movable/Move() var/old_loc = loc if(..() && moved) moved.raise_event(list(src, old_loc, loc)) -/atom/movable/init_observers() +/atom/movable/init_observers(var/event_holder) . = ..() if(.) - moved = new() + moved = new(event_holder) /atom/movable/destroy_observers() . = ..() @@ -32,14 +46,14 @@ /atom/Entered(var/atom/movable/am, atom/old_loc) ..() if(am.moved) - am.moved.raise_event(list(am, old_loc, src.loc)) + am.moved.raise_event(list(am, old_loc, am.loc)) /atom/movable/Entered(var/atom/movable/am, atom/old_loc) ..() - if(src.moved) + if(src.moved && am.moved && am.moved.has_listeners() && !src.moved.is_listening(am)) src.moved.register(am, /atom/movable/proc/recursive_move) /atom/movable/Exited(var/atom/movable/am, atom/old_loc) ..() - if(src.moved) + if(src.moved && src.moved.is_listening(am, /atom/movable/proc/recursive_move)) src.moved.unregister(am) diff --git a/code/datums/observation/observation.dm b/code/datums/observation/observation.dm index eefbcb1fc22..742e367b5a9 100644 --- a/code/datums/observation/observation.dm +++ b/code/datums/observation/observation.dm @@ -1,26 +1,40 @@ /datum/observ + var/event_holder var/list/listeners +/datum/observ/New(var/event_holder) + src.event_holder = event_holder + ..() + /datum/observ/Destroy() + event_holder = null if(listeners) for(var/listener in listeners) unregister(listener) listeners.Cut() return ..() +/datum/observ/proc/is_listening(var/datum/procOwner, var/proc_call) + return listeners && (procOwner in listeners) && (!proc_call || listeners[procOwner] == proc_call) + +/datum/observ/proc/has_listeners() + return listeners && listeners.len + /datum/observ/proc/register(var/datum/procOwner, var/proc_call) if(!(procOwner && procOwner.destruction)) - return + return FALSE if(!listeners) listeners = list() listeners[procOwner] = proc_call procOwner.destruction.register(src, /datum/observ/proc/unregister) + return TRUE /datum/observ/proc/unregister(var/datum/procOwner) if(!(listeners && procOwner && procOwner.destruction)) - return + return FALSE listeners -= procOwner procOwner.destruction.unregister(src) + return TRUE /datum/observ/proc/raise_event(var/list/args = list()) if(!listeners) @@ -35,15 +49,15 @@ var/datum/observ/destruction /datum/New() - init_observers() + init_observers(src) ..() /datum/Destroy() destroy_observers() return ..() -/datum/proc/init_observers() - destruction = new() +/datum/proc/init_observers(var/event_holder) + destruction = new(event_holder) return TRUE /datum/proc/destroy_observers() diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index c6ee578dcee..310d5f3f101 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -501,7 +501,7 @@ remove_from_storage(I, T) /obj/item/weapon/storage/New() - + ..() if(allow_quick_empty) verbs += /obj/item/weapon/storage/verb/quick_empty else @@ -559,7 +559,6 @@ src.closer.icon_state = "x" src.closer.layer = 20 orient2hud() - return /obj/item/weapon/storage/emp_act(severity) if(!istype(src.loc, /mob/living)) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 07004f97546..c07647a57b7 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -2,12 +2,11 @@ /obj/item/device/mmi/digital/New() src.brainmob = new(src) + src.brainmob.stat = CONSCIOUS src.brainmob.add_language("Robot Talk") - src.brainmob.loc = src src.brainmob.container = src - src.brainmob.stat = 0 src.brainmob.silent = 0 - dead_mob_list -= src.brainmob + ..() /obj/item/device/mmi/digital/transfer_identity(var/mob/living/carbon/H) brainmob.dna = H.dna