Files
Commonwealth-Online-Public/plugin/setup.md
T
Andrew Zambazos f557835b19 Add Fallout 4 path resolver and update deploys
Introduce resolve-fallout4-path.bat to centralize locating the Fallout 4 installation. deploy-all.bat and deploy-ui.bat now call the resolver (accept an optional path arg or prompt interactively), and the chosen path is saved to a local .fallout4-path file (added to .gitignore). Updated docs (docs/dev-log.md, plugin/setup.md) to reflect the new behavior and usage examples. The resolver normalizes game or Data paths, probes common Steam locations, prompts the user when needed, and exports F4_DIR and DATA_DIR for callers.
2026-06-11 14:35:50 +12:00

191 lines
5.8 KiB
Markdown

# Plugin Setup
The Commonwealth Online native plugin is based on `Fallout4Together`.
## Selected Template
```text
Template: Fallout4Together
Template URL: https://github.com/libxse/Fallout4Together
Use: Copied into plugin/ as the starting plugin scaffold
Forked: No
```
## Build Target
```text
Project Name: CommonwealthOnline
Output DLL: CommonwealthOnline.dll
Expected Install Path: Data/F4SE/Plugins/CommonwealthOnline.dll
```
## Current Goal
The current goal is to build the F4SE plugin, confirm it loads through F4SE, and
verify the local networking prototype against `server/server.py`.
This means the plugin should be able to:
* Build successfully
* Output `CommonwealthOnline.dll`
* Be copied into `Data/F4SE/Plugins/`
* Load when Fallout 4 is launched through F4SE
* 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
* Connect to the local server on `127.0.0.1:7777`
* Send local transform packets
* Receive `welcome`, `transform`, and `disconnect` packets
* Store remote player state internally
* Move the single placed test proxy actor from remote player state on the game
thread without dynamically spawning actors
* Smooth normal proxy movement and snap cell changes, worldspace changes, and
teleports safely
## Not Included Yet
The plugin does not currently include:
* Dynamic actor spawning
* Multiple proxy actors
* Remote player spawning
* Combat sync
* Quest sync
## PrismaUI HTML Server Browser
Commonwealth Online renders an HTML server browser through [PrismaUI_F4](https://github.com/NomadsReach/framework-F4-Conversion), vendored as:
```text
ThirdParty/framework-F4-Conversion
```
Ultralight SDK setup:
* Vendored as a git submodule at `ThirdParty/Ultralight-SDK` (tracks the `Windows` branch)
* Initialize with: `git submodule update --init --recursive ThirdParty/Ultralight-SDK`
* Override with environment variable: `ULTRALIGHT_SDK_PATH`
Build PrismaUI_F4:
```bat
build-prismaui.bat
```
Build and deploy everything:
```bat
build.bat
build-prismaui.bat
deploy-all.bat
```
Or use `build-all.bat` to build and deploy in one step.
`deploy-all.bat` and `deploy-ui.bat` prompt for your Fallout 4 install folder on first use (or when the saved path is missing). The choice is stored locally in `.fallout4-path` (gitignored). You can still pass a path on the command line:
```bat
deploy-all.bat "D:\SteamLibrary\steamapps\common\Fallout 4"
deploy-ui.bat "D:\SteamLibrary\steamapps\common\Fallout 4\Data"
```
`deploy-all.bat` installs:
* `Data/F4SE/Plugins/PrismaUI_F4.dll`
* `Data/F4SE/Plugins/CommonwealthOnline.dll`
* `Data/PrismaUI_F4/libs/*.dll`
* `Data/PrismaUI_F4/resources/*`
* `Data/PrismaUI_F4/views/CommonwealthOnline/browser/index.html`
In-game controls:
* Main Menu > Multiplayer opens the server browser
* Press **F9** to toggle the browser
* Use the server list to browse, filter, and join servers
* **Local Relay (Dev)** connects to `127.0.0.1:7777` — start `server/server.py` first
If PrismaUI_F4 is missing, the plugin still loads and networking continues to work; only the HTML UI is skipped.
## Required Tools
The plugin setup is expected to require:
* Fallout 4 on Steam
* Fallout 4 Script Extender, F4SE
* Visual Studio 2022
* MSVC C++ compiler
* Windows SDK
* XMake
* Git
## Recommended Folder Layout
```text
plugin/
├─ xmake.lua
├─ src/
├─ include/
├─ external/
├─ build/
├─ README.md
└─ SETUP.md
```
## Build Steps
From the repository root:
```bash
cd plugin
xmake
xmake build
```
If the build succeeds, look for the compiled DLL in the output folder created by XMake.
## Install Location
For manual testing, the compiled plugin DLL should eventually be copied to:
```text
Fallout 4/Data/F4SE/Plugins/CommonwealthOnline.dll
```
If the `F4SE/Plugins/` folder does not exist inside `Data/`, create it manually.
## Testing Checklist
Use this checklist for the first plugin test:
* [ ] Fallout 4 launches normally without the plugin
* [ ] Fallout 4 launches through F4SE without the plugin
* [ ] `CommonwealthOnline.dll` builds successfully
* [ ] `CommonwealthOnline.dll` is copied to `Data/F4SE/Plugins/`
* [ ] Fallout 4 launches through F4SE with the plugin installed
* [ ] Game reaches the main menu without crashing
* [ ] Plugin log file is created
* [ ] Plugin log confirms that the plugin loaded
* [ ] Local server is running before gameplay networking tests
* [ ] Plugin log shows `[LocalPlayerId=unassigned]` before assignment
* [ ] Plugin log shows `[LocalPlayerId=N] Assigned server playerId: N`
* [ ] Plugin logs prefixed remote player updates from another connected client
* [ ] Plugin logs prefixed remote player removal after a disconnect
* [ ] `CommonwealthOnline.esp` is enabled (provides `COPlayerProxy` actor base, local FormID `002666`)
* [ ] With two Fallout 4 instances in the same cell, each instance spawns a dynamic
proxy at the other player's networked position
* [ ] Optional regression: `coc F4TTestCell01` with `kEnablePrePlacedProxyPool` enabled
* [ ] Optional regression: `F4TProxyRemotePlayer01REF` resolves when placed fallback flag is on
### Global dynamic spawn validation
* [ ] Two clients in the same vanilla interior (e.g. Sanctuary house) see each other's proxies
* [ ] Two clients in the Commonwealth exterior in the same loaded area see proxies
* [ ] Remote player in a different cell: proxy held hidden, not visible
* [ ] Local player walks into remote player's cell: proxy spawns at remote position
* [ ] Local player leaves a cell with active proxies: no orphaned actors remain in prior cell
## Notes
Remote actors are dynamically spawned at runtime in the local player's current
cell. The game-thread proxy actor controller consumes a copied remote-player
snapshot to spawn, move, and hold proxy actors per remote `playerId`.