Skip to content

feature: utility practice reliability, focus the lineup you load, small crosshair up close, clear/rethrow/bots/flash - #219

Open
lukepolo wants to merge 14 commits into
mainfrom
claude/brave-allen-jg68m2
Open

lukepolo wants to merge 14 commits into
mainfrom
claude/brave-allen-jg68m2

Conversation

@lukepolo

@lukepolo lukepolo commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Changes

Aim crosshair up close (SwiftlyS2 and CSS)

  • The reticle size had a 9-unit floor. Facing a wall a few units away, it filled the screen and you couldn't find the aim point inside it.
  • It now scales with distance all the way down, so it stays about 2.5° on screen at any range. The beam width and centre dot shrink with it.
  • From about 200 units out it looks the same as before.
  • The lineup name stays above the crosshair, sized the same way.
  • The CSS port's aim ring scales the same way and gets a centre dot.

Text removed

  • Removed the utility-type label over the landing spot.
  • Removed the CSS port's "AIM" label.
  • Removed the CSS port's "STAND / name" label on the ground. The lineup name now shows at the aim ring instead.

Focus the lineup you load (SwiftlyS2)

  • Loading a lineup (website, .load / .next / .prev, HUD, solve, playbook) hides every other library marker for that player only, using ShouldBlockTransmitEntity.
  • .all shows the full library again and keeps the lineup loaded. .clear, .reload, deleting the lineup, starting a drill or execute, disconnecting, a map change or a hot reload also bring it back.
  • While a drill or execute runs, nothing is hidden.

