Skip to main content
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

FieldDefaultWhat it does
cfg.cast.wait_min_seconds / wait_max_seconds25 / 40Bite-wait window before any level reduction
cfg.cast.wait_floor_seconds15Hard floor on bite wait after level reduction
cfg.length_skew2.5Catch-length distribution. Higher = trophies are rarer
cfg.level_thresholds30 tiersXP totals per level. Edit to reshape progression
cfg.market.floor / ceiling0.75 / 1.25Pawnshop multiplier bounds
cfg.market.impact / recovery0.10 / 0.05Per-sale push toward the floor; per-tick recovery
cfg.tournament.duration_days7Weekly 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.zones8 zonesZones eligible to host a daily tournament
cfg.treasure.base_chance0.5% treasure-drop chance per catch (before level/bait bonuses)
cfg.treasure.bait_bonus_mult15.0Treasure-chance multiplier when using treasure_bait
cfg.nets.catch_interval1800Seconds between net catch rolls
cfg.nets.max_per_player2Per-player net cap
cfg.boat.rental_price / return_refund500 / 0.25Boat rental price and the fraction refunded on return
cfg.rod.low_durability10Remaining 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.
FileWhat’s in it
shared/fish.luaAll catchable fish: tier, length range, XP, base price, zone preferences
shared/tiers.luaTier display labels, order, icons
shared/zones.luaFishing zones, per-zone boost/blacklist, treasure multiplier
shared/equipment.luaRods, baits, shop items — prices, level gates, boosts
shared/challenges.luaDaily challenge pool — match predicates, rewards, level gates
shared/treasures.luaTreasure 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.