promotional bannermobile promotional banner

HyperPerms

Permissions made visual: the first Hytale plugin with a dedicated browser-based editor.

File Details

HyperPerms-2.8.8.jar

  • R
  • Feb 24, 2026
  • 6.67 MB
  • 124
  • Early Access

File Name

HyperPerms-2.8.8.jar

Supported Versions

  • Early Access

🛡️ HyperPerms v2.8.8

Critical permission sync overhaul — fixes permission pollution, race conditions, and stale expired permissions.

🛰️ Server Version: 2026.02.19-1a311a592

 

🔧 Permission Sync Rewrite

  • 🔄 Diff-based Hytale syncsyncPermissionsToHytale() previously pushed all resolved permissions on every change, causing hundreds to accumulate in permissions.json. Now computes a delta between Hytale's current state and HyperPerms' resolved set, only adding missing and removing stale entries
  • 🔒 Race condition fix — Multiple threads (command thread, scheduler, CF pool, web editor) could call sync simultaneously, racing on Hytale's non-thread-safe HashSet. Added per-UUID synchronization locks and defensive copying
  • Centralized sync logic — Six user commands and HyperPermsPermissionProvider each had inline sync calls via bootstrap reflection. All sync is now handled by a single CacheInvalidator.setSyncListener() hook — every cache invalidation automatically triggers Hytale sync

 

Cache Invalidation Fixes

  • 🎯 Targeted group invalidation — Group commands (setperm, setprefix, setweight, setexpiry, parent add/remove) were calling invalidateAll() instead of targeted invalidateGroup(), causing unnecessary cache churn for unrelated users
  • Expired permissions syncedExpiryCleanupTask removed expired nodes but didn't invalidate the cache or trigger Hytale sync — expired permissions remained active until the player reconnected
  • 🔗 Consistent invalidation API — Some commands used getCache().invalidate() (bypassing sync) while others used getCacheInvalidator().invalidate(). All commands now unified on getCacheInvalidator()

 

📖 Full Changelog: GitHub