Key All Pro
Automated crate key drops for every player Paper & Folia ready.
▌ Overview
KeyAllPro automatically broadcasts crate keys to every online player on a fully configurable interval. Built from the ground up for both Paper and Folia it uses the modern AsyncScheduler, GlobalRegionScheduler, and EntityScheduler APIs, so no thread is ever blocked and the plugin is fully correct under Folia's regionalized model.
The countdown is driven by wall-clock time rather than server ticks, so TPS drops and GC pauses cannot cause drift or double-fires. Timer state is persisted across restarts a reboot won't erase your players' wait.
▌ Features
⏱ Timer System
- Wall-clock accurate countdown uses System.currentTimeMillis(), immune to TPS fluctuations
- Double-fire proof atomic CAS guard prevents executing twice on the same tick
- Persists across restarts resumes from the saved timestamp in data.yml
- Configurable interval any value in seconds (e.g. 3600 = 1 hour)
- Warning thresholds alerts at 300s · 60s · 30s · 10s · 5s (fully customizable list)
- Mid-cycle override /keyall settime <seconds> without any restart
- Force drop /keyall give fires an instant key drop on demand
Crate & Reward System
- Multiple crate types define unlimited crates in config, each with their own commands
- ROTATION mode cycles through crates in a predictable, ordered sequence
- RANDOM mode weighted random selection each cycle (configure weights per crate)
- Per-rank rewards extra keys for VIP / MVP / Elite tiers via permission nodes
- Bonus reward chance configurable % chance to award a random extra key per player
- Daily Double event toggle a day-of-week multiplier (e.g. 2× keys every Saturday)
- Offline catch-up optionally give missed keys to players when they next join
- Works with any crate plugin EZCrates, CratesPlus, ExcellentCrates, SupremeCrates, etc.
Messaging System
- Chat broadcast full-colour announcements at every warning and on drop execution
- ActionBar persistent countdown displayed above the hotbar
- Title overlay configurable fade-in / stay / fade-out durations (in ticks)
- BossBar live progress bar draining as the timer counts down; configurable colour & style
- Sounds play any Bukkit sound key at warning intervals and on drop
- Per-player confirmation private message telling each player exactly what key they received
- Full colour code support standard & colour codes in all messages
PlaceholderAPI
- %keyall_time% countdown in mm:ss format
- %keyall_time_long% verbose format, e.g. 1h 30m 45s
- %keyall_status% Waiting or Giving
- %keyall_players% number of currently online players
- %keyall_next_crate% display name of the upcoming crate
- %keyall_interval% configured full interval in seconds
⚙ Developer API
- Clean KeyAllAPI class force drops, set timer, give to a specific player, query state
- All methods are thread-safe call from any sync or async context
- Obtain via ((KeyAllPro) Bukkit.getPluginManager().getPlugin("KeyAllPro")).getApi()
▌ Commands & Permissions
| Command | Description | Permission |
|---|---|---|
| /keyall | View countdown status | keyallpro.use |
| /keyall give | Force an immediate key drop | keyallpro.give |
| /keyall reload | Hot-reload config.yml | keyallpro.reload |
| /keyall settime <seconds> | Set countdown to N seconds | keyallpro.settime |
| /keyall status | Alias for /keyall | keyallpro.use |
Permission Nodes
- keyallpro.admin grants all sub-permissions (default: op)
- keyallpro.use view timer status
- keyallpro.give force key drop
- keyallpro.reload reload config
- keyallpro.settime change countdown value
- keyallpro.rank.vip / keyallpro.rank.mvp / keyallpro.rank.elite donor rank reward tiers
▌ Configuration Highlights
YAML:
# ============================================================
# KeyAllPro | Production Configuration
# Full Paper + Folia support
# ============================================================
# ── TIMER ────────────────────────────────────────────────────
# How often (in seconds) to give crate keys to all online players.
# Default: 3600 = 1 hour.
interval: 3600
# Persist the countdown across server restarts.
# When true, the timer resumes from where it left off.
# When false, the timer resets to full "interval" on every restart.
persist-timer: true
# ── CRATE SELECTION ──────────────────────────────────────────
# How the next crate is chosen each cycle:
# ROTATION - cycles through the list in order (predictable)
# RANDOM - picks randomly, weighted by the "weight" field
crate-mode: ROTATION
# ── CRATES ───────────────────────────────────────────────────
# Each crate is a keyed section with:
# name - display name used in messages/placeholders
# commands - console commands to run (use %player% for player name)
# weight - relative chance weight (only used in RANDOM mode)
#
# You can list multiple commands per crate (all will run per player).
crates:
common:
name: "Common"
commands:
- "crates key give %player% common 1"
weight: 50
rare:
name: "Rare"
commands:
- "crates key give %player% rare 1"
weight: 30
legendary:
name: "Legendary"
commands:
- "crates key give %player% legendary 1"
weight: 20
# ── RANK REWARDS ─────────────────────────────────────────────
# Extra commands given to players who hold a specific permission.
# Useful for tiered donor rewards on top of the base crate.
rank-rewards:
enabled: false
ranks:
vip:
permission: "keyallpro.rank.vip"
commands:
- "crates key give %player% vip 1"
mvp:
permission: "keyallpro.rank.mvp"
commands:
- "crates key give %player% mvp 2"
elite:
permission: "keyallpro.rank.elite"
commands:
- "crates key give %player% elite 3"
# ── OFFLINE PLAYER SUPPORT ───────────────────────────────────
# When enabled, players who were offline during a key drop
# receive catch-up rewards the next time they join.
# Commands run with %player% replaced by the joining player.
offline-players:
enabled: false
catch-up-commands:
- "crates key give %player% common 1"
# ── WARNINGS ─────────────────────────────────────────────────
# Seconds before the drop to broadcast a countdown alert.
# Multiple values supported. Set to [] to disable all warnings.
warnings:
- 300
- 60
- 30
- 10
- 5
# ── MESSAGES ─────────────────────────────────────────────────
# Standard Minecraft color codes (&a, &e, &l, etc.) supported everywhere.
# Placeholders: %keyall_time% %keyall_next_crate% %keyall_status%
messages:
prefix: "&8[&6&lKeyAllPro&8] &r"
# Sent at each warning threshold
warning: "&7Key drop in &e%keyall_time%&7!"
# Broadcast when the drop actually fires
giving: "&6&lKey Drop &ais happening &6&lNOW&a!"
# Per-player confirmation after keys are given
given: "&aYou received &e1x %keyall_next_crate% Key&a!"
# Which channels to use for warnings/giving broadcasts.
# Valid values: CHAT ACTIONBAR TITLE
# (BossBar is configured separately below)
broadcast-types:
# - CHAT
# - ACTIONBAR
# - TITLE
# Title overlay (only sent when TITLE is in broadcast-types)
title:
title: "&6&lKey Drop!"
subtitle: "&7Next in &e%keyall_time%"
fade-in: 10 # ticks
stay: 60 # ticks
fade-out: 20 # ticks
# ── BOSS BAR ─────────────────────────────────────────────────
bossbar:
enabled: false
title: "&6&lKey Drop &8» &e%keyall_time%"
# Colors: PINK BLUE RED GREEN YELLOW PURPLE WHITE
color: YELLOW
# Styles: SOLID SEGMENTED_6 SEGMENTED_10 SEGMENTED_12 SEGMENTED_20
style: SOLID
# Show bossbar to all players (false = only players with keyallpro.use)
show-to-all: true
# ── SOUNDS ───────────────────────────────────────────────────
sounds:
enabled: true
# Sound key names from https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Sound.html
warning: "ENTITY_EXPERIENCE_ORB_PICKUP"
give: "ENTITY_PLAYER_LEVELUP"
# ── BONUS REWARDS ────────────────────────────────────────────
# Random chance to award an extra key on top of the regular drop.
bonus-rewards:
enabled: false
# Percentage chance (0.0 – 100.0) that any individual player wins a bonus
chance: 10.0
commands:
- "crates key give %player% bonus 1"
# ── DAILY DOUBLE EVENT ───────────────────────────────────────
# On the configured day of the week all rewards are multiplied.
daily-double:
enabled: false
# MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY
day: "SATURDAY"
# Multiplier applied to command repetitions (2 = double keys)
multiplier: 2
▌ Technical Details
- Server software: Paper 1.21+ and Folia fully region-safe
- Java version: Java 21
- Hard dependencies: None
- Soft dependencies: PlaceholderAPI (optional)
- Thread model: Countdown → AsyncScheduler · Command dispatch → GlobalRegionScheduler · Player packets → EntityScheduler
- Hot reload: /keyall reload rebuilds all services without stopping the timer loop
- Persistence: data.yml stores next-execution epoch-ms + crate rotation index
- Performance: Only iterates online players no entity loops, no main-thread blocking
KeyAllPro is provided as-is. Feature requests and bug reports are welcome.
Support & Community
Join our Discord
Join our Discord
