22 releases, newest first.
Fixes %snminigames_max_<game>% reporting queue.max-players even when the live round seats fewer
players. v1.10.0 made that reachable for the first time: a 4-shaft FastMine room rendered 2/12 on
a scoreboard while it actually closed and started at 4, and %queue% / %max% as a pair is exactly
what the placeholder is for.
The placeholder now lowers the configured maximum to the live round's own limit. Parkour, TNT Run, TNT Tag and Spleef declare no limit of their own, so nothing changes for them. With no round running it still answers the configured maximum - a game picks its map when the round opens and two maps can seat different numbers, so there is nothing better to report, and it is the upper bound either way.
Requires PlaceholderAPI to be visible at all. No config key, no lang key, no SnLib bump (1.15.0 or newer), and no change to any command or permission.
FastMine, the fifth game. A mining race: when the round starts every player is sealed into their own 1x1 glass shaft with a column of blocks under their feet and five unbreakable tools - pickaxe, axe, shovel, hoe, sword. Mining runs at normal vanilla speed, so the race is won by swapping to the right tool, not by clicking faster. The first player to clear their column and drop to the bottom wins on the spot; everyone else is ranked by blocks mined, with a tie going to whoever got there first.
addshaft; the round generates the 3x3 casing, the landing floor and an independently rolled
column for each player, then restores every block exactly as it was when it ends - also on
/mg reload and on shutdown with a round still live.blocks palette; the
shipped default gives each of the five tools something it is the right answer to.counter-display: BOSSBAR.
Optional haste-level, configurable tool-tier, depth, casing-material and time-limit.New setup commands under /mg admin fastmine: create, delete, list, addshaft,
removeshaft, shafts, setwaiting, setend, setdepth, setcasing, settimelimit, help.
Framework, both inert for the games you already run: a round may now declare its own capacity, and the block-break protection asks the round whether a specific block is its own business instead of refusing every break outright. Parkour, TNT Run, TNT Tag and Spleef answer "no" to every block and their queues behave exactly as before.
games/fastmine.yml is seeded once and never auto-merged. No SnLib bump (1.15.0 or newer), no
new permission and no change to any existing command.
Breaking a block with the shovel looked wrong: the block vanished, came back, and instantly vanished again.
Nothing was ever wrong with the world - the client was told twice. Your client draws the break the instant you click, remembers what to roll back to, and waits for the server to acknowledge it. Because the plugin cancelled that click, the server answered "the block is still there", so the acknowledgement rolled your screen back to snow - and the plugin's own removal, which is only broadcast at the end of the tick, took it away a second time one packet later.
Two changes fix it:
Nothing was loosened. Block breaking is still refused for every player and every game; the plugin removes the block itself before the server ever gets to it, so nothing drops and no break event fires. Only the digging player was ever affected - snowballs and the melt are not predicted by the client and never flickered.
No config change, no new permissions, and no other game is touched. Drop the jar in and restart.
The classic. Everyone spawns on a snow floor holding a shovel that breaks a block in one click, and every block you break with it pays out 1-3 snowballs. Throw those and they break the floor where they land and shove whoever they hit, so you can take the ground out from under someone across the arena. Fall below the elimination height and you are out, restored to your exact pre-game state on the spot. Last player standing wins.
melt-start seconds the floor melts on its own: melt-rate random blocks vanish every second until someone falls. melt-start: 0 switches it off./minigames reload and on shutdown with a round still live.Set one up with /minigames admin spleef create <name>, the region wand, then setregion, setstart and setwaiting. Full list: /minigames admin spleef help. Tuning: setelimy, setsnowballs <min> <max>, setmeltstart, setmeltrate, setwinners, settimelimit.
Three additions, all written to be reused by the next game:
GameInstance.allowsItemUse(Player, ItemStack) - a round may declare one of its own kit items usable. The protection layer then denies only the BLOCK half of the interaction instead of cancelling it, so doors, buttons and pressure plates stay as dead as before, and the leave item is still routed first.game/KnockbackUtil - TNT Tag's vanilla knockback math, extracted to take a direction so a projectile can pass its own velocity. No behaviour change for TNT Tag.game/DestroyableKeys - the one without which a digging game cannot exist. Players are in adventure mode, where the client refuses to send a dig packet for a block its item does not declare, so the kit's tool is restricted at runtime to the map's floor materials.games/spleef.yml is seeded on first boot with a placeholder arena1. Spleef ships enabled: true but stays inert until its region and start spawn are set; set enabled: false if you do not want it listed.removable-materials is the floor AND the shovel's break restriction, so unlike TNT Run it can never be empty - an empty list falls back to SNOW_BLOCK with a warning.leave-item.slot off hotbar slot 0: that is where the shovel goes.remove-depth now cuts from the block you are standing on. Sometimes only the lower
block of the floor disappeared and the surface stayed floating; sometimes only that leftover broke,
a probe later, with air already under it. Both are the same defect: the probe chose where to cut by
scanning downward from the player's block Y, which is correct only while the surface is a full
block. On anything shallower - a slab, soul sand, a dirt path, farmland, a carpet, mud, honey - the
feet sit inside the surface block, so the block below it was taken instead. The anchor is now the
block whose top actually carries the feet.removable-materials also protects the column under it: the trail is never
cut below a surface the round may not take. No change with the default empty list (everything
removable).No new config key, no permission or command change. games/tntrun.yml stays admin-owned, so existing
maps keep their settings.
round-break: 0 still regroup, they just have no pause in between.No new configuration. Requires SnLib 1.15.0 or newer, unchanged.
start-spawn with their velocity and fall distance cleared, so no chase carries over into the next round and nobody keeps a positional advantage they earned in the last one.round-break: 0 are teleported too, they just get no pause.No new configuration: nothing to set, nothing to migrate. Requires SnLib 1.15.0 or newer, unchanged.
hit-knockback, tunable), the hurt animation, and the new sounds.hit. It never runs on a PvP-enabled world, so there is no double push.tag-speed (default 1 = Speed I, 0 disables it): whoever is carrying the TNT is the one who has to catch somebody, so they move faster than the runners. It disappears the moment they pass the tag on.Nothing to do. games/tnttag.yml is seeded once and never auto-merged, so existing maps keep their values and inherit the defaults for the three new keys (tag-speed: 1, hit-knockback: 0.4, sounds.hit: "ENTITY_PLAYER_HURT 1.0 1.0"). Requires SnLib 1.15.0 or newer, unchanged.
tag-reach in games/tnttag.yml (default 3.5, clamped 1-6) tunes how far a swing looks.round-break (default 3 seconds, 0 restores the old back-to-back behaviour) shows a "next round in ..." counter while the survivors see who blew up. Set it with /mg admin tnttag setbreak <map> <seconds>. Nobody holds the TNT during the break, so it can never eliminate anyone.Nothing to do. games/tnttag.yml is seeded once and never auto-merged, so existing maps keep their values and simply use the defaults for the two new keys (tag-reach: 3.5, round-break: 3). Requires SnLib 1.15.0 or newer, unchanged from v1.7.0.
The third minigame. One or more players start each round holding the TNT (a TNT helmet plus a glow so it reads at a distance). A counter runs in plain sight, and whoever is still holding it when the counter hits zero explodes and is out. Pass the tag by hitting another player. Each round is shorter than the last until only the winners are left.
World.createExplosion is deliberately never called. An exploded player is restored to their exact pre-game state immediately, no spectator hold.counter-display: BOSSBAR (default) or ACTIONBAR.round-seconds minus round-decrement each round, never below min-round-seconds.reassign-grace (default 5s) when less than that was left, so a quit near zero cannot kill an innocent.taggers is clamped so a round can never blow up its own last survivors and end with no winner.Setup, all under permission snminigames.admin.setup:
/minigames admin wand region select the two arena corners
/minigames admin tnttag create <name>
/minigames admin tnttag setregion|setstart|setwaiting|setend <map>
/minigames admin tnttag settaggers|setroundtime|setdecrement <map> <n>
/minigames admin tnttag setminroundtime|setgrace|setwinners|settimelimit <map> <n>
/minigames admin tnttag list | delete <map>
/minigames admin tnttag help full listgames/tnttag.yml is seeded once and then owned by your server (never auto-merged), like the other games' files.
This one affects every game, not just TNT Tag, and it has been present since v1.3.0.
Bukkit renamed the slowness effect in 1.20.5 (SLOW before, SLOWNESS after) with no alias in either direction. The freeze named the new spelling, so on 1.20.1 - 1.20.4 it threw NoSuchFieldError every time a round started and the movement-freeze leg of the 3-2-1 countdown never applied. The effect is now resolved by name with a fallback chain, so it works on both branches; if neither name exists the freeze degrades to its other two legs instead of failing the round.
The same rename hazard applies to the explosion particle, so TNT Tag resolves it from a candidate name list in games/tnttag.yml (particles.explode) rather than a compiled-in constant.
TNT Run: the floor takes one block column at a time again.
Camping on a rim - or standing perfectly still - still does not work.
Nothing to configure: no new keys, permissions or commands. remove-delay and remove-depth behave exactly as before.
config.yml debug block now ships all three keys (enabled / level / categories) with comments, completing the canonical base block shared by the whole Sn fleet.enabled was shipped, so the first debug toggle appended level and categories to your config uncommented. Now the toggle only writes values.Key order was already correct, so nothing moved. Resource-only change: no Java touched, no key renamed or removed, no behavior change.
Requires SnLib 1.15.0. This build is compiled against it and inlines its API level, so on an older SnLib the plugin cleanly refuses to enable (API level handshake). SnLib-1.15.0.jar is attached below - install it first.
Every command description and every argument label is now editable in lang/messages_en.yml, under a top-level commands: block SnLib seeds on first boot. It covers the per-game setup commands too, so /mg admin <game> help translates with the rest. Editing an entry is permanent; delete one to restore the default. Renaming an argument label (<map> to <mapa>) changes only what is displayed, never how the command is typed.
/mg admin tntrun help now lists /mg admin tntrun ..., and /minigames admin tntrun help lists /minigames admin tntrun .... Previously the per-game setup help always printed the literal /minigames.
Your lang/messages_en.yml keeps the value you already have for messages.commands.admin.game-help.footer (edits are never overwritten), so that one line still prints a literal /minigames. Delete the line to pick up the new default, which uses the {label} placeholder.
No config keys changed, no permission or command changes. games/parkour.yml and games/tntrun.yml are untouched.
/minigames admin tntrun setregion <map> closes the selection once it has been
saved, so the arena edge particles stop instead of rendering for the rest of the
session. SnLib keeps a selection session alive until it is cancelled, the player
quits or the spec timeout fires - and region-wand.timeout-ticks ships as 0./minigames admin wand region now clears an open selection even when there is no
wand left to take back (dropped or stored), so there is always a way to cancel a
selection without relogging. New message key messages.setup.region-selection-cleared
(auto-merged into your lang/messages_en.yml on boot).No config key, permission or command changed. SnLib requirement unchanged (1.10.0).
remove-depth for TNT Run arenas: stepping on a block now clears up to N contiguous removable blocks downward from the block you stepped on, instead of only the top one. A two-block arena layer (e.g. sand on top of TNT) vanishes in a single step. Removal stops at the first air or non-removable block, so it never digs past a solid layer into a gap./mg admin tntrun setdepth <map> <blocks> (1-16) sets it; the key is seeded on create and in the shipped default. Default 1 preserves the classic one-block behaviour.games/tntrun.yml is seed-only (never auto-merged), so existing arenas keep their file untouched and default to depth 1; set a new depth per map with setdepth.setdepth subcommand.plugin.yml description held an unquoted interior colon (Games: Parkour, TNT Run.), which SnakeYAML parsed as a mapping value and rejected with InvalidDescriptionException, preventing the plugin from loading on Paper. The description is now single-quoted so the colon is a literal.The second game, and the first one that mutates the world. Players run over layers of blocks that vanish a few ticks after being stepped on; drop below the arena's elimination height and you are out, restored to your exact pre-game state on the spot. Last player standing wins.
The arena restores itself. Every block a round removes is recorded and put back when the round ends, on /mg reload, and on server shutdown with a round still live. Blocks vanish through a direct block set, never a BlockBreakEvent, so anti-grief and logging plugins see nothing.
/mg admin tntrun create <name>
/mg admin wand region # left-click one corner, right-click the other
/mg admin tntrun setregion <map>
/mg admin tntrun setstart <map>
/mg admin tntrun setwaiting <map>
/mg admin tntrun setelimy <map> <y>Full list behind /mg admin tntrun help. Everything needs snminigames.admin.setup.
/mg admin wand region hands out a cuboid selection wand with particle-rendered edges. /mg admin wand with no argument still gives the single-block setup wand, unchanged. The arena volume is capped by region-wand.max-volume in config.yml (250,000 blocks by default) and setregion refuses a bigger selection.time-limit: 0, never ending).Nothing to do. config.yml and lang/messages_en.yml are auto-merged; games/tntrun.yml is seeded on first boot with a placeholder arena1. TNT Run ships enabled but stays inert until its region and start spawn are set. Parkour is untouched.
Update SnLib.jar to 1.10.0 or newer before installing this version. The plugin uses the
help-only subcommand visibility flag introduced there; on an older SnLib it refuses to enable
(API level handshake). SnLib-1.10.0.jar is attached below alongside the plugin jar, so replace
both in one go.
/mg admin <game> help - the root help stops growing per subcommand/minigames help used to list every leaf of the tree, so each minigame added its full setup
surface to it (parkour alone contributed 11 lines). With ten minigames planned that help would
have run to roughly a hundred lines.
Each game now hides its setup subcommands from the root help and exposes a single entry,
/minigames admin <game> help, which lists that game's commands on its own paginated page. The
root help grows by one line per game instead of one line per subcommand.
Hidden from the help does not mean hidden from you: every setup subcommand still runs, still
tab-completes and still appears in the /minigames admin <game> usage line. That distinction is
why this release needs SnLib 1.10.0 - the pre-existing visible(false) flag would have stripped
all three surfaces at once.
Groundwork for the minigames coming next; no change to how Parkour plays.
/minigames reload enabled-sync all operate per game.The leave item's material and name moved from games/parkour.yml to config.yml
(leave-item.material / leave-item.name). A single item is registered for every minigame, so
its appearance cannot diverge per game. leave-item.enabled and leave-item.slot are unchanged
and stay per-game.
Upgrading: config.yml is auto-merged, so the new keys appear on first boot at their
defaults (BARRIER / &cLeave). Game files are seeded once and never rewritten, so if you had
customised those two keys in games/parkour.yml they are still in the file but are no longer
read. Copy your values into config.yml and delete them from the game file.
/minigames admin start <game> [map] takes an optional map: force a specific map instead of the rotation pick. The rotation cursor is left untouched, and an unknown map name is rejected with its own message./minigames admin forcestart <game> skips the remaining waiting-queue countdown and begins the round now with whoever is queued, bypassing the min-players requirement. Reports separately when there is no open round, when the round has already started, and when the queue is empty.snminigames.admin.commandbypass (default op): its holder can run any command while inside a minigame. The permission is only checked on the slow path, after the in-game command whitelist fails, so normal play is untouched./minigames admin wand now removes the wand if you already have it (and never stacks copies), and the wand is stripped from your inventory on quit. No more clearing your whole inventory to get rid of it./minigames admin parkour create now tab-suggests <name> instead of the existing map ids (which create always rejects)./minigames join <id> (aliases are config-removable) and the announce now also shows the typed command - the only way Bedrock players can join, since their chat cannot click. A non-click-safe game id broadcasts a button-less announce instead of silently skipping it.end-teleport -> setend); the parkour.yml maps banner now shows the real subcommand-first syntax and splits wand commands from standing-position commands; map-created names the concrete follow-up commands.Requires SnLib 1.8.0+ (attached): the plugin handshakes API level 4 and disables itself cleanly on an older SnLib.jar.
snminigames.play was renamed to snminigames.use (gates /mg join, /mg leave and /mg list).snminigames.play in their permissions plugin must update the node name to snminigames.use.SnMiniGames v1.0.0 - scalable minigame framework (first game: Parkour). Requires SnLib 1.7.1+. See the private repo for full notes.