3 releases, newest first.
%sntempblocks_*% placeholder worked under /papi parse but rendered as a raw %token% in DecentHolograms and DeluxeMenus: the expansion answered null off the main thread, which PlaceholderAPI reads as "this expansion does not handle that placeholder". Both of those refresh asynchronously, so the first frame showed the value and every refresh after it showed the token. The main thread now publishes a snapshot on the expiry sweep and the resolvers read it from any thread, so /papi parse, a hologram and a menu all show exactly the same thing. Countdowns keep the absolute wipe instant, so they stay exact between publishes.%sntempblocks_mode%, %sntempblocks_bypass% and the n/a of a PER_BLOCK zone reached PlaceholderAPI as ₢f2Interval / &7n/a, because PAPI output never enters SnLib's render pass. They are rendered before they leave now.messages.wipe-done-empty line when there was nothing to remove.Drop-in. The new messages.wipe-done-empty key is merged into your language file on boot; your existing values and comments are preserved.
/tempblocks bypass switches your own tracking off while you build inside a zone, buckets included. Run it again to switch it back on.
The permission now gates the toggle instead of bypassing on its own. sntempblocks.bypass is replaced by sntempblocks.admin.bypass: holding it means you MAY flip the switch, not that your blocks stop being tracked. Previously any operator was silently unable to place a temporary block at all, which made a zone look broken while testing it.
The toggle lasts for your session and is dropped on logout, so a bypass left on by accident cannot keep filling an arena with permanent blocks. Revoking the permission also ends an active bypass at the next block placed, without waiting for a logout.
%sntempblocks_bypass% renders the viewer's own state, restyleable under status.enabled / status.disabled in the language file.sntempblocks.admin.bypass (default op, child of sntempblocks.admin).sntempblocks.bypass. Grant the new node to anyone who had the old one.BlockPlaceEvent now exits on an empty toggle set instead of calling hasPermission for every block placed anywhere on the server.
First stable release.
Player-placed blocks that expire inside WorldGuard zones, bucket liquids and their flow included.
Two engines, per zone
PER_BLOCK - every block expires on its own timer, with per-material lifetimes and a default.INTERVAL - one timer per zone; when it fires, everything tracked there disappears at once, with configurable warnings before it.What it guarantees
Surface
/tempblocks list | info <zone> | here | wipe <zone|all> | purge <zone>, plus SnLib's injected reload, help and debug. Aliases /tb, /stb.sntempblocks (the viewer's zone, or any named zone).Requirements: Java 21+, Paper 1.20.x or 1.21.x, SnLib 1.24.0+, WorldGuard 7.0+.
Audited before release (/sn-audit FULL, gate PASSED): two criticals found, fixed and verified, both of which could turn a temporary block permanent - liquid flow overwriting the record of a block it only waterlogs, and the zone-removal policy not running at boot.