SnReclaim v2.0.0
·
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.jarinplugins/. 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.ymlholdsredeem.*,join-notify.*,database.*,command.aliasesand the
ranks:table. SnLib merges new keys in on boot and preserves your values and comments; no
config-versionkey exists. Theranks:section is owner-extensible: entries you delete
stay deleted.command.aliasesadds aliases. It cannot take away/rc, whichplugin.ymlregisters
at load time.- Player-facing text lives in
lang/messages_en.yml. Setlang:inconfig.ymlto load a
differentlang/messages_<code>.yml. - Claims are stored in SQLite (
database.file, defaultdata.db) in the table
snreclaim_claims.database.type: mysqlis 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. /reclaimand/reclaim resetreport 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.