Adds a standalone Commonwealth Online pause menu mockup with the Fallout-style map, left-side navigation, server info, controller prompts, and keyboard handling. Also includes map zoom/pan behavior, fixes the UI scale custom property so sizes resolve correctly, and updates the changelog and dev log.
18 KiB
18 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
For testing notes, milestone summaries, known issues, and next steps, see docs/dev-log.md. Do not include testing content in this file.
[Unreleased]
Added
- Static HTML/CSS/JS pause menu concept prototype at
ui/views/CommonwealthOnline/pause-menu/— Fallout 4–styled multiplayer map pause screen with left menu, server info panel, controller prompts, and keyboard navigation (MAP selected by default). - Mouse wheel zoom and click-drag pan on the pause menu map background (
ui/views/CommonwealthOnline/pause-menu/script.js), previewing the intended Fallout 76-style navigable map; markers move with the map via shared CSS custom properties.
Fixed
- Pause menu prototype's
--co-ui-scaleformula (ui/views/CommonwealthOnline/pause-menu/styles.css) divided a length by a bare number (calc(100vw / 1920)), which is a different CSS type than the plain numbers used alongside it inclamp()/min(). That type mismatch made the whole custom property invalid at the point of use, so everycalc(Npx * var(--co-ui-scale))silently fell back toauto— causing the logo, menu items, and selection bar to stretch to fill their containers instead of their intended sizes. Fixed by dividing by a length (1920px/1080px) so the result is a valid unitless ratio. - Pause menu map background switched from a cropped
coverfit tocontainso the full regional map is visible (less zoomed-in) instead of a tightly cropped strip, closer to a Fallout 76-style full map overview.
Changed
- Rewrote root
README.mdfor current project stage: structured status (working / in progress / planned / out of scope), architecture summary, developer quick start, updated repository layout and requirements, honest scale limits (4 proxies per client vs 16+ design target), and aligned license/legal sections withLICENSE.
Added
docs/project-comparison.mdcomparing Commonwealth Online with DoxyCoSync (architecture, scale, sync scope, collaboration).- Updated root
README.mdstatus to reflect functional multiplayer foundation (remote proxies, appearance, apparel, weapons). - Experimental proxy weapon alert forcing: while a remote player reports
weaponDrawn=true, runtime proxies now periodically execute scoped<proxyRef>.setalert 1before weapon animation sync, then clear alert on holster, to test whether Fallout 4's NPC alert state is what keeps weapon-ready poses alive. - One-time-per-proxy diagnostic log (
Runtime proxy weapon graph DIAGNOSTIC) reporting the loaded animation-graph and bound-channel counts when a proxy first has a weapon equipped, to help determine why weapon FSM events are being rejected by the graph. - Weapon animation sync for ranged guns: proxy actors now equip remote players' right-hand weapons and play armed idle/locomotion poses when
weaponDrawn=true. rightHandweapon slot toequippedItemsprotocol: syncs equippedWEAPform IDs alongside apparel items. Optional field; unresolved weapons skip with throttled warning (no crash).- Weapon-drawn animation state tracking via
iSyncGunDowngraph variable:0= drawn/ready,1= holstered/gun-down. FiresweaponDrawandreadyStateEnterevents on draw,gunDownStateEnteron holster. - Local player right-hand weapon capture (
GetEquippedWeaponFormId) and network transmission in transform packets. docs/weapon-animation-sync.mdreference guide documenting WeaponBehavior graph events, variables, and clip naming from F4-Animation-Research unpacked XML.- Weapon candidate graph variables to local animation graph debug probe:
iSyncGunDown,iRifleDrawnStateID,iAttackState,isFiring, etc. for manual in-game validation. - Quest auto-start on COVault109 exit: "Out of Time" quest (MQ102) now starts automatically via console
startquest/setstagecommands when the player leaves COVault109 for the first time. - Complexion texture form reference (
complexionFormId) to appearance payload so hands, arms, and body match the synced skin tone (follows the existing hair colour pattern). - Appearance protocol version 3 with an optional
tintsfield (character tint layers: skin tone, complexion, makeup, beard shade) so proxies can mirror the sender's skin colour and facial detail. - Capture of player/NPC
tintingDatainCaptureLocalAppearance, plus game-thread application of tints onto runtime proxies: existing entries are updated in place by template ID, and missing entries are reconstructed against the proxy race's tint templates (skipped when no template resolves). server/fake_client.pyparsing/output andserver/fake_player.pysample payload for the newtintsappearance field.- Appearance protocol version 2 with optional
morphRegions(region morph slider values) andfacialBoneMorphs(bone-based facial morph transforms) fields so proxies receive advanced face-shape morphs that previously did not sync. - Capture of
TESNPC::morphRegionSliderValuesandTESNPC::facialBoneRegionSliderValuesinCaptureLocalAppearance, plus game-thread application of both onto runtime proxies inApplyProxyAppearanceFromRemoteState. server/fake_client.pyparsing/output andserver/fake_player.pysample payloads for the newmorphRegionsandfacialBoneMorphsappearance fields.- Optional
appearancetransform snapshots for best-effort runtime proxy body and face visuals, including height, body morph weight, body tint, hair colors, head-part IDs, and morph slider values while leaving gender switching out. - Game-thread proxy appearance application for supported
appearancefields after runtime proxy 3D is ready, with race switching deferred for future proxy-base compatibility work. server/fake_client.pyparsing/output andserver/fake_player.pysample payloads for relayedappearancetransform data.COVault109solo-cell handling in the plugin so first-time character-creation space suppresses outgoing transform packets and remote proxy representation.compile-papyrus.batto compile active Papyrus sources fromcreation-kit\scripts\sourceintocreation-kit\scripts\compiledusing the Fallout 4 Creation Kit Papyrus compiler, resolving the Fallout 4 install with the same path workflow asdeploy-all.bat, using saved.fallout4-pathvalues without re-prompting during builds, and skipping reference-onlyCoSync*.pscfiles.build-all.batnow compiles Papyrus scripts before staging the mod package, and still stages the repo build folder for inspection when Papyrus compilation fails.deploy-all.batnow resolves the Fallout 4 path, compiles Papyrus scripts, stages the repo build folder, and then deploys frombuild\Fallout 4\Datainto the Fallout 4Datafolder.stage-mod.batnow stages active Papyrus scripts recursively: compiledcreation-kit\scripts\compiled\*.pexintoData\Scriptsand rawcreation-kit\scripts\source\*.pscintoData\Scripts\Source\User, while skipping reference-onlyCoSync*files.- Server-authoritative weather and time control via
serverWorldStatepackets from the dev server GUI. - Weather / Time tab in
server/dev_server_app.pywith preset buttons forfwweather form IDs andset gamehour to HHmmtime values. server/world_state_presets.pywith shared weather and time preset definitions.protocol/server-world-state.mddocumenting the new packet type.- Event-driven world time resync via optional
timeSyncfield onworldStatepackets; the current world-state host pushes time after menus, loading screens, save/load, wait/sleep, and other time freezes. timeSynctracking inserver/fake_client.pyhost world-state snapshot output.- Optional
equippedItemstransform snapshots for visible apparel slots so proxies can mirror clothing, armor, hats, and eyewear changes. - Game-thread proxy equipment application for synced apparel, including explicit tracked-slot unequips and cleanup when runtime proxy slots are held, reused, or reassigned.
server/fake_client.pyparsing and output for relayedequippedItemstransform data.
Fixed
- Weapon animation graph now loads on proxies. Proxy actors now trigger
AIProcess::RequestLoadAnimationsForWeaponChange()after weapon equip/unequip, which loads theWeaponBehavioranimation subgraph. This allows weapon events (weaponDraw,readyStateEnter,gunDownStateEnter) to be accepted by the animation system and enables proper weapon-drawn state animations to persist instead of immediately reverting to idle/holstered poses. Fixes: weapon briefly appears then holsters immediately on proxy. - Proxy weapon attachment now avoids the generic queued equipment 3D refresh after a successful manual weapon attach, preventing the freshly attached weapon model from being immediately cleared again. Weapon draw/holster transitions and subsequent drawn-weapon updates also re-run weapon reparent/draw calls as a fallback while Fallout 4's
WeaponBehaviorgraph is still not accepting the standard weapon animation events on proxies. Drawn-weapon states now use targeted graph writes instead of descriptor bulk writes so unrelated weapon graph variables are not clobbered back to idle/holstered defaults. - Runtime proxy animation state no longer resets on every camera-frustum visibility flicker; only genuine 3D teardown/reload (already handled separately) now clears applied animation state. Previously,
IsVisible()flapping on culled proxies caused the entire animation state to be treated as "just initialized" on effectively every update tick, forcing edge-triggered events (includingweaponDraw/readyStateEnter/gunDownStateEnter) to re-fire continuously and flooding the log. HasDesiredStateChangedno longer reports "changed" on almost every tick for idle proxies. Locomotion tier comparison is now skipped while the proxy isn't moving instead of always evaluating!lastLocomotionTieras changed (that field is intentionally reset to empty while idle).- Proxy head parts (including hair) now apply even when the sender's head-part count differs from the proxy base; the head-part array is reallocated with the game allocator instead of deferring the whole list on a count mismatch.
- Appearance apply log now reports applied-vs-sent head-part counts (
headParts=applied/sent) so deferred or partial head-part application is visible. - New clients now receive existing players' last transform snapshots immediately after
welcome, includingappearance, so late joiners do not start with default proxy visuals while waiting for the next sender heartbeat. - Runtime proxy candidate isolation now ignores actors flagged as deleted, so a freshly spawned proxy is controlled instead of the slot adopting a still-present stale proxy that was marked for deletion the same frame.
- Stale saved runtime
COPlayerProxyactors are deleted before spawning a fresh PlaceAtMe proxy, preventing duplicate visible proxies when an old uncontrolled proxy persisted in a save. - Runtime proxy promotion no longer waits for camera-frustum
IsVisible()before assigning a newly spawned proxy, preventing remote players from appearing only after the local player turns toward them. - Fixed Papyrus staging path construction so
.pexand.pscfiles are copied intobuild\Fallout 4\Data\Scriptsandbuild\Fallout 4\Data\Scripts\Source\User. - If a server profile exists but its associated save was deleted, joining from the main menu now falls back to first-time character creation and re-binds the profile to the newly created save instead of hard-failing.
- Pending first-time profile binding now completes as soon as a save exists even if character-creation phase flags are still active, preventing repeated
cocfirst-time launches on reconnect. - Session launch now resolves equivalent server endpoints (for example
localhost,127.0.0.1, and legacy host-case variants) to an existing server profile before deciding first-time join flow, preventing unintended new-character creation when reconnecting. - Server profile persistence now uses a sanitized save-folder path with a Documents fallback and write-failure logging, preventing silent loss of server profile bindings across game restarts.
- Pending profile binding now accepts exit saves (including
Exitsave...) so the last auto-save on game exit can be rebound and loaded on reconnect, reducing accidental progress loss. - Fixed Windows build issues in server profile path fallback by replacing unsafe
getenvusage and acceptingstd::string_viewsave-folder names in folder sanitization. - Reconnect now refreshes stale associated
Exitsave...names to the newest available exit save before load, preventing fallback to first-time flow when exit-save filenames rotate between sessions. - Server GUI weather now runs
fw <8-digit-form-id>on the currentworldStateHostPlayerIdclient (not hardcoded to player 1), scheduled on the game thread. - Weather
serverWorldStatehandling now defers until world-state host assignment is known, then skips only non-host clients. - Weather
serverWorldStatepackets are broadcast to all clients so the designated host receives them even after host reassignment. - Server restart now resets player/host assignment so the first client is
playerId1 again, preventing GUI weather from being ignored after restart. - Plugin now defers server weather commands until player assignment is available, preventing initial GUI clicks from being dropped right after connect.
- Replaced invalid default GUI weather IDs with valid Fallout 4 weather form IDs so
fw <id>no longer fails with "Invalid weather ...". - Corrected
Clearpreset ID typo from0002852ato valid0002b52a(CommonwealthClear). - Time apply now converts
timeHHmmto Fallout game-hour float before executingset gamehour, fixing 2200-style values applying incorrectly. - Corrected
CO_Vault109StartQuestScript.pscto compile against Fallout 4 Papyrus by replacing unsupportedActor.ShowLooksMenu/UI.IsMenuOpencalls withGame.ShowRaceMenuandUtility.IsInMenuMode. - Race customization now forces third-person camera and a short pre-menu settle delay before
ShowRaceMenu, fixing cases where the menu opens but the player model is not visible. CO_Vault109StartQuestScriptnow uses configurableRaceMenuMode(default0) plusRaceMenuFallbackMode(default1) forShowRaceMenu.- Race menu open flow now retries with fallback mode if the primary mode does not enter menu mode.
- Moved first-time character customization menu control out of
CO_Vault109StartQuestScript.psc; the quest now only handles spawn/stage while plugin C++ session-launch flow owns Looks/SPECIAL sequencing. - First-time C++ character creation now prepares camera context with
ForceThirdPerson, opens Looks viaShowLooksMenu 14, retries withActor.ShowLooksMenufallback, and times out/reset safely if Looks menu never opens. - When
LooksMenuis confirmed open, C++ now applies chargen camera context (SetInChargen 1+ForceThirdPerson) and restores it on close, fixing first-person camera persistence during customization. - Looks menu camera correction now directly sets
PlayerCamerato third-person state for several polls whileLooksMenuis open, avoiding reliance on console-only camera commands. - Looks menu camera correction now configures the
ThirdPersonStatefor face editing by zeroing shoulder offsets, flipping camera yaw toward the player, enabling free rotation, and applying a closer zoom offset. - Looks menu camera cleanup now restores the pre-customization third-person offsets, yaw, zoom, and free-rotation flags so movement controls return to normal after first-time customization closes.
Changed
- Weather presets store the exact
fwconsole argument (8-digit hex); editserver/world_state_presets.pyonly if a preset ID fails in your console. - Updated protocol weather examples/default preset table to match the new valid Fallout 4 preset IDs.
- World time no longer re-applies on every
worldStateheartbeat; weather heartbeats continue at ~1 Hz while time stays in sync during normal gameplay. - Updated Weather/Time UI and protocol wording to use world-state host terminology instead of hardcoded player-1 wording.
- Reformatted
changelog.mdto follow Keep a Changelog. - First-time character creation launch now uses
coc COVault109and waits for theCOVault109start cell instead ofSanctuaryExt. - First-time
COVault109launch now startsCO_Vault109StartQuestonce per first-time join flow so the quest can move the player to its preset spawn marker. CO_Vault109StartQuestnow opensShowRaceMenu(player, 1)after stage-10 spawn completion, waits for menu mode to close, then opensShowSPECIALMenufor name/S.P.E.C.I.A.L. setup.- First-time Looks menu now narrows the camera FOV while open (restored on close) to magnify the face for easier facial-feature editing, since LooksMenu uses its own fixed camera that ignores third-person zoom offsets.
- First-time Looks menu now centers the player on the fixed LooksMenu camera's optical axis for the first few polls (preserving distance and facing the camera), fixing the off-center face caused by the FOV zoom; the player's original transform is restored when the menu closes.
- Added temporary diagnostic logging to LooksMenu centering (camera position/heading, target vs actual player position per poll) to confirm whether
SetPositiontakes effect and whether the menu camera is fixed or follows the player. - Documented optional apparel equipment sync in protocol and architecture docs.
[0.0.1] - 2026-06-23
Added
Changed
Removed
docs/changelog.md— moved to project root.