Repository navigation
Running a server
How to run the server on your own machine and log in with your own client. Today it takes the client from the login screen to character select and character creation; entering the world comes with the next stage.
A server on your machine that your WildStar 16042 client logs in to, where you can create and delete characters. Everything listens on 127.0.0.1 unless you configure otherwise.
The server is one process. Your client signs on, logs in and reaches character select through it, and everything is saved to PostgreSQL. Character creation reads two of your client's own tables, so you extract them first with MapGenerator. Host has what happens at start-up and shutdown, and the server core design has the rest.
- A WildStar 16042 client. The repository holds no client files.
- PostgreSQL 18. Earlier versions won't do: names and emails rely on a case-insensitive match that version 18 added.
-
The .NET 10 SDK, the version
global.jsonnames.
-
Create the database. In PostgreSQL 18, create a database and a role that owns it.
-
Set two environment variables, and keep both out of any file in the repository:
$env:Persistence__ConnectionString = "Host=localhost;Database=nexustomorrow;Username=nexustomorrow;Password=<password>" $env:Gateway__UnknownAccountSecret = [Convert]::ToBase64String([Security.Cryptography.RandomNumberGenerator]::GetBytes(32))
Keep the secret the same across restarts.
-
Create the schemas:
dotnet run --project Source/NexusTomorrow.Server -- migrate
It exits 0, or 1 with the error. The server won't start while a migration is pending, so run it again after an update.
-
Extract your client's tables with
MapGenerator, then point the server at the folder holdingtbl:$env:Content__ClientDataPath = "<the folder MapGenerator wrote>"
Without it, character creation offers nothing.
-
Start the server:
dotnet run --project Source/NexusTomorrow.Server
-
Create an account at the server's console:
account create <email> <password>Quote a password that has spaces.
helplists the commands, and Command layer commands has every one. -
Start your client with
ClientConnector, pointed at127.0.0.1, and log in with that account. CopyClientConnectorinto your client'sClient64folder, beside the client; you can start it from there or from a shortcut. On its first run it asks for the host and language and saves them beside itself, and after that it starts the client straight away.
Settings come from appsettings.json, then the environment (with __ for :), then the command line. The ones you're most likely to change:
| Setting | Default | For |
|---|---|---|
Persistence:ConnectionString |
none | The database |
Gateway:UnknownAccountSecret |
none | Unknown accounts' stand-in credentials |
Content:ClientDataPath |
none | Your extracted tables |
Gateway:WorldPublicAddress |
127.0.0.1 |
The address your client reaches the world on |
Realm:Name, Realm:Id
|
NexusTomorrow, 1
|
How the realm presents itself |
Realm:MaxCharactersPerAccount |
12 |
Characters per account |
Each system's full list is on its own page: Gateway, Owners, Persistence, Host.
- Logging in takes you to character select.
- A character you create appears in the list. The client then selects it by itself and plays its opening cinematic, and after that it waits, because there's no world to enter yet.
| You see | Do |
|---|---|
| The server won't start, naming a setting | Fix that setting; the message names it, never its value |
"run NexusTomorrow.Server migrate first" |
Run step 3 again |
| The server won't start, waiting on its first character ids | Check the database is up and the connection string reaches it |
| Creation offers no options | Set Content:ClientDataPath to the folder holding tbl, and restart |
| The original launcher opens instead of the game | Start the client with ClientConnector: the client only connects to a server when its command line begins with /auth
|
| Logins are refused | The database is unreachable; server status at the console says so |
ClientConnector says it can't find the client |
Copy it into your client's Client64 folder, beside the client |
| You want to see what the client and server exchange | Set Logging__LogLevel__NexusTomorrow.Gateway to Debug and restart: every message in and out is logged by opcode and name, never its values |
| Command | Does |
|---|---|
dotnet run --project Source/NexusTomorrow.Server -- migrate |
Applies every schema's migrations |
dotnet run --project Source/NexusTomorrow.Server |
Runs the server |
account create <email> <password> |
Creates an account, at the console |
server status |
Accounts online, owner queues, the save backlog, the database |
help |
Lists the commands |
Every console command, with its permission, is on Command layer commands.
| Piece | Path |
|---|---|
| The server | Source/NexusTomorrow.Server/ |
| Default settings | Source/NexusTomorrow.Server/appsettings.json |
| The table extractor | Source/NexusTomorrow.MapGenerator/ |
| The client launcher | Source/NexusTomorrow.ClientConnector/ |
| The running steps, as the repository keeps them | README.md |
Start here
How the server works
- Server core design
- Host
- Gateway
- Owners
- Persistence
- Command layer
- Harness
- Map scheduler design
- Timer wheel design
The protocol
Working on it