From 259edee5a27e04a721771d04d2c56cd780aefe4b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 21 Aug 2017 18:49:14 -0500 Subject: [PATCH] Update component.dm --- code/datums/components/component.dm | 45 +++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm index 67d58d36e6..92ac9a4767 100644 --- a/code/datums/components/component.dm +++ b/code/datums/components/component.dm @@ -1,22 +1,35 @@ /datum/component var/enabled = TRUE var/dupe_mode = COMPONENT_DUPE_HIGHLANDER + var/dupe_type var/list/signal_procs var/datum/parent /datum/component/New(datum/P, ...) + parent = P + var/list/arguments = args.Copy() + arguments.Cut(1, 2) + Initialize(arglist(arguments)) + var/dm = dupe_mode if(dm != COMPONENT_DUPE_ALLOWED) - var/datum/component/old = P.GetExactComponent(type) - if(old) - switch(dm) - if(COMPONENT_DUPE_HIGHLANDER) - InheritComponent(old, FALSE) - qdel(old) - if(COMPONENT_DUPE_UNIQUE) - old.InheritComponent(src, TRUE) - qdel(src) - return + var/dt = dupe_type + var/datum/component/old + if(!dt) + old = P.GetExactComponent(type) + else + old = P.GetComponent(dt) + switch(dm) + if(COMPONENT_DUPE_UNIQUE) + old.InheritComponent(src, TRUE) + parent = null //prevent COMPONENT_REMOVING signal + qdel(src) + return + if(COMPONENT_DUPE_HIGHLANDER) + InheritComponent(old, FALSE) + qdel(old) + + //let the others know P.SendSignal(COMSIG_COMPONENT_ADDED, src) //lazy init the parent's dc list @@ -50,7 +63,8 @@ else //only component of this type, no list dc[I] = src - parent = P +/datum/component/proc/Initialize(...) + return /datum/component/Destroy() enabled = FALSE @@ -106,6 +120,7 @@ /datum/component/proc/InheritComponent(datum/component/C, i_am_original) return + /datum/component/proc/OnTransfer(datum/new_parent) return @@ -116,7 +131,7 @@ . = list(current_type) while (current_type != /datum/component) current_type = type2parent(current_type) -. += current_type + . += current_type /datum/proc/SendSignal(sigtype, ...) var/list/comps = datum_components @@ -128,6 +143,7 @@ var/datum/component/C = target if(C.enabled && C.ReceiveSignal(arglist(args))) ComponentActivated(C) + C.AfterComponentActivated() return TRUE else for(var/I in target) @@ -175,6 +191,11 @@ var/datum/component/C = new nt(arglist(args)) return QDELING(C) ? GetComponent(new_type) : C +/datum/proc/LoadComponent(component_type, ...) + . = GetComponent(component_type) + if(!.) + return AddComponent(arglist(args)) + /datum/proc/TakeComponent(datum/component/C) if(!C) return