AbyssalFishing

A complete fishing system: 155 fish with their own length and weight, a tension minigame when one bites, entropy, levels, skills, augments, baits, deliveries, tournaments, tides, hotspots, an auction house, a bounty board, a bait station, aquariums and guilds. Free, no premium edition.

1.5.0Version
1.16 – 26.2Minecraft
Spigot · PaperServer
NothingRequires
ES·EN·FR·ZHLanguages
155Fish

What makes it different

Almost every fishing plugin does the same thing: it rolls a fish from a list and hands it to you. Here every catch is unique — it has its own length in centimetres and weight in kilos, drawn from a curve biased towards the small end. That is what makes a server record actually cost something, what makes the scales worth opening, and what makes an auction where you do not sell "a salmon" but your 47.3 cm salmon.

The usualAbyssalFishing
One language for the whole serverPer-player language with /fish lang. Menus, fish lore and tournament announcements, each in their own.
It bites and it is caughtTension minigame: a bar with a green zone and a marker. The zone narrows with rarity.
Fixed pricesDynamic market: selling a lot of one species sinks its price, and it recovers on its own.
6 rarities hardcodedAs many as you want in tiers.yml: add, remove or rename.
The codex says what you are missingThe codex says where to look: biome, time, weather, moon, bait and level.
1.20+ and that is it1.16 through 26.2 with the same jar. Compiled to Java 8 so it also starts on old servers.

Everything it brings

  • 155 fish across 6 rarities, with biome, time, weather, moon phase, height, level and bait as conditions. 18 of them are caught in Nether lava.
  • Length, weight and quality per catch, with personal and server records.
  • Tension minigame, optional, switchable per player and per server.
  • Entropy (its own currency), levels, a skill tree, rod augments and baits.
  • Fish bag, codex, shop with a dynamic market, gutting and scales.
  • Deliveries that generate themselves, tournaments in 6 flavours, and personal and global boosters.
  • Totems, trophy cases with a floating sign, rotating hotspots and global tides.
  • Migrations: fish change biome every few world days.
  • Player auction house and guilds with shared progress.
  • Mailbox: nothing is lost for being offline.
  • PlaceholderAPI with over 100 placeholders, optional Vault and WorldGuard.
Actually free. No premium edition, no locked features, no "unlock this for $9.99". Everything in this wiki is in the jar you download.

Installation

  1. Drop the jar into plugins/Works on Spigot and Paper, 1.16 through 26.2. It needs neither Vault nor anything else to run.
  2. Restart the serverIt creates config.yml, the fish catalogues and the four languages. Do not use /reload: restart.
  3. (Optional) Vault and PlaceholderAPIWith Vault fish sell for money; without it, for entropy. With PlaceholderAPI you get the placeholders for your scoreboard.

What gets created

plugins/AbyssalFishing/ # general settings config.yml # catalogue tiers.yml rarities fish.yml 54 fish fish/oceans.yml 41 saltwater fish/inland.yml 35 freshwater fish/depths.yml 25 Nether, End and the deep # systems augments.yml baits.yml skills.yml deliveries.yml tournaments.yml totems.yml boosters.yml rods.yml tides.yml hotspots.yml migrations.yml trophies.yml auction.yml guilds.yml bounties.yml aquariums.yml mcmmo.yml # languages lang/en.yml lang/es.yml lang/fr.yml lang/zh.yml
Updating deletes nothing. Every file merges itself: a new version adds the new options and the new fish and keeps everything you changed. You never need to wipe the folder.

Storage

SQLite by default, which needs nothing. There is also MySQL (for several servers) and YAML (one file per player). You switch it in config.yml and touch nothing else.

storage: # SQLITE (recommended), MYSQL or YAML type: SQLITE table-prefix: 'af_' autosave-minutes: 5 sqlite: file: data.db mysql: host: localhost port: 3306 database: minecraft user: root password: '' ssl: false
Modern servers no longer bundle the MySQL driver. If you pick MYSQL and it is missing, the plugin says so plainly in console and falls back to YAML instead of starting broken.

How fishing works

You cast as always. When something bites and you reel in you do not get the fish yet: a bar appears at the top with a green zone and a marker sliding back and forth. You have to click while the marker is inside the green.

Minigame bar -##########--------------|-- miss -----------###|######----- -- hit # = green zone | = marker
  • The zone narrows and the marker speeds up with the rarity of what bit. A common fish is easy; an abyssal one is genuinely hard.
  • The zone lands somewhere different every time (left, centre or right) and the marker never starts inside it.
  • Nailing the centre gives up to +25% reward.
  • It can be switched off with /fish minigame (per player) or in the config (whole server).

Lava fishing

In vanilla you can only fish in water: a bobber that lands in lava just sinks. And water evaporates in the Nether. Here the bobber floats on the lava, bites the same way it does in water, and you reel in the same way.

  • When something bites there is a burst of fire, sparks fly and a notice shows on the action bar. Lava glows and swallows particles: the notice is what you will actually see.
  • There is a short window to reel in. Reel in too early or let the window pass and you get nothing; it just waits again, as in water.
  • What comes out goes through the same path as in water: roll, minigame, baits, augments, records. Lure shortens the wait too.
  • It sounds like lava, not the sea. Not one water sound: the bobber lands with a gloop, pulling it out gives the lava-bucket scoop and a hiss, and the fish sizzles as it cools. If it gets away, it sounds like a fire going out.
Which fish come out of lava is set per fish with fluid: in fish.yml. The 18 Nether fish ship with fluid: lava. The Codex says so too — "Fished in lava" — so nobody has to guess.

Length, weight and quality

Every catch draws a length from a curve biased downwards: most come out ordinary and the huge specimen is genuinely rare. Weight is derived from length, and quality is the percentile within that species' range.

QualityPercentileWhat it means
Tiny0 – 35%Run of the mill
Average35 – 70%The usual
Large70 – 90%A good one
Trophy90 – 98%Counts as a trophy and cannot be eaten by accident
Colossal98 – 100%Server record material
When someone beats the server record for a species it is announced to everyone. Records store length, weight, date and who caught it, and are available as placeholders.

Catch particles

