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

FilePurpose
shared/config.luaCore toggles, menu mode, summary mode, enums
shared/config/job.luaCrew, payment, complaints, timer, and call settings
shared/config/levels.luaLevel thresholds and rewards
shared/config/locations.luaOffice locations and shelter delivery point
shared/config/events.luaDispatch event list
shared/config/vehicles.luaAnimal control truck settings
shared/config/animals.luaAnimal models, tranquilizer, stealth, per-type behavior, loading
shared/config/props.luaBait, deceased bag, and animation settings
shared/config/visuals.luaNPCs, blips, reporting NPC, safety zones, waypoints
shared/config/tutorials.luaTutorial definitions
shared/config/outfits.luaOptional on-duty uniform (off by default)

General Settings

File: shared/config.lua

SettingTypeDefaultDescription
Config.DebugbooleanfalseEnables debug logging
Config.usePhonebooleantrueSends service messages through o-link.phone instead of notification-only flow
Config.shiftSummarystring'text''nui' for popup summary when menu mode is not 'menu', 'text' for phone or toast summary
Config.menuStylestring'nui''nui' for the Vue menu, 'menu' for olink.menu
Config.MaxSlotsPerLocationnumber3Max concurrent shifts at an office

Enums

ShiftState

  • idle
  • waiting
  • on_call
  • working

JobType

  • aggressive_animal
  • stray_capture
  • wildlife_removal
  • deceased_pickup

Job Settings

File: shared/config/job.lua

Crew

SettingDefaultDescription
Config.Crew.maxSize2Crew size limit
Config.Crew.inviteTimeout60Crew invite expiry in seconds
Config.Crew.coopBonusPercent0.15Co-op bonus added to completed jobs

Payment

SettingDefaultDescription
Config.Payment.distanceBonusPerUnit0.30Distance bonus multiplier
Config.Payment.speedBonusAmount25Bonus when finishing before timer expiry
Config.Payment.vehicleDestroyFine200Cash fine when the truck is destroyed
Config.Payment.streakBonusPerDay10Daily streak bonus amount
Config.Payment.maxStreakDays7Daily streak cap
Config.Payment.gasFeePercent0.05Gross-pay gas deduction
Config.Payment.taxPercent0.10Gross-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

SettingDefaultDescription
Config.Complaints.maxComplaints3Complaints before timeout
Config.Complaints.timeoutMinutes30Timeout duration
Config.Complaints.animalEscapePenalty1Complaints added on animal escape
Config.Complaints.animalKillPenalty1Complaints added on animal kill
Config.Complaints.animalKillFine150Cash fine on animal kill
Config.Complaints.vehicleDestroyPenalty1Complaints added on vehicle destruction
Config.Complaints.deathPenalty1Complaints added on death or down
Config.Complaints.decayPerJob1Complaints removed per completed job

Timer

SettingDefaultDescription
Config.Timer.baseTime90Base mission time in seconds
Config.Timer.timePerDistanceUnit0.20Added seconds per unit from call acceptance to event
Config.Timer.expiredPenalty0.85Pay multiplier for late completion

Current timer formula:

timeLimit = Config.Timer.baseTime + math.floor(distance * Config.Timer.timePerDistanceUnit)

Calls

SettingDefaultDescription
Config.Calls.minIntervalSeconds15Minimum delay between dispatches
Config.Calls.maxIntervalSeconds45Maximum delay between dispatches
Config.Calls.responseTimeSeconds30Accept or decline window
Config.Calls.maxMissedCalls3Misses or declines before auto clock-out
Config.Calls.cancelCooldownSeconds60Wait 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:

  • title
  • requiredJobs
  • payMultiplier
  • tipChance
  • tipRange

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:

FieldTypeRequiredWhat it does
namestringYesThe 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
coordsvector3YesWhere the dispatcher NPC stands. Players walk up to this spot to clock in and out
headingnumberYesWhich way the dispatcher faces, in degrees (0–360)
vehicleSpawnvec4YesWhere 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
menuCameratableNoThe 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.

FieldDescription
typeOne of the JobType values
labelLocale key for the job label
animalModelGTA animal model name
coordsEvent spawn position and heading
reportingNpcWhether to spawn a reporting civilian NPC
requiresDeliveryWhether 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 TypeEvents
Aggressive Animal13
Stray Capture15
Wildlife Removal5
Deceased Pickup22

Vehicle

File: shared/config/vehicles.lua

SettingDefaultDescription
Config.Vehicle.model'kennel'Animal control truck model
Config.Vehicle.healthCheckInterval1000How often (in milliseconds) the truck's condition is checked
Config.Vehicle.destroyedThreshold150If the truck's engine health drops below this, the truck counts as destroyed
Config.Vehicle.damageChargeRate0.50Money charged per point of body damage below the threshold at clock-out
Config.Vehicle.damageChargeThreshold950If the truck's body health is below this at clock-out, a damage charge applies
Config.Vehicle.livery-1Optional livery index for models that ship multiple liveries (-1 = model default)
Config.Vehicle.extrasnilOptional { [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

SettingDefaultDescription
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.ammoPerCall5Darts in each ammo pack (one free pack is handed out at clock-in)
Config.Tranquilizer.sedationDuration30000Sedation duration in ms
Config.Tranquilizer.ammoResupplyCost50Cost per additional ammo pack (deducted from shift pay)
Config.Tranquilizer.maxAmmoResupplies5Max additional packs per shift (first pack at clock-in is free)

Stealth detection

SettingDefaultDescription
Config.Stealth.useNativeStealthtrueUse native crouch detection
Config.Stealth.fallbackSpookChance0.35Spook chance when not using native stealth
Config.Stealth.fallbackSafeChance0.70Safe 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

SettingDefaultDescription
Config.AnimalLoading.loadDuration5000Loading progress bar duration in ms
Config.AnimalLoading.unloadDuration4000Unloading progress bar duration in ms
Config.AnimalLoading.loadRange3.0Max distance from animal to begin loading
Config.AnimalLoading.shelterRange15.0Max distance from shelter to unload
Config.AnimalLoading.vehicleAttachOffsetvec3(0.0, -1.5, 0.5)Offset inside the vehicle cargo area where the loaded animal attaches
Config.AnimalLoading.vehicleAttachRotationvec3(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.NpcModel
  • Config.NpcScenario
  • Config.Blip
  • Config.EventBlip
  • Config.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.

SettingDefaultDescription
Config.uniformsEnabledfalseMaster 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:

  • icon
  • title
  • body
  • position
  • duration

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