Per-command cooldowns, warmups, limits, prices and disable rules – with a shared database so your whole network stays in sync.
Per-command cooldowns, warmups, limits, prices and disable rules – with a
shared database so your whole network stays in sync.
Built for Paper 1.20+ (tested on 1.21.8 and 26.1.2). Java 21. Drop-in install,
SQLite out of the box, MySQL/MariaDB for multi-server.
/event, everyone shares the cooldown windowdisabled: true without unregistering it; bypass permission available[Yes] [No] for commands that cost something, per-player togglemessages_<locale>.yml and messages follow client language/bcd status [player] – every active cooldown, remaining uses, warmup state/bcd rule get/set/tempset – inspect or mutate command rules live (temp overrides auto-restore)/bcd grant cooldown/uses – manually seed state on a player/bcd clear cooldowns/uses/warmups/all <player> – cleanup with granularity/bcd reset now/schedule/list – global usage-counter resets, immediate or scheduled/bcd validate – config linter (unknown keys, bad durations, typos in materials/sounds)/bcd audit – decision log (opt-in)/bcd diff – compare config hash across nodes sharing the same DBclearcooldowns, set, info, …)/bcd help – permission-filtered, grouped by categoryvip group inherits every rule from default, overrides just what it needs/plugin:command are rewritten to their bare form so cooldowns and limits still apply (no need to keep the old hard syntax blocker on)/ja hello → /me hello with argument substitution ($1, $*, $player, $world)[boosCooldowns] signs that run commands as player or consoleconfig.yml, plugin warns on divergence, /bcd diff inspectslibraries: in plugin.yml – no manual installV1…V4), applied on startupusers.yml is auto-migrated on first run; old file renamed for safetyBoosCooldownAPI.getInstance() with isOnCooldown, setCooldown, getRemainingUses, …CooldownEvent, WarmupEvent, CommandEvent (all cancellable)%boos_remaining_<cmd>%, %boos_uses_<cmd>%, %boos_on_cooldown_<cmd>%| Version | |
|---|---|
| Java | 21+ |
| Paper / Spigot / Bukkit | 1.20+ (API) |
| Storage | SQLite bundled, or MySQL 5.7+ / MariaDB 10+ |
Every integration is detected at runtime – missing one just disables that feature, never breaks startup.
| Plugin | Unlocks |
|---|---|
| Vault + any Vault-compatible economy (EssentialsX Economy, CMIEconomy, …) | Money prices (price: 100.0) |
| PlayerPoints | Point prices (playerpoints: 10) |
| PlaceholderAPI | %boos_*% placeholders; expansion of third-party placeholders inside plugin messages |
| WorldGuard | regions: per-command restriction |
| LuckPerms (or any permissions plugin) | Group-based rule targeting via booscooldowns.<group-name> |
boosCooldowns.jar from the Hangar page.plugins/.config.yml is generated in plugins/boosCooldowns/.config.yml and run /bcd reload in-game or from console.Upgrading from a pre-4.0 version? users.yml is migrated automatically on first start and renamed to users.yml.migrated-<timestamp>.
database:
type: sqlite # sqlite (default) or mysql / mariadb
# host: localhost
# port: 3306
# database: boosCooldowns
# username: user
# password: secret
pool-size: 4
cache-ttl-seconds: 30
For shared cooldowns across multiple servers (BungeeCord/Velocity
network), point every server at the same MySQL/MariaDB instance and give
each one a unique options.options.node_id.
commands:
groups:
default:
/kit:
cooldown: "1 hour"
warmup: 5 # seconds
limit: 3
limit_reset_delay: "6 hours" # fixed window
price: 100.0 # Vault money
xpcost: 5
playerpoints: 10
itemcost:
item: DIAMOND
count: 1
name: "Kit Token"
server_cooldown: "30 minutes"
# Progressive cooldown – ×2 each time, streak resets after idle
cooldown_multiplier: 2.0
cooldown_reset_after: "6 hours"
# Restrictions
worlds: [survival, nether]
regions: [spawn, arena] # requires WorldGuard
# Effects
warmup_sound: BLOCK_BEACON_AMBIENT
complete_sound: ENTITY_EXPERIENCE_ORB_PICKUP
warmup_particle: ENCHANT
# Access + messages
disabled: false
disabled_message: "&cKit is offline."
cooldown_message: "&7Kit cooling down: &e&seconds&&7."
warmup_message: "&7Preparing kit... &e&seconds&&7."
permission: "myplugin.kit" # optional extra gate
denied_message: "&cNot allowed."
shared_cooldown: [/kit_daily]
shared_limit: [/kit_daily]
vip:
_inherits: default # all /kit rules above
/kit:
cooldown: "10 minutes" # …except this one gets shorter
commands:
aliases:
/ja: /me # exact match
/tell *: /msg $1 $* # wildcard with argument substitution
Placeholders: $1, $2, …, $*, $player, $world.
event_triggers:
- when: KILL
entity: ENDER_DRAGON
reset_cooldown: /boss_reward
message: "&6You slew the dragon! &e/boss_reward&6 is ready."
sound: ENTITY_PLAYER_LEVELUP
broadcast: true # default: false
- when: ADVANCEMENT
advancement: story/mine_diamond
reset_cooldown: /miner_reward
message: "&a/miner_reward has been reset."
Message placeholders: &command&, &player&, &entity& (KILL only),&advancement& (ADVANCEMENT only).
/plugin:command syntaxMinecraft lets anyone bypass a cooldown by typing /minecraft:tp instead
of /tp. You have two ways to stop that:
syntax_blocker_enabled: true, the default) – rejectsinvalid_command_syntax message./paper:version.syntax_blocker_enabled: false +apply_rules_to_prefixed_syntax: true) – the plugin silently rewrites/plugin:cmd to /cmd before running its rule lookup. Players keep theoptions:
options:
disabled_for_ops: true # plugin has no effect on ops
warmups_enabled: true
cooldowns_enabled: true
limits_enabled: true
prices_enabled: true
cancel_warmup_on_move: false
cancel_warmup_on_damage: false
cancel_warmup_on_sneak: false
cancel_warmup_on_sprint: false
cancel_warmup_on_gamemode_change: false
block_interact_during_warmup: false
clear_cooldowns_on_death: false
clear_uses_on_death: false
start_cooldowns_on_death: false
command_logging: false
command_signs: false
syntax_blocker_enabled: true # reject /pluginname:command outright
# when the blocker is off, rewrite /plugin:cmd → /cmd so rules still apply
apply_rules_to_prefixed_syntax: true
command_confirmation: true # ask Yes/No for priced commands
refund_on_warmup_cancel: false
audit_enabled: false # persist every decision to DB
audit_retention_days: 30
default_locale: en
node_id: "" # "" = auto hostname:port
config_sync_interval_seconds: 60
action_bar:
warmup: false
cooldown_on_attempt: false
update_interval_ticks: 10
boss_bar:
warmup: false
color: BLUE # BLUE, GREEN, PINK, PURPLE, RED, WHITE, YELLOW
style: PROGRESS # PROGRESS, NOTCHED_6/10/12/20
Root command: /booscooldowns (alias /bcd). Tab completion is wired up throughout.
| Command | Default | Purpose |
|---|---|---|
/bcd status [player] |
true |
Your cooldowns, limits, active warmup. [player] requires booscooldowns.status.others |
/bcd check <command> |
true |
Is this command on cooldown for me? |
/bcd confirmations |
true |
Toggle the confirmation dialog on/off |
| Command | Default | Purpose |
|---|---|---|
/bcd reload |
op | Reload config.yml |
/bcd clear cooldowns <player> [command] |
op | Clear active cooldowns |
/bcd clear uses <player> [command] |
op | Reset usage counters |
/bcd clear warmups <player> |
op | Cancel active warmups |
/bcd clear all <player> |
op | Wipe cooldowns + uses + warmups |
/bcd rule set <option> <command> <value> [group] |
op | Persist a rule override |
/bcd rule tempset <option> <command> <value> <duration> |
op | Temporary override (auto-restores) |
/bcd rule get <command> [group] |
op | Print effective rules (after inheritance) |
/bcd grant cooldown <player> <command> <duration> |
op | Seed a cooldown manually |
/bcd grant uses <player> <command> <count> |
op | Overwrite remaining uses |
/bcd reset now <command> |
op | Wipe the global usage counter immediately |
/bcd reset schedule <command> <time> |
op | Schedule a global reset (+2h, yyyy-MM-dd HH:mm:ss) |
/bcd reset list |
op | List pending scheduled resets |
| Command | Default | Purpose |
|---|---|---|
/bcd validate |
op | Lint config.yml for typos, bad durations, unknown materials/sounds |
/bcd audit [command] [limit] |
op | Read the command_audit log |
/bcd diff |
op | Compare this node's config hash with peers |
/bcd help [section] |
true |
Autogenerated help; <section> drills into a group |
| Legacy | New |
|---|---|
/bcd clearcooldowns, clearuses, clearwarmups |
/bcd clear cooldowns / uses / warmups |
/bcd set, tempset |
/bcd rule set / tempset |
/bcd scheduleglobalreset, listresets, startglobalreset |
/bcd reset schedule / list / now |
/bcd info, limits, checkcooldown |
/bcd status [player] / /bcd check |
true)| Permission | Effect |
|---|---|
booscooldowns.status |
Use /bcd status on yourself |
booscooldowns.check.cooldown |
Use /bcd check |
booscooldowns.list.limits |
Legacy – now covered by booscooldowns.status |
| Permission | Effect |
|---|---|
booscooldowns.exception |
Bypass the plugin entirely |
booscooldowns.norestriction |
Bypass warmups/cooldowns/prices/limits (aliases still apply) |
booscooldowns.nocooldown[./command] |
Bypass cooldowns, optionally per command |
booscooldowns.nowarmup[./command] |
Bypass warmups |
booscooldowns.nolimit[./command] |
Bypass limits |
booscooldowns.noprice[./command] |
Bypass Vault money cost |
booscooldowns.noxpcost[./command] |
Bypass XP cost |
booscooldowns.noitemcost[./command] |
Bypass item cost |
booscooldowns.noplayerpoints[./command] |
Bypass PlayerPoints cost |
booscooldowns.nodisable[./command] |
Use commands flagged disabled: true |
booscooldowns.noactionbar |
Suppress action-bar notifications |
booscooldowns.nobossbar |
Suppress boss-bar warmup indicator |
booscooldowns.nocancel.{move,damage,sneak,sprint,gamemodechange} |
Don't cancel warmup on that event |
booscooldowns.dontblock.interact |
Interact with blocks/containers during warmup |
op)| Permission | Grants |
|---|---|
booscooldowns.reload |
/bcd reload |
booscooldowns.status.others |
/bcd status <other player> |
booscooldowns.clearcooldowns |
/bcd clear cooldowns, legacy aliases |
booscooldowns.clearuses |
/bcd clear uses |
booscooldowns.clearwarmups |
/bcd clear warmups |
booscooldowns.clear.all |
/bcd clear all |
booscooldowns.set |
/bcd rule set, tempset, legacy set/tempset |
booscooldowns.rule.get |
/bcd rule get |
booscooldowns.grant |
/bcd grant cooldown, grant uses |
booscooldowns.scheduleglobalreset |
/bcd reset now, schedule, list |
booscooldowns.validate |
/bcd validate |
booscooldowns.audit |
/bcd audit |
booscooldowns.diff |
/bcd diff |
booscooldowns.signs.{player,server}.{use,place} |
Use / place [boosCooldowns] signs |
booscooldowns.<group-name> places the player in a non-default command
group. Use with your permissions plugin (LuckPerms, PermissionsEx, etc.):
/lp user Alice permission set booscooldowns.vip true
Install PlaceholderAPI and the boos expansion registers automatically.
| Placeholder | Value |
|---|---|
%boos_remaining_<cmd>% |
Formatted remaining cooldown ("2h 15m") |
%boos_remaining_seconds_<cmd>% |
Raw integer seconds |
%boos_on_cooldown_<cmd>% |
true / false |
%boos_server_cooldown_<cmd>% |
Server-wide cooldown remaining |
%boos_uses_<cmd>% |
"remaining/limit" (or ∞ if no limit) |
%boos_uses_remaining_<cmd>% |
Raw integer remaining uses |
Use underscores instead of spaces in command names – %boos_remaining_daily_claim% for /daily claim. Leading slash is optional.
You can also embed foreign placeholders inside plugin messages:
cooldown_message: "Wait &e%remaining%&r (balance: &a%vault_eco_balance%&r)"
All player state (cooldowns, limits, user preferences, audit log, scheduled resets) is shared automatically through the database. Point every server at the same MySQL/MariaDB and:
Command rules (the commands: section of config.yml) still live per-server – keep them in sync via git, rsync, symlink or deploy pipeline.
The plugin ships drift detection: each node hashes its config.yml on enable and on /bcd reload, writes it to config_version, and a periodic task warns you when peers disagree. /bcd diff shows the mismatch at a glance.
BoosCooldownAPI api = BoosCooldownAPI.getInstance();
CommandData data = api.buildCommandData(player, "/kit");
if (data != null && !api.isOnCooldown(player, data)) {
api.setCooldown(player, data); // CompletableFuture<Void>
}
Consumers referencing BoosCooldownAPI at class-load time should declare loadbefore: [boosCooldowns] in their plugin.yml.
CooldownEvent – player hit an active cooldown (cancellable)WarmupEvent – warmup is starting or completing (cancellable)CommandEvent – plugin is about to process a command (cancellable, set deny message)Need help? Found a bug? Want to suggest a feature?
For bug reports, please include:
/version)latest.log (or the relevant section with timestamps)config.yml/bcd validate output/bcd diff output (multi-server only)This plugin uses bStats
to collect anonymous usage data. In addition to the default server metrics
(player count, Java version, online mode, …) the plugin contributes these
custom charts so the community can see how the plugin is actually used:
default_locale)You can opt out globally in plugins/bStats/config.yml.
Licensed under the MIT License –
copyright © 2011–2026 LordBoos (in-game boosik) and contributors.
Originally by LordBoos (in-game boosik).