COWMODSКаталог модов

boosCooldowns

Per-command cooldowns, warmups, limits, prices and disable rules – with a shared database so your whole network stays in sync.

Автор: LordBoos1372обновлён 18 апр. 2026 г.
УправлениеТехнологииУтилиты

Описание

boosCooldowns

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.


✨ Features

Core control

  • Per-command cooldowns – regular expressions or wildcards, per command group, with custom messages
  • Warmups – player has to stand still while the command charges up
  • Usage limits – N uses per time window, with scheduled resets
  • Prices – money (Vault), XP levels, items, PlayerPoints
  • Server-wide cooldowns – one player uses /event, everyone shares the cooldown window
  • Progressive cooldowns – multiplier that grows with each consecutive use, resets after a quiet period
  • Disable commands – flag a command disabled: true without unregistering it; bypass permission available

Player UX

  • Warmup effects – boss bar progress indicator, sounds, particles
  • Action bar for warmup countdown and cooldown notices
  • Confirmation dialogs – clickable [Yes] [No] for commands that cost something, per-player toggle
  • Refund on warmup cancel – opt-in return of charged money/items/XP when a warmup is aborted
  • Localization – drop messages_<locale>.yml and messages follow client language
  • Per-command messages – override cooldown/warmup/disabled text per command

Admin tooling

  • /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 DB
  • Legacy aliases – every pre-4.0 command name still works (clearcooldowns, set, info, …)
  • Autogenerated /bcd help – permission-filtered, grouped by category
  • Smart tab completion – suggests options, player names, configured commands

Advanced

  • Per-world restrictions – rule only applies in specific worlds
  • WorldGuard regions – rule only applies inside specific regions (optional)
  • Group inheritance – vip group inherits every rule from default, overrides just what it needs
  • Event-based resets – wipe a cooldown when the player kills an entity or earns an advancement; optional chat message, sound cue and server-wide broadcast
  • Namespace-aware – commands typed as /plugin:command are rewritten to their bare form so cooldowns and limits still apply (no need to keep the old hard syntax blocker on)
  • Command aliases – /ja hello → /me hello with argument substitution ($1, $*, $player, $world)
  • Sign shortcuts – [boosCooldowns] signs that run commands as player or console
  • Multi-server drift detection – each node hashes its config.yml, plugin warns on divergence, /bcd diff inspects

Persistence

  • SQLite (default, zero-config) or MySQL / MariaDB (for networks)
  • JDBC drivers auto-downloaded via libraries: in plugin.yml – no manual install
  • HikariCP connection pool, cache-through for hot-path reads
  • Schema-versioned migrations (V1…V4), applied on startup
  • Legacy users.yml is auto-migrated on first run; old file renamed for safety

Developer

  • Public API – BoosCooldownAPI.getInstance() with isOnCooldown, setCooldown, getRemainingUses, …
  • Custom Bukkit events – CooldownEvent, WarmupEvent, CommandEvent (all cancellable)
  • PlaceholderAPI expansion – %boos_remaining_<cmd>%, %boos_uses_<cmd>%, %boos_on_cooldown_<cmd>%
  • bStats metrics – 13 custom charts covering storage backend (with driver version), feature toggles, detected integrations, multi-node setups, locale distribution and config scale

📦 Requirements

Version
Java21+
Paper / Spigot / Bukkit1.20+ (API)
StorageSQLite bundled, or MySQL 5.7+ / MariaDB 10+

Optional integrations (soft-depend)

Every integration is detected at runtime – missing one just disables that feature, never breaks startup.

PluginUnlocks
Vault + any Vault-compatible economy (EssentialsX Economy, CMIEconomy, …)Money prices (price: 100.0)
PlayerPointsPoint prices (playerpoints: 10)
PlaceholderAPI%boos_*% placeholders; expansion of third-party placeholders inside plugin messages
WorldGuardregions: per-command restriction
LuckPerms (or any permissions plugin)Group-based rule targeting via booscooldowns.<group-name>

