mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-10 09:42:29 +00:00
* Micro-optimize qdel by only permitting one parameter (#80628) Productionizes #80615. The core optimization is this: ```patch - var/hint = to_delete.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. + var/hint = to_delete.Destroy(force) // Let our friend know they're about to get fucked up. ``` We avoid a heap allocation in the form of copying the args over to a new list. A/B testing shows this results in 33% better overtime, and in a real round shaving off a full second of self time and 0.4 seconds of overtime--both of these would be doubled in the event this is merged as the new proc was only being run 50% of the time. * Micro-optimize qdel by only permitting one parameter --------- Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
126 lines
3.3 KiB
Plaintext
126 lines
3.3 KiB
Plaintext
/// Applied to clients when they receive an admin popup, alerting them to
|
|
/// their ticket.
|
|
/datum/component/admin_popup
|
|
/// The user's most active ticket. If this is resolved, closed, or replied to,
|
|
/// then the component will delete itself.
|
|
var/datum/admin_help/ticket
|
|
|
|
var/atom/movable/screen/admin_popup/admin_popup
|
|
|
|
/datum/component/admin_popup/Initialize(datum/admin_help/ticket)
|
|
if (!istype(parent, /client))
|
|
return COMPONENT_INCOMPATIBLE
|
|
|
|
if (!istype(ticket))
|
|
return COMPONENT_INCOMPATIBLE
|
|
|
|
create_notice()
|
|
|
|
RegisterSignals(
|
|
ticket,
|
|
list(
|
|
COMSIG_ADMIN_HELP_MADE_INACTIVE,
|
|
COMSIG_ADMIN_HELP_REPLIED,
|
|
COMSIG_QDELETING,
|
|
),
|
|
PROC_REF(delete_self),
|
|
)
|
|
|
|
/datum/component/admin_popup/Destroy(force)
|
|
var/client/parent_client = parent
|
|
|
|
parent_client?.screen -= admin_popup
|
|
QDEL_NULL(admin_popup)
|
|
|
|
if (!QDELETED(ticket))
|
|
UnregisterSignal(ticket, list(
|
|
COMSIG_ADMIN_HELP_MADE_INACTIVE,
|
|
COMSIG_ADMIN_HELP_REPLIED,
|
|
COMSIG_QDELETING,
|
|
))
|
|
|
|
ticket = null
|
|
|
|
return ..()
|
|
|
|
/datum/component/admin_popup/proc/create_notice()
|
|
if(admin_popup)
|
|
qdel(admin_popup)
|
|
admin_popup = new
|
|
|
|
var/client/parent_client = parent
|
|
admin_popup.maptext_width = view_to_pixels(parent_client.view_size.getView())[1]
|
|
parent_client.screen += admin_popup
|
|
|
|
/datum/component/admin_popup/proc/delete_self()
|
|
SIGNAL_HANDLER
|
|
qdel(src)
|
|
|
|
/// The UI element for admin popups
|
|
/atom/movable/screen/admin_popup
|
|
icon = null
|
|
icon_state = null
|
|
plane = ABOVE_HUD_PLANE
|
|
layer = ADMIN_POPUP_LAYER
|
|
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
screen_loc = "TOP-5,LEFT"
|
|
maptext_height = 480
|
|
maptext_width = 480
|
|
maptext = ""
|
|
|
|
var/static/list/colors = list(
|
|
COLOR_RED,
|
|
COLOR_ORANGE,
|
|
COLOR_YELLOW,
|
|
COLOR_LIME,
|
|
COLOR_CYAN,
|
|
COLOR_PURPLE,
|
|
)
|
|
|
|
/// The last color chosen in the animation, sourced from the static list colors.
|
|
var/last_color_index = 0
|
|
|
|
/// The `world.time` when the last color update occurred.
|
|
var/last_update_time = 0
|
|
|
|
/atom/movable/screen/admin_popup/Initialize(mapload, datum/hud/hud_owner, ...)
|
|
. = ..()
|
|
|
|
START_PROCESSING(SSobj, src)
|
|
update_text()
|
|
|
|
/atom/movable/screen/admin_popup/Destroy()
|
|
STOP_PROCESSING(SSobj, src)
|
|
return ..()
|
|
|
|
/atom/movable/screen/admin_popup/process(seconds_per_tick)
|
|
update_text()
|
|
|
|
/atom/movable/screen/admin_popup/proc/update_text()
|
|
// Even if processing time changes, we want this to remain slow.
|
|
// We want to pester them into reading their ticket, not give them a seizure!
|
|
if (world.time - last_update_time < 2 SECONDS)
|
|
return
|
|
|
|
last_color_index = (last_color_index % colors.len) + 1
|
|
|
|
var/message = "<span style='color: [colors[last_color_index]]; text-align: center; font-size: 24pt'>"
|
|
message += "HEY!<br>An admin is trying to talk to you!<br>Check your chat window,<br>and click their name to respond!"
|
|
message += "</span>"
|
|
|
|
maptext = MAPTEXT(message)
|
|
last_update_time = world.time
|
|
|
|
/// Tries to give the target an admin popup.
|
|
/// If it fails, will send the error to the passed admin.
|
|
/proc/give_admin_popup(client/target, client/admin, message)
|
|
log_admin("[key_name(admin)] sent an admin popup to [key_name(target)].")
|
|
|
|
var/datum/admin_help/current_ticket = target.current_ticket
|
|
if (!current_ticket)
|
|
to_chat(admin, span_warning("[key_name(target)] had no active ahelp, aborting."))
|
|
return
|
|
|
|
admin.cmd_admin_pm(target, message)
|
|
target.AddComponent(/datum/component/admin_popup, current_ticket)
|