Configuration Reference
How settings work in oxide-animalcontroljob (the /animalcontrol settings editor and factory defaults), plus every setting and its default — job flow, progression, animals, the tranquilizer, visuals, and model compatibility.
Reference for the current oxide-animalcontroljob config layout.
How Settings Work
Settings are edited in-game with the /animalcontrol settings command (admins only). Changes save to your database and apply instantly — no restart needed.
The config files in the shared/ folder are factory defaults. The first time the resource starts, every value is imported from the files into the database; from then on, the database is the source of truth and editing a file does not change a setting that is already stored, even after a restart. Only brand-new settings added by a future update are imported from the files automatically.
The job still reads the files as its factory defaults at every start, and Reset to default on a setting in /animalcontrol settings replaces the stored value with that default. So a file edit takes effect only after a restart and pressing Reset to default on that setting.
This applies to everything — including office locations, the shelter delivery point, and the event list. Once the resource has started even once, change settings on a running install with /animalcontrol settings.
Three settings are never copied into the database, so they are always read from the files: Config.UseHudAccent in shared/config.lua, and Config.ModelHints and Config.SettingsCommand in shared/config/models.lua, which only set the wording of missing-model warnings.
Other resources can read and change these settings too, 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, menu mode, summary mode, enums |
shared/config/job.lua | Crew, payment, complaints, timer, call settings |
shared/config/levels.lua | Level thresholds and rewards |
shared/config/locations.lua | Office locations and shelter delivery point |
shared/config/events.lua | Event list used by dispatch |
shared/config/vehicles.lua | Animal control truck settings |
shared/config/animals.lua | Animal models, tranquilizer, stealth, per-type behavior, loading |
shared/config/props.lua | Bait, deceased bag, and animation settings |
shared/config/visuals.lua | NPCs, blips, reporting NPC, safety zones, waypoints |
shared/config/tutorials.lua | Tutorial definitions |
shared/config/outfits.lua | Optional on-duty uniform (off by default) |
shared/config/models.lua | Model replacements for game builds that lack a model |
General Settings
File: shared/config.lua
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Debug | boolean | false | Enables debug logging |
Config.usePhone | boolean | true | Sends shift messages (welcome, incidents and, with Config.shiftSummary = 'text', the pay summary) to the player's phone, and makes the phone ring for each incoming call (crew leader only; the call is still accepted or declined on screen). Messages arrive as texts on phones that support them and as mail on the rest. Texts and the call ring need o-link 1.11.0 or newer; with an older o-link every message arrives as mail and the phone doesn't ring. When false nothing is sent to the phone; the on-screen notifications still show |
Config.shiftSummary | string | 'text' | 'nui' for a popup summary on clock-out (with either menu style), 'text' to send the full pay summary to the phone (or a net-pay notification when Config.usePhone = false). With 'nui', a shift that ends any other way (going down, missed calls, the complaint limit, a destroyed truck, a removed office, a restart) still sends the 'text' summary. A shift that ends on a disconnect or logout sends no summary |
Config.menuStyle | string | 'nui' | 'nui' for the Vue menu, 'menu' for olink.menu |
Config.UseHudAccent | boolean | true | The tutorial prompts use your server's accent colour from Oxide HUD, set in Oxide HUD's Config.Theme. false keeps the job's own colours. The job timer, hint and call card keep their own colours either way. Without Oxide HUD, or with no accent set there, nothing changes. Config file only: it is not in /animalcontrol settings, so change it in the file and restart |
Config.MaxSlotsPerLocation | number | 3 | Max concurrent shifts at an office |
See Phone Integration for the phone messages the job sends and which phones get texts or mail.
Enums
ShiftState
idlewaitingon_callworking
JobType
aggressive_animalstray_capturewildlife_removaldeceased_pickup
Job Settings
File: shared/config/job.lua
Crew
| Setting | Default | Description |
|---|---|---|
Config.Crew.maxSize | 2 | 1 for solo-only shifts; 2 to allow a partner. Crews are pairs, so saved values above 2 are lowered to 2 |
Config.Crew.inviteTimeout | 60 | Crew invite expiry in seconds |
Config.Crew.coopBonusPercent | 0.15 | Co-op bonus added to completed jobs, as a share of each crew member's own pay |
Payment
| Setting | Default | Description |
|---|---|---|
Config.Payment.distanceBonusPerUnit | 0.30 | Distance bonus multiplier |
Config.Payment.speedBonusAmount | 25 | Bonus when finishing before timer expiry |
Config.Payment.vehicleDestroyFine | 200 | Cash fine when the truck is destroyed |
Config.Payment.streakBonusPerDay | 10 | Daily streak bonus amount |
Config.Payment.maxStreakDays | 7 | Daily streak cap |
Config.Payment.gasFeePercent | 0.05 | Gross-pay gas deduction |
Config.Payment.taxPercent | 0.10 | Gross-pay tax deduction |
Config.Payment.payoutAccount | 'bank' | Account net shift pay is deposited to ('bank', 'cash', 'dirty', etc.) |
Config.Payment.fineAccount | 'cash' | Account vehicle-destroy and animal-kill fines are taken from |
Base pay by job type
Config.Payment.basePay = {
[JobType.AGGRESSIVE_ANIMAL] = 85,
[JobType.STRAY_CAPTURE] = 70,
[JobType.WILDLIFE_REMOVAL] = 110,
[JobType.DECEASED_PICKUP] = 55,
}Complaints
| Setting | Default | Description |
|---|---|---|
Config.Complaints.maxComplaints | 3 | Complaints before timeout |
Config.Complaints.timeoutMinutes | 30 | Timeout duration |
Config.Complaints.animalEscapePenalty | 1 | Complaints added on animal escape |
Config.Complaints.animalKillPenalty | 1 | Complaints added on animal kill |
Config.Complaints.animalKillFine | 150 | Cash fine on animal kill |
Config.Complaints.vehicleDestroyPenalty | 1 | Complaints added on vehicle destruction |
Config.Complaints.deathPenalty | 1 | Complaints added on death or down |
Config.Complaints.decayPerJob | 1 | Complaints removed per completed job |
Timer
| Setting | Default | Description |
|---|---|---|
Config.Timer.baseTime | 90 | Base mission time in seconds |
Config.Timer.timePerDistanceUnit | 0.20 | Added seconds per unit from call acceptance to event |
Config.Timer.expiredPenalty | 0.85 | Pay multiplier for late completion |
Current timer formula:
timeLimit = Config.Timer.baseTime + math.floor(distance * Config.Timer.timePerDistanceUnit)Calls
| Setting | Default | Description |
|---|---|---|
Config.Calls.minIntervalSeconds | 15 | Minimum delay between dispatches |
Config.Calls.maxIntervalSeconds | 45 | Maximum delay between dispatches |
Config.Calls.responseTimeSeconds | 30 | Accept or decline window |
Config.Calls.maxMissedCalls | 3 | Misses or declines before auto clock-out |
Config.Calls.cancelCooldownSeconds | 60 | Wait before the next call is dispatched after a player cancels the call they were working on. 0 = no extra wait |
Config.Calls.maxTravelSpeed | 50.0 | Fastest believable trip in the editor, in metres per second along a straight line (10 to 200). A crew that reaches the scene faster than this from where they accepted the call gets no distance bonus and no speed bonus for that call. The trip is counted to 80 metres from the scene, so only a teleport gets there that fast. Raise it if your server has very fast vehicles |
The cancel cooldown is a floor, not an extra delay on top: after a cancel, the next call arrives once both the normal 15–45 second gap and the cooldown have passed. Raise it if you want cancelling a call to cost the player some time; set it to 0 if you'd rather they get back to work immediately. See Cancelling a Call in the feature guide for what cancelling does.
Levels
File: shared/config/levels.lua
Each level entry defines:
titlerequiredJobspayMultipliertipChancetipRange
Default progression is 5 levels from Volunteer through Chief Officer.
Locations
File: shared/config/locations.lua
Shelter delivery point
Config.ShelterDeliveryPoint = vector3(-1139.70, -319.82, 37.67)This is used for all live animal transport jobs that require shelter delivery.
Office fields
Config.Locations is the list of animal control offices. The resource ships with 1, but each entry is a complete, independent office — its own dispatcher NPC, map blip, truck spawn, and worker slots.
Each entry contains:
| Field | Type | Required | What it does |
|---|---|---|---|
name | string | Yes | The office name. It shows on the map blip, in the shift menu header, and in the sender name of the job's phone messages ("Animal Control - " followed by the office name). Ships as a translation key ('location.animal_control_office', defined in locales/en.json and locales/bs.json) — a key that isn't in the locale files is shown exactly as typed, so plain text like 'Sandy Shores Animal Control' also works |
coords | vector3 | Yes | Where the dispatcher NPC stands. Players walk up to this spot to clock in and out |
heading | number | Yes | Which way the dispatcher faces, in degrees (0–360) |
vehicleSpawn | vec4 | Yes | Where the animal control truck appears at clock-in — x, y, z and the direction it faces. Pick a clear patch of road or lot; if a car is parked on it, the clock-in fails |
menuCamera | table | No | The cinematic camera shot behind the full shift menu: coords (where the camera sits), heading (which way it looks), rotation (pitch, roll, and a heading offset), and fov (zoom — lower is more zoomed in). Leave it out entirely and the menu still works, just without the camera move |
Adding a second office
Config.Locations is database-managed like every other setting (see How Settings Work), so on a running install you add and edit offices in-game with /animalcontrol settings (admins only), under Locations & Events → Offices, not by hand-editing the file. Place in world on the clerk spot and the truck spawn lets you set each one by standing where you want it, instead of typing coordinates. Changes save to the database and apply live.
The in-game builder (/animalcontrolbuilder) can also capture the coordinates for a new office — its dispatcher spot, heading, truck spawn and menu camera — see the Admin Guide. Use those coordinates when you add the office through /animalcontrol settings. The menu has no fields for the menu camera (it keeps an existing office's camera untouched), so an office added there opens the shift menu without the camera move.
Editing shared/config/locations.lua directly only changes the factory default. Before the resource's very first boot, the file is what gets imported into the database. After that, restarting alone does not add an office pasted into the file: it appears only after a restart and pressing Reset to default on Offices in /animalcontrol settings. That replaces the whole stored office list with the file's list, so any office you added or changed in the menu and didn't also put in the file is lost.
Each office you add appears on its own, automatically: its dispatcher NPC spawns, its map blip is drawn, and it gets its own set of worker slots (Config.MaxSlotsPerLocation, 3 by default — so two offices means six workers total, three at each).
A shift belongs to the office the player clocked in at: that's where their truck spawns and which office's slot they take up.
You can edit, reorder or delete offices while officers are on shift. A shift keeps its office as long as the office keeps either its name or its dispatcher spot, and slot counts carry over. If you delete an office (or change its name and its dispatcher spot in the same save), the shifts there end straight away and are paid, and the players are told "Your office was removed, so your shift has ended."
Calls are shared, not per office. Config.Events (see below) is one global list of animal reports, and dispatch picks from all of it no matter which office a player clocked in at. A second office does not need its own event list and there is no way to tie an event to a specific office. What you may want instead is a few extra entries in Config.Events near the new office, so its workers aren't always driving across the map — pay and the job timer both scale with distance, so far-away calls aren't unfair, just slow.
Drop-offs are shared too: Config.ShelterDeliveryPoint is a single shelter for the whole job, so workers from every office deliver captured animals to the same place.
Events
File: shared/config/events.lua
Each event defines a dispatchable animal report. Current fields are:
| Field | Description |
|---|---|
type | One of the JobType values |
label | Locale key for the job label |
animalModel | GTA animal model name |
coords | Event spawn position and heading |
reportingNpc | Whether to spawn a reporting civilian NPC |
requiresDelivery | Whether the animal must be delivered to the shelter |
animalWaypoints | (Wildlife removal only) Array of patrol waypoints |
The default package contains 54 events across 34 locations. Dispatch groups events by shared scene coordinates to reduce repeated locations back-to-back.
On a running install, add, move or remove events in /animalcontrol settings (under Locations & Events), which also lets you place a scene in the world. Dispatch skips any event with no animal, an invalid call type or a (0, 0, 0) location, and logs a console warning; the settings editor won't save such events.
Event count by type
| Job Type | Events |
|---|---|
| Aggressive Animal | 12 |
| Stray Capture | 15 |
| Wildlife Removal | 5 |
| Deceased Pickup | 22 |
Vehicle
File: shared/config/vehicles.lua
| Setting | Default | Description |
|---|---|---|
Config.Vehicle.model | 'kennel' | Animal control truck model |
Config.Vehicle.healthCheckInterval | 1000 | How often (in milliseconds) the truck's condition is checked |
Config.Vehicle.destroyedThreshold | 150 | If the truck's engine health drops below this, the truck counts as destroyed |
Config.Vehicle.damageChargeRate | 0.50 | Money charged per point of body damage below the threshold at clock-out |
Config.Vehicle.damageChargeThreshold | 950 | If the truck's body health is below this at clock-out, a damage charge applies |
Config.Vehicle.livery | -1 | Optional livery index for models that ship multiple liveries (-1 = model default) |
Config.Vehicle.extras | nil | Optional { [extraId] = enabled } map to force-toggle vehicle extras (decals, replacement-model parts). nil applies none |
Animals
File: shared/config/animals.lua
Animal models
Config.Animals maps model names to display name and health values. The default package includes 14 animal models (dogs, cats, coyote, mountain lion, panther, deer).
Each entry has a name (shown to players) and health, and can carry an optional label, shown only in the event builder's picker so near-identical models (for example two Rottweilers) are easy to tell apart.
Tranquilizer
| Setting | Default | Description |
|---|---|---|
Config.Tranquilizer.weaponName | 'WEAPON_G2' | Weapon hash for the dart gun |
Config.Tranquilizer.weaponItem | 'weapon_g2' | Inventory item name for the tranq gun |
Config.Tranquilizer.ammoItem | 'ammo_dart' | Dedicated dart item; register it using the Installation Guide |
Config.Tranquilizer.playerEffects | false | Allow on-shift officers to tranquilize other players without health damage |
Config.Tranquilizer.ammoPerCall | 5 | Darts in each ammo pack (one free pack is handed out at clock-in) |
Config.Tranquilizer.sedationDuration | 30000 | Sedation duration in ms |
Config.Tranquilizer.ammoResupplyCost | 50 | Cost per additional pack, reserved from earned shift pay before issue |
Config.Tranquilizer.maxAmmoResupplies | 5 | Max additional packs per shift (first pack at clock-in is free) |
Stealth detection
| Setting | Default | Description |
|---|---|---|
Config.Stealth.useNativeStealth | true | Use native crouch detection |
Config.Stealth.fallbackSpookChance | 0.35 | Spook chance when not using native stealth |
Config.Stealth.fallbackSafeChance | 0.70 | Safe chance when using fallback mode |
Animal behavior
Per-job-type behavior settings live in Config.AnimalBehavior. Each job type defines:
- task type
- detection and escape radii
- spook and flee distances
- wander behavior
- NPC reaction radii
Animal loading
| Setting | Default | Description |
|---|---|---|
Config.LoadAnimation.duration | 5000 | Loading progress bar duration in ms |
Config.UnloadAnimation.duration | 4000 | Unloading progress bar duration in ms |
Config.AnimalLoading.loadRange | 3.0 | Max distance from animal to begin loading |
Config.AnimalLoading.shelterRange | 15.0 | Max distance from shelter to unload |
Config.AnimalLoading.vehicleAttachOffset | vec3(0.0, -1.5, 0.5) | Offset inside the vehicle cargo area where the loaded animal attaches |
Config.AnimalLoading.vehicleAttachRotation | vec3(0.0, 0.0, 0.0) | Rotation applied to the loaded animal at the attach offset |
Props
File: shared/config/props.lua
This file controls:
- bait prop model and placement range
- bait scent particle effect
- bait player attachment offsets
- deceased bag model and durations
- deceased bag carry animation
- capture, bait placement, load, and unload progress bar animations
Primary props:
bait(dog bowl)deceasedBag(bin bag)
Visuals
File: shared/config/visuals.lua
NPC and blips
Config.NpcModelConfig.NpcScenarioConfig.BlipConfig.EventBlipConfig.DeliveryBlip
Each office's map blip is labelled with that office's name; Config.Blip sets whether it shows (enabled) and its sprite, colour and scale.
Reporting NPC models
Config.ReportingNpcModels contains 16 possible civilian models for the person who reported the animal incident.
Reporting NPC behavior
Config.ReportingNPC controls:
- stand offset from animal
- animation cycle (beckoning, frightened, hand gestures)
- thank-you animation
- far-away scenario
- animation distance threshold
Safety zones
Config.SafetyZone controls:
- whether safety zones run (
enabled) - the slow-traffic rings around active job scenes (
speedZones— each entry sets a radius and a speed)
Waypoints
Config.Waypoints controls marker height, scaling, and render timing.
Outfits
File: shared/config/outfits.lua
Optional on-duty uniform applied through o-link.clothing when the player clocks in and reverted on clock-out / death / logout / disconnect.
| Setting | Default | Description |
|---|---|---|
Config.uniformsEnabled | false | Master switch — leave false to disable the uniform feature entirely |
Config.AnimalControlOutfitMale | { components, props } | Component/prop drawable + texture IDs applied to male peds |
Config.AnimalControlOutfitFemale | { components, props } | Component/prop drawable + texture IDs applied to female peds |
The default values are placeholders (drawable = 0, texture = 0) — replace them with valid IDs from your clothing pack before enabling. The previous appearance is snapshotted on apply and restored on revert via o-link.clothing.SetAppearance / o-link.clothing.Revert.
Tutorials
File: shared/config/tutorials.lua
Config.Tutorials contains 16 first-time guidance prompts. Each entry defines:
icontitlebodypositionduration
With Oxide HUD, every prompt left at the default position (top right) appears where each player puts the tutorial prompts in the /hud editor. A prompt you give another position keeps that position. first_incoming_call ships at bottom right, clear of the call card, so it keeps that spot.
Model Compatibility
File: 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. Nothing is substituted automatically — you choose the replacement.
| Setting | Default | Description |
|---|---|---|
Config.ModelSwaps | {} | List of { from = '...', to = '...' } rows. Replaces a model everywhere this job uses it, including models inside event rows that have no field of their own |
Config.ModelSwaps = {
{ from = 'm25_1_prop_m51_dog_bowl_full', to = 'prop_cs_bowl_01' },
}On a running install, add rows under Compatibility in /animalcontrol settings.
When a player reports a missing model, the server logs it and notifies online admins once per model, pointing them at /animalcontrol settings. The warnings are capped per player and in total, so one misbehaving client can't flood admins or fill the log. Two models get a clearer message because a missing copy is an install problem, not a game-build one: the dart gun WEAPON_G2 ships in this resource's stream/ folder, and the kennel truck is a separate add-on (see Installation).
Server Rate Limits
The server has built-in protection against spammed actions (clocking in/out, accepting calls, capturing animals, and so on). Each action has a short cooldown so a player — or a cheat tool — can't fire it repeatedly. These limits are hard-coded in server/main.lua and don't need any configuration. If a player triggers one by clicking too fast, they simply get a "slow down" message.
Next Steps
Installation Guide
Step-by-step guide to install oxide-animalcontroljob with o-link, unified progression, and the current configuration layout.
Feature Guide
Current gameplay flow and system behavior for oxide-animalcontroljob, including dispatch, animal handling, crews, progression, payouts, and phone messages.