DirkScripts
UPDATE 2.0.26 | 11/05/2026
Requires dirk_lib 1.2.43 or newer.
Headline: fish gutting has been fully redesigned. Two minigames now β a drag-along-the-line cut for fish, and a click-the-circles-before-they-vanish crush for crustaceans and shelled species β plus a top-down cinematic camera, a no-auto-close reward overlay with rarity-coloured tiles, optional tool durability, and one universal meat item that carries species metadata so the inventory tooltip reads Species: King Crab / Weight: 1.2kg.
This release also wraps up a batch of customer-driven fixes from tickets against 2.0.24/2.0.25, a new schema-driven install + missing-items pipeline that replaces the old hand-rolled install file, and a pile of admin/configurator polish.
#Fish gutting β full redesign
The old per-species meat-name loop and pulse-timing minigame are gone. Replaced with a single universal meat item, a fresh drag-to-cut minigame, a cinematic top-down camera, weight-scaled fish props, and a reward overlay you close in your own time.
Meat item + tooltips
- One global fish meat item now covers every species. The species name, weight and label are stored on the meat itself, so on ox_inventory each stack reads as "Longnose Gar Meat", "King Crab Meat" etc. β not all "Fish Meat". Other inventories silently ignore the per-instance label.
- Meat tooltip now shows
Species: β¦andWeight: β¦kglines, the same way caught fish tooltips do. Tool tooltips gain aUses Left: Nline when durability is on. - Fish meat now weighs 100g per unit (was 0g), so it actually counts against your inventory carry. Existing test servers may need a one-time manual item-table sync.
- The meat item name is now editable from the configurator under Basic β Gutting.
Scoring
- Accuracy is now monotonically decreasing β drifting off the line drops your score and getting back on stops the bleed, but doesn't recover. The old running-average let you cheese a bad opening with a clean ending.
- 0% accuracy now grants 0 meat. Botching the minigame used to still pay out half a meat; it doesn't any more. Bonus drops (worms, etc.) still roll on their own chances.
- Final score combines accuracy Γ speed Γ progress. Speed bonus tops out at +30% for sub-2s cuts and decays to baseline by 6s β slow-and-clean still pays, sloppy-and-fast can't beat clean-and-slow.
- The "Accuracy" number on screen during the minigame is now the same number the server actually scores you on. No more mid-cut display drift.
- Line tolerance is tighter and the cursor-trail dot thresholds are stricter β you have to actually be on the line for green dots, not just near it.
Camera + scene
- Cinematic top-down camera 1.8m above the fish, rotated to match your heading so the cut reads left-to-right from your point of view. 600ms blend in, 500ms blend out.
- Fish prop spawns 0.8m in front of you, on its side, belly facing you.
- Prop is now scaled to the caught weight β a 5kg gar looks 5kg on the cutting board, same as it does in the reward UI and held in your hands.
- Player kneels during the cut.
Cut minigame
- Every open generates a fresh randomised S-curve β the line is never the same twice.
- Click-drag from the start dot and trace the line. Progress only advances while you're actually on it β "drag near it = win" is gone.
- Knife cursor with a tolerance halo, both flip red when you go off-line. OS cursor hides during the cut.
- Trail dots drop at the cursor's actual position, colour-coded per tick (green clean / accent ok / red off) β you can see exactly where your knife went.
- Cancel rules: pre-cut Esc cancels cleanly and your fish stays in your inventory. Mid-cut mouse-release commits with reduced progress (no bailing). Reaching the end gives full progress.
Crush minigame (new β for crustaceans and shelled species)
- Click the spawning circles before they vanish. Each circle shrinks and changes colour as its timer runs out. Hit = green marker, miss = red marker.
- Circle lifetime scales with species rarity β common species are forgiving, rare ones (Lobster, King Crab) demand quicker reactions.
- Default seed sets crush on Blue Crab, Freshwater Prawns, Stonecrab, Dungeness Crab, Lobster, King Crab, Snapping Turtle and Turtle. Every other species stays cut.
- New
meat_mallettool item required for crush species β seeded into both equipment store stocks at $120. Image needs adding manually toINSTALLATION/itemImages/meat_mallet.png(and copied to your inventory's image folder). - Reward overlay, camera, prop spawn, durability and timeout all shared with the cut flow.
Reward overlay
- No auto-dismiss β you close it when you're ready.
- Big colour-tiered verdict line (Clean / Good / OK / Sloppy for cuts; Clean Harvest / Good Harvest / OK Harvest / Botched for crushes) above an accuracy %.
- Square reward tiles in a row: meat tile first, then any bonus drops. Quantity overlays the top-right of each tile (the meat tile shows weight in kg). Rarity overlays the bottom-centre, coloured by drop chance (common β legendary).
- Tiles cascade in. Dismiss by clicking the backdrop or pressing Esc.
Other
basic.gutting.useMinigametoggle (default on) β silent skill-only flow if you'd rather not have a minigame at all.- Every species now has its own reward pool + worm chance configured in the schema.
#Tool durability (optional)
- New
basic.gutting.toolsBreaktoggle (default off). When on, the fish knife and meat mallet lose one use per cut/crush. Tool is removed at 0 uses with a notify. - Max uses tunable: 50 by default for the knife, 40 for the mallet.
- Inventory tooltip shows
Uses Left: Nunder the tool. Fresh tools show nothing until first use. - Defaulted off so existing servers don't suddenly start eating tools on upgrade.
#Admin UI
- New "Gutting" subsection in BasicSection. Holds both tool items, the durability toggle, the max-uses inputs and the meat item name β everything gutting-related in one place.
- Per-fish minigame type toggle in FishSection's Gutting tab β pill-style Scissors / Hammer segmented control. Min/max circle-count inputs appear only when Crush is selected.
- Equipment section's "New" button no longer collapses the header row when you switch to the Misc tab (the layout shift was distracting).
- Players tab now sorts online players to the top of every page (instead of scattering them across pagination) β you can find who you need in one click.
#Store stocks β admin-configurable
- Store stock entries can now reference admin items by key (e.g.
basic.fishGuttingItem) instead of hardcoded names. Change an item's name in the configurator and the equipment store automatically starts selling the new name β no stock-list edit needed. - The four misc entries in both equipment stores (fish finder, gutting tool, crushing tool, boat anchor) all use refs now. The anchor item was previously unsold and is now $200 in Misc.
- The Misc tab in the equipment admin is now driven by the schema, so adding a new tool in future is a one-line config edit instead of a frontend change.
#Variance UX
- Help-icon tooltips on the variance min/max inputs in StoreSection explain the signed-% semantics (-100 = free, 0 = base, +100 = double, rolled per server restart).
- Live
$/kgpreview row under each fish stock entry β no more guessing what[-5, +5]means in dollars for that fish. - The Base Price input defensively handles old array-shape data so a stale NUI session can't crash the Ecology tab during a migration.
#Schema-driven install + missing-items audit
- New
x-installItemschema annotations describe every item the resource needs registered (rods, reels, lines, hooks, bait, weights, traps, dig tools, fish, plus all the basic-section items). One annotation drives both the install-file generator and a missing-items audit. - dirk_lib now rewrites
INSTALLATION/itemsToAdd/{ox.lua, qb.lua, esx.sql}automatically after every config load + change. Oldsrc/server/install.luais gone. - ESX SQL output now matches the actual ESX legacy
itemstable schema (name, label, weight) β the previous hand-rolled SQL declared a non-existentdescriptioncolumn and would fail to import on some servers. - Server console warning fires once on resource start listing missing items, with a pointer to
INSTALLATION/itemsToAdd/. Capped at 5 names + "and N more". Silent when nothing's missing. - A missing-items banner now auto-appears above the configurator tabs when items are missing, with a refresh button. No code change needed in the resource β it's driven entirely by the schema annotations.
- Item-name dropdowns across the admin now show a raw value + amber β when a configured value isn't registered in your inventory's items table. No more silently-blank dropdowns hiding misconfigured fish/bait/tool refs.
#Plumbing / robustness
- "Unknown command" notification spam on key-release fixed. Several keybind-bound commands didn't have a matching release handler, which on some chat resources surfaced as a notification on every key-up. Silenced.
- Every user-facing string in the new gutting UI goes through the localisation system β fully translatable.
- Fixed the live "Accuracy: %%" display rendering as a literal double-percent (locale only escapes
%s, not%%). - NUI messages now no-op cleanly before NUI is ready and after the resource stops β removes a thin source of console spam during boot/stop.
- Removed the old
/fishingGearand/allFishdebug commands and their startup print spam. Remaining debug commands still gate onbasic.debug.
#Lib-side fixes shipping alongside this release
- Release zip now ships
schema.jsonβ fixes the FiveM warning some servers saw on first boot. - ESX bridge permit-purchase crash fixed β
getMoneyagainst a missing account no longer hard-errors, and the bridge now resolvescashβmoneyautomatically so consumers don't have to special-case ESX legacy's account naming. - Inventory lookups overhauled β direct native fast-paths added for
ox_inventory,tgiann-inventory,ak47_inventory,dirk_inventory,qb-core,qbx_coreandes_extended.qs-inventoryandcodem-inventoryuse a cached fallback. Edge case fixed where an inventory's own items table (e.g. qs-inventory) was being shadowed by the framework's β no more "item exists in the inventory but the lookup says it doesn't".
UPDATE 2.0.24 | 08/05/2026
Requires dirk_lib 1.2.42 or newer β the save-permission and smartMerge fixes below live in the lib.
#Live Configurator β store edit modal
- Locations editor reworked. Each location row now shows the actual
vector4(x, y, z, w)underneath three actions: Goto (teleport you there), Set (walk to a spot in-game and stamp it as the location), Delete (with a confirmation modal so accidental clicks don't wipe a setup). - Walk-and-set picking β pressing Set hides the editor, releases your cursor, and shows a small bottom-right card matching the trap-placement UI: walk to the spot, press E to confirm or Backspace to cancel. Editor reappears with the new coords pre-filled and your draft state intact. Screen blur drops while you're picking so the world isn't fuzzy.
- Fish edit modal: Base XP and Base Price moved from Stats/Ecology to General where they belong. Bite Chance is now a clean 0β1 control; the rarity pill (
Common/Legendary/etc.) and rarity spectrum bar moved to sit next to Abundance because that's what determines rarity now. - Fixed Fresh/Salt water-type pills flashing white the first time you open the Ecology tab (framer-motion
initial={false}so the buttons render in their resolved active state, not the default).
#Save flow
- Save now actually saves for masters. The chooser-open path was using one permission rule, the save callback was using another β opens worked, saves silently denied with
NoPermissioneven for full admins. Both now go through the same authoritative check. - Master-group convar takes a comma-separated list with a more forgiving default of
group.admin,admin,command. Whichever your server.cfg actually grants, you'll be in. Override withsetr dirk_lib_master_group <your-perm>if you want to lock it down. - Save success/failure now toasts. Successful save shows a green confirmation; failures show red with copy mapped per error code (
NoPermission,VersionConflict,NotReady, etc.). No more silent F8 errors and assuming it saved.
#Bug fixes
- Store locations weren't persisting deletions. Caused by
lib.table.merge's third argument beingaddDuplicateNumbers, notoverwritelike the calling code assumed β combined with index-based recursion through nested arrays, every "deleted" location came back from defaults on the next load. The smartMerge in dirk_lib now uses a recursive call that respects the "DB is source of truth" rule for nested arrays. - Picker overlay no longer uses
backdrop-filter(poor support inside FiveM's CEF). - Pricing model from 2.0.23 carries forward β fixed
basePricePerUnitper fish + per-store signed-% variance range with live$/kgpreview in the editor. Migrations from older shapes still apply on first 2.0.24 boot for anyone upgrading directly.
UPDATE 2.0.23 | 08/05/2026
#Pricing model β simplified
- Fish base price is now a single fixed
$/kgper fish instead of a[min, max]range. This is the source of truth for what the fish is worth β change it in one place and every market follows. - Stores set a per-fish variance range as signed percentages, e.g.
[-5, +5]for Β±5%,[-20, 0]for "always at-or-below base",[+5, +20]for a premium market that always pays above. Variance is rolled once per server restart inside the configured range and applied on top of the fish's base price. - Live preview in the editor β when editing a fishMarket store, each stock row shows the actual
$/kgrange your variance produces against that fish's base price (e.g.$11.40 β $12.60/kgnext to-5%β¦+5%). No more guessing what a multiplier means. - Removes the old runaway-variance bug (e.g.
+1448%rolls) β variance bounds are explicit and can't roll outside what you set.
#Migration (automatic)
- One-shot migration runs on first start of 2.0.23: existing
basePricePerUnit: [a, b]collapses to its midpoint, existing storeprice: [a, b]multipliers convert tovariance: [(a-1)*100, (b-1)*100]. No manual config edits needed.
#Editor robustness
- FishSection's BasePrice input now defensively coerces array-shape data so a stale NUI session (pre-migration shape still in React store) no longer crashes the Ecology tab with
(e || "").match is not a function.
UPDATE 2.0.22 | 06/05/2026
#Balance
- Catching minigame retuned for new players. Bar width floor doubled (0.10 β 0.20), drain rate softened on starter gear, fill rate base bumped 0.06 β 0.08 β a level-1 player with starter gear can actually win fights now without it feeling impossible.
- Hook strength now level-gated across the full 1-99 range (smallest hooks at L1, biggest at L97). Newbies can't accidentally buy a tuna hook at level 1 and waste casts.
- Sinker weights also level-gated by mass β light shore weights at L1, deepest deep-sea weights at L85.
- Bait depletes when a cast fails. Configurable in admin under
Basic β Fishing β Remove Bait on Fail(% chance). Strike-on-empty no longer triggers the roll β only line snaps, fish escapes, and server-validated misses do. - Spook (zone fatigue) per-catch increment lowered 0.15 β 0.025, so a species takes ~34 catches to fully spook a cell instead of ~6. Tunable via
Basic β Fishing β Spook per Catch.
#Bait & gear access
- Every bait now has a level requirement matched to the lowest fish that wants it (minus 5 levels of "buy ahead" buffer). Beginner baits like bread/corn unlock at L1; nightcrawlers L23, leech/bacon L30, hugecutbait L50, yellowfin tuna chunks L75.
- Tiered store layout: Del Perro & Vespucci serve T1 saltwater (L1-25), Pacific Deepwater & Paleto serve T2 saltwater (L26+). Same split for freshwater between Zancudo and Alamo Lake. Strict no-overlap so advanced shops feel like graduating, not just shopping further.
- Bait digging filters by level too β a level-1 player digging soil no longer accidentally pulls up nightcrawlers they can't use.
- Equipment store sorts unlocked items first; locked items go to the bottom in level order so the next thing to unlock is closest to view.
#Tournaments
- Ten default tournaments seeded across daily/weekly schedules. Times spread across lunch / after-school / prime-evening, levels span beginner-friendly to endgame.
- Mix of free entries, fixed-prize cups, and pot-mode events with entry fees. Mix of any-species and zone-locked.
- New eligibility chip on every tournament card. Green = eligible, amber = some species are above your level, red = locked (zone or all species too high). Hover the chip for a list of what's blocking you. Sign-up button auto-disables on red.
- Tournament cards show proper species and zone labels (e.g. "Atlantic Herring Β· Vinewood Lake") instead of internal IDs.
#Reward UI
- Rarity badge now reflects how rare the species itself is (based on abundance), not how big the individual you caught was. A 50g minnow no longer gets a "Legendary" badge.
- Weight pill is now coloured by how heavy the catch is for its species: dim grey for runts, blue for big, purple for great, gold for trophy (top 5%). Trophy fish also get a soft glow.
#Multiplayer
- Trap-in-hand prop now visible to other players during placement.
- Server-side lock prevents trap-spam from placing two buoys for one item β was a race in the inventory bridge.
- Buoys can now fully sink under boats while still being anchored to their X/Y position. Boat hulls used to push the buoy partially down before bouncing it back up; now they can submerge it cleanly.
- Catch-fish props (the rod-caught fish reeled in, and held fish) are local-only this version. Cross-client sync was visibly desynced; the network broadcast is commented out and re-enabling it is one flag flip when the underlying sync is fixed.
#Bug fixes
- Permit purchase dialog showed durations like "9.00004 hours" because the basic-permit branch was double-converting hours-to-seconds. Now displays correctly.
- Mackerel-instead-of-herring problem at level 1 fixed. Fish more than 10 levels above the player are now excluded from the bite candidate pool entirely; species 1-10 levels above appear at reduced rate. Newbies catch the fish they're trying to catch.
- Some T2 fish (Common Carp, Dungeness Crab, Longnose Gar, Lobster, King Crab, Turtle) had no T2-bait option, forcing T2 players to use T1 bait. Each now has at least one T2 bait that targets it. Lobster + King Crab no longer accept bread.
- Removed
timeToBite/removeBaitOnFailfrom admin where the field was unused;removeBaitOnFailis now actually wired into gameplay.
#Admin / debug
- Eight debug commands (spawnTestFish, fishScale, spawnBuoy, etc.) are now gated behind
basic.debugβ they no longer respond on production servers unless debug mode is on. - Blip display field is now a labelled dropdown instead of a number input β no more guessing what "display 4" means.
#Live nibble strip
- Empty/decoy nibbles no longer emit when there are no real fish candidates at the current depth/bait/level. Silence on the strip is now a reliable "wrong spot or wrong bait" signal. When candidates do exist, decoys mix in alongside real fish so the strip still feels alive.
- Strip pacing now re-evaluates per-blip on the current hook depth β as your hook sinks past shallow species and into deeper fish territory, activity changes naturally.
UPDATE 2.0.0 | 05/05/2026
After 5 years, dirk_fishing has been completely rewritten from the ground up. Honestly, almost nothing from v1 survives β this is a brand new resource that happens to share the same name. Below is the full feature list for v2.
#Core Fishing
- Brand new aim β cast β fight loop. Aim your cast with a live on-screen reticle showing whether the spot is valid, land the throw with a timing minigame, then reel in catches with a Stardew Valleyβstyle bar-catch fight.
- Realistic rod, rope and hook β a physical rope trails from the rod tip to a hook in the water and swings naturally as you move.
- 32 fish species across freshwater and saltwater, each with their own bite rate, fight difficulty, weight range and price.
- Custom 3D model per species β every single fish has its own bespoke prop (streamed via dirk_fishProps), no reused models.
- Rarity system β every catch ranked Common β Legendary based on its weight relative to the species' max.
- Realistic fish sizing β caught fish appear in your hands and in the world at a size that matches their actual weight.
- Cinematic catch camera frames every catch before it hits your inventory.
#Gear & Progression
- Full rod loadout system β build rods with reels, lines, hooks, bait and sinker weights; every setup saves to the rod's item metadata.
- 13 rods, 14 reels, 14 lines, 24 hook sizes, 12 sinker weights, 20+ baits β every item editable live in the configurator.
- RuneScape-style XP curve (1β99) with level-locked gear and bonuses.
- Fishing permits β global and zone-specific permits with expiring card art players can inspect in-hand. Cops with the right job/rank can revoke permits face-to-face.
#World & Exploration
- Fishing zones β draw zones on the map and configure their bite times, fish density, abundance, weight modifiers and per-fish overrides.
- Grid-based fish populations β every player sees the same fish pool in the same water cell, so a productive spot stays productive (and gets fished out).
- Fish Finder tablet item β scans the grid for nearby fish populations and tells you what's biting where.
#Interactive Guidebook
A standalone in-game book item players can open at any time. Six tabs:
- Overview β live dashboard: current XP and level progress, today's daily challenges, recent personal bests.
- Fish Collection β every species in the game, ranked by rarity and unlocked by level. Per-fish: personal best weight, times caught, first-caught date, depth, water type, ideal bait, weight range, base price.
- Equipment Library β full reference for every rod, reel, line, hook, bait and sinker weight: stats, level required.
- Map β interactive Leaflet map of the city with all fishing zones drawn on, your live position, fish-finder readings and zone permit/level info.
- Leaderboards β global and personal top 3 per species, plus a global all-time leaderboard sortable by total caught, total weight, heaviest, unique species and XP.
- Tournaments β placeholder tab for the upcoming tournament system (WIP).
#Daily Challenges
- Random daily objectives that reset every 24h: catch X of a species, hit weight goals, dig N bait, etc.
- Progress tracked live as you play; claim rewards from the guidebook Overview tab.
- Templates and reward tables fully editable in the configurator.
#Traps (Crab Pots)
- Place baited pots in deep enough water and come back later β fully passive trap system.
- Surface buoys bob with the waves naturally so they look part of the sea.
- Rope-pull minigame to haul the trap to the surface, with a cinematic camera while you inspect the haul.
- Hover catches to identify them, then keep or release individually; swap bait without pulling up an empty trap.
- Stale traps auto-expire on a configurable timer so abandoned pots don't litter the map forever.
#Bait & Gutting
- Bait digging β dig for worms, maggots and more across 20+ ground material types; tools have limited uses and dig spots regenerate on a timer.
- Fish gutting β clean caught fish into meat or fillets; yield scales with player skill.
#Stores & Markets
- Equipment shops, fish markets and a dedicated bait market β all via dirk_stores integration.
- Stores and individual stock items can be level-locked so high-tier gear only unlocks once a player has earned the level.
- Fish market prices shift relative to a global rolling base price; each market applies its own multiplier so saltwater and freshwater markets pay differently for the same fish, and the UI shows trend arrows (-15%, +8%, etc.).
- Markets can stock different fish lists, so a freshwater dock won't buy your tuna.
- Configurable models, blip, opening hours (including hours that wrap midnight), payment methods and full stock per store.
#Convenience
- Boat anchoring via keybind or useable item so you don't drift off your hotspot.
- Clip commands (
/record,/clip,/saveclip,/editor) to capture your best catches via Rockstar Editor. - Contextual animations β walking, idling and reeling animations swap automatically while you're fishing.
#Live Script Configurator
- Open in-game with
/dirk_configβ every fish, zone, permit, shop, tool, dig spot and player level can be edited live. - Full undo / redo history.
- Audit log of who changed what and when.
- Player tab β view, search and adjust XP/levels for any player.
- All of the above persisted to a single
dirk_scriptConfigtable; no manual SQL or Lua config edits required, no resource restart.
#Framework & Inventory Support
- Built on dirk_lib β fully framework-agnostic.
- Out-of-the-box bridges for ox_inventory, qb-inventory and ESX.
- Pre-generated item definitions for ox / qb / esx in
INSTALLATION/itemsToAdd/. - 111 item images included in
INSTALLATION/itemImages/.
#Easter Eggs
- Be Jonah. π
UPDATE 1.5.0 | 27/08/2025
Well guys at nearly 4.5 years old dirk_fishing v1 is coming to an end. This will be the final update for you guys before a bigger better version comes along π.
I thought this one needed a good refresh before it's left to mature like a fine wine!
- Updated to dirk_lib instead of dirk-core so should have much better compatibility.
- Removed old ugly store system and converted to be able to use my dirk_stores system for the fishing buy/sell stores.
- Converted controls to dirk_lib style controls.
- Tidied up all the locales into more modern locales/*.json
- Secured the server side because 4.5 years ago I was a bit of an idiot.
- Added any missing or wrongly named icons for inventory.
- Added different rod models.
- Made UI pull from inventory script you use for easier updating of images etc.
- Fixed sensitivity issues with smaller depths of water
