Chat and Commands¶
See Player/README.md for the verification-debt caveat.
Every command below is real — pulled directly from what each module actually registers
against ICommandRegistry, not from the legacy game's much longer command list. If a command
you remember from the original isn't here, it isn't built yet; see
15_COMMANDS_FRAMEWORK.md §7
for why, and §3 below for the specific, large category of commands that's missing for one
shared reason.
1. How a command works¶
Open the chat box (the chat keybind — set it in your input settings if it isn't already
bound) and type /name arg1 arg2 ..., or just type plain text with no leading / to talk in
/ooc automatically. The server checks, in order: does the command exist, are you allowed to
run it (some commands need a specific permission), did you give it enough arguments — and logs
every attempt, refused or not
(15_COMMANDS_FRAMEWORK.md §4). Case
doesn't matter — /Help and /help are the same command.
The chat box tells you why a command was refused (unknown command, missing permission, too few arguments, or the command's own failure reason), and shows a confirmation when one succeeds — see 15_COMMANDS_FRAMEWORK.md §4. The one case it can't explain is a command name or argument list so long the server rejects it before even looking at who sent it; the chat box catches that itself and tells you locally instead.
2. Every real command¶
| Command | What it does | Who can use it |
|---|---|---|
/help [command] |
Lists every registered command, or one command's help text | Everyone |
/ooc <text> |
Out-of-character chat, everyone online, 60s cooldown per sender | Everyone |
/globalaction <text> |
A server-wide action message | chat.globalaction permission |
/a <text> |
Admin chat — only admins receive it | chat.admin permission |
/m <text> |
Moderator chat — only moderators receive it | chat.moderator permission |
/radio <text> |
Radio — anyone can key up, but only characters whose current job is in the Officials group receive it | Everyone (recipients are filtered, not the sender) |
/advert <text> |
A paid, server-wide advert — $60, 150s cooldown per sender | Everyone who can afford it |
/pm <name> <text> |
A private message to one currently-connected character, matched by name | Everyone |
/team <jobName> |
Join a job/team, if you're eligible — see 03_JOBS_ECONOMY_AND_PROPERTY.md | Everyone (job's own rules still apply) |
/laws |
Lists all ten law slots | Everyone |
/setlaw <index> <text> |
Edits one law slot, 120s cooldown | law.edit permission |
/details <text> |
Sets your character's freeform details text | Everyone (self only) |
/gender <male\|female> |
Sets your character's gender field | Everyone (self only) |
/give <itemAssetId> [count] |
Spawns an item into your own inventory | admin.give permission |
/grant <characterId> <permission> |
Grants another character a permission | admin.moderate permission |
/revoke <characterId> <permission> |
Revokes another character's permission | admin.moderate permission |
/kick <characterId> |
Disconnects a character | admin.moderate permission |
Source, if you want to verify any of these directly: ChatModule.Ready(), JobsModule.Ready(),
LawModule.Ready(), CharacterCommandsModule.Ready(), InventoryModule.Ready(),
AdminModule.Ready(), each registering against ICommandRegistry
(15_COMMANDS_FRAMEWORK.md §2).
/pm's target is matched on a single word — a character whose name contains a space can't be
reached by it today (named, not solved, in ChatModule.PmAsync's own doc comment).
3. What's missing, and why it's one gap, not sixteen¶
/warrant, /unwarrant, /arrest, /setowner, and every other command that targets
another specific player by name don't exist, for the same underlying reason each time:
nothing in this codebase can resolve "the connected character named X" into an actual
character yet. Looking someone up by their persisted id loads them from storage and marks
them active — the wrong side effect just to find out who they are
(17_CRIME_FRAMEWORK.md §4).
The underlying mechanisms (warrants, arrest, ownership assignment) are built and tested — they
just have no command you can type to reach them yet. This isn't sixteen missing features;
it's one missing capability blocking sixteen command surfaces.
Also missing, and unrelated to the above: every proximity-filtered channel — default
in-character speech, /y yell, /w whisper, /me emote, /action, /looc local OOC — all
need to know where your character physically is in the world, which nothing tracks yet
(19_CHAT_FRAMEWORK.md §1).