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

FilePurpose
shared/config.luaCore toggles, menu mode, summary mode, enums
shared/config/job.luaCrew, payment, complaints, timer, call settings
shared/config/levels.luaLevel thresholds and rewards
shared/config/locations.luaOffice locations and shelter delivery point
shared/config/events.luaEvent list used by dispatch
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)
shared/config/models.luaModel replacements for game builds that lack a model

General Settings

File: shared/config.lua

SettingTypeDefaultDescription
Config.DebugbooleanfalseEnables debug logging
Config.usePhonebooleantrueSends 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.shiftSummarystring'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.menuStylestring'nui''nui' for the Vue menu, 'menu' for olink.menu
Config.UseHudAccentbooleantrueThe 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.MaxSlotsPerLocationnumber3Max concurrent shifts at an office

See Phone Integration for the phone messages the job sends and which phones get texts or mail.

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.maxSize21 for solo-only shifts; 2 to allow a partner. Crews are pairs, so saved values above 2 are lowered to 2
Config.Crew.inviteTimeout60Crew invite expiry in seconds
Config.Crew.coopBonusPercent0.15Co-op bonus added to completed jobs, as a share of each crew member's own pay

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
Config.Calls.maxTravelSpeed50.0Fastest 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:

  • 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 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
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

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:

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 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 TypeEvents
Aggressive Animal12
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).

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

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_dart'Dedicated dart item; register it using the Installation Guide
Config.Tranquilizer.playerEffectsfalseAllow on-shift officers to tranquilize other players without health damage
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 pack, reserved from earned shift pay before issue
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-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

SettingDefaultDescription
Config.LoadAnimation.duration5000Loading progress bar duration in ms
Config.UnloadAnimation.duration4000Unloading 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

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.

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

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.

SettingDefaultDescription
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