Configuration Guide
How settings work in oxide-landscapingjob (the /landscaping settings editor, factory defaults and file-owned yards), plus every setting and its default.
Reference for the current oxide-landscapingjob config surface.
How Settings Work
Settings are edited in-game with the /landscaping settings command (admins only). Changes save to your database and apply instantly — no restart needed. Values are checked before saving, and a bad value is rejected with a reason.
The config files in the shared/ folder are the factory defaults. The job keeps its live settings in your database, in the shared oxide_settings table:
- The first time the job starts, it copies the config files into the database. Edits you made to the files before that first start are what gets copied.
- From then on, the database wins. Editing a config file on a server that has already started changes nothing, even after a restart. Only brand-new settings added by a future update are imported from the files.
- To change a setting, use
/landscaping settingsin-game (admins only). Changes save straight away and apply live, with no restart. A Basic / Advanced switch at the top picks which settings you see. - Reset to default on a setting puts it back to its value in the config file, as the file was when the server last started, and replaces the whole setting. So a file edit only takes effect after a restart and pressing Reset to default on that setting.
This includes the offices (Config.Locations): on an install that has already started once, add or change offices through /landscaping settings (under Locations & Yards), not by hand-editing the files. See Adding a Second Office.
Three things stay in the files (edit the file and restart): Config.UseHudAccent, Config.SettingsCommand in shared/config/models.lua (the command named in missing-model warnings), and the yards in Config.Yards.
Yards stay in the file. Config.Yards — every yard with its grass patches and obstacles — is too large to sync live, so it is never stored in the database. Yards stay in shared/config/locations.lua, are built in-world with /moweryard, and go live after you paste the export into that file and restart the resource. The menu shows the yards but doesn't edit them. See the Yard Building Guide.
Other resources can read and change settings through the GetSetting and SetSetting server exports — see the API Reference.
The tables below document every setting and its factory default.
Config File Map
| File | Purpose |
|---|---|
shared/config.lua | Core toggles |
shared/config/job.lua | Progression, pay, timer, crew, complaints, cancel cooldown |
shared/config/vehicles.lua | Van, mower, blades, damage, audio, particles |
shared/config/mowing.lua | Grass models, obstacle models, interaction, animations |
shared/config/visuals.lua | NPC, blips, markers, waypoints, yard editor |
shared/config/locations.lua | Office locations and shipped yard data |
shared/config/outfits.lua | Optional uniforms |
shared/config/tutorials.lua | Tutorial text and onboarding toggles |
shared/config/models.lua | Model replacements for game builds that lack a model |
Core Settings
shared/config.lua
| Setting | Default | Description |
|---|---|---|
Config.Debug | false | Extra console logging for diagnosing problems. Leave off normally |
Config.usePhone | true | Send shift messages and the end-of-shift pay summary to the player's phone (requires a phone resource o-link supports). They arrive as texts on phones that support them and as mail on the rest; texts need o-link 1.11.0 or newer, and an older o-link sends mail. On Oxide Phone with the Gigs app on, shift messages (not the pay summary) show as Gigs notifications instead. false sends nothing to the phone; the on-screen notifications still show. See Phone Shift Messages |
Config.shiftSummary | 'text' | Currently has no effect in this job. The pay summary follows Config.usePhone |
Config.menuStyle | 'nui' | Shift menu style: 'nui' (full custom menu) or 'menu' (simple text menu) |
Config.UseHudAccent | true | The yard overlay and the tutorial hints use your server's accent colour from Oxide HUD, set in Oxide HUD's Config.Theme. false keeps the job's own colours. Without Oxide HUD, or with no accent set there, nothing changes. Config file only: it is not in /landscaping settings, so change it in the file and restart |
Config.MaxSlotsPerLocation | 3 | How many players can work from one office at the same time |
Config.Debug = false
Config.usePhone = true
Config.shiftSummary = 'text'
Config.menuStyle = 'nui'
Config.UseHudAccent = true
Config.MaxSlotsPerLocation = 3Crew Settings
shared/config/job.lua
| Setting | Default |
|---|---|
Config.Crew.maxSize | 2 |
Config.Crew.inviteRange | 15.0 |
Config.Crew.inviteTimeout | 30 |
Config.Crew.coopBonusPercent | 0.15 |
Notes:
- Crew invites are ID-based in the current UI flow.
- The server still enforces
inviteRangewhen validating the invite.
Payment Settings
shared/config/job.lua
| Setting | Default |
|---|---|
Config.Payment.basePayPerYard | 75 |
Config.Payment.speedBonusAmount | 30 |
Config.Payment.speedBonusTimePercent | 0.60 |
Config.Payment.vehicleDestroyFine | 100 |
Config.Payment.streakBonusPerDay | 10 |
Config.Payment.maxStreakDays | 7 |
Config.Payment.gasFeePercent | 0.05 |
Config.Payment.taxPercent | 0.10 |
Config.Payment.payoutAccount | 'bank' |
Config.Payment.fineAccount | 'cash' |
payoutAccount is where net shift pay is deposited. fineAccount is where the van-destruction fine is withdrawn from. Both accept any account name your o-link money provider supports ('bank', 'cash', 'dirty', etc.).
Level Definitions
shared/config/job.lua
| Level | Title Key | Required Yards | Max Yards | Pay Multiplier | Mower Speed | Tip Chance | Tip Range |
|---|---|---|---|---|---|---|---|
| 1 | level.trainee | 0 | 3 | 1.0x | 1.0x | 10% | $5-$15 |
| 2 | level.groundskeeper | 12 | 4 | 1.1x | 1.1x | 15% | $5-$20 |
| 3 | level.landscaper | 35 | 5 | 1.2x | 1.2x | 25% | $10-$30 |
| 4 | level.senior_landscaper | 70 | 5 | 1.35x | 1.35x | 30% | $10-$40 |
| 5 | level.foreman | 130 | 6 | 1.5x | 1.5x | 40% | $15-$50 |
The "Title Key" column is a translation key — the text players actually see comes from locales/en.json, so you can rename the ranks there without touching the config.
Yard Tiers and Timer
shared/config/job.lua
Tier thresholds:
| Setting | Default |
|---|---|
Config.YardTiers.smallMax | 50 |
Config.YardTiers.mediumMax | 149 |
Tier multipliers are defined in shared/init.lua:
- small:
1.0 - medium:
1.5 - large:
2.0
Timer settings:
| Setting | Default |
|---|---|
Config.Timer.baseTime | 120 |
Config.Timer.timePerPatch | 5 |
Config.Timer.expiredPenalty | 0.85 |
Every yard gets a time limit of baseTime seconds plus timePerPatch seconds per grass patch. Finishing after the timer runs out doesn't fail the yard — the pay for it is just multiplied by expiredPenalty (0.85 = a 15% pay cut).
Cancel Cooldown
shared/config/job.lua
Players can drop the yard they're on without clocking out (see Cancelling the Current Yard). This setting controls the short wait afterwards.
| Setting | Default | Description |
|---|---|---|
Config.Cancel.cooldownSeconds | 60 | How long a player must wait after cancelling before starting another yard. Set to 0 for no wait |
Config.Cancel = {
cooldownSeconds = 60, -- seconds; 0 = no wait
}In a crew, both members get the cooldown, because either of them can start the next yard. Cancelling carries no fine and no complaint — this wait is the only cost.
Complaint Settings
shared/config/job.lua
| Setting | Default |
|---|---|
Config.Complaints.maxComplaints | 3 |
Config.Complaints.timeoutMinutes | 30 |
Config.Complaints.vehicleDestroyPenalty | 1 |
Config.Complaints.deathPenalty | 1 |
Config.Complaints.decayPerYard | 1 |
Players collect complaints for destroying company vehicles or dying on shift. Reaching maxComplaints suspends them from the job for timeoutMinutes minutes (and resets the count). Each completed yard removes decayPerYard complaints, so steady workers stay clean.
Vehicle Settings
shared/config/vehicles.lua
Company Vehicle
| Setting | Default |
|---|---|
Config.Rumpo.model | 'bison3' |
Config.Rumpo.primaryColor | { 255, 255, 255 } |
Config.Rumpo.secondaryColor | { 255, 255, 255 } |
Config.Rumpo.plate | 'LAWN' |
Config.Rumpo.healthCheckInterval | 1000 |
Config.Rumpo.destroyedThreshold | 150 |
Config.Rumpo.damageChargeRate | 0.50 |
Config.Rumpo.damageChargeThreshold | 950 |
Config.Rumpo.livery | -1 |
Config.Rumpo.extras | nil |
livery selects a livery index for replacement van models that ship multiple liveries (-1 keeps the model default). extras is an optional { [extraId] = enabled } map for forcing extras on/off on custom models.
Config.Rumpo.mowerAttach controls the cosmetic mower position on the van.
Mower
| Setting | Default |
|---|---|
Config.Mower.model | 'mower' |
Config.Mower.spawnOffsetBehind | 1.5 |
Config.Mower.healthCheckInterval | 1000 |
Config.Mower.destroyedThreshold | 150 |
Config.Mower.repairHealth | 800 |
Config.Mower.showOpenHood | false |
Config.Mower.allowFinishYardOnBreakdown | true |
Config.Mower.livery | -1 |
Config.Mower.extras | nil |
When allowFinishYardOnBreakdown = true, the current yard can be resumed after repair. The breakdown still counts toward complaint handling.
livery / extras work the same as on the van and are useful only if the stock mower model is replaced.
Mower Damage Particles
Config.Mower.damage.smoke and Config.Mower.damage.hitEffect describe the particle effects shown when the mower takes damage or hits an obstacle. Each entry contains:
dict— particle dictionary (default'core')name— particle effect nameoffset—vector3relative to the mowerscale— float
Blade Settings
| Setting | Default |
|---|---|
Config.Mower.blades.key | 'G' |
Config.Mower.blades.baseMowingSpeed | 3.0 |
Config.Mower.blades.basePowerMultiplier | 0.3 |
Config.Mower.blades.normalMaxSpeed | 15.0 |
Config.Mower.blades.normalPowerMultiplier | 1.0 |
Blade Particles
Config.Mower.blades.particle defines the grass-cutting effects:
dict— particle dictionary (default'core')burstName— non-looped burst played per patch cutloopedName— looped effect while blades are down and the mower is movingscale— floatoffset—vector3relative to the mower
Blade Audio
xsound-backed audio settings:
toggle = 'lower_mechanical_whirr.ogg'mowerLoop = 'lawn_mower_engine_loop.ogg'engineFail = 'engine_fail.ogg'toggleVolume = 0.2loopVolume = 0.3engineFailVolume = 0.4distance = 30
Mowing and Obstacles
shared/config/mowing.lua
Grass Props
Config.GrassProps contains the valid patch models used by the shipped yards and the yard editor.
Obstacle Props
Config.ObstacleProps contains the valid obstacle models used by the shipped yards and the yard editor.
Obstacle Settings
| Setting | Default |
|---|---|
Config.Obstacles.detectionRadius | 2.0 |
Config.Obstacles.damagePerHit | 350 |
Config.Obstacles.pickupRadius | 5.0 |
Config.Obstacles.useTarget | true |
Config.Obstacles.highlight.key | 'H' |
Config.Obstacles.highlight.color | { r=255, g=200, b=0, a=255 } |
highlight.key is the default binding for the +landscaping_highlight keybind (rebindable from the FiveM keybinds menu). Holding it during an active yard with remaining obstacles outlines them in highlight.color; otherwise it shows yard waypoints.
Mowing Detection
| Setting | Default |
|---|---|
Config.Mowing.detectionRadius | 2.0 |
Config.Mowing.fadeSteps | 17 |
Config.Mowing.fadeStepInterval | 60 |
Config.Mowing.mowerCheckInterval | 100 |
fadeSteps is the number of alpha steps used when a cut patch fades out. fadeStepInterval is the delay in milliseconds between each step. mowerCheckInterval is the polling interval in milliseconds for mower-to-patch proximity checks.
Animations
Configured actions:
- unload mower
- load mower
- repair mower
- pick up obstacle
Animation labels are locale keys, not hardcoded strings.
Visual Settings
shared/config/visuals.lua
NPC
| Setting | Default |
|---|---|
Config.NpcModel | 's_m_y_construct_01' |
Config.NpcScenario | 'WORLD_HUMAN_CLIPBOARD' |
Office Blip
| Setting | Default |
|---|---|
Config.Blip.enabled | true |
Config.Blip.sprite | 616 |
Config.Blip.color | 2 |
Config.Blip.scale | 0.6 |
Config.Blip.label | blip.landscaping_office |
To hide office blips on the map entirely, turn off Show blip under NPCs & Blips → Depot blip in /landscaping settings (Config.Blip.enabled = false).
Yard Blip
| Setting | Default |
|---|---|
Config.YardBlip.sprite | 496 |
Config.YardBlip.color | 2 |
Config.YardBlip.scale | 0.7 |
Yard Marker
| Setting | Default |
|---|---|
Config.YardMarker.type | 25 |
Config.YardMarker.scale | vector3(2.0, 2.0, 0.5) |
Config.YardMarker.color | { r=50, g=200, b=50, a=120 } |
Config.YardMarker.approachDistance | 30.0 |
Config.YardMarker.interactDistance | 5.0 |
Floating Waypoints
| Setting | Default |
|---|---|
Config.Waypoints.enabled | true |
Config.Waypoints.heightOffset | 5.0 |
Config.Waypoints.updateInterval | 0 |
Config.Waypoints.scaleMin | 0.5 |
Config.Waypoints.scaleMax | 1.0 |
Config.Waypoints.scaleNearDist | 30.0 |
Config.Waypoints.scaleFarDist | 300.0 |
Config.Waypoints.color | { r=50, g=200, b=50 } |
Yard Editor
| Setting | Default |
|---|---|
Config.YardEditor.ghostAlpha | 150 |
Config.YardEditor.mouseSensitivity | 3.0 |
Config.YardEditor.headingSensitivity | 2.0 |
Config.YardEditor.zStep | 0.01 |
Config.YardEditor.raycastDistance | 100.0 |
Config.YardEditor.defaultSpeed | 0.5 |
Config.YardEditor.maxSpeed | 5.0 |
Config.YardEditor.minSpeed | 0.05 |
Config.YardEditor.speedStep | 0.25 |
Locations and Menu Camera
shared/config/locations.lua
This file holds two separate lists: Config.Locations (the offices players clock in at) and Config.Yards (the lawns they get sent to). Offices are database-managed like every other setting; yards stay in this file (see How Settings Work).
Config.Locations — offices
Each office entry includes:
| Field | Required | Description |
|---|---|---|
name | Yes | The office name, shown on the map blip and at the top of the shift menu |
coords | Yes | Where the manager NPC stands (vector3) |
heading | Yes | Which way the NPC faces, 0–360 |
vehicleSpawn | Yes | Where the van and mower appear (vector4 — position plus the direction the van points) |
menuCamera | No | The camera shot used by the NUI menu. Leave it out and the menu opens without a camera move |
menuCamera contains:
| Field | Description |
|---|---|
coords | Where the camera sits (vector3) |
heading | Which way the camera looks, 0–360 |
fov | How zoomed in it is — lower zooms in, higher shows more. 65 is the shipped value |
Config.Yards — lawns
Each yard entry includes:
| Field | Required | Description |
|---|---|---|
name | Yes | The yard name, shown on its map blip and in the pay summary |
coords | Yes | The yard's center point — the marker the player drives to and starts the job at (vector3) |
patches | Yes | The grass to be cut. Each entry is { coords = vector3(...), model = '...', heading = ... }. The number of patches decides the yard's size tier and its time limit |
obstacles | No | Junk to be cleared before the yard counts as done. Same shape as a patch: { coords, model, heading }. Driving the mower into one damages the engine |
Valid model names come from Config.GrassProps (patches) and Config.ObstacleProps (obstacles) in shared/config/mowing.lua.
Adding a Second Office
Config.Locations ships with one office, but it's a list — you can add as many as you like (up to 50), and each entry is a complete, independent depot with its own NPC, blip, and vehicle spawn.
What you need to know first
- Blips and NPCs appear on their own. The job creates a manager NPC and a map blip for every office in the list, when it starts and again each time you save the list. There's nothing else to register and nothing else to switch on.
- A shift belongs to the office the player clocked in at. The van spawns at that office's
vehicleSpawn, and the "return to the office" route at the end of a shift points back to it. - Worker slots are counted per office.
Config.MaxSlotsPerLocation(default 3) applies to each office separately, so two offices means six people can be on shift at once. - Offices can be changed while people are on shift. In
/landscaping settings(Locations & Yards, Depots) you can edit, reorder or delete offices while landscapers are working. A shift keeps its office as long as the office keeps either its name or its manager's spot (Clerk spot in the editor), and the slot counts carry over. If you delete an office (or change both its name and its manager's spot in the same save), the shifts there end straight away and are paid what a clock-out would pay, the pay summary is sent, and the players are told "Your location was removed, so your shift has ended." - Yards are shared between all offices. This is the important one.
Config.Yardsis a single pool for the whole server — yards are not attached to an office. Whichever office a player clocks in at, they're assigned yards drawn at random from that same pool. - A yard can only be worked by one player (or one crew) at a time. So adding offices without adding yards means more workers competing for the same lawns. If everything is taken, players are told no yards are available. Plan on roughly enough yards to cover every worker slot across all your offices, times the biggest round a level 5 worker gets (6 yards).
- Progression is shared. A player's level, yard count, and streak follow their character, not the office.
Adding one
Offices are stored in the database (see How Settings Work), so you add them in-game, not in shared/config/locations.lua:
-
Run
/landscaping settingsand open Locations & Yards. -
Under Depots, press Add. A new, empty office opens.
-
Fill in its four fields. All of them are required:
Menu field In the config file What it is Name nameThe office name, shown on its map blip and in the shift menu Clerk spot coordsWhere the manager NPC stands Facing headingWhich way the NPC faces, 0–360Van spawn vehicleSpawnWhere the van and mower appear, plus the direction the van points -
Set Clerk spot and Van spawn with the Place in world button (the crosshair) instead of typing numbers. The menu hides, you pick the spot in the world with a preview of the manager or the van, and the menu comes back with the spot filled in. Placing the manager also sets Facing. Teleport here takes you to a spot that's already set. If the button says it needs an updated
o-link, updateo-linkor type the numbers in. -
Press Save Changes.
The new office is live as soon as you save: its manager and blip appear and players can clock in there, with no restart. Shifts already running carry on at their own offices.
The menu has no field for the shift menu's camera shot (menuCamera), so a new office opens the shift menu without a camera move. Editing an office in the menu keeps the camera it already has.
Using the config file instead
shared/config/locations.lua only holds the factory default office list. Adding an office there changes nothing on a server that has already started, even after a restart. If you'd rather work in the file (for example to give an office a menuCamera):
- Put every office you want into
Config.Locations, in the shape below, and restart the resource. - In
/landscaping settings→ Locations & Yards, press Reset to default on Depots.
Reset to default replaces the whole office list with the file's. Any office you added or changed in the menu but didn't also put in the file is gone, and shifts at an office that disappears end as described above.
Config.Locations = {
{
-- ... the existing The Mighty Bush entry, leave it alone ...
},
{
name = 'Sandy Shores Grounds Crew',
coords = vector3(1687.44, 3600.12, 35.62),
heading = 210.0,
vehicleSpawn = vector4(1681.90, 3593.55, 35.30, 120.0),
menuCamera = {
coords = vector3(1694.00, 3607.00, 40.00),
heading = 190.0,
fov = 65.0,
},
},
}After the reset you should see a second blip on your map and a second manager standing at the new spot.
To gather coordinates for the file, the in-game builder commands also work: /mowerlocation <name> records the office where you're standing, and /mowervehicle records the van spawn. Both are admin-only, and /mowerexport writes the result to exported_locations.lua. The export leaves out menuCamera, so add it back by hand for any office that should keep its camera. See the Admin Commands Reference and the Yard Building Guide.
Adding yards to go with it
Because the yard pool is shared, adding an office near a new part of the map doesn't automatically give players work nearby — they'll still be sent to whichever yards are free, anywhere on the map. If you want workers at a new office to stay local, build new yards in that area and add them to Config.Yards. The Yard Building Guide walks through the in-game yard editor step by step.
Model Compatibility
shared/config/models.lua
Every model this job spawns is checked before it is requested. A model that doesn't exist on a player's game build (older builds lack newer DLC props) is skipped instantly with a warning naming it, instead of freezing the load and rendering nothing. Nothing is substituted automatically — you choose the replacement.
| Setting | Default | Description |
|---|---|---|
Config.ModelSwaps | {} | List of { from = '...', to = '...' } rows. Replaces a prop, ped or vehicle model everywhere this job uses it |
Config.ModelSwaps = {
{ from = 'm25_1_prop_m51_dog_bowl_full', to = 'prop_cs_bowl_01' },
}On a running install, add rows under Compatibility in /landscaping settings. This is the only way to change the grass and obstacle models inside existing yards, because those are built with /moweryard rather than edited in the menu. Saving a swap rebuilds standing yard grass and obstacles live.
When a player reports a missing model, the server logs it and notifies online admins once per model, pointing them at /landscaping settings. The warnings are capped per player and in total, so one misbehaving client can't flood admins or fill the log.
Uniforms
shared/config/outfits.lua
| Setting | Default | Description |
|---|---|---|
Config.uniformsEnabled | false | Enables the uniform toggle in the menu and the server uniform callbacks |
The file also defines:
Config.LandscapingOutfitMaleConfig.LandscapingOutfitFemale
These outfits are applied through olink.clothing.
Tutorials
shared/config/tutorials.lua
Config.Tutorials defines the one-time onboarding hints shown the first time a player encounters a given situation. Each entry is keyed by an event id and contains:
icon— Font Awesome classtitle— locale keybody— locale keyduration— optional seconds (default applied by the tutorial module)position— optional screen position (top-right,top-left,bottom-right,bottom-left,center-top,center,center-bottom)
With Oxide HUD, every hint left at the default position (top right) appears where each player puts the tutorial hints in the /hud editor. A hint you give another position keeps that position.
Shipped events: first_clockin, first_mower_unload, first_blades_lowered, first_obstacle, first_yard_complete, first_timer_expired, first_vehicle_damage, first_mower_damaged, first_level_up, first_crew.
Players can toggle tutorials on/off with /landscapingtutorials (or /landscaping tutorials) and re-show all tutorials with /landscapingtutorialreset (or /landscaping tutorialreset).
You can edit the cards in /landscaping settings → Tutorials (Advanced view), but not remove one there. To remove an event entirely, delete its entry from Config.Tutorials, restart the resource, then press Reset to default on Tutorial cards. That replaces every card with the file's version, so card edits made in the menu are lost.
Notes on Builder Exports
The in-game yard builder writes its output to exported_locations.lua in the resource folder. The game does not read that file directly — the live yards always come from shared/config/locations.lua.
After exporting, copy the contents of exported_locations.lua into shared/config/locations.lua and restart the resource. See the Yard Building Guide for the full walkthrough.
That restart makes the yards live, but not the offices. The export also holds the office list (Config.Locations), and offices are stored in the database, so the pasted list only becomes the new factory default. To use it, press Reset to default on Depots in /landscaping settings, which replaces the whole office list. Or skip the file and add offices in the menu (see Adding a Second Office).