🚀 Installation

  1. Download boosCooldowns.jar from the Hangar page.
  2. Drop it into plugins/.
  3. Start the server once – default config.yml is generated in plugins/boosCooldowns/.
  4. Edit 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>.


⚙️ Configuration essentials

Database

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.

A command rule – everything available

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

Aliases

commands:
  aliases:
    /ja: /me                              # exact match
    /tell *: /msg $1 $*                   # wildcard with argument substitution

Placeholders: $1, $2, …, $*, $player, $world.

Event-based cooldown resets

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).

Handling /plugin:command syntax

Minecraft lets anyone bypass a cooldown by typing /minecraft:tp instead of /tp. You have two ways to stop that:

  • Hard blocker (syntax_blocker_enabled: true, the default) – rejects any namespace-prefixed command with an invalid_command_syntax message. Strict but annoying when ops type /paper:version.
  • Transparent rewrite (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 the shortcut, admins keep the cooldown. Recommended.

Global options

options:
  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

💬 Commands

Root command: /booscooldowns (alias /bcd). Tab completion is wired up throughout.

Player commands

CommandDefaultPurpose
/bcd status [player]trueYour cooldowns, limits, active warmup. [player] requires booscooldowns.status.others
/bcd check <command>trueIs this command on cooldown for me?
/bcd confirmationstrueToggle the confirmation dialog on/off

Administration

CommandDefaultPurpose
/bcd reloadopReload config.yml
/bcd clear cooldowns <player> [command]opClear active cooldowns
/bcd clear uses <player> [command]opReset usage counters
/bcd clear warmups <player>opCancel active warmups
/bcd clear all <player>opWipe cooldowns + uses + warmups
/bcd rule set <option> <command> <value> [group]opPersist a rule override
/bcd rule tempset <option> <command> <value> <duration>opTemporary override (auto-restores)
/bcd rule get <command> [group]opPrint effective rules (after inheritance)
/bcd grant cooldown <player> <command> <duration>opSeed a cooldown manually
/bcd grant uses <player> <command> <count>opOverwrite remaining uses
/bcd reset now <command>opWipe the global usage counter immediately
/bcd reset schedule <command> <time>opSchedule a global reset (+2h, yyyy-MM-dd HH:mm:ss)
/bcd reset listopList pending scheduled resets

Diagnostics

CommandDefaultPurpose
/bcd validateopLint config.yml for typos, bad durations, unknown materials/sounds
/bcd audit [command] [limit]opRead the command_audit log
/bcd diffopCompare this node's config hash with peers
/bcd help [section]trueAutogenerated help; <section> drills into a group

Legacy aliases (still work for backwards compatibility)

LegacyNew
/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

🔑 Permissions

Player-level (default true)

PermissionEffect
booscooldowns.statusUse /bcd status on yourself
booscooldowns.check.cooldownUse /bcd check
booscooldowns.list.limitsLegacy – now covered by booscooldowns.status

Bypass permissions

PermissionEffect
booscooldowns.exceptionBypass the plugin entirely
booscooldowns.norestrictionBypass 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.noactionbarSuppress action-bar notifications
booscooldowns.nobossbarSuppress boss-bar warmup indicator
booscooldowns.nocancel.{move,damage,sneak,sprint,gamemodechange}Don't cancel warmup on that event
booscooldowns.dontblock.interactInteract with blocks/containers during warmup

Admin permissions (default op)

PermissionGrants
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

Group targeting

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

🔌 PlaceholderAPI

Install PlaceholderAPI and the boos expansion registers automatically.

PlaceholderValue
%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)"

🌐 Multi-server setup

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:

  • Cooldowns follow the player across the network
  • Server-wide cooldowns block every player everywhere
  • Scheduled resets fire consistently on the node that happens to trigger first

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.


📡 For developers

API

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.