Clear, rethrow, bots and flash (from #179)

  • .clear holds until you ask for something again, and it also removes smokes, fires and grenades in the world.
  • The ping key clears thrown utility.
  • .rethrow throws the loaded lineup, or your last throw if nothing is loaded, from where it was thrown, without moving you.
  • Bots that died or were added mid-round are respawned onto their spots.
  • Flash feedback covers players as well as bots.

Reliability: markers disappearing, reloads, 2+ players (SwiftlyS2; one commit per fix)

  • bb286b7 Shared layer for everyone:
    • The shared marker layer is built from every connected player's library, merged by client_id. The 150-lineup cap is shared round-robin between players.
    • Each entity remembers which lineup(s) it stands for, and each player is sent only theirs. Private lineups are no longer shown to the room.
    • Before, the library only redrew for a solo player, and .load / .save drew the caller's private library for everyone.
    • The layer redraws on every landed fetch, after .delete, and after a disconnect.
  • e7cbfbf Round restart:
    • Markers and selections are redrawn after a round restart, warmup end or mp_restartgame.
    • Stale entity handles are now dropped instead of despawned. A recycled address reads as valid, so despawning a stale handle could have deleted an unrelated new entity. The same hazard existed on map load and is fixed there too.
  • 85b895e Caller-only commands: .clear, .crosshair and .reload touch only the caller's own markers. .clear hides the library from the caller alone.
  • 32b9a67 Fetch vs. save race: a library fetch that left before a save or delete no longer undoes it. Local changes are merged over the panel's answer until the panel agrees.
  • 1edfd8d Upload retries: the retry queue drains every 30s while anything is queued, plus one bounded try on unload.
  • c8702fe Hot reload:
    • The RoundStart hook is unhooked on unload.
    • A torn-down guard stops fetch answers, trajectory continuations and scheduled callbacks from a previous instance from drawing or teleporting.
  • 97f9ad6 Same-map changelevel: changelevel onto the same map reloads everyone's library.
  • 09a8314 .next / .prev position: your place is kept when your library refreshes.
  • eba99ef Archived lineups: a lineup archived on the website is dropped from whoever has it loaded or focused, with a chat line telling them.
  • 38640cf CSS port: gets the fetch merge and the retry drain. The other fixes don't apply there, because it has no shared layer, library drain or map flag.

Testing

Not compiled: there was no .NET SDK in the environment these were written in. The SwiftlyS2 API calls were checked by hand against its source. Needs a build plus an in-game pass:

  1. Solo: .load, then mp_restartgame 1. Markers and the crosshair come back within about a second. Same after warmup ends.
  2. Two players, A with private lineups and B without:
    • B sees only public lineups.
    • A .saves: the new marker shows for A only.
    • Make a lineup public on the website and push a refresh: B sees it.
  3. A runs .clear: markers vanish for A only. A .loads: they come back.
  4. A runs .crosshair and .reload: B's markers don't blink.
  5. B disconnects: B's private lineups leave the layer.
  6. .save then immediately a website push: the new lineup survives. .delete then a refresh: it stays gone.
  7. Block the panel, .save, unblock: the save posts within about 30s. Hot reload with something queued: the log shows a flush or a warning.
  8. Hot reload mid-map with 2 players: no duplicate or orphan markers, libraries come back, grenade models still render.
  9. changelevel <same map>: libraries reload.
  10. .next a few times, push a refresh, .next again: it continues where you were.
  11. Archive your loaded lineup on the website, then refresh: you get the chat line and the library reappears.
  12. Crosshair and focus: face a wall with a short lineup (crosshair and name stay small), no text above smokes, .all restores the library.
  13. Clear, rethrow, bots and flash: .clear with live smokes, the ping key, .rethrow with and without a loaded lineup, .bot twice mid-round, flash timings in chat.
  14. CSS: repeat checks 6 and 7.

Things to watch

  • Visibility is re-applied to every player on each .load / .next (entities × players native calls). Watch tick time on a busy map.
  • .spawns rings are forgotten on a round restart; run .spawns again.
  • Grenade models after a first-ever mid-map load may not render, because there's no way to precache mid-map. A hot reload should keep the models the previous instance precached.

…okes

The aim reticle was sized at 4.5% of its distance but never below 9 units,
so facing a wall a few units away it filled the screen and the point inside
it could not be found. It now scales with distance all the way down (same
~2.5 degrees at any range), with its beam width and centre dot shrinking
alongside; far-away reticles are unchanged.

Also removes the floating world text over the landing spot and above the
aim point, along with the label bookkeeping that only existed for it.
Puts back the lineup name over the aim crosshair in the SwiftlyS2 plugin,
since several throws off one spot need it to tell them apart. It now
shrinks with the crosshair up close so it no longer covers the point it
names; from ~200 units out it is unchanged.

The CounterStrikeSharp port drops its STAND label on the ground and shows
the lineup name at the aim ring instead, sized the same way.
Loading a lineup (.load, .next/.prev, the menu or map, or the website)
now hides every other lineup's markers from that player only, using
SwiftlyS2's per-player transmit blocks. Their loaded lineup keeps its
stance, crosshair and landing. .all brings the whole map back; .clear,
.reload, .save, a drill or an execute also leave it whole.
Brings over #179 onto the current plugin:

- .clear holds until the player asks for something again, so the spot
  watcher no longer redraws the markers a quarter second later, and it
  also clears the smokes, fires and grenades in the world.
- The ping key clears thrown utility, silently when there was none.
- .rethrow throws the loaded lineup (or your last throw) again from where
  it was thrown without moving you, and says why when it cannot.
- Bots killed or added mid-round are respawned and stood back on their
  spots.
- Flash feedback for players as well as bots: how long it would have had
  you, and the thrower hears it for the team-mate they flashed.

Merged with the practise-one-lineup focus: loading still clears the hold,
and .clear still drops the focus.
@lukepolo lukepolo changed the title feature: utility practice: small crosshair up close, no text over smokes, focus the lineup you load feature: utility practice: small crosshair up close, focus the lineup you load, clear/rethrow/bots/flash fixes Oct 6, 2026
@lukepolo lukepolo changed the title feature: utility practice: small crosshair up close, focus the lineup you load, clear/rethrow/bots/flash fixes feature: utility practice reliability, focus the lineup you load, small crosshair up close, clear/rethrow/bots/flash Oct 7, 2026
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