Jixryo Fishing

Fish you can see in the water, a real lure on a real line, a fight with the fish you hooked, the catch moment, a rod that bends and a reel with its own screen, tackle you rig yourself, the Angler app, and the wildlife around the water. The server decides every fish.

Version 0.3.1 Updated See it on its script page

On this page

Jixryo Fishing puts real fish in the water. Every patch of water near you has the server's own fish, species by the water and the time of day, drawn as their own models swimming with the game's fish clips. You cast a real lure on a real line, the fish notice it, follow it and take it or turn away, and the server decides every bite, every fight and every catch. Around the water the game's own animals do what they do, placed by the server so everyone sees the same dolphins, whales, birds, stingrays, deer and coyotes. The resource is jixryo_fishing.

What players get

  • The rod (rod_spin). Use it: the game's own fishing stance, the rod in your hand (players near see it), and the HUD's corner with the rig and the spare lures. X puts it away. It stays out when you wade into the shallows and goes away if you swim or get into a vehicle; a fish on the line is let go.

  • Fish you can see. Every 64 m square of water has the server's own fish: species by the water and the time of day, real sizes, schools, each as wary as its kind. Your game draws the nearest 28 within 55 m, each on the game's fish skeleton (the mako on the shark's) at its own size, under the surface, over the bottom, never up a bank. Everyone near sees the same fish, a caught fish is gone for everyone, and its place fills again after 10 minutes. The heads are built, not painted: a mouth with lips, a tongue and gill arches, see-through fins, glossy eyes. A game that cannot show them right falls back to the game's own fish and says why in the console.

  • The cast. Hold the left mouse: the power swings up and down, let go at the top. Aim with the camera; a ring on the water shows where it lands, red on a bank. The lure flies on an arc, drifts a little with the wind, and lands; the server checks the cast against its own water map and the rod's 55 m range and remembers it.

  • Six lures, each moving its own way: the paddle-tail swimbait sinks, the inline spinner flashes as it comes in, the fire tiger crankbait floats and dives to 2.5 m while reeled, the bone popper sits on top and pops on a twitch, the skirted jig drops to the bottom and hops, the trolling skirt runs on the surface behind a moving boat. Hold to reel (the wheel picks slow, steady or fast); a tap is a twitch. A rocky bottom can snag it: hold to pull, and it comes free or the line breaks and the lure is gone. X reels in. Hold C for the lure cam, under the water behind the lure.

  • The bite and the fight. The server rolls the hook (a J hook holds 80 percent of the time, a circle hook 70, a wary fish less). Then the fight on the line: steer against its runs with A and D, ease off and bow when it jumps, hold it harder than it pulls when it dives for the kelp and rocks or the line rubs and can be cut, lift the rod with the right mouse and drop it while reeling to pump, set the drag on the wheel. The HUD shows a tension gauge from slack to snap, the fish tiring and the line left on the spool; hold C for the fish cam. It ends landed, snapped, cut, thrown or spooled, and offshore a shark takes about one fight in five.

  • Landing. E once the fish is close and tired (a small fish can be swung in fresh): by hand up to 6 lb, the net up to 30 lb, the gaff above, and never before the server's shortest fight for that fish (4 to 240 seconds by its size).

  • The catch moment. As the fish clears the water your game slows to 30 percent for 1.4 seconds and the camera glides to a low shot of you and the fish, held across both hands or, over 30 lb, lying on the deck or the sand with you kneeling beside it. The card shows the species, its length on a ruler, its weight on a dial, where, when and on what, and its badges: a new species, a personal best, a trophy. E keeps it, R lets it go for one and a half times the XP, F opens the photo (the arrows pick three angles, the wheel near or wide, 1 and 2 thumbs up or peace, Enter takes it with a flash and a caption), Backspace skips the moment and keeps it. You have 45 seconds and must stay within 15 m; no choice in time keeps it. A buddy within 4 m gets "Take the photo" and plays the photographer.

  • The fish is its own item with the server's weight (its real weight in the inventory) and length, who caught it, where, the city clock, the lure, its freshness, and a description line by line. Every landed fish goes into your logbook.

  • Tackle. A rod carries its rig on its item: a 3000 spinning reel, 30 lb braid, a swimbait, a J hook and 6 lb of drag to start. A cast ties a lure of the rod's kind on from your pockets or a tackle box when none is tied on; a snag or a broken line loses the one tied on. Four lines (12 lb mono, 20 lb fluoro, 30 and 65 lb braid, each a 300 yard spool that keeps its wear) and two hooks. The tackle panel, off by default, swaps one part at a time and sets the drag in half pounds, the server making every change.

  • The rod bends and the reel has a screen. The rod shows one of four bends by the line's tension, for everyone near through your state bag, and a small browser on the reel's side plate shows line out, tension, drag and depth, with the fight's gauge floating beside it. See the known limits: their models and page are not in this build.

  • The Angler app on Jixryo Phone and Jixryo Tablet: a map with the water shaded by depth, the bait balls, pods and birds your game knows of and your last 50 catches as pins (tap the water for what it is, how deep and who lives there); the conditions (the city clock, the weather, the wind and the bite where you stand); a forecast of the six species' waters and feeding times; and your logbook with each species' count and best, the totals and the last 20.

  • Wildlife, the game's own animals placed by the server in each spot by its water and the city clock, drawn by your game within 150 m of water, rod or not: bait balls with 4 to 9 gulls diving and the shoal churning under them, 2 to 5 cormorants near the coast; dolphin pods of 3 to 12 offshore, feeding over tuna or dorado (the fish are below) and riding the bow of a boat going over 6 m/s within 70 m; a humpback or now and then an orca cruising deep, blowing every 40 to 90 seconds, breaching about one time in three, diving away from a boat speeding at it; a shark's fin; stingrays on the surf's sand that glide off from a wader and sting a runner (12 damage, once per 20 seconds); an osprey over lakes and reservoirs diving every 20 to 60 seconds on fish within 2 m of the top; deer at lakes, reservoirs and streams at dawn and dusk that bolt from a running player within 25 m; coyotes on the beaches at night that howl and keep 15 m away. The HUD calls a sighting once within 160 m and again only after five minutes out of sight.

  • The waters, from the server's own map of the game's water: shore, harbor, kelp, inshore, offshore, deep, the Alamo Sea, reservoirs, lakes, Lago Zancudo, rivers, and piers.

  • The six fish:

    FishWhereUsual weight
    Largemouth basslakes, reservoirs, the swamp1.5 to 7 lb
    Rainbow troutstreams, lakes, reservoirs0.5 to 4 lb
    Calico basskelp, piers, harbors, inshore1 to 5 lb
    Yellowfin tunaoffshore, deep20 to 120 lb
    Doradooffshore8 to 40 lb
    Shortfin makooffshore, deep60 to 400 lb
  • Fishing XP through Jixryo Skills: more for a heavier and a rarer fish, one and a half times for a release. Its perks reach the water: a better hook-up, a stronger line, rarer species and bigger fish in the spots your coming makes.

What staff get

  • /fishcheck, anywhere: the six swimming fish appear in front of you for 20 seconds and the console reports whether the swim clip plays on them, whether drawing at size and the matrix work, whether the game's rope holds, and whether the game's own fish swims as the stand-in, with a summary notification. /fishrod x y z rx ry rz moves the rod in your hand and prints the line for Config.rod. Both touch only your own game, and anyone may run them.
  • Audited through Jixryo Core: fishing.catch, fishing.release, fishing.rig and fishing.too_fast (a landing before the shortest fight).
  • Known limits, from the README: others see your rod and stance, not your lure, line or the fish on your line; nothing of the six lives in the Alamo Sea or the surf yet; most of the game's rivers have no water in its own water map; the biggest tuna and makos spool the 3000 reel; the fish's skins are still the painted pilot skins; the landing moves are the game's own clips; the animals react to players in each game near, so their reactions mostly agree, not exactly.
  • Known limits of this build, from the files on 2026-10-31: the manifest lists web/build/reel.html, tackle.html and angler.html, but web/build holds only game.html and its assets, so the reel's screen, the tackle panel's page and the Angler app's page have nothing to load. stream/ holds the rod, the swimbait, the six fish with their swimming copies and two cooler props; the four bent rods, the other five lures and the tackle box named in the manifest are not there, and shared/models.lua lists no bends or extra lures, so the rod stays straight and every lure is drawn as the swimbait. The README describes slice 1 and the wildlife; the catch moment, the rod and reel, the tackle and the Angler app are documented here from the code.

Install

  1. What it replaces. Nothing by name. The README says the fork's old Fishing Simulator items are untouched.

  2. Order. It depends on ox_lib, oxmysql, qbx_core, ox_inventory and Jixryo Core, and uses Jixryo Skills (XP and perks), Jixryo Phone and Jixryo Tablet (the Angler app), Jixryo MDT (its map tiles for the app's map) and Jixryo HUD (hidden during the photo) when they run.

    server.cfg
    ensure jixryo_core
    ensure ox_inventory
    ensure jixryo_fishing
  3. Items. The Jixryo ox_inventory fork has them in data/items/jixryo_fishing.lua, with its line in data/items/init.lua and the pictures in web/images/: rod_spin (with a Rig button), tackle_box (a container), the six lures (lure_swimbait, lure_spinner, lure_crankbait, lure_popper, lure_jig, lure_skirt), the four lines (line_mono_12, line_fluoro_20, line_braid_30, line_braid_65), the two hooks (hook_j, hook_circle) and the six fish (fish_largemouth_bass, fish_rainbow_trout, fish_calico_bass, fish_yellowfin_tuna, fish_dorado, fish_mako_shark). Upload the fork with this resource.

  4. Upload the whole folder: stream/ (the models and jx_fish_props.ytyp), data/water.lua and data/depth.lua (the water and depth maps, made from the game's files by dev-tools/maps/fishing-water.py; never edit them, run it again), and web/build.

  5. Database. One table, jixryo_fishing_catches (the logbook), makes itself on the first start as one Jixryo Core migration step.

  6. The wildlife needs nothing streamed: every animal is the game's own.

  7. To try it, give yourself the rod and lures with ox_inventory's command, then use the rod.

    /giveitem <your id> rod_spin 1
    /giveitem <your id> lure_swimbait 5
  8. Restart the whole server the first time, so every resource sees the items and every game downloads the models.

How other scripts' calls behave

  • It answers as itself only, and has no exports. Everything goes through its server callbacks, which check the player.
  • qbx_core. CreateUseableItem for the rod; using it tells the angler's game which slot.
  • ox_inventory. The rod's rig lives in its item's metadata (GetSlot, SetMetadata); tackle boxes are ox_inventory containers (GetContainerFromSlot, their items added and removed inside); the rod's Rig button in the inventory fires the local event jixryo_fishing:client:rig.
  • Jixryo Core. It uses the validation, rate limit (limits and locks), player, inventory, skills, audit, clock, HUD and database modules, and PlaySound for the page's sounds.
  • Jixryo Skills. The skill fishing gets the XP; the effects fish.bite, fish.snap, fish.rare and fish.size change the hook-up, the line, and the species and sizes of new fish.
  • Jixryo Phone and Jixryo Tablet. It adds the app jixryo_angler ("Angler", web/build/angler.html, folded and open on the phone) to each that runs, again when either restarts.
  • Jixryo HUD. The photo hides the HUD with its hide export.
  • State bags. fishing:rod (the networked rod's id), fishing:bend (the rod's bend, 0 to 4) and fishing:hold (the fish you hold in the moment: species, length, pose) on the angler, read by every game near.

Its own API

There are no exports. Events:

EventDirectionWhat it carries
jixryo_fishing:client:rodto one playerthe rod item was used, with its slot: out, or away
jixryo_fishing:client:settledto one playerthe server settled a catch nobody chose for: kept, or it swam off
jixryo_fishing:client:flashto two playersa buddy took the photo: the flash, and the caption for the angler
jixryo_fishing:server:photofrom a gamea buddy's photo of an angler with a catch waiting, within 4 m by the server's positions
jixryo_fishing:client:riglocal, from ox_inventorythe rod's Rig button
fishing:rod, fishing:bend, fishing:holdstate bagsthe rod, its bend and the fish held, for everyone near

The game's calls go through 18 server callbacks named jixryo_fishing:server:<name> (the spots, the cast, reeling in, a snag, the strike, a fish lost, landing, keep and release, the rig and its view, set and drag, the wildlife feed, and the Angler app's log, pins, cell and conditions); they are not an API, and the server checks every one.

Commands and keybinds

Command or keyWhoWhat it does
/fishcheckanyone, their own gameThe six fish in front of you for 20 seconds and the report in the console
/fishrod x y z rx ry rzanyone with the rod outMoves the rod in the hand and prints the line for Config.rod
Left mousethe anglerRod out: hold to cast. Lure in: hold to reel, tap to twitch. Fight: reel
Right mousethe anglerFight: rod up; drop it while reeling to pump
Wheelthe anglerRetrieve speed; the drag; the photo's zoom
A and Dthe anglerSteer against the fish's run
C heldthe anglerThe lure cam, or the fish cam in a fight
Ethe anglerLand it when offered; keep it in the moment; take a buddy's photo
Xthe anglerPut the rod away; reel in
Gthe angler, rod outThe tackle panel, with Config.tackle.enabled on
R, F, Backspace in the momentthe anglerRelease, the photo, skip (kept)
Left and Right, 1, 2, Enter in the photothe anglerThe angles, thumbs up, peace, take it

The controls are the game's own, read while the rod is out; no key mapping is registered, so there is nothing to rebind.

Configuration

config.lua:

KeyDefaultWhat it does
itemsrod rod_spin, lure lure_swimbait, box tackle_boxThe items
rigreel_3000, braid_30, lure_swimbait, hook_j, drag 6.0A new rod's rig
rodthe game's fishing stance, the left hand bone, rot 90, 0, 180The rod in hand
castchargeTime 1.1, sweet 0.9, minDistance 6.0, margin 6.0, flight 0.7 to 1.5, windDrift 0.08The cast
luresink 0.45, reel slow 0.45, steady 0.9, fast 1.6, twitch 0.9 m in 0.25 s, lift 0.35, snagChance 0.35, near 3.0The lure in the water
fishbody auto, scale true, radius 55.0, max 28, poll 4000, depthBelow 0.6, aboveBed 0.4, minWater 0.6, turn 3.5The fish you can see and the fall-backs
linedraw rope, colorThe game's rope, or a drawn line
spotssize 64.0, near 96.0, forget 900, refill 600, fished 0.5, count per water (surf 4 to 8 up to kelp 10 to 16)The server's spots
biteafterCast 1.5, corridor 8.0, reach 30.0, hookJ 0.8, hookCircle 0.7, cooldown 20The bite
fightminSeconds 4 to 240, maxMove 60.0, maxMoveBoat 500.0, giveUp 1800The fight's server checks
landhand 6.0, net 30.0, the three landing clipsLanding by weight
momenton true, wait 45, reach 15.0, releaseXp 1.5, kneel 30.0, slowmo 0.3 for 1.4 s, cam glide 1200 and back 900 at 42 degrees, the clips, photo flash 250 ms, caption 4 s, buddy 4.0The catch moment
reelbends 0.2, 0.45, 0.7, 0.9, bagMs 250, draw 30.0, screen trueThe rod's bend and the reel's screen
tackleenabled falseThe tackle panel
hudfight reelThe fight's gauge beside the reel, or docked at the bottom
wildlifegulls true, baitBall 0.08, gullCount 4 to 9, cormorants 2 to 5, shark true, sharkChance 0.18, sharkAfter 0.35 to 0.9, on true, near 150.0, check 3000, reach 400.0, poll 6000, draw sea 250, birds 160, shore 140, pod chance 0.015, 3 to 12, bow 6.0 m/s within 70 m, whale chance 0.006, orca 0.15, spout 40 to 90, breach 0.3, shy 8.0 m/s within 45 m, fin 0.008, rays 1 to 4, sting 12, cooldown 20, osprey 0.04, dive 20 to 60, height 25, deer 0.12, 1 to 4, flee 25, coyotes 0.08, 1 to 2, flee 15, spout jet, calls 160 m, again 300 sThe wildlife
keysthe game's controls with their HUD labelsEvery key above
appphone true, tablet trueThe Angler app

Elsewhere: the species, waters and tackle in shared/species.lua; the fight's rules, the same on both sides, in shared/rules.lua; the water map in data/water.lua; the models' measurements in shared/models.lua, written by dev-tools/props/fishing_props.py.

Security

  • The fish are the server's. Spots, species, sizes and where the fish live are made on the server, and nothing a game says about a fish is believed but the lure's position, which must sit within 8 m of the line from the cast to the angler.
  • A cast needs the rod in that slot and a lure tied on or to tie on, within the rod's range plus 6 m, on water by the server's own map at the surface's height.
  • A strike needs the lure where the cast could have put it, 1.5 seconds after it landed, that fish free and within 30 m, taking that lure's kind, and the hook rolled on the server.
  • Landing needs the server's shortest fight for that fish, the rod still in hand, the angler within 60 m of where they cast (500 m offshore), no shark, and room in the pockets. Only then is the item made, with the server's weight and length. Landing too fast is audited and frees the fish.
  • The choice must come within 45 seconds and 15 m of where it was landed; no choice keeps it, and leaving with a catch waiting lets it go.
  • Lures are lost on the server for a snag or a broken line; a fight open for 30 minutes is let go; a player leaving lets their fish go.
  • The tackle panel swaps one part at a time: the new one out first, the old one back into a box or the pockets, the rig written last, never mid-cast or mid-fight, and the drag within the reel's own.
  • The wildlife is placed by the server from its own water map and the city clock; the feed only reads, is rate limited, works from the server's position for the player and sends only what changed.
  • The app reads only the asking angler's own logbook rows.
  • What a game decides alone is how the fish and animals it shows move, how the fight feels, and a stingray's sting on that player; no item comes from any of it.

Tests

Two suites in dev-tools/luarun/tests, sharing jixryo_fishing.setup.lua (a real database with Jixryo Core's real validate and db modules, the rest stood in, the resource's own water map, anglers on real spots). Both run on 2026-10-31.

SuiteResultWhat it covers
jixryo_fishing.lua19 passed, 0 failedThe water map; a spot's fish; casting; a bite; the fight's checks and the fish item; a fish lost; the shark; walking off, a full pocket, leaving; a snag; the rod and its rig; the fight's rules; long fights; the wildlife each spot gets; a feeding pod; the wildlife feed by the clock; the osprey's view; cormorants; the feed switched off; the default rates.
jixryo_fishing.client.lua29 passed, 11 failedA stand-in player's game against the real server. Passing: the rod out and the fish drawn, loading never holding a frame, fish beside a bank, no lures left, the three fall-backs, the rope never tied and every rope failure ending cleanly, the rod bending, /fishcheck, the tackle panel off and on, and all fourteen wildlife tests. Failing: every test that casts through the game and needs the server to take the cast (the cast, a cast onto a bank, a fish taking the lure, a snapped line, a snag, two fish at the lure, reeling in during a bite, the rod put away mid-fight, wading, the drawn line without a rope, and the shark offshore): in the stand-in game the lure never reaches the water and the cast is not confirmed.
bash
cd dev-tools/luarun
node run.mjs ../../jixryo_scripts/jixryo_fishing tests/jixryo_fishing.lua
node run.mjs ../../jixryo_scripts/jixryo_fishing tests/jixryo_fishing.client.lua

The README records 20 planted bugs for slice 1 and 41 for the wildlife, each caught, a natives audit of 94 natives with five flags that are not errors, and the built HUD passing dev-tools/nui/cdp-game.mjs. It also records all six in-game checks passing on the test server on 2026-10-16.

Check it in game

  1. /fishcheck anywhere: six fish swim in front of you for 20 seconds and the notification says swim, size, matrix, rope and GTA fish are ok. Any [jixryo_fishing] line in F8 says what this game fell back to.
  2. Bring the rod out and look at it in the hand; /fishrod prints the line for Config.rod if it sits wrong.
  3. Off Del Perro Pier: look down at the fish in the water, cast near them, reel slowly past them, hold C for the lure cam. Hook one, fight it, land it; the moment plays, E keeps it, and the item in the inventory carries its weight, length, where and when. Catch another and press R: it swims off and the XP is one and a half times.
  4. Take a boat offshore for tuna and dorado; expect the biggest to spool the reel, and a shark to take about one fight in five.
  5. Raise the wildlife rates in Config.wildlife for a while and restart: gulls diving on a bait ball off the pier, dolphins leaping offshore and riding your bow over 6 m/s, a whale blowing and breaching, a fin, stingrays in the surf (walk up: it glides off; run: a sting), the osprey over the Land Act Reservoir with deer at dawn, coyotes on a beach at night. Put the rates back.
  6. Walk right up to each fish during /fishcheck in daylight: see-through fins, glossy eyes, the mouth's slit, the mako's teeth, the gill cover standing off the head.
  7. Open the Angler app on the phone: the map, the conditions, the forecast and your logbook with the fish you landed.
Next step

Ready to look around?

Browse the suite, or paste your server.cfg and see what each script does to your server.