Installation Guide
Step-by-step setup for oxide-pestcontroljob — required resources, server.cfg load order, the database, verification, phone messages, Oxide HUD, uniforms, admin permission and translations.
Step-by-step setup for oxide-pestcontroljob. Follow the steps in order. Each one says what you should see when it worked.
Prerequisites
Required resources
A dependency is another resource that must be installed and running on your server for this one to work. This job needs three:
| Resource | Minimum Version | Purpose |
|---|---|---|
ox_lib | Any current release | Translations (locale) and timers |
oxmysql | Any current release | Talks to your database |
o-link | 1.11.0 or newer | The bridge that lets this job work with your framework, phone, target system, vehicle keys and more |
Most servers already run ox_lib and oxmysql, because the frameworks need them too. If you don't have o-link yet, download it, place it in your resources folder and start it as shown in Load Order.
The Oxide HUD card placement needs o-link 1.12.1 or newer. With an older o-link, the cards use the job's own positions. See On-screen cards and Oxide HUD.
Supported frameworks
| Framework | Support |
|---|---|
| QBCore | Full |
| Qbox | Full |
| ESX | Full |
You don't pick your framework anywhere in this job. o-link detects it for you.
You don't need to create a job for it in your framework either. Any player can walk up to the depot clerk and clock in.
What o-link handles for this job
o-link connects the job to the resources your server already runs. Through it, the job uses your server's:
- character names and IDs
- notifications
- phone (for shift messages, optional)
- money (to pay the shift and charge the van fine)
- target system (the "interaction eye" you aim at the clerk and the van)
- progress bar (taking gear from the van, placing bait stations and glue traps, and filing the report)
- placement preview (where a bait station or glue trap will go, and the settings editor's Place in world buttons)
- menus (the confirmation when a player cancels a call, and the whole shift menu when Menu style is set to Context menu)
- input dialogs (typing a partner's server ID in the context menu)
- vehicle keys and fuel (for the company van)
- death and downed state
- clothing (only if you turn uniforms on)
The job adds no inventory items. The UV torch, sprayer, bait stations, glue traps, ladder and foam can are handed out at the van and taken back when the shift ends, so there is nothing to register in your inventory.
Installation Steps
Place the resource
Copy the oxide-pestcontroljob folder into your server's resources folder. If you keep your Oxide resources together, put it inside a folder named [oxide], for example resources/[oxide]/oxide-pestcontroljob.
Keep the folder name exactly oxide-pestcontroljob. Other resources look for the job by that name.
Make sure the whole folder came across, including stream/ (the custom props), web/dist/ (the menus and on-screen cards), locales/ and sql/.
Add it to your server.cfg
Your server.cfg is the text file that tells your server which resources to start, and in which order. Open it in a text editor and add this line in the Oxide section (see Load Order for where that is):
ensure oxide-pestcontroljobensure means "start this resource when the server starts". Save the file.
Database — nothing to do
The job keeps each character's level, streak and complaints in the job_progression table.
The job creates its own database tables the first time it starts, so there is no SQL script to run. (sql/install.sql is still included if you prefer to create the tables yourself or want to see the schema.)
The progression table below is shared by current Oxide job resources. It is only created if another Oxide job hasn't already created it:
CREATE TABLE IF NOT EXISTS `job_progression` (
`char_id` VARCHAR(60) NOT NULL,
`job` VARCHAR(40) NOT NULL,
`level` TINYINT NOT NULL DEFAULT 1,
`total_count` INT NOT NULL DEFAULT 0,
`daily_streak` INT NOT NULL DEFAULT 0,
`last_activity_date` DATE NULL,
`complaints` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`timeout_until` DATETIME NULL,
PRIMARY KEY (`char_id`, `job`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;oxide-pestcontroljob stores its progression rows with job = 'pestcontrol'.
The job creates two more shared tables in the same way:
oxide_settings, where the job saves its settingsjob_pending_payouts, where shift pay waits for a player who disconnected or logged out on shift, until their next login
Restart the server
Restart the whole server (not just the resource), so the custom props in stream/ load for every player.
Review the settings
The job works out of the box. When you want to change something, the easiest way is the in-game settings editor: join the server as an admin and type /pestcontrol settings in chat. Changes save to your database and apply right away.
The config files in shared/config.lua and shared/config/ are the factory defaults. They are imported into the database the first time the job starts, and after that the editor is how you change things. See How Settings Work before you edit any file.
Load Order
Every Oxide resource follows the same four-tier load order in server.cfg:
# 1. Framework — everything your framework requires (qb-core, es_extended, qbx_core, etc.)
ensure <framework>
# 2. Scripts — your other resources (phone, inventory, garages, etc.)
ensure <your-other-scripts>
# 3. o-link — the bridge. Starts after your framework/scripts, before any Oxide resource.
ensure o-link
# 4. Oxide resources — keep these together, ideally in a folder named [oxide]
ensure oxide-pestcontroljobox_libandoxmysqlbelong in tier 1 with your framework, which needs them too.- There's no required order within a tier. What matters is that
o-linkcomes after your framework and scripts, and before any Oxide resource. - If you run several Oxide resources and keep them all in a folder named
[oxide], you can start them all with one line,ensure [oxide], in place of the singleensure oxide-pestcontroljobline.
Verification
Started resource oxide-pestcontroljob and no red error lines mentioning it.E to accept. A route to the property appears on your map.Optional Setup
Phone messaging
When Config.usePhone = true (the default), the depot sends the player phone messages from "Bugstars - " followed by the depot name:
- a welcome when they clock in (a crew partner gets one too when they join)
- a notice when the van is destroyed, with the repair fine
- a customer callback, a little while after a report with an unfinished treatment or a missed nest
- a notice that the shift was cancelled after going down on the job
- the detailed pay summary at clock-out (when
Config.shiftSummary = 'text')
The phone also rings for each incoming call. There is nothing to set up: o-link finds your phone resource on its own. It must be one of the supported phones below and start before o-link (see Load Order).
Supported phones: qb-phone, lb-phone, gksphone, okokPhone, qs-smartphone, qs-smartphone-pro, yseries and Oxide Phone. How the messages arrive depends on the phone:
- Text message from the depot on Oxide Phone, gksphone, okokPhone and qs-smartphone (Quasar V3).
- Mail on qb-phone, lb-phone, yseries, qs-smartphone-pro and older qs-smartphone versions.
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. If a text can't be sent for any reason, the message is sent as mail instead.
Incoming call ring: when dispatch sends a call, the phone shows a notification titled "Incoming Call", such as "Pest complaint at Diner, La Mesa" or "Wasp nest at Forum Drive (Strawberry)". Only the crew leader's phone rings (or the solo technician's). The call is still accepted or rejected on screen.
If you want a popup end-of-shift summary instead of a phone message, set these in /pestcontrol settings under General:
Config.menuStyle = 'nui'
Config.shiftSummary = 'nui'If your server has no phone, or you prefer notifications only, turn off Use phone (Config.usePhone = false). Nothing is sent to the phone then, and the phone doesn't ring. On-screen notifications still show, and with Config.shiftSummary = 'text' the pay summary becomes a notification showing the net pay.
On-screen cards and Oxide HUD
While working a call, two cards guide the player:
- the stage card at the top left: what to do next, a count and progress bar, the call's steps, and the keys to use (shown at the bottom centre of the screen)
- the findings card at the top right, once the inspection has named the pest: the pest, the signs found, where the nest is and the treatment
A marker with its distance also floats over the next spot (the van, a sign, the next part of the wall to spray, the burrow, the ladder spot), and the call timer shows at the top of the screen.
- With Oxide HUD: if your server runs Oxide HUD, it places both cards: the stage card in its top-left activity spot and the findings card in its top-right activity spot, clear of the HUD's own widgets. In the HUD editor they're listed as "Pest Control: stage" and "Pest Control: findings". Players can move them or switch them off there, they hide while the HUD is hidden (the pause menu, a cutscene, death or character select), and they follow the HUD's accent colour (turn Follow the HUD accent off in the settings editor to keep the job's own colour). This needs
o-link1.12.1 or newer. With an oldero-linkthe cards simply use the positions below. - Without Oxide HUD (also while it is stopped or restarting): each card sits 30% of the screen height down from the top and 3% in from its side (the stage card from the left edge, the findings card from the right edge), below where most servers keep their HUD. If one overlaps something on your server, move it in
/pestcontrol settingsunder HUD → Card positions (Config.HudLayout), which has a separate position for the Stage card and the Findings card.
Uniforms
The job can dress technicians in a work uniform while on shift. It ships turned off, with empty outfits, because clothing numbers differ from server to server. Follow the step-by-step guide in Uniforms to fill in your own outfit and turn it on.
Admin permission
/pestcontrol settings and /pestcontrol level are for admins only. If you already run QBCore, Qbox or ESX admins, they pass automatically, with no extra setup.
To make someone an admin who isn't one yet, add these two lines to your server.cfg, replacing <their-license> with the player's license identifier (the code that follows license: in the player's identifiers):
add_principal identifier.license:<their-license> group.admin
add_ace group.admin admin allowThe first line puts the player in the admin group. The second gives that group admin rights. Restart the server after saving. Players who are not admins see "You do not have permission." if they try an admin command.
Translations
The text players see lives in locales/en.json: the shift menu, the call card, the stage and findings cards, notifications, phone messages, tutorials, the property editor's card and the settings editor's buttons. To translate it:
locales/en.json and name the copy after your language code, for example locales/de.json.Tell ox_lib which language to use by adding this line to your server.cfg:
setr ox:locale "de"A few things are not in the locale file and stay as they are: the names and help text of the settings in the settings editor, the property names (edit those under World → Properties), the depot name if you typed plain text instead of a locale key, and messages printed to the server console.
Next Steps
Oxide Pest Control
Pest control gig job for FiveM servers — UV inspections, perimeter spraying, bait stations and wasp nest removal.
Configuration Reference
Every setting in oxide-pestcontroljob — how the /pestcontrol settings editor and factory defaults work, plus crew, pay, dispatch, levels, depots, properties, the van, the inspection, treatment, wasps, uniforms and model replacements.