Everything cc_fishing exposes for tuning lives in shared/config.lua unless noted. Paths are relative to the resource root. Restart cc_fishing after editing.
NPC placement
cfg.npc. Change the model or coords and restart; blips, peds, and target zones rebuild from this block.
cfg.npc = {
fishing = {
model = 'a_m_y_beach_01',
coords = vector4(1302.95, 4228.7, 33.91, 18.89),
blip_sprite = 780,
blip_color = 3,
blip_scale = 0.60,
},
pawnshop = {
model = 'cs_nervousron',
coords = vector4(-1459.56, -413.97, 35.74, 161.5),
blip_sprite = 500,
blip_color = 5,
blip_scale = 0.60,
},
}
Payment sources
cfg.money. Each entry is 'cash' or 'bank'.
cfg.money = {
buy_equipment = 'bank',
boat_rental = 'bank',
tournament_reward = 'bank',
challenge_reward = 'bank',
sell_treasure = 'cash',
sell_fish = 'cash',
}
Key tunables
| Field | Default | What it does |
|---|
cfg.cast.wait_min_seconds / wait_max_seconds | 25 / 40 | Bite-wait window before any level reduction |
cfg.cast.wait_floor_seconds | 15 | Hard floor on bite wait after level reduction |
cfg.length_skew | 2.5 | Catch-length distribution. Higher = trophies are rarer |
cfg.level_thresholds | 30 tiers | XP totals per level. Edit to reshape progression |
cfg.market.floor / ceiling | 0.75 / 1.25 | Pawnshop multiplier bounds |
cfg.market.impact / recovery | 0.10 / 0.05 | Per-sale push toward the floor; per-tick recovery |
cfg.tournament.duration_days | 7 | Weekly tournament length |
cfg.tournament.prizes | { 10000, 5000, 2500 } | Weekly top-3 prize pool |
cfg.active_tournament.daily_hours | { 12, 20 } | Server-clock start times for daily tournaments |
cfg.active_tournament.zones | 8 zones | Zones eligible to host a daily tournament |
cfg.treasure.base_chance | 0.5 | % treasure-drop chance per catch (before level/bait bonuses) |
cfg.treasure.bait_bonus_mult | 15.0 | Treasure-chance multiplier when using treasure_bait |
cfg.nets.catch_interval | 1800 | Seconds between net catch rolls |
cfg.nets.max_per_player | 2 | Per-player net cap |
cfg.boat.rental_price / return_refund | 500 / 0.25 | Boat rental price and the fraction refunded on return |
cfg.rod.low_durability | 10 | Remaining durability at which the player is warned the rod is wearing out |
Offline weekly-tournament winners are paid on their next login. Offline daily-tournament winners forfeit — daily events are live, in-zone only.
Editable Lua files
Each file is a plain Lua list — add, remove, reorder. Restart cc_fishing after editing.
| File | What’s in it |
|---|
shared/fish.lua | All catchable fish: tier, length range, XP, base price, zone preferences |
shared/tiers.lua | Tier display labels, order, icons |
shared/zones.lua | Fishing zones, per-zone boost/blacklist, treasure multiplier |
shared/equipment.lua | Rods, baits, shop items — prices, level gates, boosts |
shared/challenges.lua | Daily challenge pool — match predicates, rewards, level gates |
shared/treasures.lua | Treasure loot tables and per-tier safe payouts |
These files are not escrow-locked, but renaming a fish or item id means also renaming its inventory item (see installation). Keep the ids in sync.
Treasure minigame
Cracking a sunken safe runs a minigame defined in client/minigames.lua (escrow-ignored). It returns true on success, false on fail/cancel — swap the body for anything with that contract and nothing else changes.
By default it’s the ox_lib skill check, so there’s no extra dependency out of the box:
treasure_safe = function()
return lib.skillCheck(cfg.treasure.safe_difficulty or 'medium')
end,
cfg.treasure.safe_difficulty ('easy' | 'medium' | 'hard') feeds the check. For a longer, multi-stage crack, pass an array — e.g. lib.skillCheck({ 'easy', 'easy', 'hard' }).
To use the cc_minigames safe-cracker instead, swap the body (this needs cc_minigames running):
treasure_safe = function()
return exports.cc_minigames:Safe({
difficulty = cfg.treasure.safe_difficulty or 'medium',
variant = 'bare',
})
end,
Or use any other cc_minigames export — see the minigames reference.