Automatic TGS DMAPI Update#10
Open
github-actions[bot] wants to merge 1 commit into
Open
Conversation
18a2c4f to
21d5b60
Compare
Pingvas
added a commit
that referenced
this pull request
Mar 1, 2026
* Persist tgui panel state server-side, fix header buttons overflow, fix chat not loading
- Add server-side persistence for chat tabs, filters, font settings via tgui_panel_state preference (JSON blob), surviving WebView2 storage loss
- Fix header buttons (settings/music/emotes) pushed offscreen by adding min-width:0 to ChatTabs container and shrink:0 to button items
- Exempt tgui Topic calls from rate limiting to prevent "ready" message being dropped during connection burst (SECOND_TOPIC_LIMIT)
- Add retry loop for tgui "ready" message (every 2s, max 30s) to handle unreliable location.href transport in WebView2
* Fix HUD iteration broken by alist and volumetric_box null crashes
GLOB.huds was changed from list() to alist() for BYOND 516 compat,
but alist iteration yields keys (numbers) instead of values (datums),
breaking all type-filtered for-loops. Use GLOB.all_huds (flat list)
for iteration instead. Also add null guards in volumetric_box Click
and MouseDrop to prevent runtime when our_item is deleted.
* Fix banning panel styling for WebView2 dark theme
Adapt inline HTML colors to work with common.css dark theme
applied by /datum/browser wrapper. Replace light bgcolors with
dark equivalents, add scoped CSS for form elements.
* Fix paper form fields disappearing, large text paste, and stamp position
- Remove return TRUE from add_text, fill_input_field, add_stamp handlers
to prevent stale data-only updates from overriding pending static data
- Fix object mutation in onInputHandler (create new object instead of
mutating same reference)
- Remove unsafe setState during render in PaperSheet component
- Add text chunking (2000 char chunks) to avoid BYOND Topic size limit
- Add add_text_chunk backend handler for silent intermediate appends
- Fix stamp positioning to use container-relative coordinates via
getBoundingClientRect instead of page coordinates
* Fix listed turf statpanel flickering and white flash on item click
- Route listed turf item clicks through byond_topic() bridge instead
of raw window.location.href, preventing WebView2 page navigation
- Incremental DOM updates in draw_listedturf() instead of full rebuild,
keeping existing elements with loaded icons intact
- Skip redundant redraws when turf contents data hasn't changed
- Fix iconError() this-binding so per-image retry works correctly
- Remove cascading draw_listedturf() call from iconError()
* Fix admin ticket clicking in statpanel and chat link persistence
- Route ticket clicks in draw_tickets() through byond_topic() bridge
instead of raw <a href>, preventing WebView2 page navigation
- Remove 'a' from DOMPurify FORBID_TAGS so admin ticket action links
(REJT, IC, CLOSE, HANDLE, etc.) survive chat message restoration
* Fix save chat log opening external browser instead of downloading
The captureExternalLinks() handler was intercepting blob: URL clicks
from saveToDisk() and sending them to BYOND as external links.
Blob URLs are document-scoped and meaningless outside the origin page.
Skip blob: and data: URLs in the link interceptor so the native
<a download> mechanism works correctly in WebView2.
* Fix CharacterProfile preview causing FPS drops while walking
update_preview() was called unconditionally every SStgui tick (0.9s),
creating a new mutable_appearance and rebuilding overlays even when
nothing changed. Use a dirty flag driven by COMSIG_ATOM_UPDATED_ICON
so the preview only rebuilds when the mob's icon actually updates.
* Fix poor color contrast in admin ticket panel on dark background
Replace CSS named colors (purple, red, green, blue) with explicit hex
values optimized for the dark (#272727) ticket popup background.
Purple (#800080) was nearly unreadable at 3.1:1 contrast ratio.
New palette: purple→#c084fc, red→#f87171, green→#4ade80, blue→#60a5fa
* SCREENTIP fix (#4)
* Fix TGUI hotkey passthrough broken in BYOND 516 WebView2
Use native window.BYOND.command() API for command execution
instead of location.href transport which doesn't reliably deliver
winset commands in WebView2. Falls back to legacy transport when
native API is unavailable.
Fix keyboard layout independence in keyToByond() and
KeyEvent.toString() by using event.code (physical key position)
instead of event.key (layout-dependent character). This ensures
hotkeys work regardless of keyboard layout (e.g. Russian).
* Eliminate flashlight lighting lag when moving
Remove the hard 75-item cap from corners and objects phases in SSlighting,
keeping it only on the expensive light sources phase (which calls view()).
Corners and objects are cheap arithmetic/underlay ops already guarded by
MC_TICK_CHECK. The cap caused visible stutter because a single range-4
flashlight generates ~80 corners, overflowing the 75 limit and deferring
updates to the next fire cycle.
Also increase SSlighting fire rate (wait 2 -> 1) for smoother light updates.
* Wrap remaining raw browse() calls with /datum/browser for WebView2 compatibility
BYOND 516 WebView2 requires proper HTML document structure to render
content. Raw HTML fragments sent via browse() display as plain text.
This wraps all 38 remaining raw browse() call sites across 28 files.
* Fix movement input lag caused by non-aligned client FPS in BYOND 516
Client FPS values that aren't multiples of 60 (BYOND's internal base
rate) cause ~0.5s input lag due to client/server tick misalignment in
the movement delay buffer system.
- Add sanitize_clientfps() that snaps FPS to nearest multiple of 60
- Migrate all existing players to 120 FPS via savefile version bump
- Replace free-form FPS input with dropdown of safe values (0-480)
- Use CONFIG_GET(number/fps) for display instead of world.fps
- Guard client.fps assignment on login through sanitizer
* [Test] Fix TGUI debug overlay blocking UI permanently on slow CDN
The debug overlay that appears when the JS bundle fails to load within
8 seconds was uncloseable and permanent — even if the bundle eventually
loaded. In fancy mode (no titlebar) this left the window completely stuck.
- Add close button to the debug overlay so users can dismiss it manually
- Auto-dismiss the overlay when the app eventually boots (polls every 500ms)
- Add 15s load timeout for JS assets: if a CDN request hangs without
succeeding or failing, the script tag is removed and retried (up to 5
attempts with backoff) instead of hanging forever
- Fix sync flag for dynamic scripts: use async=false instead of defer=true
(defer is a no-op on dynamically created script elements)
* Fix R&D Console (Techweb) content cutoff by replacing incorrect flex sizing
Replace height="100%" with grow={1} on RouterContent and OverviewNodes flex
items, and add missing CSS rules (min-height: 0, flex-shrink: 0) to establish
a proper flex chain that allows content to scroll instead of being clipped.
* fix: предпросмотр персонажа, лаунчпадов и гейтов. В целом изменена система мапов под 516 (#5)
* fix: achievements menu, tgui signals, character profile improvements
* fix: remove stale preview_dirty reference in character_profile.dm
* Update gateway.dm
райт нау cam_background будет регистрироваться только тогда, когда вызывается display_to_client
* update .votewrap width to 100% for consistent styling in chat-dark and chat-light themes
* update close_user_uis and on_logout to handle logout parameter
* add safe navigation for statbrowser_ready check
* Fixes NTNet message data format for activation alerts
Changes the message payload from a plain string to a properly structured list, ensuring compatibility with the expected NTNet data format when broadcasting object activation events.
* Adds safety guards to lighting update loop
Prevents potential runtime errors by checking if the list has shrunk mid-iteration and skipping any deleted light sources encountered during the update phase
* Fixes door controller ID input and number validation
Switches door controller ID input from numeric to text, allowing alphanumeric IDs as is typical for door access control systems.
Also adds a sanity check to prevent non-numeric default values from being passed to the number input component, avoiding potential crashes or unexpected behavior in min/max comparisons.
* Fixes locale-aware sorting for emote list
Specifies English locale explicitly in the sort comparison to ensure consistent, predictable alphabetical ordering across different browser and system locale settings
* Replaces PDA browser popup with direct browse call
* Prevents tooltips from appearing off-screen
Clamps tooltip position to ensure it never renders beyond the left or top edges of the screen, keeping it within the padded boundary at all times.
* Refactors global type declarations and adds path aliases
Moves global type declarations out of the `declare global` block into top-level ambient declarations, which is the correct approach for `.d.ts` files without module exports.
Adds a `process.env` type declaration to support environment variable access with proper typing.
Configures TypeScript path aliases in `tsconfig.json` so internal packages can be imported using short, readable paths instead of relative ones, improving maintainability across the monorepo.
* Requires explicit DEV_SERVER_IP to enable dev server connection
Previously, the dev server client would default to `127.0.0.1` if no IP was configured, potentially causing unexpected connection attempts in environments where no dev server is running.
Now the client treats a missing `DEV_SERVER_IP` as an opt-out, skipping both WebSocket and HTTP connections entirely. Also adds a null-check on the socket before accessing its state, preventing a potential runtime error.
* Exposes dev server IP only in development builds
* Fixes tgui panel state exceeding BYOND topic URL limits
State was being double-JSON-encoded and URL-encoded when sent as a payload, tripling its size and frequently exceeding BYOND's topic URL limit. Sends state as a direct href parameter instead to avoid this inflation.
Compacts the saved state format by replacing UUID page IDs with short numeric indices and converting acceptedTypes from an object map to an array, saving significant bytes per save. Doubles the max allowed state size to 16384 bytes to accommodate richer panel configurations.
Adds a save counter (`savedAt`) to both server and browser storage so the fresher copy can be selected on load rather than always preferring the server copy blindly.
Introduces an immediate flush path for critical operations (tab add/remove, round restart) instead of always debouncing, reducing the chance of losing structural changes on disconnect.
Also adds null-safety guards around preference access in the interaction menu component and bypasses the save cooldown for preference saves triggered by UI interactions.
* Handles invalid or unlimited max length values gracefully
When no meaningful max length is set (zero, negative, or exceeding the 32-bit integer limit), the character counter now shows only the current length instead of an misleading fraction, and the input field removes its length restriction entirely.
* Fixes stuck modifier keys after BYOND 516 migration
When a modifier key (Alt, Ctrl, Shift) is pressed while the game map has focus and released while the WebView2 panel has focus, BYOND never receives the KeyUp event, causing the key to appear permanently held
Adds tracking of modifier key presses in the panel to detect cross-boundary releases and forwards the missing KeyUp directly to BYOND when needed. Also removes the previous workaround in the server-side key release logic that skipped modifier keys, since they are now properly handled
* фикс чанков (#6)
* fix: achievements menu, tgui signals, character profile improvements
* fix: remove stale preview_dirty reference in character_profile.dm
* Update gateway.dm
райт нау cam_background будет регистрироваться только тогда, когда вызывается display_to_client
* fix: явный обработчик onPaste в TextArea для корректной вставки большого текста в BYOND 516 WebView2
* Fixes door controller ID input and number validation
Switches door controller ID input from numeric to text, allowing alphanumeric IDs as is typical for door access control systems.
Also adds a sanity check to prevent non-numeric default values from being passed to the number input component, avoiding potential crashes or unexpected behavior in min/max comparisons.
* Fixes locale-aware sorting for emote list
Specifies English locale explicitly in the sort comparison to ensure consistent, predictable alphabetical ordering across different browser and system locale settings
* Replaces PDA browser popup with direct browse call
* Prevents tooltips from appearing off-screen
Clamps tooltip position to ensure it never renders beyond the left or top edges of the screen, keeping it within the padded boundary at all times.
* Refactors global type declarations and adds path aliases
Moves global type declarations out of the `declare global` block into top-level ambient declarations, which is the correct approach for `.d.ts` files without module exports.
Adds a `process.env` type declaration to support environment variable access with proper typing.
Configures TypeScript path aliases in `tsconfig.json` so internal packages can be imported using short, readable paths instead of relative ones, improving maintainability across the monorepo.
* Requires explicit DEV_SERVER_IP to enable dev server connection
Previously, the dev server client would default to `127.0.0.1` if no IP was configured, potentially causing unexpected connection attempts in environments where no dev server is running.
Now the client treats a missing `DEV_SERVER_IP` as an opt-out, skipping both WebSocket and HTTP connections entirely. Also adds a null-check on the socket before accessing its state, preventing a potential runtime error.
* Port tgui payload chunking from tgstation#90295
- Split oversized tgui payloads (>2kb) into ~512b chunks sent sequentially
- Fixes large text inputs (paper writing etc) being truncated in BYOND 516
- Added TGUI_MAX_CHUNK_COUNT config option (default 64)
- Added tgui/public/tgui.html to DmTarget inputs in build.js
* Fix timer accumulation, timeout, payload limit and stale-state bugs in tgui chunking
---------
Co-authored-by: DuLL_FoX <xomka63@gmail.com>
* Adds GC queue debug viewer and tunes GC timing
* Fixes map view screens not being removed on UI close
Screen objects were not being properly removed from the client's screen list when maps were hidden or UIs were closed, causing stale screen elements to linger.
* Fixes duplicate sprite accessory type paths
Renames misnamed horn accessory subtypes to avoid path collisions that caused duplicate or conflicting entries.
Adds a null name guard during sprite accessory loading to safely skip and clean up any accessories that lack a name, preventing potential runtime issues from malformed entries.
* Fixes link format in GC queue refresh output
* Prevents runtimes in movespeed modifier handling
Adds null checks and utilizes lazy access macros when retrieving and removing modifier data.
Prevents potential runtime errors by ensuring safe access to uninitialized lists and handling missing keys gracefully.
* Fixes potential crash in projectile movement by deleting the object if it takes too long to reach its location
* Optimize Destroy() for tgui_list_input and card/id: skip redundant SStgui.close_uis, null plain lists instead of qdel, fix missing bank_cards cleanup causing hard deletes
* Enhance Destroy() methods for character profiles and robots: ensure profile cleanup with QDEL_NULL, and manage viewer screens in description profiles to prevent memory leaks.
* Refactor ItemList component: improve alignment and styling for better UI consistency; update MaterialEjectDock to round sheet amounts for clarity
* Smooths parallax movement during tile steps
Adds time-based interpolation tied to movement speed so background layers ease between adjacent tiles instead of snapping.
Limits animation to safe cases (small moves without scrolling or wraparound) to prevent visual popping and edge-jump artifacts.
Updates scheduling so parallax updates run with more consistent timing, improving motion coherence.
* Fix destroy (#7)
* Fixes lingering visual effects on cleanup
Stops active visual filter animations before UI layers are destroyed, preventing orphaned animation state.
Also deletes temporary camera display resources during teardown to avoid leftover visuals and reduce leak risk.
* Fixes cleanup safety for timers and lights
Improves destruction paths to prevent stale references and list corruption during object teardown.
Ensures tracked timer references are removed safely and emptied collections are reset cleanly, reducing dangling state on callback owners.
Avoids duplicate light-source removal when both owners are the same object, and updates teardown behavior to better support garbage collection.
* tgui: rAF-batch winset calls during window drag/resize (#8)
* Fixes HUD cleanup and indicator safety
Prevents stale HUD effects by always clearing the overlay when the item is dropped, even if equip state has already changed.
Improves indicator updates with null-safe checks and a simpler preference fallback path, reducing runtime risk and ensuring a consistent default display.
* Improves teardown checks with lightweight state flags
Adds a new state marker for open interfaces and uses existing processing state to gate cleanup work.
Avoids unnecessary subsystem calls during object destruction, reducing list scans and overhead when nothing is active.
Prevents stale state by clearing the interface marker when interface lists are missing or emptied, and skips camera visibility bookkeeping for temporary generation placeholder tiles.
* Improves ping metrics and perf diagnostics
Adds richer latency measurement that separates network round-trip time from server tick delay, improving ping accuracy and making player-facing values more stable under jitter.
Introduces periodic and spike-triggered performance logging for latency, jitter, tick dilation, and cleanup overhead
Expands runtime status reporting with these new health signals to support quicker troubleshooting and tuning.
* Fixes ghost relocation and glide sync
Prevents extra movement callbacks when a dead observer is moved to an explicit destination, avoiding incorrect post-move handling.
Updates non-living movement to refresh glide timing before stepping, improving smoothness and keeping movement speed visuals aligned with tick rate.
* Fixes ghost movement to follow move pipeline
Improves dead-observer movement to use normal relocation flow instead of direct position edits, so movement side effects and callbacks stay consistent.
Returns explicit success/failure from movement checks, supports glide override handling, and updates movement callback compatibility to match the newer argument pattern.
Also avoids raw location assignment in shadow movement to prevent bypassing movement handling.
* Fixes ghost cleanup on deletion
Adds defensive teardown for spectator state when normal logout handling is skipped.
Prevents stale watch links and lingering level registration, reducing dangling references and inconsistent tracking after removal.
* Revamps MC tab with structured live metrics
Improves observability by replacing flat text output with structured data and a richer interface that is easier to scan during runtime.
Adds collapsible sections, health highlighting, sorting, and filtering so operators can quickly identify overloaded or inactive subsystems.
Separates high-level server metrics from per-subsystem rows to support cleaner updates and better client-side rendering performance, and prevents focus from being stolen while typing in inputs.
* Prevents invalid reagent transfer actions
Adds guard checks to stop transfer operations when the selected reagent is missing
* Adds null safety checks for action removal in quirk systems
* Fixes examine text for items without armor
Guards protection and durability list building behind an armor check to prevent null-access runtimes during inspection
* Refactors status tab into structured sections
Improves readability and scan speed by grouping round, time, character, and transit info into collapsible blocks with a consistent grid layout.
Adds structured client data for ping and time-dilation metrics to enable cleaner rendering, color cues, and lighter updates instead of rebuilding flat text output.
Aligns the debug/admin panel server metrics with the same card-style presentation for a more consistent interface and easier maintenance.
* Fixes nearest pheromone target selection
Replaces implicit return-value tracking with an explicit nearest-target variable to avoid ambiguous state handling
* Improves reuse and cleanup safety in UI systems
Adds object pooling for storage UI elements and shared parallax templates to reduce frequent allocation/deletion churn during refreshes.
Tracks chat message queue membership explicitly so rescheduling and removal stay consistent, preventing double-unlink behavior and counter drift.
Hardens teardown flows across visual and item systems to avoid acting on already-deleting references and to skip expensive refresh work during deletion.
* Adds null checks for target and speaker in chat message handling
* Adds target type check in bullet on_hit function to prevent errors
* Adds occupant check before unbuckling user in wheelys dropped function
* Fixes implant extraction precheck flow
Prevents the procedure from starting when no implant is found, instead of showing misleading extraction text. Resets temporary state and exits early when prerequisites fail, which avoids stale data carrying into later steps
* Fixes bot control argument handling for MULEbots in PDA cartridge
* Adds null check for cell before accessing radioactivity property in mecha
* Fixes chat prefix parsing on short input
Prevents invalid character lookups when a message contains only a channel marker or delimiter.
Improves parsing safety by requiring enough input length before reading the next key character, reducing edge-case runtime errors.
* Fixes signal unregistration for old body in ashwalker body transfer
* Optimizes living mob tick performance
Reduces per-tick overhead by reusing iteration buffers and trimming repeated work in high-frequency life processing.
Skips costly physical/status and environment checks for non-player-controlled dead or isolated mobs while preserving essential biological decay behavior.
Cuts unnecessary updates by throttling frequent identity refreshes, avoiding redundant gravity refresh calls unless gravity changes, and simplifying stamina regeneration checks.
* Fixes potential null reference in bodypart retrieval during reagent splash reaction
* Fixes lifecycle edge cases and UI overlay leaks
Prevents initialization and content-transfer paths from touching deleted or missing objects, reducing avoidable runtimes in edge cases.
Updates weak-reference cleanup so forced deletion no longer deletes the target unexpectedly and only clears back-links when ownership matches, improving object lifetime safety.
Improves typing-indicator handling by clearing it on mob teardown, caching generated overlays, and only generating default indicator visuals when needed, which reduces stuck indicators and unnecessary allocations.
Adds bounds checking for list slicing with negative or zero starts to avoid invalid index access.
* Fixes cleanup, permissions, and null safety
Adds accessor-based machine counts so status reporting relies on stable subsystem APIs instead of internal state.
Restores parent destruction flow in timer and lighting cleanup to keep lifecycle side effects intact and reduce dangling state risk.
Restricts GC queue refresh to debug-level rights, preventing broader admin access than intended.
Guards antagonist processing/death hooks against missing owners and fixes a malformed broadcast call, preventing avoidable runtime errors.
* Adds debug viewer for GC failures
Improves debugging of stuck deletions by recording failed garbage-collection attempts in a dedicated cache
Adds a debug action and navigation support so admins can inspect and revisit failure entries, making memory-leak and cleanup issues easier to diagnose
* Refactors account deposit logic to improve location handling and prevent null references
* Fixes empty-occupant sound check in boxes
Prevents invalid occupant access when no one is buckled inside, avoiding runtime errors.
* Improves parallax timing for non-living movement
Runs parallax processing in the background and gives non-living movement a stable tick-based animation time to avoid abrupt visual jumps.
Keeps glide-based timing for living movement only, and removes an unnecessary glide reset path that could desync movement visuals.
* Prevents stale monkey combat references
Fixes AI state cleanup so deleted entities are no longer kept as active targets or carry goals.
Improves destruction handling by clearing cross-references from other monkeys and stopping pursuit, which prevents garbage-collection leaks and avoids acting on invalid objects.
* Fixes potential null reference in parallax holder by resetting on invalid turf
* Enhances sledgehammer slash functionality by adding target validation and passing target to async invoke
* Fixes potential null reference by using safe navigation for original character resolution
* Fixes ghost teardown lifecycle edge cases
Prevents deferred logout cleanup from re-queuing deletion while teardown is already in progress, reducing racey double-delete behavior.
Clears lingering ownership references during destruction and removes unused observer state fields to keep cleanup safer and leaner.
* Improves GC failure diagnostics
Adds richer failure context to make hard-to-reproduce cleanup leaks easier to investigate, including object naming and runtime metadata in logs and the viewer.
Tracks how long entries wait before failing cleanup, helping distinguish transient delays from persistent retention.
* Fixes queue membership cleanup for scheduled events
Prevents incorrect queue accounting and stale links by explicitly tracking where each scheduled item is stored and resetting state on rebuild, enqueue, and eject paths.
Improves removal safety so counts are decremented only when items are actually bucketed, avoiding under/over-count drift and dangling list pointers.
Guards light-source teardown to remove lighting effects only when they were actually applied, reducing unsafe cleanup calls.
* Fixes destruction logic for pocket protector and accessory components
* Fixes stale ghost images after observer departure
Removes a departing observer’s visual overlays from all connected observer clients before global cleanup runs.
Prevents orphaned ghost visuals from lingering when shared image lists are updated, keeping observer views accurate.
* Fixes observer perspective reset on HUD destruction
* Fixes stale reservation cleanup across resets
Prevents dangling reservation references from surviving forced cleanup and causing invalid state later.
Detaches shuttle-held reservation links before global reservation wipes, and ensures preview-related reservation state is fully cleared during shuttle teardown.
Hardens unit test setup and shutdown so deleted shared reservations are reset and released, avoiding cross-test leakage and flaky failures.
* Adds null safety checks for medical HUDs and introduces unit tests
* Фикс status_effect, proximity_checker (#9)
* fix: achievements menu, tgui signals, character profile improvements
* fix: remove stale preview_dirty reference in character_profile.dm
* Update gateway.dm
райт нау cam_background будет регистрироваться только тогда, когда вызывается display_to_client
* fix: явный обработчик onPaste в TextArea для корректной вставки большого текста в BYOND 516 WebView2
* Fixes door controller ID input and number validation
Switches door controller ID input from numeric to text, allowing alphanumeric IDs as is typical for door access control systems.
Also adds a sanity check to prevent non-numeric default values from being passed to the number input component, avoiding potential crashes or unexpected behavior in min/max comparisons.
* Fixes locale-aware sorting for emote list
Specifies English locale explicitly in the sort comparison to ensure consistent, predictable alphabetical ordering across different browser and system locale settings
* Replaces PDA browser popup with direct browse call
* Prevents tooltips from appearing off-screen
Clamps tooltip position to ensure it never renders beyond the left or top edges of the screen, keeping it within the padded boundary at all times.
* Refactors global type declarations and adds path aliases
Moves global type declarations out of the `declare global` block into top-level ambient declarations, which is the correct approach for `.d.ts` files without module exports.
Adds a `process.env` type declaration to support environment variable access with proper typing.
Configures TypeScript path aliases in `tsconfig.json` so internal packages can be imported using short, readable paths instead of relative ones, improving maintainability across the monorepo.
* Requires explicit DEV_SERVER_IP to enable dev server connection
Previously, the dev server client would default to `127.0.0.1` if no IP was configured, potentially causing unexpected connection attempts in environments where no dev server is running.
Now the client treats a missing `DEV_SERVER_IP` as an opt-out, skipping both WebSocket and HTTP connections entirely. Also adds a null-check on the socket before accessing its state, preventing a potential runtime error.
* Port tgui payload chunking from tgstation#90295
- Split oversized tgui payloads (>2kb) into ~512b chunks sent sequentially
- Fixes large text inputs (paper writing etc) being truncated in BYOND 516
- Added TGUI_MAX_CHUNK_COUNT config option (default 64)
- Added tgui/public/tgui.html to DmTarget inputs in build.js
* Fix timer accumulation, timeout, payload limit and stale-state bugs in tgui chunking
* Фикс GC circular references in status_effect and proximity_checker
- status_effect/Destroy(): null linked_alert after clear_alert() call
- screen/alert/status_effect: add Destroy() that nulls attached_effect
Both fixes break the bidirectional linked_alert <-> attached_effect
circular reference that prevents GC of ~81 status effect / alert pairs
per round (limp, sleeping, stasis, determined, etc.)
- proximity_checker/advanced: add Destroy() that nulls parent
Breaks the parent ref back to datum/proximity_monitor/advanced,
unblocking GC of ~32 checker object instances per round
---------
Co-authored-by: DuLL_FoX <xomka63@gmail.com>
* Fix alert reference cleanup in status effect destruction and replacement
* Фикс additional GC failures: FoV signals, noose overlay, hotel reservations (#10)
- field_of_vision/UnregisterFromParent(): move UnregisterSignal for
COMSIG_ATOM_DIR_CHANGE/MOVABLE_MOVED/MOB_DEATH/LIVING_REVIVE outside
the if(M.client) guard these signals were never unregistered when
the mob had no client at cleanup time (e.g. deleted while logged out),
leaving a circular mob <-> component signal reference. Also add missing
COMSIG_ROBOT_UPDATE_ICONS to the unregister list (registered in
generate_fov_holder but previously never unregistered). Null
shadow_mask and visual_shadow after cleanup to release image refs.
- noose/Destroy(): QDEL_NULL(over) to release the overlay image datum
ref held on the structure.
- hilbertshotel storeRoom(): null area.reservation before qdel to break
the area -> turf_reservation back-reference that prevented GC.
- hilbertshotel ejectRooms(): same null before qdel, resolved via area
lookup from bottom_left_coords. Fixes ~35 turf_reservation GC failures.
* Prevents dangling embedded UI windows
Tracks embedded window mounts and unmounts so the server can clean up any leftovers after abrupt client-side exits. Adds a safety cap on managed embedded windows to avoid runaway state and keep cleanup predictable
* Guards UI actions against missing state
Adds early exits when requested connection points are missing and when non-eject actions run without a loaded program. Prevents null-reference runtimes and ignores invalid interactions, improving runtime stability
* Hardens skill modifier application flow
Adds support for applying and removing modifiers from batched inputs, improving compatibility with callers that pass multiple entries at once.
Guards against missing skill-target mappings so modifier updates fail safely instead of causing runtime issues. Updates role setup to apply wiring-related bonuses as singleton additions, improving consistency and avoiding unintended duplicate stacking
* Prevents crashes from invalid chat references
Adds stricter early validation for message anchors and speakers so processing stops when references are null or already deleted. Improves runtime stability by discarding invalid messages before location resolution or speaker handling can fail
* Fix/gc failures (#11)
* fix: achievements menu, tgui signals, character profile improvements
* fix: remove stale preview_dirty reference in character_profile.dm
* Update gateway.dm
райт нау cam_background будет регистрироваться только тогда, когда вызывается display_to_client
* fix: явный обработчик onPaste в TextArea для корректной вставки большого текста в BYOND 516 WebView2
* Fixes door controller ID input and number validation
Switches door controller ID input from numeric to text, allowing alphanumeric IDs as is typical for door access control systems.
Also adds a sanity check to prevent non-numeric default values from being passed to the number input component, avoiding potential crashes or unexpected behavior in min/max comparisons.
* Fixes locale-aware sorting for emote list
Specifies English locale explicitly in the sort comparison to ensure consistent, predictable alphabetical ordering across different browser and system locale settings
* Replaces PDA browser popup with direct browse call
* Prevents tooltips from appearing off-screen
Clamps tooltip position to ensure it never renders beyond the left or top edges of the screen, keeping it within the padded boundary at all times.
* Refactors global type declarations and adds path aliases
Moves global type declarations out of the `declare global` block into top-level ambient declarations, which is the correct approach for `.d.ts` files without module exports.
Adds a `process.env` type declaration to support environment variable access with proper typing.
Configures TypeScript path aliases in `tsconfig.json` so internal packages can be imported using short, readable paths instead of relative ones, improving maintainability across the monorepo.
* Requires explicit DEV_SERVER_IP to enable dev server connection
Previously, the dev server client would default to `127.0.0.1` if no IP was configured, potentially causing unexpected connection attempts in environments where no dev server is running.
Now the client treats a missing `DEV_SERVER_IP` as an opt-out, skipping both WebSocket and HTTP connections entirely. Also adds a null-check on the socket before accessing its state, preventing a potential runtime error.
* Port tgui payload chunking from tgstation#90295
- Split oversized tgui payloads (>2kb) into ~512b chunks sent sequentially
- Fixes large text inputs (paper writing etc) being truncated in BYOND 516
- Added TGUI_MAX_CHUNK_COUNT config option (default 64)
- Added tgui/public/tgui.html to DmTarget inputs in build.js
* Fix timer accumulation, timeout, payload limit and stale-state bugs in tgui chunking
* fix: 516 migration runtime fixes and tgui window sizing
- CharacterProfile.tsx: return null instead of undefined, merge double useBackend
- ByondUi.js: Реверт Byond.sendMessage
- LabeledList.tsx: пропущенный кей
- home_page.dm: ноль как сейвпоинт для GS
- bundle.dm: Бандл иницианализации
- cloth_drive.dm: Фикс иницианализации
- client_procs.dm: фиксим GS для скрина
- drag.js: increase SIZE_APPLY_TIMEOUT_MS 250->1500ms Повышен таймаут таймаут для геометрии окна
- backend.ts: INITIAL_VISIBILITY_GATE_TIMEOUT 500->2000ms
Повышен таймаут создания окна, чтобы не было бага с полным экраном
---------
Co-authored-by: DuLL_FoX <xomka63@gmail.com>
* Adds in-app find bar with Ctrl+F toggle
Intercepts Ctrl+F to open and toggle the internal search UI, preventing browser find from stealing focus.
Mounts the find bar at the app root and keys it by window/session context so state stays isolated and resets correctly across suspended or switched views.
* Improves in-page search and chart safety
Fixes edge cases in value normalization so invalid or zero-width ranges no longer produce unstable plotting results
* Enhances scrollbar styling and refines layout for better usability
* кей (#12)
* tgui: rAF-batch winset calls during window drag/resize
* удаляем кей
* Reorders server data display for improved readability
* Fix hover reference handling to ensure proper atom checks before deletion
* Fixes UI teardown signal and GC cleanup
Prevents stale client callbacks by unregistering lifecycle and login listeners during UI destruction.
Improves teardown order for screen elements so they detach from owners before deletion and clear retained visual state early. Reduces lingering references and lowers the risk of garbage-collection timeouts when refreshing preview and menu UI
* sort debug (#13)
* Refactor nuclear waste initialization to improve processing efficiency
* Enhance idle mob management to prevent dangling references during destruction
* Prevent tooltip display when items are in open storage
* Implement scanner disconnection logic in DNA Console and Scanner destruction
* Fix summon_backup to use rally point for movement, preventing hard references to qdel'd callers
* Fix get_filter to handle invalid filter indices and ensure filters list integrity
* Refactor defibrillator paddle handling and update shock paddles path for cyborg modules
* Implement reactor disconnection logic to ensure proper network handling during destruction
* Hardens savefile recovery for cache and bans
Improves resilience when temporary and legacy data files are locked or corrupted, so startup and icon encoding fail less often.
Adds cleanup and retry paths that remove stale lock files, rebuild broken files, and preserve a backup before recreating critical legacy data. Adds defensive result checks and clearer error logging to fail safely instead of propagating runtime errors.
* Add null checks for hud_list in health and status update procedures
* Fixes GC leaks and stale atmos references
Prevents deleted objects from being kept alive by hidden references in rendering, overlay state, and external atmos hooks, reducing soft-GC failures and hard-delete fallout.
Hardens atmos network teardown so disconnected machinery and pipes are pruned from active pipeline tracking, including in-flight processing lists, which avoids stale memberships and cleanup edge cases.
Improves explosion throw safety by skipping already-deleted items instead of crashing when throw logic races with deletion.
* Adds reference-tracking debug run presets
Improves local debugging by adding dedicated IDE build and launch options for reference-tracking runs.
Enables quick client/server startup with the required compile-time flags, reducing setup friction when investigating reference and GC lookup failures.
* Clears managed overlay refs on cleanup
Prevents stale overlay bookkeeping from surviving object teardown. Improves cleanup consistency and reduces risk of lingering references affecting later state.
* Fixes monkey item target cleanup
Adds centralized handling for pickup targets with automatic deletion tracking.
Prevents stale references and stuck pickup timers when targets disappear or become invalid, reducing inconsistent AI behavior. Improves cleanup during shutdown to avoid lingering state.
* Fixes stale overlays after cleanup
Ensures attached visuals are actively refreshed when embedded items or planted charges are removed, destroyed, or detonate.
Prevents leftover overlays and missed updates by unregistering overlay listeners during teardown and only forcing visual updates on valid targets.
* Stops stale drift processing on abstraction
Clears stored drift state when a movable becomes abstract and removes it from drift tracking.
Prevents inertial movement from persisting in invalid states and avoids unnecessary subsystem processing.
* Prevents stale refs during speaker cleanup
Adds teardown cleanup that clears held links when temporary speaker entities are deleted. Reduces lingering references and helps avoid memory retention or unexpected interactions after destruction.
* Removes locker electronics during closet destruction
* Links rubble to supply pod for proper cleanup and destruction handling
* Ensures console disconnection during R&D machine destruction
* Improves GC failure diagnostics and tracing
Adds deletion-hint tracking to failure records so investigations can tie failures back to destruction intent.
Expands the developer failure viewer with richer runtime context (components, signals, timers, traits, location/contents chains, and per-type deletion stats) to speed up root-cause analysis.
Adds fast targeted reference checks plus optional full world scanning, including async triggering and testing-mode auto-scan while failed objects are still alive.
* Handles playback promise rejection in AudioPlayer
* Fix reagent injection message to display the correct chemical name
* Refactor get_filter to improve filter data validation and indexing
* Reorder import statements to improve module organization
* Fix parameter type in inject_chem procedure for better clarity
* (IN ESSENCE A TEST, BUT NOT A TEST) Adds chat customization and search UX
Improves chat usability by adding in-panel search, a quick return-to-bottom action, and optional message timestamps with time dividers for better log navigation.
Expands appearance controls with configurable styles, animations, colors, glow, spacing, and scrolling behavior so users can tailor readability without rebuilding core chat behavior.
Stabilizes settings handling by applying visual options consistently after mount, preventing premature persistence during load, and extending settings version migration coverage to protect existing user preferences.
* Refactor AltClick interaction to use ui_interact for improved user experience
* Respects legacy chat choice during panel recovery
Moves UI switching to the actual ready state so chat only changes when the panel is fully loaded, reducing premature or misleading toggles.
Preserves a user’s explicit fallback to the old chat UI during troubleshooting, while still allowing a fresh retry path to return to the new UI when requested.
Updates the default chat text color to improve baseline readability when no custom theme value is set.
* Refines chat background motion pacing
Slows one animated background cycle to make movement feel calmer and less distracting over time.
Removes horizontal drift from another pattern’s end state so motion stays consistent and visually cleaner.
* Validate bounty choice and handle empty bounty lists in add_bounties procedure
* Improves fabricator UI clarity and usability
* Removes human mob from global suit sensors and latejoiners lists on destruction
* Fixes gas mixture cleanup leaks across atmos
Adds consistent deletion of temporary and transferred gas data after use, including during object teardown.
Prevents lingering allocations from repeated gas operations and improves long-run stability in atmospheric interactions.
* Clears character previews on window close
Ensures preview data is cleaned up when spawn/setup windows are closed, not only during full client teardown.
Improves consistency of preview cleanup and helps prevent stale render holders from lingering.
* Fixes teardown flow and cleanup ownership
Skips visual and signal teardown work for objects already being destroyed, while still clearing element-owned bookkeeping to prevent stale state.
Releases nested projectile resources during weapon destruction and avoids hard-deleting UI button collections that are only meant to be detached, reducing deletion side effects and leaks.
* Fixes robot teardown to release all references
* Fixes RPED and BSRPED deactivation to prevent memory leaks
* Fixes HUD teardown to prevent GC failures
* Hardens slime AI cleanup and timer safety
Prevents delayed actions from running on deleted entities by replacing ad-hoc waits with safe timer callbacks and explicit deletion checks.
Improves relationship tracking by validating attackers, carrying friend data safely to offspring, and hooking cleanup so stale references are removed automatically.
Stops background behavior during teardown and ensures movement recovery steps run in a safer, split phase to reduce race-condition runtimes.
* Fixes cleanup during movable and monkey teardown
Prevents stale interaction state by stopping active pulling when an entity is destroyed, reducing dangling references and inconsistent behavior. Improves monkey disposal by freeing combat-related state and cached path/item data, helping avoid leaks and leftover state after deletion.
* Fixes lingering HUD elements on cleanup
Ensures UI overlays and screen objects are removed from the client view during teardown so stale elements do not persist between HUD/menu transitions. Improves cleanup order by detaching visual text from active space before deletion, reducing ghost UI artifacts and related lifecycle issues
* Defers GC ref scans to on-demand flow
Reduces runtime overhead by removing automatic deep reference scanning from the production GC-failure path, where it can cause noticeable lag.
Adds an explicit on-demand scan action with a warning and safety checks, so admins can run heavy diagnostics only when needed.
Keeps automatic reference collection in testing builds to preserve deep debugging coverage.
* Fix/tgui drag raf batching (#14)
* tgui: rAF-batch winset calls during window drag/resize
* удаляем кей
* Fix screen object GC failures and family heirloom ref leak
* Fix remove() type path in family_heirloom and monkey combat if-else
* fix: GC leaks in mobs - replace spawn() with addtimer/INVOKE_ASYNC, add TIMER_DELETE_ME
- slime.dm/life.dm: AIproc=0 in Destroy(), UnregisterSignal for Friends, spawn(45) -> addtimer TIMER_DELETE_ME, discipline_push() proc
- monkey/combat.dm: TIMER_DELETE_ME for addtimers, QDELETED guards, fix else-without-if
- bot.dm: 6x spawn() -> addtimer/INVOKE_ASYNC + 5 new procs
- ed209bot.dm: 3x spawn() -> addtimer/INVOKE_ASYNC + 2 new procs
- floorbot.dm: spawn() -> addtimer TIMER_DELETE_ME + floorbot_emagged_resume()
- giant_spider.dm: 2x spawn() -> addtimer + 2 new procs
- dog.dm: 3x spawn(0) -> INVOKE_ASYNC + tail_chase_animation()
- terror_ai.dm/reproduction.dm: spawn() -> addtimer + resume_automated_movement()
- honkbot/secbot/SuperBeepsky/living_defense/living_mobility/laws/ai/life/robot: add TIMER_DELETE_ME to addtimers
- terror_spiders/candy/dancer/funclaw/funwolf: add TIMER_DELETE_ME to addtimers
* Fixes apply_overlays to handle empty color lists gracefully
* Fixes AI after_spawn to check law path validity before installation
* Fixes update_icons to return early if module is not defined
* Adds initialization call for escape menu screen on map load
* Fix/tgui drag raf batching (#15)
* tgui: rAF-batch winset calls during window drag/resize
* удаляем кей
* Fix screen object GC failures and family heirloom ref leak
* Fix remove() type path in family_heirloom and monkey combat if-else
* fix: GC leaks in mobs - replace spawn() with addtimer/INVOKE_ASYNC, add TIMER_DELETE_ME
- slime.dm/life.dm: AIproc=0 in Destroy(), UnregisterSignal for Friends, spawn(45) -> addtimer TIMER_DELETE_ME, discipline_push() proc
- monkey/combat.dm: TIMER_DELETE_ME for addtimers, QDELETED guards, fix else-without-if
- bot.dm: 6x spawn() -> addtimer/INVOKE_ASYNC + 5 new procs
- ed209bot.dm: 3x spawn() -> addtimer/INVOKE_ASYNC + 2 new procs
- floorbot.dm: spawn() -> addtimer TIMER_DELETE_ME + floorbot_emagged_resume()
- giant_spider.dm: 2x spawn() -> addtimer + 2 new procs
- dog.dm: 3x spawn(0) -> INVOKE_ASYNC + tail_chase_animation()
- terror_ai.dm/reproduction.dm: spawn() -> addtimer + resume_automated_movement()
- honkbot/secbot/SuperBeepsky/living_defense/living_mobility/laws/ai/life/robot: add TIMER_DELETE_ME to addtimers
- terror_spiders/candy/dancer/funclaw/funwolf: add TIMER_DELETE_ME to addtimers
* fix: more GC leaks - screen_loc null, wrong hud_owner, addtimer TIMER_DELETE_ME
Эскейм меню, хом перйдж, щилтинг, обсервер
* fix: GC failures
- escape_menu/leave_body_button
- arousal screen
- proximity
- living_defense
* fix: screen GC failures on disconnect and mob transitions
- screen/Destroy: screen_loc=null now unconditional (was inside if(client) check - would silently skip when mob has no client during mob transitions, leaving BYOND appearance cache ref set -> GC failure)
- client/Destroy: null screen_loc on all screen objects before QDEL_HINT_HARDDEL_NOW - BYOND hard-deletes client.screen contents via del() bypassing Destroy(), so screen_loc must be cleared here before the engine processes the hard delete
* Fix index validation in list operations to handle edge cases
* Fix unregistering signals to handle null components gracefully
* Hardens null safety in runtime-sensitive paths
Prevents avoidable runtime errors by adding early exits and safe optional access where objects may be missing during deletion, UI/view updates, and interaction state reads.
Improves module-dependent sleeper selection by making branches mutually exclusive and guaranteeing a fallback, so chosen variants are no longer accidentally overwritten.
Updates ingredient box discovery to use only concrete subtypes, reducing invalid entries and making initialization more reliable.
* Hardens null handling across UI and components
Fixes multiple edge-case runtimes caused by deleted or missing references during UI polling, signal cleanup, and async callbacks.
Improves stability by revalidating client state in retry loops, safely handling optional ownership and preference data, and skipping work when required sound or visual data is absent.
Prevents teardown-time inconsistencies by tightening unbuckle checks and using safer list cleanup behavior for optional action containers.
* Guards pipenet reset when parent is missing
Fixes reconnection logic to only clear an existing network parent.
Prevents null-reference runtime failures during atmospheric reinitialization, improving stability for temperature-control devices when no parent network is present.
* Enhance null safety in examine function for species attributes
* Enhance null safety in gravity and movement checks for human mob
* Enhance null safety in bloodfledge quirk mob checks
* Hardens runtime safety across HUD and mecha flows
Adds defensive null/state guards in several UI, overlay, implant, and vehicle interaction paths to prevent runtime errors from deleted or missing references during delayed or asynchronous execution.
Improves reliability by preserving overlay tracking state, validating malformed saved-circuit input with explicit errors, and fixing ordering/state propagation in electronics assembly setup.
Ensures vehicle melee interactions carry the correct acting user context, improving intent/trait handling and reducing edge-case behavior during automated bump attacks.
* Enhance null safety checks for DNA species in human life processes
* Guards visual updates against null state
Fixes runtime-prone paths by adding null checks before reading fluid data during visual refreshes.
Improves stability for reagent containers and hygiene processing when internal data or location state is temporarily unavailable.
* Enhance null safety in internal pressure calculations for atmospheric machinery
* Prevents logout and room restore runtime errors
Adds defensive checks during disconnect handling so ticket cleanup only runs when valid state exists, avoiding null-reference failures during shutdown paths.
Guards room item restoration against missing or shorter stored tile data, preventing out-of-bounds access while still restoring available contents safely.
* Hardens update paths against null runtimes
Prevents intermittent crashes by adding defensive null checks in several hot paths where objects can disappear mid-tick.
Bounds list trimming safely during partial processing so queue cleanup never oversteps valid ranges, improving stability under load.
* Prevents edge-case timer and audio runtimes
Fixes failure paths caused by stale or already-disposed scheduled work so processing skips invalid entries instead of crashing.
Updates client-time cleanup to always remove ended entries from tracking queues, preventing lingering state and follow-up errors.
Adds a guard to stop looped audio playback when its owner is gone, avoiding orphaned runtime faults.
* Enhance null safety in input handling for integrated circuits
* Enhance null safety in signal handling by checking type before accessing properties
* Validates cloud program and rule indices
Prevents out-of-range lookups from malformed or stale UI input, reducing runtime errors and abuse paths when editing cloud backups.
Only applies sounds and state changes after IDs pass bounds checks, so invalid requests fail early and safely.
* Enhance null safety in admin PM handling by checking current_ticket before sending signals and logging
* Enhance client-time timer handling by ensuring index remains valid during timer removal and addition
* Fixes stuck keys when focus shifts to UI
Forwards missing key-release events when a key is pressed in gameplay and released after focus moves to interface inputs, preventing keys from remaining stuck.
Adds lightweight key state tracking in the browser to detect orphaned releases and send the expected release signal, while clearing tracked state on window blur to avoid stale key states.
* Fixes exception variable naming in program format validation
* Fixes exception variable naming in program format validation
* Fixes memory management in integral destruction by nullifying interacter references
* Fixes null reference handling in screen destruction and ensures proper initialization in splash screen
* Fixes variable naming for card hand in toy object
* Updates native bridge to v6 and new utilities
Improves compatibility with newer runtime builds by updating native library resolution and upgrading the bundled native dependency.
Adds broad new helper coverage for image metadata, QR output, hashing/encoding, random generation, timestamp formatting, sound duration queries, HTML sanitization, and expanded icon processing workflows to reduce custom glue code.
Removes or reshapes outdated interfaces and signatures so integrations align with the newer native API surface and behavior.
* Fixes enemy cleanup when targets are deleted
Adds centralized enemy add/remove handling with deletion-signal lifecycle management.
Prevents stale threat entries and inconsistent cleanup when targets die, despawn, or are removed.
Updates retaliation and shared-aggression paths to use the same flow consistently, while keeping priority aggro ordering behavior intact.
* Updates CI workflow to use Ubuntu 24.04 for all jobs
* Adds game start check to observer status display
* Refactors tcg card handling to use player preferences correctly
* Refactors clockcult antagonist handling to use current member for equipment and greeting
* Adds user check to prevent preference window display for non-client users
* Fixes ventcrawl grant after monkey transformation
Avoids attaching movement perks during the same human-to-monkey conversion step, where entity references can be unstable
* Fixes disassembly process for barricades to ensure proper return after tool use
* Revert "Updates native bridge to v6 and new utilities"
This reverts commit 1e87bc89a1433229344168403d3bb25a1fef59d3.
* Revert "Updates CI workflow to use Ubuntu 24.04 for all jobs"
This reverts commit 823effdaee9a677bbc7227c203b3e930fc409d85.
* Fixes monkey and chat edge-case regressions
Prevents delayed speech and emote handlers from continuing after the actor is deleted, reducing post-input runtime errors.
Hardens protection calculations by only reading valid armor data, so malformed equipment state no longer breaks damage checks.
Corrects leg restraint overlay color/layer usage so monkey restraint visuals render consistently.
Updates infection-triggered monkey conversion to apply the intended role state before transforming, preserving expected gameplay behavior.
* Removes redundant screen cleanup
Removes manual clearing of screen position during teardown and hard delete paths.
Keeps cleanup centralized in screen detachment logic, reducing duplicate state handling and making destruction behavior more consistent.
* Reapply "Updates native bridge to v6 and new utilities"
This reverts commit 88bd18cc8d80161cd3fc2fdd3e0b38727bf46d7d.
* Reapply "Updates CI workflow to use Ubuntu 24.04 for all jobs"
This reverts commit 64fdedcf2f7b3565c451f781abef5f1b24cc7a15.
* Prevents runtimes in edge-case interaction flows
Adds defensive null checks around UI clicks, callbacks, client-dependent actions, and optional integrations so transient disconnects or deleted state no longer crash flow logic.
Fixes a few logic mistakes in ownership/location and messaging paths to keep behavior consistent while failing safely when references disappear.
* Hardens null checks across gameplay systems
Prevents runtime errors by guarding against missing client, preference, parent, physiology, and movement state during character setup and quirk/language assignment flows.
Updates language cleanup calls to use the current source-based argument style, improving consistency and reducing brittle call patterns.
Fixes a quirk removal handler mismatch so the correct neutral trait cleanup runs, and expands localized ion-law vocabulary with department terms.
* Hardens runtime paths with null checks
Prevents avoidable runtimes by validating missing resources and stale references before continuing key flows.
Improves stability in login/UI/music/combat/status handling when clients, objects, targets, or data are absent or already deleted.
Adjusts cleanup behavior to avoid unsafe deletion patterns and reduce teardown-related errors.
* fix: Medical HUD refcount desync with multiple sources (implant+glasses, Odysseus) (#16)
* Enhances proximity monitor by ensuring checkers list is initialized and optimizes checker management
* fix: Canvas DPI scaling click offset and blurry portrait preview (#17)
* Caches preview icons to reduce regeneration cost
Improves menu responsiveness by reusing previously generated preview images instead of rebuilding identical icons repeatedly.
Reduces redundant work during loadout initialization while preserving existing fallback behavior when icon generation fails.
* update: upgrade pygit2 to version 1.19.0
* Improves TGUI bridge reliability for WebView2 transport
Adds idempotent retries for Byond.command and winset calls lost by
location.href transport, introduces truncated debug serializer to fit
under topic URL limits, replaces fixed watchdog timers with retry-aware
interval, and tunes retry/timeout constants for faster recovery.
* Fixes stuck movement keys when panel steals focus (BYOND 516)
Tracks regular keys pressed in the TGUI panel and forwards orphaned
KeyUp events to BYOND when a key is released without a preceding
KeyDown. Adds visibilitychange handler to release all server-side keys
on app refocus, preventing ghost movement after Alt-Tab.
* Clears movement buffers when movement is locked
Resets next_move_dir_add and next_move_dir_sub when movement_locked is
active so stale directional input does not trigger unexpected movement
after the lock is released.
* Batches mutant bodypart updates during regenerate_icons
Suppresses redundant handle_mutant_bodyparts calls inside
regenerate_icons by gating them behind a block_mutant_updates flag,
then performs a single final update at the end. Reduces repeated
overlay rebuilds from ~8 calls to 1 per full icon regeneration.
* Replaces MeasureText with server-side runechat line estimation
Eliminates the MeasureText network round-trip (~164ms per message) by
computing line count server-side using average character width and
prefix icon dimensions. Adds comprehensive unit tests covering boundary
conditions, monotonicity, and large-value correctness.
* Throttles idle turret target scanning
Skips expensive view() calls for 4 ticks (~8s) when no valid targets
are found, resuming full-rate scanning immediately when targets appear.
* Fixes aspergillum loop iterating all world objects instead of turf
Adds missing 'in T' filter to the holy item check so only aspergillums
on the local turf block cultists from closing closets.
* Reskins player panel with dark theme
Replaces inline bgcolor/font styles with CSS classes, adds hover
highlights and alternating row colors, and switches body onload to
script-based event binding for WebView2 compatibility.
* Fixes powernet reference leak for non-standard power consumers
Clears nuclear reactor nodes and nulls cable/node lists in Destroy()
to prevent dangling references when a powernet is garbage collected.
* Fixes runtime edge cases across core systems
Adds defensive null checks before signal and wire access to prevent intermittent runtime errors.
Guards against acting on deleted occupants during DNA scrambling, wraps aurora color progression safely, and exits early in auto-harvest fallback flow to avoid inconsistent post-harvest state handling.
Improves reagent handling order and pH mixing safety to prevent invalid calculations when total volume is zero.
* Improves chat truncation readability
Prefers trimming at the last word boundary instead of cutting text mid-word, so clipped messages read more naturally.
Falls back to hard truncation when no reasonable break point exists, preserving length limits without overly aggressive shortening.
* [TEST] Fixes HUD position loss after reconnect
Saves UI element positions during client disconnect cleanup before clearing them to break stale appearance-cache references and avoid garbage-collection failures.
Restores those saved positions when the interface is shown again, so persistent HUD elements return in the correct place after reconnect instead of being misplaced or lost.
* [EXPEREMENTAL OPTIMIZATION] Optimize atmos machinery processing and polling
Reduce redundant atmos machinery work (proc calls, icon updates, and turf/power handling), switch to lighter operational-state checks, and streamline several component `process_atmos()` paths. Add P/T-based throttling for air alarms and air sensors with forced full checks every 6 ticks to preserve gas-composition detection, and fix vent scrubber widenet pressure-cap enforcement.
* [EXPEREMENTAL OPTIMIZATION] Fixes background processing and state sync bugs
Prevents several systems from doing unnecessary per-tick work, which reduces overhead and avoids stale behavior (like lingering interaction sounds or inactive devices still acting).
Improves state consistency by skipping no-op visual updates, normalizing displayed text, and reusing already computed power surplus so related effects read the same value in the same tick.
Hardens list and lifecycle handling by making ignore tracking deterministic, only starting decay processing when applicable, and moving repeated scare checks to timers instead of always-on processing.
* Revert "Improves TGUI bridge reliability for WebView2 transport"
This reverts commit 8b9883b7d90c7cbe3a0d4e14f099bd201ddf6dbb.
* Revert "[TEST] Fixes HUD position loss after reconnect"
This reverts commit 4f1f30dad2c48e17a2211ba9a44aab4455483b65.
* Revert "[EXPEREMENTAL OPTIMIZATION] Optimize atmos machinery processing and polling"
This reverts commit 4580ccce8116255715a3f4167201f2bbf639b7d8.
* Reapply "[EXPEREMENTAL OPTIMIZATION] Optimize atmos machinery processing and polling"
This reverts commit 4626d8154cf2f001d34ed8107af87f768f0158d0.
* Revert "[EXPEREMENTAL OPTIMIZATION] Fixes background processing and state sync…
d21c2ed to
f5b7354
Compare
e06a8c8 to
a2869bd
Compare
b632c50 to
0506dcf
Compare
767766d to
80db68c
Compare
163a6e6 to
01d814c
Compare
cd8bade to
31ed668
Compare
00fff64 to
5023007
Compare
bf7ff82 to
60d6399
Compare
60d6399 to
f78854d
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging.