Setup and operating reference for 0.4.3, covering the 129-fish catalogue, Java/Bedrock resources, commands, configuration, economy, and saved data. For player controls and recipes, use the Player Wiki. Species rules and base prices are in the Fish Roster.
Requirements and installation
This build targets Paper 26.3 and Java 25. Packforge supplies the Java artwork; Geyser needs separate Bedrock resources and mappings. Native touch menus use GrimsClientChecker and Floodgate on the Paper backend. Vault is optional when using internal Fishing Coins. PyroFishing is not required.
Use the complete GrimsNillaFishin-Test-0.4.3.zip bundle:
- Stop the server. For an upgrade, back up worlds and the entire
plugins/GrimsNillaFishin/folder together. - Replace the old plugin JAR with
GrimsNillaFishin-0.4.3.jarinplugins/. Keep existing configuration and saved data. - Install the bundle’s
grims_nilla_fishincontent folder with Packforge. - Install the Bedrock pack and both mapping files in the running Geyser instance, as shown below.
- Start the server, run
/pf zip, and serve the rebuilt combined Java pack through your Packforge host. Restart Geyser and reconnect clients to load the Bedrock update. - Review the new defaults and run the acceptance checks below before releasing the update to players.
Geyser/packs/GrimsNillaFishin-Bedrock-0.4.3.mcpack
Geyser/custom_mappings/grims_nilla_fishin.json
Geyser/custom_mappings/grims_nilla_fishin_blocks.json
Use the folders of the Geyser instance actually serving players, including on proxy setups. Enable Geyser custom content as described in the installation guide. Remove superseded GNF Bedrock packs with the same pack UUID instead of loading multiple versions together.
The separate Java ZIP is for standalone visual checks. Production Packforge installations should serve their combined pack. Create gameplay items through GNF recipes, shop, or /gnf give; artwork-only items are not a substitute for plugin-tagged equipment.
Mobile, controller, and trap presentation
GrimsClientChecker selects the menu layout from the player's input preference. Touch uses native forms for Shop, Skills, Diary, and traps; keyboard/mouse and controller normally use inventory menus. Mobile hardware alone does not force touch layout. Install Floodgate and GrimsClientChecker on the Paper backend; proxy installations also need Floodgate data forwarding.
The Sushi Station and Sushi Cook Book stay chest menus on touch, in a seven-column copy titled — Mobile (the Crops Stove and Cook Book pattern). They need only GrimsClientChecker; with Packforge installed its crossplay service decides first, exactly as for trap forms.
Traps use a vanilla barrel appearance until the matching custom artwork is available to players. Check that the content is loaded and the pack is being served before diagnosing a trap appearance problem.
Fish and tackle menu icons use 16×16 artwork. Tackle held in the world or attached to rods/hooks uses the 32×32 artwork. Nightcrawler uses its cup for inventory and its single-worm sprite for the hook. Bedrock's ordinary dropped tackle item uses its inventory icon.
Commands and permissions
/gnf is the short alias for /nillafishin. Brackets mean optional arguments; replace angle-bracket placeholders with actual values.
| Permission | Default | Access |
|---|---|---|
grimsnillafishin.use | Everyone | Custom fishing, fishing hub, and traps |
grimsnillafishin.admin | Operators | Give/XP/status commands, admin rod, and managing another player's trap |
Admin trap access also requires normal use permission. /gnf list is public.
Player commands
| Command | Purpose |
|---|---|
/gnf menu | Open Shop, Skills, and Fishing Diary |
/gnf list | List custom fish IDs grouped by rarity |
The command-free shortcut is to hold a fishing rod, crouch, and use it before casting. Reeling an existing line does not open the menu.
Admin commands
| Command | Purpose |
|---|---|
/gnf give copper_rod [amount] [player] | Give a Tier 1 rod; amount must be 1 |
/gnf give iron_rod [amount] [player] | Give a Tier 2 rod; amount must be 1 |
/gnf give adminrod [player] | Give an unrestricted testing rod |
/gnf give allfish [page] [player] | Give catalogue page 1–8; up to 18 test specimens per page |
/gnf give <fish_id> [amount] [player] | Give a specific test fish |
/gnf give alltackle [amount] [player] | Give that amount of each of the seven tackle types |
/gnf give <tackle_id> [amount] [player] | Give a specific bait or lure |
/gnf give <trap_id> [amount] [player] | Give a trap of the selected capacity |
/gnf give sushi_station [amount] [player] | Give Sushi Station items |
/gnf give alldishes [amount] [player] | Give that amount of each of the thirty sushi dishes |
/gnf give <dish_id> [amount] [player] | Give a specific sushi dish |
/gnf xp <amount> [player] | Add Fishing XP; 1–1,000,000 per grant, with 0 adding nothing |
/gnf status | Inspect shared stock in the issuing player's current 32×32 area |
Normal give amounts are 1–64; rods require exactly 1. Omitted amounts and pages default to 1, and omitted targets default to the issuing player. Include the amount when targeting another player: /gnf give iron_rod 1 PlayerName. Console must name an online target. /gnf status is player-only.
For allfish, the number is a page, not a quantity. Pages 1–7 contain 18 fish; page 8 contains 3. Clear inventory space between pages. If the complete grant will not fit, nothing is given.
| Item group | IDs |
|---|---|
| Bait | nightcrawler_bait, glow_grub_bait, magma_grub_bait |
| Lures | feather_spinner_lure, bobber_popper_lure, minnow_spoon_lure, void_eye_lure |
| Traps | trap_3, trap_6, trap_9, trap_12, trap_15, trap_18 |
| Short aliases | rod = copper rod; bait = Nightcrawler; trap = three-slot trap; admin_rod = admin rod |
There is no reload, skill-reset, or stock-reset command in this build. Restart after configuration changes.
What the admin rod tests
The admin rod randomly selects equally from all 129 species in any fishable water, including the four realm species that ordinary water fishing never produces. It does not fish the void or lava; those loops ignore it. It bypasses rod tiers, habitat, time/weather/moon conditions, and shared population limits. Repeated catches can repeat a species; it is not a sequential catalogue tour.
Its catches and command-given fish are marked as test items and provide no Fishing XP, diary credit, or shop payment. Admin rod catches also give no vanilla XP. The rod requires admin permission to use and cannot be crafted into normal equipment.
Use this rod to inspect artwork and catch delivery. Use ordinary rods and naturally caught fish to test biome restrictions, stock, XP, diary records, and sales.
Fishing and progression rules
| Rod | Eligible custom rarities | Ordinary vanilla fish |
|---|---|---|
| Basic vanilla rod | Common | Retained |
| Copper | Common, Uncommon, Rare | Retained |
| Iron | Uncommon through Mythic | Never returned |
Epic, Legendary, and Mythic require equipped bait or a lure. Normal junk and treasure results remain available on all three player rod tiers. Iron attempts an eligible custom replacement whenever vanilla produces an ordinary fish; empty stock or no eligible species can produce no fish instead.
Eligibility uses the hook or trap location. All nine ocean biome variants are covered. Night is tick 13000 through 22999, and full moon is phase zero. The roster lists every species' exact habitat and conditions.
The catalogue contains 23 Common, 28 Uncommon, 28 Rare, 26 Epic, 16 Legendary, and 8 Mythic species. Rarity weighting is relative to what is currently eligible:
| Source | Relative rarity weights |
|---|---|
| Copper | Common 70, Uncommon 25, Rare 5 |
| Iron | Uncommon 72, Rare 22, Epic 5, Legendary 0.9, Mythic 0.1 |
| Traps | Common 80, Uncommon 20 |
Matching tackle triples a species' selection weight within its eligible rarity. These weights are not guaranteed percentages across all waters. Species definitions, weight ranges, and rarity weights are part of this build; the supplied catalogue JSON is a reference, not a runtime configuration file.
Realm fishing: the void and lava
Four species live where a vanilla bobber cannot fish at all, so the plugin runs its own bite loop for them instead of waiting on PlayerFishEvent. Water fishing is untouched, and these four are filtered out of every water cast and every trap — including water a player carries into the End.
| Realm | Species | Required tackle | Where the bobber must sit |
|---|---|---|---|
| The End's void | Chorus Eel (Legendary), Void Monarch (Mythic) | void_eye_lure | Open air in an End biome with no solid block anywhere in the column below it |
| Nether lava | Basalt Ripjaw (Legendary), Magmaheart (Mythic) | magma_grub_bait | A still lava source block, or air directly above one, in a Nether biome |
Both realms need a Tier 2 iron rod, because Legendary and Mythic require one. A copper rod reports a snapped line instead of a catch. Realm tackle is what starts the loop: no other bait or lure is tracked, and VOIDBORN/INFERNAL species ignore every other tackle even if the rod reaches the right spot.
A tracked bobber is checked every two ticks. When it reaches its realm the plugin anchors it — gravity off, velocity cleared — so a void cast hangs at the drop instead of falling out of the world, and emits particles and a sound about once a second. After the configured bite window, exactly one bite resolves: the fish goes into the player's inventory (overflow drops at their feet), the bobber is reeled in, and bait or lure consumption uses the normal tackle.* chances. If the bobber leaves its realm before then, it resumes falling and its progress resets.
Realm catches draw on the same shared 32×32 population as rods and traps, and record diary, XP and sale value like any other active catch. Because the loop is server-side, no resource pack or client support is involved; vanilla clients see an ordinary bobber. Set void-fishing.enabled or lava-fishing.enabled to false to remove a realm entirely, which also removes the only route to its two species.
Skills, catches, and crafting
Fishing starts at level 1 with no points. Each subsequent level grants one point. Baiting Hands, Trapcraft, Trophy Angler, and Water Reading each have five ranks. Skill spending requires confirmation.
Only active catches award Fishing XP. The first active catch bonus still applies if the player previously caught that species in a trap. Traps record diary catches but award no Fishing XP. Trading and shop transactions do not award XP.
Trapcraft unlocks crafting capacities 6, 9, 12, 15, and 18; the basic trap holds 3 catches. Finished traps can be traded and used without that crafting rank. Bigger traps add storage without changing rarity, population, or attempt frequency. Recipes and equipment controls are in the Player Wiki. Automated Crafter blocks cannot create the player-gated equipment recipes.
Sushi Station
Grims Crops refuses Rare-and-above fish and the whole JELLY family in its cooking groups on purpose, which leaves 76 of the 129 catches with no destination. The Sushi Station is GNF's own answer, and it runs entirely inside this plugin.
Placing and saving stations
The Sushi Station uses the Crops resource pack for its placed appearance. Keep the supplied Crops pack installed for the correct model. Station locations are saved in plugins/GrimsNillaFishin/stations.yml; include that file in backups. Right-click a station to open it. Breaking it drops the station item. Craft one with a barrel surrounded by four dried kelp, or use /gnf give sushi_station.
Ingredients, and why Grims Crops is optional
Recipes match on an item's item_model, never on another plugin's private tag. GNF reads the model key off the stack — gcrops:rice, grims_nilla_fishin:crown_tuna — and decides for itself.
Grims Crops is therefore never contacted and never required, and no softdepend is declared. 26 of the 30 dishes ask for at least one Crops ingredient — seven different ones: butter, chili_pepper, cooking_oil, grapes, lettuce, rice, tomato — and only the four jellos are made from vanilla items and fish alone. On a server without Crops those model keys never appear, so those dishes cannot be assembled. They stay listed in the cook book deliberately, so players can see what the station would do rather than silently getting a shorter book.
Matching rules
Matching is exact cover: every occupied slot must be claimed by the recipe, so one spare item in the grid means no dish. That is what keeps two recipes from ever claiming the same grid. Slot position is never considered, and no dish has a cook timer or needs fuel — everything here is prepared instantly.
Thirty dishes ship: six tier dishes taking any fish of a rarity, twenty naming one fish each, and four jellyfish jellos. Nutrition runs 4–13 and saturation 3–14, always a clear step above the raw fish the dish is made from.
Assets
The 30 Sushi dishes, Sushi Station item and Sushi Cook Book are included in the main Java and Bedrock packs and their mappings. Install the matching main packs; separate legacy Sushi packs are not needed.
Geyser gets a definition for every dish (with its food and eating time, so Bedrock players can eat it), for the cook book, and for the station item under minecraft:barrel. The placed station's block override is in the Grims Crops Geyser mappings, with its art in the Crops packs.
Configuration reference
Edit plugins/GrimsNillaFishin/config.yml, then restart. For upgrades, compare against the bundle's defaults/config.yml and merge desired settings into the existing configuration.
| Key | Default | Meaning |
|---|---|---|
fishing.custom-fish-chance | 0.65 | Basic/copper replacement chance after an ordinary vanilla fish result; equipped tackle adds 0.05 |
bait-drops.mud-nightcrawler-percent | 10.0 | Percent chance for broken mud to also drop one Nightcrawler Bait |
bait-drops.soul-glow-grub-percent | 5.0 | Percent chance for broken soul sand or soul soil to also drop one Glow Grub Bait |
bait-drops.magma-grub-percent | 8.0 | Percent chance for a broken magma block to also drop one Magma Grub Bait |
void-fishing.enabled | true | Allow casts into the End's void; disabling it removes the only route to void species |
void-fishing.min-bite-seconds | 10.0 | Shortest time the lure must hang in the void before its one bite |
void-fishing.max-bite-seconds | 24.0 | Longest such wait; must be at least the minimum |
lava-fishing.enabled | true | Allow Nether lava casts; disabling it removes the only route to infernal species |
lava-fishing.min-bite-seconds | 8.0 | Shortest time a heat-proof bait must sit in still lava before its one bite |
lava-fishing.max-bite-seconds | 20.0 | Longest such wait; must be at least the minimum |
population.capacity | 4 | Shared custom fish per fixed 32×32 column |
population.replenish-loaded-seconds | 120 | Loaded time required to restore one fish |
population.reserved-for-rods | 1 | Final stock unavailable to traps |
traps.attempt-loaded-seconds | 30 | One trap attempt per area after this much loaded time |
traps.catch-chance | 0.50 | Catch outcome chance |
traps.bait-loss-chance | 0.25 | Separate bait-loss outcome chance; remainder does nothing |
tackle.bait-use-chance | 0.75 | Bite consumes one bait at this chance |
tackle.lure-loss-chance | 0.04 | Bite loses the lure at this chance |
tackle.snag-loss-chance | 0.20 | Snag loss chance if the cast has not already resolved a bite |
tackle.bobber-visual | true | Show tackle at the hook |
tackle.hook-offset-x/y/z | 0.0 / -0.10 / 0.0 | Three separate hook-display offset keys |
progression.max-level | 21 | Fishing level cap |
progression.base-xp | 100 | First level-up cost |
progression.growth-xp | 25 | Additional cost for each subsequent level-up |
progression.first-species-xp | 25 | Bonus for the first active catch of each species |
progression.xp defaults are vanilla: 5, common: 10, uncommon: 15, rare: 25, epic: 40, legendary: 60, and mythic: 90.
Fishing, trap, and tackle probability values use 0–1. Natural bait-drop keys are percentages from 0–100, are safely clamped to that range, and use 0 to disable a source. Natural bait is an extra tagged drop, does not replace vanilla block drops, and is not awarded in Creative. Trap catch and bait-loss chances must total at most 1. Baiting Hands reduces loss chances by 8% per rank, to a maximum 40% reduction; for example, 75% becomes 45%. A cast resolves tackle loss once, and an uneventful cast/reel costs nothing.
The old starter-storage-slots, tier-1-uncommon-chance, and bobber-offset-x/y options do not control the new systems.
Trap operation
All rods and traps in an area share its custom population. Only one trap attempts a catch per area interval, regardless of trap count. Selection balances eligible owners before selecting one of their traps. Full, unbaited, dry, and unloaded traps cannot produce catches, and unloaded time does not accumulate catch-up attempts.
Traps accept either water bait, but no lures and no realm bait, and target eligible local Common/Uncommon species. Magma Grub Bait is refused with a message, including through "Add all bait", since a water trap would consume it against a pool it can never match. The owner's Baiting Hands rank can conserve bait. Trap weight rolls receive matching-bait benefits, but not Trophy Angler's active-cast bonus.
Placement requires source water and appropriate nearby source water for operation. Open-water placement aims roughly two blocks forward and respects obstructions. Menus require the owner or an admin to remain within eight blocks. Pickup returns the trap, bait, and catches only when everything fits. Hoppers, pistons, explosions, and ordinary breaking are blocked from moving or destroying registered traps.
Economy and fish values
| Key | Default | Purpose |
|---|---|---|
economy.mode | auto | Use a registered Vault economy if available; otherwise internal coins |
economy.currency-name | Fishing Coins | Internal currency label |
economy.starting-balance | 0 | Starting internal balance |
shop.max-weight-multiplier | 2.0 | Maximum weighted-fish price relative to its base |
shop.prices | Empty | Optional per-species base-price overrides, keyed by fish ID |
Set the mode to internal to force local coins, or vault to require a registered Vault provider. Required Vault mode fails startup when no provider is available. Changing modes does not convert balances between economies.
Default purchase prices under shop.buy-prices are Nightcrawler 1, Glow Grub 2, Magma Grub 4, Feather Spinner 30, Bobber Popper 35, Minnow Spoon 40, and Void Eye 140. Use the tackle IDs listed above as keys. Under shop.vanilla-prices, plain raw cod, salmon, tropical_fish, and pufferfish sell for 1, 1.5, 2, and 2 respectively.
Natural custom fish sell for:
species base price × min(fish weight ÷ species ideal weight, shop.max-weight-multiplier)
Prices are rounded to currency precision. Lighter fish can pay below base value. Older unweighted custom fish use base value. Test fish cannot be sold, and duplicate copies of an already sold unique catch cannot be sold again.
Sales inspect the player's main storage inventory, excluding armor, offhand, and cursor items. Individual-slot and bulk sales show a preview and require confirmation. The plugin rechecks items and prices before payment. Full inventories block purchases without charging, and a failed sale payment restores the fish. Test transactions against the actual economy provider, including Bedrock accounts.
Saved data, upgrades, and recovery
File in plugins/GrimsNillaFishin/ | Contents |
|---|---|
config.yml | Server settings |
populations.yml | Shared fish stock and loaded-area clocks |
traps.yml | Trap identities, owners, locations, capacities, bait, and catches |
players.db | SQLite data for Fishing XP, skills, internal balances, diary, and recorded/sold catch IDs |
Population and trap data save every ten seconds and on normal shutdown. Player changes commit through SQLite transactions; the driver is bundled. Stop the server before backing up the whole plugin folder and worlds together. SQLite may have players.db-wal and players.db-shm sidecar files while running; do not copy only the main database during live operation.
An existing players.yml can be imported once and is retained afterward. Existing Tier 1 rods and tagged seed bait remain recognized. Registered legacy barrel/chorus traps migrate when loaded, preserving owners and contents; old four-slot traps round up to six. Unregistered decorative blocks are not migrated.
For rollback, restore the matching worlds, plugin data, JAR, and packs from the same backup. An abrupt crash can revert the latest world or trap/population checkpoint; those files and the database are not one atomic save. Malformed trap/population data can stop startup to protect saved state: inspect the error and restore a valid backup instead of deleting records to force startup.
Acceptance checks
- Install the matching JAR, pack content, Bedrock pack, and both JSON mappings. Check server startup for errors.
- Give all eight fish pages in batches and inspect inventory/drop artwork on Java and Bedrock. Use the admin rod to inspect random catches.
- Switch to normal rods. Verify copper retains vanilla fish, iron excludes vanilla/Common fish, high rarities need tackle, and habitat/conditions apply.
- Attach, swap, and remove tackle through inventory and crafting. Check bite/snags, conservation, and removal of consumed tackle on both clients.
- Crouch-use an uncast rod to open the hub. Test touch forms separately from keyboard/controller inventory menus, including skill and sale confirmations.
- Catch a natural fish, inspect its weight and diary record, gain/spend skill points, then test individual and bulk sales. Verify test fish cannot earn rewards.
- Craft each trap tier with the correct rank. Test source-water placement, swimming placement, bait switching, collection, pickup, shared stock, and unloading.
- Cast into the End's void and into Nether lava with an iron rod and the matching tackle. Confirm the bobber anchors, one bite resolves inside the configured window, the catch and its diary/XP/sale behavior match a water catch, and neither species ever appears in water or a trap.
- Restart and verify saved skills, diary, balances, trap contents, and capacities.
- Craft a Sushi Station (it is in the recipe book) or
/gnf give sushi_station, place it, and confirm it shows as a sushi counter with the Crops 0.15.4 pack, right-click opens the station, redstone, pistons and a block placed under it do not change it, and breaking it returns the station. Prepare one tier dish and one named dish; every dish and both cook book buttons show their art on Java and Bedrock.
The gameplay checklist and visual checklist provide deeper coverage. The 0.2.3 presentation baseline was confirmed in game; 0.4.3 still requires live server, Java/Bedrock, touch/controller, and protection-plugin acceptance testing. Automated validation does not replace those checks.
Troubleshooting
| Symptom | Check |
|---|---|
| Java items have the wrong artwork | Confirm the matching pack content was installed, /pf zip rebuilt the combined pack, and the client accepted it. |
| Bedrock rods or traps look wrong | Check the active Geyser instance for the matching pack and both JSONs. Restart Geyser and reconnect; remove duplicate GNF pack versions. |
| Trap is an invisible collision block | Check cage assets and resource-pack acceptance. Recover registered traps through their menu. |
| Trap looks like a barrel | Confirm that Packforge has loaded the content and is serving the matching pack. The barrel is the fallback appearance. |
| Mobile receives an inventory menu | Check GrimsClientChecker's input preference, Floodgate on the backend, and proxy forwarding. A controller preference intentionally uses inventory menus. |
| Iron rod sometimes returns no fish | Check hook-location eligibility, required tackle/conditions, and shared stock. The admin rod bypasses these checks and cannot verify them. |
| A void or lava cast never bites | Check the rod tier, the realm tackle, void-fishing.enabled / lava-fishing.enabled, and that the bobber is genuinely in its realm: an open column for the void, a still source block for lava. |
| A void bobber falls out of the world | Something solid sits below the cast, so the spot never qualified and the bobber was never anchored. Cast off a clear island edge. |
| Realm species appear in water | Report it: water casts and traps filter every realm species out by habitat, so this would be a rules bug, not configuration. |
| Many traps catch slowly | Attempts and stock are shared by area. Check bait, water, capacity, loaded chunks, and /gnf status near the traps. |
| Skill or sale test gives no reward | Use naturally caught fish and a normal rod. Admin specimens and admin catches are excluded. |
| A recipe produces no output | Check the previous rod/trap tier, Trapcraft rank, ordinary ingredients, and that the rod is not currently cast. |
| Vault mode will not start | Confirm Vault and a registered economy provider are loaded, or choose internal deliberately. |
| Data fails to load | Keep the failing files, read the server error, and restore a consistent backup. Do not replace saved data with empty files. |
| The station is a plain barrel | It was placed by 0.4.2 or earlier. Break it and place a new station. |
| A dish in the book cannot be made | Its ingredients are marked * and need Grims Crops. This is expected without that plugin. |
| Dish artwork is missing | Install and serve the matching main Java and Bedrock packs. Remove separate legacy Sushi packs, then reconnect the affected client. |
| The placed station looks like a note block | Serve the Grims Crops 0.15.4 (or later) packs; the station's block art is there. |
| Nothing appears in the result slot | Matching is exact cover: one spare item in the grid blocks the dish. |