When the fish comes out a ring is drawn on the water, in the colour of its rarity. You can see from a distance what the guy next to you landed. The colour comes from the tier's own color:, so changing it drags the particles along.

Against AFK farms

Nobody is punished for standing still for a while. It takes many catches in a row on exactly the same block, which is what a machine does and a person does not. From there rewards are reduced (or cut off, your choice).

Configuring fish

Fish live in fish.yml and in any .yml inside the fish/ folder. All of them load, so you can split your catalogue: with two hundred species a single file of thousands of lines is unmaintainable, and one bad indent takes the whole catalogue down.

One fish, fully

fish: frost_marlin: display: '&9Frost marlin' tier: rare # a rarity from tiers.yml material: COD # base item model-data: 1043 # CustomModelData (0 = no model) item-model: 'nexo:frost_marlin' description: - '&8The tip of its bill cuts ice.' # --- when it bites --- biomes: [frozen_ocean, cold_ocean] time: any # any | day | night weather: any # any | clear | rain | thunder min-y: 40 max-y: 63 moon-phases: [0] # 0 = full moon required-level: 15 required-bait: shrimp worlds: [world] regions: [my_region] # with WorldGuard event: crabmas # /fish event crabmas fluid: water # water | lava | any # --- roll and sizes --- weight: 60 # weight WITHIN its rarity length: { min: 90, max: 300 } # in cm length.bias: 2.2 # >1 pushes towards small weight-factor: 0.012 # kg = length³ × factor / 1000 # --- rewards --- xp: 55 # -1 = use the rarity's entropy: 320 sell-price: 180 sell-size-bonus: 1.5 # how much size pays gut: entropy: 400 xp: 15 size-bonus: 1.0 loot: # MATERIAL:amount:chance - 'PRISMARINE_SHARD:1-2:45' commands: ['25% eco give %player% 500'] # --- behaviour --- sellable: true gutable: true deliverable: true # can appear in deliveries give-item: true # false = gives no item glowing: false eat: { hunger: 4, saturation: 2.0 } commands: catch: ['10% broadcast &b%player% landed something rare'] sell: [] eat: [] # --- migration (optional) --- migration: enabled: true count: 2 # how many biomes at once pool: [ocean, cold_ocean, frozen_ocean, deep_ocean]
item-model is the modern alternative to model-data: it points the item at a model by name instead of by number, and it works the same on fish, baits, augments, skills and totems. The two live side by side. It is explained in full under Integrations.
An empty list always means "no restriction", never "impossible". That is the most common configuration mistake in a fishing plugin and it cannot happen here: leave biomes out and the fish can bite anywhere.

Rarities (tiers.yml)

Rarities are not hardcoded. Add, remove or rename as many as you like; the only rule is that every fish points at one that exists. The rarity's weight is the number that actually decides how rare each tier is.

tiers: rare: display: 'Rare' color: '&9' # also tints its particles order: 2 # 0 = the most common weight: 150.0 # weight in the roll entropy: { catch: 320, gut: 260 } xp: 55 sell-multiplier: 5.0 gutable: true glowing: false broadcast: false # announce to the whole server sound: ENTITY_EXPERIENCE_ORB_PICKUP particles: enabled: true shape: RING # RING | SPIRAL | BURST | NONE type: DUST color: '' # empty = the tier colour radius: 1.1 rings: 2 points: 32 expand: 0.45 snap-to-surface: true # stick to the water surface y-offset: 0.50 duration: 20 interval: 2

How the roll works

The roll happens in two steps: first the rarity, then the species inside it. The difference matters: with one big bag, adding twenty common fish would make the mythical ones rarer without anyone touching their odds. In two steps, a rarity keeps its odds no matter what happens to the catalogue.

The main menu shows you the real odds of each rarity right here, right now, with your bait, augments, skills, the tide and the hotspot already counted in. Nothing to take on faith: you see the number.

The Codex: which hints it shows

The Codex is not a list of what you are missing: it is where to go and look. That is why the conditions you write in fish.yml are shown as hints, and shown on fish you have not discovered yet — if they only appeared after you caught one, they would arrive too late.

FieldHint
biomesUp to three biomes, then ...
min-y · max-yDepth. Reads as a range, a floor or a ceiling depending on what the fish defines, so no half-empty lines.
moon-phasesMoon phase by name ("Full moon", not 0). A fish listing all eight has no real restriction, so the line is left out.
fluid"Fished in lava", or "in lava or water". Nothing for water: that is the normal case.
time · weatherTime of day and weather
required-levelMinimum fishing level
required-baitThe bait, by its display name
eventThe event it needs
migrationHow many days until it moves
» Where to find it - Biome: Lush caves, Dripstone caves - Depth: Y 40 or below - Moon: Full moon - Fishing level: 15
A field you leave out produces no hint, because it is not a restriction. If you want a fish to be a genuine mystery, give it no conditions: there will be nothing to read.

Entropy, levels and gear

Entropy

Entropy is the plugin's own currency and cannot be bought: it is only fished. You earn it catching and gutting, and you spend it on skills, augments, baits, totems, trophy cases, rod repairs and founding guilds.

Levels and experience

The XP stored is always the running total, not what is left to the next level. That way the XP leaderboard means something and changing the formula moves everyone consistently, instead of leaving profiles with impossible numbers.

levels: max-level: 100 formula: base: 30.0 exponent: 1.3 # XP from N to N+1 = base × N^exponent skill-points-per-level: 1 title: true # on-screen title on level up sound: ENTITY_PLAYER_LEVELUP # one-off rewards per level rewards: 25: skill-points: 3 entropy: 10000 commands: - 'fish givebait %player% shrimp 8' message: - '&b&lLEVEL 25 &7- have some bait.'

Effects: the shared language

Skills, augments, baits, totems, boosters, tides, hotspots and guilds all produce the same thing: a set of named effects. That is why they are configured alike and why the player sees the same names on every screen.

EffectWhat it does
luckPushes the roll towards higher rarities
double-catch% chance of two fish in one pull
sizeFlattens the size curve: bigger catches. Never raises the species maximum.
xp / entropy / moneyReward multipliers
gutGutting entropy multiplier
bait-save% chance of not consuming the bait
minigame-easeWidens the minigame's green zone
tier.<id>Multiplies that rarity's weight
fish.<id>Multiplies that species' weight

