From 33de05337f8f486e31251c973f05dc33a6908917 Mon Sep 17 00:00:00 2001 From: Stakks Date: Tue, 10 Apr 2018 18:40:54 -0500 Subject: [PATCH] Stage 3 --- code/datums/EPv2.dm | 127 +++++++++++++ code/game/machinery/exonet_node.dm | 173 ++++++++++++++++++ .../machinery/telecomms/machines/relay.dm | 14 ++ code/modules/research/designs.dm | 9 +- icons/obj/stationobjs.dmi | Bin 90110 -> 92604 bytes nano/templates/exonet_node.tmpl | 40 ++++ tgstation.dme | 1 + 7 files changed, 363 insertions(+), 1 deletion(-) create mode 100644 code/datums/EPv2.dm create mode 100644 code/game/machinery/exonet_node.dm create mode 100644 nano/templates/exonet_node.tmpl diff --git a/code/datums/EPv2.dm b/code/datums/EPv2.dm new file mode 100644 index 0000000000000..f0e912fa55a95 --- /dev/null +++ b/code/datums/EPv2.dm @@ -0,0 +1,127 @@ +/* +Exonet Protocol Version 2 + +This is designed to be a fairly simple fake-networking system, allowing you to send and receive messages +between the exonet_protocol datums, and for atoms to react to those messages, based on the contents of the message. +Hopefully, this can evolve to be a more robust fake-networking system and allow for some devious network hacking in the future. + +Version 1 never existed. + +*Setting up* + +To set up the exonet link, define a variable on your desired atom it is like this; + var/datum/exonet_protocol/exonet = null +Afterwards, before you want to do networking, call exonet = New(src), then exonet.make_address(string), and give it a string to hash into the new IP. +The reason it needs a string is so you can have the addresses be persistant, assuming no-one already took it first. + +When you're no longer wanting to use the address and want to free it up, like when you want to Destroy() it, you need to call remove_address() + +*Sending messages* + +To send a message to another datum, you need to know it's EPv2 (fake IP) address. Once you know that, call send_message(), place your +intended address in the first argument, then the message in the second. For example, send_message(exonet.address, "ping") will make you +ping yourself. + +*Receiving messages* +You don't need to do anything special to receive the messages, other than give your target exonet datum an address as well. Once something hits +your datum with send_message(), receive_message() is called, and the default action is to call receive_exonet_message() on the datum's holder. +You'll want to override receive_exonet_message() on your atom, and define what will occur when the message is received. +The receiving atom will receive the origin atom (the atom that sent the message), the origin address, and finally the message itself. +It's suggested to start with an if or switch statement for the message, to determine what to do. +*/ + +var/global/list/all_exonet_connections = list() + +/datum/exonet_protocol + var/address = "" //Resembles IPv6, but with only five 'groups', e.g. XXXX:XXXX:XXXX:XXXX:XXXX + var/atom/movable/holder = null + +/datum/exonet_protocol/New(var/atom/holder) + src.holder = holder + ..() + + +// Proc: make_address() +// Parameters: 1 (string - used to make into a hash that will be part of the new address) +// Description: Allocates a new address based on the string supplied. It results in consistant addresses for each round assuming it is not already taken.. +/datum/exonet_protocol/proc/make_address(var/string) + if(string) + var/new_address = null + while(new_address == find_address(new_address)) //Collision test. + var/hash = md5(string) + var/raw_address = copytext(hash,1,25) + var/addr_0 = "fc00" //Used for unique local address in real-life IPv6. + var/addr_1 = hexadecimal_to_EPv2(raw_address) + + new_address = "[addr_0]:[addr_1]" + string = "[string]0" //If we did get a collision, this should make the next attempt not have one. + sleep(1) + address = new_address + all_exonet_connections |= src + + +// Proc: make_arbitrary_address() +// Parameters: 1 (new_address - the desired address) +// Description: Allocates that specific address, if it is available. +/datum/exonet_protocol/proc/make_arbitrary_address(var/new_address) + if(new_address) + if(new_address == find_address(new_address) ) //Collision test. + return 0 + address = new_address + all_exonet_connections |= src + return 1 + +// Proc: hexadecimal_to_EPv2() +// Parameters: 1 (hex - a string of hexadecimals to convert) +// Description: Helper proc to add colons to a string in the right places. +/proc/hexadecimal_to_EPv2(var/hex) + if(!hex) + return null + var/addr_1 = copytext(hex,1,5) + var/addr_2 = copytext(hex,5,9) + var/addr_3 = copytext(hex,9,13) + var/addr_4 = copytext(hex,13,17) + var/new_address = "[addr_1]:[addr_2]:[addr_3]:[addr_4]" + return new_address + + +// Proc: remove_address() +// Parameters: None +// Description: Deallocates the address, freeing it for use. +/datum/exonet_protocol/proc/remove_address() + address = "" + all_exonet_connections.Remove(src) + + +// Proc: find_address() +// Parameters: 1 (target_address - the desired address to find) +// Description: Searches the global list all_exonet_connections for a specific address, and returns it if found, otherwise returns null. +/datum/exonet_protocol/proc/find_address(var/target_address) + for(var/datum/exonet_protocol/exonet in all_exonet_connections) + if(exonet.address == target_address) + return exonet.address + return null + +// Proc: send_message() +// Parameters: 2 (target_address - the desired address to send the message to, message - the message to send) +// Description: Sends the message to target_address, by calling receive_message() on the desired datum. +/datum/exonet_protocol/proc/send_message(var/target_address, var/message) + if(!address) + return 0 + for(var/datum/exonet_protocol/exonet in all_exonet_connections) + if(exonet.address == target_address) + exonet.receive_message(holder, address, message) + break + +// Proc: receive_message() +// Parameters: 3 (origin_atom - the origin datum's holder, origin_address - the address the message originated from, message - the message that was sent) +// Description: Called when send_message() successfully reaches the intended datum. By default, calls receive_exonet_message() on the holder atom. +/datum/exonet_protocol/proc/receive_message(var/atom/origin_atom, var/origin_address, var/message) + holder.receive_exonet_message(origin_atom, origin_address, message) + return + +// Proc: receive_exonet_message() +// Parameters: 3 (origin_atom - the origin datum's holder, origin_address - the address the message originated from, message - the message that was sent) +// Description: Override this to make your atom do something when a message is received. +/atom/proc/receive_exonet_message(var/atom/origin_atom, var/origin_address, var/message) + return diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm new file mode 100644 index 0000000000000..682df50e60050 --- /dev/null +++ b/code/game/machinery/exonet_node.dm @@ -0,0 +1,173 @@ +/obj/machinery/exonet_node + name = "exonet node" + desc = "This machine is one of many, many nodes inside Vir's section of the Exonet, connecting the Northern Star to the rest of the system, at least \ + electronically." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "exonet_node" + idle_power_usage = 2500 + density = 1 + anchored = 1 + var/on = 1 + var/toggle = 1 + + var/allow_external_PDAs = 1 + var/allow_external_communicators = 1 + var/allow_external_newscasters = 1 + + var/opened = 0 + +// Proc: New() +// Parameters: None +// Description: Adds components to the machine for deconstruction. +/obj/machinery/exonet_node/New() + ..() + + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/telecomms/exonet_node(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/filter(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/manipulator(src) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/crystal(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src) + component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src) + component_parts += new /obj/item/stack/cable_coil(src, 2) + RefreshParts() + +// Proc: update_icon() +// Parameters: None +// Description: Self explanatory. +/obj/machinery/exonet_node/update_icon() + if(on) + if(!allow_external_PDAs && !allow_external_communicators && !allow_external_newscasters) + icon_state = "[initial(icon_state)]_idle" + else + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]_off" + +// Proc: update_power() +// Parameters: None +// Description: Sets the device on/off and adjusts power draw based on stat and toggle variables. +/obj/machinery/exonet_node/proc/update_power() + if(toggle) + if(stat & (BROKEN|NOPOWER|EMPED)) + on = 0 + idle_power_usage = 0 + else + on = 1 + idle_power_usage = 2500 + else + on = 0 + idle_power_usage = 0 + +// Proc: emp_act() +// Parameters: 1 (severity - how strong the EMP is, with lower numbers being stronger) +// Description: Shuts off the machine for awhile if an EMP hits it. Ion anomalies also call this to turn it off. +/obj/machinery/exonet_node/emp_act(severity) + if(!(stat & EMPED)) + stat |= EMPED + var/duration = (300 * 10)/severity + spawn(rand(duration - 20, duration + 20)) + stat &= ~EMPED + update_icon() + ..() + +// Proc: process() +// Parameters: None +// Description: Calls the procs below every tick. +/obj/machinery/exonet_node/process() + update_power() + +// Proc: attackby() +// Parameters: 2 (I - the item being whacked against the machine, user - the person doing the whacking) +// Description: Handles deconstruction. +/obj/machinery/exonet_node/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/weapon/screwdriver)) + default_deconstruction_screwdriver(user, I) + else if(istype(I, /obj/item/weapon/crowbar)) + default_deconstruction_crowbar(user, I) + else + ..() + +// Proc: attack_ai() +// Parameters: 1 (user - the AI clicking on the machine) +// Description: Redirects to attack_hand() +/obj/machinery/exonet_node/attack_ai(mob/user) + attack_hand(user) + +// Proc: attack_hand() +// Parameters: 1 (user - the person clicking on the machine) +// Description: Opens the NanoUI interface with ui_interact() +/obj/machinery/exonet_node/attack_hand(mob/user) + ui_interact(user) + +// Proc: ui_interact() +// Parameters: 4 (standard NanoUI arguments) +// Description: Allows the user to turn the machine on or off, or open or close certain 'ports' for things like external PDA messages, newscasters, etc. +/obj/machinery/exonet_node/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + // this is the data which will be sent to the ui + var/data = list() + + + data["on"] = on ? 1 : 0 + data["allowPDAs"] = allow_external_PDAs + data["allowCommunicators"] = allow_external_communicators + data["allowNewscasters"] = allow_external_newscasters + + // update the ui if it exists, returns null if no ui is passed/found + ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + // the ui does not exist, so we'll create a new() one + // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm + ui = new(user, src, ui_key, "exonet_node.tmpl", "Exonet Node #157", 400, 400) + // when the ui is first opened this is the data it will use + ui.set_initial_data(data) + // open the new ui window + ui.open() + // auto update every Master Controller tick + ui.set_auto_update(1) + +// Proc: Topic() +// Parameters: 2 (standard Topic arguments) +// Description: Responds to button presses on the NanoUI interface. +/obj/machinery/exonet_node/Topic(href, href_list) + if(..()) + return 1 + if(href_list["toggle_power"]) + toggle = !toggle + update_power() + if(!toggle) + var/msg = "[usr.client.key] ([usr]) has turned [src] off, at [x],[y],[z]." + message_admins(msg) + log_game(msg) + + if(href_list["toggle_PDA_port"]) + allow_external_PDAs = !allow_external_PDAs + + if(href_list["toggle_communicator_port"]) + allow_external_communicators = !allow_external_communicators + if(!allow_external_communicators) + var/msg = "[usr.client.key] ([usr]) has turned [src]'s communicator port off, at [x],[y],[z]." + message_admins(msg) + log_game(msg) + + if(href_list["toggle_newscaster_port"]) + allow_external_newscasters = !allow_external_newscasters + if(!allow_external_newscasters) + var/msg = "[usr.client.key] ([usr]) has turned [src]'s newscaster port off, at [x],[y],[z]." + message_admins(msg) + log_game(msg) + + update_icon() + SSnano.update_uis(src) + add_fingerprint(usr) + +// Proc: get_exonet_node() +// Parameters: None +// Description: Helper proc to get a reference to an Exonet node. +/proc/get_exonet_node() + for(var/obj/machinery/exonet_node/E in machines) + if(E.on) + return E diff --git a/code/game/machinery/telecomms/machines/relay.dm b/code/game/machinery/telecomms/machines/relay.dm index 51d76d47255a4..1326e569d5f3e 100644 --- a/code/game/machinery/telecomms/machines/relay.dm +++ b/code/game/machinery/telecomms/machines/relay.dm @@ -84,3 +84,17 @@ hide = 1 toggled = 0 autolinkers = list("r_relay") + +//This isn't a real telecomms board but I don't want to make a whole file to hold only one circuitboard. +/obj/item/weapon/circuitboard/telecomms/exonet_node + name = "exonet node" + build_path = "/obj/machinery/exonet_node" + origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4) + req_components = list( + "/obj/item/weapon/stock_parts/subspace/ansible" = 1, + "/obj/item/weapon/stock_parts/subspace/filter" = 1, + "/obj/item/weapon/stock_parts/manipulator" = 2, + "/obj/item/weapon/stock_parts/micro_laser" = 1, + "/obj/item/weapon/stock_parts/subspace/crystal" = 1, + "/obj/item/weapon/stock_parts/subspace/treatment" = 2, + "/obj/item/stack/cable_coil" = 2) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 1810bf3fd1727..12946977867e5 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -806,4 +806,11 @@ other types of metals and chemistry for reagents). /datum/design/circuit/integrated_circuit/time/clock id = "cc-clock" - build_path = /obj/item/integrated_circuit/time/clock \ No newline at end of file + build_path = /obj/item/integrated_circuit/time/clock + + +/datum/design/circuit/tcom/exonet_node + name = "exonet node" + id = "tcom-exonet_node" + req_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4) + build_path = /obj/item/weapon/circuitboard/telecomms/exonet_node diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index f9a90f670fd564304fece1caf622ba0d0c93f890..c20a6d3113d4288a66a074e763009ed4e0568d12 100644 GIT binary patch delta 28117 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 EKR{~O@c;k- delta 25603 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 diff --git a/nano/templates/exonet_node.tmpl b/nano/templates/exonet_node.tmpl new file mode 100644 index 0000000000000..f9d81d4e92f98 --- /dev/null +++ b/nano/templates/exonet_node.tmpl @@ -0,0 +1,40 @@ + + +

