From 9476880488f0d891bb7ae21a21ca20cb74ed620c Mon Sep 17 00:00:00 2001 From: Jamie D <993128+JamieD1@users.noreply.github.com> Date: Tue, 3 Jan 2023 23:25:19 +0000 Subject: [PATCH] [TG Update] 2 - Slows down the Statpanel MC (#17298) * E * e --- code/__DEFINES/preferences.dm | 5 +- .../subsystem/processing/fluids.dm | 4 +- code/controllers/subsystem/statpanel.dm | 207 ++++++++++++------ code/modules/admin/admin_verbs.dm | 1 + code/modules/client/client_procs.dm | 7 +- code/modules/client/preferences.dm | 3 + code/modules/client/preferences_toggles.dm | 11 + 7 files changed, 162 insertions(+), 76 deletions(-) diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 48d67d6e5ef1..a217d9cbd90a 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -29,10 +29,11 @@ #define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|SOUND_JUKEBOX|SOUND_VOX|SOUND_ALT) -//Admin Preferences +//Extra Preferences #define SPLIT_ADMIN_TABS (1<<0) +#define FAST_MC_REFRESH (1<<1) -#define TOGGLES_DEFAULT_EXTRA (NONE) +#define TOGGLES_DEFAULT_EXTRA (FAST_MC_REFRESH) //Chat toggles #define CHAT_OOC (1<<0) diff --git a/code/controllers/subsystem/processing/fluids.dm b/code/controllers/subsystem/processing/fluids.dm index c4fa13d69399..70903e0088c7 100644 --- a/code/controllers/subsystem/processing/fluids.dm +++ b/code/controllers/subsystem/processing/fluids.dm @@ -1,5 +1,5 @@ PROCESSING_SUBSYSTEM_DEF(fluids) name = "Fluids" - wait = 20 + wait = 10 stat_tag = "FD" //its actually Fluid Ducts - flags = SS_NO_INIT | SS_TICKER + flags = SS_NO_INIT diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 85ac3651e31c..dd3d1f814e8e 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -10,8 +10,18 @@ SUBSYSTEM_DEF(statpanels) var/mc_data_encoded var/list/cached_images = list() + ///how many subsystem fires between most tab updates + var/default_wait = 10 + ///how many subsystem fires between updates of the status tab + var/status_wait = 12 + ///how many subsystem fires between updates of the MC tab + var/mc_wait = 5 + ///how many full runs this subsystem has completed. used for variable rate refreshes. + var/num_fires = 0 + /datum/controller/subsystem/statpanels/fire(resumed = FALSE) if (!resumed) + num_fires++ var/datum/map_config/cached = SSmapping.next_map_config var/round_time = world.time - SSticker.round_start_time var/list/global_data = list( @@ -37,86 +47,112 @@ SUBSYSTEM_DEF(statpanels) currentrun.len-- if(!target.statbrowser_ready) continue - if(target.stat_tab == "Status") - var/ping_str = url_encode("Ping: [round(target.lastping, 1)]ms (Average: [round(target.avgping, 1)]ms)") - var/other_str = url_encode(json_encode(target.mob.get_status_tab_items())) - target << output("[encoded_global_data];[ping_str];[other_str]", "statbrowser:update") + if(target.stat_tab == "Status" && num_fires % status_wait == 0) + set_status_tab(target) if(!target.holder) target << output("", "statbrowser:remove_admin_tabs") else target << output("[!!(target.prefs.extra_toggles & SPLIT_ADMIN_TABS)]", "statbrowser:update_split_admin_tabs") if(!("MC" in target.panel_tabs)) target << output("[url_encode(target.holder.href_token)]", "statbrowser:add_admin_tabs") - if(target.stat_tab == "MC") - var/turf/eye_turf = get_turf(target.eye) - var/coord_entry = url_encode(COORD(eye_turf)) - if(!mc_data_encoded) - generate_mc_data() - target << output("[mc_data_encoded];[coord_entry]", "statbrowser:update_mc") + + //if(target.stat_tab == "MC" && (num_fires % mc_wait == 0)) + if(target.stat_tab == "MC" && ((num_fires % mc_wait == 0) || (target?.prefs.extra_toggles & FAST_MC_REFRESH))) + set_MC_tab(target) + if(!length(GLOB.sdql2_queries) && ("SDQL2" in target.panel_tabs)) target << output("", "statbrowser:remove_sdql2") - else if(length(GLOB.sdql2_queries) && (target.stat_tab == "SDQL2" || !("SDQL2" in target.panel_tabs))) - var/list/sdql2A = list() - sdql2A[++sdql2A.len] = list("", "Access Global SDQL2 List", REF(GLOB.sdql2_vv_statobj)) - var/list/sdql2B = list() - for(var/i in GLOB.sdql2_queries) - var/datum/SDQL2_query/Q = i - sdql2B = Q.generate_stat() - sdql2A += sdql2B - target << output(url_encode(json_encode(sdql2A)), "statbrowser:update_sdql2") + else if(length(GLOB.sdql2_queries) && (target.stat_tab == "SDQL2" || !("SDQL2" in target.panel_tabs)) && num_fires % default_wait == 0) + set_SDQL2_tab(target) if(target.mob) - var/mob/M = target.mob - if((target.stat_tab in target.spell_tabs) || !length(target.spell_tabs) && (length(M.mob_spell_list) || length(M.mind?.spell_list))) - var/list/proc_holders = M.get_proc_holders() - target.spell_tabs.Cut() - for(var/phl in proc_holders) - var/list/proc_holder_list = phl - target.spell_tabs |= proc_holder_list[1] - var/proc_holders_encoded = "" - if(length(proc_holders)) - proc_holders_encoded = url_encode(json_encode(proc_holders)) - target << output("[url_encode(json_encode(target.spell_tabs))];[proc_holders_encoded]", "statbrowser:update_spells") - if(M?.listed_turf) - var/mob/target_mob = M + var/mob/target_mob = target.mob + if((target.stat_tab in target.spell_tabs) || !length(target.spell_tabs) && (length(target_mob.mob_spell_list) || length(target_mob.mind?.spell_list))) + if(num_fires % default_wait == 0) + set_spells_tab(target, target_mob) + if(target_mob?.listed_turf && num_fires % default_wait == 0) if(!target_mob.TurfAdjacent(target_mob.listed_turf)) target << output("", "statbrowser:remove_listedturf") target_mob.listed_turf = null - else if(target.stat_tab == M?.listed_turf.name || !(M?.listed_turf.name in target.panel_tabs)) - var/list/overrides = list() - var/list/turfitems = list() - for(var/img in target.images) - var/image/target_image = img - if(!target_image.loc || target_image.loc.loc != target_mob.listed_turf || !target_image.override) - continue - overrides += target_image.loc - turfitems[++turfitems.len] = list("[target_mob.listed_turf]", REF(target_mob.listed_turf), icon2html(target_mob.listed_turf, target, sourceonly=TRUE)) - for(var/tc in target_mob.listed_turf) - var/atom/movable/turf_content = tc - if(turf_content.mouse_opacity == MOUSE_OPACITY_TRANSPARENT) - continue - if(turf_content.invisibility > target_mob.see_invisible) - continue - if(turf_content in overrides) - continue - if(turf_content.IsObscured()) - continue - if(length(turfitems) < 30) // only create images for the first 30 items on the turf, for performance reasons - if(!(REF(turf_content) in cached_images)) - cached_images += REF(turf_content) - turf_content.RegisterSignal(turf_content, COMSIG_PARENT_QDELETING, /atom/.proc/remove_from_cache) // we reset cache if anything in it gets deleted - if(ismob(turf_content) || length(turf_content.overlays) > 2) - turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content), costly_icon2html(turf_content, target, sourceonly=TRUE)) - else - turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content), icon2html(turf_content, target, sourceonly=TRUE)) - else - turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content)) - else - turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content)) - turfitems = url_encode(json_encode(turfitems)) - target << output("[turfitems];", "statbrowser:update_listedturf") + else if(target.stat_tab == target_mob?.listed_turf.name || !(target_mob?.listed_turf.name in target.panel_tabs)) + set_turf_examine_tab(target, target_mob) if(MC_TICK_CHECK) return +/datum/controller/subsystem/statpanels/proc/set_status_tab(client/target) + if(!encoded_global_data)//statbrowser hasnt fired yet and we were called from immediate_send_stat_data() + return + + var/ping_str = url_encode("Ping: [round(target.lastping, 1)]ms (Average: [round(target.avgping, 1)]ms)") + var/other_str = url_encode(json_encode(target.mob?.get_status_tab_items())) + target << output("[encoded_global_data];[ping_str];[other_str]", "statbrowser:update") + +/datum/controller/subsystem/statpanels/proc/set_MC_tab(client/target) + var/turf/eye_turf = get_turf(target.eye) + var/coord_entry = url_encode(COORD(eye_turf)) + if(!mc_data_encoded) + generate_mc_data() + target << output("[mc_data_encoded];[coord_entry]", "statbrowser:update_mc") + +/datum/controller/subsystem/statpanels/proc/set_SDQL2_tab(client/target) + var/list/sdql2A = list() + sdql2A[++sdql2A.len] = list("", "Access Global SDQL2 List", REF(GLOB.sdql2_vv_statobj)) + var/list/sdql2B = list() + for(var/datum/SDQL2_query/query as anything in GLOB.sdql2_queries) + sdql2B = query.generate_stat() + + sdql2A += sdql2B + target << output(url_encode(json_encode(sdql2A)), "statbrowser:update_sdql2") + +/datum/controller/subsystem/statpanels/proc/set_spells_tab(client/target, mob/target_mob) + var/list/proc_holders = target_mob.get_proc_holders() + target.spell_tabs.Cut() + + for(var/proc_holder_list as anything in proc_holders) + target.spell_tabs |= proc_holder_list[1] + + var/proc_holders_encoded = "" + if(length(proc_holders)) + proc_holders_encoded = url_encode(json_encode(proc_holders)) + + target << output("[url_encode(json_encode(target.spell_tabs))];[proc_holders_encoded]", "statbrowser:update_spells") + +/datum/controller/subsystem/statpanels/proc/set_turf_examine_tab(client/target, mob/target_mob) + var/list/overrides = list() + var/list/turfitems = list() + for(var/image/target_image as anything in target.images) + if(!target_image.loc || target_image.loc.loc != target_mob.listed_turf || !target_image.override) + continue + overrides += target_image.loc + + turfitems[++turfitems.len] = list("[target_mob.listed_turf]", REF(target_mob.listed_turf), icon2html(target_mob.listed_turf, target, sourceonly=TRUE)) + + for(var/atom/movable/turf_content as anything in target_mob.listed_turf) + if(turf_content.mouse_opacity == MOUSE_OPACITY_TRANSPARENT) + continue + if(turf_content.invisibility > target_mob.see_invisible) + continue + if(turf_content in overrides) + continue + if(turf_content.IsObscured()) + continue + + if(length(turfitems) < 10) // only create images for the first 10 items on the turf, for performance reasons + var/turf_content_ref = REF(turf_content) + if(!(turf_content_ref in cached_images)) + cached_images += turf_content_ref + turf_content.RegisterSignal(turf_content, COMSIG_PARENT_QDELETING, /atom/.proc/remove_from_cache) // we reset cache if anything in it gets deleted + + if(ismob(turf_content) || length(turf_content.overlays) > 2) + turfitems[++turfitems.len] = list("[turf_content.name]", turf_content_ref, costly_icon2html(turf_content, target, sourceonly=TRUE)) + else + turfitems[++turfitems.len] = list("[turf_content.name]", turf_content_ref, icon2html(turf_content, target, sourceonly=TRUE)) + else + turfitems[++turfitems.len] = list("[turf_content.name]", turf_content_ref) + else + turfitems[++turfitems.len] = list("[turf_content.name]", REF(turf_content)) + + turfitems = url_encode(json_encode(turfitems)) + target << output("[turfitems];", "statbrowser:update_listedturf") /datum/controller/subsystem/statpanels/proc/generate_mc_data() var/list/mc_data = list( @@ -130,12 +166,47 @@ SUBSYSTEM_DEF(statpanels) list("Failsafe Controller:", Failsafe.stat_entry(), "\ref[Failsafe]"), list("","") ) - for(var/ss in Master.subsystems) - var/datum/controller/subsystem/sub_system = ss + for(var/datum/controller/subsystem/sub_system as anything in Master.subsystems) mc_data[++mc_data.len] = list("\[[sub_system.state_letter()]][sub_system.name]", sub_system.stat_entry(), "\ref[sub_system]") mc_data[++mc_data.len] = list("Camera Net", "Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]", "\ref[GLOB.cameranet]") mc_data_encoded = url_encode(json_encode(mc_data)) +///immediately update the active statpanel tab of the target client +/datum/controller/subsystem/statpanels/proc/immediate_send_stat_data(client/target) + if(!target.statbrowser_ready) + return FALSE + + if(target.stat_tab == "Status") + set_status_tab(target) + return TRUE + + var/mob/target_mob = target.mob + if((target.stat_tab in target.spell_tabs) || !length(target.spell_tabs) && (length(target_mob.mob_spell_list) || length(target_mob.mind?.spell_list))) + set_spells_tab(target, target_mob) + return TRUE + + if(target_mob?.listed_turf) + if(!target_mob.TurfAdjacent(target_mob.listed_turf)) + target << output("", "statbrowser:remove_listedturf") + target_mob.listed_turf = null + + else if(target.stat_tab == target_mob?.listed_turf.name || !(target_mob?.listed_turf.name in target.panel_tabs)) + set_turf_examine_tab(target, target_mob) + return TRUE + + if(!target.holder) + return FALSE + + if(target.stat_tab == "MC") + set_MC_tab(target) + return TRUE + + if(!length(GLOB.sdql2_queries) && ("SDQL2" in target.panel_tabs)) + target << output("", "statbrowser:remove_sdql2") + + else if(length(GLOB.sdql2_queries) && target.stat_tab == "SDQL2") + set_SDQL2_tab(target) + /atom/proc/remove_from_cache() SSstatpanels.cached_images -= REF(src) @@ -145,6 +216,7 @@ SUBSYSTEM_DEF(statpanels) set hidden = TRUE stat_tab = tab + SSstatpanels.immediate_send_stat_data(src) /client/verb/send_tabs(tabs as text|null) set name = "Send Tabs" @@ -169,6 +241,7 @@ SUBSYSTEM_DEF(statpanels) set hidden = TRUE statbrowser_ready = TRUE + init_verbs() /client/verb/update_verbs() set name = "Update Verbs" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 751eb054db31..989ad43093fd 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -13,6 +13,7 @@ GLOBAL_PROTECT(admin_verbs_default) /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ /client/proc/secrets, /client/proc/toggle_split_admin_tabs, + /client/proc/toggle_fast_mc_refresh, /client/proc/toggle_hear_radio, /*allows admins to hide all radio output*/ /client/proc/reload_admins, /client/proc/reload_mentors, diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 5d0776a7bc6d..6425ed546bb8 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1034,7 +1034,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( qdel(S) char_render_holders = null - /// compiles a full list of verbs and sends it to the browser /client/proc/init_verbs() if(IsAdminAdvancedProcCall()) @@ -1043,12 +1042,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/list/verbstoprocess = verbs.Copy() if(mob) verbstoprocess += mob.verbs - for(var/AM in mob.contents) - var/atom/movable/thing = AM + for(var/atom/movable/thing as anything in mob.contents) verbstoprocess += thing.verbs panel_tabs.Cut() // panel_tabs get reset in init_verbs on JS side anyway - for(var/thing in verbstoprocess) - var/procpath/verb_to_init = thing + for(var/procpath/verb_to_init as anything in verbstoprocess) if(!verb_to_init) continue if(verb_to_init.hidden) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e40140305414..cf827c96145e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -912,6 +912,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Hide Radio Messages: [(chat_toggles & CHAT_RADIO)?"Shown":"Hidden"]
" dat += "Hide Prayers: [(chat_toggles & CHAT_PRAYER)?"Shown":"Hidden"]
" dat += "Split Admin Tabs: [(extra_toggles & SPLIT_ADMIN_TABS)?"Enabled":"Disabled"]
" + dat += "Fast MC Refresh: [(extra_toggles & FAST_MC_REFRESH)?"Enabled":"Disabled"]
" if(CONFIG_GET(flag/allow_admin_asaycolor)) dat += "
" dat += "ASAY Color:     Change
" @@ -2089,6 +2090,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) user.client.toggle_hear_radio() if("toggle_split_admin_tabs") extra_toggles ^= SPLIT_ADMIN_TABS + if("toggle_fast_mc_refresh") + extra_toggles ^= FAST_MC_REFRESH if("toggle_prayers") user.client.toggleprayers() if("toggle_deadmin_always") diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index ee065e5cd7f9..4c189077ebeb 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -508,3 +508,14 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS prefs.save_preferences() to_chat(src, "Admin tabs will now [(prefs.extra_toggles & SPLIT_ADMIN_TABS) ? "be" : "not be"] split.") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Split Admin Tabs", "[prefs.extra_toggles & SPLIT_ADMIN_TABS ? "Enabled" : "Disabled"]")) + +/client/proc/toggle_fast_mc_refresh() + set name = "Toggle Fast MC Refresh" + set category = "Preferences.Admin" + set desc = "Toggle the speed of which the MC refreshes." + if(!holder) + return + prefs.extra_toggles ^= FAST_MC_REFRESH + prefs.save_preferences() + to_chat(src, "MC will now [(prefs.extra_toggles & FAST_MC_REFRESH) ? "not be" : "be"] fast updating.") + SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Fast MC Refresh", "[prefs.extra_toggles & FAST_MC_REFRESH ? "Enabled" : "Disabled"]"))