[new_name] already in use.")
+ return
+
+ to_chat(usr, "Network name changed from [network_name] to [new_name].")
+ network_name = new_name
+
+ if("blacklist_design")
+ var/design_uid = params["d_uid"]
+ var/datum/design/D = locateUID(design_uid)
+
+ // If null design, ignore
+ if(!istype(D))
+ return
+
+ // If not one of our designs, disallow
+ if(!(D.id in research_files.known_designs))
+ return
+
+ message_admins("[key_name_admin(usr)] blacklisted [D.name] from the R&D network [network_name].")
+ log_game("[key_name(usr)] blacklisted [D.name] from the R&D network [network_name].")
+ research_files.known_designs -= D.id
+ research_files.blacklisted_designs += D.id
+ research_files.RefreshResearch()
+
+ if("unblacklist_design")
+ var/design_uid = params["d_uid"]
+ var/datum/design/D = locateUID(design_uid)
+
+ // If null design, ignore
+ if(!istype(D, /datum/design))
+ return
+
+ // If not one of our designs, disallow
+ if(!(D.id in research_files.blacklisted_designs))
+ return
+
+ message_admins("[key_name_admin(usr)] unblacklisted [D.name] from the R&D network [network_name].")
+ log_game("[key_name(usr)] unblacklisted [D.name] from the R&D network [network_name].")
+ research_files.unblacklisted_designs += D.id
+ research_files.blacklisted_designs -= D.id
+ research_files.RefreshResearch()
+
+ // Set network password
+ if("network_password")
+ var/new_password = tgui_input_text(usr, "Please enter a new network ID", "Network ID", network_password)
+ if(!Adjacent(usr))
+ return
+ to_chat(usr, "Network password changed from [network_password] to [new_password].")
+ network_password = new_password
+
+ // Remove a device
+ if("unlink_device")
+ switch(params["dclass"])
+ if("SRV")
+ if(!(params["uid"] in servers))
+ message_admins("[key_name_admin(usr)] attempted a href exploit with [src]")
+ return
+
+ var/choice = tgui_alert(usr, "Are you SURE you want to unlink this device?", "Unlink", list("Yes", "No"))
+ if(choice != "Yes" || !Adjacent(usr))
+ return
+
+ var/obj/machinery/r_n_d/server/S = locateUID(params["uid"])
+ servers -= params["uid"]
+ if(S)
+ S.unlink()
+ to_chat(usr, "Successfully unlinked [S.name] from the network [network_name]")
+ return
+
+ if("RDC")
+ if(!(params["uid"] in consoles))
+ message_admins("[key_name_admin(usr)] attempted a href exploit with [src]")
+ return
+
+ var/choice = tgui_alert(usr, "Are you SURE you want to unlink this device?", "Unlink", list("Yes", "No"))
+ if(choice != "Yes" || !Adjacent(usr))
+ return
+
+ var/obj/machinery/computer/rdconsole/RDC = locateUID(params["uid"])
+ consoles -= params["uid"]
+ if(RDC)
+ RDC.unlink()
+ to_chat(usr, "Successfully unlinked [RDC.name] from the network [network_name]")
+ return
+
+ if("MFB")
+ if(!(params["uid"] in mechfabs))
+ message_admins("[key_name_admin(usr)] attempted a href exploit with [src]")
+ return
+
+ var/choice = tgui_alert(usr, "Are you SURE you want to unlink this device?", "Unlink", list("Yes", "No"))
+ if(choice != "Yes" || !Adjacent(usr))
+ return
+
+ var/obj/machinery/mecha_part_fabricator/MPF = locateUID(params["uid"])
+ mechfabs -= params["uid"]
+ if(MPF)
+ MPF.unlink()
+ to_chat(usr, "Successfully unlinked [MPF.name] from the network [network_name]")
+ return
+
+ if("BCK")
+ if(!(params["uid"] in backupconsoles))
+ message_admins("[key_name_admin(usr)] attempted a href exploit with [src]")
+ return
+
+ var/choice = tgui_alert(usr, "Are you SURE you want to unlink this device?", "Unlink", list("Yes", "No"))
+ if(choice != "Yes" || !Adjacent(usr))
+ return
+
+ var/obj/machinery/computer/rnd_backup/RB = locateUID(params["uid"])
+ backupconsoles -= params["uid"]
+ if(RB)
+ RB.unlink()
+ to_chat(usr, "Successfully unlinked [RB.name] from the network [network_name]")
+ return
+
+
+// Presets
+/obj/machinery/computer/rnd_network_controller/station
+ network_name = "station_rnd"
+
+/obj/machinery/computer/rnd_network_controller/golems
+ network_name = "golems_rnd"
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 7cad823802a..bf0a268eabb 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -1,48 +1,33 @@
+// These currently dont actually do anything
+// They will serve a purpose once the R&D rework is done
+
/obj/machinery/r_n_d/server
- name = "R&D Server"
+ name = "\improper R&D Server"
icon = 'icons/obj/machines/research.dmi'
icon_state = "RD-server-off"
- var/datum/research/files
- var/health = 100
- var/list/id_with_upload = list() //List of R&D consoles with upload to server access.
- var/list/id_with_download = list() //List of R&D consoles with download from server access.
- var/id_with_upload_string = "" //String versions for easy editing in map editor.
- var/id_with_download_string = ""
- var/server_id = 0
- var/heat_gen = 100
- var/heating_power = 40000
- var/delay = 10
- req_access = list(ACCESS_RD) //Only the R&D can change server settings.
- var/plays_sound = 0
+ /// ID to autolink to, used in mapload
+ var/autolink_id = null
+ /// UID of the network that we use
+ var/network_manager_uid = null
+
/obj/machinery/r_n_d/server/Initialize(mapload)
- . = ..()
+ ..()
component_parts = list()
component_parts += new /obj/item/circuitboard/rdserver(null)
component_parts += new /obj/item/stock_parts/scanning_module(null)
component_parts += new /obj/item/stack/cable_coil(null,1)
component_parts += new /obj/item/stack/cable_coil(null,1)
RefreshParts()
- initialize_serv(); //Agouri // fuck you agouri
+ return INITIALIZE_HINT_LATELOAD
-/obj/machinery/r_n_d/server/upgraded/Initialize(mapload)
- . = ..()
- component_parts = list()
- component_parts += new /obj/item/circuitboard/rdserver(null)
- component_parts += new /obj/item/stock_parts/scanning_module/phasic(null)
- component_parts += new /obj/item/stack/cable_coil(null,1)
- component_parts += new /obj/item/stack/cable_coil(null,1)
- RefreshParts()
-/obj/machinery/r_n_d/server/Destroy()
- griefProtection()
- return ..()
+/obj/machinery/r_n_d/server/LateInitialize()
+ for(var/obj/machinery/computer/rnd_network_controller/RNC in GLOB.rnd_network_managers)
+ if(RNC.network_name == autolink_id)
+ network_manager_uid = RNC.UID()
+ RNC.servers += UID()
-/obj/machinery/r_n_d/server/RefreshParts()
- var/tot_rating = 0
- for(var/obj/item/stock_parts/SP in src)
- tot_rating += SP.rating
- heat_gen /= max(1, tot_rating)
/obj/machinery/r_n_d/server/update_icon_state()
if(stat & NOPOWER)
@@ -50,341 +35,113 @@
else
icon_state = "RD-server-on"
+
/obj/machinery/r_n_d/server/power_change()
if(!..())
return
update_icon(UPDATE_ICON_STATE)
-/obj/machinery/r_n_d/server/proc/initialize_serv()
- if(!files)
- files = new /datum/research(src)
- var/list/temp_list
- if(!length(id_with_upload))
- temp_list = list()
- temp_list = splittext(id_with_upload_string, ";")
- for(var/N in temp_list)
- id_with_upload += text2num(N)
- if(!length(id_with_download))
- temp_list = list()
- temp_list = splittext(id_with_download_string, ";")
- for(var/N in temp_list)
- id_with_download += text2num(N)
-
-/obj/machinery/r_n_d/server/process()
- if(prob(3) && plays_sound)
- playsound(loc, "computer_ambience", 10, TRUE, ignore_walls = FALSE)
-
- var/turf/T = get_turf(src)
- var/datum/gas_mixture/environment = T.get_readonly_air()
- switch(environment.temperature())
- if(0 to T0C)
- health = min(100, health + 1)
- if(T0C to (T20C + 20))
- health = clamp(health, 0, 100)
- if((T20C + 20) to INFINITY)
- health = max(0, health - 1)
- if(health <= 0)
- /*griefProtection() This seems to get called twice before running any code that deletes/damages the server or it's files anwyay.
- refreshParts and the hasReq procs that get called by this are laggy and do not need to be called by every server on the map every tick */
- var/updateRD = 0
- files.known_designs = list()
- for(var/v in files.known_tech)
- var/datum/tech/tech = files.known_tech[v]
- // Slowly decrease research if health drops below 0
- if(prob(1))
- updateRD++
- tech.level--
- if(updateRD)
- files.RefreshResearch()
- if(delay)
- delay--
- else
- produce_heat(heat_gen)
- delay = initial(delay)
-
-/obj/machinery/r_n_d/server/emp_act(severity)
- griefProtection()
- ..()
-
-
-/obj/machinery/r_n_d/server/ex_act(severity)
- griefProtection()
- return ..()
-
-/obj/machinery/r_n_d/server/blob_act(obj/structure/blob/B)
- griefProtection()
- return ..()
-
-// Backup files to CentComm to help admins recover data after griefer attacks
-/obj/machinery/r_n_d/server/proc/griefProtection()
- for(var/obj/machinery/r_n_d/server/centcom/C in GLOB.machines)
- files.push_data(C.files)
-
-/obj/machinery/r_n_d/server/proc/produce_heat(heat_amt)
- var/datum/milla_safe/rnd_server_heat/milla = new()
- milla.invoke_async(src, heat_amt)
-
-/datum/milla_safe/rnd_server_heat
-
-/datum/milla_safe/rnd_server_heat/on_run(obj/machinery/r_n_d/server/server, heat)
- var/turf/T = get_turf(server)
- var/datum/gas_mixture/env = get_turf_air(T)
-
- if(server.stat & (NOPOWER|BROKEN))
- return
- if(env.temperature() >= (heat + T0C))
- return
-
- var/transfer_moles = 0.25 * env.total_moles()
-
- var/datum/gas_mixture/removed = env.remove(transfer_moles)
- if(!removed)
- return
-
- var/heat_capacity = removed.heat_capacity()
- if(heat_capacity == 0 || heat_capacity == null)
- heat_capacity = 1
- removed.set_temperature(min((removed.temperature() * heat_capacity + server.heating_power) / heat_capacity, 1000))
- env.merge(removed)
/obj/machinery/r_n_d/server/crowbar_act(mob/living/user, obj/item/I)
if(!panel_open)
return
. = TRUE
- griefProtection()
default_deconstruction_crowbar(user, I)
+
/obj/machinery/r_n_d/server/screwdriver_act(mob/living/user, obj/item/I)
default_deconstruction_screwdriver(user, "RD-server-on_t", "RD-server-on", I)
return TRUE
-/obj/machinery/r_n_d/server/centcom
- name = "CentComm. Central R&D Database"
- server_id = -1
+/obj/machinery/r_n_d/server/proc/unlink()
+ network_manager_uid = null
+ SStgui.update_uis(src)
-/obj/machinery/r_n_d/server/centcom/Initialize()
- . = ..()
- var/list/no_id_servers = list()
- var/list/server_ids = list()
- for(var/obj/machinery/r_n_d/server/S in GLOB.machines)
- switch(S.server_id)
- if(-1)
- continue
- if(0)
- no_id_servers += S
- else
- server_ids += S.server_id
-
- for(var/obj/machinery/r_n_d/server/S in no_id_servers)
- var/num = 1
- while(!S.server_id)
- if(num in server_ids)
- num++
- else
- S.server_id = num
- server_ids += num
- no_id_servers -= S
-
-/obj/machinery/r_n_d/server/centcom/process()
- return PROCESS_KILL //don't need process()
+/obj/machinery/r_n_d/server/attack_hand(mob/user)
+ ui_interact(user)
-/obj/machinery/computer/rdservercontrol
- name = "\improper R&D server controller"
- icon_screen = "rdcomp"
- icon_keyboard = "rd_key"
- light_color = LIGHT_COLOR_FADEDPURPLE
- circuit = /obj/item/circuitboard/rdservercontrol
- var/screen = 0
- var/obj/machinery/r_n_d/server/temp_server
- var/list/servers = list()
- var/list/consoles = list()
- var/badmin = 0
+/obj/machinery/r_n_d/server/ui_interact(mob/user, datum/tgui/ui = null)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "RndServer", name)
+ ui.open()
-/obj/machinery/computer/rdservercontrol/Topic(href, href_list)
+
+/obj/machinery/r_n_d/server/ui_data(mob/user)
+ var/list/data = list()
+
+ var/obj/machinery/computer/rnd_network_controller/RNC
+ if(network_manager_uid)
+ RNC = locateUID(network_manager_uid)
+
+ if(!network_manager_uid || !RNC)
+ network_manager_uid = null
+ data["network_name"] = null
+
+ var/list/controllers = list()
+ for(var/obj/machinery/computer/rnd_network_controller/RNC2 in GLOB.rnd_network_managers)
+ if(atoms_share_level(RNC2, src))
+ controllers += list(list("addr" = "\ref[RNC2]", "netname" = RNC2.network_name))
+
+ data["controllers"] = controllers
+
+ return data // Short circuit here, we aint linked
+
+ // Network metadata
+ data["network_name"] = RNC.network_name
+ data["linked_core_addr"] = "\ref[RNC]"
+
+ return data
+
+
+/obj/machinery/r_n_d/server/ui_act(action, list/params)
+ // Check against href exploits
if(..())
return
- add_fingerprint(usr)
- usr.set_machine(src)
- if(!src.allowed(usr) && !emagged)
- to_chat(usr, "You do not have the required access level")
- return
+ . = TRUE
- if(href_list["main"])
- screen = 0
-
- else if(href_list["access"] || href_list["data"] || href_list["transfer"])
- temp_server = null
- consoles = list()
- servers = list()
- for(var/obj/machinery/r_n_d/server/S in GLOB.machines)
- if(istype(S, /obj/machinery/r_n_d/server/centcom) && !badmin)
- continue
- if(!atoms_share_level(get_turf(src), get_turf(S)) && !badmin)
- continue
- if(S.server_id == text2num(href_list["access"]) || S.server_id == text2num(href_list["data"]) || S.server_id == text2num(href_list["transfer"]))
- temp_server = S
- break
- if(href_list["access"])
- screen = 1
- for(var/obj/machinery/computer/rdconsole/C in GLOB.machines)
- if(C.sync)
- consoles += C
- else if(href_list["data"])
- screen = 2
- else if(href_list["transfer"])
- screen = 3
- for(var/obj/machinery/r_n_d/server/S in GLOB.machines)
- if(S == src)
- continue
- servers += S
-
- else if(href_list["upload_toggle"])
- var/num = text2num(href_list["upload_toggle"])
- for(var/obj/machinery/computer/rdconsole/C in consoles)
- if(C.id != num)
- continue
-
- if(!atoms_share_level(get_turf(src), get_turf(C)) && !badmin)
- to_chat(usr, "Unable to modify upload protocols of this console; is it in the same sector?")
+ switch(action)
+ if("unlink")
+ if(!network_manager_uid)
return
- if(num in temp_server.id_with_upload)
- temp_server.id_with_upload -= num
- else
- temp_server.id_with_upload += num
+ var/choice = tgui_alert(usr, "Are you SURE you want to unlink this server?\nYou won't be able to re-link without the network password", "Unlink", list("Yes", "No"))
+ if(choice == "Yes")
+ // To the person who asks "Why not call unlink() here"
+ // Well, all it does is null the network manager UID and update the ui
+ // and we already update the UI at the end of this
+ var/obj/machinery/computer/rnd_network_controller/RNC = locateUID(network_manager_uid)
+ if(RNC)
+ RNC.servers -= UID()
+ network_manager_uid = null
- else if(href_list["download_toggle"])
- var/num = text2num(href_list["download_toggle"])
- if(num in temp_server.id_with_download)
- temp_server.id_with_download -= num
- else
- temp_server.id_with_download += num
+ // You should only be able to link if its not linked, to prevent weirdness
+ if("link")
+ if(network_manager_uid)
+ return
- else if(href_list["reset_tech"])
- var/choice = tgui_alert(usr, "Technology Data Reset", "Are you sure you want to reset this technology to its default data? Data lost cannot be recovered.", list("Continue", "Cancel"))
- if(choice == "Continue")
- for(var/I in temp_server.files.known_tech)
- var/datum/tech/T = temp_server.files.known_tech[I]
- if(T.id == href_list["reset_tech"])
- T.level = 1
- break
- temp_server.files.RefreshResearch()
+ var/obj/machinery/computer/rnd_network_controller/RNC = locate(params["addr"])
+ if(istype(RNC, /obj/machinery/computer/rnd_network_controller))
+ // No linking unless were on the same Z
+ if(!atoms_share_level(RNC, src))
+ return
- else if(href_list["reset_design"])
- var/choice = tgui_alert(usr, "Design Data Deletion", "Are you sure you want to blacklist this design? Ensure you sync servers after this decision.", list("Continue", "Cancel"))
- if(choice == "Continue")
- for(var/I in temp_server.files.known_designs)
- var/datum/design/D = temp_server.files.known_designs[I]
- if(D.id == href_list["reset_design"])
- temp_server.files.known_designs -= D.id
- temp_server.files.blacklisted_designs += D.id
- message_admins("[key_name_admin(usr)] blacklisted [D.name] from the rnd server controler.")
- log_game("[key_name(usr)] blacklisted [D.name] from the rnd server controler.")
- break
- temp_server.files.RefreshResearch()
-
- else if(href_list["restore_design"])
- var/choice = tgui_alert(usr, "Design Data Restoration", "Are you sure you want to restore this design? Ensure you sync servers after this decision.", list("Continue", "Cancel"))
- if(choice == "Continue")
- temp_server.files.blacklisted_designs -= href_list["restore_design"]
- temp_server.files.unblacklisted_designs += href_list["restore_design"]
- message_admins("[key_name_admin(usr)] unblacklisted [href_list["restore_design"]] from the rnd server controler.")
- log_game("[key_name(usr)] unblacklisted [href_list["restore_design"]] from the rnd server controler.")
- temp_server.files.RefreshResearch()
-
- updateUsrDialog()
- return
-
-/obj/machinery/computer/rdservercontrol/attack_hand(mob/user as mob)
- if(stat & (BROKEN|NOPOWER))
- return
- user.set_machine(src)
- var/dat = ""
-
- switch(screen)
- if(0) //Main Menu
- dat += "Connected Servers:oI}aby5fkO-MTemi-h3h_^0sY;ED2m_y=ILO{lKU
z4cFOY_EaZ?g5gtIT2vz}AUIWoe`$%Yr>%s}mg4y{5`970=!UD8{50F(B{yB|=(;sg
zmT+>IGGkb$6wg`Tdz Q!ews1^H8r~jDT0PTUJVFe)u7E-h
zFwK_U5;`zX_SiYk_wHwWbO@W@)2~dX-N{>M`)PPyle6}DdOcwDsBkm?;>`^m{BBVg
zK~V0_eB=!Rld0cGu)NOT)j(v-dtUiZcoMHvIJe L2sTRI@EEW#29v*8#TTvxlK6v2*(gG{h04ZCKlYwWj*aF4!y^E
zsps`|Wv0uX?k^GQ5u=s{H@juIf}I3=VLnKix4+n*Mib`4rwD@C7nYO|AB;e1v+w^a
z!P+spr%(GoIacd4%^LKtE9uz6YP2<@8qcBkw+I1 8A+js2`2R~$33B}uOj-cLz
zL^%{v{ia6@DG#rkVSKjhRyXW)N~;5`2_)YqCI&+MSU{9Ng;3?HNc0GUc2`*8T?zIP
zK}2H`;YP*h2aO4kXzaw4?`2qELHTHYS8-p-CyuJJqAWD4@aX1!m|jNH#6rbDS;P9n
z_H5S?E$m5Shp>X&(wkt+CLatWu~mRd<^c=cUHc?PXG^cu(@n#2p9BOXl4I=?YaXV9
z(Ev@}sWQR@9mXQ74%JJ6sD^BEGprsH%wt{g=CdE081pk92x=;|OZf9hQA;DmT6x~-
zmthI>CyTFrm)$S6M^w&CEkb2Q%*gi5ZC9rz-r0tS>#jt68@s}p&Zv3BR={VxlC)+l
zOx*q_8|@PC6_xVr!DbVy$-ZV2+^Q$w^}&)-W_C8)=o$ic6Efc%puaVH&H>^&Acc0<
z ZCa$8@q!)$BH*jkf}n(nblFwCJ0mZ?*t;=+a#XTQxyEJ?bmdxYRJed
zi3PIvuJfLs-z8)57P}s{ZIbi61>wzSdc=yI^H%Z zR-;HR5;EXc_N4Wy^KaMb
z``~6~YIi0WJHCM*TL)zGBF~POgQW^Dj!QB?dPgdye8f4xJ!mD
zkju97?=t{&TeF+C4
>Po^=d^7tXXNa=9=gH7pcAn
zNcG|0g85V_sV%`cLYpOAQTepUXZM4t{=HSfQm06}I{pkU;REPb1^V*>%ffF?k+|C2
zzD~HFcmX@+$y|I+)t7QhXsB|Bg6z%75D;KSU64`p1B)a&oM~@Fwqn_w<1