fix runechat offset (#17510)

* don't double this

* .

* urg

* always use if defined

* eh

* tgui window from tg

* skip on char select

* rh

* .

* move to config
This commit is contained in:
Kashargul
2025-04-11 17:10:37 +02:00
committed by GitHub
parent 55306c47c3
commit a97ded5b3b
10 changed files with 78 additions and 41 deletions
@@ -0,0 +1,2 @@
/// Window is fully visible and we can make fragile calls
#define COMSIG_TGUI_WINDOW_VISIBLE "tgui_window_visible"
@@ -732,3 +732,6 @@
/datum/config_entry/string/chatlog_database_api_endpoint
/datum/config_entry/flag/forbid_admin_profiling
/datum/config_entry/flag/pixel_size_limit
default = FALSE
+2 -10
View File
@@ -452,24 +452,16 @@ var/list/runechat_image_cache = list()
return (width - bound_width) * -0.5 + get_oversized_icon_offsets()["x"]
/atom/movable/runechat_y_offset()
return ..() + get_oversized_icon_offsets()["y"]
return ..() + get_oversized_icon_offsets()["y"] * 1.5 // Fix to use 2 if we ever can measure sprites
/* Nothing special
/mob/runechat_x_offset(width, height)
return (width - bound_width) * -0.5
*/
/mob/runechat_y_offset(var/consider_height)
if(consider_height)
return ..()
/mob/runechat_y_offset()
return ..()*size_multiplier
/mob/living/runechat_y_offset(var/consider_height)
var/size_diff = vis_height - world.icon_size
if(size_diff > 0)
return (..(TRUE) + size_diff) * size_multiplier
return ..(FALSE)
// Allows you to specify a different attachment point for messages from yourself
/atom/proc/runechat_holder(datum/chatmessage/CM)
return src
+2 -2
View File
@@ -292,7 +292,7 @@ var/list/preferences_datums = list()
to_chat(usr,span_notice("Character [player_setup?.preferences?.real_name] saved!"))
save_preferences()
else if(href_list["reload"])
load_preferences()
load_preferences(TRUE)
load_character()
attempt_vr(client.prefs_vr,"load_vore","")
sanitize_preferences()
@@ -390,7 +390,7 @@ var/list/preferences_datums = list()
error("Player picked [choice] slot to load, but that wasn't one we sent.")
return
load_preferences()
load_preferences(TRUE)
load_character(slotnum)
attempt_vr(user.client?.prefs_vr,"load_vore","")
sanitize_preferences()
+3 -2
View File
@@ -131,7 +131,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
savefile.set_entry("lastnews", lastnews)
savefile.set_entry("lastlorenews", lastlorenews)
/datum/preferences/proc/load_preferences()
/datum/preferences/proc/load_preferences(skip_client)
if(!savefile)
stack_trace("Attempted to load the preferences of [client] without a savefile; did you forget to call load_savefile?")
load_savefile()
@@ -147,7 +147,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
fcopy(savefile.path, bacpath) //byond helpfully lets you use a savefile for the first arg.
return FALSE
apply_all_client_preferences()
if(!skip_client)
apply_all_client_preferences()
load_early_prefs()
sanitize_early_prefs()
+51 -15
View File
@@ -11,6 +11,7 @@
var/is_browser = FALSE
var/status = TGUI_WINDOW_CLOSED
var/locked = FALSE
var/visible = FALSE
var/datum/tgui/locked_by
var/datum/subscriber_object
var/subscriber_delegate
@@ -24,6 +25,8 @@
var/initial_inline_html
var/initial_inline_js
var/initial_inline_css
var/list/oversized_payloads = list()
var/mouse_event_macro_set = FALSE
/**
@@ -54,7 +57,6 @@
if(pooled)
src.pool_index = TGUI_WINDOW_INDEX(id)
/**
* public
*
@@ -116,7 +118,7 @@
html = replacetextEx(html, "<!-- tgui:assets -->\n", inline_assets_str)
// Inject inline HTML
if (inline_html)
html = replacetextEx(html, "<!-- tgui:inline-html -->", inline_html)
html = replacetextEx(html, "<!-- tgui:inline-html -->", isfile(inline_html) ? file2text(inline_html) : inline_html)
// Inject inline JS
if (inline_js)
inline_js = "<script>\n'use strict';\n[isfile(inline_js) ? file2text(inline_js) : inline_js]\n</script>"
@@ -230,7 +232,7 @@
*
* optional can_be_suspended bool
*/
/datum/tgui_window/proc/close(can_be_suspended = TRUE, logout = FALSE)
/datum/tgui_window/proc/close(can_be_suspended = TRUE)
if(!client)
return
if(mouse_event_macro_set)
@@ -241,25 +243,18 @@
#endif
status = TGUI_WINDOW_READY
send_message("suspend")
// You would think that BYOND would null out client or make it stop passing istypes or, y'know, ANYTHING during
// logout, but nope! It appears to be perfectly valid to call winset by every means we can measure in Logout,
// and yet it causes a bad client runtime. To avoid that happening, we just have to know if we're in Logout or
// not.
if(!logout && client)
winset(client, null, "mapwindow.map.focus=true")
return
#ifdef TGUI_DEBUGGING
log_tgui(client, "[id]/close")
#endif
release_lock()
visible = FALSE
status = TGUI_WINDOW_CLOSED
message_queue = null
// Do not close the window to give user some time
// to read the error message.
if(!fatally_errored)
client << browse(null, "window=[id]")
if(!logout && client)
winset(client, null, "mapwindow.map.focus=true")
/**
* public
@@ -388,6 +383,9 @@
switch(type)
if("ping")
send_message("ping/reply", payload)
if("visible")
visible = TRUE
// SEND_SIGNAL(src, COMSIG_TGUI_WINDOW_VISIBLE, client) // Not used yet
if("suspend")
close(can_be_suspended = TRUE)
if("close")
@@ -395,17 +393,55 @@
if("openLink")
client << link(href_list["url"])
if("cacheReloaded")
// Reinitialize
reinitialize()
// Resend the assets
for(var/asset in sent_assets)
send_asset(asset)
if("chat/resend")
SSchat.handle_resend(client, payload)
/* Does not work with tgui say, so not in use yet
if("oversizedPayloadRequest")
var/payload_id = payload["id"]
var/chunk_count = payload["chunkCount"]
var/permit_payload = chunk_count <= CONFIG_GET(number/tgui_max_chunk_count)
if(permit_payload)
create_oversized_payload(payload_id, payload["type"], chunk_count)
send_message("oversizePayloadResponse", list("allow" = permit_payload, "id" = payload_id))
if("payloadChunk")
var/payload_id = payload["id"]
append_payload_chunk(payload_id, payload["chunk"])
send_message("acknowlegePayloadChunk", list("id" = payload_id))
*/
/datum/tgui_window/vv_edit_var(var_name, var_value)
return var_name != NAMEOF(src, id) && ..()
/datum/tgui_window/proc/create_oversized_payload(payload_id, message_type, chunk_count)
if(oversized_payloads[payload_id])
stack_trace("Attempted to create oversized tgui payload with duplicate ID.")
return
oversized_payloads[payload_id] = list(
"type" = message_type,
"count" = chunk_count,
"chunks" = list(),
"timeout" = addtimer(CALLBACK(src, PROC_REF(remove_oversized_payload), payload_id), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
)
/datum/tgui_window/proc/append_payload_chunk(payload_id, chunk)
var/list/payload = oversized_payloads[payload_id]
if(!payload)
return
var/list/chunks = payload["chunks"]
chunks += chunk
if(length(chunks) >= payload["count"])
deltimer(payload["timeout"])
var/message_type = payload["type"]
var/final_payload = chunks.Join()
remove_oversized_payload(payload_id)
on_message(message_type, json_decode(final_payload), list("type" = message_type, "payload" = final_payload, "tgui" = TRUE, "window_id" = id))
else
payload["timeout"] = addtimer(CALLBACK(src, PROC_REF(remove_oversized_payload), payload_id), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
/datum/tgui_window/proc/remove_oversized_payload(payload_id)
oversized_payloads -= payload_id
/datum/tgui_window/proc/set_mouse_macro()
if(mouse_event_macro_set)
+10 -12
View File
@@ -86,19 +86,17 @@
* * ignore_prefs - CHANGE_ME. Default: FALSE
* * aura_animation - CHANGE_ME. Default: TRUE
*/
//#define USE_DIRECT_MULTIPLIERS //Uncomment to use old resize calculations.
/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = TRUE)
if(!uncapped)
#ifdef USE_DIRECT_MULTIPLIERS
new_size = clamp(new_size, RESIZE_MINIMUM, RESIZE_MAXIMUM)
#else
var/size_diff = ((runechat_y_offset() / size_multiplier) * new_size) // This returns 32 multiplied with the new size
var/size_cap = world.icon_size * (RESIZE_MAXIMUM+(ishuman(src)?0:0.5)) //Grace for non-humanoids so they don't get forcibly shrunk.
if(size_diff - size_cap > 0)
var/real_diff = size_cap / size_diff // Returns our diff based on the offset to world size
new_size *= real_diff // Applies our diff to the new size
new_size = clamp(new_size, RESIZE_MINIMUM, RESIZE_MAXIMUM) //If the sprite is below 32, we clamp it to only go to the resize max.
#endif
if((z in using_map.station_levels) && CONFIG_GET(flag/pixel_size_limit))
var/size_diff = ((runechat_y_offset() / size_multiplier) * new_size) // This returns 32 multiplied with the new size
var/size_cap = world.icon_size * RESIZE_MAXIMUM //Grace for non-humanoids so they don't get forcibly shrunk.
if(size_diff - size_cap > 0)
var/real_diff = size_cap / size_diff // Returns our diff based on the offset to world size
new_size *= real_diff // Applies our diff to the new size
new_size = clamp(new_size, RESIZE_MINIMUM, RESIZE_MAXIMUM) //If the sprite is below 32, we clamp it to only go to the resize max.
else
new_size = clamp(new_size, RESIZE_MINIMUM, RESIZE_MAXIMUM)
var/datum/component/resize_guard/guard = GetComponent(/datum/component/resize_guard)
if(guard)
qdel(guard)
@@ -140,7 +138,7 @@
animate_aura(src, color = aura_color, offset = aura_offset, anim_duration = aura_anim_duration, loops = aura_loops, grow_to = aura_grow_to)
else
update_transform() //Lame way
//#undef USE_DIRECT_MULTIPLIERS //Uncomment to use old resize calculations.
/mob/living/carbon/human/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = TRUE)
if(!resizable && !ignore_prefs)
return 1
+3
View File
@@ -589,3 +589,6 @@ JUKEBOX_TRACK_FILES config/jukebox.json
## Uncomment to block granting profiling privileges to users with R_DEBUG, for performance purposes
#FORBID_ADMIN_PROFILING
## Uncomment to limit resize caps depending on sprite icon height
#PIXEL_SIZE_LIMIT
+1
View File
@@ -226,6 +226,7 @@ export const backendMiddleware = (store) => {
Byond.winset(Byond.windowId, {
'is-visible': true,
});
Byond.sendMessage('visible');
perf.mark('resume/finish');
if (process.env.NODE_ENV !== 'production') {
logger.log(
+1
View File
@@ -181,6 +181,7 @@
#include "code\__defines\dcs\signals.dm"
#include "code\__defines\dcs\signals\signals_client.dm"
#include "code\__defines\dcs\signals\signals_subsystem.dm"
#include "code\__defines\dcs\signals\signals_tgui.dm"
#include "code\__defines\dcs\signals\signals_turf.dm"
#include "code\__defines\dcs\signals\signals_mobs\signals_mob_main.dm"
#include "code\__defines\traits\_traits.dm"