From 68b687b13f58afc6fc9d69afe96654de7128ae23 Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Mon, 3 Mar 2025 15:15:07 +0100 Subject: [PATCH] some more 516 compat fixes (#89766) Ports the helpers from https://github.com/BeeStation/BeeStation-Hornet/pull/12240 This should fix some more of the 516 issues that I've seen while giving a quick check through the code The remaining browse should work now. Also fixing another sass warning while being on it. ## About The Pull Request ## Why It's Good For The Game ## Changelog :cl: fix: tgui say 516 will no longer change channels when the button is used to drag it fix: tgui say 516 will no longer leak radio messages into the wrong channel fix: runechat flickering when faded up messages fade out /:cl: --- code/__DEFINES/html_assistant.dm | 5 ++++ code/__HELPERS/stat_tracking.dm | 2 +- code/controllers/subsystem/dynamic/dynamic.dm | 4 +-- code/datums/chatmessage.dm | 25 +++++++++++++------ code/modules/admin/known_alts.dm | 8 +----- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 1 + code/modules/admin/verbs/getlogs.dm | 2 +- code/modules/admin/verbs/mapping.dm | 6 ++--- code/modules/client/client_procs.dm | 2 +- code/modules/mob/dead/new_player/poll.dm | 12 ++++----- tgstation.dme | 1 + tgui/packages/tgui-say/516/TguiSay.tsx | 15 ++++++++++- .../styles/interfaces/IntegratedCircuit.scss | 5 ++-- 14 files changed, 57 insertions(+), 33 deletions(-) create mode 100644 code/__DEFINES/html_assistant.dm diff --git a/code/__DEFINES/html_assistant.dm b/code/__DEFINES/html_assistant.dm new file mode 100644 index 00000000000..91af96a95c7 --- /dev/null +++ b/code/__DEFINES/html_assistant.dm @@ -0,0 +1,5 @@ +#define HTML_SKELETON_INTERNAL(head, body) \ +"[head][body]" + +#define HTML_SKELETON_TITLE(title, body) HTML_SKELETON_INTERNAL("[title]", body) +#define HTML_SKELETON(body) HTML_SKELETON_INTERNAL("", body) diff --git a/code/__HELPERS/stat_tracking.dm b/code/__HELPERS/stat_tracking.dm index fcd625ef6da..4deeffc09c4 100644 --- a/code/__HELPERS/stat_tracking.dm +++ b/code/__HELPERS/stat_tracking.dm @@ -9,7 +9,7 @@ lines += "[entry] => [num2text(data[STAT_ENTRY_TIME], 10)]ms ([data[STAT_ENTRY_COUNT]]) (avg:[num2text(data[STAT_ENTRY_TIME]/(data[STAT_ENTRY_COUNT] || 1), 99)])" if (user) - user << browse("
  1. [lines.Join("
  2. ")]
", "window=[url_encode("stats:[REF(stats)]")]") + user << browse(HTML_SKELETON("
  1. [lines.Join("
  2. ")]
"), "window=[url_encode("stats:[REF(stats)]")]") . = lines.Join("\n") diff --git a/code/controllers/subsystem/dynamic/dynamic.dm b/code/controllers/subsystem/dynamic/dynamic.dm index 9afc4b9133f..d6d99e318d1 100644 --- a/code/controllers/subsystem/dynamic/dynamic.dm +++ b/code/controllers/subsystem/dynamic/dynamic.dm @@ -394,7 +394,7 @@ SUBSYSTEM_DEF(dynamic) if(!check_rights(R_ADMIN)) return - var/list/out = list("Threat LogThreat Log
Starting Threat: [threat_level]
") + var/list/out = list("Threat Log
Starting Threat: [threat_level]
") for(var/entry in threat_log) if(istext(entry)) @@ -402,7 +402,7 @@ SUBSYSTEM_DEF(dynamic) out += "Remaining threat/threat_level: [mid_round_budget]/[threat_level]" - usr << browse(out.Join(), "window=threatlog;size=700x500") + usr << browse(HTML_SKELETON_TITLE("Threat Log", out.Join()), "window=threatlog;size=700x500") /// Generates the threat level using lorentz distribution and assigns peaceful_percentage. /datum/controller/subsystem/dynamic/proc/generate_threat() diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index fdd5bb4c825..5930012a2af 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -224,13 +224,16 @@ // When choosing to update the remaining time we have to be careful not to update the // scheduled time once the EOL has been executed. + var/continuing = 0 if (time_spent >= time_before_fade) if(m.message.pixel_y < starting_height) var/max_height = m.message.pixel_y + m.approx_lines * CHAT_MESSAGE_APPROX_LHEIGHT - starting_height if(max_height > 0) - animate(m.message, pixel_y = m.message.pixel_y + max_height, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + animate(m.message, pixel_y = m.message.pixel_y + max_height, time = CHAT_MESSAGE_SPAWN_TIME, flags = continuing | ANIMATION_PARALLEL) + continuing |= ANIMATION_CONTINUE else if(mheight + starting_height >= m.message.pixel_y) - animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = continuing | ANIMATION_PARALLEL) + continuing |= ANIMATION_CONTINUE continue var/remaining_time = time_before_fade * (CHAT_MESSAGE_EXP_DECAY ** idx++) * (CHAT_MESSAGE_HEIGHT_DECAY ** combined_height) @@ -239,23 +242,29 @@ if(remaining_time > 0) if(time_spent < CHAT_MESSAGE_SPAWN_TIME) // We haven't even had the time to fade in yet! - animate(m.message, alpha = 255, CHAT_MESSAGE_SPAWN_TIME - time_spent) + animate(m.message, alpha = 255, CHAT_MESSAGE_SPAWN_TIME - time_spent, flags=continuing) + continuing |= ANIMATION_CONTINUE // Stay faded in for a while, then - animate(m.message, alpha = 255, remaining_time, flags=ANIMATION_CONTINUE) + animate(m.message, alpha = 255, time = remaining_time, flags=continuing) + continuing |= ANIMATION_CONTINUE // Fade out - animate(alpha = 0, time = CHAT_MESSAGE_EOL_FADE) + animate(m.message, alpha = 0, time = CHAT_MESSAGE_EOL_FADE, flags=continuing) + continuing |= ANIMATION_CONTINUE m.animate_lifespan = remaining_time + CHAT_MESSAGE_EOL_FADE else // Your time has come my son - animate(alpha = 0, time = CHAT_MESSAGE_EOL_FADE) + animate(m.message, alpha = 0, time = CHAT_MESSAGE_EOL_FADE, flags=continuing) + continuing |= ANIMATION_CONTINUE // We run this after the alpha animate, because we don't want to interrup it, but also don't want to block it by running first // Sooo instead we do this. bit messy but it fuckin works if(m.message.pixel_y < starting_height) var/max_height = m.message.pixel_y + m.approx_lines * CHAT_MESSAGE_APPROX_LHEIGHT - starting_height if(max_height > 0) - animate(m.message, pixel_y = m.message.pixel_y + max_height, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + animate(m.message, pixel_y = m.message.pixel_y + max_height, time = CHAT_MESSAGE_SPAWN_TIME, flags = continuing | ANIMATION_PARALLEL) + continuing |= ANIMATION_CONTINUE else if(mheight + starting_height >= m.message.pixel_y) - animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = ANIMATION_PARALLEL) + animate(m.message, pixel_y = m.message.pixel_y + mheight, time = CHAT_MESSAGE_SPAWN_TIME, flags = continuing | ANIMATION_PARALLEL) + continuing |= ANIMATION_CONTINUE // Reset z index if relevant if (current_z_idx >= CHAT_LAYER_MAX_Z) diff --git a/code/modules/admin/known_alts.dm b/code/modules/admin/known_alts.dm index 3c51ca68bdf..791512fc5d3 100644 --- a/code/modules/admin/known_alts.dm +++ b/code/modules/admin/known_alts.dm @@ -171,21 +171,15 @@ GLOBAL_DATUM_INIT(known_alts, /datum/known_alts, new) known_alts_html += "\[-\] Delete [known_alt[1]] is an alt of [known_alt[2]] (added by [known_alt[3]])." var/html = {" - - Known Alts - - -

Any two ckeys in this panel will not show in "banned connection history".

Sometimes players switch account, and it's customary to perma-ban the old one.

All Known Alts:

\[+\] Add
[known_alts_html.Join("
")] - "} - client << browse(html, "window=known_alts;size=700x400") + client << browse(HTML_SKELETON_TITLE("Known Alts", html), "window=known_alts;size=700x400") ADMIN_VERB(known_alts_panel, R_ADMIN, "Known Alts Panel", "View a panel of known alts.", ADMIN_CATEGORY_MAIN) GLOB.known_alts.show_panel(user) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index f74df712721..5121dab2f00 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -533,7 +533,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null if(length(select_text)) var/text = islist(select_text)? select_text.Join() : select_text var/static/result_offset = 0 - showmob << browse(text, "window=SDQL-result-[result_offset++]") + showmob << browse(HTML_SKELETON(text), "window=SDQL-result-[result_offset++]") show_next_to_key = null if(qdel_on_finish) qdel(src) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 809c9342dee..652c55dc149 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -634,6 +634,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if (related_ticket.id == id) continue dat += "[related_ticket.TicketHref("#[related_ticket.id]")] ([related_ticket.ticket_status()]): [related_ticket.name]
" + dat += "" usr << browse(dat.Join(), "window=ahelp[id];size=750x480") diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index 7dc1493e75b..ad3612a3945 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -16,7 +16,7 @@ ADMIN_VERB(get_current_logs, R_ADMIN, "Get Current Logs", "View or retrieve logf message_admins("[key_name_admin(src)] accessed file: [path]") switch(tgui_alert(usr,"View (in game), Open (in your system's text editor), or Download?", path, list("View", "Open", "Download"))) if ("View") - src << browse("
[html_encode(file2text(file(path)))]
", list2params(list("window" = "viewfile.[path]"))) + src << browse(HTML_SKELETON("
[html_encode(file2text(file(path)))]
"), list2params(list("window" = "viewfile.[path]"))) if ("Open") src << run(file(path)) if ("Download") diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 42b71d19431..2617e5f3fcc 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -61,7 +61,7 @@ ADMIN_VERB(sec_camera_report, R_DEBUG, "Camera Report", "Get a printout of all c output += "
  • Camera not connected to wall at [ADMIN_VERBOSEJMP(C1)] Network: [json_encode(C1.network)]
  • " output += "" - user << browse(output,"window=airreport;size=1000x500") + user << browse(HTML_SKELETON(output),"window=airreport;size=1000x500") BLACKBOX_LOG_ADMIN_VERB("Show Camera Report") ADMIN_VERB_VISIBILITY(intercom_view, ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG) @@ -86,7 +86,7 @@ ADMIN_VERB(show_map_reports, R_DEBUG, "Show Map Reports", "Displays a list of ma for(var/datum/map_report/report as anything in GLOB.map_reports) dat += "[report.tag] ([report.original_path]) - View
    " - user << browse(dat, "window=map_reports") + user << browse(HTML_SKELETON(dat), "window=map_reports") ADMIN_VERB_VISIBILITY(cmd_show_at_list, ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG) ADMIN_VERB(cmd_show_at_list, R_DEBUG, "Show roundstart AT list", "Displays a list of active turfs coordinates at roundstart.", ADMIN_CATEGORY_MAPPING) @@ -98,7 +98,7 @@ ADMIN_VERB(cmd_show_at_list, R_DEBUG, "Show roundstart AT list", "Displays a lis dat += "[ADMIN_VERBOSEJMP(T)]\n" dat += "
    " - user << browse(dat, "window=at_list") + user << browse(HTML_SKELETON(dat), "window=at_list") BLACKBOX_LOG_ADMIN_VERB("Show Roundstart Active Turfs") diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index dadcd79e8dd..85f8b908e35 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -455,7 +455,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( msg += "Your version: [byond_version].[byond_build]
    " msg += "Required version to remove this message: [warn_version].[warn_build] or later
    " msg += "Visit BYOND's website to get the latest version of BYOND.
    " - src << browse(msg, "window=warning_popup") + src << browse(HTML_SKELETON(msg), "window=warning_popup") else to_chat(src, span_danger("Your version of byond may be getting out of date:")) to_chat(src, CONFIG_GET(string/client_warn_message)) diff --git a/code/modules/mob/dead/new_player/poll.dm b/code/modules/mob/dead/new_player/poll.dm index 6ecd6f12a27..e9760741627 100644 --- a/code/modules/mob/dead/new_player/poll.dm +++ b/code/modules/mob/dead/new_player/poll.dm @@ -20,7 +20,7 @@ GLOBAL_PROTECT(poll_options) continue output += "[poll.question]" output += "" - src << browse(jointext(output, ""),"window=playerpolllist;size=500x300") + src << browse(HTML_SKELETON(jointext(output, "")),"window=playerpolllist;size=500x300") /** * Redirects a player to the correct poll window based on poll type. @@ -86,7 +86,7 @@ GLOBAL_PROTECT(poll_options) if(!voted_option_id || poll.allow_revoting) output += "

    " output += "" - src << browse(jointext(output, ""),"window=playerpoll;size=500x250") + src << browse(HTML_SKELETON(jointext(output, "")),"window=playerpoll;size=500x250") /** * Shows voting window for a text response type poll, listing its relevant details. @@ -123,7 +123,7 @@ GLOBAL_PROTECT(poll_options) else output += "[reply_text]" output += "" - src << browse(jointext(output, ""),"window=playerpoll;size=500x500") + src << browse(HTML_SKELETON(jointext(output, "")),"window=playerpoll;size=500x500") /** * Shows voting window for a rating type poll, listing its options and relevant details. @@ -178,7 +178,7 @@ GLOBAL_PROTECT(poll_options) if(!length(voted_ratings) || poll.allow_revoting) output += "

    " output += "" - src << browse(jointext(output, ""),"window=playerpoll;size=500x500") + src << browse(HTML_SKELETON(jointext(output, "")),"window=playerpoll;size=500x500") /** * Shows voting window for a multiple choice type poll, listing its options and relevant details. @@ -222,7 +222,7 @@ GLOBAL_PROTECT(poll_options) if(!length(voted_for) || poll.allow_revoting) output += "

    " output += "" - src << browse(jointext(output, ""),"window=playerpoll;size=500x300") + src << browse(HTML_SKELETON(jointext(output, "")),"window=playerpoll;size=500x300") /** * Shows voting window for an IRV type poll, listing its options and relevant details. @@ -307,7 +307,7 @@ GLOBAL_PROTECT(poll_options) output += "

    Least Preferred

    " if(!length(voted_for) || poll.allow_revoting) output += "

    " - output += "" + output += "" src << browse(jointext(output, ""),"window=playerpoll;size=500x500") /** diff --git a/tgstation.dme b/tgstation.dme index eed354bb78b..53038fe6a88 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -110,6 +110,7 @@ #include "code\__DEFINES\guardian_defines.dm" #include "code\__DEFINES\holiday.dm" #include "code\__DEFINES\holopads.dm" +#include "code\__DEFINES\html_assistant.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\icon_smoothing.dm" #include "code\__DEFINES\id_cards.dm" diff --git a/tgui/packages/tgui-say/516/TguiSay.tsx b/tgui/packages/tgui-say/516/TguiSay.tsx index 6434c48d2fc..e6955fd8d29 100644 --- a/tgui/packages/tgui-say/516/TguiSay.tsx +++ b/tgui/packages/tgui-say/516/TguiSay.tsx @@ -42,6 +42,7 @@ export function TguiSay() { const [size, setSize] = useState(WindowSize.Small); const [maxLength, setMaxLength] = useState(1024); const [lightMode, setLightMode] = useState(false); + const [position, setPosition] = useState([window.screenX, window.screenY]); const [value, setValue] = useState(''); function handleArrowKeys(direction: KEY.Up | KEY.Down): void { @@ -128,6 +129,9 @@ export function TguiSay() { } function handleIncrementChannel(): void { + const xPos = window.screenX; + const yPos = window.screenY; + if (JSON.stringify(position) !== JSON.stringify([xPos, yPos])) return; const iterator = channelIterator.current; iterator.next(); @@ -137,6 +141,7 @@ export function TguiSay() { } function handleInput(event: FormEvent): void { + const iterator = channelIterator.current; let newValue = event.currentTarget.value; let newPrefix = getPrefix(newValue) || currentPrefix; @@ -145,6 +150,7 @@ export function TguiSay() { setButtonContent(RADIO_PREFIXES[newPrefix]); setCurrentPrefix(newPrefix); newValue = newValue.slice(3); + iterator.set('Say'); if (newPrefix === ':b ') { Byond.sendMessage('thinking', { visible: false }); @@ -191,6 +197,13 @@ export function TguiSay() { } } + function handleButtonDrag(e: React.MouseEvent): void { + const xPos = window.screenX; + const yPos = window.screenY; + setPosition([xPos, yPos]); + dragStartHandler(e); + } + function handleOpen(data: ByondOpen): void { setTimeout(() => { innerRef.current?.focus(); @@ -261,7 +274,7 @@ export function TguiSay() {