diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 28914d1bf2f3..d454c91303ac 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -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 #define GET_COMPONENT_FROM(varname, path, target) var##path/##varname = ##target.GetComponent(##path) @@ -20,7 +20,7 @@ // global signals // 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_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 COMPONENT_NO_ATTACK 1 #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_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) diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 3eed510adcd7..c1e101a0e743 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -2,34 +2,5 @@ SUBSYSTEM_DEF(dcs) name = "Datum Component System" 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() comp_lookup = SSdcs.comp_lookup diff --git a/code/datums/components/README.md b/code/datums/components/README.md index 090dc470670a..8d978ae4cfb9 100644 --- a/code/datums/components/README.md +++ b/code/datums/components/README.md @@ -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 1. `/datum/component/proc/_JoinParent` (private, final) * 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 * 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 diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index caf53f09af66..12e5ac1d209a 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -58,8 +58,8 @@ if(!silent) SEND_SIGNAL(P, COMSIG_COMPONENT_REMOVING, src) parent = null - SSdcs.UnregisterSignal(src, signal_procs) - LAZYCLEARLIST(signal_procs) + for(var/target in signal_procs) + UnregisterSignal(target, signal_procs[target]) return ..() /datum/component/proc/_RemoveFromParent() @@ -78,34 +78,69 @@ if(!dc.len) P.datum_components = null -/datum/component/proc/RegisterSignal(sig_type_or_types, proc_or_callback, override = FALSE) - if(QDELETED(src)) +/datum/component/proc/RegisterSignal(datum/target, sig_type_or_types, proc_or_callback, override = FALSE) + if(QDELETED(src) || QDELETED(target)) return + var/list/procs = signal_procs if(!procs) - procs = list() - signal_procs = procs + signal_procs = procs = list() + 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 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) 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") - if(sig_type[1] == "!") - SSdcs.RegisterSignal(src, sig_type) - - procs[sig_type] = proc_or_callback + procs[target][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 -/datum/component/proc/HasSignal(sig_type) - return signal_procs[sig_type] != null +/datum/component/proc/UnregisterSignal(datum/target, sig_type_or_types) + 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 -= sig_type_or_types + signal_procs[target] -= sig_type_or_types + if(!signal_procs[target].len) + signal_procs -= target /datum/component/proc/InheritComponent(datum/component/C, i_am_original) return @@ -126,23 +161,19 @@ . += current_type /datum/proc/_SendSignal(sigtype, list/arguments) - var/target = datum_components[/datum/component] + var/target = comp_lookup[sigtype] if(!length(target)) var/datum/component/C = target if(!C.enabled) return NONE - var/datum/callback/CB = C.signal_procs[sigtype] - if(!CB) - return NONE + var/datum/callback/CB = C.signal_procs[src][sigtype] return CB.InvokeAsync(arglist(arguments)) . = NONE for(var/I in target) var/datum/component/C = I if(!C.enabled) continue - var/datum/callback/CB = C.signal_procs[sigtype] - if(!CB) - continue + var/datum/callback/CB = C.signal_procs[src][sigtype] . |= CB.InvokeAsync(arglist(arguments)) /datum/proc/GetComponent(c_type) diff --git a/code/datums/components/archaeology.dm b/code/datums/components/archaeology.dm index e51cba1ca3c3..f5bedf42a928 100644 --- a/code/datums/components/archaeology.dm +++ b/code/datums/components/archaeology.dm @@ -15,9 +15,9 @@ archdrops[i][ARCH_PROB] = 100 stack_trace("ARCHAEOLOGY WARNING: [parent] contained a null probability value in [i].") callback = _callback - RegisterSignal(COMSIG_PARENT_ATTACKBY,.proc/Dig) - RegisterSignal(COMSIG_ATOM_EX_ACT, .proc/BombDig) - RegisterSignal(COMSIG_ATOM_SING_PULL, .proc/SingDig) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY,.proc/Dig) + RegisterSignal(parent, COMSIG_ATOM_EX_ACT, .proc/BombDig) + RegisterSignal(parent, COMSIG_ATOM_SING_PULL, .proc/SingDig) /datum/component/archaeology/InheritComponent(datum/component/archaeology/A, i_am_original) var/list/other_archdrops = A.archdrops diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index 0b94c389ce41..0e3cee8a110e 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -9,9 +9,9 @@ if(!isobj(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine) - RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/applyplate) - RegisterSignal(COMSIG_PARENT_PREQDELETED, .proc/dropplates) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/applyplate) + RegisterSignal(parent, COMSIG_PARENT_PREQDELETED, .proc/dropplates) if(_maxamount) maxamount = _maxamount diff --git a/code/datums/components/beauty.dm b/code/datums/components/beauty.dm index f6031046bd17..bf086feb20f2 100644 --- a/code/datums/components/beauty.dm +++ b/code/datums/components/beauty.dm @@ -5,8 +5,8 @@ if(!ismovableatom(parent)) return COMPONENT_INCOMPATIBLE beauty = beautyamount - RegisterSignal(COMSIG_ENTER_AREA, .proc/enter_area) - RegisterSignal(COMSIG_EXIT_AREA, .proc/exit_area) + RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/enter_area) + RegisterSignal(parent, COMSIG_EXIT_AREA, .proc/exit_area) var/area/A = get_area(parent) if(!A || A.outdoors) return diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 7001523235c6..9f85c4814cab 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -12,7 +12,7 @@ probability = _probability 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) var/atom/A = parent diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 88a92ce8ec15..ddc375d8a891 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -23,7 +23,7 @@ )) /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 START_PROCESSING(SSobj, src) // process on create, in case stuff is still there diff --git a/code/datums/components/cleaning.dm b/code/datums/components/cleaning.dm index 8f8c0ea66028..05c26efcc1b8 100644 --- a/code/datums/components/cleaning.dm +++ b/code/datums/components/cleaning.dm @@ -4,7 +4,7 @@ /datum/component/cleaning/Initialize() if(!ismovableatom(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(list(COMSIG_MOVABLE_MOVED), .proc/Clean) + RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/Clean) /datum/component/cleaning/proc/Clean() var/atom/movable/AM = parent diff --git a/code/datums/components/construction.dm b/code/datums/components/construction.dm index c9cf47e221d3..f4b65481e74f 100644 --- a/code/datums/components/construction.dm +++ b/code/datums/components/construction.dm @@ -15,8 +15,8 @@ if(!isatom(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine) - RegisterSignal(COMSIG_PARENT_ATTACKBY,.proc/action) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY,.proc/action) update_parent(index) /datum/component/construction/proc/examine(mob/user) diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm index 8ee3d6d3883c..e86663591bd9 100644 --- a/code/datums/components/decal.dm +++ b/code/datums/components/decal.dm @@ -12,11 +12,11 @@ cleanable = _cleanable 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) - RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) if(_description) - RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) apply() /datum/component/decal/Destroy() diff --git a/code/datums/components/decals/blood.dm b/code/datums/components/decals/blood.dm index e69f94358c45..e4aae3cf0549 100644 --- a/code/datums/components/decals/blood.dm +++ b/code/datums/components/decals/blood.dm @@ -5,7 +5,7 @@ if(!isitem(parent)) 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) var/obj/item/I = parent diff --git a/code/datums/components/earhealing.dm b/code/datums/components/earhealing.dm index 79303ff701f9..8fe6d2788e06 100644 --- a/code/datums/components/earhealing.dm +++ b/code/datums/components/earhealing.dm @@ -7,7 +7,7 @@ /datum/component/earhealing/Initialize() if(!isitem(parent)) 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) if (slot == SLOT_EARS && istype(user)) diff --git a/code/datums/components/edit_complainer.dm b/code/datums/components/edit_complainer.dm index c0a875d4579b..f6de9eaf786a 100644 --- a/code/datums/components/edit_complainer.dm +++ b/code/datums/components/edit_complainer.dm @@ -16,7 +16,7 @@ ) 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) var/atom/movable/master = parent diff --git a/code/datums/components/empprotection.dm b/code/datums/components/empprotection.dm index d9164529c6a5..df4c49040b6d 100644 --- a/code/datums/components/empprotection.dm +++ b/code/datums/components/empprotection.dm @@ -5,7 +5,7 @@ if(!istype(parent, /atom)) return COMPONENT_INCOMPATIBLE 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) return flags diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm index 33456e6e98e0..9ee4c9c60bea 100644 --- a/code/datums/components/forensics.dm +++ b/code/datums/components/forensics.dm @@ -21,7 +21,7 @@ blood_DNA = new_blood_DNA fibers = new_fibers 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() fingerprints = null diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index f434ed6f527c..6f95ccce3541 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -12,15 +12,15 @@ if(expire_in) expire_time = world.time + expire_in QDEL_IN(src, expire_in) - RegisterSignal(COMSIG_MOVABLE_BUCKLE, .proc/try_infect_buckle) - RegisterSignal(COMSIG_MOVABLE_COLLIDE, .proc/try_infect_collide) - RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/try_infect_crossed) - RegisterSignal(COMSIG_ITEM_ATTACK_ZONE, .proc/try_infect_attack_zone) - RegisterSignal(COMSIG_ITEM_ATTACK, .proc/try_infect_attack) - RegisterSignal(COMSIG_ITEM_EQUIPPED, .proc/try_infect_equipped) - RegisterSignal(COMSIG_MOVABLE_IMPACT_ZONE, .proc/try_infect_impact_zone) - RegisterSignal(COMSIG_FOOD_EATEN, .proc/try_infect_eat) - RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean) + RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/try_infect_buckle) + RegisterSignal(parent, COMSIG_MOVABLE_COLLIDE, .proc/try_infect_collide) + RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/try_infect_crossed) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_ZONE, .proc/try_infect_attack_zone) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/try_infect_attack) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/try_infect_equipped) + RegisterSignal(parent, COMSIG_MOVABLE_IMPACT_ZONE, .proc/try_infect_impact_zone) + RegisterSignal(parent, COMSIG_FOOD_EATEN, .proc/try_infect_eat) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean) /datum/component/infective/proc/try_infect_eat(mob/living/eater, mob/living/feeder) for(var/V in diseases) diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm index 679d37738b16..34bed6d7e92d 100644 --- a/code/datums/components/jousting.dm +++ b/code/datums/components/jousting.dm @@ -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_mount = TRUE //kinda defeats the point of jousting if you're not mounted but whatever. var/mob/current_holder - var/datum/component/redirect/listener var/current_timerid /datum/component/jousting/Initialize() if(!isitem(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(COMSIG_ITEM_EQUIPPED, .proc/on_equip) - RegisterSignal(COMSIG_ITEM_DROPPED, .proc/on_drop) - RegisterSignal(COMSIG_ITEM_ATTACK, .proc/on_attack) - -/datum/component/jousting/Destroy() - QDEL_NULL(listener) - return ..() + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/on_attack) /datum/component/jousting/proc/on_equip(mob/user, slot) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/mob_move, TRUE) 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) - QDEL_NULL(listener) + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) current_holder = null current_direction = NONE current_tile_charge = 0 diff --git a/code/datums/components/knockoff.dm b/code/datums/components/knockoff.dm index 60b86f01d2aa..3354548ca10a 100644 --- a/code/datums/components/knockoff.dm +++ b/code/datums/components/knockoff.dm @@ -8,8 +8,8 @@ /datum/component/knockoff/Initialize(knockoff_chance,zone_override,slots_knockoffable) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(COMSIG_ITEM_EQUIPPED,.proc/OnEquipped) - RegisterSignal(COMSIG_ITEM_DROPPED,.proc/OnDropped) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED,.proc/OnEquipped) + RegisterSignal(parent, COMSIG_ITEM_DROPPED,.proc/OnDropped) src.knockoff_chance = knockoff_chance @@ -37,16 +37,9 @@ if(!istype(H)) return if(slots_knockoffable && !(slot in slots_knockoffable)) - if(disarm_redirect) - QDEL_NULL(disarm_redirect) + UnregisterSignal(H, COMSIG_HUMAN_DISARM_HIT) return - if(!disarm_redirect) - disarm_redirect = H.AddComponent(/datum/component/redirect,list(COMSIG_HUMAN_DISARM_HIT),CALLBACK(src,.proc/Knockoff)) + RegisterSignal(H, COMSIG_HUMAN_DISARM_HIT, .proc/Knockoff, TRUE) /datum/component/knockoff/proc/OnDropped(mob/living/M) - if(disarm_redirect) - QDEL_NULL(disarm_redirect) - -/datum/component/knockoff/Destroy() - QDEL_NULL(disarm_redirect) - . = ..() \ No newline at end of file + UnregisterSignal(M, COMSIG_HUMAN_DISARM_HIT) \ No newline at end of file diff --git a/code/datums/components/magnetic_catch.dm b/code/datums/components/magnetic_catch.dm index 2be1d6a451d0..8398f6f4b6c0 100644 --- a/code/datums/components/magnetic_catch.dm +++ b/code/datums/components/magnetic_catch.dm @@ -2,10 +2,10 @@ if(!isatom(parent)) return COMPONENT_INCOMPATIBLE if(ismovableatom(parent)) - RegisterSignal(COMSIG_MOVABLE_UNCROSS, .proc/uncross_react) + RegisterSignal(parent, COMSIG_MOVABLE_UNCROSS, .proc/uncross_react) else - RegisterSignal(COMSIG_ATOM_EXIT, .proc/exit_react) - RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(parent, COMSIG_ATOM_EXIT, .proc/exit_react) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) /datum/component/magnetic_catch/proc/uncross_react(atom/movable/thing) if(!thing.throwing || thing.throwing.thrower) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index dbeb5833fa34..ec0c0282923f 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -32,8 +32,8 @@ precondition = _precondition after_insert = _after_insert - RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) - RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/OnExamine) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/OnExamine) var/list/possible_mats = list() for(var/mat_type in subtypesof(/datum/material)) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 8714b41f05e3..3e37b0754201 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -14,9 +14,9 @@ START_PROCESSING(SSmood, src) owner = parent soundloop = new(list(owner), FALSE, TRUE) - RegisterSignal(COMSIG_ADD_MOOD_EVENT, .proc/add_event) - RegisterSignal(COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event) - RegisterSignal(COMSIG_ENTER_AREA, .proc/update_beauty) + RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event) + RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event) + RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/update_beauty) /datum/component/mood/Destroy() STOP_PROCESSING(SSmood, src) diff --git a/code/datums/components/paintable.dm b/code/datums/components/paintable.dm index 01e81d27c035..73aa1c02ed39 100644 --- a/code/datums/components/paintable.dm +++ b/code/datums/components/paintable.dm @@ -2,7 +2,7 @@ var/current_paint /datum/component/spraycan_paintable/Initialize() - RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/Repaint) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/Repaint) /datum/component/spraycan_paintable/Destroy() RemoveCurrentCoat() diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index fc0456ad10ec..3dd1ba2a6f42 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -19,10 +19,10 @@ can_contaminate = _can_contaminate if(istype(parent, /atom)) - RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/rad_examine) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/rad_examine) if(istype(parent, /obj/item)) - RegisterSignal(COMSIG_ITEM_ATTACK, .proc/rad_attack) - RegisterSignal(COMSIG_ITEM_ATTACK_OBJ, .proc/rad_attack) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/rad_attack) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_OBJ, .proc/rad_attack) else CRASH("Something that wasn't an atom was given /datum/component/radioactive") return diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index de0d081e3dfa..4a40cae0d98c 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -22,9 +22,9 @@ /datum/component/riding/Initialize() if(!ismovableatom(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(COMSIG_MOVABLE_BUCKLE, .proc/vehicle_mob_buckle) - RegisterSignal(COMSIG_MOVABLE_UNBUCKLE, .proc/vehicle_mob_unbuckle) - RegisterSignal(COMSIG_MOVABLE_MOVED, .proc/vehicle_moved) + RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/vehicle_mob_buckle) + RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, .proc/vehicle_mob_unbuckle) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/vehicle_moved) /datum/component/riding/proc/vehicle_mob_unbuckle(mob/living/M, force = FALSE) restore_position(M) @@ -193,7 +193,7 @@ /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) var/mob/living/carbon/human/AM = parent diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 1db25f86e4c1..81482670163e 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -45,10 +45,10 @@ default_rotation_direction = ROTATION_CLOCKWISE if(src.rotation_flags & ROTATION_ALTCLICK) - RegisterSignal(COMSIG_CLICK_ALT, .proc/HandRot) - RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/ExamineMessage) + RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/HandRot) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/ExamineMessage) 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) var/atom/movable/AM = parent diff --git a/code/datums/components/signal_redirect.dm b/code/datums/components/signal_redirect.dm index 769555fc80b1..4de7e99a0246 100644 --- a/code/datums/components/signal_redirect.dm +++ b/code/datums/components/signal_redirect.dm @@ -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 dupe_mode = COMPONENT_DUPE_ALLOWED @@ -7,8 +10,8 @@ warning("signals are [list2params(signals)], callback is [_callback]]") return COMPONENT_INCOMPATIBLE if(flags & REDIRECT_TRANSFER_WITH_TURF && isturf(parent)) - RegisterSignal(COMSIG_TURF_CHANGE, .proc/turf_change) - RegisterSignal(signals, _callback) + RegisterSignal(parent, COMSIG_TURF_CHANGE, .proc/turf_change) + RegisterSignal(parent, signals, _callback) /datum/component/redirect/proc/turf_change(path, new_baseturfs, flags, list/transfers) transfers += src diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 24cb22020d72..9bb00ecd2880 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -7,7 +7,7 @@ intensity = max(_intensity, 0) lube_flags = _lube_flags 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) var/mob/victim = AM diff --git a/code/datums/components/spooky.dm b/code/datums/components/spooky.dm index 0de27f30f03a..6e9001ead5f5 100644 --- a/code/datums/components/spooky.dm +++ b/code/datums/components/spooky.dm @@ -2,7 +2,7 @@ var/too_spooky = TRUE //will it spawn a new instrument? /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) if(ishuman(user)) //this weapon wasn't meant for mortals. diff --git a/code/datums/components/squeek.dm b/code/datums/components/squeek.dm index 7a362f03913f..3d88655b730d 100644 --- a/code/datums/components/squeek.dm +++ b/code/datums/components/squeek.dm @@ -24,10 +24,10 @@ if(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(COMSIG_MOVABLE_CROSSED, .proc/play_squeak_turf) - RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak) - RegisterSignal(COMSIG_SHOES_STEP_ACTION, .proc/step_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(parent, COMSIG_MOVABLE_CROSSED, .proc/play_squeak_turf) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak) + RegisterSignal(parent, COMSIG_SHOES_STEP_ACTION, .proc/step_squeak) /datum/component/squeak/proc/play_squeak() if(prob(squeak_chance)) diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 99e99f6465bf..15f47dd8a542 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -7,9 +7,9 @@ /datum/component/stationloving/Initialize(inform_admins = FALSE, allow_death = FALSE) if(!ismovableatom(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(list(COMSIG_MOVABLE_Z_CHANGED), .proc/check_in_bounds) - RegisterSignal(list(COMSIG_PARENT_PREQDELETED), .proc/check_deletion) - RegisterSignal(list(COMSIG_ITEM_IMBUE_SOUL), .proc/check_soul_imbue) + RegisterSignal(parent, list(COMSIG_MOVABLE_Z_CHANGED), .proc/check_in_bounds) + RegisterSignal(parent, list(COMSIG_PARENT_PREQDELETED), .proc/check_deletion) + RegisterSignal(parent, list(COMSIG_ITEM_IMBUE_SOUL), .proc/check_soul_imbue) src.inform_admins = inform_admins src.allow_death = allow_death check_in_bounds() // Just in case something is being created outside of station/centcom diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index 8701252fe613..557d07c93de4 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -14,8 +14,8 @@ /datum/component/storage/concrete/Initialize() . = ..() - RegisterSignal(COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del) - RegisterSignal(COMSIG_OBJ_DECONSTRUCT, .proc/on_deconstruct) + RegisterSignal(parent, COMSIG_ATOM_CONTENTS_DEL, .proc/on_contents_del) + RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, .proc/on_deconstruct) /datum/component/storage/concrete/Destroy() var/atom/real_location = real_location() diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 0c63322c168e..2913adf9b9c2 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -67,38 +67,38 @@ closer = new(null, src) orient2hud() - RegisterSignal(COMSIG_CONTAINS_STORAGE, .proc/on_check) - RegisterSignal(COMSIG_IS_STORAGE_LOCKED, .proc/check_locked) - RegisterSignal(COMSIG_TRY_STORAGE_SHOW, .proc/signal_show_attempt) - RegisterSignal(COMSIG_TRY_STORAGE_INSERT, .proc/signal_insertion_attempt) - RegisterSignal(COMSIG_TRY_STORAGE_CAN_INSERT, .proc/signal_can_insert) - RegisterSignal(COMSIG_TRY_STORAGE_TAKE_TYPE, .proc/signal_take_type) - RegisterSignal(COMSIG_TRY_STORAGE_FILL_TYPE, .proc/signal_fill_type) - RegisterSignal(COMSIG_TRY_STORAGE_SET_LOCKSTATE, .proc/set_locked) - RegisterSignal(COMSIG_TRY_STORAGE_TAKE, .proc/signal_take_obj) - RegisterSignal(COMSIG_TRY_STORAGE_QUICK_EMPTY, .proc/signal_quick_empty) - RegisterSignal(COMSIG_TRY_STORAGE_HIDE_FROM, .proc/signal_hide_attempt) - RegisterSignal(COMSIG_TRY_STORAGE_HIDE_ALL, .proc/close_all) - RegisterSignal(COMSIG_TRY_STORAGE_RETURN_INVENTORY, .proc/signal_return_inv) + RegisterSignal(parent, COMSIG_CONTAINS_STORAGE, .proc/on_check) + RegisterSignal(parent, COMSIG_IS_STORAGE_LOCKED, .proc/check_locked) + RegisterSignal(parent, COMSIG_TRY_STORAGE_SHOW, .proc/signal_show_attempt) + RegisterSignal(parent, COMSIG_TRY_STORAGE_INSERT, .proc/signal_insertion_attempt) + RegisterSignal(parent, COMSIG_TRY_STORAGE_CAN_INSERT, .proc/signal_can_insert) + RegisterSignal(parent, COMSIG_TRY_STORAGE_TAKE_TYPE, .proc/signal_take_type) + RegisterSignal(parent, COMSIG_TRY_STORAGE_FILL_TYPE, .proc/signal_fill_type) + RegisterSignal(parent, COMSIG_TRY_STORAGE_SET_LOCKSTATE, .proc/set_locked) + RegisterSignal(parent, COMSIG_TRY_STORAGE_TAKE, .proc/signal_take_obj) + RegisterSignal(parent, COMSIG_TRY_STORAGE_QUICK_EMPTY, .proc/signal_quick_empty) + RegisterSignal(parent, COMSIG_TRY_STORAGE_HIDE_FROM, .proc/signal_hide_attempt) + RegisterSignal(parent, COMSIG_TRY_STORAGE_HIDE_ALL, .proc/close_all) + 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(COMSIG_ATOM_ATTACK_PAW, .proc/on_attack_hand) - RegisterSignal(COMSIG_ATOM_EMP_ACT, .proc/emp_act) - RegisterSignal(COMSIG_ATOM_ATTACK_GHOST, .proc/show_to_ghost) - RegisterSignal(COMSIG_ATOM_ENTERED, .proc/refresh_mob_views) - RegisterSignal(COMSIG_ATOM_EXITED, .proc/_remove_and_refresh) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_PAW, .proc/on_attack_hand) + RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, .proc/emp_act) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_GHOST, .proc/show_to_ghost) + RegisterSignal(parent, COMSIG_ATOM_ENTERED, .proc/refresh_mob_views) + RegisterSignal(parent, COMSIG_ATOM_EXITED, .proc/_remove_and_refresh) - RegisterSignal(COMSIG_ITEM_PRE_ATTACK, .proc/preattack_intercept) - RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/attack_self) - RegisterSignal(COMSIG_ITEM_PICKUP, .proc/signal_on_pickup) + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, .proc/preattack_intercept) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/attack_self) + 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(COMSIG_MOUSEDROP_ONTO, .proc/mousedrop_onto) - RegisterSignal(COMSIG_MOUSEDROPPED_ONTO, .proc/mousedrop_receive) + RegisterSignal(parent, COMSIG_CLICK_ALT, .proc/on_alt_click) + RegisterSignal(parent, COMSIG_MOUSEDROP_ONTO, .proc/mousedrop_onto) + RegisterSignal(parent, COMSIG_MOUSEDROPPED_ONTO, .proc/mousedrop_receive) update_actions() diff --git a/code/datums/components/swarming.dm b/code/datums/components/swarming.dm index c80b8ba13b6a..f97e03579af8 100644 --- a/code/datums/components/swarming.dm +++ b/code/datums/components/swarming.dm @@ -8,8 +8,8 @@ offset_x = rand(-max_x, max_x) offset_y = rand(-max_y, max_y) - RegisterSignal(COMSIG_MOVABLE_CROSSED, .proc/join_swarm) - RegisterSignal(COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm) + RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/join_swarm) + RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/leave_swarm) /datum/component/swarming/proc/join_swarm(atom/movable/AM) GET_COMPONENT_FROM(other_swarm, /datum/component/swarming, AM) diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index dc1c95483a80..c9c1c5da3ea3 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -34,9 +34,9 @@ overlay = mutable_appearance('icons/effects/effects.dmi', "thermite") master.add_overlay(overlay) - RegisterSignal(COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) - RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/attackby_react) - RegisterSignal(COMSIG_ATOM_FIRE_ACT, .proc/flame_react) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean_react) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/attackby_react) + RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, .proc/flame_react) /datum/component/thermite/Destroy() var/turf/master = parent diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 6899baeabb8f..a945e1d3472a 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -26,19 +26,19 @@ GLOBAL_LIST_EMPTY(uplinks) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) - RegisterSignal(COMSIG_ITEM_ATTACK_SELF, .proc/interact) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/interact) if(istype(parent, /obj/item/implant)) - RegisterSignal(COMSIG_IMPLANT_ACTIVATED, .proc/implant_activation) - RegisterSignal(COMSIG_IMPLANT_IMPLANTING, .proc/implanting) - RegisterSignal(COMSIG_IMPLANT_OTHER, .proc/old_implant) - RegisterSignal(COMSIG_IMPLANT_EXISTING_UPLINK, .proc/new_implant) + RegisterSignal(parent, COMSIG_IMPLANT_ACTIVATED, .proc/implant_activation) + RegisterSignal(parent, COMSIG_IMPLANT_IMPLANTING, .proc/implanting) + RegisterSignal(parent, COMSIG_IMPLANT_OTHER, .proc/old_implant) + RegisterSignal(parent, COMSIG_IMPLANT_EXISTING_UPLINK, .proc/new_implant) 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)) - RegisterSignal(COMSIG_RADIO_NEW_FREQUENCY, .proc/new_frequency) + RegisterSignal(parent, COMSIG_RADIO_NEW_FREQUENCY, .proc/new_frequency) 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 uplink_items = get_uplink_items(gamemode, TRUE, allow_restricted) diff --git a/code/datums/components/wearertargeting.dm b/code/datums/components/wearertargeting.dm index adf8acceb986..14f9d952934f 100644 --- a/code/datums/components/wearertargeting.dm +++ b/code/datums/components/wearertargeting.dm @@ -1,7 +1,6 @@ // A dummy parent type used for easily making components that target an item's wearer rather than the item itself. /datum/component/wearertargeting - var/datum/component/mobhook var/list/valid_slots = list() var/list/signals = list() var/datum/callback/callback = CALLBACK(GLOBAL_PROC, .proc/pass) @@ -10,17 +9,14 @@ /datum/component/wearertargeting/Initialize() if(!isitem(parent)) 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() - QDEL_NULL(mobhook) - return ..() - -/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) +/datum/component/wearertargeting/proc/on_equip(mob/equipper, slot) + if((slot in valid_slots) && istype(equipper, mobtype)) + RegisterSignal(equipper, signals, callback, TRUE) else - QDEL_NULL(mobhook) + UnregisterSignal(equipper, signals) + +/datum/component/wearertargeting/proc/on_drop(mob/user) + UnregisterSignal(user, signals) diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 49c628385bdc..1a6bc015d63c 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -26,8 +26,8 @@ if(!isopenturf(parent)) return COMPONENT_INCOMPATIBLE add_wet(strength, duration_minimum, duration_add, duration_maximum) - RegisterSignal(COMSIG_TURF_IS_WET, .proc/is_wet) - RegisterSignal(COMSIG_TURF_MAKE_DRY, .proc/dry) + RegisterSignal(parent, COMSIG_TURF_IS_WET, .proc/is_wet) + RegisterSignal(parent, COMSIG_TURF_MAKE_DRY, .proc/dry) permanent = _permanent if(!permanent) START_PROCESSING(SSwet_floors, src) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 793d9f2a4bf5..9e147041231a 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -2,6 +2,7 @@ var/gc_destroyed //Time when this object was destroyed. var/list/active_timers //for SStimer var/list/datum_components //for /datum/components + var/list/comp_lookup //for /datum/components var/datum_flags = NONE var/datum/weakref/weak_reference @@ -41,6 +42,19 @@ qdel(C, FALSE, TRUE) 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 #ifdef DATUMVAR_DEBUGGING_MODE diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 8edc7090e432..efe7418e44b9 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -1,5 +1,8 @@ //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) if(!original)