I built this plugin to replace static vanilla fishing with an interactive, timing-based minigame rendered directly on the player action bar.
Performance benchmarks
| Metric | FishingMinigame | Vanilla fishing |
|---|---|---|
| CPU cost | < 0.02% tick overhead per active player | Static idle listener |
| Visual update rate | 20 Hz action-bar packets | Static bobber |
| Loot customization | Full vanilla loot tables + custom weighted tiers | Fixed vanilla tables |
| Reload downtime | Instant reload with /fishingminigame reload |
Server restart required |
Technical details
| Item | Details |
|---|---|
| Platforms | PaperMC, Purpur, and Spigot (1.19.4 to 1.21+) |
| Toolchain | Java 17+ and Gradle/Maven |
| UI | Native action-bar packets (ChatMessageType.ACTION_BAR) |
| Compatibility | PyroFishingPro, CustomFishing, and vanilla enchants |
Configuration preview (config.yml)
minigame:
bar-length: 20
target-width: 4
speed: 1.2
max-attempts: 3
visuals:
bar-char: "■"
target-char: "█"
pointer-char: "▼"
color-background: "&8"
color-target: "&a"
color-pointer: "&e"
rewards:
grant-vanilla-xp: true
bonus-custom-loot-chance: 0.15
How it works
- Bite detection: Intercepts the default automatic reel when a fish bites.
- Action-bar indicator: An oscillating cursor moves back and forth across a sweet spot on the HUD.
- Timed catch: The player clicks when the cursor lines up with the target area.
- Enchantment scaling: Lure widens the sweet spot, while Luck of the Sea adds chances for bonus drops.
FAQ
Does it work with other fishing plugins?
Yes. It listens to PlayerFishEvent at high priority, allowing custom loot plugins to populate items before the minigame starts.
How does it handle player latency?
Target checks include ping compensation so players with 100 to 200ms ping can still time catches accurately.