LockTimer 24/7 ghost-mode server + plugin split#1
Open
Conversation
8cda315 to
39e4aa3
Compare
Turn lock-timer into a dedicated server where arbitrary players can join, speedrun the course, and leave without ever seeing, damaging, or affecting each other. - PlayerIsolation: OnCheckTransmit hides every foreign controller + pawn from each viewer (ghost mode). - AutoSpawn: on full connect, assign team + default hero and teleport to the start-zone centre; re-teleport on respawn via pawn-index change detection in the existing ticker. - DamageBlocker: OnTakeDamage returns Stop for player-vs-player damage; self/environmental damage passes through. - ServerConfig: applies convars in OnStartupServer to disable troopers, NPCs, bots, and shorten respawn timing. - Finish chat now goes only to the finisher instead of broadcasting. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tick re-added the slot to _enabledSlots every frame, so /speed off lasted one tick before the HUD respawned. Flip to an opt-out _disabledSlots set so the toggle persists. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GhostMode packages the solo-practice concerns (player isolation via OnCheckTransmit, PvP damage block, convar lockdown, team/hero auto-assign) so any future gamemode can opt in. Default hero/team are env-configurable (DEFAULT_HERO, DEFAULT_TEAM). SpeedHud is now a standalone plugin with its own 100ms ticker and /speed toggle. LockTimer keeps only its gamemode-specific pieces: zones, timer FSM, timer HUD, metrics, teleport-to-start-zone. gamemodes.json loads all three plus StatusPoker for lock-timer. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Runners must touch each checkpoint in the listed order before the end zone will register a finish. Each split is announced in chat and emitted as a locktimer_checkpoint_time_ms metric. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Per-player minimap-only ping pointing at the current target (start, next checkpoint, or end), re-sent every 1.5s so the client marker stays alive. Uses a stable per-slot ping id so new pings replace the old marker. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
39e4aa3 to
c9e96ed
Compare
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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.
Summary
OnCheckTransmitplayer isolation,OnTakeDamagePvP block, convar lockdown (no NPCs/bots/troopers), team + default-hero auto-assign on connect. Env-configurableDEFAULT_HERO(Haze) andDEFAULT_TEAM(2)./speedtoggle. Lifts cleanly out of LockTimer for reuse by any movement-oriented gamemode./reset/pos/zonescommands. Finish message is per-slot (silent to others).gamemodes.jsonloadsStatusPoker + GhostMode + SpeedHud + LockTimerfor thelock-timergamemode;normalis untouched.Internal cleanups along the way:
RunState.Finished.SpeedHudtoggle:/speedoff was re-enabled one tick later becauseTickunconditionally re-added the slot. Flipped to an opt-out_disabledSlotsset..gitignorenow excludesbin/andobj/.Test plan
dotnet buildall three plugins — 0 warnings.dotnet test LockTimer/LockTimer.Tests— 22/22 passing.docker compose up lock-timer -d; verify all four[<Name>] Loadedlines in logs and all four DLLs in/managed/plugins/./speedtoggle persists; finish message goes only to the finisher; metrics POST fires.docker compose up normal -d— only StatusPoker loads in thenormalimage.🤖 Generated with Claude Code