Commands#
Fishing Job keeps its chat commands to two. Everything else a player does starts from an item in the inventory or from the job NPC, and everything an admin does happens in one panel.
Command | Who | Description |
|---|---|---|
| ACE | Opens the admin panel: every setting in |
| Anyone carrying wood | Builds a campfire in front of the player, spending |
Set either command to
''to remove it. The admin panel's permission is checked on the server when it opens and again on every button pressed inside it, so a modified client cannot reach a setting it was never allowed to see.
There are no key bindings to rebind in the game's settings: the keys are control ids in Config.Keys. The full list is in Usage.
Client Exports#
For opening the job panel or using a piece of gear from your own scripts — a radial menu, a phone app, a custom inventory. Each one does exactly what using the item does, including every level and ownership check.
Opening the job panel
exports['qs-fishingjob']:openFisherMenu() -- missions, crew, statistics, shop, guideThe same panel the NPC opens, with the dialogue camera on the fisherman. From the server, TriggerClientEvent('qs-fisher:openFisherMenu', source) does the same.
The rod and the tackle box
exports['qs-fishingjob']:toggleFishingRod() -- take the rod out, or put it away
exports['qs-fishingjob']:toggleFishingKit() -- open the tackle boxThe rod is refused while the speargun is out, and cannot be put away mid-cast or mid-fight. The rod used is the one picked in the tackle box, or the best one the player owns and has the level for.
Crab traps and nets
exports['qs-fishingjob']:useCrabTrap() -- drop a trap over the water in front
exports['qs-fishingjob']:useDriftNet() -- level 10
exports['qs-fishingjob']:useTrawlNet() -- level 20
exports['qs-fishingjob']:useDeepSeaNet() -- level 32A trap needs Config.CrabTraps.MinDepth metres of water and a free slot under the player's trap limit. A net goes out only from the helm of a boat rented from the job NPC, over at least Config.FishingNets.MinDepth metres.
Speargun and dive tank
exports['qs-fishingjob']:useSpeargun() -- level 20, needs spears
exports['qs-fishingjob']:useDiveTank() -- strap the tank on, or take it offCooking
exports['qs-fishingjob']:lightCampfire() -- build a fire, spending the wood
exports['qs-fishingjob']:useFoodBoat() -- set the grill boat down on land
exports['qs-fishingjob']:packUpFoodBoat() -- pack it up againThe guide's map pins
exports['qs-fishingjob']:hideGuideBlips() -- remove the tournament-zone pins the guide put on the mapServer Exports#
How another resource reads what a fisher is doing — a buyer NPC that trades only with working fishers, a job centre that refuses a second job, a reward script that checks the reel on someone's rod.
isPlayerOnDuty
Whether a player is working a mission from the job panel right now. Returns boolean.
if exports['qs-fishingjob']:isPlayerOnDuty(source) then
-- a working fisher
endgetOnDutyCount
How many players are on duty. Returns number — handy for a fish market that pays more when nobody is fishing.
local fishers = exports['qs-fishingjob']:getOnDutyCount()IsPlayerOnMission
Whether a player belongs to a crew with a mission running. True for every member, not only the leader. Returns boolean.
if exports['qs-fishingjob']:IsPlayerOnMission(source) then
return TriggerClientEvent('chat:addMessage', source, { args = { 'Finish your fishing mission first.' } })
endgetPlayerGear
What is fitted to the player's rod, slot by slot. Returns a table of item names, or an empty table when nothing is fitted.
local gear = exports['qs-fishingjob']:getPlayerGear(source)
-- { bait = 'squid', hook = 'circle_hook', reel = 'deepsea_reel', line = 'steel_leader' }
if gear.reel == 'deepsea_reel' then
-- reward the serious anglers
endItem Events#
Every usable item has a client event twin of its export. The script registers the items itself for ESX, QBCore and Qbox, and ox_inventory and qs-inventory call the exports through their client.export lines — so you only need these for an inventory that dispatches usable items by event:
TriggerClientEvent('qs-fisher:toggleFishingRod', source) -- any rod
TriggerClientEvent('qs-fisher:toggleFishingKit', source) -- fishing_kit
TriggerClientEvent('qs-fisher:useCrabTrap', source) -- crab_trap
TriggerClientEvent('qs-fisher:useNet', source, 'trawl_net') -- drift_net · trawl_net · deepsea_net
TriggerClientEvent('qs-fisher:useSpeargun', source) -- speargun
TriggerClientEvent('qs-fisher:useDiveTank', source) -- dive_tank
TriggerClientEvent('qs-fisher:useCampfire', source) -- oak_wood · pine_wood · maple_wood
TriggerClientEvent('qs-fisher:useFoodBoat', source) -- skewer_grill_boat
TriggerClientEvent('qs-fisher:openFisherMenu', source) -- the job panelqs-fisher:useNet is the only one that takes an argument: the net item, which decides the tier that goes out.
Running ox_inventory or qs-inventory and still want the script to register the items itself? Set
Config.RegisterUsableItemsManually = true. Leave it off otherwise — registering twice makes one use fire twice.



