ModsJava
BountyBoard | Player Bounty System | GUI, MySQL 1.21.x - 26.2.x
Java mod listed for Minecraft 1.21–26.x. Downloads from the MC Java Mods app on Android.
⬇ Download on SpigotPlayers put a price on each other's heads. Whoever lands the kill collects.
Paper & Spigot · 1.21+ · Java 21+ · English & German · Free
────────────────────────────────────────────────────────────────────────
BountyBoard is a bounty system for SMP, survival, lifesteal and PvP servers
running an economy. A player pays to put a bounty on someone; the next person
to kill that player collects it. Several players can stack bounties on the
same target, and the board fills itself through automatic bounties on
killstreaks.
Everything a player touches runs through a menu, and everything in that menu
— slots, materials, wording — comes out of a config file.
Free, with nothing held back for a paid version.
────────────────────────────────────────────────────────────────────────
running an economy. A player pays to put a bounty on someone; the next person
to kill that player collects it. Several players can stack bounties on the
same target, and the board fills itself through automatic bounties on
killstreaks.
Everything a player touches runs through a menu, and everything in that menu
— slots, materials, wording — comes out of a config file.
Free, with nothing held back for a paid version.
────────────────────────────────────────────────────────────────────────
WHAT IT DOES
• Stacked bounties. Several hunters can each put money on the same target.
The killer collects the lot, or only the largest, depending on your config.
• Automatic bounties. The server puts a price on players who are on a
killstreak. Without this a new server shows an empty board for weeks,
because every bounty needs somebody willing to pay for one.
• Raises. Placing a bounty on someone you already targeted tops up your
existing one instead of being refused.
• Expiry with refunds. Bounties lapse after a configurable time and give
back a configurable share, so a bounty on a player who quit does not sit
there forever.
• Kill attribution that matches how people actually fight. Melee,
projectiles, and optionally knocking someone into the void, off a cliff or
into lava — the last player to land a hit stays credited for a
configurable window.
• A fee on placement. Optional economy sink, charged on top of the amount so
a player who types 10000 gets a bounty worth 10000.
The killer collects the lot, or only the largest, depending on your config.
• Automatic bounties. The server puts a price on players who are on a
killstreak. Without this a new server shows an empty board for weeks,
because every bounty needs somebody willing to pay for one.
• Raises. Placing a bounty on someone you already targeted tops up your
existing one instead of being refused.
• Expiry with refunds. Bounties lapse after a configurable time and give
back a configurable share, so a bounty on a player who quit does not sit
there forever.
• Kill attribution that matches how people actually fight. Melee,
projectiles, and optionally knocking someone into the void, off a cliff or
into lava — the last player to land a hit stays credited for a
configurable window.
• A fee on placement. Optional economy sink, charged on top of the amount so
a player who types 10000 gets a bounty worth 10000.
────────────────────────────────────────────────────────────────────────
ANTI-ABUSE
The attack every bounty plugin has to survive: place a large bounty on your
own alt, kill it, collect your money back plus whatever anyone else
contributed.
No single check stops every variant, so several cheap ones are layered — and
the ones that also punish genuine rivalries are off by default rather than on:
• A killer never collects a bounty they funded themselves
• Cooldown between repeat kills on the same victim
• Kill-trading detection across a rolling window
• Optional: revenge kills, shared connections, teammates, minimum playtime
The kill log is stored in the database, not in memory. Where it is held in
memory, "kill, wait for a restart, kill again" is the standard way around the
cooldown.
Automatic bounties are gated by the same checks, because they are new money
entering the economy and would otherwise be farmable with an alt.
own alt, kill it, collect your money back plus whatever anyone else
contributed.
No single check stops every variant, so several cheap ones are layered — and
the ones that also punish genuine rivalries are off by default rather than on:
• A killer never collects a bounty they funded themselves
• Cooldown between repeat kills on the same victim
• Kill-trading detection across a rolling window
• Optional: revenge kills, shared connections, teammates, minimum playtime
The kill log is stored in the database, not in memory. Where it is held in
memory, "kill, wait for a restart, kill again" is the standard way around the
cooldown.
Automatic bounties are gated by the same checks, because they are new money
entering the economy and would otherwise be farmable with an alt.
────────────────────────────────────────────────────────────────────────
BUILT SO IT CANNOT PAY TWICE
Two things go wrong in bounty plugins, and both are handled explicitly here
rather than hoped for.
A bounty paying out more than once. Every claim is one conditional database
update. The database decides the winner: exactly one caller sees an affected
row and pays out, every other caller sees zero and stops. That holds for two
deaths in the same tick, a claim racing an expiry, and two servers sharing one
MySQL database.
This is covered by tests, not just by intent. Sixteen threads race a single
bounty and exactly one wins; remove the guard and all sixteen win, which is
the sixteenfold payout the test exists to catch.
Money disappearing. A payout is written to a ledger before the economy is
asked to hand it over, and the row is only closed once the deposit actually
succeeded. A crash, a database hiccup, or an economy plugin that has not
loaded yet all leave an open row that gets settled later — on the retry task
or when the player next logs in. /bounty admin payouts shows what is
outstanding.
Amounts are stored as scaled integers rather than floating point, so repeated
additions stay exact.
Nothing blocking runs on the server thread, and there is no per-player tick
anywhere in the plugin.
rather than hoped for.
A bounty paying out more than once. Every claim is one conditional database
update. The database decides the winner: exactly one caller sees an affected
row and pays out, every other caller sees zero and stops. That holds for two
deaths in the same tick, a claim racing an expiry, and two servers sharing one
MySQL database.
This is covered by tests, not just by intent. Sixteen threads race a single
bounty and exactly one wins; remove the guard and all sixteen win, which is
the sixteenfold payout the test exists to catch.
Money disappearing. A payout is written to a ledger before the economy is
asked to hand it over, and the row is only closed once the deposit actually
succeeded. A crash, a database hiccup, or an economy plugin that has not
loaded yet all leave an open row that gets settled later — on the retry task
or when the player next logs in. /bounty admin payouts shows what is
outstanding.
Amounts are stored as scaled integers rather than floating point, so repeated
additions stay exact.
Nothing blocking runs on the server thread, and there is no per-player tick
anywhere in the plugin.
────────────────────────────────────────────────────────────────────────
MENUS
• Main menu with your own bounty, what you have placed, and your rank
• Browsable list with sorting, search, and an online-only filter so hunters
see who is actually reachable
• Per-target detail showing every contributor
• Leaderboards: current bounties, most collected, most kills, most placed
• Admin menu with history, outstanding payouts and a live overview
Slots, materials and which button does what live in gui.yml. The wording lives
in the language files, so switching language translates the menus too instead
of leaving half the plugin in English.
• Browsable list with sorting, search, and an online-only filter so hunters
see who is actually reachable
• Per-target detail showing every contributor
• Leaderboards: current bounties, most collected, most kills, most placed
• Admin menu with history, outstanding payouts and a live overview
Slots, materials and which button does what live in gui.yml. The wording lives
in the language files, so switching language translates the menus too instead
of leaving half the plugin in English.
────────────────────────────────────────────────────────────────────────
CONFIGURATION
• config.yml rules, limits, fee, expiry, automatic bounties, worlds,
protection, anti-abuse, effects, broadcasts, Discord
• lang/english.yml every line of text, menus included
• lang/german.yml
• gui.yml menu layout
• database.yml storage
All commented in full. /bounty reload applies everything except storage.
Languages. English and German ship with the plugin. English is always loaded
underneath the chosen language key by key, so a translation missing a line
falls back to English for that line instead of showing an error — an
incomplete translation breaks nothing. Add your own by copying english.yml to
lang/<code>.yml.
Per-rank limits. Either permission nodes that work with any permission plugin,
or LuckPerms meta keys. The most generous match wins, so stacking an inherited
rank on a purchased one never leaves a player worse off:
bounty.limit.amount.5000000
bounty.limit.active.50
bounty.cooldown.create.10
/lp group vip meta set bounty-max-amount 5000000
World restrictions. Deaths in a listed world never pay out and the bounty
stays untouched; a separate list disables the commands entirely. For lobbies,
creative and minigame worlds.
Protected players. A permission plus a config list for offline players. It
holds against administrators too — a protection list staff can walk around is
not one.
Full reference on the Documentation tab.
protection, anti-abuse, effects, broadcasts, Discord
• lang/english.yml every line of text, menus included
• lang/german.yml
• gui.yml menu layout
• database.yml storage
All commented in full. /bounty reload applies everything except storage.
Languages. English and German ship with the plugin. English is always loaded
underneath the chosen language key by key, so a translation missing a line
falls back to English for that line instead of showing an error — an
incomplete translation breaks nothing. Add your own by copying english.yml to
lang/<code>.yml.
Per-rank limits. Either permission nodes that work with any permission plugin,
or LuckPerms meta keys. The most generous match wins, so stacking an inherited
rank on a purchased one never leaves a player worse off:
bounty.limit.amount.5000000
bounty.limit.active.50
bounty.cooldown.create.10
/lp group vip meta set bounty-max-amount 5000000
World restrictions. Deaths in a listed world never pay out and the bounty
stays untouched; a separate list disables the commands entirely. For lobbies,
creative and minigame worlds.
Protected players. A permission plus a config list for offline players. It
holds against administrators too — a protection list staff can walk around is
not one.
Full reference on the Documentation tab.
────────────────────────────────────────────────────────────────────────
COMMANDS
/bounty Main menu
/bounty set <player> <amount> Place or raise a bounty
/bounty remove <player> Withdraw your own
/bounty list [search] Browse active bounties
/bounty top [board] Leaderboards
/bounty mine What you have placed
/bounty info <player> What is on someone's head
/bounty stats [player] Lifetime statistics
/bounty reload Reload configuration
/bounty admin set|remove|clear|history|payouts
Aliases: /bounties, /kopfgeld, /wanted.
Amounts accept 50000, 50k, 1.5m, and grouped forms in either notation.
/bounty set <player> <amount> Place or raise a bounty
/bounty remove <player> Withdraw your own
/bounty list [search] Browse active bounties
/bounty top [board] Leaderboards
/bounty mine What you have placed
/bounty info <player> What is on someone's head
/bounty stats [player] Lifetime statistics
/bounty reload Reload configuration
/bounty admin set|remove|clear|history|payouts
Aliases: /bounties, /kopfgeld, /wanted.
Amounts accept 50000, 50k, 1.5m, and grouped forms in either notation.
────────────────────────────────────────────────────────────────────────
INTEGRATIONS
• Vault — required, plus any economy plugin
• PlaceholderAPI — around 30 placeholders including per-board, per-rank
lookups. Everything is served from memory, because scoreboard plugins poll
these every second
• LuckPerms — optional, for per-rank limits through meta
• Discord — optional webhook for placed, raised, collected and expired
bounties. Delivery runs on its own thread and never touches the server
thread
Storage. SQLite by default with no setup at all, MySQL or MariaDB optionally.
Several servers can share one database: payouts stay correct by construction,
because the claim is decided by the database rather than by any one server.
• Vault — required, plus any economy plugin
• PlaceholderAPI — around 30 placeholders including per-board, per-rank
lookups. Everything is served from memory, because scoreboard plugins poll
these every second
• LuckPerms — optional, for per-rank limits through meta
• Discord — optional webhook for placed, raised, collected and expired
bounties. Delivery runs on its own thread and never touches the server
thread
Storage. SQLite by default with no setup at all, MySQL or MariaDB optionally.
Several servers can share one database: payouts stay correct by construction,
because the claim is decided by the database rather than by any one server.
────────────────────────────────────────────────────────────────────────
DEVELOPER API
BountyManager bounties = ((BountyPlugin) Bukkit.getPluginManager()
.getPlugin("BountyBoard")).getBountyManager();
bounties.createBounty(creatorId, "Notch", targetId, "Steve",
new BigDecimal("50000"), BountySource.PLAYER)
.thenAccept(result -> {
// result.status() says what happened
});
Five cancellable events: BountyCreateEvent, BountyIncreaseEvent,
BountyClaimEvent, BountyExpireEvent, BountyRemoveEvent. The create, increase
and claim events let you rewrite the amount, which is the supported hook for
rank multipliers and event bonuses — and a listener cannot push a bounty past
your configured limits, because the new value is re-validated.
BountyClaimEvent, BountyExpireEvent, BountyRemoveEvent. The create, increase
and claim events let you rewrite the amount, which is the supported hook for
rank multipliers and event bonuses — and a listener cannot push a bounty past
your configured limits, because the new value is re-validated.
────────────────────────────────────────────────────────────────────────
REQUIREMENTS
• Paper or Spigot, 1.21 or newer
• Java 21 or newer
• Vault and an economy plugin
• Optional: PlaceholderAPI, LuckPerms
Built against the 1.21 API rather than the newest one, which is what lets a
single build run on 1.21 and on every later release.
The SQLite and MySQL drivers are declared in plugin.yml and downloaded once by
the server on first start. Nothing else to install.
• Java 21 or newer
• Vault and an economy plugin
• Optional: PlaceholderAPI, LuckPerms
Built against the 1.21 API rather than the newest one, which is what lets a
single build run on 1.21 and on every later release.
The SQLite and MySQL drivers are declared in plugin.yml and downloaded once by
the server on first start. Nothing else to install.
────────────────────────────────────────────────────────────────────────
METRICS
BountyBoard sends anonymous usage statistics to bStats: server version, Java
version, plugin version, storage backend and which optional hooks are active.
No player data, no IP addresses, nothing identifying your server. Switch it
off in plugins/bStats/config.yml if you would rather not.
version, plugin version, storage backend and which optional hooks are active.
No player data, no IP addresses, nothing identifying your server. Switch it
off in plugins/bStats/config.yml if you would rather not.
────────────────────────────────────────────────────────────────────────
BUGS AND QUESTIONS
Use the Discussion tab for questions and the Issues tracker for bugs. Reviews
are not a support channel — I cannot reply to them properly, so a bug reported
there stays unfixed.
For a bug report, please include:
• Your server version and the output of /version
• The full stack trace from the console, not a screenshot of one line
• Your config.yml if the behaviour depends on settings
are not a support channel — I cannot reply to them properly, so a bug reported
there stays unfixed.
For a bug report, please include:
• Your server version and the output of /version
• The full stack trace from the console, not a screenshot of one line
• Your config.yml if the behaviour depends on settings
────────────────────────────────────────────────────────────────────────
Quick facts
- Edition: Minecraft Java
- File type: .jar
- Minecraft versions listed: 1.21, 26.1, 26.2
- How to install: Install the matching mod loader (Forge, Fabric or NeoForge) for your Minecraft version. → Download the .jar. → Put it in the .minecraft/mods folder and launch that loader profile.
- Where to get it: Opens on Spigot — not every file is mirrored on our own servers.
Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.
BountyBoard | Player Bounty System | GUI, MySQL 1.21.x - 26.2.x is a free Minecraft Java mod. Compatible with Minecraft 1.21, 26.1, 26.2. Downloaded 53 times (via Spigot). Download it and open it directly in the game.