> For the complete documentation index, see [llms.txt](https://dirkscripts.gitbook.io/dirkscripts-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dirkscripts.gitbook.io/dirkscripts-documentation/resources/dirk-fishing/changelog.md).

# Changelog

## 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: …` and `Weight: …kg` lines, the same way caught fish tooltips do. Tool tooltips gain a `Uses Left: N` line 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_mallet` tool item required for crush species — seeded into both equipment store stocks at $120. Image needs adding manually to `INSTALLATION/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.useMinigame` toggle (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.toolsBreak` toggle (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: N` under 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 `$/kg` preview 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-installItem` schema 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. Old `src/server/install.lua` is gone.
* ESX SQL output now matches the actual ESX legacy `items` table schema (`name, label, weight`) — the previous hand-rolled SQL declared a non-existent `description` column 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 `/fishingGear` and `/allFish` debug commands and their startup print spam. Remaining debug commands still gate on `basic.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** — `getMoney` against a missing account no longer hard-errors, and the bridge now resolves `cash` ↔ `money` automatically 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_core` and `es_extended`. `qs-inventory` and `codem-inventory` use 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 `NoPermission` even 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 with `setr 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 being `addDuplicateNumbers`, not `overwrite` like 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 `basePricePerUnit` per fish + per-store signed-% variance range with live `$/kg` preview 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 `$/kg` per 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 `$/kg` range your variance produces against that fish's base price (e.g. `$11.40 – $12.60/kg` next 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 store `price: [a, b]` multipliers convert to `variance: [(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` / `removeBaitOnFail` from admin where the field was unused; `removeBaitOnFail` is 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_scriptConfig` table; 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 :eyes:.

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

## 1.0.0 - 21/02/2021