Skills, augments and baits

  • Skills (skills.yml): levelled with skill points and entropy. Never lost, never tied to a rod — this is "account" progression.
  • Augments (augments.yml): custom rod enchants. Crafted with entropy, applied to one specific rod, removable. Many have conditions (rain only, night only), which is what makes keeping more than one rod worthwhile.
  • Baits (baits.yml): attached by dragging the bait onto the rod in your inventory. They last a number of uses and bias what bites. Some fish only bite with their bait.

Rod condition

A rod has a line (worn when you land a fish) and a reel (worn when you cast). With the line at zero it snaps now and then and the fish escapes; with the reel at zero the minigame runs faster. Repair with /fish repair, paid in entropy.

It is the only entropy sink that never runs out: augments are bought once and skills finish, but keeping a rod alive costs forever. If you do not want it, rods.yml → enabled: false and rods never wear.

The systems

Each has its own file and every one can be switched off on its own with enabled: false. Turn on only what suits your server.

SystemFileWhat it brings
Deliveriesdeliveries.ymlShort objectives that generate themselves and scale to level
Tournamentstournaments.yml6 scoring modes, automatic or manual
Tidestides.ymlRecurring global event with advance warning
Hotspotshotspots.ymlZones that take turns being open and then run dry
Migrationsmigrations.ymlFish change biome every few days
Trophy casestrophies.ymlBlock + floating sign with the mounted catch
Auctionauction.ymlSelling specific catches between players
Guildsguilds.ymlShared progress; the group level buffs everyone
Totemstotems.ymlBlocks that buff within a radius
Boostersboosters.ymlTemporary multipliers, personal and global
Bait stationbaits.ymlCraft bait from what gutting leaves you
Bounty boardbounties.ymlA player pays for the catch they are after
Aquariumsaquariums.ymlSeveral live fish on show, with a small income

Bait station

Gutting a fish gives you loot, and on its own that loot would just be something else to sell. Here it feeds a loop: you fish, you gut, you craft the bait, you fish better. Place the station, right-click it, and you get the recipe list with what each one needs and whether you have it.

worm: # ...the rest of the bait... recipe: amount: 8 # how many come out entropy: 60 # cost, 0 = free ingredients: - 'DIRT:4' # a plain material - 'tier:common:2' # 2 fish of that rarity - 'fish:sardine:1' # or one specific species

The last two forms are the important ones: they are what gives a small fish a use. A 12 cm one breaks no record, nobody bids on it and selling it gives you loose change — but as raw material it is worth exactly as much as the big one.

A plugin fish never counts as its vanilla material. A recipe asking for COD will not eat the 90 cm cod you were keeping for the display case.
The station has no input slots: ingredients come out of your inventory when you click. A menu that holds nobody's items is a menu that cannot lose anybody's items.

Deliveries

Short objectives that give a reason to fish for something you would not otherwise. They generate themselves and scale to level: a level 3 player is not asked for "catch 40 mythical fish", and a level 80 one is not handed jobs they finish without noticing. Four types: N fish of anything, N of a rarity, N of a species, or one catch over a certain length.

The length asked for comes from the species' real range, not a fixed number. Asking for "60 cm" of a fish that tops out at 40 would be impossible, and that is exactly what badly generated jobs do.

Tournaments

ModeHow it scores
MOST_FISHNumber of fish
BIGGEST_FISHThe longest catch. Not additive: your best stands.
MOST_TIERFish of a drawn rarity
SPECIES_HUNTFish of a drawn species
TOTAL_WEIGHTTotal accumulated weight
MOST_ENTROPYEntropy earned during the tournament
  • The bar at the top shows who is leading, with how much, and how long is left, and each player is told their position as they score. Knowing whether you are second or tenth is what makes the last minute matter.
  • In MOST_TIER with a random target, the highest rarity is never picked: a mythical tournament where nobody scores is not a tournament, it is an hour wasted.
  • If there are not enough players the slot is not wasted: it retries in a minute instead of waiting another two hours.
  • Everyone who scored gets something. Paying for participation stops it becoming the same four people every time.
Would you rather have the tournament on your scoreboard? show-bar: false in tournaments.yml hides the bar, and you lose nothing: everything it shows exists as a placeholder — the time, the leader, your position, your score and how many are taking part.

Tides and hotspots

A tide is a global event that is not competitive: for a while, fishing is simply better for everyone. It is announced in advance so people log in on time, but latecomers still benefit.

A hotspot is where the fish are biting today: one zone gives far more for a while, runs dry, and opens somewhere else. You define the zones with coordinates, so they always land in real water and somewhere reachable, instead of appearing mid-ocean a thousand blocks from anybody's base.

spots: north_bay: display: '&bNorth Bay' world: world x: 200 z: -350 radius: 45 kinds: legendary: display: '&5&lDeep trench' weight: 15.0 duration: 12m effects: luck: 0.40 tier.legendary: 0.70 tier.abyssal: 1.00

Migrations

Fish marked with migration change biome every few world days. The codex already shows where each one lives; this makes that hint alive and worth re-reading, instead of a table you learn once and forget.

The layout is deterministic: it comes from the world day and the fish id, not from a stored roll. That means there is nothing to persist, every player sees the same thing, and a server restart does not reshuffle the whole map mid-season.

Trophy cases

A record is a number inside a menu, and there it stays. The trophy case brings it into the world: buy it with /fish trophy, place it in your base, and a floating sign sits above it with the species, the length and who caught it.

ActionWhat it does
Right-click with a fishMounts it and the sign appears
Right-click empty-handedReads the details
Sneak + right-clickTakes it off and gives it back
Break the blockReturns the case and the fish
The sign is an invisible ArmorStand, not a hologram plugin: it works the same on 1.16 and 26.2 and adds no extra dependency that could be missing.

Aquariums

A display case shows one fish, your best. The aquarium is the opposite: it holds several and takes turns showing them on the sign above it, and it trickles entropy. It is what makes a small fish worth keeping.

