Releases: ValentinTarnovsky/Sn-Releases
Release list
SnDisplayShops v2.2.0
Changes
The owner menu is a SnLib menu now. SnLib 1.28.0 added menus that can receive an item
(input cells + an open player inventory + item offers), and this release moves the owner menu
onto it. The layout lives in guis/owner.yml, in the same dialect as the buyer menu; the old
owner-menu.yml at the plugin folder root is no longer read, and the plugin logs a pointed
warning if it finds one. "Your item is read, never consumed" is now enforced by SnLib itself.
What changed in how the menu behaves, each on purpose:
- Shift-click ONLY deposits. A stack that does not match the traded item is refused with a
message instead of silently replacing what the shop trades. Setting or changing the traded
item is the center cell alone: click it holding the item on your cursor, or drag one onto it. - Pickup asks twice. The first click arms a red confirm cell; the second click within five
seconds removes the shop. Left alone, it disarms itself. - Real pagination. A page indicator between the arrows, arrows that gray out at the ends,
and no more click-past-the-end counter to click back down. - The menu is live. Stock, price, mode, currency and the title follow changes while the
menu is open - trades update the grid under you. - Everything answers. Refused deposits, full inventories, empty cycles and dead cells all
say why; withdraw-all now reports what you got, not only what stayed.
Upgrading
- Requires SnLib 1.28.0 or newer on the server (API level 19). Update SnLib.jar first:
https://github.com/ValentinTarnovsky/SnLib/releases/tag/v1.28.0 - Owner menu customizations must be redone in
guis/owner.yml(SnLib menu dialect). The old
owner-menu.ymlis ignored; delete it once restyled. To remove the withdraw button, delete
thewfrom the layout - there is no toggle key any more.
Installation
Download the JAR below and place in your plugins folder. Requires SnLib.jar 1.28.0+.
SnDisplayShops v2.1.0
Changes
- The display item bobs. The floating item now rises and falls the way a dropped item does,
on top of the spin it already had. Two new keys underhologram:inconfig.yml:
bounce-amplitude(0.1 blocks,0turns it off) andbounce-period-ticks(80). The bob is
carried by the same push the spin already sends, so it costs nothing extra no matter how many
shops are loaded. - The chat price prompt accepts formatted numbers.
1k,1.5m,2b, up toQi, and
1.500.000typed back exactly as the menu prints it. Numbers written out in full stay exact at
any size. A line with more than one separator, or one past the largest price there is, is
refused instead of guessed at. config.ymlships two example currencies instead of six - one command-backed, one
EdTools-backed, one of each shape.currencies:is marked extensible, so nothing an operator
already declared is added, removed or touched by the update.
Installation
Download the JAR below and place in your plugins folder. Requires SnLib.jar.
SnRankUp v2.0.1
Changes
- Brand accent aligned with the Sn core standard: the inherited legacy
CFC00is replaced by the fleet accent₢f2across both language files (prefix and thesnlib.helpheader / entry / footer). - Both GUIs restyled to the fleet convention: titles are now
₢f2&lRank Menuand₢f2&lRank Ladder, item names use the accent, lore uses&8separators,&7body text and&fvalues, and the page buttons read₢f2Previous Page/₢f2Next Page. The single-menu rankup button now uses the same semantic&a&lCLICK TO RANK UPthe paginated ladder already used. - The shipped example ranks in
rankup.ymlmoved off the ad-hoc yellow/lime palette onto accent headers plus semantic colour codes. config.ymlband banners no longer carry numbers. They read1 MODEL,3 LIMITS,4 INTEGRATIONS, which looked like a section was missing - the plugin simply has no band-2 (features) keys.topmoved from the LIMITS band to FEEDBACK, where the standard places leaderboards, and the redundant double banners were collapsed into one per band.
No Java changed. Because SnLib never overwrites a value that already exists on disk, the new colours apply to fresh installs; an existing server keeps whatever is in its own lang/, guis/ and rankup.yml files. To adopt them, delete those files (or the individual values) and let SnLib re-seed them on the next boot.
Installation
Download the JAR below and place in your plugins folder. Requires SnLib.jar.
SnRankUp v2.0.0
Rank ladder for Paper 1.20.x and 1.21.x. Every rank lives in one file, a rank is priced in whatever currency your server already runs, and the menu players open is a YAML file you lay out yourself.
The ladder
Each rank is one entry in rankup.yml with an order and a display prefix. Orders do not need to be contiguous, so 10, 20, 30 leaves room to insert a rank later without renumbering anything. The lowest order is the starting rank: everyone begins there, and since nobody ever reaches it, its requirements are never charged and its rewards never fire.
requirements and rewards describe reaching a rank, not leaving it. A rankup checks and charges the price of the rank the player is going to, and fires that rank's rewards.
Prices
hours is always available and needs no setup: it is the player's playtime, and it is checked, never charged.
Every other price is a currency you declare in config.yml, and two types ship:
vaultreads and charges the Vault economy, so any economy plugin works.placeholderreads a balance from any PlaceholderAPI placeholder and charges by running a console command:check,consume, and optionallydepositso refunds are possible.{amount}and%player%are substituted in both commands. That covers tokens, gems, points and anything else a plugin exposes as a placeholder.
Requirements are checked and charged in the order you wrote them, and if a later charge is refused everything already taken is handed back. A currency whose backing plugin is not installed is skipped at load with a warning and every requirement naming it is dropped, which makes that rank cheaper rather than unreachable.
Rewards
Any SnLib action tag works: [broadcast], [message], [console], [title], [actionbar], [sound] and the [chance=50] guard. A line with no tag runs as a console command. %player% and PlaceholderAPI resolve per line.
Menus
Two of them, and menu.mode in config.yml decides which one /rankup opens.
single shows one dynamic button for the next rank, styled by that rank's own menu-item, with the live leaderboard beside it. paginated lays the whole ladder out one slot per rank, opens on the page holding your next rank, and renders each tile in one of four states: claimed, ready, next, locked. Exactly one tile is ever ready or next.
Both are ordinary guis/*.yml files: a title, rows, a character grid for the layout and items you can move, restyle or delete. Rank lore takes hex colors, MiniMessage, PlaceholderAPI tokens, and the plugin's own {req_hours}, {req_<currency>}, {missing_hours}, {missing_<currency>} and {current_hours}, so a tile can show both the price and what the player still lacks without PlaceholderAPI installed.
Leaderboard
A snapshot of the highest ranked players, rebuilt on the database thread every top.refresh-seconds and exposed as %snrankup_top_name_<N>% and %snrankup_top_value_<N>%. Those two answer even when there is no requesting player, so holograms, signs and Discord bridges get a real value instead of an empty string.
Commands
/rankup opens the menu. Its aliases are ru and rank, and they are re-read on reload.
Admin side: /rankup force <player> advances one rank and fires that rank's rewards, /rankup set <player> <rank> writes a rank with no charge and no rewards, /rankup reset <player> puts a player back on the starting rank, and /rankup bypass [player] toggles ignoring rank requirements for you or for someone else. /rankup reload, /rankup help and /rankup debug come with the framework. Every argument tab-completes.
PlaceholderAPI
Optional. %snrankup_prefix%, %snrankup_num%, %snrankup_next_prefix% and %snrankup_next_num% resolve anywhere, alongside the two leaderboard placeholders. The shipped menus use them, so on a server without PlaceholderAPI those lines render blank while everything else keeps working.
Storage
SQLite by default, with nothing to configure. MySQL by setting database.type and filling the connection block. Every read and write happens off the server thread.
Installation
- Put
SnLib.jarin your server'spluginsfolder. SnRankUp is a SnLib consumer and will not enable without it. - Put
SnRankUp.jarbeside it and start the server.
The plugin writes its own config.yml, rankup.yml, lang/messages_en.yml and guis/*.yml on first boot, so there is nothing to create by hand.
Requirements: Java 21+, Paper 1.20.x or 1.21.x, SnLib 1.25.0 or newer.
SnKits v2.0.1
Changes
Every player-facing surface moves onto the Sn brand palette. The 2.0.0 rebuild
adopted SnLib's structure but kept its own colors, so SnKits looked like a
different product next to the rest of the pack.
- Prefix, help header/entry/footer and all six menu titles now use
₢f2,
replacing the ad-hoc7FFFFand a stray7FF55on page 2 of the kits menu - Button names drop the decorative
&6/&9/&d/&4/&bone-offs for the accent
color; destructive actions unify on&c; the back button reads the same in all
three menus that have one - Every clickable button now ends with its "Click to ..." hint line
- The edit menu's Enabled button no longer renders green while the flag is off
- Fixed: a spent one-time allowance was shown in success green and a still
claimable one in red. The two are now the right way round, in the menus and in
%snkits_onetime_used_<id>% - The kits menu filler is now the gray pane the other menus already used
Existing installs keep their current colors: SnLib never overwrites a value already
on disk. To adopt the new look, delete lang/messages_en.yml and guis/ and let
them re-seed, or restyle the keys by hand.
Installation
Download the JAR below and place in your plugins folder. Requires SnLib.jar.
SnGifts v2.0.0
Daily playtime gifts for Paper servers. Players accrue playtime, tiers unlock as they hit their
thresholds, and each tier pays a set of rewards drawn fresh every gift day.
Requires SnLib 1.27.0 or newer
This is not optional and it is not a soft warning. The required API level is compiled into this
jar, so SnGifts 2.0.0 refuses to enable on any server whose SnLib.jar is older than 1.27.0
and says so in the console. Update SnLib first.
What it does
- Playtime tiers. Any number of gift tiers, each with its own
time-needed-minutes. Order
is by threshold ascending, so inserting a tier never renumbers the ones players already know. - A configurable menu. Placement lives entirely in
guis/gifts.ymlas a layout mask plus
named regions - move, add or remove cells without touching a slot number. - Reward pools.
rewards.ymlholds the pool; each gift day draws from it and persists the
draw, so every player who claims a tier that day gets the same reward set. Supports console
commands with{player}andvault:<amount>for economy payouts. - A daily reset on your own schedule and timezone, with a server-wide announcement.
- Per-address claim limits to blunt alt farming, with a bypass permission for staff.
- Unclaimed reminders and unlock notifications, both on their own intervals.
- SQLite or MySQL, all I/O off the main thread.
- PlaceholderAPI and Vault are both optional and detected at runtime.
Commands
| Command | Permission |
|---|---|
/gifts (alias /regalos, renameable in config.yml) |
sngifts.use |
/gifts reset <player> |
sngifts.admin.reset |
/gifts resetall |
sngifts.admin.resetall |
/gifts resetgifts |
sngifts.admin.resetgifts |
/gifts bypass |
sngifts.admin.bypass |
/gifts reload, /gifts debug |
sngifts.admin.reload, sngifts.admin.debug |
sngifts.use gates the whole command tree, including the admin subcommands. If you restrict it,
grant it to staff as well.
Configuration
Every player-facing string lives in lang/messages_en.yml and every value in config.yml. Both
are managed: new keys are merged in on update while your edits and comments are preserved, so
you never have to diff a config by hand. There is no config-version key to maintain.
Notes
claim.ip-limit-per-giftships at1. On a network behind a proxy without IP forwarding, or
for households and CGNAT, set it to0to disable the limit -config.ymldocuments the
trade-off inline.- The jar is obfuscated and licence-gated. It checks its licence once at startup and does not
phone home afterwards.
SnDisplayShops v2.0.0
Player-owned display shops: place a tagged item, set a price, and it trades on its own.
What it does
- Shops are placed, not commanded. A shop is any block placed from a tagged item, so its
material is whatever the operator configures. Identity lives in the item's PDC, never in the
block type. - A rotating hologram over every shop. A native
ItemDisplayspinning above a text line, with
DecentHolograms driving the text where it is installed and a nativeTextDisplaywhere it is not. - Two menus. Buyers get a compact offer with a one-click and a trade-all button; owners get a
full management screen for the item, the price, the currency, the direction, pausing, stock and
pickup. - Buy or sell. A shop faces either way: it sells its stock to players, or it buys from them and
pays out of its owner's balance. - Storage without slots. Stock is held per item variant as a 64-bit amount rather than as
inventory slots, so a shop can hold more of something than a chest could ever represent. - As many currencies as you configure. Each one is independently backed by an economy plugin's
commands or by EdTools, so a server can run coins, gems and tokens side by side. - SuperiorSkyblock aware. Shops on an island can be removed with it when it disbands or when
their owner loses membership, both behind operator toggles. - PlaceholderAPI:
%sndisplayshops_shops_count%,%sndisplayshops_shops_max%,
%sndisplayshops_shops_total%. - A public API for other plugins to read shops and their stock, and to draw stock down.
Requirements
- Paper 1.20.x or 1.21.x
- SnLib
- Optional: PlaceholderAPI, DecentHolograms, EdTools, SuperiorSkyblock
Configuration
Everything the plugin says and every number it uses lives in config.yml, lang/messages_en.yml,
guis/buyer.yml and owner-menu.yml. All four are managed: new keys are merged in on upgrade and
your edits are kept.
Two worth knowing before you tune them:
database.pool-sizeships at1on purpose. Two writers can land a shop's stock updates out of
order, and the losing write is the one that survives a restart. The plugin logs a SEVERE if it
finds MySQL configured above 1.limits.max-pickup-stackshas no "off" value. Picking up a shop hands its whole stock back in
one tick, so an unbounded value is a hang rather than a preference.
SnKits v2.0.0
Kits plugin for Paper 1.20.x and 1.21.x, built to be run from the menus and edited in-game. Every kit lives in its own file, every menu is a YAML file you can add to, and nothing about a kit needs a text editor: /kit edit <kit> opens the whole thing.
Kits
One kit is one file, kits/<id>.yml. Items are stored with Bukkit's own serialization, so enchantments, custom names, lore, custom model data, leather colors, skull textures and shulker contents all survive a round trip untouched.
Each kit carries a cooldown and six flags, all of them toggles in /kit edit: enabled, requires-permission, one-time, auto-armor, auto-offhand and drop-items-when-full.
A claim never overwrites what a player is wearing or holding. If the helmet slot is taken, the kit's helmet goes to the inventory instead. With drop-items-when-full: false a claim into a full inventory is refused rather than dropped on the ground, and refusing costs the player nothing: no cooldown, no spent one-time.
The in-game editor
/kit edit <kit> then the items button opens a 6-row grid. Slots 0 to 52 are the kit contents at the exact position the preview will show them; drag anything in from your own inventory. Closing the grid saves, including with Escape. Any item can be the kit's off-hand item: shift-right-click it. Shields and totems still auto-equip by material.
Slot 53 adds a command item: an item that is not given but runs commands when the kit is claimed. Right-click it to set its display item, add commands, and choose whether each runs as the console or as the player. A command item with no display is invisible in the preview and still runs.
Menus
guis/kits-main.yml and guis/kits-more.yml ship as examples, and any other file you drop in guis/ becomes a menu you can open by name. Left-click claims, right-click previews. Each kit declares four icons, one per state (available, on cooldown, one-time used, disabled), and the plugin picks the one that matches the viewer.
Kit items resolve placeholders: put %player_name% or any PlaceholderAPI token, and & or &#RRGGBB colors, in an item's name or lore and it renders per player, both in the preview and on the item that lands in the inventory.
Multi-claim
Lets a player claim the same kit more than once before its cooldown is over, one extra claim per extra copy they own. It is built for selling kits: the amount lives in a permission (snkits.uses.<kit>.<n>), so your shop only ever runs a LuckPerms command. The highest amount wins, so you never have to unset the previous node, and each claim carries its own cooldown so copies recharge one by one rather than all at once. Off by default.
Auto-claim on join
Hands configured kits to players when they join, in first-join or every-join mode, through the same claim path as everything else. A denied give is always silent, so nobody is told about a cooldown every time they log in. Off by default.
Commands
Players claim from the menus. /kit opens one and that is the intended path; /kit claim <kit> exists for command blocks, shops and anyone who prefers typing.
Admin side: /kit create builds a kit from your current inventory, /kit edit, /kit delete, /kit enable and /kit disable, /kit give <player> <kit> bypasses every claim rule, /kit reset clears stored usage for one player, one kit, or everyone, and /kit gui <gui> [player] opens a specific menu. /kit import converts the kits of PlayerKits2. Every argument tab-completes for real, including kit ids filtered to what you may actually claim.
PlaceholderAPI
Optional. Without it everything works; with it, %snkits_cooldown_<id>%, %snkits_available_<id>%, %snkits_onetime_used_<id>%, %snkits_uses_left_<id>% and %snkits_uses_max_<id>% resolve anywhere. Inside the plugin's own menus and messages, {cooldown}, {uses_left} and {uses_max} do the same job without PlaceholderAPI installed.
Installation
- Put
SnLib.jarin your server'spluginsfolder. SnKits is a SnLib consumer and will not enable without it. - Put
SnKits.jarbeside it and start the server.
The plugin writes its own config.yml, lang/messages_en.yml, guis/*.yml and an example kits/default.yml on first boot, so there is nothing to create by hand.
Requirements: Java 21+, Paper 1.20.4 or newer, SnLib.
SnCrates v2.2.0
Changes
New: /crates key wipe [crate] [confirm]
Deletes the virtual key balances of every player on the server, offline players
included. Without a crate id it clears every crate; with one it clears only that crate.
Physical key items are untouched - they live in inventories and no balance command reaches them.
It cannot be undone, so it runs in two halves. Without the confirmation word the command
only counts: it reports how many balances and how many keys are at stake and quotes back the
exact line that would destroy them. Only a second invocation carrying that word deletes anything.
/crates key wipe
> WARNING This deletes 4,120 virtual key(s) across 1,284 balance(s), for EVERY player
> and EVERY crate. It cannot be undone. Run /crates key wipe confirm to go through with it.
/crates key wipe confirm
> Wiped 1,284 virtual key balance(s), for every player and every crate.
- The confirmation word lives in the language file (
messages.keys.wipe-confirm-word,
defaultconfirm), so it translates with the rest of the plugin. It is never
tab-completed - having to type it is the safety. - Online players' cached balances are cleared too, so nobody keeps spending keys that no
longer exist anywhere. - A mistyped crate id is refused rather than silently widening into a server-wide wipe.
- Works on a crate that no longer accepts virtual keys: those leftover rows are exactly what
this is for.
New permission
sncrates.admin.wipekeys (default op, child of sncrates.admin). Required on top of
sncrates.admin.keys, so the ordinary key commands can be delegated to a junior admin
without handing them the one that empties the key economy.
New language keys
messages.keys.wipe-confirm-word, wipe-warning, wipe-warning-crate, wiped,
wiped-crate, wipe-nothing, wipe-nothing-crate, wipe-failed. They merge into an
existing lang/messages_en.yml on boot; your edits are kept.
Installation
Download the JAR below and place in your plugins folder. Requires SnLib.jar.
SnCrates v2.1.0
Changes
The editor tells you how to get out of a chat prompt. Every prompt now
sends the cancel word and the seconds left underneath it. One language key
(messages.editor.cancel-hint), so it covers every prompt including new ones.
Preview Layout is a click, not a chat prompt. It cycles the layouts listed
under the new editor.preview-layouts in config.yml, skipping any id that no
file in guis/ backs, so a crate can never end up pointing at a preview that
will not open.
Accepted Keys offers physical, virtual and both. PERMISSION is off the
button. It still parses out of a crate file and still opens crates - clicking
the button on such a crate restarts the cycle at physical.
A reward's win commands are listed on its icon, numbered, so you can see
which ones are there. A line is marked in red when it will not run as written:
it is empty, it uses a placeholder that does not exist (only {player},
{amount} and {crate} are filled in), or it uses a %papi% token on a server
with no PlaceholderAPI.
Fixed: opening a crate panel logged Invalid value in config.yml -> 'effects.complete-particle-count': received '40', using default '40' once per
render. Nothing was wrong with the value - the panel was reading a number as
text. It is read as a number now.
Tidier defaults. The five three-state controls no longer share two dyes
between them; each state of each control has its own item. Every "Back" is the
same door and the arrows are only ever page arrows. The menu and message text
says what to write - FLAME, BLOCK_CHEST_OPEN 1 1.2 - instead of naming
types like "a Bukkit particle" or "DateTimeFormatter syntax".
CHAIN was avoided on purpose: it is IRON_CHAIN on 1.21.9 and newer. Every
material shipped here resolves on 1.20.2, 1.21.1 and 1.21.11.
Installation
Download the JAR below and place in your plugins folder. Requires SnLib.jar.