
BenzyFishing
A standalone fishing script for FiveM. Cast a rod at any water, wait for a bite, reel it in through a quick skill minigame, and land fish that are saved per-player in a database. Sell your catch for money, climb the leaderboard, and log the rare ones to Discord. Money, prompts, targeting, and storage run through BenzyBridge, so BenzyFishing works the same on ESX, QBCore, QBox, or standalone — the bridge detects the stack; no framework is required.
Made by Samuel Benzy of Benzy Development.
Features
- Cast anywhere — automatic water detection at the shoreline or from a boat, or lock fishing to curated spots with map blips.
- Reel-in minigame — a clean, polished skill check; rarer fish are harder to land. Miss it and the fish gets away.
- Server-authoritative catches — the server rolls every catch, so the odds can't be cheated.
- Config-driven odds — a per-fish chance + rarity tier for every species, plus an overall "nothing bit" chance.
- Rod prop + animation — a fishing rod in the hand and a stand-and-fish animation (or the base-game scenario).
- Per-player stats in a database — total caught, per-species tallies, biggest catch, and more, with
/fishstatsand a/fishtopleaderboard. - Daily & weekly challenges — optional randomly chosen catch goals, the same for everyone, with their own leaderboard.
- Sell for money — optional
/sellfishcommand and/or a world sell-spot, paid through whatever money system BenzyBridge resolves. - Optional physical items — off by default; turn it on to give real fish items and sell from whatever inventory BenzyBridge resolves.
- Discord webhooks — log notable catches and sales.
- No framework — no QBCore/ESX/ox_lib; storage (database or file) is handled by BenzyBridge.
Requirements
- Requires BenzyBridge, started before BenzyFishing — it provides BenzyFishing's money payouts, prompts, targeting, and storage connection, and detects the framework (ESX / QBCore / QBox / standalone) for you.
- Optional: a MySQL connector (oxmysql or mysql-async) for BenzyBridge to store stats in a database; without one, stats are saved to a local JSON file.
- Optional: a money system for BenzyBridge to pay out (fish are still catchable without one), a targeting system (ox_target / qb-target) for the sell-spot, and an inventory script (via BenzyBridge) for physical fish items.
What works with and without a framework, inventory, or money
BenzyFishing is standalone-first: everything degrades gracefully, so a missing system is a smaller feature set, never an error.
- No framework — the whole loop (casting, catching, stats, the leaderboard) works.
Config.Access.adminfalls back to ACE / identifiers / Discord for the staff commands (the framework job/group method is simply skipped). - No inventory — caught fish are tracked as database counts in BenzyFishing's own tables. This is the default and is completely silent — no warning, it is the normal standalone behavior. Turn
Config.Inventory.Enabledon and, when an inventory is present, the same catches also become real items. - No money system — fishing still works; only selling needs a money provider. With none resolved, a sale is refused (BenzyBridge reports the payout as unsupported), the player keeps their catch, and they are told there is nothing to pay them. Start a money system (before BenzyFishing) or register a money adapter with the bridge to enable payouts.
- No targeting system — a sell-spot set to
Config.Interaction = 'target'warns once and falls back to the "[E] Sell" draw-text prompt automatically.
Installation
- Drop the
BenzyFishingfolder into your server'sresources. - Add it to your
server.cfgin the right order — your SQL connector and framework first, then BenzyBridge, then the providers it routes to (money, notifications, inventory, targeting), then BenzyFishing last:BenzyFishing must start after BenzyBridge (the bridge supplies theensure oxmysql # SQL connector (only if you use a database)ensure es_extended # your framework, if any (skip on a standalone server)ensure BenzyBridge # the bridge — after the connector/framework, before providersensure BenzyMoney # providers the bridge routes to (money / notify / inventory / target)ensure BenzyFishing # this resource — lastBenzy.*API it runs on). In database mode the tables are created automatically on first start (Config.AutoInsertSQL = true). To create them by hand instead, runinstall.sqland setConfig.AutoInsertSQL = false. - Open
config.luaand tune it to taste (fish, odds, keys, selling, webhooks). - Restart the server.
Configuration
Everything is configured in config.lua, and every option has a comment above it explaining what it does. The highlights:
Fishing
| Option | What it does |
|---|---|
Config.Fishing.Command / StopKey | The /fish toggle and the stop key (default X, rebindable). |
Config.Fishing.StatsCommand | The /fishstats command name. |
Config.Fishing.RequireNearWater | Only allow casting at the water's edge (or from a boat). |
Config.Fishing.BiteMinMs / BiteMaxMs | The random delay between casting and a bite. |
Config.Fishing.NoCatchChance | Percent of bites that hook nothing at all. |
Config.Fishing.CooldownMs | Anti-spam minimum between casts (also enforced server-side). |
Config.Fishing.AutoRecast / AutoRecastDelayMs | Keep casting until the player stops, and the pause between catches. |
Rod & animation
| Option | What it does |
|---|---|
Config.Rod | The rod prop model, hand bone, and hand offset/rotation — nudge the offsets if the rod sits wrong — plus an optional Bobber prop on the water. |
Config.Anim | The stand-fishing animation dictionary + clips and the cast duration, or set UseScenario = true to use GTA's built-in fishing scenario (its own rod + pose). |
Water & spots
| Option | What it does |
|---|---|
Config.Water | How far out it looks for water, the cast distance, shoreline tolerances that keep piers and cliffs both working, and the boat/swimming rules. |
Config.Zones | Off by default. Curated fishing spots with map blips, and optionally restricting fishing to inside them. |
Fish & odds
| Option | What it does |
|---|---|
Config.Fish | The species list. Each fish has a Chance (relative weight — higher is more common), a Tier, a Value, and a size range. Add or remove fish freely; the odds rebalance themselves. |
Config.Tiers / Config.TierOrder | The rarity tiers, their notification colors, and their order (lowest to highest rarity). |
Config.Minigame | The reel-in minigame: the overall time limit and per-tier difficulty (zone size, marker speed, hits needed). |
Selling
| Option | What it does |
|---|---|
Config.Selling.Enabled | Master switch for selling. |
Config.Selling.Account | The account a sale pays into ('cash' / 'bank'). |
Config.Selling.PayFrom | Optional account key the payout is deducted from (a money sink) — e.g. 'government' or a business; best-effort, and only when the money system has such accounts. |
Config.Selling.PriceMultiplier | A global multiplier on every fish's sell value. |
Config.Selling.Command | The optional /sellfish command (Enabled + Name). |
Config.Selling.SellSpot | Optional world sell-spots — one or more fishmonger NPCs (add them under Locations), each with a blip and a sell interaction. |
Config.Interaction | How you interact with the sell-spot: 'drawtext' (an on-screen "[E] Sell" key prompt, works standalone) or 'target' (an ox_target / qb-target eye interaction, resolved by BenzyBridge). If 'target' is set but no targeting system is running, the script warns once and falls back to draw-text. |
Inventory (optional)
Physical items need an inventory script; without one, catches stay as database counts.
| Option | What it does |
|---|---|
Config.Inventory.Enabled | Off by default. Grant caught fish as real inventory items and sell from the inventory. |
Config.Inventory.ItemPrefix / SkipJunk | The item-name prefix (item = prefix + species) and whether to leave junk out. |
Storage
BenzyBridge decides database vs file (and the connector). BenzyFishing keeps its own tables + data settings:
| Option | What it does |
|---|---|
Config.AutoInsertSQL | Verify + create/repair the tables on every start. When false, run install.sql yourself. |
Config.AutosaveIntervalSeconds | How often the file backend flushes to disk. |
Leaderboard & locale
| Option | What it does |
|---|---|
Config.Leaderboard | The /fishtop leaderboard: Enabled, the command name, and how many to list. |
Config.Locale | Active language code (default 'en'). |
Challenges (optional)
Off by default. Turn on Config.Challenges.Enabled to run randomly chosen catch goals.
| Option | What it does |
|---|---|
Config.Challenges.Enabled | Master switch for challenges and their command. |
Config.Challenges.Daily / .Weekly | Which periods run. Both can be on at once, each with its own challenge and progress. |
Config.Challenges.Command | The command name (default fishchallenges). |
Config.Challenges.Limit | How many players the challenge leaderboard lists (default 5). |
Config.Challenges.Reward | Optional money for finishing one: Daily, Weekly (0 = off), and the Account it lands in. Skipped silently when no money system is running. |
Webhooks
Config.Webhooks holds a URL for Catches and Sales (leave a field empty to disable it), plus MinTier — the minimum rarity a catch must be to reach the catches channel (default rare).
Commands
| Command | Who | What |
|---|---|---|
/fish | Everyone | Start or stop fishing at the water's edge. |
/fishstats | Everyone | Show your own fishing stats. |
/fishtop | Everyone | Show the top fishers leaderboard. |
/fishchallenges | Everyone | Show the current challenge(s), your progress, the top players, and your rank (if challenges are enabled). |
/sellfish | Everyone | Sell all the fish you are carrying (if the command is enabled). |
/givefish [id] [species] [amount] | Staff | Give fish to a player. |
/resetfish [id] | Staff | Reset a player's fishing stats. |
Every command is a normal, visible, typeable command (they all show in chat autocomplete). The stop key is bound to an internal keybind command (default X, rebindable); use /fish again to stop.
Debug: debugbenzyfishing (in the server console, or a player's F8 console when Config.Debug = true) prints what BenzyBridge resolved for BenzyFishing and the storage state; in the F8 console it also lists whether you hold the benzy.fishing ace.
Permissions
The staff commands — /givefish and /resetfish — are gated by Config.Access.admin, checked through BenzyBridge's unified access (Benzy.HasAccess(src, Config.Access.admin, 'benzy.fishing')). There is one role, admin, and it is a rule with four methods that are OR'd together — a player passes if any enabled method matches:
| Method | Shape | Matches on |
|---|---|---|
Framework | { ENABLE = false, list = { 'admin', 'superadmin' } } | the player's active-framework job or group name (skipped on standalone). |
Identifiers | { ENABLE = false, list = { 'license:xxxx', 'fivem:1234567' } } | any one of the player's raw identifiers. |
AcePerms | true / false | when true, the fixed benzy.fishing ACE string checked against the player’s ACE permissions. |
Discord | { ENABLE = false, list = { '123456789012345678' } } | any one of the player's Discord role ids (needs Badger_Discord_API; skipped if it isn't running). |
A method whose prerequisite is absent (no framework, Badger not running) is skipped rather than failing. Out of the box only AcePerms is on, so it behaves like a plain ACE setup — grant the ace to your admins in server.cfg:
add_ace group.admin benzy.fishing allow
add_principal identifier.license:YOURLICENSE group.admin
Turn on Framework, Identifiers, or Discord in Config.Access.admin to allow those too. Anyone who matches none is refused; the server console can always run the commands. The player commands — /fish, /fishstats, /fishtop, and /sellfish — need no permission.
Selling
Selling is on by default and pays the player through BenzyBridge (whatever money system it resolves), into Config.Selling.Account. Both ways to sell are optional and independent:
- Command —
Config.Selling.Command.Enabled(the/sellfishcommand). - Sell-spots —
Config.Selling.SellSpot.Enabled(one or more fishmonger NPCs, each with a blip and a sell interaction; add locations underSellSpot.Locations).Config.Interactionpicks how you sell at a spot:'drawtext'shows a "[E] Sell" prompt (works standalone), and'target'puts the interaction on the fishmonger via BenzyBridge's targeting (ox_target / qb-target) — falling back to draw-text, with a one-time warning, when no targeting system is running.
Set Config.Selling.PayFrom to an account key to make selling a money sink — the payout is deducted from that account (best-effort) instead of being created; this needs a money system with such accounts (e.g. BenzyMoney's society/business accounts).
Challenges (optional)
Config.Challenges is off by default. Turn Enabled on and each period gets one randomly chosen catch goal — "catch 9 Mackerel", or a two-species goal like "catch 6 Sea Bass and 2 Bluefin Tuna". Rarer fish ask for fewer; a weekly challenge asks for about three times a daily one.
The challenge is built from that day's (or week's) date, not rolled at random on boot, which means:
- every player on the server has the same challenge,
- restarting the resource never rerolls it,
- and a new day or week starts a new challenge on its own — there is no reset step, cron job, or maintenance window.
Run Daily, Weekly, or both — each keeps its own challenge and its own progress. Only genuine catches count (an admin /givefish does not), and junk never appears as a goal. Finishing a challenge notifies the player and adds to their lifetime total, which is what the challenge leaderboard ranks.
Optional reward. Set Config.Challenges.Reward.Daily / .Weekly to pay a fixed amount for finishing one, through whatever money system BenzyBridge resolved. Leave them at 0 for no reward. If no money system is running the payment is skipped silently — the challenge still completes and still counts, and nothing errors — so a reward is safe to configure on a standalone server and starts paying as soon as a money system is present.
/fishchallenges shows the current challenge(s) with your progress, the top players, and your own position.
Inventory (optional)
Config.Inventory is off by default, so fish are tracked as database counts and everything is standalone. Physical fish items need an inventory script; without one, catches are tracked in the database. Turn Config.Inventory.Enabled on to also grant real items on catch and sell from the inventory; you add the fish item definitions + images to your inventory yourself — see the Integrations documentation.
Discord webhooks
Paste a webhook URL into Config.Webhooks.Catches and/or Config.Webhooks.Sales (blank = off). Config.Webhooks.MinTier controls how rare a catch must be to be logged (default rare).
Localization
All text is in locales/en.lua. To translate, copy locales/template.lua to locales/<code>.lua, translate the right-hand strings, and set Config.Locale -- every file in locales/ loads automatically.
Integrating with other resources
BenzyFishing exposes exports and events for reading catch stats and reacting to catches/sales. See the Exports and Events documentation.
Troubleshooting
- The rod sits wrong in the hand — tune
Config.Rod.HandOffset/HandRot, or setConfig.Anim.UseScenario = true. - Stats aren't saving / "unknown storage mode" — make sure BenzyBridge is started before BenzyFishing; its
Config.Storagepicks database vs file. Checkdebugbenzyfishingor BenzyBridge's boot summary. - Selling says no money system — BenzyBridge has no money system resolved. Start one (before BenzyFishing) or register a money adapter with the bridge.
- Can't fish — you must be at the water's edge (or on a boat). Set
Config.Debug = trueto see why a cast is rejected.
Support
Made by Samuel Benzy of Benzy Development.
Credits
Fishing rod + lure props and the stand-fishing animation are base-game GTA V assets.