ActionWhat it does
Right-click with a fishPuts it in the tank
Right-click empty-handedTells you how many are inside and how many species
Sneak + right-clickTakes out the last one you put in
Break the blockReturns the tank and every fish inside
income: minutes: 10 # entropy per fish and cycle, BY RARITY entropy-per-fish: default: 1.0 common: 1.0 uncommon: 2.0 rare: 4.0 epic: 8.0 legendary: 16.0 abyssal: 30.0 species-bonus: 1.5 # extra per DIFFERENT species

The income is set per rarity, using the ids from tiers.yml. Otherwise it would not matter what you put in, and every tank on the server would end up full of sardines. Rename a rarity there and you write it here the same way; a single flat number also works.

Only an owner who is online gets paid. That is deliberate: this is an ornament that pays a little, not a passive farm that fills itself while nobody plays.

Auction and mailbox

The auction works precisely because every catch is unique: you do not sell "a salmon" here, you sell YOUR 47.3 cm salmon. List with /fish auction sell <price> holding the fish, buy from the menu.

Anything that cannot be handed over right away goes to the mailbox: the prize for a tournament you won while offline, what someone paid you at auction, a listing that expired unsold. It is claimed automatically on join. Nothing is lost for being away.

Bounty board

The auction house is the selling side. The board is the buying side: "I pay 5,000 for a marlin of 200 cm or more". Ask by species, by rarity, by minimum length or any combination — "any legendary over 150 cm" is how people actually ask.

/fish bounty # open the board /fish bounty mine # only yours /fish bounty post tier:legendary 150 25000 /fish bounty post salmon 0 500 # one species, any length /fish bounty post any 100 1000 # anything, from 100 cm

If you are carrying a fish that fits, the bounty lights up and one click hands it in. The fish goes to the mailbox of whoever posted it, so it works with them offline — which is the normal case, because the bounty has been up for days.

The reward is held the moment the bounty is posted, not when it is claimed. Otherwise the poster could spend the money while a hunter spends half an hour looking for the fish, and that only has to happen once for nobody to trust the board again. An expired bounty returns its reward through the mailbox: it is never lost.

Guilds

Every catch by a member adds points to the guild, and the guild levels up, buffing everyone. The point is that the light fisher still feels what the others do, and the heavy one has a reason to bring people along.

/fish guild create /fish guild invite /fish guild join /fish guild leave /fish guild kick /fish guild disband /fish guild info /fish guild top

Commands and permissions

The main command is /fish (aliases /af, /pesca, /peche). Everything has tab completion, and /fish help only shows what that player can actually use.

Players

CommandWhat it doesPermission
/fishOpens the main menuabyssalfishing.menu
/fish helpThe help, with version and author—
/fish shopSell fish, buy baits and totemsabyssalfishing.shop
/fish bagYour fish bagabyssalfishing.bag
/fish codexEncyclopedia, hints and recordsabyssalfishing.codex
/fish deliveriesYour active deliveriesabyssalfishing.deliveries
/fish skillsSkill treeabyssalfishing.skills
/fish augmentAugment table: craft, apply and removeabyssalfishing.augment
/fish gutGut fishabyssalfishing.gut
/fish scalesWeigh a catch and compare recordsabyssalfishing.scales
/fish top [stat]Leaderboards (9 tables)abyssalfishing.top
/fish stats [player]Fishing statisticsabyssalfishing.stats
/fish entropyYour entropyabyssalfishing.entropy
/fish boostersYour active boostersabyssalfishing.boosters
/fish lang [code]Pick your languageabyssalfishing.lang
/fish minigameToggle the minigame—
/fish mailboxClaim pending rewards—
/fish repairRepair the rod in your hand—
/fish auctionOpen the auctionabyssalfishing.auction
/fish auction sell <price>List the fish in your handabyssalfishing.auction
/fish guild ...Guilds (create, invite, join, leave, kick, disband, info, top)abyssalfishing.guild
/fish trophyBuy a trophy caseabyssalfishing.trophy
/fish baitstationBuy a bait stationabyssalfishing.baitstation
/fish aquariumBuy an aquariumabyssalfishing.aquarium
/fish bountyOpens the bounty boardabyssalfishing.bounty
/fish bounty post <fish|tier:x|any> <cm> <reward>Posts a bounty (the reward is held)abyssalfishing.bounty
/fish hotspotWhere the active hotspot is—
/fish tideCurrent tide or time to the next—
/ftTournament: info, top—

Administration

CommandWhat it does
/fish reloadReloads configs and languages without a restart
/fish give <player> <fish> [amount] [length]Gives a fish, optionally at an exact length
/fish givebait <player> <bait> [amount]Gives baits
/fish giveaugment <player> <augment> [level]Gives an augment
/fish givetotem <player> <totem>Gives a totem
/fish addentropy <player> <amount>Adds entropy
/fish addxp <player> <amount>Adds fishing XP
/fish setlevel <player> <level>Sets the level
/fish booster <start|stop> <id> [duration]Global booster for the whole server
/fish event <id|clear>Turns on a seasonal event
/fish tide <start|stop> [id]Starts or stops a tide
/fish hotspot <start|stop> [zone] [kind]Opens or closes a hotspot
/fish infoPlugin and integration status
/fish placeholdersDumps the full placeholder list
/ft start|stop|cancel|removeManage tournaments

Special permissions

  • abyssalfishing.admin — all administration.
  • abyssalfishing.tournament.manage — start and stop tournaments.
  • abyssalfishing.bypass.afk — never flagged as AFK fishing.
  • abyssalfishing.bypass.cooldown — no cooldown between catches.
  • abyssalfishing.totem.break.other, .trophy.break.other, .aquarium.break.other and .baitstation.break.other — break what other players have placed.

Placeholders

With PlaceholderAPI installed, everything the plugin knows can be pulled out. If it shows in a plugin menu, it exists as a placeholder. There are 100 fixed ones and 12 families that take an argument, which on a 155-fish catalogue gives more than two thousand real combinations.

They are all prefixed %abyssalfishing_...%. In game, /fish placeholders dumps the whole list grouped by block.

Progression

