mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
Refactors component signals registration (#38798)
Datums know what signals are being listened for and components can now be registered to listen for signals on more than one object.
This commit is contained in:
committed by
yogstation13-bot
parent
f09d822004
commit
3e52d953af
@@ -1,6 +1,6 @@
|
|||||||
#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.datum_components ? NONE : target._SendSignal(sigtype, list(##arguments)) )
|
#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(##arguments)) )
|
||||||
|
|
||||||
#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( !SSdcs.comp_lookup[sigtype] ? NONE : SSdcs._SendGlobalSignal(sigtype, list(##arguments)) )
|
#define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) )
|
||||||
|
|
||||||
//shorthand
|
//shorthand
|
||||||
#define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path)
|
#define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path)
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
// global signals
|
// global signals
|
||||||
// These are signals which can be listened to by any component on any parent
|
// These are signals which can be listened to by any component on any parent
|
||||||
// GLOBAL SIGNALS MUST START WITH "!"
|
// start global signals with "!", this used to be necessary but now it's just a formatting choice
|
||||||
#define COMSIG_GLOB_NEW_Z "!new_z" //from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
|
#define COMSIG_GLOB_NEW_Z "!new_z" //from base of datum/controller/subsystem/mapping/proc/add_new_zlevel(): (list/args)
|
||||||
#define COMSIG_GLOB_VAR_EDIT "!var_edit" //called after a successful var edit somewhere in the world: (list/args)
|
#define COMSIG_GLOB_VAR_EDIT "!var_edit" //called after a successful var edit somewhere in the world: (list/args)
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params)
|
#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params)
|
||||||
#define COMPONENT_NO_ATTACK 1
|
#define COMPONENT_NO_ATTACK 1
|
||||||
#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot)
|
#define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot)
|
||||||
#define COMSIG_ITEM_DROPPED "item_drop"
|
#define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user)
|
||||||
#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker)
|
#define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker)
|
||||||
#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
|
#define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" //from base of mob/living/carbon/attacked_by(): (mob/living/carbon/target, mob/living/user, hit_zone)
|
||||||
#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
|
#define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user)
|
||||||
|
|||||||
@@ -2,34 +2,5 @@ SUBSYSTEM_DEF(dcs)
|
|||||||
name = "Datum Component System"
|
name = "Datum Component System"
|
||||||
flags = SS_NO_INIT | SS_NO_FIRE
|
flags = SS_NO_INIT | SS_NO_FIRE
|
||||||
|
|
||||||
var/list/comp_lookup = list() // A signal:list(components) assoc list
|
|
||||||
|
|
||||||
/datum/controller/subsystem/dcs/proc/_SendGlobalSignal(sigtype, list/arguments)
|
|
||||||
. = NONE
|
|
||||||
for(var/i in comp_lookup[sigtype])
|
|
||||||
var/datum/component/comp = i
|
|
||||||
if(!comp.enabled)
|
|
||||||
continue
|
|
||||||
var/datum/callback/CB = comp.signal_procs[sigtype]
|
|
||||||
if(!CB)
|
|
||||||
continue // Should we error from this?
|
|
||||||
. |= CB.InvokeAsync(arglist(arguments))
|
|
||||||
|
|
||||||
/datum/controller/subsystem/dcs/proc/RegisterSignal(datum/component/comp, sigtype)
|
|
||||||
if(!comp_lookup[sigtype])
|
|
||||||
comp_lookup[sigtype] = list()
|
|
||||||
|
|
||||||
comp_lookup[sigtype][comp] = TRUE
|
|
||||||
|
|
||||||
/datum/controller/subsystem/dcs/proc/UnregisterSignal(datum/component/comp, list/sigtypes)
|
|
||||||
if(!length(sigtypes))
|
|
||||||
sigtypes = list(sigtypes)
|
|
||||||
for(var/sigtype in sigtypes)
|
|
||||||
switch(length(comp_lookup[sigtype]))
|
|
||||||
if(1)
|
|
||||||
comp_lookup -= sigtype
|
|
||||||
if(2 to INFINITY)
|
|
||||||
comp_lookup[sigtype] -= comp
|
|
||||||
|
|
||||||
/datum/controller/subsystem/dcs/Recover()
|
/datum/controller/subsystem/dcs/Recover()
|
||||||
comp_lookup = SSdcs.comp_lookup
|
comp_lookup = SSdcs.comp_lookup
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ Stands have a lot of procs which mimic mob procs. Rather than inserting hooks fo
|
|||||||
* Clears `parent` and removes the component from it's component list
|
* Clears `parent` and removes the component from it's component list
|
||||||
1. `/datum/component/proc/_JoinParent` (private, final)
|
1. `/datum/component/proc/_JoinParent` (private, final)
|
||||||
* Tries to add the component to it's `parent`s `datum_components` list
|
* Tries to add the component to it's `parent`s `datum_components` list
|
||||||
1. `/datum/component/proc/RegisterSignal(signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final) (Consider removing for performance gainz)
|
1. `/datum/component/proc/RegisterSignal(datum/target, signal(string/list of strings), proc_ref(type), override(boolean))` (protected, final)
|
||||||
* If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments
|
* If signal is a list it will be as if RegisterSignal was called for each of the entries with the same following arguments
|
||||||
* Makes a component listen for the specified `signal` on it's `parent` datum.
|
* Makes a component listen for the specified `signal` on it's `parent` datum.
|
||||||
* When that signal is received `proc_ref` will be called on the component, along with associated arguments
|
* When that signal is received `proc_ref` will be called on the component, along with associated arguments
|
||||||
|
|||||||
@@ -58,8 +58,8 @@
|
|||||||
if(!silent)
|
if(!silent)
|
||||||
SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src)
|
SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src)
|
||||||
parent = null
|
parent = null
|
||||||
SSdcs.UnregisterSignal(src, signal_procs)
|
for(var/target in signal_procs)
|
||||||
LAZYCLEARLIST(signal_procs)
|
UnregisterSignal(target, signal_procs[target])
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/datum/component/proc/_RemoveFromParent()
|
/datum/component/proc/_RemoveFromParent()
|
||||||
@@ -78,34 +78,69 @@
|
|||||||
if(!dc.len)
|
if(!dc.len)
|
||||||
P.datum_components = null
|
P.datum_components = null
|
||||||
|
|
||||||
/datum/component/proc/RegisterSignal(sig_type_or_types, proc_or_callback, override = FALSE)
|
/datum/component/proc/RegisterSignal(datum/target, sig_type_or_types, proc_or_callback, override = FALSE)
|
||||||
if(QDELETED(src))
|
if(QDELETED(src) || QDELETED(target))
|
||||||
return
|
return
|
||||||
|
|
||||||
var/list/procs = signal_procs
|
var/list/procs = signal_procs
|
||||||
if(!procs)
|
if(!procs)
|
||||||
procs = list()
|
signal_procs = procs = list()
|
||||||
signal_procs = procs
|
if(!procs[target])
|
||||||
|
procs[target] = list()
|
||||||
|
var/list/lookup = target.comp_lookup
|
||||||
|
if(!lookup)
|
||||||
|
target.comp_lookup = lookup = list()
|
||||||
|
|
||||||
if(!istype(proc_or_callback, /datum/callback)) //if it wasnt a callback before, it is now
|
if(!istype(proc_or_callback, /datum/callback)) //if it wasnt a callback before, it is now
|
||||||
proc_or_callback = CALLBACK(src, proc_or_callback)
|
proc_or_callback = CALLBACK(src, proc_or_callback)
|
||||||
|
|
||||||
var/list/sig_types = islist(sig_type_or_types) ? sig_type_or_types : list(sig_type_or_types)
|
var/list/sig_types = islist(sig_type_or_types) ? sig_type_or_types : list(sig_type_or_types)
|
||||||
for(var/sig_type in sig_types)
|
for(var/sig_type in sig_types)
|
||||||
if(!override && procs[sig_type])
|
if(!override && procs[target][sig_type])
|
||||||
stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning")
|
stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning")
|
||||||
|
|
||||||
if(sig_type[1] == "!")
|
procs[target][sig_type] = proc_or_callback
|
||||||
SSdcs.RegisterSignal(src, sig_type)
|
|
||||||
|
|
||||||
procs[sig_type] = proc_or_callback
|
if(!lookup[sig_type]) // Nothing has registered here yet
|
||||||
|
lookup[sig_type] = src
|
||||||
|
else if(lookup[sig_type] == src) // We already registered here
|
||||||
|
continue
|
||||||
|
else if(!length(lookup[sig_type])) // One other thing registered here
|
||||||
|
lookup[sig_type] = list(lookup[sig_type]=TRUE)
|
||||||
|
lookup[sig_type][src] = TRUE
|
||||||
|
else // Many other things have registered here
|
||||||
|
lookup[sig_type][src] = TRUE
|
||||||
|
|
||||||
enabled = TRUE
|
enabled = TRUE
|
||||||
|
|
||||||
/datum/component/proc/HasSignal(sig_type)
|
/datum/component/proc/UnregisterSignal(datum/target, sig_type_or_types)
|
||||||
return signal_procs[sig_type] != null
|
var/list/lookup = target.comp_lookup
|
||||||
|
if(!signal_procs || !signal_procs[target] || !lookup)
|
||||||
|
return
|
||||||
|
if(!islist(sig_type_or_types))
|
||||||
|
sig_type_or_types = list(sig_type_or_types)
|
||||||
|
for(var/sig in sig_type_or_types)
|
||||||
|
switch(length(lookup[sig]))
|
||||||
|
if(2)
|
||||||
|
lookup[sig] = (lookup[sig]-src)[1]
|
||||||
|
if(1)
|
||||||
|
stack_trace("[target] ([target.type]) somehow has single length list inside comp_lookup")
|
||||||
|
if(src in lookup[sig])
|
||||||
|
lookup -= sig
|
||||||
|
if(!length(lookup))
|
||||||
|
target.comp_lookup = null
|
||||||
|
break
|
||||||
|
if(0)
|
||||||
|
lookup -= sig
|
||||||
|
if(!length(lookup))
|
||||||
|
target.comp_lookup = null
|
||||||
|
break
|
||||||
|
else
|
||||||
|
lookup[sig] -= src
|
||||||
|
|
||||||
/datum/component/proc/UnregisterSignal(sig_type_or_types)
|
signal_procs[target] -= sig_type_or_types
|
||||||
signal_procs -= sig_type_or_types
|
if(!signal_procs[target].len)
|
||||||
|
signal_procs -= target
|
||||||
|
|
||||||
/datum/component/proc/InheritComponent(datum/component/C, i_am_original)
|
/datum/component/proc/InheritComponent(datum/component/C, i_am_original)
|
||||||
return
|
return
|
||||||
@@ -126,23 +161,19 @@
|
|||||||
. += current_type
|
. += current_type
|
||||||
|
|
||||||
/datum/proc/_SendSignal(sigtype, list/arguments)
|
/datum/proc/_SendSignal(sigtype, list/arguments)
|
||||||
var/target = datum_components[/datum/component]
|
var/target = comp_lookup[sigtype]
|
||||||
if(!length(target))
|
if(!length(target))
|
||||||
var/datum/component/C = target
|
var/datum/component/C = target
|
||||||
if(!C.enabled)
|
if(!C.enabled)
|
||||||
return NONE
|
return NONE
|
||||||
var/datum/callback/CB = C.signal_procs[sigtype]
|
var/datum/callback/CB = C.signal_procs[src][sigtype]
|
||||||
if(!CB)
|
|
||||||
return NONE
|
|
||||||
return CB.InvokeAsync(arglist(arguments))
|
return CB.InvokeAsync(arglist(arguments))
|
||||||
. = NONE
|
. = NONE
|
||||||
for(var/I in target)
|
for(var/I in target)
|
||||||
var/datum/component/C = I
|
var/datum/component/C = I
|
||||||
if(!C.enabled)
|
if(!C.enabled)
|
||||||
continue
|
continue
|
||||||
var/datum/callback/CB = C.signal_procs[sigtype]
|
var/datum/callback/CB = C.signal_procs[src][sigtype]
|
||||||
if(!CB)
|
|
||||||
continue
|
|
||||||
. |= CB.InvokeAsync(arglist(arguments))
|
. |= CB.InvokeAsync(arglist(arguments))
|
||||||
|
|
||||||
/datum/proc/GetComponent(c_type)
|
/datum/proc/GetComponent(c_type)
|
||||||
|
|||||||
@@ -15,9 +15,9 @@
|
|||||||
archdrops[i][ARCH_PROB] = 100
|
archdrops[i][ARCH_PROB] = 100
|
||||||
stack_trace("ARCHAEOLOGY WARNING: [parent] contained a null probability value in [i].")
|
stack_trace("ARCHAEOLOGY WARNING: [parent] contained a null probability value in [i].")
|
||||||
callback = _callback
|
callback = _callback
|
||||||
RegisterSignal(COMSIG_PARENT_ATTACKBY,.proc/Dig)
|
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY,.proc/Dig)
|
||||||
RegisterSignal(COMSIG_ATOM_EX_ACT, .proc/BombDig)
|
RegisterSignal(parent, COMSIG_ATOM_EX_ACT, .proc/BombDig)
|
||||||
RegisterSignal(COMSIG_ATOM_SING_PULL, .proc/SingDig)
|
RegisterSignal(parent, COMSIG_ATOM_SING_PULL, .proc/SingDig)
|
||||||
|
|
||||||
/datum/component/archaeology/InheritComponent(datum/component/archaeology/A, i_am_original)
|
/datum/component/archaeology/InheritComponent(datum/component/archaeology/A, i_am_original)
|
||||||
var/list/other_archdrops = A.archdrops
|
var/list/other_archdrops = A.archdrops
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
if(!isobj(parent))
|
if(!isobj(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
|
|
||||||
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine)
|
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
|
||||||
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/applyplate)
|
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/applyplate)
|
||||||
RegisterSignal(COMSIG_PARENT_PREQDELETED, .proc/dropplates)
|
RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, .proc/dropplates)
|
||||||
|
|
||||||
if(_maxamount)
|
if(_maxamount)
|
||||||
maxamount = _maxamount
|
maxamount = _maxamount
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
if(!ismovableatom(parent))
|
if(!ismovableatom(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
beauty = beautyamount
|
beauty = beautyamount
|
||||||
RegisterSignal(COMSIG_ENTER_AREA, .proc/enter_area)
|
RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/enter_area)
|
||||||
RegisterSignal(COMSIG_EXIT_AREA, .proc/exit_area)
|
RegisterSignal(parent, COMSIG_EXIT_AREA, .proc/exit_area)
|
||||||
var/area/A = get_area(parent)
|
var/area/A = get_area(parent)
|
||||||
if(!A || A.outdoors)
|
if(!A || A.outdoors)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
probability = _probability
|
probability = _probability
|
||||||
flags = _flags
|
flags = _flags
|
||||||
|
|
||||||
RegisterSignal(list(COMSIG_MOVABLE_CROSSED), .proc/Crossed)
|
RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED), .proc/Crossed)
|
||||||
|
|
||||||
/datum/component/caltrop/proc/Crossed(atom/movable/AM)
|
/datum/component/caltrop/proc/Crossed(atom/movable/AM)
|
||||||
var/atom/A = parent
|
var/atom/A = parent
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
))
|
))
|
||||||
|
|
||||||
/datum/component/chasm/Initialize(turf/target)
|
/datum/component/chasm/Initialize(turf/target)
|
||||||
RegisterSignal(list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Entered)
|
RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Entered)
|
||||||
target_turf = target
|
target_turf = target
|
||||||
START_PROCESSING(SSobj, src) // process on create, in case stuff is still there
|
START_PROCESSING(SSobj, src) // process on create, in case stuff is still there
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
/datum/component/cleaning/Initialize()
|
/datum/component/cleaning/Initialize()
|
||||||
if(!ismovableatom(parent))
|
if(!ismovableatom(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
RegisterSignal(list(COMSIG_MOVABLE_MOVED), .proc/Clean)
|
RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Clean)
|
||||||
|
|
||||||
/datum/component/cleaning/proc/Clean()
|
/datum/component/cleaning/proc/Clean()
|
||||||
var/atom/movable/AM = parent
|
var/atom/movable/AM = parent
|
||||||
|
|||||||
@@ -15,8 +15,8 @@
|
|||||||
if(!isatom(parent))
|
if(!isatom(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
|
|
||||||
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine)
|
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
|
||||||
RegisterSignal(COMSIG_PARENT_ATTACKBY,.proc/action)
|
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY,.proc/action)
|
||||||
update_parent(index)
|
update_parent(index)
|
||||||
|
|
||||||
/datum/component/construction/proc/examine(mob/user)
|
/datum/component/construction/proc/examine(mob/user)
|
||||||
|
|||||||
@@ -12,11 +12,11 @@
|
|||||||
cleanable = _cleanable
|
cleanable = _cleanable
|
||||||
|
|
||||||
if(_dir) // If no dir is assigned at start then it follows the atom's dir
|
if(_dir) // If no dir is assigned at start then it follows the atom's dir
|
||||||
RegisterSignal(COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react)
|
RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/rotate_react)
|
||||||
if(_cleanable)
|
if(_cleanable)
|
||||||
RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
|
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
|
||||||
if(_description)
|
if(_description)
|
||||||
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine)
|
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
|
||||||
apply()
|
apply()
|
||||||
|
|
||||||
/datum/component/decal/Destroy()
|
/datum/component/decal/Destroy()
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
if(!isitem(parent))
|
if(!isitem(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
. = ..()
|
. = ..()
|
||||||
RegisterSignal(COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name)
|
RegisterSignal(parent, COMSIG_ATOM_GET_EXAMINE_NAME, .proc/get_examine_name)
|
||||||
|
|
||||||
/datum/component/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color)
|
/datum/component/decal/blood/generate_appearance(_icon, _icon_state, _dir, _layer, _color)
|
||||||
var/obj/item/I = parent
|
var/obj/item/I = parent
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
/datum/component/earhealing/Initialize()
|
/datum/component/earhealing/Initialize()
|
||||||
if(!isitem(parent))
|
if(!isitem(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
RegisterSignal(list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), .proc/equippedChanged)
|
RegisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), .proc/equippedChanged)
|
||||||
|
|
||||||
/datum/component/earhealing/proc/equippedChanged(mob/living/carbon/user, slot)
|
/datum/component/earhealing/proc/equippedChanged(mob/living/carbon/user, slot)
|
||||||
if (slot == SLOT_EARS && istype(user))
|
if (slot == SLOT_EARS && istype(user))
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
)
|
)
|
||||||
say_lines = text || default_lines
|
say_lines = text || default_lines
|
||||||
|
|
||||||
RegisterSignal(COMSIG_GLOB_VAR_EDIT, .proc/var_edit_react)
|
RegisterSignal(SSdcs, COMSIG_GLOB_VAR_EDIT, .proc/var_edit_react)
|
||||||
|
|
||||||
/datum/component/edit_complainer/proc/var_edit_react(list/arguments)
|
/datum/component/edit_complainer/proc/var_edit_react(list/arguments)
|
||||||
var/atom/movable/master = parent
|
var/atom/movable/master = parent
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
if(!istype(parent, /atom))
|
if(!istype(parent, /atom))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
flags = _flags
|
flags = _flags
|
||||||
RegisterSignal(list(COMSIG_ATOM_EMP_ACT), .proc/getEmpFlags)
|
RegisterSignal(parent, list(COMSIG_ATOM_EMP_ACT), .proc/getEmpFlags)
|
||||||
|
|
||||||
/datum/component/empprotection/proc/getEmpFlags(severity)
|
/datum/component/empprotection/proc/getEmpFlags(severity)
|
||||||
return flags
|
return flags
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
blood_DNA = new_blood_DNA
|
blood_DNA = new_blood_DNA
|
||||||
fibers = new_fibers
|
fibers = new_fibers
|
||||||
check_blood()
|
check_blood()
|
||||||
RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_act)
|
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_act)
|
||||||
|
|
||||||
/datum/component/forensics/proc/wipe_fingerprints()
|
/datum/component/forensics/proc/wipe_fingerprints()
|
||||||
fingerprints = null
|
fingerprints = null
|
||||||
|
|||||||
@@ -12,15 +12,15 @@
|
|||||||
if(expire_in)
|
if(expire_in)
|
||||||
expire_time = world.time + expire_in
|
expire_time = world.time + expire_in
|
||||||
QDEL_IN(src, expire_in)
|
QDEL_IN(src, expire_in)
|
||||||
RegisterSignal(COMSIG_MOVABLE_BUCKLE, .proc/try_infect_buckle)
|
RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/try_infect_buckle)
|
||||||
RegisterSignal(COMSIG_MOVABLE_COLLIDE, .proc/try_infect_collide)
|
RegisterSignal(parent, COMSIG_MOVABLE_COLLIDE, .proc/try_infect_collide)
|
||||||
RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/try_infect_crossed)
|
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/try_infect_crossed)
|
||||||
RegisterSignal(COMSIG_ITEM_ATTACK_ZONE, .proc/try_infect_attack_zone)
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, .proc/try_infect_attack_zone)
|
||||||
RegisterSignal(COMSIG_ITEM_ATTACK, .proc/try_infect_attack)
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/try_infect_attack)
|
||||||
RegisterSignal(COMSIG_ITEM_EQUIPPED, .proc/try_infect_equipped)
|
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/try_infect_equipped)
|
||||||
RegisterSignal(COMSIG_MOVABLE_IMPACT_ZONE, .proc/try_infect_impact_zone)
|
RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, .proc/try_infect_impact_zone)
|
||||||
RegisterSignal(COMSIG_FOOD_EATEN, .proc/try_infect_eat)
|
RegisterSignal(parent, COMSIG_FOOD_EATEN, .proc/try_infect_eat)
|
||||||
RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean)
|
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean)
|
||||||
|
|
||||||
/datum/component/infective/proc/try_infect_eat(mob/living/eater, mob/living/feeder)
|
/datum/component/infective/proc/try_infect_eat(mob/living/eater, mob/living/feeder)
|
||||||
for(var/V in diseases)
|
for(var/V in diseases)
|
||||||
|
|||||||
@@ -13,31 +13,21 @@
|
|||||||
var/requires_mob_riding = TRUE //whether this only works if the attacker is riding a mob, rather than anything they can buckle to.
|
var/requires_mob_riding = TRUE //whether this only works if the attacker is riding a mob, rather than anything they can buckle to.
|
||||||
var/requires_mount = TRUE //kinda defeats the point of jousting if you're not mounted but whatever.
|
var/requires_mount = TRUE //kinda defeats the point of jousting if you're not mounted but whatever.
|
||||||
var/mob/current_holder
|
var/mob/current_holder
|
||||||
var/datum/component/redirect/listener
|
|
||||||
var/current_timerid
|
var/current_timerid
|
||||||
|
|
||||||
/datum/component/jousting/Initialize()
|
/datum/component/jousting/Initialize()
|
||||||
if(!isitem(parent))
|
if(!isitem(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
RegisterSignal(COMSIG_ITEM_EQUIPPED, .proc/on_equip)
|
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
|
||||||
RegisterSignal(COMSIG_ITEM_DROPPED, .proc/on_drop)
|
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop)
|
||||||
RegisterSignal(COMSIG_ITEM_ATTACK, .proc/on_attack)
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/on_attack)
|
||||||
|
|
||||||
/datum/component/jousting/Destroy()
|
|
||||||
QDEL_NULL(listener)
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
/datum/component/jousting/proc/on_equip(mob/user, slot)
|
/datum/component/jousting/proc/on_equip(mob/user, slot)
|
||||||
|
RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/mob_move, TRUE)
|
||||||
current_holder = user
|
current_holder = user
|
||||||
if(!listener)
|
|
||||||
listener = user.AddComponent(/datum/component/redirect, COMSIG_MOVABLE_MOVED, CALLBACK(src, .proc/mob_move))
|
|
||||||
else
|
|
||||||
user.TakeComponent(listener)
|
|
||||||
if(QDELING(listener))
|
|
||||||
listener = null
|
|
||||||
|
|
||||||
/datum/component/jousting/proc/on_drop(mob/user)
|
/datum/component/jousting/proc/on_drop(mob/user)
|
||||||
QDEL_NULL(listener)
|
UnregisterSignal(user, COMSIG_MOVABLE_MOVED)
|
||||||
current_holder = null
|
current_holder = null
|
||||||
current_direction = NONE
|
current_direction = NONE
|
||||||
current_tile_charge = 0
|
current_tile_charge = 0
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
/datum/component/knockoff/Initialize(knockoff_chance,zone_override,slots_knockoffable)
|
/datum/component/knockoff/Initialize(knockoff_chance,zone_override,slots_knockoffable)
|
||||||
if(!isitem(parent))
|
if(!isitem(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
RegisterSignal(COMSIG_ITEM_EQUIPPED,.proc/OnEquipped)
|
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED,.proc/OnEquipped)
|
||||||
RegisterSignal(COMSIG_ITEM_DROPPED,.proc/OnDropped)
|
RegisterSignal(parent, COMSIG_ITEM_DROPPED,.proc/OnDropped)
|
||||||
|
|
||||||
src.knockoff_chance = knockoff_chance
|
src.knockoff_chance = knockoff_chance
|
||||||
|
|
||||||
@@ -37,16 +37,9 @@
|
|||||||
if(!istype(H))
|
if(!istype(H))
|
||||||
return
|
return
|
||||||
if(slots_knockoffable && !(slot in slots_knockoffable))
|
if(slots_knockoffable && !(slot in slots_knockoffable))
|
||||||
if(disarm_redirect)
|
UnregisterSignal(H, COMSIG_HUMAN_DISARM_HIT)
|
||||||
QDEL_NULL(disarm_redirect)
|
|
||||||
return
|
return
|
||||||
if(!disarm_redirect)
|
RegisterSignal(H, COMSIG_HUMAN_DISARM_HIT, .proc/Knockoff, TRUE)
|
||||||
disarm_redirect = H.AddComponent(/datum/component/redirect,list(COMSIG_HUMAN_DISARM_HIT),CALLBACK(src,.proc/Knockoff))
|
|
||||||
|
|
||||||
/datum/component/knockoff/proc/OnDropped(mob/living/M)
|
/datum/component/knockoff/proc/OnDropped(mob/living/M)
|
||||||
if(disarm_redirect)
|
UnregisterSignal(M, COMSIG_HUMAN_DISARM_HIT)
|
||||||
QDEL_NULL(disarm_redirect)
|
|
||||||
|
|
||||||
/datum/component/knockoff/Destroy()
|
|
||||||
QDEL_NULL(disarm_redirect)
|
|
||||||
. = ..()
|
|
||||||
@@ -2,10 +2,10 @@
|
|||||||
if(!isatom(parent))
|
if(!isatom(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
if(ismovableatom(parent))
|
if(ismovableatom(parent))
|
||||||
RegisterSignal(COMSIG_MOVABLE_UNCROSS, .proc/uncross_react)
|
RegisterSignal(parent, COMSIG_MOVABLE_UNCROSS, .proc/uncross_react)
|
||||||
else
|
else
|
||||||
RegisterSignal(COMSIG_ATOM_EXIT, .proc/exit_react)
|
RegisterSignal(parent, COMSIG_ATOM_EXIT, .proc/exit_react)
|
||||||
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine)
|
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine)
|
||||||
|
|
||||||
/datum/component/magnetic_catch/proc/uncross_react(atom/movable/thing)
|
/datum/component/magnetic_catch/proc/uncross_react(atom/movable/thing)
|
||||||
if(!thing.throwing || thing.throwing.thrower)
|
if(!thing.throwing || thing.throwing.thrower)
|
||||||
|
|||||||
@@ -32,8 +32,8 @@
|
|||||||
precondition = _precondition
|
precondition = _precondition
|
||||||
after_insert = _after_insert
|
after_insert = _after_insert
|
||||||
|
|
||||||
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy)
|
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy)
|
||||||
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/OnExamine)
|
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/OnExamine)
|
||||||
|
|
||||||
var/list/possible_mats = list()
|
var/list/possible_mats = list()
|
||||||
for(var/mat_type in subtypesof(/datum/material))
|
for(var/mat_type in subtypesof(/datum/material))
|
||||||
|
|||||||
@@ -14,9 +14,9 @@
|
|||||||
START_PROCESSING(SSmood, src)
|
START_PROCESSING(SSmood, src)
|
||||||
owner = parent
|
owner = parent
|
||||||
soundloop = new(list(owner), FALSE, TRUE)
|
soundloop = new(list(owner), FALSE, TRUE)
|
||||||
RegisterSignal(COMSIG_ADD_MOOD_EVENT, .proc/add_event)
|
RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event)
|
||||||
RegisterSignal(COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
|
RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event)
|
||||||
RegisterSignal(COMSIG_ENTER_AREA, .proc/update_beauty)
|
RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/update_beauty)
|
||||||
|
|
||||||
/datum/component/mood/Destroy()
|
/datum/component/mood/Destroy()
|
||||||
STOP_PROCESSING(SSmood, src)
|
STOP_PROCESSING(SSmood, src)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
var/current_paint
|
var/current_paint
|
||||||
|
|
||||||
/datum/component/spraycan_paintable/Initialize()
|
/datum/component/spraycan_paintable/Initialize()
|
||||||
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/Repaint)
|
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/Repaint)
|
||||||
|
|
||||||
/datum/component/spraycan_paintable/Destroy()
|
/datum/component/spraycan_paintable/Destroy()
|
||||||
RemoveCurrentCoat()
|
RemoveCurrentCoat()
|
||||||
|
|||||||
@@ -19,10 +19,10 @@
|
|||||||
can_contaminate = _can_contaminate
|
can_contaminate = _can_contaminate
|
||||||
|
|
||||||
if(istype(parent, /atom))
|
if(istype(parent, /atom))
|
||||||
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/rad_examine)
|
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/rad_examine)
|
||||||
if(istype(parent, /obj/item))
|
if(istype(parent, /obj/item))
|
||||||
RegisterSignal(COMSIG_ITEM_ATTACK, .proc/rad_attack)
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/rad_attack)
|
||||||
RegisterSignal(COMSIG_ITEM_ATTACK_OBJ, .proc/rad_attack)
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK_OBJ, .proc/rad_attack)
|
||||||
else
|
else
|
||||||
CRASH("Something that wasn't an atom was given /datum/component/radioactive")
|
CRASH("Something that wasn't an atom was given /datum/component/radioactive")
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -22,9 +22,9 @@
|
|||||||
/datum/component/riding/Initialize()
|
/datum/component/riding/Initialize()
|
||||||
if(!ismovableatom(parent))
|
if(!ismovableatom(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
RegisterSignal(COMSIG_MOVABLE_BUCKLE, .proc/vehicle_mob_buckle)
|
RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/vehicle_mob_buckle)
|
||||||
RegisterSignal(COMSIG_MOVABLE_UNBUCKLE, .proc/vehicle_mob_unbuckle)
|
RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, .proc/vehicle_mob_unbuckle)
|
||||||
RegisterSignal(COMSIG_MOVABLE_MOVED, .proc/vehicle_moved)
|
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/vehicle_moved)
|
||||||
|
|
||||||
/datum/component/riding/proc/vehicle_mob_unbuckle(mob/living/M, force = FALSE)
|
/datum/component/riding/proc/vehicle_mob_unbuckle(mob/living/M, force = FALSE)
|
||||||
restore_position(M)
|
restore_position(M)
|
||||||
@@ -193,7 +193,7 @@
|
|||||||
|
|
||||||
/datum/component/riding/human/Initialize()
|
/datum/component/riding/human/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
RegisterSignal(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_host_unarmed_melee)
|
RegisterSignal(parent, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_host_unarmed_melee)
|
||||||
|
|
||||||
/datum/component/riding/human/proc/on_host_unarmed_melee(atom/target)
|
/datum/component/riding/human/proc/on_host_unarmed_melee(atom/target)
|
||||||
var/mob/living/carbon/human/AM = parent
|
var/mob/living/carbon/human/AM = parent
|
||||||
|
|||||||
@@ -45,10 +45,10 @@
|
|||||||
default_rotation_direction = ROTATION_CLOCKWISE
|
default_rotation_direction = ROTATION_CLOCKWISE
|
||||||
|
|
||||||
if(src.rotation_flags & ROTATION_ALTCLICK)
|
if(src.rotation_flags & ROTATION_ALTCLICK)
|
||||||
RegisterSignal(COMSIG_CLICK_ALT, .proc/HandRot)
|
RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/HandRot)
|
||||||
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/ExamineMessage)
|
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/ExamineMessage)
|
||||||
if(src.rotation_flags & ROTATION_WRENCH)
|
if(src.rotation_flags & ROTATION_WRENCH)
|
||||||
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/WrenchRot)
|
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/WrenchRot)
|
||||||
|
|
||||||
if(src.rotation_flags & ROTATION_VERBS)
|
if(src.rotation_flags & ROTATION_VERBS)
|
||||||
var/atom/movable/AM = parent
|
var/atom/movable/AM = parent
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// This should only be used by non components trying to listen to a signal
|
||||||
|
// If you use this inside a component I will replace your eyes with lemons ~ninjanomnom
|
||||||
|
|
||||||
/datum/component/redirect
|
/datum/component/redirect
|
||||||
dupe_mode = COMPONENT_DUPE_ALLOWED
|
dupe_mode = COMPONENT_DUPE_ALLOWED
|
||||||
|
|
||||||
@@ -7,8 +10,8 @@
|
|||||||
warning("signals are [list2params(signals)], callback is [_callback]]")
|
warning("signals are [list2params(signals)], callback is [_callback]]")
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
if(flags & REDIRECT_TRANSFER_WITH_TURF && isturf(parent))
|
if(flags & REDIRECT_TRANSFER_WITH_TURF && isturf(parent))
|
||||||
RegisterSignal(COMSIG_TURF_CHANGE, .proc/turf_change)
|
RegisterSignal(parent, COMSIG_TURF_CHANGE, .proc/turf_change)
|
||||||
RegisterSignal(signals, _callback)
|
RegisterSignal(parent, signals, _callback)
|
||||||
|
|
||||||
/datum/component/redirect/proc/turf_change(path, new_baseturfs, flags, list/transfers)
|
/datum/component/redirect/proc/turf_change(path, new_baseturfs, flags, list/transfers)
|
||||||
transfers += src
|
transfers += src
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
intensity = max(_intensity, 0)
|
intensity = max(_intensity, 0)
|
||||||
lube_flags = _lube_flags
|
lube_flags = _lube_flags
|
||||||
callback = _callback
|
callback = _callback
|
||||||
RegisterSignal(list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Slip)
|
RegisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Slip)
|
||||||
|
|
||||||
/datum/component/slippery/proc/Slip(atom/movable/AM)
|
/datum/component/slippery/proc/Slip(atom/movable/AM)
|
||||||
var/mob/victim = AM
|
var/mob/victim = AM
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
var/too_spooky = TRUE //will it spawn a new instrument?
|
var/too_spooky = TRUE //will it spawn a new instrument?
|
||||||
|
|
||||||
/datum/component/spooky/Initialize()
|
/datum/component/spooky/Initialize()
|
||||||
RegisterSignal(COMSIG_ITEM_ATTACK, .proc/spectral_attack)
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/spectral_attack)
|
||||||
|
|
||||||
/datum/component/spooky/proc/spectral_attack(mob/living/carbon/C, mob/user)
|
/datum/component/spooky/proc/spectral_attack(mob/living/carbon/C, mob/user)
|
||||||
if(ishuman(user)) //this weapon wasn't meant for mortals.
|
if(ishuman(user)) //this weapon wasn't meant for mortals.
|
||||||
|
|||||||
@@ -24,10 +24,10 @@
|
|||||||
if(use_delay_override)
|
if(use_delay_override)
|
||||||
use_delay = use_delay_override
|
use_delay = use_delay_override
|
||||||
|
|
||||||
RegisterSignal(list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_COLLIDE, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ), .proc/play_squeak)
|
RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_COLLIDE, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ), .proc/play_squeak)
|
||||||
RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/play_squeak_turf)
|
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/play_squeak_turf)
|
||||||
RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak)
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak)
|
||||||
RegisterSignal(COMSIG_SHOES_STEP_ACTION, .proc/step_squeak)
|
RegisterSignal(parent, COMSIG_SHOES_STEP_ACTION, .proc/step_squeak)
|
||||||
|
|
||||||
/datum/component/squeak/proc/play_squeak()
|
/datum/component/squeak/proc/play_squeak()
|
||||||
if(prob(squeak_chance))
|
if(prob(squeak_chance))
|
||||||
|
|||||||
@@ -7,9 +7,9 @@
|
|||||||
/datum/component/stationloving/Initialize(inform_admins = FALSE, allow_death = FALSE)
|
/datum/component/stationloving/Initialize(inform_admins = FALSE, allow_death = FALSE)
|
||||||
if(!ismovableatom(parent))
|
if(!ismovableatom(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
RegisterSignal(list(COMSIG_MOVABLE_Z_CHANGED), .proc/check_in_bounds)
|
RegisterSignal(parent, list(COMSIG_MOVABLE_Z_CHANGED), .proc/check_in_bounds)
|
||||||
RegisterSignal(list(COMSIG_PARENT_PREQDELETED), .proc/check_deletion)
|
RegisterSignal(parent, list(COMSIG_PARENT_PREQDELETED), .proc/check_deletion)
|
||||||
RegisterSignal(list(COMSIG_ITEM_IMBUE_SOUL), .proc/check_soul_imbue)
|
RegisterSignal(parent, list(COMSIG_ITEM_IMBUE_SOUL), .proc/check_soul_imbue)
|
||||||
src.inform_admins = inform_admins
|
src.inform_admins = inform_admins
|
||||||
src.allow_death = allow_death
|
src.allow_death = allow_death
|
||||||
check_in_bounds() // Just in case something is being created outside of station/centcom
|
check_in_bounds() // Just in case something is being created outside of station/centcom
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
|
|
||||||
/datum/component/storage/concrete/Initialize()
|
/datum/component/storage/concrete/Initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
RegisterSignal(COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del)
|
RegisterSignal(parent, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del)
|
||||||
RegisterSignal(COMSIG_OBJ_DECONSTRUCT, .proc/on_deconstruct)
|
RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, .proc/on_deconstruct)
|
||||||
|
|
||||||
/datum/component/storage/concrete/Destroy()
|
/datum/component/storage/concrete/Destroy()
|
||||||
var/atom/real_location = real_location()
|
var/atom/real_location = real_location()
|
||||||
|
|||||||
@@ -67,38 +67,38 @@
|
|||||||
closer = new(null, src)
|
closer = new(null, src)
|
||||||
orient2hud()
|
orient2hud()
|
||||||
|
|
||||||
RegisterSignal(COMSIG_CONTAINS_STORAGE, .proc/on_check)
|
RegisterSignal(parent, COMSIG_CONTAINS_STORAGE, .proc/on_check)
|
||||||
RegisterSignal(COMSIG_IS_STORAGE_LOCKED, .proc/check_locked)
|
RegisterSignal(parent, COMSIG_IS_STORAGE_LOCKED, .proc/check_locked)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_SHOW, .proc/signal_show_attempt)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_SHOW, .proc/signal_show_attempt)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_INSERT, .proc/signal_insertion_attempt)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_INSERT, .proc/signal_insertion_attempt)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_CAN_INSERT, .proc/signal_can_insert)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_CAN_INSERT, .proc/signal_can_insert)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_TAKE_TYPE, .proc/signal_take_type)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_TAKE_TYPE, .proc/signal_take_type)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_FILL_TYPE, .proc/signal_fill_type)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_FILL_TYPE, .proc/signal_fill_type)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_SET_LOCKSTATE, .proc/set_locked)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_SET_LOCKSTATE, .proc/set_locked)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_TAKE, .proc/signal_take_obj)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_TAKE, .proc/signal_take_obj)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_QUICK_EMPTY, .proc/signal_quick_empty)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_QUICK_EMPTY, .proc/signal_quick_empty)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_HIDE_FROM, .proc/signal_hide_attempt)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_HIDE_FROM, .proc/signal_hide_attempt)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_HIDE_ALL, .proc/close_all)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_HIDE_ALL, .proc/close_all)
|
||||||
RegisterSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, .proc/signal_return_inv)
|
RegisterSignal(parent, COMSIG_TRY_STORAGE_RETURN_INVENTORY, .proc/signal_return_inv)
|
||||||
|
|
||||||
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/attackby)
|
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/attackby)
|
||||||
|
|
||||||
RegisterSignal(COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand)
|
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand)
|
||||||
RegisterSignal(COMSIG_ATOM_ATTACK_PAW, .proc/on_attack_hand)
|
RegisterSignal(parent, COMSIG_ATOM_ATTACK_PAW, .proc/on_attack_hand)
|
||||||
RegisterSignal(COMSIG_ATOM_EMP_ACT, .proc/emp_act)
|
RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/emp_act)
|
||||||
RegisterSignal(COMSIG_ATOM_ATTACK_GHOST, .proc/show_to_ghost)
|
RegisterSignal(parent, COMSIG_ATOM_ATTACK_GHOST, .proc/show_to_ghost)
|
||||||
RegisterSignal(COMSIG_ATOM_ENTERED, .proc/refresh_mob_views)
|
RegisterSignal(parent, COMSIG_ATOM_ENTERED, .proc/refresh_mob_views)
|
||||||
RegisterSignal(COMSIG_ATOM_EXITED, .proc/_remove_and_refresh)
|
RegisterSignal(parent, COMSIG_ATOM_EXITED, .proc/_remove_and_refresh)
|
||||||
|
|
||||||
RegisterSignal(COMSIG_ITEM_PRE_ATTACK, .proc/preattack_intercept)
|
RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, .proc/preattack_intercept)
|
||||||
RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/attack_self)
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/attack_self)
|
||||||
RegisterSignal(COMSIG_ITEM_PICKUP, .proc/signal_on_pickup)
|
RegisterSignal(parent, COMSIG_ITEM_PICKUP, .proc/signal_on_pickup)
|
||||||
|
|
||||||
RegisterSignal(COMSIG_MOVABLE_THROW, .proc/close_all)
|
RegisterSignal(parent, COMSIG_MOVABLE_THROW, .proc/close_all)
|
||||||
|
|
||||||
RegisterSignal(COMSIG_CLICK_ALT, .proc/on_alt_click)
|
RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/on_alt_click)
|
||||||
RegisterSignal(COMSIG_MOUSEDROP_ONTO, .proc/mousedrop_onto)
|
RegisterSignal(parent, COMSIG_MOUSEDROP_ONTO, .proc/mousedrop_onto)
|
||||||
RegisterSignal(COMSIG_MOUSEDROPPED_ONTO, .proc/mousedrop_receive)
|
RegisterSignal(parent, COMSIG_MOUSEDROPPED_ONTO, .proc/mousedrop_receive)
|
||||||
|
|
||||||
update_actions()
|
update_actions()
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
offset_x = rand(-max_x, max_x)
|
offset_x = rand(-max_x, max_x)
|
||||||
offset_y = rand(-max_y, max_y)
|
offset_y = rand(-max_y, max_y)
|
||||||
|
|
||||||
RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/join_swarm)
|
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/join_swarm)
|
||||||
RegisterSignal(COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm)
|
RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm)
|
||||||
|
|
||||||
/datum/component/swarming/proc/join_swarm(atom/movable/AM)
|
/datum/component/swarming/proc/join_swarm(atom/movable/AM)
|
||||||
GET_COMPONENT_FROM(other_swarm, /datum/component/swarming, AM)
|
GET_COMPONENT_FROM(other_swarm, /datum/component/swarming, AM)
|
||||||
|
|||||||
@@ -34,9 +34,9 @@
|
|||||||
overlay = mutable_appearance('icons/effects/effects.dmi', "thermite")
|
overlay = mutable_appearance('icons/effects/effects.dmi', "thermite")
|
||||||
master.add_overlay(overlay)
|
master.add_overlay(overlay)
|
||||||
|
|
||||||
RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
|
RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react)
|
||||||
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/attackby_react)
|
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/attackby_react)
|
||||||
RegisterSignal(COMSIG_ATOM_FIRE_ACT, .proc/flame_react)
|
RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, .proc/flame_react)
|
||||||
|
|
||||||
/datum/component/thermite/Destroy()
|
/datum/component/thermite/Destroy()
|
||||||
var/turf/master = parent
|
var/turf/master = parent
|
||||||
|
|||||||
@@ -26,19 +26,19 @@ GLOBAL_LIST_EMPTY(uplinks)
|
|||||||
if(!isitem(parent))
|
if(!isitem(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
|
|
||||||
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy)
|
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy)
|
||||||
RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/interact)
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/interact)
|
||||||
if(istype(parent, /obj/item/implant))
|
if(istype(parent, /obj/item/implant))
|
||||||
RegisterSignal(COMSIG_IMPLANT_ACTIVATED, .proc/implant_activation)
|
RegisterSignal(parent, COMSIG_IMPLANT_ACTIVATED, .proc/implant_activation)
|
||||||
RegisterSignal(COMSIG_IMPLANT_IMPLANTING, .proc/implanting)
|
RegisterSignal(parent, COMSIG_IMPLANT_IMPLANTING, .proc/implanting)
|
||||||
RegisterSignal(COMSIG_IMPLANT_OTHER, .proc/old_implant)
|
RegisterSignal(parent, COMSIG_IMPLANT_OTHER, .proc/old_implant)
|
||||||
RegisterSignal(COMSIG_IMPLANT_EXISTING_UPLINK, .proc/new_implant)
|
RegisterSignal(parent, COMSIG_IMPLANT_EXISTING_UPLINK, .proc/new_implant)
|
||||||
else if(istype(parent, /obj/item/pda))
|
else if(istype(parent, /obj/item/pda))
|
||||||
RegisterSignal(COMSIG_PDA_CHANGE_RINGTONE, .proc/new_ringtone)
|
RegisterSignal(parent, COMSIG_PDA_CHANGE_RINGTONE, .proc/new_ringtone)
|
||||||
else if(istype(parent, /obj/item/radio))
|
else if(istype(parent, /obj/item/radio))
|
||||||
RegisterSignal(COMSIG_RADIO_NEW_FREQUENCY, .proc/new_frequency)
|
RegisterSignal(parent, COMSIG_RADIO_NEW_FREQUENCY, .proc/new_frequency)
|
||||||
else if(istype(parent, /obj/item/pen))
|
else if(istype(parent, /obj/item/pen))
|
||||||
RegisterSignal(COMSIG_PEN_ROTATED, .proc/pen_rotation)
|
RegisterSignal(parent, COMSIG_PEN_ROTATED, .proc/pen_rotation)
|
||||||
|
|
||||||
GLOB.uplinks += src
|
GLOB.uplinks += src
|
||||||
uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted)
|
uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// A dummy parent type used for easily making components that target an item's wearer rather than the item itself.
|
// A dummy parent type used for easily making components that target an item's wearer rather than the item itself.
|
||||||
|
|
||||||
/datum/component/wearertargeting
|
/datum/component/wearertargeting
|
||||||
var/datum/component/mobhook
|
|
||||||
var/list/valid_slots = list()
|
var/list/valid_slots = list()
|
||||||
var/list/signals = list()
|
var/list/signals = list()
|
||||||
var/datum/callback/callback = CALLBACK(GLOBAL_PROC, .proc/pass)
|
var/datum/callback/callback = CALLBACK(GLOBAL_PROC, .proc/pass)
|
||||||
@@ -10,17 +9,14 @@
|
|||||||
/datum/component/wearertargeting/Initialize()
|
/datum/component/wearertargeting/Initialize()
|
||||||
if(!isitem(parent))
|
if(!isitem(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
RegisterSignal(list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED), .proc/checkMobHook)
|
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
|
||||||
|
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop)
|
||||||
|
|
||||||
/datum/component/wearertargeting/Destroy()
|
/datum/component/wearertargeting/proc/on_equip(mob/equipper, slot)
|
||||||
QDEL_NULL(mobhook)
|
if((slot in valid_slots) && istype(equipper, mobtype))
|
||||||
return ..()
|
RegisterSignal(equipper, signals, callback, TRUE)
|
||||||
|
|
||||||
/datum/component/wearertargeting/proc/checkMobHook(mob/user, slot)
|
|
||||||
if ((slot in valid_slots) && istype(user, mobtype))
|
|
||||||
if (mobhook && mobhook.parent != user)
|
|
||||||
QDEL_NULL(mobhook)
|
|
||||||
if (!mobhook)
|
|
||||||
mobhook = user.AddComponent(/datum/component/redirect, signals, callback)
|
|
||||||
else
|
else
|
||||||
QDEL_NULL(mobhook)
|
UnregisterSignal(equipper, signals)
|
||||||
|
|
||||||
|
/datum/component/wearertargeting/proc/on_drop(mob/user)
|
||||||
|
UnregisterSignal(user, signals)
|
||||||
|
|||||||
@@ -26,8 +26,8 @@
|
|||||||
if(!isopenturf(parent))
|
if(!isopenturf(parent))
|
||||||
return COMPONENT_INCOMPATIBLE
|
return COMPONENT_INCOMPATIBLE
|
||||||
add_wet(strength, duration_minimum, duration_add, duration_maximum)
|
add_wet(strength, duration_minimum, duration_add, duration_maximum)
|
||||||
RegisterSignal(COMSIG_TURF_IS_WET, .proc/is_wet)
|
RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet)
|
||||||
RegisterSignal(COMSIG_TURF_MAKE_DRY, .proc/dry)
|
RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry)
|
||||||
permanent = _permanent
|
permanent = _permanent
|
||||||
if(!permanent)
|
if(!permanent)
|
||||||
START_PROCESSING(SSwet_floors, src)
|
START_PROCESSING(SSwet_floors, src)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
var/gc_destroyed //Time when this object was destroyed.
|
var/gc_destroyed //Time when this object was destroyed.
|
||||||
var/list/active_timers //for SStimer
|
var/list/active_timers //for SStimer
|
||||||
var/list/datum_components //for /datum/components
|
var/list/datum_components //for /datum/components
|
||||||
|
var/list/comp_lookup //for /datum/components
|
||||||
var/datum_flags = NONE
|
var/datum_flags = NONE
|
||||||
var/datum/weakref/weak_reference
|
var/datum/weakref/weak_reference
|
||||||
|
|
||||||
@@ -41,6 +42,19 @@
|
|||||||
qdel(C, FALSE, TRUE)
|
qdel(C, FALSE, TRUE)
|
||||||
dc.Cut()
|
dc.Cut()
|
||||||
|
|
||||||
|
var/list/lookup = comp_lookup
|
||||||
|
if(lookup)
|
||||||
|
for(var/sig in lookup)
|
||||||
|
var/list/comps = lookup[sig]
|
||||||
|
if(length(comps))
|
||||||
|
for(var/i in comps)
|
||||||
|
var/datum/component/comp = i
|
||||||
|
comp.UnregisterSignal(src, sig)
|
||||||
|
else
|
||||||
|
var/datum/component/comp = comps
|
||||||
|
comp.UnregisterSignal(src, sig)
|
||||||
|
comp_lookup = lookup = null
|
||||||
|
|
||||||
return QDEL_HINT_QUEUE
|
return QDEL_HINT_QUEUE
|
||||||
|
|
||||||
#ifdef DATUMVAR_DEBUGGING_MODE
|
#ifdef DATUMVAR_DEBUGGING_MODE
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
//Vars that will not be copied when using /DuplicateObject
|
//Vars that will not be copied when using /DuplicateObject
|
||||||
GLOBAL_LIST_INIT(duplicate_forbidden_vars,list("tag", "datum_components", "area","type","loc","locs","vars", "parent","parent_type", "verbs","ckey","key","power_supply","contents","reagents","stat","x","y","z","group","atmos_adjacent_turfs"))
|
GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
|
||||||
|
"tag", "datum_components", "area", "type", "loc", "locs", "vars", "parent", "parent_type", "verbs", "ckey", "key",
|
||||||
|
"power_supply", "contents", "reagents", "stat", "x", "y", "z", "group", "atmos_adjacent_turfs", "comp_lookup"
|
||||||
|
))
|
||||||
|
|
||||||
/proc/DuplicateObject(atom/original, perfectcopy = TRUE, sameloc = FALSE, atom/newloc = null, nerf = FALSE, holoitem=FALSE)
|
/proc/DuplicateObject(atom/original, perfectcopy = TRUE, sameloc = FALSE, atom/newloc = null, nerf = FALSE, holoitem=FALSE)
|
||||||
if(!original)
|
if(!original)
|
||||||
|
|||||||
Reference in New Issue
Block a user