From 839ca019471896a420b9502b8b557afd0cb7488d Mon Sep 17 00:00:00 2001 From: Lohikar Date: Tue, 29 Aug 2017 16:09:41 -0500 Subject: [PATCH] Global Listeners (#3373) SSwireless is dead, long live Global Listeners. --- aurorastation.dme | 6 +- code/__defines/subsystem-defines.dm | 3 + code/__defines/subsystem-priority.dm | 25 +- .../controllers/subsystems/global_listener.dm | 27 ++ code/controllers/subsystems/wireless.dm | 84 ---- .../{wireless => global_listener}/devices.dm | 413 +++++++++--------- code/modules/global_listener/interfaces.dm | 85 ++++ code/modules/recycling/conveyor2.dm | 54 +-- code/modules/wireless/interfaces.dm | 114 ----- 9 files changed, 368 insertions(+), 443 deletions(-) create mode 100644 code/controllers/subsystems/global_listener.dm delete mode 100644 code/controllers/subsystems/wireless.dm rename code/modules/{wireless => global_listener}/devices.dm (87%) create mode 100644 code/modules/global_listener/interfaces.dm delete mode 100644 code/modules/wireless/interfaces.dm diff --git a/aurorastation.dme b/aurorastation.dme index bcdca12702a..ae1db30e503 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -153,6 +153,7 @@ #include "code\controllers\subsystems\falling.dm" #include "code\controllers\subsystems\garbage-debug.dm" #include "code\controllers\subsystems\garbage.dm" +#include "code\controllers\subsystems\global_listener.dm" #include "code\controllers\subsystems\icon_cache.dm" #include "code\controllers\subsystems\icon_smooth.dm" #include "code\controllers\subsystems\icon_updates.dm" @@ -178,7 +179,6 @@ #include "code\controllers\subsystems\timer.dm" #include "code\controllers\subsystems\trade.dm" #include "code\controllers\subsystems\vote.dm" -#include "code\controllers\subsystems\wireless.dm" #include "code\controllers\subsystems\initialization\asteroid.dm" #include "code\controllers\subsystems\initialization\atoms.dm" #include "code\controllers\subsystems\initialization\minimap.dm" @@ -1312,6 +1312,8 @@ #include "code\modules\games\tarot.dm" #include "code\modules\genetics\side_effects.dm" #include "code\modules\ghosttrap\trap.dm" +#include "code\modules\global_listener\devices.dm" +#include "code\modules\global_listener\interfaces.dm" #include "code\modules\holodeck\HolodeckControl.dm" #include "code\modules\holodeck\HolodeckObjects.dm" #include "code\modules\holodeck\HolodeckPrograms.dm" @@ -2193,8 +2195,6 @@ #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" #include "code\modules\web_interface\webint_procs.dm" -#include "code\modules\wireless\devices.dm" -#include "code\modules\wireless\interfaces.dm" #include "code\modules\xgm\xgm_gas_data.dm" #include "code\modules\xgm\xgm_gas_mixture.dm" #include "code\unit_tests\equipment_tests.dm" diff --git a/code/__defines/subsystem-defines.dm b/code/__defines/subsystem-defines.dm index e175903a945..c763b3b8c5a 100644 --- a/code/__defines/subsystem-defines.dm +++ b/code/__defines/subsystem-defines.dm @@ -80,3 +80,6 @@ // -- SSmachinery -- #define RECIPE_LIST(T) (SSmachinery.recipe_datums["[T]"]) + +// -- SSlistener -- +#define GET_LISTENERS(id) (id ? SSlistener.listeners["[id]"] : null) diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index 123fb1981bb..92217b1f301 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -1,16 +1,15 @@ -#define SS_INIT_JOBS 21 -#define SS_INIT_MISC_FIRST 20 -#define SS_INIT_SEEDS 19 // Plant controller setup. -#define SS_INIT_ASTEROID 18 // Asteroid generation. -#define SS_INIT_SHUTTLE 17 // Shuttle setup. -#define SS_INIT_PARALLAX 16 // Parallax image cache generation. Must run before ghosts are able to join. -#define SS_INIT_HOLOMAP 15 -#define SS_INIT_ATOMS 14 // World initialization. Will trigger lighting updates. Observers can join after this loads. -#define SS_INIT_POWER 13 // Initial powernet build. -#define SS_INIT_CARGO 12 // Random warehouse generation. Runs after SSatoms because it assumes objects are initialized when it runs. -#define SS_INIT_PIPENET 11 // Initial pipenet build. -#define SS_INIT_MACHINERY 10 // Machinery prune and powernet build. -#define SS_INIT_WIRELESS 9 // Wireless pair queue flush. +#define SS_INIT_JOBS 20 +#define SS_INIT_MISC_FIRST 19 +#define SS_INIT_SEEDS 18 // Plant controller setup. +#define SS_INIT_ASTEROID 17 // Asteroid generation. +#define SS_INIT_SHUTTLE 16 // Shuttle setup. +#define SS_INIT_PARALLAX 15 // Parallax image cache generation. Must run before ghosts are able to join. +#define SS_INIT_HOLOMAP 14 +#define SS_INIT_ATOMS 13 // World initialization. Will trigger lighting updates. Observers can join after this loads. +#define SS_INIT_POWER 12 // Initial powernet build. +#define SS_INIT_CARGO 11 // Random warehouse generation. Runs after SSatoms because it assumes objects are initialized when it runs. +#define SS_INIT_PIPENET 10 // Initial pipenet build. +#define SS_INIT_MACHINERY 9 // Machinery prune and powernet build. #define SS_INIT_AIR 8 // Air setup and pre-bake. #define SS_INIT_NIGHT 7 // Nightmode controller. Will trigger lighting updates. #define SS_INIT_SMOOTHING 6 // Object icon smoothing. Creates overlays. diff --git a/code/controllers/subsystems/global_listener.dm b/code/controllers/subsystems/global_listener.dm new file mode 100644 index 00000000000..a4abb318f50 --- /dev/null +++ b/code/controllers/subsystems/global_listener.dm @@ -0,0 +1,27 @@ +var/datum/controller/subsystem/listener/SSlistener + +/datum/controller/subsystem/listener + name = "Global Listener" + flags = SS_NO_INIT | SS_NO_FIRE + + var/list/listeners = list() + +/datum/controller/subsystem/listener/New() + NEW_SS_GLOBAL(SSlistener) + +/datum/controller/subsystem/listener/Recover() + listeners = SSlistener.listeners + +/datum/controller/subsystem/listener/stat_entry() + ..("L:[listeners.len]") + +/datum/controller/subsystem/listener/proc/register(listener/L) + LAZYINITLIST(listeners[L.channel]) + listeners[L.channel][L] = TRUE + +/datum/controller/subsystem/listener/proc/unregister(listener/L) + if (listeners[L.channel]) + listeners[L.channel] -= L + + if (!LAZYLEN(listeners[L.channel])) + listeners[L.channel] = null diff --git a/code/controllers/subsystems/wireless.dm b/code/controllers/subsystems/wireless.dm deleted file mode 100644 index d4deb16c061..00000000000 --- a/code/controllers/subsystems/wireless.dm +++ /dev/null @@ -1,84 +0,0 @@ -var/datum/controller/subsystem/wireless/SSwireless - -/datum/controller/subsystem/wireless - name = "Wireless" - flags = SS_BACKGROUND - priority = SS_PRIORITY_WIRELESS - init_order = SS_INIT_WIRELESS - - var/list/receiver_list = list() - var/list/pending_connections = list() - var/list/retry_connections = list() - var/list/failed_connections = list() - - var/total_processed_connections = 0 - -/datum/controller/subsystem/wireless/New() - NEW_SS_GLOBAL(SSwireless) - -/datum/controller/subsystem/wireless/Recover() - receiver_list = SSwireless.receiver_list - -/datum/controller/subsystem/wireless/stat_entry() - ..("RL:[receiver_list.len] PC:[pending_connections.len] RC:[retry_connections.len] FC:[failed_connections.len] TC:[total_processed_connections]") - -/datum/controller/subsystem/wireless/proc/add_device(datum/wifi/receiver/R) - LAZYINITLIST(receiver_list) - receiver_list |= R - - wake() - -/datum/controller/subsystem/wireless/proc/remove_device(datum/wifi/receiver/R) - if (receiver_list) - receiver_list -= R - -/datum/controller/subsystem/wireless/proc/add_request(datum/connection_request/C) - LAZYADD(pending_connections, C) - -/datum/controller/subsystem/wireless/proc/process_connection(datum/connection_request/connection, list/fail_queue) - var/target_found = 0 - for (var/datum/wifi/receiver/R in receiver_list) - if (R.id == connection.id) - var/datum/wifi/sender/S = connection.source - S.connect_device(R) - R.connect_device(S) - target_found = 1 - if (!target_found) - fail_queue += connection - - total_processed_connections += 1 - -/datum/controller/subsystem/wireless/Initialize() - fire(0, 1) - fire(0, 1) // So we suspend. - ..() - -/datum/controller/subsystem/wireless/fire(resumed = 0, no_mc_check = 0) - if (!resumed && !LAZYLEN(pending_connections) && !LAZYLEN(retry_connections)) - suspend() - return - - var/list/pending = pending_connections - var/list/retry = retry_connections - - while (retry.len) - var/datum/connection_request/C = retry[retry.len] - retry.len-- - - process_connection(C, failed_connections) - - if (no_mc_check) - CHECK_TICK - else if (MC_TICK_CHECK) - return - - while (pending.len) - var/datum/connection_request/C = pending[pending.len] - pending.len-- - - process_connection(C, retry_connections) - - if (no_mc_check) - CHECK_TICK - else if (MC_TICK_CHECK) - return diff --git a/code/modules/wireless/devices.dm b/code/modules/global_listener/devices.dm similarity index 87% rename from code/modules/wireless/devices.dm rename to code/modules/global_listener/devices.dm index 62173f2d6a1..e62b8db8390 100644 --- a/code/modules/wireless/devices.dm +++ b/code/modules/global_listener/devices.dm @@ -1,199 +1,214 @@ -//------------------------------- -// Buttons -// Sender: intended to be used by buttons, when the button is pressed it will call activate() on all connected /button -// receivers. -// Receiver: does whatever the subtype does. deactivate() by default calls activate(), so you will have to override in -// it in a subtype if you want it to do something. -//------------------------------- -/datum/wifi/sender/button/activate(mob/living/user) - for(var/datum/wifi/receiver/button/B in connected_devices) - B.activate(user) - -/datum/wifi/sender/button/deactivate(mob/living/user) - for(var/datum/wifi/receiver/button/B in connected_devices) - B.deactivate(user) - -/datum/wifi/receiver/button/proc/activate(mob/living/user) - -/datum/wifi/receiver/button/proc/deactivate(mob/living/user) - activate(user) //override this if you want deactivate to actually do something - -//------------------------------- -// Doors -// Sender: sends an open/close request to all connected /door receivers. Utilises spawn_sync to trigger all doors to -// open at approximately the same time. Waits until all doors have finished opening before returning. -// Receiver: will try to open/close the parent door when activate/deactivate is called. -//------------------------------- - -// Sender procs -/datum/wifi/sender/door/activate(var/command) - if(!command) - return - - var/datum/spawn_sync/S = new() - - for(var/datum/wifi/receiver/button/door/D in connected_devices) - S.start_worker(D, command) - S.wait_until_done() - return - -//Receiver procs -/datum/wifi/receiver/button/door/proc/open() - var/obj/machinery/door/D = parent - if(istype(D) && D.can_open()) - D.open() - -/datum/wifi/receiver/button/door/proc/close() - var/obj/machinery/door/D = parent - if(istype(D) && D.can_close()) - D.close() - -/datum/wifi/receiver/button/door/proc/lock() - var/obj/machinery/door/airlock/D = parent - if(istype(D)) - D.lock() - -/datum/wifi/receiver/button/door/proc/unlock() - var/obj/machinery/door/airlock/D = parent - if(istype(D)) - D.unlock() - -/datum/wifi/receiver/button/door/proc/enable_idscan() - var/obj/machinery/door/airlock/D = parent - if(istype(D)) - D.set_idscan(1) - -/datum/wifi/receiver/button/door/proc/disable_idscan() - var/obj/machinery/door/airlock/D = parent - if(istype(D)) - D.set_idscan(0) - -/datum/wifi/receiver/button/door/proc/enable_safeties() - var/obj/machinery/door/airlock/D = parent - if(istype(D)) - D.set_safeties(1) - -/datum/wifi/receiver/button/door/proc/disable_safeties() - var/obj/machinery/door/airlock/D = parent - if(istype(D)) - D.set_safeties(0) - -/datum/wifi/receiver/button/door/proc/electrify() - var/obj/machinery/door/airlock/D = parent - if(istype(D)) - D.electrify(-1) - -/datum/wifi/receiver/button/door/proc/unelectrify() - var/obj/machinery/door/airlock/D = parent - if(istype(D)) - D.electrify(0) - -//------------------------------- -// Emitter -// Activates/deactivates the parent emitter. -//------------------------------- -/datum/wifi/receiver/button/emitter/activate(mob/living/user) - ..() - var/obj/machinery/power/emitter/E = parent - if(istype(E) && !E.active) - E.activate(user) //if the emitter is not active, trigger the activate proc to toggle it - -/datum/wifi/receiver/button/emitter/deactivate(mob/living/user) - var/obj/machinery/power/emitter/E = parent - if(istype(E) && E.active) - E.activate(user) //if the emitter is active, trigger the activate proc to toggle it - -//------------------------------- -// Crematorium -// Triggers cremate() on the parent /crematorium. -//------------------------------- -/datum/wifi/receiver/button/crematorium/activate(mob/living/user) - ..() - var/obj/structure/crematorium/C = parent - if(istype(C)) - C.cremate(user) - -//------------------------------- -// Mounted Flash -// Triggers flash() on the parent /flasher. -//------------------------------- -/datum/wifi/receiver/button/flasher/activate(mob/living/user) - ..() - var/obj/machinery/flasher/F = parent - if(istype(F)) - F.flash() - -//------------------------------- -// Holosign -// Turns the parent /holosign on/off. -//------------------------------- -/datum/wifi/receiver/button/holosign/activate(mob/living/user) - ..() - var/obj/machinery/holosign/H = parent - if(istype(H) && !H.lit) - H.toggle() - -/datum/wifi/receiver/button/holosign/deactivate(mob/living/user) - var/obj/machinery/holosign/H = parent - if(istype(H) && H.lit) - H.toggle() - -//------------------------------- -// Igniter -// Turns the parent /igniter on/off. -//------------------------------- -/datum/wifi/receiver/button/igniter/activate(mob/living/user) - ..() - var/obj/machinery/igniter/I = parent - if(istype(I)) - if(!I.on) - I.ignite() - -/datum/wifi/receiver/button/igniter/deactivate(mob/living/user) - if(istype(parent, /obj/machinery/igniter)) - var/obj/machinery/igniter/I = parent - if(I.on) - I.ignite() - -//------------------------------- -// Sparker -// Triggers the parent /sparker to ignite(). -//------------------------------- -/datum/wifi/receiver/button/sparker/activate(mob/living/user) - ..() - var/obj/machinery/sparker/S = parent - if(istype(S)) - S.ignite() - -//------------------------------- -// Mass Driver -// Sender: carries out a sequence of first opening all connected doors, then activating all connected mass drivers, -// then closes all connected doors. It will wait before continuing the sequence after opening/closing the doors. -// Receiver: Triggers the parent mass dirver to activate. -//------------------------------- -/datum/wifi/sender/mass_driver/activate() - var/datum/spawn_sync/S = new() - - //tell all doors to open - for(var/datum/wifi/receiver/button/door/D in connected_devices) - S.start_worker(D, "open") - S.wait_until_done() - S.reset() - //tell all mass drivers to launch - for(var/datum/wifi/receiver/button/mass_driver/M in connected_devices) - spawn() - M.activate() - sleep(20) - - //tell all doors to close - S.reset() - for(var/datum/wifi/receiver/button/door/D in connected_devices) - S.start_worker(D, "close") - S.wait_until_done() - return - -/datum/wifi/receiver/button/mass_driver/activate(mob/living/user) - ..() - var/obj/machinery/mass_driver/M = parent - if(istype(M)) - M.drive() +//------------------------------- +// Buttons +// Sender: intended to be used by buttons, when the button is pressed it will call activate() on all connected /button +// receivers. +// Receiver: does whatever the subtype does. deactivate() by default calls activate(), so you will have to override in +// it in a subtype if you want it to do something. +//------------------------------- +/datum/wifi/sender/button/activate(mob/living/user) + for(var/thing in GET_LISTENERS(id)) + var/listener/L = thing + var/datum/wifi/receiver/button/B = L.target + B.activate(user) + +/datum/wifi/sender/button/deactivate(mob/living/user) + for(var/thing in GET_LISTENERS(id)) + var/listener/L = thing + var/datum/wifi/receiver/button/B = L.target + B.deactivate(user) + +/datum/wifi/receiver/button/proc/activate(mob/living/user) + +/datum/wifi/receiver/button/proc/deactivate(mob/living/user) + activate(user) //override this if you want deactivate to actually do something + +//------------------------------- +// Doors +// Sender: sends an open/close request to all connected /door receivers. Utilises spawn_sync to trigger all doors to +// open at approximately the same time. Waits until all doors have finished opening before returning. +// Receiver: will try to open/close the parent door when activate/deactivate is called. +//------------------------------- + +// Sender procs +/datum/wifi/sender/door/activate(var/command) + if(!command) + return + + var/datum/spawn_sync/S = new() + + for (var/thing in GET_LISTENERS(id)) + var/listener/L = thing + var/datum/wifi/receiver/button/door/D = L.target + S.start_worker(D, command) + S.wait_until_done() + +//Receiver procs +/datum/wifi/receiver/button/door/proc/open() + var/obj/machinery/door/D = parent + if(istype(D) && D.can_open()) + D.open() + +/datum/wifi/receiver/button/door/proc/close() + var/obj/machinery/door/D = parent + if(istype(D) && D.can_close()) + D.close() + +/datum/wifi/receiver/button/door/proc/lock() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.lock() + +/datum/wifi/receiver/button/door/proc/unlock() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.unlock() + +/datum/wifi/receiver/button/door/proc/enable_idscan() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.set_idscan(1) + +/datum/wifi/receiver/button/door/proc/disable_idscan() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.set_idscan(0) + +/datum/wifi/receiver/button/door/proc/enable_safeties() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.set_safeties(1) + +/datum/wifi/receiver/button/door/proc/disable_safeties() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.set_safeties(0) + +/datum/wifi/receiver/button/door/proc/electrify() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.electrify(-1) + +/datum/wifi/receiver/button/door/proc/unelectrify() + var/obj/machinery/door/airlock/D = parent + if(istype(D)) + D.electrify(0) + +//------------------------------- +// Emitter +// Activates/deactivates the parent emitter. +//------------------------------- +/datum/wifi/receiver/button/emitter/activate(mob/living/user) + ..() + var/obj/machinery/power/emitter/E = parent + if(istype(E) && !E.active) + E.activate(user) //if the emitter is not active, trigger the activate proc to toggle it + +/datum/wifi/receiver/button/emitter/deactivate(mob/living/user) + var/obj/machinery/power/emitter/E = parent + if(istype(E) && E.active) + E.activate(user) //if the emitter is active, trigger the activate proc to toggle it + +//------------------------------- +// Crematorium +// Triggers cremate() on the parent /crematorium. +//------------------------------- +/datum/wifi/receiver/button/crematorium/activate(mob/living/user) + ..() + var/obj/structure/crematorium/C = parent + if(istype(C)) + C.cremate(user) + +//------------------------------- +// Mounted Flash +// Triggers flash() on the parent /flasher. +//------------------------------- +/datum/wifi/receiver/button/flasher/activate(mob/living/user) + ..() + var/obj/machinery/flasher/F = parent + if(istype(F)) + F.flash() + +//------------------------------- +// Holosign +// Turns the parent /holosign on/off. +//------------------------------- +/datum/wifi/receiver/button/holosign/activate(mob/living/user) + ..() + var/obj/machinery/holosign/H = parent + if(istype(H) && !H.lit) + H.toggle() + +/datum/wifi/receiver/button/holosign/deactivate(mob/living/user) + var/obj/machinery/holosign/H = parent + if(istype(H) && H.lit) + H.toggle() + +//------------------------------- +// Igniter +// Turns the parent /igniter on/off. +//------------------------------- +/datum/wifi/receiver/button/igniter/activate(mob/living/user) + ..() + var/obj/machinery/igniter/I = parent + if(istype(I)) + if(!I.on) + I.ignite() + +/datum/wifi/receiver/button/igniter/deactivate(mob/living/user) + if(istype(parent, /obj/machinery/igniter)) + var/obj/machinery/igniter/I = parent + if(I.on) + I.ignite() + +//------------------------------- +// Sparker +// Triggers the parent /sparker to ignite(). +//------------------------------- +/datum/wifi/receiver/button/sparker/activate(mob/living/user) + ..() + var/obj/machinery/sparker/S = parent + if(istype(S)) + S.ignite() + +//------------------------------- +// Mass Driver +// Sender: carries out a sequence of first opening all connected doors, then activating all connected mass drivers, +// then closes all connected doors. It will wait before continuing the sequence after opening/closing the doors. +// Receiver: Triggers the parent mass dirver to activate. +//------------------------------- +/datum/wifi/sender/mass_driver/activate() + var/datum/spawn_sync/S = new() + + //tell all doors to open + for (var/thing in GET_LISTENERS(id)) + var/listener/L = thing + var/datum/wifi/receiver/button/door/D = L.target + if (istype(D)) + S.start_worker(D, "open") + + S.wait_until_done() + S.reset() + //tell all mass drivers to launch + for (var/thing in GET_LISTENERS(id)) + var/listener/L = thing + var/datum/wifi/receiver/button/mass_driver/M = L.target + if (istype(M)) + spawn() + M.activate() + sleep(20) + + //tell all doors to close + S.reset() + for (var/thing in GET_LISTENERS(id)) + var/listener/L = thing + var/datum/wifi/receiver/button/door/D = L.target + if (istype(D)) + S.start_worker(D, "close") + S.wait_until_done() + return + +/datum/wifi/receiver/button/mass_driver/activate(mob/living/user) + ..() + var/obj/machinery/mass_driver/M = parent + if(istype(M)) + M.drive() diff --git a/code/modules/global_listener/interfaces.dm b/code/modules/global_listener/interfaces.dm new file mode 100644 index 00000000000..d185c3b5374 --- /dev/null +++ b/code/modules/global_listener/interfaces.dm @@ -0,0 +1,85 @@ + +// -- Global Listeners -- +/* +This is basically just a simple way to add a reference to an object to an automatically maintained & named global list. + Lists are indexed by a string ID, and the lists can contain any /datum type. + +Creating a listener: + +/obj/myobj + var/listener/listener + +/obj/myobj/Initialize() + . = ..() + listener = new("myid", src) + +/obj/myobj/Destroy() + QDEL_NULL(listener) + return ..() + +Iterating through a listener list: + +/proc/print_myobj() + for (var/thing in GET_LISTENERS("myid")) + var/listener/L = thing + world << L.target + +*/ + +/listener + var/datum/target + var/channel + +/listener/New(listening_channel, datum/target) + channel = listening_channel + if (istype(target)) + src.target = target + + SSlistener.register(src) + +/listener/Destroy() + SSlistener.unregister(src) + target = null + return ..() + +//------------------------------- +// Wifi (Deprecated, use /listener instead) +//------------------------------- +/datum/wifi + var/obj/parent + var/id + +/datum/wifi/New(new_id, obj/O) + id = new_id + if(istype(O)) + parent = O + +/datum/wifi/Destroy(wifi/device) + parent = null + return ..() + +//------------------------------- +// Receiver +//------------------------------- +/datum/wifi/receiver + var/listener/listener + +/datum/wifi/receiver/New() + ..() + listener = new(id, src) + +/datum/wifi/receiver/Destroy() + QDEL_NULL(listener) + return ..() + +//------------------------------- +// Sender +//------------------------------- +/datum/wifi/sender/proc/set_target(new_target) + id = new_target + +/datum/wifi/sender/proc/activate(mob/living/user) + return + +/datum/wifi/sender/proc/deactivate(mob/living/user) + return diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index bc3c4efbfcb..29123d77204 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -1,20 +1,6 @@ //conveyor2 is pretty much like the original, except it supports corners, but not diverters. //note that corner pieces transfer stuff clockwise when running forward, and anti-clockwise backwards. -/datum/wifi/sender/conveyor/proc/set_dir(direction) - for (var/datum/wifi/receiver/conveyor/C in connected_devices) - C.direction_change(direction) - -/datum/wifi/receiver/conveyor/proc/direction_change(direction) - var/obj/machinery/conveyor/C = parent - C.operating = direction - C.setmove() - -/datum/wifi/receiver/conveyor/switch/direction_change(direction) - var/obj/machinery/conveyor_switch/S = parent - S.position = direction - S.update() - /obj/machinery/conveyor icon = 'icons/obj/recycling.dmi' icon_state = "conveyor0" @@ -30,7 +16,8 @@ var/list/affecting // the list of all items that will be moved this ptick var/id = "" // the control ID - must match controller ID - var/datum/wifi/receiver/conveyor/antenna + + var/listener/antenna /obj/machinery/conveyor/centcom_auto id = "round_end_belt" @@ -213,25 +200,12 @@ anchored = 1 - var/datum/wifi/receiver/conveyor/switch/receiver - var/datum/wifi/sender/conveyor/transmitter - - /obj/machinery/conveyor_switch/Initialize(mapload, newid) . = ..() if(!id) id = newid update() - if (id) - receiver = new(id, src) - transmitter = new(id, src) - -/obj/machinery/conveyor_switch/Destroy() - QDEL_NULL(receiver) - QDEL_NULL(transmitter) - return ..() - // update the icon depending on the position /obj/machinery/conveyor_switch/proc/update() @@ -262,7 +236,17 @@ operated = 1 update() - transmitter.set_dir(position) + for (var/thing in GET_LISTENERS(id)) + var/listener/L = thing + var/obj/machinery/conveyor/C = L.target + if (istype(C)) + C.operating = position + C.setmove() + else + var/obj/machinery/conveyor_switch/S = L.target + if (istype(S)) + S.position = position + S.update() /obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params) if(iscrowbar(I)) @@ -286,7 +270,17 @@ operated = 1 update() - transmitter.set_dir(position) + for (var/thing in GET_LISTENERS(id)) + var/listener/L = thing + var/obj/machinery/conveyor/C = L.target + if (istype(C)) + C.operating = position + C.setmove() + else + var/obj/machinery/conveyor_switch/S = L.target + if (istype(S)) + S.position = position + S.update() // // CONVEYOR CONSTRUCTION STARTS HERE diff --git a/code/modules/wireless/interfaces.dm b/code/modules/wireless/interfaces.dm deleted file mode 100644 index 7d50608a5f1..00000000000 --- a/code/modules/wireless/interfaces.dm +++ /dev/null @@ -1,114 +0,0 @@ -//------------------------------- -/* - Interfaces - - These are the datums that an object needs to connect via the wireless controller. You will need a /wifi/receiver to - allow other devices to connect to your device and send it instructions. You will need a /wifi/sender to send signals - to other devices with wifi receivers. You can have multiple devices (senders and receivers) if you program your - device to handle them. - - Each wifi interface has one "id". This identifies which devices can connect to each other. Multiple senders can - connect to multiple receivers as long as they have the same id. - - Variants are found in devices.dm - - To add a receiver to an object: - Add the following variables to the object: - var/_wifi_id << variable that can be configured on the map, this is passed to the receiver later - var/datum/wifi/receiver/subtype/wifi_receiver << the receiver (and subtype itself) - - Add or modify the objects initialize() proc to include: - if(_wifi_id) << only creates a wifi receiver if an id is set - wifi_receiver = new(_wifi_id, src) << this needs to be in initialize() as New() is usually too - early, and the receiver will try to connect to the controller - before it is setup. - - Add or modify the objects Destroy() proc to include: - QDEL_NULL(wifi_receiver) - - Senders are setup the same way, except with a var/datum/wifi/sender/subtype/wifi_sender variable instead of (or in - addition to) a /wifi/receiver variable. - You will however need to call the /wifi/senders code to pass commands onto any connected receivers. - Example: - obj/machinery/button/attack_hand() - wifi_sender.activate() -*/ -//------------------------------- - - -//------------------------------- -// Wifi -//------------------------------- -/datum/wifi - var/obj/parent - var/list/connected_devices - var/id - -/datum/wifi/New(new_id, obj/O) - connected_devices = new() - id = new_id - if(istype(O)) - parent = O - -/datum/wifi/Destroy(wifi/device) - parent = null - for(var/datum/wifi/D in connected_devices) - D.disconnect_device(src) - disconnect_device(D) - return ..() - -/datum/wifi/proc/connect_device(datum/wifi/device) - if(connected_devices) - connected_devices |= device - else - connected_devices = new() - connected_devices |= device - -/datum/wifi/proc/disconnect_device(datum/wifi/device) - if(connected_devices) - connected_devices -= device - -//------------------------------- -// Receiver -//------------------------------- -/datum/wifi/receiver/New() - ..() - if(SSwireless) - SSwireless.add_device(src) - -/datum/wifi/receiver/Destroy() - if(SSwireless) - SSwireless.remove_device(src) - return ..() - -//------------------------------- -// Sender -//------------------------------- -/datum/wifi/sender/New() - ..() - send_connection_request() - -/datum/wifi/sender/proc/set_target(new_target) - id = new_target - -/datum/wifi/sender/proc/send_connection_request() - var/datum/connection_request/C = new(src, id) - SSwireless.add_request(C) - -/datum/wifi/sender/proc/activate(mob/living/user) - return - -/datum/wifi/sender/proc/deactivate(mob/living/user) - return - -//------------------------------- -// Connection request -//------------------------------- -/datum/connection_request - var/datum/wifi/sender/source //wifi/sender object creating the request - var/id //id tag of the target device(s) to try to connect to - -/datum/connection_request/New(datum/wifi/sender/sender, receiver) - if(istype(sender)) - source = sender - id = receiver