PlaceholderReturns
level · max_levelFishing level and cap
xp · xp_total · xp_requiredXP in level, total, and required
xp_percent · xp_barPercentage and a ready-made bar
entropy · entropy_compact · entropy_rawEntropy formatted, abbreviated and raw
skill_points · skill_<id>Free points and one skill's level
caught · caught_vanillaPlugin catches and vanilla ones
caught_tier_<rareza> · caught_fish_<fish>Catches of a rarity or species
trophies · longest · longest_fishTrophies and your biggest catch
records_heldHow many server records you currently hold
money_made · gutted · soldMoney earned, fish gutted and sold
deliveries · tournaments_won · augments_craftedDelivery, tournament and augment counters
language · minigameTheir language and whether the minigame is on

Codex

PlaceholderReturns
discovered · codex_total · codex_missingDiscovered, total and missing
codex_percent · codex_barPercentage and bar
codex_tier_<rareza>Discovered of that rarity, as 12/40
best_<fish>Your best length for that species
fish_total · tiers_total · tier_total_<rareza>Catalogue sizes
tier_name_<rareza>The rarity's coloured name
chance_<rareza>The real odds of that rarity where they stand, with bait, augments, skills, tide and hotspot already counted

Gear

PlaceholderReturns
bait · bait_usesAttached bait and uses left
rod_line · rod_line_max · rod_line_percent · rod_line_barLine condition
rod_reel · rod_reel_max · rod_reel_percent · rod_reel_barReel condition
rod_repair_cost · rod_brokenRepair cost and whether it is broken
rod_augments · rod_augments_max · rod_augment_listThe rod's augments
boosters · boosters_listActive boosters

Systems and guild

PlaceholderReturns
mailboxRewards waiting in the mailbox
trophy_cases · trophy_limitPlaced trophy cases and the limit
auction_listings · auction_mine · auction_maxAuction listings
deliveries_active · deliveries_slots · deliveries_readyActive deliveries, slots and ready to claim
guild_has · guild_name · guild_ownerWhether they have a guild, and which
guild_level · guild_points · guild_progress · guild_barGuild level and progress
guild_members · guild_max_members · guilds_totalMembers and guilds on the server
guild_top_<1-10>_<name|level|points>Guild leaderboard

Tournament, tide, hotspot and migration

PlaceholderReturns
tournament_active · tournament_name · tournament_typeWhether a tournament is on, and which
tournament_time · tournament_time_long · tournament_nextTime left and time to the next
tournament_position · tournament_score · tournament_playersYour position, your score, how many play
tournament_<first|second|third>_<name|score>The live podium
tide_active · tide_name · tide_time · tide_nextTide in progress or time to the next
hotspot_active · hotspot_name · hotspot_kindOpen hotspot and its kind
hotspot_world · hotspot_x · hotspot_z · hotspot_radiusExactly where it is
hotspot_inside · hotspot_distanceWhether they are inside and how far
migration_days · migration_period · migration_enabledHow long until the next shuffle
These are enough to put the whole tournament on a scoreboard. If you do, hide the bar with show-bar: false in tournaments.yml so you are not showing the same thing twice.

Leaderboards and records

%abyssalfishing_top___% available stats: level entropy caught money trophies longest gutted deliveries tournaments examples: %abyssalfishing_top_longest_1_name% %abyssalfishing_top_entropy_3_compact% %abyssalfishing_record__% example: %abyssalfishing_record_frost_marlin_holder%
The ones that do not depend on a player (leaderboards, records, tournament, tide, hotspot, migration) also work in holograms and from console.

config.yml

The basics

# The language new players start on. # Each player can change it with /fish lang. language: en # Worlds where the plugin does NOT act (vanilla fishing). disabled-worlds: - creative # % of bites that are a plugin fish. 100 = all. custom-fish-chance: 100.0 # Minimum ms between catches. 0 = no limit. catch-cooldown-ms: 0 # How much each Luck of the Sea level adds. luck-of-the-sea-bonus: 0.08 # Inventory and bag full: drop on the floor or warn. drop-when-full: true # Stops a trophy catch being eaten by accident. protect-trophies: true

The minigame

minigame: enabled: true seconds: 8 # before it escapes zone: easy: 0.34 # width of the green zone hard: 0.12 speed: easy: 0.030 # marker speed hard: 0.075 bar-length: 28 zone-placement: THIRDS # THIRDS | RANDOM | CENTER grace-ticks: 6 # ticks where a click does not count accuracy-bonus: 0.25 # extra for nailing the centre
zone-placement: THIRDS spreads the zone across thirds (left, centre, right) and draws inside whichever comes up. With plain RANDOM the zone moves but does not look like it: if it covers a third of the bar, its centre lands near the middle almost every time.

Dynamic market

Selling a lot of one species sinks its price for a while, and it recovers on its own. That is what stops the whole server finding the most profitable fish and farming it forever. It can be switched off entirely.

shop: base-price: 20.0 # if the fish sets no sell-price size-bonus: 1.5 # how much size pays entropy-per-coin: 1.0 # without Vault it pays in entropy daily-limit: 0.0 # max money a day from selling (0 = none) dynamic-pricing: enabled: true elasticity: 0.004 # drop per unit sold min-factor: 0.35 # floor: never below this recovery-per-minute: 4.0
daily-limit puts a daily cap on what each player earns selling fish (it resets at midnight, server time). Lower prices alone cannot keep an economy cheap: whoever fishes eight hours would still earn eight times more. The fish that crosses the cap is paid in full; after that the shop says no until tomorrow, and the fish can still be gutted, kept or auctioned. The sell button shows how much you have sold today.

Anti AFK farm

anti-afk: enabled: true catches-before-penalty: 40 # on the SAME block mode: REDUCE # REDUCE or BLOCK reduced-multiplier: 0.25

Languages

The four languages live in lang/. Language is per player, not per server: the one in the config only decides what a new player starts on. You can add your own by dropping another .yml in that folder.

On update each language gains the new keys and keeps everything you rewrote. You never need to delete the lang/ folder… unless you want the default texts back.

Lava fishing

