Pepper Fishing
Fishing with a fight minigame, 83 fish species, 12 boss fish, levels 1–100 with a skill tree, boats and sonar, fish market, tournaments, fishing licenses and inspections for ESX, QBCore and Qbox.
Overview
Pepper Fishing turns fishing into a long-term activity for every player – no job, no whitelist. Anyone using the
fishing rod (item fishing_rod) casts at any water, sets the hook on the bite and fights the fish with line
tension: too much pull and the line snaps, too little and the fish gets off. Then the catch card shows species,
rarity, weight, length and quality – keep it or release it. Everything else lives in the fishing log (item
fishing_book): fish lexicon, gear, skill tree, orders, fish market, tournaments, leaderboards and map. Buying, selling
and renting happens at NPC stations (tackle shop, fishmonger, boat rental, restaurant, black market).
Note: All coordinates in
config/zones.luaandconfig/locations.luaare approximations. Check them on your server and adjust single lines if an NPC stands inside a wall or a boat spawns on dry land.
Features
- Fight minigame with line tension, runs, dives and jumps (A/D) – including line breaks and thrown hooks
- 83 fish species across 5 water types (coast, open sea, lake, river, swamp) – 28 common, 25 uncommon, 19 rare, 11 epic
- 12 legendary boss fish with sightings, fights in 3–5 acts, server-wide announcement, hall of fame and their own trophy
- Levels 1–100 with 10 ranks, duration adjustable in the config (
Config.Level.XpMultiplier), skill tree with 4 branches and 24 perks - Catch camera and catch card with rarity, weight, length, quality, "new" and record stamps – keep or release
- Time of day, weather, tides and season decide what bites – with a bite forecast in the fishing log
- Gear with durability: 6 rods, 5 reels, 5 lines, 4 hooks, 3 sonars – plus 12 baits (7 natural baits, 5 lures)
- Boat rental at 4 stations with 8 boats (vanilla GTA models only), fishing from your own boat, anchor on a key, sonar showing shoals and hotspots
- Fish lexicon as a collection album with personal bests, server records and leaderboards, 36 achievements
- Dynamic fish market (market factor 0.6–1.5, 3 wanted species per day at +50%), 3 daily and 2 weekly orders, restaurant deliveries
- Tournaments (4 types, 10–60 minutes) with live standings and prize money, scheduled automatic tournaments, fishing season (30 days) with rewards
- Fishing license (inland + coast / open sea), closed seasons, protected species, 4 restricted zones, black market, inspections by police or rangers with a fine catalog
- Bycatch and treasure: 8 junk items, message in a bottle with treasure map (16 treasure spots), chests, pearls
- 124 ready-made ox_inventory images, items in German and English
- Admin page in the fishing log, 5 Discord webhooks, 3 server exports
- German & English, open config, locales, bridges and install files
Requirements
| Dependency | Required/optional | Used for | Link |
|---|---|---|---|
| FiveM server build ≥ 7290 | required | declared in fxmanifest.lua as /server:7290 |
https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/ |
| OneSync | required | server logic, boats, nearby inspections | https://docs.fivem.net/docs/scripting-reference/onesync/ |
| ESX Legacy, QBCore or Qbox | required (one of them) | money, jobs, identifiers – Config.Framework = 'auto' detects it |
https://github.com/esx-framework/esx_core |
| ox_lib | required | UI building blocks, callbacks | https://github.com/overextended/ox_lib |
| oxmysql | required | database (MySQL/MariaDB) | https://github.com/overextended/oxmysql |
| ox_inventory | required | fish carry weight, length and quality in their metadata | https://github.com/overextended/ox_inventory |
| ox_target or qb-target | optional | talking to NPCs – without a target resource it uses TextUI | https://github.com/overextended/ox_target |
| Dispatch (ps-dispatch, cd_dispatch, qs-dispatch, rcore_dispatch, core_dispatch) | optional | poaching alerts – without one the built-in alert is used | – |
| Vehicle keys (qb-vehiclekeys, Renewed-Vehiclekeys, qbx_vehiclekeys, wasabi_carlock, MrNewbVehicleKeys) | optional | keys for rental boats via bridge/*/keys.lua |
– |
| Fuel script (ox_fuel, LegacyFuel, cdn-fuel, ps-fuel, lj-fuel, lc_fuel, qb-fuel) | optional | rental boats handed over with a full tank (bridge/client/fuel.lua) |
– |
Installation
- Download the resource from the Cfx.re Portal (Granted Assets)
- Extract to
resources/[pepper]/pepper_fishing– do not rename - Add the items: paste the contents of
install/ox_items_en.lua(English) orinstall/ox_items.lua(German) intoox_inventory/data/items.luabefore the last} - Copy the images: all files from
install/images/toox_inventory/web/images/ - Database: tables are created automatically on first start. Without CREATE permission import
install/pepper_fishing.sqlfirst - Check
config/config.lua(language, interaction, money, license),config/server.luafor webhooks - Add to your
server.cfgafter the dependencies:
ensure oxmysql
ensure ox_lib
ensure es_extended # or qb-core / qbx_core
ensure ox_inventory
ensure pepper_fishing
- Start the server – the console shows
Pepper Fishing 1.0.0 started (framework: …, species: 83, server records: …, season: …) - In-game: buy a rod, fishing log, bait and a license at the tackle shop, walk to the water, use the rod
Items
| Item | Purpose |
|---|---|
fishing_rod |
use = fishing mode on/off (one item for all rod tiers – gear is stored in the profile) |
fishing_book |
opens the fishing log |
fishing_license |
optional document for the license (Config.License.GiveItem = true) |
bait_*, lure_* |
12 baits |
fish_<species> |
83 fish species – weight, length, quality in the metadata |
fish_legend_<id> |
12 boss trophies |
junk_* |
8 bycatch items |
message_bottle, treasure_map, treasure_chest, pearl, old_coin, antique_compass |
treasure and valuables |
Usable items carry the line server = { export = 'pepper_fishing.<item>' } – it is already in the item files.
First test
- Log in as admin and buy a rod, the fishing log, a bait and the
basiclicense at the tackle shop (blip) - Pick the bait in the fishing log under Baits, walk to the water and use
fishing_rod - Hold and release the left mouse button – on the "!" press
Eto set the hook and fight the fish - Press
Eon the catch card: the fish lands in your inventory with weight and length - Sell it at the fishmonger – the money goes to
Config.Economy.Account
Configuration
| File | Contents |
|---|---|
config/config.lua |
language, framework, interaction, items, keys, cast, bite, fight, levels, money, market, license, illegal fishing, inspections, tournaments, bosses, treasure, boats, permissions, blips, HUD |
config/fish.lua |
83 fish species, 12 boss fish, bycatch |
config/gear.lua |
rods, reels, lines, hooks, sonars, baits |
config/skills.lua |
skill tree |
config/zones.lua |
waters, hotspots, restricted zones, shoal areas |
config/locations.lua |
NPC stations, boat rental, restaurants, black market, treasure spots |
config/progression.lua |
ranks, unlocks, orders, deliveries, achievements, season rewards |
config/server.lua |
webhooks, admin ACE (never sent to clients) |
Key options:
| Option | Default | Meaning |
|---|---|---|
Config.Locale |
'de' |
language (de / en) |
Config.Framework |
'auto' |
auto, esx, qbcore, qbox |
Config.Interaction |
'auto' |
talking to NPCs: auto (ox_target → qb-target → TextUI), ox_target, qb-target, textui |
Config.Command |
false |
optional command (e.g. 'fishinglog') – opens the fishing log without the item |
Config.Level.XpMultiplier |
1.0 |
scales all XP – by default about 150 hours of play to level 100 (simulation), 2.0 = twice as fast |
Config.Economy.PriceMultiplier |
1.0 |
scales all fish prices |
Config.Economy.Account |
'cash' |
account for sales, purchases, rent, orders |
Config.DirtyMoney |
ESX black_money, QBCore/Qbox cash |
account for black market income per framework |
Config.Fight.Difficulty |
1.0 |
fight difficulty (0.8 easier, 1.2 harder) |
Config.License.Required |
true |
fishing without a license is a violation |
Config.License.Prices |
basic = 2500, sea = 12000 |
license prices |
Config.Illegal.MinLevel |
15 |
level needed to find the black market |
Config.Illegal.HiddenForJobs |
police, sheriff, ranger |
these jobs never see the black market dealer |
Config.Control.Jobs |
police, sheriff, ranger |
these jobs may inspect anglers |
Config.Zones.DeepMinLevel |
15 |
open-sea fish bite from this level (boat only) |
Config.Tournaments.Auto.Enabled |
true |
automatic tournaments every 120 minutes with 4+ players online |
Config.Boss.Announce |
'all' |
announcement on a boss catch: all, anglers, none |
Config.Boats.Deposit |
2500 |
deposit per rental boat |
Config.Boats.FullTank |
true |
rental boats are handed over with a full tank |
Config.Boats.Anchor |
on, key 'H', command 'anker' |
drop/weigh anchor (OnlyRental, MaxSpeed) |
Config.Presentation.Camera |
true |
camera move on a catch |
Gameplay
A catch step by step
- Fishing mode: use the
fishing_roditem – rod in hand, the fishing HUD shows bait, gear and water.Xstows it - Cast: hold the left mouse button (power meter), release. The landing point has to be water
- Wait: bite time depends on bait, water, conditions, shoals and perks (6–38 s by default)
- Bite: sound and "!" – strike with
Eor left click (1.6 s window, hooks and a perk extend it) - Fight: hold left mouse button or space = reel, release = give line. Keep the tension in the green zone; press
AorDon jumps - Catch card:
Ekeep (item in your inventory) orRrelease (+25% XP). Without a decision the server decides after 30 s - Sell: at the fishmonger – or use the catch for an order, a restaurant delivery or a tournament
The server rolls species, weight and quality, checks cast range, zone and fight duration and hands out XP, money and items.
License, illegal fishing, inspections
- License:
basic(inland waters + coast, $2,500) andsea(open sea, $12,000), bought at the tackle shop, durationConfig.License.Days(0 = permanent) - Violations: fishing without a license, keeping a protected species or a closed-season fish, fishing in a restricted zone, exceeding the daily keep limit (
Config.Illegal.DailyKeepLimit, off by default) - Suspicion (0–100): rises per violation, drops by 0.5 per minute. Alert to police/rangers: 3% + suspicion × 0.4% (max. 45%), at most every 300 s per player
- Black market: from level 15, dealer only at night (21:00–05:00 game time) at one of 5 locations (changes daily), buys illegal fish at 1.8× for dirty money
- Inspection: jobs from
Config.Control.Jobsinspect a player within 4 m (target or/fishcheck): license, violations, illegal fish. Actions: confiscate, fine (6 catalog entries), revoke the license for 3 days
Dispatch and webhooks
Dispatch
Config.Illegal.Dispatch.Mode (optional, default auto) picks the first running integration: ps-dispatch, cd_dispatch,
qs-dispatch, rcore_dispatch, core_dispatch. Without one, the jobs from Config.Control.Jobs get a message and a blip.
false turns the alert off. Customizable in bridge/server/dispatch.lua.
Webhooks
In config/server.lua ('' = off):
| Key | Contents |
|---|---|
catches |
special catches: epic fish, server records (ServerConfig.WebhookMinRarity) |
bosses |
boss fish: sightings and catches |
tournaments |
tournament results, end of season |
illegal |
alerts, inspections, fines, black market sales |
security |
suspicious cases from the plausibility check |
Commands and permissions
Commands
| Command | Default | Function |
|---|---|---|
Config.Command |
off (false) |
e.g. 'fishinglog' → opens the fishing log without the item |
/fishcheck |
on (Config.Control.Command) |
inspect the nearest player (requires the control permission) |
/anker |
on (Config.Boats.Anchor.Command) |
drop or weigh the anchor |
Admin tasks (set level/XP, grant a license, start/cancel a tournament, trigger a boss sighting, reset the market, end the season, zone debug) are done on the Admin page of the fishing log.
Permissions
Permissions are re-checked on every server call. Admin = ACE pepper_fishing.admin or a group from
Config.AdminGroups (admin, superadmin, god) – admins have every permission.
| Permission | What for | Default |
|---|---|---|
tournament |
create and cancel tournaments | group admin or ACE pepper_fishing.tournament |
control |
inspect anglers: check license, confiscate, fine, revoke license | jobs police, sheriff, ranger, group admin or ACE pepper_fishing.control |
Every permission can be granted via ace, groups, jobs (job + minimum grade), items or everyone = true:
add_ace group.admin pepper_fishing.admin allow
add_ace group.mod pepper_fishing.tournament allow
Keys
| Key | Function |
|---|---|
| Left mouse button | cast (hold = power) / reel |
| Space | reel (alternative) |
E |
strike / keep the catch |
R |
release the catch |
A / D |
counter a jump |
Alt |
switch bait |
G |
sonar on/off (in or on a boat only) |
H |
drop/weigh anchor (on the boat) |
X |
stow the rod / cancel |
Change keys in Config.Keys (GTA control IDs). Players change the anchor key (Config.Boats.Anchor.Key) in the GTA
settings under Key Bindings → FiveM.
Exports and framework bridge
Exports (server)
-- server, read-only
exports.pepper_fishing:getProfile(src) -- public angler profile or nil
exports.pepper_fishing:getLevel(src) -- fishing level (0 = profile not loaded)
exports.pepper_fishing:isFishing(src) -- true while waiting, on a bite or in a fight
Framework bridge
bridge/server/{esx,qbcore,qbox}.lua provide money, job and identifier, bridge/server/inventory.lua the items
(ox_inventory), bridge/server/dispatch.lua the alert, bridge/client/frameworks.lua job and notifications on the client.
bridge/server/keys.lua and bridge/client/keys.lua hand out the key for the rental boat, bridge/client/fuel.lua fills
it up. If no framework is running, bridge/server/standalone.lua takes over as an emergency mode. All bridges are open.
Troubleshooting
| Problem | Solution |
|---|---|
| Rod or fishing log cannot be used | Items added? server = { export = 'pepper_fishing.<item>' } must be present; do not rename the folder |
| "Pepper Fishing is still starting" | Database not reachable – start oxmysql before pepper_fishing, check the console |
| Items without an image | Copy install/images/*.png to ox_inventory/web/images/ |
| NPC misplaced or missing | Coordinates in config/locations.lua are approximations – adjust the line |
| No interaction at the NPC | Check Config.Interaction; without a target resource use 'textui' |
| "Your rod cannot cast that far" | Cast range of the rod exceeded – move closer or buy a better rod |
| Buying/selling does not work | Only works right at the station – on the road the fishing log is read-only |
| Black market dealer missing | Level 15+, night only, location changes daily; police jobs never see him |
| Open-sea fish do not bite | Level 15+, from a boat only and at 25 m water depth or more |
| Police get no alert | The alert only fires with a probability; check Config.Control.Jobs and dispatch |
FAQ
Is fishing a job?
No – it's an activity for every player, no job and no whitelist. Police and rangers get their own role through inspections.
Do I need addon models or a map?
No. Rods, bobbers, boats, NPCs and treasure chests are vanilla GTA models. You can fish at any water on the map.
Does it work without ox_inventory?
No, ox_inventory is required (listed in dependencies). Every fish carries weight, length, quality, water type and catcher in its item metadata.
I can't use the rod or the fishing log – what's missing?
Usually the items are missing from ox_inventory/data/items.lua, or the line server = { export = 'pepper_fishing.<item>' } is missing. Also, the folder must not be renamed, and your framework and ox_inventory must start before pepper_fishing.
The console says "Pepper Fishing is still starting" or tables are missing.
The database can't be reached: start oxmysql before pepper_fishing and check the console. If your database user has no CREATE permission, import install/pepper_fishing.sql first.
The console says "standalone" – my framework isn't detected.
No framework was running at startup. Start es_extended, qb-core or qbx_core before pepper_fishing in your server.cfg, or set Config.Framework to esx, qbcore or qbox.
Do I have to use ox_target?
No. Config.Interaction = 'auto' uses ox_target, then qb-target, then TextUI (key E).
An NPC stands inside a wall or the boat spawns on land.
The coordinates in config/locations.lua are approximations. Adjust the station's line or the spawns point and restart the resource.
How long does it take to reach level 100?
With the default values about 150 hours of play – the result of a simulation in the resource's tests. Config.Level.XpMultiplier = 2.0 halves that, 0.5 doubles it.
Can I adjust prices to my server economy?
Yes. Config.Economy.PriceMultiplier scales all fish prices at once. Per-species prices are in config/fish.lua, gear and baits in config/gear.lua, boat rents in config/locations.lua.
Can I add my own fish species?
Species are data in config/fish.lua (open). A new species needs an entry there, names in locales/*/fish.json, an ox_inventory item and an image.
Can I turn off the fishing license?
Yes: Config.License.Required = false. Fishing without a license is then no longer an offence.
The black market pays regular cash on QBCore/Qbox.
Those frameworks have no dirty-money account, so Config.DirtyMoney uses cash by default. Enter your own account if your server has one.
How do I change texts or switch to English?
Config.Locale = 'en' in config/config.lua, and use install/ox_items_en.lua for the items. All texts are open in locales/de/*.json and locales/en/*.json.
What happens on a server restart?
Running casts and fights end. Profiles, lexicon, records, market prices, tournament results, season and boss fish cooldowns are stored in the database.
How do I install an update?
Replace the pepper_fishing folder; back up your config/ and locales/ changes first and copy them back. The resource creates missing tables and columns on start; new items are listed in CHANGELOG.md.
Support
Open a ticket on Discord: https://discord.gg/6NaFJWKDYu (category "Script Support") – link your purchase with /verify first.
Permanently tested on the Pepper Scripts dev server.
Changelog
Current version: 1.0.0 (2026-10-04). All changes are listed on the updates page and in CHANGELOG.md inside the resource.
Found a mistake? Report it on Discord.