Events

  • 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)

💬 Support & community

Need help? Found a bug? Want to suggest a feature?

For bug reports, please include:

  1. Paper version (/version)
  2. Full latest.log (or the relevant section with timestamps)
  3. Your config.yml
  4. /bcd validate output
  5. /bcd diff output (multi-server only)

📊 Metrics

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:

  • Storage backend (SQLite / MySQL) with drill-down to the driver version
  • Multi-node setups – how many admins share a DB across servers
  • Locale distribution (default_locale)
  • Feature toggles – confirmations, signs, action bar, boss bar, audit, refund-on-cancel
  • Detected integrations – Vault, PlayerPoints, PlaceholderAPI, WorldGuard, LuckPerms
  • Which plugin features admins actually enable (cooldowns, warmups, limits, prices, …)
  • Which warmup-cancel sources are wired up (move, damage, sneak, sprint, gamemode change)
  • Config scale buckets – how many command groups, how many configured commands, how many event triggers

You can opt out globally in plugins/bStats/config.yml.


📝 License & credits

Licensed under the MIT License – copyright © 2011–2026 LordBoos (in-game boosik) and contributors.

Originally by LordBoos (in-game boosik).

Последние версии

Все версии →
release

boosCooldowns 4.0.0

4.0.0
18 апр. 2026 г.137Minecraft: 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5, 1.21.6, 1.21.7, 1.21.8, 1.21.9, 1.21.10, 1.21.11, 26.1, 26.1.1, 26.1.2paper, purpur, spigot
Скачать
Что нового
## [4.0.0] – 2026-04-18 This is a complete rewrite of the plugin. Player state lives in a database instead of a YAML file, commands have been regrouped into nested subcommands, and a long list of new features landed. **Legacy config.yml works unchanged** and every pre-4.0 command name is still routable as an alias, so upgrades are drop-in for server admins. Plugins consuming the Java API need to update their imports – see _Breaking_ below. ### ⚠️ Breaking - **Java package renamed** from `cz.boosik.boosCooldown` → `software.boos.boosCooldown`. Plugins that depend on `BoosCooldownAPI` or the custom events must update their imports and add `loadbefore: [boosCooldowns]` to their `plugin.yml`. - **Minimum Java version raised** from 8 to **21**. - **Maven groupId** changed from `cz.boosik` to `software.boos`. ### ✨ Added **Persistence** - Database-backed state – SQLite (default, zero-config) or MySQL / MariaDB for networks. - Schema-versioned migrations (V1 initial, V2 user_preferences, V3 audit_log, V4 config_version). - HikariCP connection pool with leak detection. - Auto-migration of legacy `users.yml` on first start (old file renamed to `users.yml.migrated-<timestamp>`). - JDBC drivers auto-downloaded via `libraries:` in `plugin.yml`. **Multi-server** - Cooldowns, limits, server cooldowns, user preferences and scheduled resets shared across every server pointing at the same MySQL/MariaDB. - **Server-wide cooldowns** (`server_cooldown:`) – one player using a command blocks everyone else on the network for the window. - **Config drift detection** – each node hashes `config.yml` on enable and on `/bcd reload`, a periodic monitor logs a warning when peers disagree, `/bcd diff` reports which nodes differ. - `options.options.node_id` for human-readable node labels. **Per-command rules** - **Progressive cooldowns** via `cooldown_multiplier` and `cooldown_reset_after`. - **Per-world restrictions** (`worlds: [survival, nether]`). - **WorldGuard regions** (`regions: [spawn, arena]`) as soft-depend. - **Group inheritance** via `_inherits: default` so VIP groups only override what changes. - **Disable commands** via `disabled: true` without unregistering them. - **Per-command messages** (`cooldown_message`, `warmup_message`, `disabled_message`, `server_cooldown_message`) with per-player PlaceholderAPI expansion. **Player UX** - **Boss bar** progress indicator during warmup. - **Action bar** for warmup countdown and cooldown notices on attempt. - **Warmup sounds** (`warmup_sound`, `complete_sound`) and **particles** (`warmup_particle`) per command. - **Confirmation dialogs** – clickable `[Yes]` / `[No]` for commands with a price/limit, per-player toggle persisted in DB. - **Refund on warmup cancel** (`refund_on_warmup_cancel`) – returns money, items and XP when a warmup is aborted. - **Localization** – drop a `messages_<locale>.yml` and messages follow the client language. Bundled example: `messages_cs.yml`. **Admin tooling** - Commands regrouped under `/bcd clear`, `/bcd rule`, `/bcd grant`, `/bcd reset` groups. - New subcommands: `status`, `check`, `clear all`, `rule get`, `grant uses`, `tempset`, `validate`, `audit`, `diff`, `help`. - **Autogenerated `/bcd help`** – permission-filtered, grouped into Player / Administration / Diagnostics sections. - **Smart tab completion** – suggests option keys, online players, configured commands at every level. - **`/bcd validate`** – config linter catches unknown option keys, invalid durations, typos in materials and sounds. - **`/bcd tempset`** – option override that auto-restores after a duration. - **Legacy aliases** – every pre-4.0 command name (`clearcooldowns`, `set`, `info`, `scheduleglobalreset`, …) still routes to its new home. **Automation** - **Event-based cooldown resets** via `event_triggers:` – clear a player's cooldown when they kill a specific entity or earn an advancement, with optional chat message, sound cue and server-wide broadcast. - **Scheduled global limit resets** via `/bcd reset schedule <cmd> <time>`, visible through `/bcd reset list`, persisted in DB. - **Namespace-aware command handling** (`apply_rules_to_prefixed_syntax: true`) – rewrites `/minecraft:tp` → `/tp` so plugin rules still apply, without needing the hard syntax blocker. **Integrations** - **PlaceholderAPI** expansion registered automatically: `%boos_remaining_<cmd>%`, `%boos_remaining_seconds_<cmd>%`, `%boos_on_cooldown_<cmd>%`, `%boos_server_cooldown_<cmd>%`, `%boos_uses_<cmd>%`, `%boos_uses_remaining_<cmd>%`. - **Foreign placeholders inside plugin messages** – any `%vault_eco_balance%` / `%luckperms_primary_group%` etc. resolves per-player in cooldown/warmup/disabled messages. - **Vault**, **PlayerPoints**, **WorldGuard**, **LuckPerms** detected at runtime; missing integration disables its feature, never breaks startup. - **bStats** – 13 custom charts covering storage backend (with driver version drill-down), feature toggles, detected integrations, multi-node setup, locale distribution, config scale, warmup cancel sources. **Developer** - Public `BoosCooldownAPI` facade with `isOnCooldown`, `setCooldown`, `getRemainingUses`, etc. - Custom cancellable Bukkit events: `CooldownEvent`, `WarmupEvent`, `CommandEvent`. - **142 tests** – JUnit 5 + Mockito + MockBukkit integration tests; full CI workflow on every PR. - **JMH benchmark** for the cooldown hot-path. - GitHub Actions CI workflow (`.github/workflows/ci.yml`). **Security** - All SQL uses parameterized `PreparedStatement`. - Vault / PlayerPoints / PlaceholderAPI / WorldGuard class references isolated behind `isPluginEnabled` checks and `LinkageError` catches – plugin boots cleanly even when every optional dependency is missing. - Command pipeline wrapped in try/catch so a bug in a single check can never block every command on the server. ### 🔧 Changed - **Vault / PlayerPoints no longer cause `NoClassDefFoundError`** on servers that don't have them – integrations are now fully soft-depend-safe. - **Package structure** – monolithic `BoosCoolDownListener` (434 lines) split into a service / listener / command / persistence layout. Static `Managers` replaced with an injected `Services` container. - **Build target** – Paper 1.21.8 API, `plugin.yml` declares `api-version: "1.20"` so the jar runs on Paper 1.20+ through 26.1.2 without a rebuild. - **Cooldown storage key** – previously `String.hashCode()` (collidable, opaque), now a normalized, stable `CommandKey` that's human-readable during debugging. - **Timestamps** – `SimpleDateFormat("dd.MM.yyyy HH:mm:ss")` replaced by `java.time.Instant` + epoch-millis columns. - **Hot-path reads** – `PlayerCommandPreprocessEvent` handler only ever touches an in-memory cache; cache is pre-warmed on `PlayerJoinEvent` so no cache miss can hit the DB synchronously. - **Command pipeline ordering** – every check now runs _before_ mutations, preventing partial charges when a later gate rejects the command (see _Fixed_ below). - **Bundled dependencies** – HikariCP and bStats are shaded and relocated under `software.boos.boosCooldown.shaded.*`. ### 🐛 Fixed - **`limit_reset_delay` no longer sticks at zero** – previously, once a player had consumed all their uses and the reset window elapsed, the `resetAt` timestamp was ignored and the limit stayed at 0 forever. The service now refreshes expired windows on read. - **Pipeline no longer partially charges blocked commands** – when a command is blocked by _insufficient funds_ or _warmup already started_, the usage counter and economy balance are no longer mutated before the rejection. Check-then-commit pattern with refund fallback. - **`/plugin:command` syntax** now triggers plugin rules instead of bypassing them, with the option to either reject (`syntax_blocker_enabled: true`) or transparently rewrite (`apply_rules_to_prefixed_syntax: true`). - **Plugin disable no longer leaks resources** – `HikariDataSource.close()` is called, the async executor's `awaitTermination(5s)` waits for pending DB writes, `Bukkit.getScheduler().cancelTasks(this)` cancels timers. Prevents SQLite file locks on Windows after `/reload`. - **Action bar / boss bar effects properly cancelled** when warmup is aborted. - **`Sign.getLine(int)` replaced** with modern `Sign.getSide(Side.FRONT).getLine(int)` for 1.20+ sign compatibility. - **`Bukkit.getOfflinePlayer(String)` blocking I/O** removed from subcommands – `Bukkit.getPlayerExact(String)` is used instead. - **Command listener fails open** – an exception inside the pipeline logs to console but leaves the event alone, so Bukkit still dispatches the command. A bug can't block every command server-wide anymore. - **Config `get("commands.groups.default./kit.limit")` path handling** – rewritten to traverse nested `ConfigurationSection`s instead of string path lookup, fixing rules for commands with slashes in their key. - **`Sound.valueOf(String)` deprecation** – wrapped in `LinkageError` catch so future Paper builds that remove it will log a warning instead of crashing the effect. - **HikariCP leak detection** set to 10s to surface unclosed connections early. ### 🗑️ Removed - Legacy `Managers/` package (replaced by `service/` with dependency injection). - Legacy `Listeners/` package (split into purpose-specific files under `listener/`). - Legacy `Runnables/` duplicate. - `users.yml` – auto-migrated into the database on first run; old file is renamed, not deleted, for safety. ### 📦 Upgrade notes Drop the new jar in and start the server. On first run the plugin will: 1. Create `plugins/boosCooldowns/cooldowns.db` (SQLite) with V1–V4 schema applied. 2. Detect `users.yml` if present, migrate its contents into the DB, and rename the file to `users.yml.migrated-<epoch>`. 3. Keep every rule from the existing `config.yml` (the format is backward compatible – new keys default to backward-compatible values). If you manage more than one server, point every instance at the same MySQL/MariaDB via the new `database:` section and set `node_id` per server. --- Earlier versions of boosCooldowns are tracked in the git history. [4.0.0]: https://github.com/LordBoos/boosCooldowns/releases/tag/v4.0.0