lava-fishing: enabled: true environments: [NETHER] # NETHER, NORMAL, THE_END requires: augment: '' # id from augments.yml; '' = any rod bait: '' # id from baits.yml; '' = no bait wait-seconds: { min: 8, max: 30 } lure-seconds-per-level: 5 bite-window-seconds: 1.5 # time to reel in sounds: # 'sound volume pitch'; several play together land: ['block.lava.pop 0.7 1.2', 'entity.strider.step_lava 0.6 1.0'] bite: ['block.lava.pop 1.0 0.7', 'item.firecharge.use 0.5 1.3'] reel: ['item.bucket.fill_lava 1.0 0.9', 'block.fire.extinguish 0.4 1.5'] catch: ['block.lava.extinguish 0.8 1.0'] escape: ['entity.generic.extinguish_fire 1.0 0.7'] # [] = no sound
requires turns lava into progression: require an augment or a bait, and a rod without it sinks like in vanilla, with a message saying what is missing. If you set an id that does not exist, the console warns you and lava stays closed until you fix it — better that than opening it to everyone because of a typo.

Integrations

None of these are required. The plugin runs on its own, with SQLite and its own currency. What follows is what it gains when you already have these installed.

PluginWhat it adds
VaultFish sell for real money. Without it they sell for entropy and nothing breaks.
PlaceholderAPI112 placeholders. See the placeholders section.
WorldGuardA fish can require a specific region to be catchable.
mcMMOTreasure Hunter drops stop being lost, and its Fishing level grants luck here.
MySQLProgress, records and leaderboards shared across a network.

mcMMO

Both plugins write to the same place: the item that comes out of the water. Left alone, one overwrites the other silently.

LOWEST mcMMO anti-exploit checks NORMAL AbyssalFishing rolls the catalogue and hands over the fish HIGH mcMMO ice fishing HIGHEST mcMMO processFishing(): decides the treasure

AbyssalFishing goes first. And mcMMO delivers its treasure by replacing the caught item, with fishingCatch.setItemStack(treasureDrop) — on an item we have already removed. The treasure evaporates: the player never sees it and mcMMO counts it as delivered.

mcMMO's Fishing XP was never affected. Its applyXpGain() sits outside every conditional, so it is awarded on every catch. The only thing being lost was the treasure item.

What the integration does

  • It rescues the treasure. It is read before it can be lost, handed to the player directly, and the treasure XP is returned too. You keep the fish and the treasure.
  • And the other way: your mcMMO Fishing level adds luck to the rarity roll. At the cap, an abyssal goes from 1 in 1666 catches to 1 in 1474.
  • No dependency. The jar contains no mcMMO classes at all: it is pure reflection. Without mcMMO installed, nothing is registered.
# mcmmo.yml treasure: give # give / cancel / ignore extra-xp: enabled: false # XP by rarity, ON TOP of its own level-bonus: enabled: true luck-per-10-levels: 0.01 max: 0.15
treasureWhat happens
giveYou keep the fish and the treasure. The default.
cancelThe treasure is dropped; you only get the fish.
ignoreNothing is touched and the treasure is lost. The old behaviour, for comparison.
extra-xp ships off. mcMMO computes its XP from the vanilla material, so a 280 cm abyssal and a sardine are both a Cod and pay the same; this lets rarity count, on top of what it already gives.
/fish info reports whether the hook attached and to which mcMMO version. If anything about its API is not what we expect, the hook disables itself, says so in the console, and fishing carries on as normal.

Resource packs (Nexo, Oraxen, ItemsAdder)

Today's pack generators no longer hand out custom_model_data numbers: every item gets its own named model. Asking one of those servers to invent numbers for 155 fish means keeping two sets of books, and one of them drifts.

So anywhere you could write model-data you can now write item-model: fish, baits, augments, skills and totems. A bare name is assumed to be minecraft:, so item-model: 'brick' points at the game's own brick model.

fish: frost_marlin: display: '&9Frost marlin' material: COD item-model: 'nexo:frost_marlin' # instead of model-data: 1043
You do not need Nexo, or Oraxen, or ItemsAdder. item-model writes the vanilla item_model component, so it works the same with any of them or with a resource pack you wrote by hand. There is no dependency on any plugin.
The item_model component exists from 1.21.4 onwards. On older servers the field is ignored with no error, so one config file still serves 1.16 to 26.2. model-data keeps working exactly as before and the two can be mixed: names for whatever your pack generator owns, numbers for the rest.

Frequently asked

The fish always escape

Watch the colour of the bar, not the marker: it turns green when you are inside. If it is still hard, raise minigame.seconds and the zone width, or lower speed. Also remember the Steady grip skill and the Steady hands augment widen the zone.

Nothing from the plugin bites

  • Are you in a world listed in disabled-worlds?
  • Is any fish configured for that biome? If none can bite there, the vanilla fish is left alone instead of giving you nothing. The main menu tells you.
  • Is custom-fish-chance below 100?

Does it work on my version?

From 1.16 to 26.2, same jar. It is compiled to Java 8 on purpose, because a 1.16 server may be running on Java 8 and a Java 17 .class will not load there. Anything newer versions need comes in through reflection.

Can I remove systems?

Yes. Every system has its own enabled: false: minigame, rod wear, tides, hotspots, migrations, trophy cases, auction, guilds, deliveries, tournaments and particles. You can leave it at "fishing with nice fish" or turn everything on.

Is it really free?

Yes. No premium edition, no locked features, no licence key. Everything in this wiki is in the jar.

AbyssalFishing / Changelog

Version history

Every release and what changed in it.

v1.5.0 2026-10-23 Latest
  • ✨minigame.player-toggle in config.yml. Set it to false and nobody can turn the fishing minigame off: the menu button is hidden and /fish minigame refuses.
  • ✨Permission abyssalfishing.minigame.toggle (everyone has it by default). Take it away from a group to hide the button and the command only for them, e.g. keep it just for staff.
  • 🔧Players who had already turned the minigame off get it back as soon as they lose the choice. Their saved setting is ignored, not erased, so it returns if you allow it again.
  • 🔧/fish help and tab completion no longer offer /fish minigame to players who cannot use it.
  • 🔧The minigame placeholder (%abyssalfishing_minigame%) now shows whether the minigame is really on for that player, not just their saved setting.
  • 🔧Just replace the jar. player-toggle (true) and the new message are added to your config and language files automatically, so nothing changes until you set it to false.
