Rename project to Commonwealth Online

Replace occurrences of "Fallout 4 Together" with "Commonwealth Online" across docs and testing guidance. Add Interface assets and tooling: MainMenu/Pipboy SWFs, translation/fonts, exported scripts (Interface/exported/scripts/MainMenu.as) and a PATCH_MainMenu_Multiplayer.md describing how to add a Multiplayer menu entry that calls root.f4se.plugins.commonwealthOnline.openManager(). Also add build/run batch scripts and apply assorted updates to README, plugin, server and protocol documentation/source to align with the rename and UI changes.
This commit is contained in:
2026-06-07 16:22:50 +12:00
parent 4adc7d57ef
commit 8dfec0a4b3
47 changed files with 3138 additions and 132 deletions
+2 -2
View File
@@ -1,11 +1,11 @@
--- ---
description: Fallout 4 Together project architecture and goals description: Commonwealth Online project architecture and goals
alwaysApply: true alwaysApply: true
--- ---
# Project Overview # Project Overview
Fallout 4 Together is an experimental Fallout 4 multiplayer mod. It uses a C++ F4SE plugin, a Python relay server, fake clients for protocol testing, and project documentation in `docs/`. Commonwealth Online is an experimental Fallout 4 multiplayer mod. It uses a C++ F4SE plugin, a Python relay server, fake clients for protocol testing, and project documentation in `docs/`.
The goal is to sync players across separate Fallout 4 instances by sending player transform and state data through a server, then representing remote players in-game with proxy actors. The goal is to sync players across separate Fallout 4 instances by sending player transform and state data through a server, then representing remote players in-game with proxy actors.
+2 -2
View File
@@ -1,5 +1,5 @@
--- ---
description: Practical manual testing guidance for Fallout 4 Together changes description: Practical manual testing guidance for Commonwealth Online changes
alwaysApply: true alwaysApply: true
--- ---
@@ -12,7 +12,7 @@ Useful project tests include:
- Connecting one Fallout 4 instance. - Connecting one Fallout 4 instance.
- Connecting two Fallout 4 instances. - Connecting two Fallout 4 instances.
- Running `server/fake_client.py`. - Running `server/fake_client.py`.
- Checking `Fallout4Together.log`. - Checking `CommonwealthOnline.log`.
- Verifying transform packets are sent. - Verifying transform packets are sent.
- Verifying remote player state is received. - Verifying remote player state is received.
- Verifying proxy actor movement in `F4TTestCell01`. - Verifying proxy actor movement in `F4TTestCell01`.
+1 -1
View File
@@ -1,6 +1,6 @@
# Contributing # Contributing
Fallout 4 Together is currently in the research and prototype stage. Commonwealth Online is currently in the research and prototype stage.
At this stage, contributions should focus on documentation, research, setup notes, tooling experiments, and small isolated prototypes. At this stage, contributions should focus on documentation, research, setup notes, tooling experiments, and small isolated prototypes.
+1 -1
View File
@@ -1,6 +1,6 @@
# Disclaimer # Disclaimer
Fallout 4 Together is an unofficial fan research project. Commonwealth Online is an unofficial fan research project.
This project is not affiliated with, endorsed by, or supported by Bethesda Game Studios, Bethesda Softworks, Microsoft, or the F4SE team. This project is not affiliated with, endorsed by, or supported by Bethesda Game Studios, Bethesda Softworks, Microsoft, or the F4SE team.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,110 @@
# MainMenu.swf — Multiplayer button patch guide
Reference export: [`scripts/MainMenu.as`](scripts/MainMenu.as)
Edit the script **inside FFDec** on the SWF (or paste changes back into FFDec after editing the export). Saving only the `.as` file does not update `MainMenu.swf`.
## Why texts/sprites only showed CONTINUE
The main menu is a **dynamic list** (`MainPanel_mc.List_mc`). Items like `$NEW`, `$LOAD`, `$SETTINGS` are pushed in **`InitList()`**, not stored as static text tags.
## Three edits in `MainMenu` class
### 1. Add index constant (~line 214)
After `INSTALLED_CONTENT_INDEX`:
```actionscript
private const MULTIPLAYER_INDEX:Number = 15;
```
Index `15` is unused in vanilla (highest defined is `INSTALLED_CONTENT_INDEX = 14`).
### 2. Add list entry in `InitList()` (~line 589)
Insert **after** the `$LOAD` push and **before** the PS5 transfer / DLC block — only on the title screen (`!PauseMode`):
```actionscript
this.MainPanel_mc.List_mc.entryList.push({
"text":"$LOAD",
"disabled":!this.HasRecentSave || !param6,
"index":this.LOAD_INDEX
});
// --- ADD BELOW ---
if(!this.PauseMode)
{
this.MainPanel_mc.List_mc.entryList.push({
"text":"Multiplayer",
"index":this.MULTIPLAYER_INDEX
});
}
// --- ADD ABOVE ---
if(param8 == true)
```
Using literal `"MULTIPLAYER"` avoids needing a `.strings` entry for the PoC. Later switch to `"$COSYNC_MULTIPLAYER"` + `Interface/Translate_en.txt` if you want localization.
**Label text:** For the PoC use a **literal** label (no `$` prefix):
```actionscript
"text":"Multiplayer",
```
Strings starting with `$` are looked up in `Interface/Translate_en.txt` (from `Fallout4 - Interface.ba2`). A lone `Interface/Translations/MainMenu_en.txt` is **not** how vanilla resolves main-menu keys, so `$MULTIPLAYER` shows as-is until you merge the key into `Translate_en.txt` (extract from BA2, append `$MULTIPLAYER Multiplayer`, redeploy loose file).
Regenerate optional translation stub: `python tools/write_mainmenu_translation.py` (for future i18n / Translate_en merge only).
### Fallout 4 must load loose Interface files
Loose `Data/Interface/*.swf` overrides are **ignored** unless archive invalidation is on. Add to `%USERPROFILE%/Documents/My Games/Fallout4/Fallout4Custom.ini`:
```ini
[Archive]
bInvalidateOlderFiles=1
```
(MO2 enables this automatically; manual `Data/` copies need it.)
Without invalidation, the game keeps using `Fallout4 - Interface.ba2` — your patched SWF never loads even though the file is on disk.
Suggested placement: between **Load** and **Add-ons** so it reads naturally on the main menu.
### 3. Handle selection in `onMainListItemPress()` switch (~line 864)
Add **before** `case this.HELP_INDEX:` (or anywhere in the switch):
```actionscript
case this.MULTIPLAYER_INDEX:
this.BGSCodeObj.PlayOKSound();
if(root.f4se != null && root.f4se.plugins != null && root.f4se.plugins.commonwealthOnline != null)
{
root.f4se.plugins.commonwealthOnline.openManager();
}
break;
```
Requires the C++ plugin to register `commonwealthOnline.openManager()` via F4SE Scaleform (not done yet). Until then, the button will play the OK sound and do nothing else — safe for SWF-only testing.
## FFDec workflow
1. Open `Interface/MainMenu.swf` in FFDec.
2. **scripts → MainMenu** → right-click → **Replace / Edit** (or open script, paste from [`scripts/MainMenu.as`](scripts/MainMenu.as)).
3. **File → Save** (overwrites SWF).
4. Deploy to `Fallout 4/Data/Interface/MainMenu.swf` or your mod folder.
5. Launch via F4SE and test.
**Re-import from edited export:** In FFDec, select the **MainMenu** script under **scripts**, use **Edit ActionScript** and paste the full contents of `Interface/exported/scripts/MainMenu.as`, then save the SWF. FFDec may also offer **Import script** / **Replace script** from file depending on version.
Keep `MainMenu.swf.vanilla.bak` unchanged.
## Related functions (no edit needed for PoC)
| Function | Role |
|----------|------|
| `InitList()` | Builds `entryList` with `$CONTINUE`, `$NEW`, `$LOAD`, … |
| `onMainListItemPress()` | `switch` on `selectedEntry.index` |
| `onListItemPress()` | Routes list press events to `onMainListItemPress()` |
| Index constants (~184–212) | `CONTINUE_INDEX` … `INSTALLED_CONTENT_INDEX` |
## Next step (code)
Implement `commonwealthOnline.openManager()` in `CommonwealthOnline.dll` and `CoSyncServerBrowser.swf` per [docs/custom-swf-ui.md](../../docs/custom-swf-ui.md).
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
+2 -2
View File
@@ -1,6 +1,6 @@
# Fallout 4 Together # Commonwealth Online
Fallout 4 Together is an experimental research project exploring the possibility of adding basic multiplayer-style networking to Fallout 4. Commonwealth Online is an experimental research project exploring the possibility of adding basic multiplayer-style networking to Fallout 4.
The goal is not to create a full co-op campaign mod immediately. The first goal is much smaller: The goal is not to create a full co-op campaign mod immediately. The first goal is much smaller:
+43
View File
@@ -0,0 +1,43 @@
@echo off
setlocal EnableExtensions
set "SCRIPT_DIR=%~dp0"
set "PLUGIN_DIR=%SCRIPT_DIR%plugin"
cd /d "%PLUGIN_DIR%"
if errorlevel 1 (
echo Failed to change to plugin directory:
echo "%PLUGIN_DIR%"
pause
exit /b 1
)
where xmake >nul 2>&1
if errorlevel 1 (
echo xmake was not found on PATH.
echo Install XMake and add it to PATH: https://xmake.io
pause
exit /b 1
)
echo Configuring Commonwealth Online plugin...
xmake
if errorlevel 1 (
echo xmake configuration failed.
pause
exit /b 1
)
echo Building Commonwealth Online plugin...
xmake build
if errorlevel 1 (
echo Build failed.
pause
exit /b 1
)
echo.
echo Build succeeded.
echo Look for CommonwealthOnline.dll in the plugin build output folder.
endlocal
exit /b 0
+1 -1
View File
@@ -1,6 +1,6 @@
# Creation Kit Files # Creation Kit Files
This folder is for Creation Kit-side work for Fallout 4 Together. This folder is for Creation Kit-side work for Commonwealth Online.
The Creation Kit plugin should provide controlled test content for multiplayer experiments. The Creation Kit plugin should provide controlled test content for multiplayer experiments.
+1 -1
View File
@@ -1,6 +1,6 @@
# ESP Files # ESP Files
This folder is for original Fallout 4 Together Creation Kit plugin files. This folder is for original Commonwealth Online Creation Kit plugin files.
Possible early plugin file: Possible early plugin file:
+1 -1
View File
@@ -1,6 +1,6 @@
# Papyrus Source Scripts # Papyrus Source Scripts
This folder is for original Papyrus source scripts created for Fallout 4 Together. This folder is for original Papyrus source scripts created for Commonwealth Online.
Possible uses: Possible uses:
+2 -2
View File
@@ -10,7 +10,7 @@
## Overview ## Overview
Successfully aligned Fallout 4 Together with TiltedEvolution's proven multiplayer animation synchronization architecture. Implemented complete stack from network protocol through animation descriptor system to action replay infrastructure. Successfully aligned Commonwealth Online with TiltedEvolution's proven multiplayer animation synchronization architecture. Implemented complete stack from network protocol through animation descriptor system to action replay infrastructure.
**Key Achievement:** Proxy actors can now theoretically display working animations by: **Key Achievement:** Proxy actors can now theoretically display working animations by:
1. Dynamically spawning proxies 1. Dynamically spawning proxies
@@ -376,7 +376,7 @@ Ready for in-game validation
## Conclusion ## Conclusion
Phases 1-5 successfully implement a complete, TiltedEvolution-aligned animation synchronization architecture for Fallout 4 Together. All foundational systems are in place: Phases 1-5 successfully implement a complete, TiltedEvolution-aligned animation synchronization architecture for Commonwealth Online. All foundational systems are in place:
- ✅ Descriptor-based efficient variable sync - ✅ Descriptor-based efficient variable sync
- ✅ Dynamic proxy spawning with reuse - ✅ Dynamic proxy spawning with reuse
+1 -1
View File
@@ -2,7 +2,7 @@
## Executive Summary ## Executive Summary
This document maps TiltedEvolution's proven multiplayer animation and state synchronization architecture onto Fallout 4 Together's codebase. It identifies which concepts are applicable to FO4, what needs adaptation, and FO4-specific constraints. This document maps TiltedEvolution's proven multiplayer animation and state synchronization architecture onto Commonwealth Online's codebase. It identifies which concepts are applicable to FO4, what needs adaptation, and FO4-specific constraints.
**Key Finding:** TiltedEvolution's architecture is fundamentally compatible with FO4, but FO4 has stricter constraints around AI, velocity, and action replay mechanics. **Key Finding:** TiltedEvolution's architecture is fundamentally compatible with FO4, but FO4 has stricter constraints around AI, velocity, and action replay mechanics.
+2 -2
View File
@@ -1,4 +1,4 @@
# Animation Sync Analysis: Fallout 4 Together vs TiltedEvolution # Animation Sync Analysis: Commonwealth Online vs TiltedEvolution
> **Resolution update (2026-06-05):** The "variable names may be wrong" hypothesis below is > **Resolution update (2026-06-05):** The "variable names may be wrong" hypothesis below is
> now confirmed and fixed. The real FO4 humanoid graph variable names + types were extracted > now confirmed and fixed. The real FO4 humanoid graph variable names + types were extracted
@@ -15,7 +15,7 @@
## Problem Statement ## Problem Statement
Your Fallout 4 Together animations aren't working on proxy actors. You have animation sync code in `F4TProxyAnimationSync.cpp` attempting to set graph variables by name (`Speed`, `IsSprinting`, etc.), but the variables aren't being applied or synced correctly. Your Commonwealth Online animations aren't working on proxy actors. You have animation sync code in `F4TProxyAnimationSync.cpp` attempting to set graph variables by name (`Speed`, `IsSprinting`, etc.), but the variables aren't being applied or synced correctly.
--- ---
+1 -1
View File
@@ -1,6 +1,6 @@
# Creation Kit Notes # Creation Kit Notes
The Creation Kit side of Fallout 4 Together should provide controlled test content for multiplayer development. The Creation Kit side of Commonwealth Online should provide controlled test content for multiplayer development.
## First Creation Kit Goals ## First Creation Kit Goals
+51 -52
View File
@@ -1,6 +1,6 @@
# Development Log # Development Log
This file tracks development progress for Fallout 4 Together. This file tracks development progress for Commonwealth Online.
Use this log to record setup decisions, tool versions, technical discoveries, Use this log to record setup decisions, tool versions, technical discoveries,
failed experiments, successful tests, and next steps. failed experiments, successful tests, and next steps.
@@ -99,7 +99,7 @@ proxies only showed walk/run (no slow-walk/jog), and ground jumps never exited t
### Summary ### Summary
After grounding the graph variable names (see entry below), an in-game log After grounding the graph variable names (see entry below), an in-game log
(`Fallout4Together.log`) showed locomotion variables were now correct (`CommonwealthOnline.log`) showed locomotion variables were now correct
(`graphSpeedReadBack=true(373.0)` while running), but proxies still never showed walk/run (`graphSpeedReadBack=true(373.0)` while running), but proxies still never showed walk/run
animation. Root cause: the local player was reporting `isJumping=true` almost continuously animation. Root cause: the local player was reporting `isJumping=true` almost continuously
while merely running, so proxies were perpetually forced into the jump state, which masks while merely running, so proxies were perpetually forced into the jump state, which masks
@@ -191,7 +191,7 @@ types extracted from the real humanoid movement behavior graph
`MTBehavior`, and needs its own research pass. `MTBehavior`, and needs its own research pass.
### Next Steps ### Next Steps
- Verify in-game and capture a fresh `Fallout4Together.log` diagnostic. - Verify in-game and capture a fresh `CommonwealthOnline.log` diagnostic.
- Cross-check the transition event names against the behavior graph `eventNames` arrays. - Cross-check the transition event names against the behavior graph `eventNames` arrays.
- If sneak works, investigate the weapon wrapping behavior for the weapon-drawn variable. - If sneak works, investigate the weapon wrapping behavior for the weapon-drawn variable.
@@ -241,7 +241,7 @@ types extracted from the real humanoid movement behavior graph
✅ **Build: SUCCESS** - No warnings ✅ **Build: SUCCESS** - No warnings
✅ **Jump animation**: Now transitions properly when landing ✅ **Jump animation**: Now transitions properly when landing
✅ **Plugin compiled**: `Fallout4Together.dll` ✅ **Plugin compiled**: `CommonwealthOnline.dll`
### How Jump Works Now ### How Jump Works Now
@@ -356,7 +356,7 @@ Build: SUCCESS
### Build Status ### Build Status
✅ **Build: SUCCESS** - No new errors ✅ **Build: SUCCESS** - No new errors
✅ **Plugin compiled**: `Fallout4Together.dll` ✅ **Plugin compiled**: `CommonwealthOnline.dll`
✅ **Crouch detection**: Working in real player ✅ **Crouch detection**: Working in real player
✅ **Crouch animation events**: Now firing via animation graph transitions ✅ **Crouch animation events**: Now firing via animation graph transitions
@@ -461,7 +461,7 @@ Build: SUCCESS
### What Changed ### What Changed
- Created the Fallout 4 Together repository. - Created the Commonwealth Online repository.
- Added the initial repository folder structure. - Added the initial repository folder structure.
- Added starter Markdown documentation files. - Added starter Markdown documentation files.
- Added project roadmap, disclaimer, setup notes, protocol notes, and plugin planning documents. - Added project roadmap, disclaimer, setup notes, protocol notes, and plugin planning documents.
@@ -480,13 +480,13 @@ The immediate priority is to make sure the project has:
### Decisions Made ### Decisions Made
- Project name: Fallout 4 Together - Project name: Commonwealth Online
- Internal prefix: F4T - Internal prefix: F4T
- Primary target platform: Steam Fallout 4 - Primary target platform: Steam Fallout 4
- First prototype goal: two clients in a controlled test cell, with each player visible as a synced remote actor - First prototype goal: two clients in a controlled test cell, with each player visible as a synced remote actor
- Early test cell name: F4TTestCell01 - Early test cell name: F4TTestCell01
- Early test ESP name: Fallout4Together_Test.esp - Early test ESP name: Fallout4Together_Test.esp
- Early plugin DLL name: Fallout4Together.dll - Early plugin DLL name: CommonwealthOnline.dll
### Current Status ### Current Status
@@ -517,7 +517,7 @@ No Creation Kit test cell yet
### What Changed ### What Changed
- Built the initial Fallout 4 Together DLL. - Built the initial Commonwealth Online DLL.
- Installed the DLL into `Data/F4SE/Plugins/`. - Installed the DLL into `Data/F4SE/Plugins/`.
- Launched Fallout 4 through F4SE. - Launched Fallout 4 through F4SE.
@@ -534,15 +534,15 @@ No Creation Kit test cell yet
### Notes ### Notes
- The current log file is named `commonlibf4-template.log`. - The current log file is named `commonlibf4-template.log`.
- The next step is to rename the plugin identity and log output to `Fallout4Together`. - The next step is to rename the plugin identity and log output to `CommonwealthOnline`.
### Next Steps ### Next Steps
- Replace template name references with `Fallout4Together`. - Replace template name references with `CommonwealthOnline`.
- Replace `Hello World!` with a Fallout 4 Together startup message. - Replace `Hello World!` with a Commonwealth Online startup message.
- Rebuild the DLL. - Rebuild the DLL.
- Launch through F4SE again. - Launch through F4SE again.
- Confirm `Fallout4Together.log` is created. - Confirm `CommonwealthOnline.log` is created.
--- ---
@@ -550,13 +550,13 @@ No Creation Kit test cell yet
### What Changed ### What Changed
- Renamed the plugin/log identity from the CommonLibF4 template to Fallout4Together. - Renamed the plugin/log identity from the CommonLibF4 template to CommonwealthOnline.
- Rebuilt and installed `Fallout4Together.dll`. - Rebuilt and installed `CommonwealthOnline.dll`.
- Launched Fallout 4 through F4SE. - Launched Fallout 4 through F4SE.
### What Worked ### What Worked
- `Fallout4Together.log` was created. - `CommonwealthOnline.log` was created.
- The plugin loaded successfully. - The plugin loaded successfully.
- The plugin startup code executed. - The plugin startup code executed.
@@ -567,13 +567,13 @@ No Creation Kit test cell yet
### Notes ### Notes
- The log still contains the template message `Hello World!`. - The log still contains the template message `Hello World!`.
- Next step is to replace this message with a Fallout 4 Together startup message. - Next step is to replace this message with a Commonwealth Online startup message.
### Next Steps ### Next Steps
- Replace `Hello World!` with a proper plugin startup log message. - Replace `Hello World!` with a proper plugin startup log message.
- Rebuild and reinstall the DLL. - Rebuild and reinstall the DLL.
- Confirm the updated message appears in `Fallout4Together.log`. - Confirm the updated message appears in `CommonwealthOnline.log`.
- Begin testing local player position readout. - Begin testing local player position readout.
--- ---
@@ -582,15 +582,15 @@ No Creation Kit test cell yet
### What Changed ### What Changed
- Updated the Fallout 4 Together plugin startup message. - Updated the Commonwealth Online plugin startup message.
- Added local player position readout. - Added local player position readout.
- Logged the player's X, Y, Z position and Z rotation angle. - Logged the player's X, Y, Z position and Z rotation angle.
### What Worked ### What Worked
- `Fallout4Together.dll` built successfully. - `CommonwealthOnline.dll` built successfully.
- Fallout 4 launched through F4SE. - Fallout 4 launched through F4SE.
- `Fallout4Together.log` was created. - `CommonwealthOnline.log` was created.
- The plugin loaded successfully. - The plugin loaded successfully.
- The plugin safely read and logged the local player position. - The plugin safely read and logged the local player position.
@@ -614,12 +614,12 @@ Player position: X=2048.00, Y=2048.00, Z=0.00, AngleZ=0.00
- Updated player position logging so it only writes when the player position changes. - Updated player position logging so it only writes when the player position changes.
- Added throttling so movement updates do not flood the log. - Added throttling so movement updates do not flood the log.
- Rebuilt and tested `Fallout4Together.dll`. - Rebuilt and tested `CommonwealthOnline.dll`.
### What Worked ### What Worked
- Fallout 4 launched through F4SE. - Fallout 4 launched through F4SE.
- `Fallout4Together.log` was created. - `CommonwealthOnline.log` was created.
- The plugin logged the player position while moving. - The plugin logged the player position while moving.
- Position logging now updates at a readable pace instead of many times per second. - Position logging now updates at a readable pace instead of many times per second.
@@ -645,7 +645,7 @@ Player position: X=2048.00, Y=2048.00, Z=0.00, AngleZ=0.00
### What Changed ### What Changed
- Added a local Python test server. - Added a local Python test server.
- Added basic networking from the Fallout 4 Together plugin to the local server. - Added basic networking from the Commonwealth Online plugin to the local server.
- Sent player transform data from Fallout 4 to the server. - Sent player transform data from Fallout 4 to the server.
- Server now prints received transform packets. - Server now prints received transform packets.
@@ -763,7 +763,7 @@ Player position: X=2048.00, Y=2048.00, Z=0.00, AngleZ=0.00
- Tested the full server broadcast flow. - Tested the full server broadcast flow.
- Connected a fake Python client to the local server. - Connected a fake Python client to the local server.
- Connected the Fallout 4 Together plugin as a second client. - Connected the Commonwealth Online plugin as a second client.
- Confirmed that transform packets from the Fallout 4 plugin are broadcast to the fake client. - Confirmed that transform packets from the Fallout 4 plugin are broadcast to the fake client.
### What Worked ### What Worked
@@ -956,7 +956,7 @@ Player position: X=2048.00, Y=2048.00, Z=0.00, AngleZ=0.00
### Notes ### Notes
- The receive loop runs on a background networking thread. - The receive loop runs on a background networking thread.
- Remote transform logging is throttled so `Fallout4Together.log` remains readable. - Remote transform logging is throttled so `CommonwealthOnline.log` remains readable.
- Actor spawning, actor movement, animation sync, combat sync, inventory sync, quest sync, and settlement sync remain planned later. - Actor spawning, actor movement, animation sync, combat sync, inventory sync, quest sync, and settlement sync remain planned later.
### Next Steps ### Next Steps
@@ -972,7 +972,7 @@ Player position: X=2048.00, Y=2048.00, Z=0.00, AngleZ=0.00
- Added a shared local-player log prefix helper for plugin networking logs. - Added a shared local-player log prefix helper for plugin networking logs.
- Prefixed important startup, connection, welcome, transform send, remote update, disconnect, and networking warning logs with `[LocalPlayerId=unassigned]` or `[LocalPlayerId=N]`. - Prefixed important startup, connection, welcome, transform send, remote update, disconnect, and networking warning logs with `[LocalPlayerId=unassigned]` or `[LocalPlayerId=N]`.
- Kept the existing `Fallout4Together.log` file name and avoided per-instance log files for this milestone. - Kept the existing `CommonwealthOnline.log` file name and avoided per-instance log files for this milestone.
### What Worked ### What Worked
@@ -1018,7 +1018,7 @@ Player position: X=2048.00, Y=2048.00, Z=0.00, AngleZ=0.00
### Notes ### Notes
- This is the first successful visible actor-control test for Fallout 4 Together. - This is the first successful visible actor-control test for Commonwealth Online.
- The proxy is still driven by local player position plus offset, not remote player state. - The proxy is still driven by local player position plus offset, not remote player state.
- Dynamic spawning is still not implemented. - Dynamic spawning is still not implemented.
- Remote actor syncing has not started yet. - Remote actor syncing has not started yet.
@@ -1150,8 +1150,7 @@ Player position: X=2048.00, Y=2048.00, Z=0.00, AngleZ=0.00
- `server/server.py` and `server/fake_client.py` were intentionally left - `server/server.py` and `server/fake_client.py` were intentionally left
unchanged because the transform packet protocol did not need to change. unchanged because the transform packet protocol did not need to change.
- This is the first smooth visible multiplayer prototype for Fallout 4 - This is the first smooth visible multiplayer prototype for Commonwealth Online.
Together.
- The proxy actor still lacks synced animations. - The proxy actor still lacks synced animations.
- Only one proxy actor is supported. - Only one proxy actor is supported.
- Dynamic spawning is not implemented. - Dynamic spawning is not implemented.
@@ -1283,7 +1282,7 @@ Player position: X=2048.00, Y=2048.00, Z=0.00, AngleZ=0.00
### Next Steps ### Next Steps
- Test crouch/sneak in-game and compare `apiSneaking`, `actorStateSneaking`, - Test crouch/sneak in-game and compare `apiSneaking`, `actorStateSneaking`,
`actorStateForceSneak`, and `finalIsSneaking` in `Fallout4Together.log`. `actorStateForceSneak`, and `finalIsSneaking` in `CommonwealthOnline.log`.
--- ---
@@ -1665,7 +1664,7 @@ plugin-local form ID on the existing game-thread proxy controller path.
- Ran `xmake build` from `plugin`; it succeeded. - Ran `xmake build` from `plugin`; it succeeded.
- Pending: launch Fallout 4 through F4SE, load `Fallout4Together_Test.esp`, and - Pending: launch Fallout 4 through F4SE, load `Fallout4Together_Test.esp`, and
`coc F4TTestCell01`. `coc F4TTestCell01`.
- Pending: confirm `Fallout4Together.log` reports the test ESP load status and - Pending: confirm `CommonwealthOnline.log` reports the test ESP load status and
`F4T_RemotePlayerProxy` lookup result. `F4T_RemotePlayerProxy` lookup result.
- Pending: confirm the existing placed proxy fallback still represents one fake - Pending: confirm the existing placed proxy fallback still represents one fake
client and still holds/restores correctly. client and still holds/restores correctly.
@@ -1729,7 +1728,7 @@ remote player representation.
- Ran `xmake build` from `plugin`; it succeeded. - Ran `xmake build` from `plugin`; it succeeded.
- Pending: launch Fallout 4 through F4SE, load `Fallout4Together_Test.esp`, and - Pending: launch Fallout 4 through F4SE, load `Fallout4Together_Test.esp`, and
`coc F4TTestCell01`. `coc F4TTestCell01`.
- Pending: confirm `Fallout4Together.log` shows actor-base resolution, one - Pending: confirm `CommonwealthOnline.log` shows actor-base resolution, one
runtime spawn attempt, and either spawn success details or a clear failure runtime spawn attempt, and either spawn success details or a clear failure
reason. reason.
- Pending: confirm the new runtime proxy actor appears near the player if spawn - Pending: confirm the new runtime proxy actor appears near the player if spawn
@@ -1995,7 +1994,7 @@ handle-validation, near-player hold, and repeated visibility diagnostic path.
- Ran `xmake build` from `plugin`; it succeeded. - Ran `xmake build` from `plugin`; it succeeded.
- Pending: launch Fallout 4 through F4SE, enter `F4TTestCell01`, and confirm - Pending: launch Fallout 4 through F4SE, enter `F4TTestCell01`, and confirm
`Fallout4Together.log` reports whether the Stage 3.3 vanilla diagnostic is `CommonwealthOnline.log` reports whether the Stage 3.3 vanilla diagnostic is
active or fell back to `F4T_RemotePlayerProxy`. active or fell back to `F4T_RemotePlayerProxy`.
- Pending: inspect the hold diagnostics and final PASS/PARTIAL/FAIL result to - Pending: inspect the hold diagnostics and final PASS/PARTIAL/FAIL result to
determine whether the vanilla actor base appears visually through the same determine whether the vanilla actor base appears visually through the same
@@ -2065,7 +2064,7 @@ separate visibility control.
- Ran `xmake build` from `plugin`; it succeeded. - Ran `xmake build` from `plugin`; it succeeded.
- Pending: launch Fallout 4 through F4SE, enter `F4TTestCell01`, and confirm - Pending: launch Fallout 4 through F4SE, enter `F4TTestCell01`, and confirm
`Fallout4Together.log` shows absolute lookup diagnostics for `000179FF` and `CommonwealthOnline.log` shows absolute lookup diagnostics for `000179FF` and
`0001CA7D`. `0001CA7D`.
- Pending: confirm that a resolved Codsworth base is used for the vanilla - Pending: confirm that a resolved Codsworth base is used for the vanilla
runtime-spawn diagnostic, or that the custom proxy fallback is logged clearly. runtime-spawn diagnostic, or that the custom proxy fallback is logged clearly.
@@ -2137,7 +2136,7 @@ runtime spawn path.
- Ran `xmake build` from `plugin`; it succeeded. - Ran `xmake build` from `plugin`; it succeeded.
- Pending: launch Fallout 4 through F4SE, enter `F4TTestCell01`, and confirm - Pending: launch Fallout 4 through F4SE, enter `F4TTestCell01`, and confirm
`Fallout4Together.log` shows the Stage 3.5 console command execution. `CommonwealthOnline.log` shows the Stage 3.5 console command execution.
- Pending: confirm the diagnostic resolves a spawned Codsworth actor near the - Pending: confirm the diagnostic resolves a spawned Codsworth actor near the
local player and reports a Stage 3.5 PASS/PARTIAL/FAIL conclusion. local player and reports a Stage 3.5 PASS/PARTIAL/FAIL conclusion.
@@ -2396,7 +2395,7 @@ proxy cap forever.
- `xmake build` from the repository root prompts because there is no root - `xmake build` from the repository root prompts because there is no root
`xmake.lua`. `xmake.lua`.
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: launch Fallout 4 through F4SE, load - Pending manual validation: launch Fallout 4 through F4SE, load
`Fallout4Together_Test.esp`, `coc F4TTestCell01`, start the Dev Server GUI, `Fallout4Together_Test.esp`, `coc F4TTestCell01`, start the Dev Server GUI,
add fake clients up to the cap, disconnect clients, wait for the reuse delay, add fake clients up to the cap, disconnect clients, wait for the reuse delay,
@@ -2454,7 +2453,7 @@ client connected.
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: start server, add fake client, connect Fallout 4, - Pending manual validation: start server, add fake client, connect Fallout 4,
and confirm runtime proxy spawn/settle no longer crashes. and confirm runtime proxy spawn/settle no longer crashes.
- Pending manual validation: re-test multiple clients, movement, held/reusable - Pending manual validation: re-test multiple clients, movement, held/reusable
@@ -2511,7 +2510,7 @@ driven by `RemotePlayerState`.
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: attack a runtime proxy and confirm walk-away - Pending manual validation: attack a runtime proxy and confirm walk-away
animation intent is gone or reduced. animation intent is gone or reduced.
- Pending manual validation: bump a runtime proxy and confirm no persistent - Pending manual validation: bump a runtime proxy and confirm no persistent
@@ -2573,7 +2572,7 @@ of entering persistent NPC combat or pursuit behavior.
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: attack a runtime proxy and confirm it does not chase - Pending manual validation: attack a runtime proxy and confirm it does not chase
or attack the local player. or attack the local player.
- Pending manual validation: bump a runtime proxy and confirm no persistent AI - Pending manual validation: bump a runtime proxy and confirm no persistent AI
@@ -2633,7 +2632,7 @@ positioning path.
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: repeat the GUI fake-client disconnect test that - Pending manual validation: repeat the GUI fake-client disconnect test that
previously caused held proxies to visually reappear. previously caused held proxies to visually reappear.
@@ -2685,7 +2684,7 @@ starting near the local player before snapping away.
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: add a GUI fake client and confirm its proxy no - Pending manual validation: add a GUI fake client and confirm its proxy no
longer briefly appears near the local player before moving to the fake client's longer briefly appears near the local player before moving to the fake client's
remote transform. remote transform.
@@ -2742,7 +2741,7 @@ each remote `playerId` without visually applying animation.
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: launch through F4SE, start the server, add fake - Pending manual validation: launch through F4SE, start the server, add fake
clients in `F4TTestCell01`, and confirm per-player initial and transition clients in `F4TTestCell01`, and confirm per-player initial and transition
animation state logs without visual animation changes. animation state logs without visual animation changes.
@@ -2804,7 +2803,7 @@ mutating actors by default.
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: use the Dev Server GUI to add fake clients, toggle - Pending manual validation: use the Dev Server GUI to add fake clients, toggle
sneak on/off, and confirm existing animation debug logs plus one-time disabled sneak on/off, and confirm existing animation debug logs plus one-time disabled
visual sneak diagnostics without any visual crouch by default. visual sneak diagnostics without any visual crouch by default.
@@ -2866,7 +2865,7 @@ remote player's `isSneaking` state changes.
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Manual test placeholder: start the Dev Server GUI, launch Fallout 4 through - Manual test placeholder: start the Dev Server GUI, launch Fallout 4 through
F4SE, `coc F4TTestCell01`, add fake clients, and toggle sneak on/off. F4SE, `coc F4TTestCell01`, add fake clients, and toggle sneak on/off.
- Expected manual result: only the assigned runtime proxy for the toggled fake - Expected manual result: only the assigned runtime proxy for the toggled fake
@@ -2923,7 +2922,7 @@ Next investigation should focus on read-only animation graph variable discovery
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and rebuilt - Ran `xmake build` from `plugin`; it succeeded and rebuilt
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: fake-client sneak toggles in `F4TTestCell01` - Pending manual validation: fake-client sneak toggles in `F4TTestCell01`
should still produce animation debug `isSneaking` transition logs without should still produce animation debug `isSneaking` transition logs without
applying visual sneak mutation by default. applying visual sneak mutation by default.
@@ -2982,7 +2981,7 @@ movement, sneak, jump, and weapon state signals.
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and linked - Ran `xmake build` from `plugin`; it succeeded and linked
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Manual Fallout 4 / F4SE testing is still pending: - Manual Fallout 4 / F4SE testing is still pending:
- Launch through F4SE. - Launch through F4SE.
- `coc F4TTestCell01`. - `coc F4TTestCell01`.
@@ -2990,7 +2989,7 @@ movement, sneak, jump, and weapon state signals.
- Move/stop and sprint if safe. - Move/stop and sprint if safe.
- Jump. - Jump.
- Draw/holster weapon if safe. - Draw/holster weapon if safe.
- Check `Fallout4Together.log` for `Local animation graph debug` lines. - Check `CommonwealthOnline.log` for `Local animation graph debug` lines.
- Optionally add one fake client to confirm runtime proxies still spawn and - Optionally add one fake client to confirm runtime proxies still spawn and
move while proxy graph diagnostics remain disabled. move while proxy graph diagnostics remain disabled.
@@ -3063,7 +3062,7 @@ uses CommonLibF4 read-only virtual getter overloads to probe cache IDs from
### Testing ### Testing
- Ran `xmake build` from `plugin`; it succeeded and linked - Ran `xmake build` from `plugin`; it succeeded and linked
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Linter diagnostics for `plugin/src/F4TLocalAnimationGraphDebug.cpp` reported - Linter diagnostics for `plugin/src/F4TLocalAnimationGraphDebug.cpp` reported
no errors. no errors.
- Manual Fallout 4 / F4SE testing is still pending: - Manual Fallout 4 / F4SE testing is still pending:
@@ -3105,7 +3104,7 @@ uses CommonLibF4 read-only virtual getter overloads to probe cache IDs from
- Run the manual F4SE test sequence and record cache size, readable ID counts, - Run the manual F4SE test sequence and record cache size, readable ID counts,
and any candidate sneak/movement/weapon/jump/sprint IDs from and any candidate sneak/movement/weapon/jump/sprint IDs from
`Fallout4Together.log`. `CommonwealthOnline.log`.
--- ---
@@ -3197,7 +3196,7 @@ unchanged.
### Testing ### Testing
- Ran `xmake build` from `plugin`; build succeeded and linked - Ran `xmake build` from `plugin`; build succeeded and linked
`Fallout4Together.dll`. `CommonwealthOnline.dll`.
- Pending manual validation: F4SE, `coc F4TTestCell01`, Dev Server fake clients - Pending manual validation: F4SE, `coc F4TTestCell01`, Dev Server fake clients
with Walk Circle / Walk To Player and sneak/jump toggles; confirm proxy walk with Walk Circle / Walk To Player and sneak/jump toggles; confirm proxy walk
cycle, idle when stopped, crouch, and no crash or walk-away AI. cycle, idle when stopped, crouch, and no crash or walk-away AI.
@@ -3250,7 +3249,7 @@ but `SetPosition(..., true)` likely reset the character controller each frame.
- Ran `xmake build` from `plugin`; build succeeded. - Ran `xmake build` from `plugin`; build succeeded.
- Pending manual F4SE retest with fake Walk To Player; check for walk cycle and - Pending manual F4SE retest with fake Walk To Player; check for walk cycle and
optional `Speed read-back mismatch` warning in `Fallout4Together.log`. optional `Speed read-back mismatch` warning in `CommonwealthOnline.log`.
--- ---
+2 -2
View File
@@ -1,6 +1,6 @@
# F4SE Notes # F4SE Notes
F4SE is expected to be the main entry point for the native plugin side of Fallout 4 Together. F4SE is expected to be the main entry point for the native plugin side of Commonwealth Online.
## Plugin Goals ## Plugin Goals
@@ -18,7 +18,7 @@ The first plugin goals are:
Eventually, the compiled plugin should output something like: Eventually, the compiled plugin should output something like:
```text ```text
Data/F4SE/Plugins/Fallout4Together.dll Data/F4SE/Plugins/CommonwealthOnline.dll
``` ```
## Important Notes ## Important Notes
+1 -1
View File
@@ -1,6 +1,6 @@
# Limitations # Limitations
Fallout 4 was designed as a single-player game. Fallout 4 Together is therefore expected to have serious technical limitations, especially during early development. Fallout 4 was designed as a single-player game. Commonwealth Online is therefore expected to have serious technical limitations, especially during early development.
## Early Prototype Limitations ## Early Prototype Limitations
+1 -1
View File
@@ -1,6 +1,6 @@
# Project Overview # Project Overview
Fallout 4 Together is a prototype multiplayer framework experiment for Fallout 4. Commonwealth Online is a prototype multiplayer framework experiment for Fallout 4.
The first target is not full co-op. The first target is a controlled test where two clients can connect to a local server and see each other as synced actors in a custom test cell. The first target is not full co-op. The first target is a controlled test where two clients can connect to a local server and see each other as synced actors in a custom test cell.
+1 -1
View File
@@ -2,7 +2,7 @@
## Executive Summary ## Executive Summary
Successfully completed Phase 1-3 of the Fallout 4 Together → TiltedEvolution alignment initiative. Established comprehensive architectural foundation, protocol extensions, and animation descriptor infrastructure to enable working proxy actor animations. Successfully completed Phase 1-3 of the Commonwealth Online → TiltedEvolution alignment initiative. Established comprehensive architectural foundation, protocol extensions, and animation descriptor infrastructure to enable working proxy actor animations.
**Status:** Ready to proceed with Phase 4 (Dynamic Spawn). **Status:** Ready to proceed with Phase 4 (Dynamic Spawn).
+1 -1
View File
@@ -151,7 +151,7 @@ After recompiling, run fake client and watch log:
```bash ```bash
# Terminal: Watch logs in real-time # Terminal: Watch logs in real-time
Get-Content "c:\Users\User\Documents\My Games\Fallout4\F4SE\Fallout4Together.log" -Wait -Tail 50 | Select-String "Phase2-DEBUG" Get-Content "c:\Users\User\Documents\My Games\Fallout4\F4SE\CommonwealthOnline.log" -Wait -Tail 50 | Select-String "Phase2-DEBUG"
``` ```
**Expected pattern (good interpolation):** **Expected pattern (good interpolation):**
+4 -4
View File
@@ -80,7 +80,7 @@ Create a simple test script (`test_interpolation.py`):
### Setup Step 1: Start Relay Server ### Setup Step 1: Start Relay Server
```bash ```bash
cd f:\Repos\Fallout-4-Together\server cd f:\Repos\Commonwealth-Online\server
python server.py python server.py
``` ```
@@ -95,7 +95,7 @@ Waiting for connections...
In a new terminal: In a new terminal:
```bash ```bash
cd f:\Repos\Fallout-4-Together\server cd f:\Repos\Commonwealth-Online\server
python fake_client.py python fake_client.py
``` ```
@@ -341,11 +341,11 @@ This should still appear alongside interpolation.
```bash ```bash
# Terminal 1: Start relay server # Terminal 1: Start relay server
cd f:\Repos\Fallout-4-Together\server cd f:\Repos\Commonwealth-Online\server
python server.py python server.py
# Terminal 2: Start fake client (single remote player) # Terminal 2: Start fake client (single remote player)
cd f:\Repos\Fallout-4-Together\server cd f:\Repos\Commonwealth-Online\server
python fake_client.py python fake_client.py
# In-game: Launch F4T and observe proxy movement # In-game: Launch F4T and observe proxy movement
+1 -1
View File
@@ -1,6 +1,6 @@
# Protocol Overview # Protocol Overview
The Fallout 4 Together protocol defines the messages sent between Fallout 4 clients and the external server. The Commonwealth Online protocol defines the messages sent between Fallout 4 clients and the external server.
Early versions should stay simple and easy to debug. Early versions should stay simple and easy to debug.
+1 -1
View File
@@ -16,7 +16,7 @@ This file is for notes on existing Bethesda multiplayer projects and experiments
- How did they handle cell changes? - How did they handle cell changes?
- How did they handle quest state? - How did they handle quest state?
- What systems were impossible or unstable? - What systems were impossible or unstable?
- What parts are useful references for Fallout 4 Together? - What parts are useful references for Commonwealth Online?
## Notes ## Notes
+1 -1
View File
@@ -19,7 +19,7 @@ Recommended:
```text ```text
Fallout 4 Fallout 4
F4SE F4SE
Fallout 4 Together test plugin Commonwealth Online test plugin
No other gameplay mods No other gameplay mods
Dedicated test save Dedicated test save
``` ```
+5 -5
View File
@@ -1,6 +1,6 @@
# Version Targets # Version Targets
Fallout 4 Together is version-sensitive because it depends on Fallout 4, F4SE, and native plugin development. Commonwealth Online is version-sensitive because it depends on Fallout 4, F4SE, and native plugin development.
## Primary Target ## Primary Target
@@ -20,8 +20,8 @@ All multiplayer testing should use the same:
* Fallout 4 version * Fallout 4 version
* F4SE version * F4SE version
* Fallout 4 Together plugin version * Commonwealth Online plugin version
* Fallout 4 Together test ESP version * Commonwealth Online test ESP version
* Load order * Load order
* Test save * Test save
@@ -39,12 +39,12 @@ F4SE supports the latest Fallout 4 versions available on Steam and GOG, but Stea
## Current Development Decision ## Current Development Decision
Fallout 4 Together will use the Steam build of Fallout 4 as the primary development target. Commonwealth Online will use the Steam build of Fallout 4 as the primary development target.
GOG support may be investigated later once the plugin loads successfully and the basic transform-sync prototype is working. GOG support may be investigated later once the plugin loads successfully and the basic transform-sync prototype is working.
## Compatibility Warning ## Compatibility Warning
Fallout 4 Together may not work across different Fallout 4 executable versions. Commonwealth Online may not work across different Fallout 4 executable versions.
During testing, every connected player should use the same game version, F4SE version, plugin version, ESP version, and load order. During testing, every connected player should use the same game version, F4SE version, plugin version, ESP version, and load order.
+2 -2
View File
@@ -1,6 +1,6 @@
# Fallout4Together Plugin # Commonwealth Online Plugin
This is the native Fallout4Together plugin using CommonLibF4. This is the native Commonwealth Online F4SE plugin using CommonLibF4.
### Requirements ### Requirements
* [XMake](https://xmake.io) [3.0.0+] * [XMake](https://xmake.io) [3.0.0+]
+9 -9
View File
@@ -1,6 +1,6 @@
# Plugin Setup # Plugin Setup
The Fallout 4 Together native plugin is based on `Fallout4Together`. The Commonwealth Online native plugin is based on `Fallout4Together`.
## Selected Template ## Selected Template
@@ -14,9 +14,9 @@ Forked: No
## Build Target ## Build Target
```text ```text
Project Name: Fallout4Together Project Name: CommonwealthOnline
Output DLL: Fallout4Together.dll Output DLL: CommonwealthOnline.dll
Expected Install Path: Data/F4SE/Plugins/Fallout4Together.dll Expected Install Path: Data/F4SE/Plugins/CommonwealthOnline.dll
``` ```
## Current Goal ## Current Goal
@@ -27,10 +27,10 @@ verify the local networking prototype against `server/server.py`.
This means the plugin should be able to: This means the plugin should be able to:
* Build successfully * Build successfully
* Output `Fallout4Together.dll` * Output `CommonwealthOnline.dll`
* Be copied into `Data/F4SE/Plugins/` * Be copied into `Data/F4SE/Plugins/`
* Load when Fallout 4 is launched through F4SE * Load when Fallout 4 is launched through F4SE
* Create or write to a `Fallout4Together.log` file * Create or write to a `CommonwealthOnline.log` file
* Prefix multiplayer/networking log lines with `[LocalPlayerId=unassigned]` before the server welcome packet and `[LocalPlayerId=N]` after assignment * Prefix multiplayer/networking log lines with `[LocalPlayerId=unassigned]` before the server welcome packet and `[LocalPlayerId=N]` after assignment
* Connect to the local server on `127.0.0.1:7777` * Connect to the local server on `127.0.0.1:7777`
* Send local transform packets * Send local transform packets
@@ -93,7 +93,7 @@ If the build succeeds, look for the compiled DLL in the output folder created by
For manual testing, the compiled plugin DLL should eventually be copied to: For manual testing, the compiled plugin DLL should eventually be copied to:
```text ```text
Fallout 4/Data/F4SE/Plugins/Fallout4Together.dll Fallout 4/Data/F4SE/Plugins/CommonwealthOnline.dll
``` ```
If the `F4SE/Plugins/` folder does not exist inside `Data/`, create it manually. If the `F4SE/Plugins/` folder does not exist inside `Data/`, create it manually.
@@ -104,8 +104,8 @@ Use this checklist for the first plugin test:
* [ ] Fallout 4 launches normally without the plugin * [ ] Fallout 4 launches normally without the plugin
* [ ] Fallout 4 launches through F4SE without the plugin * [ ] Fallout 4 launches through F4SE without the plugin
* [ ] `Fallout4Together.dll` builds successfully * [ ] `CommonwealthOnline.dll` builds successfully
* [ ] `Fallout4Together.dll` is copied to `Data/F4SE/Plugins/` * [ ] `CommonwealthOnline.dll` is copied to `Data/F4SE/Plugins/`
* [ ] Fallout 4 launches through F4SE with the plugin installed * [ ] Fallout 4 launches through F4SE with the plugin installed
* [ ] Game reaches the main menu without crashing * [ ] Game reaches the main menu without crashing
* [ ] Plugin log file is created * [ ] Plugin log file is created
+14 -14
View File
@@ -89,7 +89,7 @@ namespace
WSADATA winsockData{}; WSADATA winsockData{};
const auto startupResult = WSAStartup(MAKEWORD(2, 2), std::addressof(winsockData)); const auto startupResult = WSAStartup(MAKEWORD(2, 2), std::addressof(winsockData));
if (startupResult != 0) { if (startupResult != 0) {
LogWarningWithLocalPlayerPrefix("Could not initialize Winsock for Fallout 4 Together local networking."); LogWarningWithLocalPlayerPrefix("Could not initialize Winsock for Commonwealth Online local networking.");
return false; return false;
} }
@@ -540,7 +540,7 @@ namespace
} }
if (bytesReceived == 0) { if (bytesReceived == 0) {
LogWarningWithLocalPlayerPrefix("Fallout 4 Together local server closed the connection."); LogWarningWithLocalPlayerPrefix("Commonwealth Online local server closed the connection.");
CloseSocket(); CloseSocket();
break; break;
} }
@@ -552,7 +552,7 @@ namespace
} }
if (g_receiveThreadRunning.load()) { if (g_receiveThreadRunning.load()) {
LogWarningWithLocalPlayerPrefix("Lost connection to Fallout 4 Together local server while receiving."); LogWarningWithLocalPlayerPrefix("Lost connection to Commonwealth Online local server while receiving.");
} }
CloseSocket(); CloseSocket();
break; break;
@@ -614,14 +614,14 @@ namespace F4T::Networking
// packet path without exposing any gameplay state to a remote server. // packet path without exposing any gameplay state to a remote server.
const auto localSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); const auto localSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (localSocket == INVALID_SOCKET) { if (localSocket == INVALID_SOCKET) {
LogWarningWithLocalPlayerPrefix("Could not create socket for Fallout 4 Together local server connection."); LogWarningWithLocalPlayerPrefix("Could not create socket for Commonwealth Online local server connection.");
return false; return false;
} }
if (!SetNonBlocking(localSocket)) { if (!SetNonBlocking(localSocket)) {
closesocket(localSocket); closesocket(localSocket);
LogWarningWithLocalPlayerPrefix( LogWarningWithLocalPlayerPrefix(
"Could not configure non-blocking socket for Fallout 4 Together local server connection."); "Could not configure non-blocking socket for Commonwealth Online local server connection.");
return false; return false;
} }
@@ -630,7 +630,7 @@ namespace F4T::Networking
serverAddress.sin_port = htons(kLocalServerPort); serverAddress.sin_port = htons(kLocalServerPort);
if (inet_pton(AF_INET, kLocalServerHost, std::addressof(serverAddress.sin_addr)) != 1) { if (inet_pton(AF_INET, kLocalServerHost, std::addressof(serverAddress.sin_addr)) != 1) {
closesocket(localSocket); closesocket(localSocket);
LogWarningWithLocalPlayerPrefix("Could not parse Fallout 4 Together local server address."); LogWarningWithLocalPlayerPrefix("Could not parse Commonwealth Online local server address.");
return false; return false;
} }
@@ -644,7 +644,7 @@ namespace F4T::Networking
// The server is a developer tool, not a runtime requirement. A failed // The server is a developer tool, not a runtime requirement. A failed
// connection should leave Fallout 4 running and simply disable packet sends. // connection should leave Fallout 4 running and simply disable packet sends.
LogWarningWithLocalPlayerPrefix(std::format( LogWarningWithLocalPlayerPrefix(std::format(
"Could not connect to Fallout 4 Together local server at {}:{}", "Could not connect to Commonwealth Online local server at {}:{}",
kLocalServerHost, kLocalServerHost,
kLocalServerPort)); kLocalServerPort));
return false; return false;
@@ -662,7 +662,7 @@ namespace F4T::Networking
StartReceiveThread(); StartReceiveThread();
LogInfoWithLocalPlayerPrefix( LogInfoWithLocalPlayerPrefix(
std::format("Connected to Fallout 4 Together local server at {}:{}.", kLocalServerHost, kLocalServerPort)); std::format("Connected to Commonwealth Online local server at {}:{}.", kLocalServerHost, kLocalServerPort));
return true; return true;
} }
@@ -745,7 +745,7 @@ namespace F4T::Networking
} }
if (packetSize <= 0 || static_cast<std::size_t>(packetSize) >= packet.size()) { if (packetSize <= 0 || static_cast<std::size_t>(packetSize) >= packet.size()) {
LogWarningWithLocalPlayerPrefix("Could not format Fallout 4 Together transform packet."); LogWarningWithLocalPlayerPrefix("Could not format Commonwealth Online transform packet.");
return false; return false;
} }
@@ -758,7 +758,7 @@ namespace F4T::Networking
a_cellId); a_cellId);
if (appended <= 0 || static_cast<std::size_t>(appended) >= remaining) { if (appended <= 0 || static_cast<std::size_t>(appended) >= remaining) {
LogWarningWithLocalPlayerPrefix("Could not format Fallout 4 Together transform packet cell ID."); LogWarningWithLocalPlayerPrefix("Could not format Commonwealth Online transform packet cell ID.");
return false; return false;
} }
@@ -774,7 +774,7 @@ namespace F4T::Networking
a_worldspaceId); a_worldspaceId);
if (appended <= 0 || static_cast<std::size_t>(appended) >= remaining) { if (appended <= 0 || static_cast<std::size_t>(appended) >= remaining) {
LogWarningWithLocalPlayerPrefix("Could not format Fallout 4 Together transform packet worldspace ID."); LogWarningWithLocalPlayerPrefix("Could not format Commonwealth Online transform packet worldspace ID.");
return false; return false;
} }
@@ -784,7 +784,7 @@ namespace F4T::Networking
const auto remaining = packet.size() - static_cast<std::size_t>(packetSize); const auto remaining = packet.size() - static_cast<std::size_t>(packetSize);
const auto appended = std::snprintf(packet.data() + packetSize, remaining, "}\n"); const auto appended = std::snprintf(packet.data() + packetSize, remaining, "}\n");
if (appended <= 0 || static_cast<std::size_t>(appended) >= remaining) { if (appended <= 0 || static_cast<std::size_t>(appended) >= remaining) {
LogWarningWithLocalPlayerPrefix("Could not finish Fallout 4 Together transform packet."); LogWarningWithLocalPlayerPrefix("Could not finish Commonwealth Online transform packet.");
return false; return false;
} }
@@ -803,7 +803,7 @@ namespace F4T::Networking
if (bytesSent == SOCKET_ERROR) { if (bytesSent == SOCKET_ERROR) {
const auto error = WSAGetLastError(); const auto error = WSAGetLastError();
if (error != WSAEWOULDBLOCK) { if (error != WSAEWOULDBLOCK) {
LogWarningWithLocalPlayerPrefix("Lost connection to Fallout 4 Together local server."); LogWarningWithLocalPlayerPrefix("Lost connection to Commonwealth Online local server.");
CloseSocket(); CloseSocket();
} }
@@ -811,7 +811,7 @@ namespace F4T::Networking
} }
if (bytesSent != packetSize) { if (bytesSent != packetSize) {
LogWarningWithLocalPlayerPrefix("Could not send full Fallout 4 Together transform packet."); LogWarningWithLocalPlayerPrefix("Could not send full Commonwealth Online transform packet.");
CloseSocket(); CloseSocket();
return false; return false;
} }
+2 -2
View File
@@ -55,7 +55,7 @@ namespace
constexpr float kRunGraphSpeedThreshold = 280.0F; constexpr float kRunGraphSpeedThreshold = 280.0F;
// Graph Speed range confirmed from local-player read-by-name debug in // Graph Speed range confirmed from local-player read-by-name debug in
// Fallout4Together.log: walk starts ~47, full run ~373. FO4's graph "Speed" is in the // CommonwealthOnline.log: walk starts ~47, full run ~373. FO4's graph "Speed" is in the
// same world-units/sec scale as our network movementSpeed, so the mapping is ~1:1. // same world-units/sec scale as our network movementSpeed, so the mapping is ~1:1.
// (The earlier 0-105 calibration was wrong and compressed run speed, causing foot slide.) // (The earlier 0-105 calibration was wrong and compressed run speed, causing foot slide.)
constexpr float kGraphSpeedMin = 0.0F; constexpr float kGraphSpeedMin = 0.0F;
@@ -635,7 +635,7 @@ namespace F4T::ProxyAnimationSync
} }
// FO4 graph "Speed" is in the same world-units/sec scale as our derived // FO4 graph "Speed" is in the same world-units/sec scale as our derived
// movementSpeed (confirmed in Fallout4Together.log: run movementSpeed ~306 lines up // movementSpeed (confirmed in CommonwealthOnline.log: run movementSpeed ~306 lines up
// with graph Speed ~296-373). Map ~1:1 so the walk/run foot cadence matches the // with graph Speed ~296-373). Map ~1:1 so the walk/run foot cadence matches the
// proxy's actual ground translation and does not slide. // proxy's actual ground translation and does not slide.
float graphSpeed = a_movementSpeed; float graphSpeed = a_movementSpeed;
+1 -1
View File
@@ -1,6 +1,6 @@
# Source # Source
This folder is for Fallout 4 Together native plugin source files. This folder is for Commonwealth Online native plugin source files.
Initial planned source areas: Initial planned source areas:
+2 -2
View File
@@ -308,7 +308,7 @@ namespace
// vertical-speed heuristic (a_verticalSpeed >= kJumpVerticalSpeedThreshold) produced // vertical-speed heuristic (a_verticalSpeed >= kJumpVerticalSpeedThreshold) produced
// constant false positives: (z - prevZ)/dt spikes to thousands of units/sec on flat // constant false positives: (z - prevZ)/dt spikes to thousands of units/sec on flat
// ground due to tiny dt and z micro-jitter, so proxies were stuck in a perpetual jump // ground due to tiny dt and z micro-jitter, so proxies were stuck in a perpetual jump
// state that masked the run/walk locomotion animation (see Fallout4Together.log). // state that masked the run/walk locomotion animation (see CommonwealthOnline.log).
const auto apiJumping = a_player.IsJumping(); const auto apiJumping = a_player.IsJumping();
if (apiJumping) { if (apiJumping) {
jumpHoldUntil = a_currentTime + kJumpStateHoldDuration; jumpHoldUntil = a_currentTime + kJumpStateHoldDuration;
@@ -649,7 +649,7 @@ F4SE_PLUGIN_LOAD(const F4SE::LoadInterface* a_f4se)
{ {
F4SE::Init(a_f4se); F4SE::Init(a_f4se);
LogInfoWithLocalPlayerPrefix("Fallout 4 Together plugin loaded successfully."); LogInfoWithLocalPlayerPrefix("Commonwealth Online plugin loaded successfully.");
// TODO: Consider separate per-instance log files once launcher/profile support exists. // TODO: Consider separate per-instance log files once launcher/profile support exists.
// Networking is intentionally localhost-only for the first milestone. If the // Networking is intentionally localhost-only for the first milestone. If the
+5 -5
View File
@@ -2,7 +2,7 @@
includes("lib/commonlibf4") includes("lib/commonlibf4")
-- set project constants -- set project constants
set_project("Fallout4Together") set_project("CommonwealthOnline")
set_version("0.0.0") set_version("0.0.0")
set_license("GPL-3.0") set_license("GPL-3.0")
set_languages("c++23") set_languages("c++23")
@@ -14,11 +14,11 @@ add_rules("plugin.vsxmake.autoupdate")
add_requires("nlohmann_json") add_requires("nlohmann_json")
-- define targets -- define targets
target("Fallout4Together") target("CommonwealthOnline")
add_rules("commonlibf4.plugin", { add_rules("commonlibf4.plugin", {
name = "Fallout4Together", name = "CommonwealthOnline",
author = "Fallout4Together", author = "Commonwealth Online",
description = "Fallout4Together F4SE plugin using CommonLibF4" description = "Commonwealth Online F4SE plugin using CommonLibF4"
}) })
-- add src files -- add src files
+1 -1
View File
@@ -1,6 +1,6 @@
# Protocol # Protocol
This folder documents the planned network protocol for Fallout 4 Together. This folder documents the planned network protocol for Commonwealth Online.
The first protocol should be simple and focused on player transform sync. The first protocol should be simple and focused on player transform sync.
+1 -2
View File
@@ -1,7 +1,6 @@
# Message Types # Message Types
This file tracks current and planned message type names for the Fallout 4 This file tracks current and planned message type names for the Commonwealth Online local networking prototype.
Together local networking prototype.
## Implemented ## Implemented
+1 -1
View File
@@ -1,7 +1,7 @@
# Packet Types # Packet Types
This document describes the currently implemented local prototype packet types This document describes the currently implemented local prototype packet types
for Fallout 4 Together. for Commonwealth Online.
The current protocol is newline-separated JSON over a local TCP connection to The current protocol is newline-separated JSON over a local TCP connection to
`127.0.0.1:7777`. `127.0.0.1:7777`.
+2 -2
View File
@@ -1,6 +1,6 @@
# Player Sync # Player Sync
Player synchronization is the first major technical goal for Fallout 4 Together. Player synchronization is the first major technical goal for Commonwealth Online.
The current implementation is still a local networking prototype. The current implementation is still a local networking prototype.
## Current Implemented Flow ## Current Implemented Flow
@@ -110,7 +110,7 @@ Normal local movement currently uses three separate rates:
- Sends are skipped until position changes by about 3 game units or rotation - Sends are skipped until position changes by about 3 game units or rotation
changes by about 0.02 radians. changes by about 0.02 radians.
- Local movement logs stay much slower, around once per second, so - Local movement logs stay much slower, around once per second, so
`Fallout4Together.log` remains readable. `CommonwealthOnline.log` remains readable.
`cell_change`, `worldspace_change`, and `teleport` movement types bypass the `cell_change`, `worldspace_change`, and `teleport` movement types bypass the
normal send interval and are sent immediately. The receiving plugin still stores normal send interval and are sent immediately. The receiving plugin still stores
+45
View File
@@ -0,0 +1,45 @@
@echo off
setlocal EnableExtensions
set "SCRIPT_DIR=%~dp0"
set "SERVER_DIR=%SCRIPT_DIR%server"
cd /d "%SERVER_DIR%"
if errorlevel 1 (
echo Failed to change to server directory:
echo "%SERVER_DIR%"
pause
exit /b 1
)
where python >nul 2>&1
if errorlevel 1 (
echo python was not found on PATH.
echo Install Python 3 and add it to PATH.
pause
exit /b 1
)
python -c "import PySide6" >nul 2>&1
if errorlevel 1 (
echo Installing server GUI dependencies...
python -m pip install -r requirements.txt
if errorlevel 1 (
echo Failed to install requirements.
pause
exit /b 1
)
)
echo Starting Commonwealth Online Dev Server GUI...
python dev_server_app.py
set "EXIT_CODE=%ERRORLEVEL%"
if not "%EXIT_CODE%"=="0" (
echo Dev server GUI exited with error code %EXIT_CODE%.
pause
exit /b %EXIT_CODE%
)
endlocal
exit /b 0
+1 -1
View File
@@ -52,7 +52,7 @@ class DevServerWindow(QMainWindow):
self.stat_labels: dict[str, QLabel] = {} self.stat_labels: dict[str, QLabel] = {}
self.selected_fake_client_key: int | None = None self.selected_fake_client_key: int | None = None
self.setWindowTitle("Fallout 4 Together Dev Server") self.setWindowTitle("Commonwealth Online Dev Server")
self.resize(1100, 760) self.resize(1100, 760)
self.setCentralWidget(self._create_tabs()) self.setCentralWidget(self._create_tabs())
+2 -2
View File
@@ -207,7 +207,7 @@ def main() -> None:
# This fake client lets us verify server broadcast behavior before trying to # This fake client lets us verify server broadcast behavior before trying to
# run and coordinate a second Fallout 4/F4SE instance. # run and coordinate a second Fallout 4/F4SE instance.
with socket.create_connection((HOST, PORT)) as connection: with socket.create_connection((HOST, PORT)) as connection:
log(f"Connected to Fallout 4 Together server at {HOST}:{PORT}") log(f"Connected to Commonwealth Online server at {HOST}:{PORT}")
buffer = "" buffer = ""
while True: while True:
@@ -226,7 +226,7 @@ if __name__ == "__main__":
try: try:
main() main()
except ConnectionRefusedError: except ConnectionRefusedError:
log(f"Could not connect to Fallout 4 Together server at {HOST}:{PORT}. Is server.py running?") log(f"Could not connect to Commonwealth Online server at {HOST}:{PORT}. Is server.py running?")
except KeyboardInterrupt: except KeyboardInterrupt:
log("\nFake client stopped.") log("\nFake client stopped.")
except OSError as error: except OSError as error:
+1 -1
View File
@@ -137,7 +137,7 @@ class FalloutTogetherServer:
self._running = True self._running = True
self._started_at = time.time() self._started_at = time.time()
self._log(f"Fallout 4 Together local test server listening on {self.host}:{self.port}") self._log(f"Commonwealth Online local test server listening on {self.host}:{self.port}")
self._log("Waiting for newline-separated JSON transform packets...") self._log("Waiting for newline-separated JSON transform packets...")
def _accept_loop(self) -> None: def _accept_loop(self) -> None: