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:
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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.
@@ -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:
|
||||||
|
|
||||||
|
|||||||
@@ -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,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,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,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:
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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,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
@@ -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
@@ -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
@@ -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
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|
||||||
|
|||||||
@@ -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):**
|
||||||
|
|||||||
@@ -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
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,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
@@ -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
@@ -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
@@ -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,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
@@ -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`.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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())
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user