RedM Guidebook Configuration
You never edit config/settings.lua. Write what you want to change into local/overrides.lua; it is folded over the defaults before a single client or server file runs, and an update never touches it.
RmGuidebook.Local = {
bridge = { framework = 'vorp' },
overlay = { title = 'The Blackwater Gazette' },
}Maps merge key by key; lists replace wholesale
staff = { groups = { 'owner' } } means those groups and no others — not those plus the shipped three.
Find a typo instantly
Turn on debug = { enabled = true } and the console prints every value your overrides actually changed at start-up. A key that is not a setting is complained about by name rather than silently ignored.
language
'en', 'de', 'es' or 'fr'. One setting covers both halves: what the server says in chat and what the overlay draws. Default 'en'.
See Languages.
bridge
| Key | Default | |
|---|---|---|
framework | 'auto' | 'vorp', 'rsg', 'redemrp', 'standalone' or 'auto' |
notice | 'builtin' | Where server-authored lines are drawn |
dwell | 4000 | Milliseconds a line stays up |
'auto' probes for vorp_core, then rsg-core, then redem_roleplay, and takes the first that is started. Name one explicitly if two are installed, or if your start order is unreliable — naming it skips the probe entirely.
notice:
| Value | |
|---|---|
'builtin' | Draws in the overlay's own toast, on telegram paper. Refusals are coloured differently from receipts |
'framework' | Hands the line to your framework. Falls back to the overlay when the framework has nothing to draw with, so a line is never lost |
'off' | Draws nothing at all — for a server that pipes its own |
staff
| Key | Default | |
|---|---|---|
aces | { 'rm_guidebook.press' } | Server ACEs; any one is enough |
groups | { 'admin', 'superadmin', 'owner' } | Framework group names |
allowConsole | true | Console (source 0) always clears |
verbs | all nil | An ACE per verb |
Three independent checks; any one passing is enough and all three are consulted. Checked on the server every time the press is opened and again on every verb.
verbs widens rather than narrows — a verb passes when the player is staff or holds the named ACE. Full detail in Permissions.
readers and route
readers = { ace = nil },
route = { ace = nil, color = 'COLOR_RED' },nil means everyone. An ACE name means only players holding it — staff always pass either way.
commands and keys
commands = {
open = 'almanac',
press = 'press',
hand = 'almanac_hand',
route = 'almanac_route',
resync = 'almanac_resync',
migrate = 'almanac_migrate',
debug = 'almanac_debug',
demo = 'almanac_demo',
},
keys = { open = 'F7', signpost = 'E' },keys.open is a real key mapping — players can rebind it in the game's own settings and your default does not override their choice.
keys.signpost is a control action, not a scancode. A player who moved their interact key sees a prompt showing their key. Names come from Util.Keys in client/util.lua.
See Commands.
access
access = { enabled = true, staffSeesAll = true },enabled = false makes every record visible to everyone whatever its access block says. The blocks are kept, not erased, so turning it back on restores your gates exactly as you left them.
On a standalone server you almost certainly want this off
There are no jobs, so every gated record is closed to everyone. See Standalone.
staffSeesAll = false lets you test a job-gated chapter as a staff member without leaving the group.
signpost
| Key | Default | |
|---|---|---|
reach | 2.0 | Metres. How close before the prompt appears |
scan | 750 | Milliseconds between distance scans |
horizon | 60.0 | Metres beyond which a signpost is not considered |
textFont | 6 | Default title font |
textScale | 0.35 | Default title size |
markerLift | -1.0 | Z offset applied to markers |
scan is the one with a real cost. The scan decides which signposts are near; only near ones are drawn every frame. Lowering it makes prompts appear sooner and costs a little more. The default is fine until you have hundreds of signposts.
horizon is raised automatically to the largest text or marker reach in your data, so a signpost that asks to be seen from 100 m is seen from 100 m without you touching this.
markerLift ships at -1.0
That is right for a cylinder at a standing player's feet and wrong for most other shapes. Set it to 0.0 if your markers float.
overlay
| Key | Default | |
|---|---|---|
title | 'Frontier Almanac' | On the cover and in the header |
theme | 'leather' | 'leather', 'parchment' or 'midnight' |
copyLock | false | Disables selecting and copying page text |
embeds | false | Allows an entry to frame another website |
seekCooldown | 3 | Seconds between searches, per player |
seekMinimum | 3 | Shortest query accepted |
fonts | four faces | Typefaces offered in the editor |
theme is only the default. A player's own choice is remembered on their machine and wins.
embeds is experimental for a reason that is not this code
Most of the web refuses to be framed and shows nothing at all. Turning it off after someone has used it hides existing frames rather than leaving them working — the reader strips them.
fonts may name any font installed on the player's machine, but only the four shipped ones — Crimson Pro, IM Fell English, Rye, Special Elite — are certain to draw. Nothing is fetched from the internet at runtime.
jobs
The list offered when you gate a chapter. Merged over whatever the framework reported, and yours wins.
jobs = {
vallaw = { label = 'Valentine law', grades = { [0] = 'Recruit', [1] = 'Deputy', [2] = 'Sheriff' } },
},On VORP and RSG the framework reports a real list and you only need this to fix a label. On RedEM:RP and standalone there is no registry, so this is where the labels come from — see Frameworks.
/almanac_resync re-reads the list, so a job added since start-up appears without a restart.
log
log = {
webhook = '',
colors = { info = 2061822, permission = 11750815, critical = 16711680, other = 8421504 },
},A Discord webhook that receives one embed per notable event: records written and struck, verbs refused, faults the console alone would lose. Empty means no logging. Colours are decimal, as Discord wants them.
Logging never takes the press down with it
A webhook that refuses costs a line in the console and nothing else.
The webhook URL is a credential
It sits in plain text in local/overrides.lua. Redact it before sending your config to anyone — whoever holds it can post into that channel.
seed
seed = { demo = true },Writes a welcome chapter and entry the first time the resource starts against an empty chapters table, so the almanac has something in it. Harmless once anything exists. Set false before the first start if you would rather begin with nothing.
debug
debug = {
enabled = false,
log = { bridge = true, ledger = true, shelf = true, field = true,
hud = true, link = true, press = true },
},enabled is the master switch. The channels let you silence the noisy ones once you know which you want:
| Channel | Traces |
|---|---|
bridge | Framework binding, RPC faults, webhook status |
ledger | Queries, table creation, rows dropped as invalid |
shelf | Loads, counts, horizon changes |
field | Blips raised and lowered, prompts, routes, ferries |
hud | Overlay opened and shut, the key |
link | Adapter chosen, calls timing out, shelf arriving |
press | Every verb, and every refusal with who was refused |
With enabled on, the console also prints every value your overrides changed.