Skip to content

Releases: ValentinTarnovsky/Sn-Releases

SnDisplayShops v2.2.0

Choose a tag to compare

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.yml is ignored; delete it once restyled. To remove the withdraw button, delete
    the w from 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

Choose a tag to compare

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 under hologram: in config.yml:
    bounce-amplitude (0.1 blocks, 0 turns it off) and bounce-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 to Qi, and
    1.500.000 typed 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.yml ships 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

Choose a tag to compare

@ValentinTarnovsky ValentinTarnovsky released this 13 Aug 04:17

Changes

  • Brand accent aligned with the Sn core standard: the inherited legacy &#7CFC00 is replaced by the fleet accent &#8354f2 across both language files (prefix and the snlib.help header / entry / footer).
  • Both GUIs restyled to the fleet convention: titles are now &#8354f2&lRank Menu and &#8354f2&lRank Ladder, item names use the accent, lore uses &8 separators, &7 body text and &f values, and the page buttons read &#8354f2Previous Page / &#8354f2Next Page. The single-menu rankup button now uses the same semantic &a&lCLICK TO RANK UP the paginated ladder already used.
  • The shipped example ranks in rankup.yml moved off the ad-hoc yellow/lime palette onto accent headers plus semantic colour codes.
  • config.yml band banners no longer carry numbers. They read 1 MODEL, 3 LIMITS, 4 INTEGRATIONS, which looked like a section was missing - the plugin simply has no band-2 (features) keys.
  • top moved 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

Choose a tag to compare

@ValentinTarnovsky ValentinTarnovsky released this 11 Aug 21:49

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:

  • vault reads and charges the Vault economy, so any economy plugin works.
  • placeholder reads a balance from any PlaceholderAPI placeholder and charges by running a console command: check, consume, and optionally deposit so 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

  1. Put SnLib.jar in your server's plugins folder. SnRankUp is a SnLib consumer and will not enable without it.
  2. Put SnRankUp.jar beside 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

Choose a tag to compare

@ValentinTarnovsky ValentinTarnovsky released this 11 Aug 22:02

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 &#8354f2,
    replacing the ad-hoc &#55FFFF and a stray &#55FF55 on page 2 of the kits menu
  • Button names drop the decorative &6/&9/&d/&4/&b one-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

Choose a tag to compare

@ValentinTarnovsky ValentinTarnovsky released this 12 Aug 01:18

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.yml as a layout mask plus
    named regions - move, add or remove cells without touching a slot number.
  • Reward pools. rewards.yml holds 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} and vault:<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-gift ships at 1. On a network behind a proxy without IP forwarding, or
    for households and CGNAT, set it to 0 to disable the limit - config.yml documents 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

Choose a tag to compare

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 ItemDisplay spinning above a text line, with
    DecentHolograms driving the text where it is installed and a native TextDisplay where 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-size ships at 1 on 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-stacks has 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

Choose a tag to compare

@ValentinTarnovsky ValentinTarnovsky released this 11 Aug 14:11

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

  1. Put SnLib.jar in your server's plugins folder. SnKits is a SnLib consumer and will not enable without it.
  2. Put SnKits.jar beside 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

Choose a tag to compare

@ValentinTarnovsky ValentinTarnovsky released this 10 Aug 15:18

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,
    default confirm), 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

Choose a tag to compare

@ValentinTarnovsky ValentinTarnovsky released this 10 Aug 13:23

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.