diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index ee2a2b054c8..9765618ae03 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -62,3 +62,11 @@ obj/item/weapon/circuitboard/rdserver "/obj/item/weapon/stock_parts/manipulator" = 1, "/obj/item/weapon/stock_parts/micro_laser" = 1, "/obj/item/weapon/stock_parts/console_screen" = 1) + +obj/item/weapon/circuitboard/ntnet_relay + name = "Circuit board (NTNet Quantum Relay)" + build_path = "/obj/machinery/ntnet_relay" + board_type = "machine" + origin_tech = list(TECH_DATA = 4) + req_components = list( + "/obj/item/stack/cable_coil" = 15) diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 99754e579e3..e68734301f6 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -2,20 +2,94 @@ /obj/machinery/ntnet_relay name = "NTNet Quantum Relay" desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile." - use_power = 1 - idle_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. + use_power = 2 + active_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. + idle_power_usage = 100 icon_state = "bus" anchored = 1 density = 1 var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame. + var/enabled = 1 // Set to 0 if the relay was turned off + var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack + + // Denial of Service attack variables + var/dos_overload = 0 // Amount of DoS "packets" in this relay's buffer + var/dos_capacity = 500 // Amount of DoS "packets" in buffer required to crash the relay + var/dos_dissipate = 1 // Amount of DoS "packets" dissipated over time. + // TODO: Implement more logic here. For now it's only a placeholder. /obj/machinery/ntnet_relay/proc/is_operational() if(stat & (BROKEN | NOPOWER | EMPED)) return 0 + if(dos_failure) + return 0 + if(!enabled) + return 0 return 1 +/obj/machinery/ntnet_relay/update_icon() + if(is_operational()) + icon_state = "bus" + else + icon_state = "bus_off" + +/obj/machinery/ntnet_relay/process() + if(is_operational()) + use_power = 2 + else + use_power = 1 + + if(dos_overload) + dos_overload = max(0, dos_overload - dos_dissipate) + + // If DoS traffic exceeded capacity, crash. + if((dos_overload > dos_capacity) && !dos_failure) + dos_failure = 1 + update_icon() + ntnet_global.add_log("Quantum relay switched from normal operation mode to overload recovery mode.") + // If the DoS buffer reaches 0 again, restart. + if((dos_overload == 0) && dos_failure) + dos_failure = 0 + update_icon() + ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.") + ..() + +/obj/machinery/ntnet_relay/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state) + var/list/data = list() + data["enabled"] = enabled + data["dos_capacity"] = dos_capacity + data["dos_overload"] = dos_overload + data["dos_crashed"] = dos_failure + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "ntnet_relay.tmpl", "NTNet Quantum Relay", 500, 300, state = state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) + +/obj/machinery/ntnet_relay/attack_hand(var/mob/living/user) + ui_interact(user) + +/obj/machinery/ntnet_relay/Topic(href, href_list) + if(..()) + return 1 + if(href_list["restart"]) + dos_overload = 0 + dos_failure = 0 + update_icon() + ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.") + else if(href_list["toggle"]) + enabled = !enabled + ntnet_global.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].") + update_icon() + /obj/machinery/ntnet_relay/New() + component_parts = list() + component_parts += new /obj/item/stack/cable_coil(src,15) + component_parts += new /obj/item/weapon/circuitboard/ntnet_relay(src) + if(ntnet_global) ntnet_global.relays.Add(src) NTNet = ntnet_global @@ -27,4 +101,24 @@ ntnet_global.relays.Remove(src) ntnet_global.add_log("Quantum relay connection severed. Current amount of linked relays: [NTNet.relays.len]") NTNet = null + ..() + +/obj/machinery/ntnet_relay/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/weapon/screwdriver)) + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + panel_open = !panel_open + user << "You [panel_open ? "open" : "close"] the maintenance hatch" + return + if(istype(W, /obj/item/weapon/crowbar)) + if(!panel_open) + user << "Open the maintenance panel first." + return + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + user << "You disassemble \the [src]!" + + for(var/atom/movable/A in component_parts) + A.forceMove(src.loc) + new/obj/machinery/constructable_frame/machine_frame(src.loc) + qdel(src) + return ..() \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/nttransfer.dm b/code/modules/modular_computers/file_system/programs/nttransfer.dm index 53e85afbe33..f3271491ba7 100644 --- a/code/modules/modular_computers/file_system/programs/nttransfer.dm +++ b/code/modules/modular_computers/file_system/programs/nttransfer.dm @@ -4,7 +4,7 @@ var/global/nttransfer_uid = 0 filename = "nttransfer" filedesc = "NTNet P2P Transfer Client" program_icon_state = "generic" - size = 1 + size = 5 requires_ntnet = 1 requires_ntnet_feature = NTNET_PEERTOPEER network_destination = "other device via P2P tunnel" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 2201b484b64..2b62790b76d 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1434,6 +1434,13 @@ CIRCUITS BELOW build_path = /obj/item/weapon/circuitboard/shield_cap sort_string = "VAAAC" +/datum/design/circuit/ntnet_relay + name = "NTNet Quantum Relay" + id = "ntnet_relay" + req_tech = list(TECH_DATA = 4) + build_path = /obj/item/weapon/circuitboard/ntnet_relay + sort_string = "WAAAA" + /datum/design/circuit/aicore name = "AI core" id = "aicore" diff --git a/nano/templates/ntnet_relay.tmpl b/nano/templates/ntnet_relay.tmpl new file mode 100644 index 00000000000..d3b5409bf57 --- /dev/null +++ b/nano/templates/ntnet_relay.tmpl @@ -0,0 +1,26 @@ +{{if data.dos_crashed}} +

NETWORK BUFFERS OVERLOADED

+

Overload Recovery Mode

+ This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue. +

ADMINISTRATIVE OVERRIDE

+ CAUTION - Data loss may occur + {{:helper.link('Purge buffered traffic', null, { 'restart' : 1 })}} +{{else}} +
+ Relay status: +
+
+ {{if data.enabled}} + {{:helper.link('ENABLED', null, { 'toggle' : 1 })}} + {{else}} + {{:helper.link('DISABLED', null, { 'toggle' : 1 })}} + {{/if}} + +
+
+ Network buffer status: +
+
+ {{:data.dos_overload}} / {{:data.dos_capacity}} GQ +
+{{/if}} \ No newline at end of file