FishingFestival Guide¶
FishingFestival is a polished fishing tournament plugin for Paper/Purpur servers. It turns regular fishing into competitive events with custom fish, rarity tiers, live leaderboards, physical trophies, token rewards, and a full in-game admin GUI.
At a glance:
- 5 tournament types — Biggest Fish, Smallest Fish, Most Fish, Total Score, and Rarest Fish.
- Custom fish system — define unlimited species with rarities, weights, scores, biome/weather/time restrictions, and custom model data.
- Live leaderboards — boss bars, action bars, and broadcast announcements.
- Reward tables — command rewards + festival tokens for 1st, 2nd, 3rd, and participation.
- Token shop — spend earned tokens on items configured by admins.
- Trophies — physical winner trophies and rare-catch trophies.
- Auto scheduling — start festivals automatically by day/time/timezone.
- Anti-exploit — catch-rate limits, same-spot detection, and minimum catch intervals.
- Crash recovery — active festivals survive server restarts.
- Full admin GUI — manage festivals, fish, rewards, schedules, and shop items without touching files.
Install¶
- Put
fishingfestival-1.0.0.jarinto your server'spluginsfolder. - Restart the Minecraft server.
- The plugin will create:
plugins/FishingFestival/config.ymlplugins/FishingFestival/festivals.ymlplugins/FishingFestival/fish.ymlplugins/FishingFestival/rewards.ymlplugins/FishingFestival/schedules.ymlplugins/FishingFestival/history.mv.db(H2 database)
Quick Start¶
Start a festival manually from a pre-made profile:
Players will immediately see a broadcast, a boss bar will appear, and catches will start scoring. When the timer runs out, winners are announced, rewards are given, and results are saved to the database.
Open the player GUI at any time:
Commands¶
Main command: /fishfest (aliases: /ff, /fishingfestival)
Player Commands¶
| Command | Description |
|---|---|
/fishfest |
Open the player GUI. |
/fishfest gui or menu |
Open the player GUI. |
/fishfest me |
Show your current festival stats and rank. |
/fishfest top |
Show the live leaderboard for the active festival. |
/fishfest tokens or balance |
Show your festival token balance. |
/fishfest shop |
Open the token shop. |
/fishfest rewards |
View the active festival's reward table summary. |
/fishfest history [player] |
View recent festival winners, or a specific player's history. |
/fishfest alltime |
View all-time leader records (wins, catches, biggest fish, score, legendary catches). |
/fishfest stats [player] |
View saved database stats for a player (defaults to you). |
Admin Commands¶
| Command | Description |
|---|---|
/fishfest start <profile> |
Start a festival from a profile in festivals.yml. |
/fishfest stop |
End the active festival immediately and announce winners. |
/fishfest pause |
Pause scoring (catches still happen but do not count). |
/fishfest resume |
Resume paused scoring. |
/fishfest reload |
Reload config.yml, festivals.yml, fish.yml, rewards.yml, and schedules.yml. |
/fishfest admin |
Open the main admin GUI. |
/fishfest admin festival or festivals |
Open the festival manager. |
/fishfest admin fish or fishes |
Open the fish manager. |
/fishfest admin rewards or reward |
Open the reward manager. |
/fishfest admin schedules or schedule |
Open the schedule manager. |
/fishfest admin shop |
Open the shop manager. |
/fishfest schedule list |
List all configured schedules. |
/fishfest schedule enable <id> |
Enable a schedule. |
/fishfest schedule disable <id> |
Disable a schedule. |
Permissions¶
| Permission | Default | Description |
|---|---|---|
fishingfestival.use |
true | Basic festival commands (/fishfest, GUI, /me, /top). |
fishingfestival.top |
true | View leaderboards. |
fishingfestival.shop |
true | Open the token shop. |
fishingfestival.tokens |
true | View token balance. |
fishingfestival.start |
op | Start festivals. |
fishingfestival.stop |
op | Stop festivals. |
fishingfestival.reload |
op | Reload configuration. |
fishingfestival.admin |
op | Full admin access (pause, resume, admin GUI, schedule editing, debug). |
Tournament Types¶
Set the scoring mode in each festival profile (festivals.yml):
| Type | How it scores |
|---|---|
BIGGEST_FISH |
Highest single fish weight wins. |
SMALLEST_FISH |
Lowest single fish weight wins. |
MOST_FISH |
Most total catches wins. |
TOTAL_SCORE |
Highest cumulative score across all catches wins. |
RAREST_FISH |
Best rarity rank wins; ties broken by biggest weight. |
Config Files¶
config.yml¶
The main settings file.
config-version: 2
prefix: "&b&lFishingFestival &8» &r"
leaderboard-size: 10
messages:
no-permission: "&cYou do not have permission."
no-active-festival: "No festival is active. Admins can run &f/fishfest start weekend&r."
festival-started: "&a{festival} has started! Fish now to compete."
festival-ended: "&e{festival} has ended!"
catch: "You caught {rarity_color}{fish} &7({weight}kg, +{score} score)&r"
catch-token-bonus: "Catch bonus: &f{tokens} &bfestival tokens&r."
tokens-balance: "You have &f{tokens} &bfestival tokens&r."
rare-catch-broadcast: "{player} caught {rarity_color}{fish} &7({weight}kg)&r"
# ... (and more)
formats:
leaderboard-title: "&b&l{festival} Leaderboard"
trophy-title-winner: "#{place} Festival Winner"
trophy-title-rare: "Rare Catch"
anti-exploit:
min-catch-seconds: 2
same-spot-check: false
min-same-spot-distance: 0
max-catches-per-minute:
enabled: true
warning-threshold: 20
block-threshold: 30
display:
bossbar: true
actionbar: true
rare-sounds: true
titles: true
particles: true
gui:
filler:
enabled: false
material: "BLACK_STAINED_GLASS_PANE"
name: " "
titles:
player: "&bFishingFestival"
admin: "&bFishingFestival Admin"
buttons:
back: "&7Back"
next-page: "&aNext Page"
previous-page: "&cPrevious Page"
festival-display:
bossbar-color: "BLUE"
bossbar-style: "SOLID"
recovery:
restore-active-festival: true
trophies:
enabled: true
winner-trophies: true
rare-catch-trophies: true
rare-catch-minimum-rarity: "LEGENDARY"
material: "NAUTILUS_SHELL"
storage:
database-file: "history"
tokens:
enabled: true
per-catch:
enabled: true
rarity:
COMMON: 0
UNCOMMON: 0.1
RARE: 0.2
EPIC: 0.5
LEGENDARY: 1.0
shop:
enabled: true
title: "&bFestival Token Shop"
size: 27
confirm-purchases: true
filler:
enabled: false
material: "GRAY_STAINED_GLASS_PANE"
name: " "
items:
diamonds:
slot: 10
material: "DIAMOND"
name: "&bDiamond Pack"
lore:
- "&7Costs &f25 &7tokens"
- "&7Gives 3 diamonds."
cost: 25
commands:
- "give {player} diamond 3"
Key sections explained:
prefix— the plugin's chat prefix. Use&color codes.messages— almost every player-facing message is editable here.anti-exploit— prevents auto-fishing and macro abuse.display— toggles boss bars, action bars, sounds, particles.trophies— configure physical trophies given to winners and rare-catch anglers.tokens— enable/disable tokens and set per-catch token rewards by rarity.shop— define items players can buy with tokens.{player}is replaced in commands.
festivals.yml¶
Define reusable festival profiles.
config-version: 2
festivals:
weekend:
display-name: "Weekend Fishing Derby"
duration-minutes: 30
tournament-type: "BIGGEST_FISH"
worlds:
- "world"
auto-join: true
bossbar: true
catch-pool: "default"
rewards: "weekend-rewards"
display-name— shown in broadcasts and the boss bar.duration-minutes— how long the festival lasts.tournament-type—BIGGEST_FISH,SMALLEST_FISH,MOST_FISH,TOTAL_SCORE, orRAREST_FISH.worlds— restrict to specific world names. Empty list = all worlds.bossbar— show a server-wide boss bar timer.catch-pool— which fish pool to use (matchespoolsinfish.yml).rewards— which reward table fromrewards.ymlto use.
fish.yml¶
Define custom fish species and rarity tiers.
config-version: 2
rarities:
COMMON:
color: "&f"
multiplier: 1.0
broadcast: false
UNCOMMON:
color: "&a"
multiplier: 1.25
broadcast: false
RARE:
color: "&9"
multiplier: 1.75
broadcast: false
EPIC:
color: "&5"
multiplier: 2.5
broadcast: true
LEGENDARY:
color: "&6"
multiplier: 4.0
broadcast: true
fish:
common_carp:
name: "&fCommon Carp"
rarity: "COMMON"
weight-min: 0.5
weight-max: 4.0
score: 10
chance: 60
material: "COD"
pools: ["default"]
worlds: []
biomes: []
weather: []
times: []
custom-model-data: 0
golden_trout:
name: "&6Golden Trout"
rarity: "LEGENDARY"
weight-min: 4.0
weight-max: 22.0
score: 500
chance: 2
material: "TROPICAL_FISH"
pools: ["default"]
broadcast: true
color— the Minecraft color code prefix for that rarity.multiplier— multiplies the fish's base score.broadcast— if true, server sees a chat broadcast when caught.chance— relative weight in the roll pool. Higher = more common.material— the Bukkit material the caught item becomes.pools— which catch pools this fish belongs to.worlds/biomes/weather/times— optional restrictions. Empty = no restriction.weather:CLEAR,RAIN,THUNDERtimes:DAY,NIGHTcustom-model-data— resource pack support for custom item models.broadcast(per-fish) — overrides rarity broadcast for this species.
rewards.yml¶
Define command + token reward tables.
config-version: 2
reward-tables:
weekend-rewards:
first:
tokens: 40
commands:
- "give {player} diamond 8"
- "xp add {player} 10 levels"
second:
tokens: 25
commands:
- "give {player} emerald 16"
third:
tokens: 15
commands:
- "give {player} gold_ingot 16"
participation:
tokens: 5
commands:
- "xp add {player} 3 levels"
{player}is replaced with the winner's name in commands.tokensare added to the player's festival token balance.
schedules.yml¶
Configure automatic festival starts.
config-version: 2
schedules:
saturday-derby:
enabled: false
festival: "weekend"
timezone: "UTC"
days: ["SATURDAY"]
time: "19:00"
enabled— must betruefor the schedule to run.festival— the profile ID fromfestivals.yml.timezone— any valid JavaZoneId(e.g.UTC,America/New_York).days— list ofMONDAYthroughSUNDAY.time— 24-hour formatHH:MM.
Token System & Shop¶
Players earn tokens in two ways:
- Per-catch tokens — configured in
config.ymlundertokens.per-catch.rarity. - Placement tokens — configured in
rewards.ymlunder each reward table.
Spend tokens in the shop:
Shop items are configured in config.yml under shop.items. Each item needs:
slot— inventory slot (0–26 for a 27-slot shop).material— Bukkit material name.name— display name with&color codes.lore— item description lines.cost— token price.commands— list of console commands to run on purchase. Use{player}.permission(optional) — restrict purchase to players with this permission.
If shop.confirm-purchases is true, players see a confirmation GUI before buying.
Trophies¶
When a festival ends, top 3 winners receive a Winner Trophy item (default: Nautilus Shell). The trophy lore includes:
- Player name
- Festival name
- Placement rank
- Biggest fish species and weight
If rare-catch trophies are enabled, catching a fish at or above the configured minimum rarity (default: LEGENDARY) also awards a Rare Catch Trophy.
Trophy settings are in config.yml under trophies.
Admin GUI¶
Admins can manage almost everything in-game without editing files.
Open the main admin menu:
Main Admin Menu¶
- Tournament Type — cycle between the 5 scoring modes.
- Duration — left click +60s, right click -60s, shift click to type exact seconds in chat.
- Reward Table — cycle available reward tables.
- Catch Pool — cycle available fish pools.
- Bossbar — toggle boss bar display.
- Reward Builder — create/edit a reward table via chat prompts.
- Fish Builder — create/edit a custom fish via chat prompts.
- Fish Manager — list, clone, and delete fish entries.
- Shop Manager — list configured shop items.
- Festival Manager — list, start, clone, and delete festival profiles.
- Schedule Manager — create, toggle, and delete schedules.
- Reward Manager — list, clone, and delete reward tables.
- Save Custom Festival — save the current draft to
festivals.yml. - Save And Start — save the draft, reload profiles, and start the festival.
Festival Manager¶
Click any festival to edit it. You can:
- Start it immediately.
- Adjust duration, type, reward table, and catch pool.
- Clone it (creates a copy prefixed with
clone_). - Delete it (only custom/clone entries can be deleted from GUI).
Fish Manager¶
Click any fish to edit it. You can:
- Change rarity.
- Adjust chance.
- Toggle broadcast.
- Clone or delete (only custom/clone fish).
Builders (Chat Prompts)¶
When you use the Reward Builder or Fish Builder, the GUI closes and the plugin waits for you to type values in chat:
- Reward tokens: type
first,second,third,participation(e.g.40,25,15,5). - Reward command: type a console command using
{player}. - Fish name: type the display name with
&color codes. - Fish numbers: type
minWeight,maxWeight,score,chance(e.g.1,10,100,5). - Fish material: type a Bukkit material name (e.g.
TROPICAL_FISH).
Scheduling¶
Instead of starting festivals manually, create schedules in schedules.yml:
schedules:
saturday-derby:
enabled: true
festival: "weekend"
timezone: "UTC"
days: ["SATURDAY"]
time: "19:00"
The plugin checks every minute. When the current day/time/timezone match, the scheduled festival starts automatically. Each schedule only fires once per minute.
Enable or disable schedules in-game:
Anti-Exploit¶
FishingFestival includes built-in protections against auto-fishing and macro abuse:
| Setting | Default | What it does |
|---|---|---|
min-catch-seconds |
2 |
Minimum seconds between qualifying catches. |
same-spot-check |
false |
Require the player to move between catches. |
min-same-spot-distance |
0 |
Minimum distance (blocks) the player must move. |
max-catches-per-minute.enabled |
true |
Limit catches per minute. |
warning-threshold |
20 |
Console warning when a player hits this many catches in 60 seconds. |
block-threshold |
30 |
Blocks catches beyond this rate per minute. |
If a catch is blocked, the player sees the ignored-catch message.
Crash Recovery¶
If recovery.restore-active-festival is true (default), the plugin saves the active festival state to plugins/FishingFestival/active-festival.yml every minute.
If the server restarts while a festival is running, it will:
- Reload the festival profile.
- Restore all player stats and catches.
- Resume the timer from where it left off.
- Announce the restored festival to the server.
If the festival had already ended during downtime, it is discarded.
Database & History¶
All completed festival results are stored in plugins/FishingFestival/history.mv.db (H2).
Stored data includes:
- Festival name, profile, start/end times.
- Player placements, catches, biggest weight, and total score.
- Individual catch records (species, rarity, weight, score).
- Token balances.
Players can query this history with:
Troubleshooting¶
- No festival active message: Admins must start one with
/fishfest start <profile>or set up a schedule. - Fish not appearing: Check the
catch-poolin the festival profile matches apoolsentry infish.yml. Also verify world/biome/weather/time restrictions. - Custom model data not showing: Ensure your resource pack is loaded and the
custom-model-datavalue matches. - Shop item not working: Verify the
materialis a valid Bukkit material name. Check console for command errors. - Schedule not firing: Make sure
enabled: true, the timezone is valid, and the day/time strings are correct. - Config changes not applying: Use
/fishfest reloador restart the server. Some changes (like shop size) may need a restart. - GUI items stuck on cursor: This is prevented automatically, but if it happens, pressing
Escor clicking an empty slot clears it. - Leaderboard looks wrong: Remember that each tournament type scores differently.
MOST_FISHranks by catch count, not weight.