Poaching (Config.Features.Poaching, Config.Poaching): three protected species (sea turtle, dusky grouper,
great white shark; protected = true in data/species.lua, any species can be made protected) bite only in
marine reserves (protected = true zones; two example reserves; the location tool can mark any zone) and only
while minPolice police are on duty. The fish market does not buy them; a hidden black market buyer does, at
blackMarketMultiplier × the market price, in cash (not counted as market earnings). Landing a protected fish, any
fish in a reserve, or selling to the black market can send a dispatch alert with an approximate position
(ps-dispatch, cd_dispatch, rcore_dispatch, core_dispatch, a custom function, or a built-in alert for police on
duty). Police can inspect a nearby player's catch (target option or /fishinspect), confiscate protected fish
and fine them from the bank (never below zero). Protected species never appear in orders, tournaments or events,
are never the market's hot species and a server record on one is not announced. With Features.Poaching off they
sell at the fish market like any other fish. dispatchJobs sets the job list for the dispatch resource (ps-dispatch
filters by job type, e.g. { 'leo' }).
Fishing crews (Config.Features.Crews, Config.Crew): invite a nearby player (target option or
/fishcrew invite; without ox_lib answer with /fishcrew accept or decline), up to 4 members. Members close to
each other (or in the same boat) bite up to 15 % faster and earn up to 30 % more catch XP. A crew gets shared
goals (fish count, total kg or one species, sized by the crew) with a reward for every member who landed a fish for
it, at most 3 per player per hour (a member leaving during the payout does not skip anyone). /fishcrew opens the crew panel; the HUD shows the crew and the goal while
fishing.
Boat model suntrite was a typo and is now suntrap (the GTA model name). If your edited config or
data/locations.json lists suntrite, rename it to suntrap.
New achievements (crew goals 5 / 25 / 100, title Skipper) and a Crew goals top list. The journal marks
protected species.
Location tool: new place type black market; zones get a marine reserve switch.
Database schema v3 (automatic with autoMigrate): profile column crew_goals. Without autoMigrate: run
sql/upgrade-0.6.0.sql once.
New config: Config.Features.Poaching / Crews, Config.Poaching, Config.Crew. Copy them into your config if you
keep an edited one; a missing section keeps the feature off (logged at start). New data: protected species in
data/species.lua, reserves in data/zones.lua, crew achievements in data/achievements.lua — copy them if you keep
edited data files. Run fishinstall again for the three new items.
Tournaments: timed contests started by a schedule (Config.Tournament.schedule, server clock) or by an admin
(/fishtournament start <heaviest|count|weight> <minutes> [species], end, stop). Everyone who lands a fish while
one runs takes part (junk and legendary fish do not count). Live board in the new Tournament tab, your place on
the HUD, start and winner announced to everyone. Prizes per place (Config.Tournament.prizes); winners who are
offline get theirs on their next login. A running tournament survives a restart.
Random events (Config.Events), one at a time every 45–90 minutes: fish frenzy (one zone bites twice as fast,
less junk), migration (a species visits a zone and bites there), golden hour (more catch XP), market rush (one
species sells for double). Announced, zone events flash on the map, the HUD shows a chip while you fish. Admins:
/fishevent start <type> [minutes], stop.
Achievements and titles (data/achievements.lua, 19 shipped): bronze / silver / gold goals for fish, species,
legends, weight, three-star fish, treasure, earnings, orders and tournament wins, with money / XP rewards paid once.
Goals reached before the update unlock on the next login. Some give a title you choose in the new
Achievements tab; it shows on the licence, the top lists and the tournament board.
Top anglers tab: all-time lists for level, fish, heaviest fish, earnings and legends. The journal shows the server
record of every species; beating one is announced (Config.Leaderboard.announceRecords).
Boat pictures in the rental panel (nui/boats/<model>.webp); boats you add keep the drawing.
Database schema v2 (automatic with autoMigrate): new tables ns_fishing_tournaments, ns_fishing_tournament_entries,
ns_fishing_prizes, ns_fishing_achievements; new profile columns title, orders_done, tournament_wins,
three_star_catches. Without autoMigrate: run sql/upgrade-0.5.0.sql once.
New config: Config.Features.Tournaments / Events / Achievements / Leaderboard, Config.Tournament, Config.Events,
Config.Achievements, Config.Leaderboard. Copy them into your config if you keep an edited one; a missing feature
switch counts as off. New data file: data/achievements.lua (escrow ignored, editable).
/fishreset also removes the player's achievements and title.
Character names on the profile are refreshed on login (used by the top lists and tournaments).
New locale keys: tab_tournament, tab_board, tab_achievements, tkind_*, tournament_*, event_*, board_*,
ach_*, achstat_*, title_*, record_announce, badge_server_record, hud_place, ui_* for the new tabs,
err_tournament_*, err_event_*, err_title_locked, admin_*tournament*, admin_*event*.
0.4.0
The menus show the item pictures from images/ (the same ones the inventory uses): fish crates, rod rack,
bait boxes, order slips, journal cards (undiscovered species as a shadow) and the catch tag on the HUD.
Items without a picture (e.g. species you add yourself) keep the drawn silhouette; add images/<item>.png to
give them one. The price chalkboard keeps its chalk drawings.
Photographic materials for every screen (nui/textures/*.webp, about 1.3 MB): wooden shop wall, laminated
licence card, a real slate price board, crate planks for the fish you sell, receipt paper for slips and the catch
tag, pegboard and tackle box compartments in the shop, brass gauges for upgrades, a cork board for orders, field
guide paper for the journal, wet dock planks and a clipboard for boat rental, a brass porthole on the HUD and real
water in the minigame. A missing texture falls back to the previous flat look.
nui/textures/build.py rebuilds the textures from their sources in nui/textures/raw/ (not loaded by the game).
Location tool (/fishlocations, admins): place fish markets, boat docks (seller, boat spawns, return point,
boats on offer) and fishing zones (waters, radius, level, boat rule, map circle) in game on a sea chart. Changes are
saved to data/locations.json and reach every player at once, no restart. Defaults from config.lua /
data/zones.lua can be edited, switched off and restored. Placement: walk to the spot, E places it.
Admin commands: /fishlevel, /fishxp, /fishupgrade, /fishgive (also from the server console).
Markets, docks and zones are now sent by the server; the HUD shows the names of zones placed in game.
New config: Config.Locations (command, file, viewDistance). Copy it into your config if you keep an edited
one; without it the defaults are used. Keep data/locations.json when you update.
Fix (tests): two catch tests replaced math.random for every later test, so one test failed about 1 run in 15.
0.3.1
Fix: fishinstall could not write anything because FiveM blocks a resource from writing into another resource.
Add add_filesystem_permission ns-fishing write ox_inventory to server.cfg (QBCore: one line for qb-core and
one for your inventory) and restart. When the permission is missing, fishinstall now prints the exact line to add
and reports the images once instead of listing every picture. INSTALLATION.md step 3 updated.
0.3.0
Time and weather windows: species can bite only at certain in-game hours and / or in certain weather
(when = { hours = { from, to }, weather = { ... } } in data/species.lua). The server reads the hour and weather
itself (Renewed-Weathersync state bags, else the server clock). Example windows: catfish at night, rainbow trout in
the rain, swordfish at night, Golden Trout at dawn, Ghost Marlin at night during a thunderstorm.
The journal shows the window on every card, even before the first catch. Switch: Config.Features.Windows.
Rod durability (ox_inventory): every rod has a durability (shown by ox_inventory). Landed fish, escapes and snapped
lines wear it; a broken rod cannot fish. Repair it at the market under Shop → Your rods (cost scales with the
rod price and the missing durability). Rods given outside the shop are prepared on first use.
Switch: Config.Features.Durability; tuning: Config.Durability.
Line break: the minigame has a tension gauge. Reeling while the fish is below the bar raises it; full tension
snaps the line and the fish escapes. The line upgrade now also lowers tension. Switch: Config.Features.LineBreak;
tuning: Config.Minigame.tension*.
The HUD shows the durability of the rod in use.
New config: Config.Environment, Config.Durability, Config.Minigame.tensionRate / tensionPerDifficulty / tensionRelief, Config.Features.Windows / Durability / LineBreak. New data field: Data.Upgrades.line.tension.
Copy them into your config if you keep an edited one; missing feature switches count as off.
Automatic installer: fishinstall in the server console adds the missing items to ox_inventory/data/items.lua
(QBCore: qb-core/shared/items.lua) and copies the missing images into the inventory's image folder.
Existing entries are never changed, a backup of the item file is written first, fishinstall check only reports.
On start, ns-fishing warns in the console when its items are not registered in ox_inventory.
Fix: buying or catching an item that is not registered in ox_inventory said "Your inventory is full". It now says
the item is not set up (err_item_not_registered) and the console tells the admin to run fishinstall.
Redesigned every NUI screen around a working harbour:
HUD: porthole with a bobbing float (ripples while waiting, orange alarm on a bite), icons for rod, bait and waters.
The last catch shows as a weigh-in tag with species silhouette, weight, stars, value and XP.
Minigame: water column with depth marks, light rays and bubbles, a netted catch zone, a line tension gauge,
a fight strength indicator and a reel that turns with the bar. The species stays hidden until it is landed.
Market: laminated fishing licence (level seal, XP drawn as a cast line), side navigation with counters,
fish crates with a weigh slip, a chalkboard price board, a rod rack drawn to scale per tier, bait boxes,
tackle upgrade dials, pinned order slips with a delivered stamp, and a field guide journal with weight rulers
and shadow silhouettes for undiscovered species.
Boat rental: marina counter with boat cards and a rental contract slip showing the plate and time left.
25 species silhouettes (nui/icons.js); species added in data/species.lua fall back to a generic fish.
New local fonts (SIL OFL): Barlow Condensed and Caveat.
New locale keys: mg_fight, ui_licence, ui_weigh_slip, ui_board_title, ui_rods, ui_baits, ui_order_no, ui_weight.
Add them to your own translations if you keep edited locale files.
0.1.0
First version.
Fishing sessions with a server-side cast state machine (waiting → biting → hooked → caught / escaped / cancelled),
server-timed bites, reaction window and catch rolls before the minigame.
Stardew Valley style catch minigame (NUI) with five fish behaviours; impossible minigame times are refused and flagged.
9 example zones (freshwater, coast, deep sea with boat rule), 23 species, 5 legendary fish, junk, pearls, treasure chests.