Skip to content

feature: nade QoL enhancements - #568

Merged
lukepolo merged 8 commits into
mainfrom
feature/nade-qol
Aug 28, 2026
Merged

feature: nade QoL enhancements#568
lukepolo merged 8 commits into
mainfrom
feature/nade-qol

Conversation

@lukepolo

@lukepolo lukepolo commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Pairs with api#401 and game-server#177. Mostly feedback from live use of #396.

Map callouts. scripts/extract-map-callouts.mjs pulls each map's env_cs_place volumes out of its VPK. useMapCallouts() reads them back and auto-names throws in four places: the add-lineup panel, save-from-match, meta spots, and a callouts layer on the 2D replay (off by default). RadarCallouts.vue draws them — each box at its own centre Z, or Nuke's two floors stack.

Map assets rebuilt and rehosted. Meshes came from the awpy pack, which was many CS2 builds behind what the nodes run, so reworked maps were raycast against old geometry — extract-map-meshes.mjs builds them straight from the CS2 install instead. And jsDelivr 403s anything over ~20 MiB, which the 3D viewer reads as "no mesh", so assets moved to the panel's own worker in front of B2, keyed maps/<cs2 build>/. Meshes ship as .tri.gz and are decompressed in the browser: Cloudflare strips Content-Encoding and won't re-compress application/octet-stream, so inferno was arriving 18.6 MB instead of 2.4 MB.

The clip filter was dead. Source2Viewer moved these names from materials to meshes, so a material-only test matched nothing and every clip brush shipped as world geometry — 9,576 triangles of invisible playerclip and skybox on Mirage alone.

Console and pod logs for practice servers, staff-gated, reusing what the match page already has.

Add-lineup fixes. The yaw stepper threw out of a computed and took the whole panel down (type="number" hands back a Number; hasAim called .trim()). Picking silently stopped working above zoom 1 (pointer capture ate the click). Re-picking an end never worked — the markers are now the affordance.

Also: execute save was silently blocked by an empty name; scope tab counts are a subscription instead of a one-shot query; the footer no longer flickers on tab switch.

lukepolo and others added 7 commits August 27, 2026 18:01
…icked

Three defects in the add-lineup flow, all reported from live use.

The aim fields are type="number", so v-model casts and hands back a Number the
moment either is touched. hasAim called .trim() on it, threw out of a computed
the step strip and the footer both read, and took the whole panel subtree down
-- leaving the page-level CANCEL as the only thing on screen. It now tests the
value rather than its spelling, and the refs are typed for what they actually
hold.

Picking silently stopped working at any zoom above 1. The viewport took a
pointer capture on press, and while a capture is set the compatibility click is
dispatched at the capturing element instead of the element under the pointer --
so the click never reached the svg. Capture is taken on first movement instead,
by which point the gesture is a pan and there is no click to lose. The
drag/pick threshold is now measured from where the press started rather than
between consecutive move events, so a slow drag pans without also picking.

Re-picking an end never worked: the two coordinate buttons were the only
affordance and they were inside the place step, which the panel leaves on its
own the moment both ends are set, while onPick kept handing the mode back to
landing so every later click moved the wrong end. The markers are now what the
hint always claimed -- press one to aim the next pick at it, drag it to move it
-- the coordinates stay visible on every step, and the mode only auto-advances
while the pair is still being placed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JTocnM98q1YiSRN4Z73REh
Saving an execute with no name did nothing and said nothing. The field is
quiet until hovered and its placeholder read "A Site default", so an empty
required field looked like a filled-in one -- and the disabled Save had no
entry in the notice list every other blocker uses. The missing name is now a
notice, the field draws itself while it is blocking, and the placeholder no
longer reads like a value.

The scope tallies were a one-shot query that only moved when something else
happened to refetch it, and neither submitting for review nor saving a lineup
was one of those things -- so REVIEW never incremented and the way to find out
whether anything had registered was to switch tabs. They are a subscription
now, which also covers changes made by anyone else, and the eight scattered
refetch calls are gone with it.

Switching tabs flashed the "Add a Lineup" button up and away again: panelEmpty
was reset to false on every switch, asserting a full panel for as long as the
new one took to load. It is tri-state now -- null is "has not said yet" -- and
only the two panels that actually draw their own offer when bare can silence
the footer.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JTocnM98q1YiSRN4Z73REh
The first thing the feedback asked for: "constant issues with server making,
and getting a connection -- please add console or a way to manage server / see
logs". A practice pod is a game server like any other, but the panel offered
no way to ask it anything, so a server that refused connections was a dead end.

The match page has had both for a long time, and neither needed backend work:
the log socket takes m-<match_id>, which the session already carries, and RCON
takes the server id, which is one relationship away. Both are staff-gated here
because both are staff-gated on the server -- logs are administrator only, and
RCON also accepts the moderator running the match, which the practice host is.
Showing them any lower would render a console that only ever answers with an
error.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JTocnM98q1YiSRN4Z73REh
@lukepolo
lukepolo merged commit 2e58575 into main Aug 28, 2026
1 check passed
@lukepolo
lukepolo deleted the feature/nade-qol branch August 28, 2026 14:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant