diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index b1f4b8c8f8a..ad85eb33e00 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -340,6 +340,9 @@ /// Returns if the item had a negative side effect occur while recharging #define COMPONENT_ITEM_BURNT_OUT (1 << 1) +/// Sent from /obj/effect/proc_holder/spell/aoe_turf/knock/cast(), to every nearby turf: (obj/effect/proc_holder/spell/targeted/charge/spell, mob/living/caster) +#define COMSIG_ATOM_MAGICALLY_UNLOCKED "atom_magic_unlock" + // /obj/item/camera signals ///from /obj/item/camera/captureimage(): (atom/target, mob/user) diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index e8aab954059..816b4a34429 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -7,7 +7,6 @@ var/frequency var/datum/radio_frequency/radio_connection - /obj/machinery/door/airlock/receive_signal(datum/signal/signal) if(!signal) return @@ -50,7 +49,6 @@ send_status() - /obj/machinery/door/airlock/proc/send_status() if(radio_connection) var/datum/signal/signal = new(list( @@ -61,25 +59,27 @@ )) radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) - /obj/machinery/door/airlock/open(surpress_send) . = ..() if(!surpress_send) send_status() - /obj/machinery/door/airlock/close(surpress_send) . = ..() if(!surpress_send) send_status() - /obj/machinery/door/airlock/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) if(new_frequency) frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK) +/obj/machinery/door/airlock/on_magic_unlock(datum/source, obj/effect/proc_holder/spell/aoe_turf/knock/spell, mob/living/caster) + // Airlocks should unlock themselves when knock is casted, THEN open up. + locked = FALSE + return ..() + /obj/machinery/door/airlock/Destroy() if(frequency) SSradio.remove_object(src,frequency) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index d06d431e268..cc3722e56fd 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -65,6 +65,11 @@ explosion_block = EXPLOSION_BLOCK_PROC RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, .proc/check_security_level) + var/static/list/loc_connections = list( + COMSIG_ATOM_MAGICALLY_UNLOCKED = .proc/on_magic_unlock, + ) + AddElement(/datum/element/connect_loc, loc_connections) + /obj/machinery/door/examine(mob/user) . = ..() if(red_alert_access) @@ -483,5 +488,10 @@ zap_flags &= ~ZAP_OBJ_DAMAGE . = ..() +/// Signal proc for [COMSIG_ATOM_MAGICALLY_UNLOCKED]. Open up when someone casts knock. +/obj/machinery/door/proc/on_magic_unlock(datum/source, obj/effect/proc_holder/spell/aoe_turf/knock/spell, mob/living/caster) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, .proc/open) #undef DOOR_CLOSE_WAIT diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index b9e2967e794..b80e748a2bb 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -78,6 +78,7 @@ return //Why var/static/list/loc_connections = list( COMSIG_CARBON_DISARM_COLLIDE = .proc/locker_carbon, + COMSIG_ATOM_MAGICALLY_UNLOCKED = .proc/on_magic_unlock, ) AddElement(/datum/element/connect_loc, loc_connections) @@ -720,4 +721,11 @@ log_combat(src, target, "shoved", "into [src] (locker/crate)") return COMSIG_CARBON_SHOVE_HANDLED +/// Signal proc for [COMSIG_ATOM_MAGICALLY_UNLOCKED]. Unlock and open up when we get knock casted. +/obj/structure/closet/proc/on_magic_unlock(datum/source, obj/effect/proc_holder/spell/aoe_turf/knock/spell, mob/living/caster) + SIGNAL_HANDLER + + locked = FALSE + INVOKE_ASYNC(src, .proc/open) + #undef LOCKER_FULL diff --git a/code/modules/spells/spell_types/knock.dm b/code/modules/spells/spell_types/knock.dm index 921bbe5a9e0..83b16bd89f7 100644 --- a/code/modules/spells/spell_types/knock.dm +++ b/code/modules/spells/spell_types/knock.dm @@ -14,18 +14,5 @@ /obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets,mob/user = usr) SEND_SOUND(user, sound('sound/magic/knock.ogg')) - for(var/turf/T in targets) - for(var/obj/machinery/door/door in T.contents) - INVOKE_ASYNC(src, .proc/open_door, door) - for(var/obj/structure/closet/C in T.contents) - INVOKE_ASYNC(src, .proc/open_closet, C) - -/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_door(obj/machinery/door/door) - if(istype(door, /obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/A = door - A.locked = FALSE - door.open() - -/obj/effect/proc_holder/spell/aoe_turf/knock/proc/open_closet(obj/structure/closet/C) - C.locked = FALSE - C.open() + for(var/turf/nearby_turf in targets) + SEND_SIGNAL(nearby_turf, COMSIG_ATOM_MAGICALLY_UNLOCKED, src, user)