NullSect
Systems nominal

Docs / Fishing / Configuration

Configuration — ns-fishing

Everything a server owner changes stays editable under escrow: config.lua, data/*.lua, locales/*.lua.

config.lua

OptionDefaultDescription
Config.Framework'auto''auto', 'qbox', 'qbcore', 'esx', 'standalone'
Config.Locale'en'Active language; missing keys fall back to Config.FallbackLocale
Config.DebugfalseDebug output (Config.DebugCategories filters: fishing, market, boats) and enables /fishtest
Config.Inventory'auto''auto', 'ox', 'framework'. Weight and stars need ox_inventory
Config.Features.*all trueFishing, Market, Shop, Upgrades, Boats, Collection, Legendary, Treasure, Orders, Windows, Durability, LineBreak, Tournaments, Events, Achievements, Leaderboard, Poaching, Crews
Config.Environment.source'auto'Hour / weather for species windows: 'auto' (weather sync state bags GlobalState.currentTime / weather, else the server clock), 'fixed' (fixedHour, fixedWeather), 'real'
Config.Environment.fallbackWeather'CLEAR'Weather when no weather sync resource publishes one
Config.Durability.max100Durability of a new / repaired rod (1–100; ox_inventory reads higher values as a timestamp)
Config.Durability.catchBase / catchPerDifficulty / legendaryMultiplier1 / 25 / 2Wear per landed fish: catchBase + difficulty / catchPerDifficulty, ×2 for legendaries
Config.Durability.escape / lineBreak1 / 6Wear when the fish gets away / the line snaps
Config.Durability.repairFactor / repairMin0.35 / 25Full repair = rod shop price × factor (scaled by the missing durability), at least repairMin
Config.Jobnot requiredrequired, name, minGrade, requireOnDuty
Config.Progression120 / 1.35 / 50XP for level n → n+1 = xpBase * n ^ xpGrowth, maxLevel
Config.Fishing.command'fish'Starts fishing with your best rod ('' disables)
Config.Fishing.allowNoBaittrueFishing without bait: slower bites, more junk
Config.Fishing.biteDelay / minBiteDelay8-22 / 3 sBite time before bait and hook bonuses, and its floor
Config.Fishing.reactionWindow1600 msTime to strike after the bite
Config.Fishing.latencyGrace600 msNetwork allowance on server-side windows
Config.Fishing.boatDeckRadius7.0Standing this close to a boat counts as "on a boat"
Config.Fishing.castRange18.0Water must be within this range ahead (client check)
Config.Fishing.controls38 / 47 / 73Cast/strike (E), bait (G), stop (X) control ids
Config.Fishing.scenarioWORLD_HUMAN_STAND_FISHINGStanding pose with a rod
Config.Catch.junkChance0.07Base junk chance (bait multiplies it; no bait ×2)
Config.Catch.treasureChance0.025Chest chance per catch (hook upgrade and legendary bait raise it)
Config.Catch.starQuality1.0 / 1.35 / 1.8Price multiplier for 1 / 2 / 3 stars
Config.Catch.firstCatchXp40Journal bonus for a new species
Config.Minigame.*see fileTime limit, start meter, gain, decay, decay per difficulty, anti-cheat tolerance
Config.Minigame.tensionRate / tensionPerDifficulty / tensionRelief0.45 / 0.006 / 0.6Line tension per second while reeling with the fish below the bar, and how fast it relaxes (LineBreak)
Config.Legendary.announcetrueTell everyone when a legendary is caught
Config.Market.account'cash'Sales, shop and upgrade account
Config.Market.updateMinutes30Price tick
Config.Market.volatility / meanReversion / supplyPressure0.08 / 0.2 / 0.006Random step, pull to 1.0, drop per fish sold
Config.Market.min / max0.55 / 1.75Multiplier bounds
Config.Market.hotBonus / hotRotateTicks0.5 / 4"Hot" species bonus and how often it changes
Config.Market.locationsexamples{ id, label, coords = vector4 }, ped model, blip
Config.Orders.*3 per dayQuantity range, 2-star chance, price bonus, XP per fish, max species level
Config.Treasure.lootsee fileWeighted loot: money = { min, max } or item + amount = { min, max }
Config.Boats.account'bank'Rent, deposit and refund account
Config.Boats.rentMinutes60After this the deposit is no longer refunded
Config.Boats.returnRadius25.0Boat and player must be this close to a return point
Config.Boats.docksexamples{ id, label, ped = vector4, spawns = { vector4 }, returnPoint = vector3, boats = { model } }
Config.Boats.models5 boats{ label, price, deposit, minLevel } per model
Config.VehicleKeys.provider'auto'qbx_vehiclekeys, qb-vehiclekeys, none, custom
Config.Fuel.provider'auto'ox_fuel, LegacyFuel, cdn-fuel, ps-fuel, native, custom
Config.ZoneBlipstrueRadius blips for the fishing zones
Config.Locations.command'fishlocations'Command of the in-game location tool (admins)
Config.Locations.file'data/locations.json'Where places set in game are saved
Config.Locations.viewDistance300.0Tool markers are drawn this far around the admin
Config.Tournament.account'bank'Prize money account
Config.Tournament.announce / boardSizetrue / 10Start / winner announcements, places shown on the board
Config.Tournament.schedule2 examples{ day, hour, minute, kind, minutes, species? }. day: 'daily', 'mon' … 'sun' (server clock). kind: 'heaviest' (best single fish), 'count' (most fish), 'weight' (most kg). species: optional id, only that fish counts
Config.Tournament.prizes3 places{ money, xp } per place, 1st first. Offline winners are paid on their next login
Config.Events.intervalMinutes45–90A random event may start this often (one at a time)
Config.Events.minPlayers1Online players needed for a random event
Config.Events.blipsprite 68Map marker of frenzy / migration (radius + flashing blip)
Config.Events.types.frenzy10 minOne zone: biteSpeed ×2, junkMultiplier ×0.5
Config.Events.types.migration15 minA species visits one zone (same kind of water, at most 5 levels above the zone): it can bite there, rarityMultiplier ×4
Config.Events.types.golden_hour10 minCatch XP xpMultiplier ×1.5 for everyone
Config.Events.types.market_rush15 minOne species sells for priceMultiplier ×2
Config.Events.types.*.enabled / weighttrue / see fileSwitch a type off, or change how often it is picked
Config.Achievements.account'bank'Achievement reward account
Config.Leaderboard.size / cacheSeconds10 / 60Rows per list, how often the lists are read from the DB
Config.Leaderboard.announceRecordstrueTell everyone when a species record is beaten
Config.Poaching.policeJobspolice, sheriffJobs that may inspect players and receive the alerts (on duty only)
Config.Poaching.minPolice1Protected species bite only with this many police on duty (0 = always)
Config.Poaching.catchAlertChance / reserveAlertChance / sellAlertChance0.35 / 0.10 / 0.20Alert chance for a landed protected fish / any other fish in a reserve / a black market sale
Config.Poaching.alertOffset / alertCooldown / alertBlipSeconds50–150 m / 120 s / 120 sRandom distance between the real position and the alert; seconds between two alerts about one player; built-in alert duration
Config.Poaching.dispatch'auto''auto' (ps-dispatch, cd_dispatch, rcore_dispatch, core_dispatch, else built-in), one of those names, 'custom' or 'builtin'
Config.Poaching.dispatchJobsnilJobs sent to the dispatch resource (nil = policeJobs). Default ps-dispatch filters by job type: use { 'leo' }
Config.Poaching.customreturns falsefunction(src, coords, kind, message) for dispatch = 'custom'; return true when sent (a false / error falls back to the built-in alert)
Config.Poaching.inspectCommand / inspectDistance'fishinspect' / 3.0Police command that inspects the closest player (also a target option on players)
Config.Poaching.fine1500 / 150 % / 'bank'Fine = max(perFish × fish, value × valuePercent / 100), charged from account, never below zero
Config.Poaching.blackMarketMultiplier / blackMarketRadius / blackMarketPed1.8 / 3.0 / see fileBlack market price = fish market price × multiplier (cash, not counted as market earnings)
Config.Poaching.blackMarkets1 example{ id, label, coords = vector4 }, no map blip; also editable with /fishlocations
Config.Crew.command'fishcrew'Crew panel; /fishcrew invite / accept / decline / leave
Config.Crew.maxSize / inviteDistance / inviteTimeout4 / 5.0 / 60 sCrew size, invite range, invite lifetime
Config.Crew.radius40.0A member this close (or in the same vehicle) counts as near
Config.Crew.biteBonusPerMember / biteBonusMax0.05 / 0.15Bite speed per near member and its cap
Config.Crew.xpBonusPerMember / xpBonusMax0.10 / 0.30Catch XP per near member and its cap
Config.Crew.goal.minutes / cooldownMinutes / goalsPerHour30 / 5 / 3Goal time, pause before the next goal, rewards per player per hour
Config.Crew.goal.kindssee filecount / weight / species with weight (how often) and perMember (goal size per member)
Config.Crew.goal.reward1500 + 250 / member, 400 xpPaid to every member who landed a fish for the goal
Config.Security.*, Config.Admin.*, Config.Notifications.*, Config.Target.*, Config.Standalone.*see fileShared NullSect options

data/species.lua

One entry per catchable: id, item, habitats (fresh / salt / deep), optional zones (only bites there), rarity, minLevel, minRod, kg = { min, max }, price (average weight, one star), xp, difficulty (1–100), behavior (smooth, mixed, dart, sinker, floater), tags (small, bottom, predator, big), legendary, junk, protected, optional when. A protected species bites only in protected zones (with enough police on duty), sells only at a black market and never appears in orders, tournaments or events; it cannot be legendary or junk. Data.Valuables lists fixed-price items (pearls). A new species needs an item and a locale key item_<item>.

when limits when a species bites (with Config.Features.Windows):

when = { hours = { 21, 5 } }                                -- 21:00-05:00 (wraps past midnight, the end hour is excluded)
when = { weather = { 'RAIN', 'THUNDER' } }                  -- GTA weather names
when = { hours = { 21, 5 }, weather = { 'THUNDER' } }       -- both must match

A malformed when skips the species with an error in the console. Weather names shown in the journal come from the locale keys weather_<NAME>.

data/gear.lua

  • Data.Rods: item, tier, price (0 = not sold), minLevel, bar, power, size.
  • Data.Baits: item, price, minLevel, speed, tags = { tag = multiplier }, junk, legendary, treasure.
  • Data.Upgrades: per kind the effect per level and levels = { { price, minLevel } }. line.tension lowers the line tension rate per level.

data/achievements.lua

{ id, stat, goal, tier, reward = { money, xp }, title? }. Name from the locale key ach_<id>, title from title_<title>. stat is one of fish_caught, legendary_caught, treasures_found, total_earnings, biggest_kg, species (discovered), orders_done, tournament_wins, three_star_catches, crew_goals. tier 1 / 2 / 3 shows a bronze / silver / gold medal. Rewards are paid once when the goal is reached, also for goals reached before the achievement existed (checked when the player connects). Invalid entries are skipped with a console error.

data/zones.lua

{ id, type, center = vector3, radius, minLevel, requireBoat, blip, protected }. protected = true makes a marine reserve (protected species live there; any catch there can be reported). The smallest circle containing the player wins. Locale key zone_<id> names the zone. Zones placed with /fishlocations carry their own name.

Admin

CommandWhat it does
/fishreset <player id>Resets progression, upgrades and journal; ends the fishing session
/fishlevel <player id> <level>Sets the fishing level (xp jumps to the start of that level)
/fishxp <player id> <amount>Adds xp
/fishupgrade <player id> <reel|line|hook> <level>Sets a tackle upgrade (0 to its max level)
/fishgive <player id> <item> [amount]Gives an ns-fishing item; rods come with durability, fish with an average weight
/fishlocationsOpens the in-game location tool (see below)
/fishposPrints your vector4 and the zone you stand in
/fishmarket [tick]Prints market multipliers in the server console; tick forces a price step
/fishtestConfig.Debug only: a test session (2 s bite, no bait used, no rewards)
/fishtournament start <heaviest|count|weight> <minutes> [species]Starts a tournament now
/fishtournament end / stopEnds the tournament now with prizes / cancels it without prizes
/fishtournamentShows the running tournament
/fishevent start <frenzy|migration|golden_hour|market_rush> [minutes]Starts an event now
/fishevent stop / /fisheventStops the event / shows it

All need ACE ns-fishing.admin (or framework admin with Config.Admin.useFrameworkAdmin).

/fishlevel, /fishxp, /fishupgrade, /fishgive, /fishtournament and /fishevent also work from the server console. The player must be online. /fishreset also removes the player's achievements and title.

Location tool (/fishlocations)

Place fish markets, boat docks and fishing zones in game. Every change is saved to data/locations.json and used at once by every player: no restart.

  • The panel docks on the right so you still see the world: a sea chart with every zone (to scale), market and dock, a list per kind and a form for the selected place. Click a place on the chart or in the list.
  • New ... where I stand / Move here switches to placement: walk, drive or fly to the spot and face the way the seller (or the boat) should look. E places it, Backspace goes back to the panel.
  • Zones: name, waters (freshwater / coast / deep sea), radius (the ring in the world follows the slider), fishing level, boat-only rule and the map circle.
  • Docks: name, the boats it rents out, the seller, up to 8 boat spawns on the water and the return point. A new dock shows needs setup until it has a spawn and a return point.
  • Markets: name and seller position. Players trade within Config.Market.radius metres.
  • The markets / docks in config.lua and the zones in data/zones.lua stay the defaults. The tool can edit them, switch them off and restore them exactly as shipped. Places added in game are deleted for good.
  • The eye button keeps the markers in the world after the panel is closed.
  • Coordinates always come from your position on the server; the client only says what to place.
  • Legendary fish are bound to zone ids (zones = { ... } in data/species.lua). The form warns when a zone has them; switching such a zone off makes those fish uncatchable until it is restored.
  • Keep data/locations.json when you update ns-fishing: it holds everything placed in game. If the file cannot be read on start it is copied to data/locations.json.broken and the defaults are used.

Hooks for other resources

AddEventHandler('ns-fishing:hook:securityFlag', function(src, reason, detail) end) — every suspicious request (for example minigame_too_fast, cast_id_mismatch, invalid_boat_model).

Cart

Your cart is empty.