v1.4.1 2026-09-20
  • 🐛The economy could end up unhooked for the whole session and selling silently paid in entropy: AbyssalFishing now waits for the economy to register instead of asking once at startup.
  • 🐛tournaments.yml and migrations.yml shipped with a config line stranded inside the header comment, which printed a duplicate key warning in console on every boot.
  • 🔧Just replace the jar. If you installed 1.4.0 from scratch you can delete tournaments.yml and migrations.yml to get the tidy comments back; your settings are read the same either way.
v1.4.0 2026-09-19
  • ✨shop.daily-limit - the most money a player can make selling fish per day (resets at midnight). 0 = no limit, the default.
  • ✨The shop's sell button shows how much you have sold today against the limit. The counter survives relogs and restarts.
  • 🔧The fish that crosses the daily limit is paid in full; after that the shop refuses politely and says when it resets.
  • 🐛Selling a stack that could only be partly sold removed the whole stack. Now only the sold fish leave the inventory.
  • 🐛The biggest fish weighed absurd amounts (The First Catch up to 290,000 kg). Weights are now realistic: about 14 t at most.
  • 🐛The First Catch sold for 250,000 at default prices. It is now 40,000, in line with the other abyssal fish.
  • 🐛The levels comment said level 50 needed 78,000 XP; it was 680,000. New default curve: level 50 in ~24 h, level 100 in ~110 h.
v1.3.0 2026-09-13
  • ✨Lava fishing. The bobber now floats on lava instead of sinking: something bites after a while, you get a short window to reel in, and the catch goes through the same roll, minigame and rewards as a wa
  • ✨Before this, the 18 Nether fish -- including the Heart of the Nether, the only abyssal fish -- could not be caught in survival, because water evaporates in the Nether.
  • ✨New fish field: fluid (water, lava or any). Fish without it are water fish. The 18 Nether fish ship with fluid: lava.
  • ✨Lava fishing can require an augment on the rod or a bait loaded on it (lava-fishing.requires in config.yml). By default any rod works. A rod that does not meet the requirement sinks like in vanilla an
  • ✨The Codex shows "Fished in lava" on lava fish.
  • ✨Lava fishing has its own sounds, with nothing from the water: the bobber landing, the bite, pulling the fish out, landing it and losing it all sound like lava and fire. They are configurable in lava-f
  • 🐛Species-hunt tournaments could pick a fish nobody could catch (a Nether fish, or one that only appears during an event that was not running). They now only pick catchable fish.
  • 🐛Deliveries could ask newer players for fish they had no way to catch. Same fix.
  • 🔧On update, the lava-fishing section is added to config.yml and fluid: lava to the 18 Nether fish, keeping your changes. If you moved a Nether fish to water, set it to fluid: water or fluid: any.
v1.2.4 2026-09-13
  • 🐛A totem destroyed by anything other than a pickaxe stayed on record: it kept counting towards the placement limit, so the player could not place a new one, and it kept buffing the empty spot.
  • 🐛Totems are now protected from explosions, fire, pistons and mobs that change blocks (endermen, withers), just as they already were from other players.
  • 🐛Lantern totems could be destroyed by anyone by mining the block they stand on or hang from, and the owner lost the item. That block is now protected too; if the owner mines it, they get the totem back
  • 🐛Ghost totems already on a server are cleaned up on their own: when a player places a totem, any earlier one whose block is gone frees its slot. The console logs each one. This also covers WorldEdit, /
  • 🐛Placing and breaking a totem are now recorded only once the action is final. Before, if a region protection cancelled it afterwards, breaking could give a copy of the totem and placing could register
v1.2.3 2026-09-12
  • 🐛Precision cutting did nothing. Gutting counted your skills and boosters but never the augments on your rod, so an identical fish gave the same entropy with or without the augment.
  • 🐛Bait master did nothing. Only the skill tree was checked when deciding whether to spend the bait; the augment was ignored.
  • 🐛Money bonuses never applied to any sale. The sell multiplier was calculated and then never used, so the Merchant augment, the Market eye skill and the Market day booster never raised a price.
  • 🐛All three have been there since 1.0.0; this is not something a recent update broke.
  • 🐛The gutting preview did its own maths and ignored each fish's gut.entropy and gut.size-bonus, so it could show one number and pay another. Preview and payout now use the same calculation.
  • 🐛The gutting info showed only the skill bonus; it now shows the full bonus you actually get.
  • 🐛The sell-all totals in the shop and the bag now include your money bonus, so the number shown is the number paid.
  • 🔧Gutting and selling use the rod in your hand. The main hand wins; an off-hand rod only counts when the main hand is not holding one. Conditional augments are checked where you are standing.
  • 🔧Heads-up for server owners: if your economy was balanced without these bonuses, sale prices will rise after updating. Tune the values in augments.yml, skills.yml and boosters.yml if needed.
v1.2.2 2026-09-09
  • 🔧The Codex now shows depth and moon phase. It already listed biome, time, weather, level, bait and event, but not the two conditions a player cannot work out by looking around.
  • 🔧In the shipped catalogue 29 of the 155 fish carry one of these: 23 have a depth limit and 6 are tied to a moon phase. The cave blindfish only bites below Y 40, and there was no way to learn that in ga
  • 🔧Depth reads as a range, a floor or a ceiling depending on what the fish defines, so there are no half-empty lines.
  • 🔧Moon phases are shown by name rather than by number -- "Full moon" instead of 0 -- and all eight are translated in the four languages. A fish that lists all eight has no real restriction, so the line
  • 🔧Nothing to configure: it reads the min-y, max-y and moon-phases your fish already have. The twelve new language keys are added to your lang/ files on start and anything you have rewritten is kept.
