mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-05-17 22:19:01 +01:00
212 lines
6.3 KiB
Plaintext
212 lines
6.3 KiB
Plaintext
//This is a big messy copy & paste job of several things and thus has been banished to its own file.
|
|
//Shouldve probably done it like ibm and have based it on a networked thing instead of duplicating it all here.
|
|
//im coder
|
|
|
|
/obj/item/mechanics/networkcomp
|
|
name = "Powernet-networking component"
|
|
desc = ""
|
|
icon = 'icons/obj/networked.dmi'
|
|
icon_state = "generic-p"
|
|
|
|
var/net_id = null
|
|
var/host_id = null //Who are we connected to? (If we have a single host)
|
|
var/old_host_id = null //Were we previously connected to someone? Do we care?
|
|
var/obj/machinery/power/data_terminal/link = null
|
|
var/device_tag = "PNET_MECHNET"
|
|
|
|
var/last_reset = 0 //Last world.time we were manually reset.
|
|
var/net_number = 0 //A cute little bitfield (0-3 exposed) to allow multiple networks on one wirenet. Differentiate between intended hosts, if they care
|
|
|
|
var/self_only = 1
|
|
|
|
var/ready = 1
|
|
|
|
New()
|
|
. = ..()
|
|
src.net_id = generate_net_id(src)
|
|
verbs -= /obj/item/mechanics/verb/setvalue
|
|
mechanics.addInput("send packet", "spacket")
|
|
|
|
verb/togglenwcomps()
|
|
set src in view(1)
|
|
set name = "\[Toggle Self-only messages\]"
|
|
set desc = "Sets whether the component only listens to messages adressed to it."
|
|
|
|
if (!istype(usr, /mob/living))
|
|
return
|
|
if (usr.stat)
|
|
return
|
|
if (!mechanics.allowChange(usr))
|
|
boutput(usr, "<span style=\"color:red\">[MECHFAILSTRING]</span>")
|
|
return
|
|
|
|
self_only = !self_only
|
|
boutput(usr, "[self_only ? "Now only processing messages adressed at us.":"Now processing all messages recieved."]")
|
|
return
|
|
|
|
proc/spacket(var/datum/mechanicsMessage/input)
|
|
if(!ready) return
|
|
ready = 0
|
|
spawn(20) ready = 1
|
|
post_raw(input.signal)
|
|
return
|
|
|
|
proc/post_raw(var/rawstring)
|
|
if(!src.link)
|
|
return
|
|
|
|
var/datum/signal/signal = get_free_signal()
|
|
signal.source = src
|
|
signal.transmission_method = TRANSMISSION_WIRE
|
|
|
|
var/list/inputlist = params2list(rawstring)
|
|
|
|
for(var/x in inputlist)
|
|
signal.data[x] = inputlist[x]
|
|
|
|
src.link.post_signal(src, signal)
|
|
|
|
proc/post_status(var/target_id, var/key, var/value, var/key2, var/value2, var/key3, var/value3, var/key4, var/value4)
|
|
if(!src.link || !target_id)
|
|
return
|
|
|
|
var/datum/signal/signal = get_free_signal()
|
|
signal.source = src
|
|
signal.transmission_method = TRANSMISSION_WIRE
|
|
signal.data[key] = value
|
|
if(key2)
|
|
signal.data[key2] = value2
|
|
if(key3)
|
|
signal.data[key3] = value3
|
|
if(key4)
|
|
signal.data[key4] = value4
|
|
|
|
signal.data["address_1"] = target_id
|
|
signal.data["sender"] = src.net_id
|
|
|
|
src.link.post_signal(src, signal)
|
|
|
|
//command=term_message&data=command=trigger&data=yoursignal&adress_1=targetId&sender=senderId
|
|
|
|
proc/sendRaw(var/datum/signal/S)
|
|
var/dataStr = ""//list2params(S.data) Using list2params() will result in weird glitches if the data already contains a set of params, like in terminal comms
|
|
for (var/i in S.data)
|
|
dataStr += "[i][isnull(S.data[i]) ? ";" : "=[S.data[i]];"]"
|
|
var/datum/mechanicsMessage/msg = mechanics.newSignal(dataStr)
|
|
mechanics.fireOutgoing(msg)
|
|
animate_flash_color_fill(src,"#00AA00",1, 1)
|
|
return
|
|
|
|
proc/post_file(var/target_id, var/key, var/value, var/file)
|
|
if(!src.link || !target_id)
|
|
return
|
|
|
|
var/datum/signal/signal = get_free_signal()
|
|
signal.source = src
|
|
signal.transmission_method = TRANSMISSION_WIRE
|
|
signal.data[key] = value
|
|
if(file)
|
|
var/datum/computer/file/F = file
|
|
signal.data_file = F.copy_file()
|
|
|
|
signal.data["address_1"] = target_id
|
|
signal.data["command"] = "term_file"
|
|
signal.data["sender"] = src.net_id
|
|
|
|
src.link.post_signal(src, signal)
|
|
|
|
disposing()
|
|
if (src.link)
|
|
src.link.master = null
|
|
src.link = null
|
|
|
|
..()
|
|
|
|
attackby(obj/item/W as obj, mob/user as mob)
|
|
if(..(W, user))
|
|
if(src.level == 1) //wrenched down
|
|
var/turf/T = get_turf(src)
|
|
var/obj/machinery/power/data_terminal/test_link = locate() in T
|
|
src.icon_state = "generic0"
|
|
if(test_link && !test_link.is_valid_master(test_link.master))
|
|
src.link = test_link
|
|
src.link.master = src
|
|
src.icon_state = "generic1"
|
|
else if (src.level == 2) //loose
|
|
resetConnection()
|
|
src.icon_state = "generic-p"
|
|
if(src.link)
|
|
src.link.master = null
|
|
src.link = null
|
|
return
|
|
|
|
proc/resetConnection()
|
|
if(!host_id)
|
|
return
|
|
|
|
var/rem_host = src.host_id ? src.host_id : src.old_host_id
|
|
src.host_id = null
|
|
src.old_host_id = null
|
|
src.post_status(rem_host, "command","term_disconnect")
|
|
spawn(5)
|
|
src.post_status(rem_host, "command","term_connect","device",src.device_tag)
|
|
return
|
|
|
|
receive_signal(datum/signal/signal)
|
|
if(!src.link)
|
|
return
|
|
|
|
if(!signal || !src.net_id || signal.encryption || (signal.source == src))
|
|
return
|
|
|
|
if(signal.transmission_method != TRANSMISSION_WIRE) //No radio for us thanks
|
|
return
|
|
|
|
var/target = signal.data["sender"]
|
|
|
|
if((signal.data["address_1"] != src.net_id))
|
|
if((signal.data["address_1"] == "ping") && ((signal.data["net"] == null) || ("[signal.data["net"]]" == "[src.net_number]")) && signal.data["sender"])
|
|
spawn(5)
|
|
src.post_status(target, "command", "ping_reply", "device", src.device_tag, "netid", src.net_id, "net", "[net_number]")
|
|
|
|
if(self_only) return
|
|
|
|
sendRaw(signal)
|
|
|
|
var/sigcommand = lowertext(signal.data["command"])
|
|
if(sigcommand && signal.data["sender"])
|
|
switch(sigcommand)
|
|
if("term_connect") //Terminal interface stuff.
|
|
if(target == src.host_id)
|
|
//WHAT IS THIS, HOW COULD THIS HAPPEN??
|
|
src.host_id = null
|
|
src.updateUsrDialog()
|
|
spawn(3)
|
|
src.post_status(target, "command","term_disconnect")
|
|
return
|
|
|
|
if(src.host_id)
|
|
return
|
|
|
|
src.host_id = target
|
|
src.old_host_id = target
|
|
if(signal.data["data"] != "noreply")
|
|
src.post_status(target, "command","term_connect","data","noreply","device",src.device_tag)
|
|
src.updateUsrDialog()
|
|
spawn(2) //Sign up with the driver (if a mainframe contacted us)
|
|
src.post_status(target,"command","term_message","data","command=register&data=MECHNET")
|
|
return
|
|
|
|
if("term_ping")
|
|
if(target != src.host_id)
|
|
return
|
|
if(signal.data["data"] == "reply")
|
|
src.post_status(target, "command","term_ping")
|
|
return
|
|
|
|
if("term_disconnect")
|
|
if(target == src.host_id)
|
|
src.host_id = null
|
|
return
|
|
|
|
return |