Configuration Reference
Current configuration map and defaults for oxide-animalcontroljob, including job flow, progression, animal behavior, visuals, and o-link-dependent settings.
Reference for the current oxide-animalcontroljob config layout.
Config File Map
| File | Purpose |
|---|---|
shared/config.lua | Core toggles, menu mode, summary mode, enums |
shared/config/job.lua | Crew, payment, complaints, timer, and call settings |
shared/config/levels.lua | Level thresholds and rewards |
shared/config/locations.lua | Office locations and shelter delivery point |
shared/config/events.lua | Dispatch event list |
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) |
General Settings
File: shared/config.lua
| Setting | Type | Default | Description |
|---|---|---|---|
Config.Debug | boolean | false | Enables debug logging |
Config.usePhone | boolean | true | Sends service messages through o-link.phone instead of notification-only flow |
Config.shiftSummary | string | 'text' | 'nui' for popup summary when menu mode is not 'menu', 'text' for phone or toast summary |
Config.menuStyle | string | 'nui' | 'nui' for the Vue menu, 'menu' for olink.menu |
Config.MaxSlotsPerLocation | number | 3 | Max concurrent shifts at an office |
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 | Crew size limit |
Config.Crew.inviteTimeout | 60 | Crew invite expiry in seconds |
Config.Crew.coopBonusPercent | 0.15 | Co-op bonus added to completed jobs |
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 |
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 as the sender name on the job's phone emails. 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
Every office in the list is treated the same way, so adding one is a copy-paste job:
Open shared/config/locations.lua in a plain text editor (Notepad++, VS Code — anything that isn't a word processor).
Copy the existing entry — everything from one { to its matching }, — and paste it directly below, still inside Config.Locations = { ... }.
Change name, coords, heading, and vehicleSpawn on the new copy to your second office. The easiest way to get accurate coordinates is the in-game builder (/animalcontrolbuilder) — see the Admin Guide. It writes a ready-made Config.Locations block you can paste straight into this file.
Either adjust menuCamera for the new spot or delete those lines from the copy — a camera aimed at the old office looks wrong at the new one.
Save the file and restart the resource (or the server).
The new office 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.
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.
| 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 55 events. Dispatch groups events by shared scene coordinates to reduce repeated locations back-to-back.
Event count by type
| Job Type | Events |
|---|---|
| Aggressive Animal | 13 |
| 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).
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_pistol' | Inventory item name for ammo — change this to match your inventory (QBCore: 'pistol_ammo', ox_inventory on ESX/QBX: 'ammo-9') |
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 ammo pack (deducted from shift pay) |
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 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.AnimalLoading.loadDuration | 5000 | Loading progress bar duration in ms |
Config.AnimalLoading.unloadDuration | 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
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 / 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
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.