Server configuration

"Every setting has a default. Every default was chosen by somebody who was not you." — Clerk Second Class Umi Dray

storyforce_server.cfg is where a StoryForce server is tuned, and it does more work than a normal Jedi Academy config.

The config file is not optional. 7 admin commands, including kick and ban, only exist because this file grants them. See installing a dedicated server.


What it does

A cvar is a named setting the game holds in memory. storyforce_server.cfg sets 70 StoryForce cvars in one pass, covering registration, characters, roleplay rules, permissions and identity labels, plus a block of base-game settings.

This page covers the ones operators change. For the full list of every StoryForce setting with its default, use the settings reference.


Where the config lives

The file ships inside the server download and sits next to the game module, in your StoryForce folder. Edit that copy. Under Docker, put your copy in homepath/StoryForce/ so it shadows the one baked into the image.

The file ends with map mp/ffa3, which is what starts the server. Change that line to change the first map, and leave it in place, because without it the server loads nothing.

Values that differ from the compiled defaults

5 settings have a value in this file that does not match the value compiled into the game module. The config file value is the intended behaviour in every case:

  • sf_comadmincmds, sf_clericaladmincmds and sf_leadercmds, the 3 permission masks, which only grant /sfkick, /sfban, /changemap, /teleport, /telemark, /centersay and /playcinematic when this file runs
  • sf_storytoolsblock, which covers 4 more story tools in the config than in the compiled default
  • sf_forcemarkduration, which the config sets to 0 for indefinite marks while the compiled default is 1 minute

Those 7 missing commands sit on 6 permission bits, because /teleport and /telemark share one bit, and /cs is an alias for /centersay. The identity labels differ too, but only because the compiled defaults leave every label blank while the shipped file fills in an example ladder.

Treat this as a known issue rather than something to work around. Running with +exec storyforce_server.cfg every time makes it irrelevant.


Settings that matter

Registration and accounts

Server-side. Set to 1 to let anyone sign themselves up with /account register. Default 0, which means an admin creates every account. Server-side. Minutes an address must wait after a successful registration. 0 turns it off. Default 10. Server-side. Seconds an address must wait after a failed /account register, which throttles username probing. 0 turns it off. Default 45. Server-side. Seconds an address must wait after a failed login. Default 3.

Set sf_registercooldown and sf_logincooldown both to 0 and the whole per-address register check is skipped, which takes sf_registerfailcooldown with it whatever its own value.

sf_membershiponcreation and sf_charsperaccount are covered with the membership ladder on admin ranks and membership.

Server-side. Seconds a logged-out player stays in play before dropping to spectator. 0 sends them immediately. Default 20.

sf_seedaccount and sf_seedaccountpass are different from the rest. They are read once, on the very first boot against an empty database, and ignored afterwards. Set sf_seedaccountpass before you start the server for the first time.

Characters and XP

Server-side. XP every new character is created with. One Force rank costs between 10 and 95. Default 50. Server-side. Set to 1 to restrict /givexp to community admins and above. Default 0, which lets any member award XP. Server-side. Set to 1 to let guests play community characters. Default 0. Server-side. Set to 1 to let former members play community characters. Default 0. Server-side. Set to 1 to let former members use /mynpc. Default 0.

Chat and roleplay

Server-side. Set to 0 to require a login before any chat channel works. Default 1. Server-side. The delimiter wrapped around a /me action. Defaults to 2 vertical bars. Server-side. Trade tongues a Diplomacy 3 character understands without learning them. Defaults to huttese, rodese, binary and bocce. Server-side. Makes a player who is typing immune to damage from other players. Environmental damage still lands. Default 1. Server-side. Downs a character instead of killing them when combat takes them low. Default 1. Server-side. Set to 0 for infinite ammo, which suits set-piece filming. Default 1. Server-side. Swallows a mistyped slash command in chat instead of broadcasting it to everyone. Default 1.

Moderation

Server-side. Minutes a /sfkick blocks the address from reconnecting. 0 makes it a plain instant kick. Default 10. Server-side. Bitmask of commands community admins can run. Shipped value 270549387263. Server-side. Bitmask of commands clerical admins add on top. Shipped value 279173920768, which is where /sfkick lives. Server-side. Bitmask of commands only leadership can run. Shipped value 549771542528, which is where /sfban lives.

Change the 3 masks with the calculator on permission bits rather than by hand. The shipped config also sets g_allowVote 0, so nobody can call a vote to change map or kick.


Where secrets go

3 values are credentials and none of them belong in a file you share:

  • rconpassword, which the shipped config leaves commented out
  • sf_d1token, the Cloudflare API token for the database mirror
  • sf_llmnpc_token, the API key for AI NPCs

Set an rcon password before opening the server. The console commands reachable over rcon include a full reset of the leadership account, so an unset password is an unlocked door.

sf_d1token and sf_llmnpc_token carry no archive flag on purpose. The game never writes them into its own saved config, which keeps them out of files that get copied around. The trade-off is that they only exist while storyforce_server.cfg sets them, so they have to be in that file.

2 more D1 values behave the same way, sf_d1account and sf_d1database. Neither is a secret on its own, but both are needed alongside the token. See backups and D1 sync.


Things to note

  • Settings marked as archived get written back. The engine saves their current values on shutdown, so a value set once by hand outlives the reason you set it.
  • The 2 seed account settings are read once. Changing them after the first boot does nothing at all, because the account is found by its row afterwards.
  • Cooldowns are per address, not per account. 2 players behind one connection share a window, and both cooldown tables are cleared on every map change.
  • sf_kickbantime blocks are held in memory. A restart clears every one of them.
  • Identity labels are yours to fill in. The shipped config sets an example ladder that almost certainly does not match your setting. See identity labels.
  • map mp/ffa3 is the last line for a reason. Anything you add after it runs after the map has already loaded.

Next