v1.2.1 2026-09-06
  • ✨item-model: point an item at a model by name instead of by number. Anywhere you could write model-data, you can now write item-model: 'nexo:frost_marlin' instead.
  • ✨It sets the vanilla item_model component, so it is not tied to any one plugin: Nexo, Oraxen, ItemsAdder or a hand-written resource pack all work. A bare name is assumed to be minecraft:.
  • ✨Available on fish, baits, augments, skills and totems -- every place that took model-data.
  • ✨Modern pack generators no longer hand out custom_model_data numbers; every item gets its own model id. Asking those servers to invent numbers for 155 fish means keeping two sets of books, and one of t
  • ✨model-data keeps working exactly as before, and both can be used side by side: ids for the fish your pack generator owns, numbers for the rest.
  • ✨The item_model component only exists from 1.21.4 onwards. On older servers the field is ignored, so one config file still serves the whole 1.16 to 26.2 range.
v1.2.0 2026-09-04
  • ✨mcMMO integration. If you run both plugins, your Treasure Hunter drops have been disappearing: mcMMO delivers its treasure by replacing the item you caught, and AbyssalFishing had already taken that i
  • ✨The treasure now reaches you. AbyssalFishing reads it before it can be lost, hands it over directly, and returns the treasure XP too. You get exactly what mcMMO intended, plus your fish.
  • ✨Your mcMMO Fishing level now adds luck to the AbyssalFishing roll. Capped low on purpose: at the cap an abyssal fish goes from about 1 in 1666 catches to 1 in 1474.
  • ✨New mcmmo.yml with three treasure modes: give (default, you keep both), cancel (only the fish) and ignore (the old behaviour, for comparison).
  • ✨Optional extra Fishing XP by rarity, off by default. mcMMO computes its XP from the vanilla material, so a 280 cm abyssal and a sardine both pay the same; this lets rarity count for the skill as well,
  • ✨The jar contains no mcMMO classes: the hook is pure reflection, nothing is registered without mcMMO installed, and it disables itself rather than misbehave if the API is not what it expects. /fish inf
  • ✨The tournament boss bar can now be hidden with show-bar: false in tournaments.yml, for servers that would rather put the tournament on their scoreboard. Nothing is lost by hiding it: every piece of th
  • 🐛The tournament boss bar no longer stays on screen after the tournament has ended. The bar was emptied of viewers but the object was kept, so anyone joining afterwards was added back onto it and saw a
  • 🐛A player joining the server between two tournaments is no longer added to any bar at all.
  • 🐛Tournament announcements are no longer repeated in the console. One tournament prints its start, four countdowns, the end and the podium, and players already see all of it in chat. Set log-to-console:
  • 🐛Migrations no longer print a console line every world period. Set log-changes: true in migrations.yml if you want it.
  • 🐛Both of those date back to 1.0.0, confirmed against the released jar rather than assumed.
  • 🔧Startup console output is untouched: what loaded, how many fish, which storage and which integrations are still reported. Only the repeating messages went quiet.
v1.1.0 2026-09-02
  • ✨Bait station. A block you place and craft bait at, with a recipe list that shows what each one needs and whether you have it. Gutting finally leads somewhere: you fish, you gut, you craft the bait, yo
  • ✨Bait recipes take three kinds of ingredient: a plain material, a specific species, or any fish of a rarity. That last one is what gives a small fish a use -- a 12 cm cod breaks no record, but as raw m
  • ✨A plugin fish never counts as its vanilla material, so a recipe asking for a plain COD will not eat the 90 cm one you were keeping for the display case.
  • ✨Bounty board. The buying side of the market, where the auction house is the selling side: "I pay 5,000 for a marlin of 200 cm or more". Ask by species, by rarity, by minimum length, or any combination
  • ✨The bounty reward is held the moment it is posted, not when it is claimed, so a hunter can never spend half an hour on a bounty that turns out to be unfunded. A bounty that expires returns its reward
  • ✨Bounties are handed in through the mailbox, so they work whether the player who posted them is online or not.
  • ✨Aquariums. A tank that holds several live fish and shows them in turn on a floating sign above it, with an entropy trickle. Where a display case shows your one best fish, the aquarium is what makes a
  • ✨Aquarium income is configured per rarity, using the ids from tiers.yml, so an abyssal in the tank is worth more than a common one. A single flat number also works.
  • ✨Only an online owner is paid for an aquarium: it is an ornament that pays a little, not a passive farm that fills itself while nobody plays.
  • ✨The bait station and the aquarium are sold in /fish shop alongside baits and totems, as well as by command.
  • ✨New commands: /fish baitstation, /fish aquarium, /fish bounty, plus /fish bounty post and mine.
  • ✨New permissions: abyssalfishing.baitstation, abyssalfishing.aquarium, abyssalfishing.bounty, and the two break.other for the new blocks.
  • ✨All of it in the four languages, and all of it configurable: baits.yml gained a station section and per-bait recipes, plus two new files, bounties.yml and aquariums.yml.
  • 🔧/fish info now prints the state of the rod you are holding: its line and reel values, how many lore lines the plugin owns and what is actually on the item. It is there to make a bug report take one pa
v1.0.1 2026-09-02
  • 🐛The rod no longer stacks copies of its Line and Reel bars. The lore block was being appended instead of replaced, so a new copy piled up on every cast.
  • 🐛Rods that already show the duplicates repair themselves. Nothing to throw away: the next repaint — a cast, an augment, a repair — sweeps out every stale copy, in any language.
  • 🐛The same duplication could happen to the augment and the bait blocks on the rod. Both use the same delimiter and both are fixed.
  • 🐛A brand-new rod now picks up its line and reel the first time it is used. Writes to an item were skipped whenever it had no metadata yet, which is the state a rod is in straight off the crafting table
  • 🐛Fishing with the rod in your off hand now counts. Only the main hand was checked, so an off-hand rod took no wear and never showed its bars.
  • 🐛The Line and Reel bars reach the client the moment they change, instead of waiting for something else to make the inventory resync.
  • 🔧The rod's lore now has a single owner. The three blocks are written together at the end and counted in the rod's own NBT, instead of being found by an invisible marker line that modern versions do not
v1.0.0 2026-09-01
  • 🐛Language console EN
AbyssalFishing / Discussion

Discussion

Comment and share your experience on each plugin version.

Log in to comment on this version.Log in

No comments on this version yet — be the first!

AbyssalFishing / Reviews

Player reviews

What server owners think of this plugin.

—
★★★★★
0 reviews
Log in to leave a review.Log in

No reviews yet.