Status

+
+
+ Power: +
+
+ {{:helper.link('On', 'power', {'toggle_power' : 1}, data.on ? 'selected' : null)}}{{:helper.link('Off', 'close', {'toggle_power' : 1}, data.on ? null : 'selected', data.on ? 'redButton' : null)}} +
+
+ +

Ports

+
+
+ Incoming PDA Messages: +
+
+ {{:helper.link('Open', 'check', {'toggle_PDA_port' : 1}, data.allowPDAs ? 'selected' : null)}}{{:helper.link('Close', 'close', {'toggle_PDA_port' : 1}, data.allowPDAs ? null : 'selected')}} +
+
+
+
+ Incoming Communicators: +
+
+ {{:helper.link('Open', 'check', {'toggle_communicator_port' : 1}, data.allowCommunicators ? 'selected' : null)}}{{:helper.link('Close', 'close', {'toggle_communicator_port' : 1}, data.allowCommunicators ? null : 'selected')}} +
+
+
+
+ Incoming Newscaster Content: +
+
+ {{:helper.link('Open', 'check', {'toggle_newscaster_port' : 1}, data.allowNewscasters ? 'selected' : null)}}{{:helper.link('Close', 'close', {'toggle_newscaster_port' : 1}, data.allowNewscasters ? null : 'selected')}} +
+
diff --git a/tgstation.dme b/tgstation.dme index eaa7f073fa9fd..d73ccd96065a1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -166,6 +166,7 @@ #include "code\datums\computerfiles.dm" #include "code\datums\datacore.dm" #include "code\datums\datumvars.dm" +#include "code\datums\EPv2.dm" #include "code\datums\gas_mixture.dm" #include "code\datums\hud.dm" #include "code\datums\martial.dm"