Skip to content

SnReclaim v2.0.0

Choose a tag to compare

@ValentinTarnovsky ValentinTarnovsky released this 03 Aug 13:48
· 41 commits to main since this release

A one-time, rank-based reclaim system built on SnLib. Every entry under ranks: names a Vault
permission group; a player who belongs to that group can redeem that rank's reward exactly
once, ever. /reclaim redeems every qualifying unclaimed rank at once.

Requirements

  • Java 21+, Paper 1.20.4+
  • SnLib.jar in plugins/. Updating SnLib always needs a full restart, never a reload.
  • A license key in the shared plugins/.Sn-License/license.yml (bundle mode), not in the
    plugin's own folder - a server already running another bundle plugin needs nothing new.
  • Vault and a groups-based permissions plugin such as LuckPerms. PlaceholderAPI is optional.

Commands

Command Description
/reclaim (/rc) Redeem every reclaim you have available
/reclaim reset <player> Wipe a player's claims so they can claim again
/reclaim enable Enable redemptions globally
/reclaim disable Disable redemptions globally (season lock)
/reclaim status Show whether redemptions are enabled
/reclaim reload Reload the configuration
/reclaim help Paginated, permission-filtered help
/reclaim debug Toggle runtime debug output

The admin subcommands are deliberately NOT nested under /reclaim admin, so macros, signs and
console scripts keep working.

Permissions

Permission Default Description
snreclaim.use true Redeem your available reclaims
snreclaim.admin OP Parent node: grants every admin action below
snreclaim.admin.reset OP /reclaim reset <player>
snreclaim.admin.manage OP /reclaim enable, disable
snreclaim.admin.status OP /reclaim status (read-only, grantable on its own)
snreclaim.admin.reload OP /reclaim reload
snreclaim.admin.debug OP /reclaim debug
snreclaim.admin.update OP Receive update notifications

Configuration

  • config.yml holds redeem.*, join-notify.*, database.*, command.aliases and the
    ranks: table. SnLib merges new keys in on boot and preserves your values and comments; no
    config-version key exists. The ranks: section is owner-extensible: entries you delete
    stay deleted.
  • command.aliases adds aliases. It cannot take away /rc, which plugin.yml registers
    at load time.
  • Player-facing text lives in lang/messages_en.yml. Set lang: in config.yml to load a
    different lang/messages_<code>.yml.
  • Claims are stored in SQLite (database.file, default data.db) in the table
    snreclaim_claims. database.type: mysql is supported.
  • Update notices go only to holders of snreclaim.admin.update.

Reliability guarantees

  • A failed claim read fails closed. It is never installed in the cache as "this player has
    claimed nothing" - the claims stay unknown and nothing is granted until they can be read, so
    a transient database error cannot re-grant rewards a player already redeemed.
  • A claim whose write fails is retried through the cache's flush, so it survives a relog
    instead of living only in memory for the session.
  • /reclaim and /reclaim reset report their failure paths instead of answering with silence.
  • A reward command that kicks the player does not burn the remaining ranks' one-time claims.
  • A rank that can grant nothing, and two rank keys that differ only in case, are skipped
    instead of consuming a claim.
  • Join notifications never stack one task per relog.