Uh oh!
There was an error while loading. Please reload this page.
Releases: HyperSystems-Development/HyperPerms
Release list
2.10.0 — Command tab-completion, QoL fixes & QuestLines Claims compatibility
Server Version:0.5.6 (release) · 0.6.0-pre.4 (pre-release)
Quality-of-life release: tab-completion for /hp, instant command-tree refresh, and fixes for several silently-broken integration paths — including a QuestLines Claims compatibility fix that was handing out double (or triple) the claims a permission allowed. The same codebase now runs on both the Hytale release (0.5.x) and pre-release (0.6.0-pre.x) channels.
Added
- Tab-completion for
/hpcommands. Group, track, permission-node and online-player arguments now suggest as you type (case-insensitive prefix match). Previously every argument was a plain string with no completion. - Instant command-tree refresh. When a player's groups or permissions change, the affected online player gets a fresh command tree immediately — newly-granted commands appear without a relog.
- Clickable download link in the "update available" notification (alongside
/hp update). - Startup self-check that verifies the Hytale-core reflection targets used by optional integrations resolve on the running build, logging a clear warning if any are missing.
Fixed
- QuestLines Claims granted double (or triple) the claims/rent a permission allowed. QuestLines computes claim/rent limits by summing the numeric suffix of
questlinesclaims.claim.chunks.<n>/questlinesclaims.rent.limit.<n>nodes across every provider, and across both a user's permissions and each of their groups' permissions. HyperPerms exposed the same fully-resolved set through several of those surfaces (getUserPermissions, the virtualuser:<uuid>group, and the native-provider sync), so each node was counted 2–3×. When QuestLines is detected, HyperPerms now collapses those to a single summable source — boolean checks are unaffected, and servers without QuestLines see no change. (LuckPerms was already special-cased by QuestLines, which is why it behaved correctly.) - PlaceholderAPI offline-player fallback never worked — it referenced a non-existent class (
…server.HytaleServer, missing.core) and a deadgetPlayerManager()chain, silently returning null. Now usesUniverse.get().getPlayer(uuid). - MysticNameTags nameplate refresh never worked — the
Worldclass literal omitted its.worldsub-package. - Event listener leaks across
/reload— chat, tab-list and update-notification listeners stored their registration handles but never calledunregister()(a stale comment claimed no such API existed). They now unregister properly instead of leaving duplicate handlers. - Stale "ghost" entries in the player/tab list — HyperPerms only ever added player-list entries; quitting players are now removed via
RemoveFromServerPlayerListinstead of lingering.
Changed
- Centralized the Hytale-core reflection string literals (
Universe,PlayerRef,World) intoReflectionUtilso a future Hytale package move is a one-line fix and the optional integrations can't drift independently.
Upgrade
Drop-in replacement for 2.9.x — no config changes. Replace the jar in mods/ and restart, using the build that matches your server channel:
HyperPerms-2.10.0.jar— Hytale release servers (0.5.x, manifest^0.5.6)HyperPerms-2.10.0-prerelease.jar— Hytale pre-release servers (0.6.0-pre.x, manifest^0.6.0-pre.4)
If you run QuestLines Claims, HyperPerms prunes any duplicate questlinesclaims.* entries a previous version wrote into the native provider the first time each player connects after updating.
Requirements: Hytale 0.5.6+ (release) or 0.6.0-pre.x (pre-release), Java 25
Full Changelog:2.9.6...2.10.0
Discord:https://discord.gg/SNPjyfkYPc
2.9.6 — Hytale 0.5.2 OP recognition hotfix
Server Version:0.5.2
Hotfix for operator (OP) recognition on Hytale 0.5.2. If you're on 2.9.5 and your HyperPerms admins are showing as "not OP" in-game, update to 2.9.6.
Fixed
- HyperPerms admins were not recognized as OP on 0.5.2. Hytale 0.5.2 determines operator status by group membership — it checks whether a player is in the
hytale:Admingroup (getGroupsForUser(uuid).contains("hytale:Admin")), andFlyCameraModule/WorldMapTrackerkey off group names too. HyperPerms funnels all resolution through a singleuser:<uuid>virtual group, so admins were never seen inhytale:Adminand showed as "not OP" even though their permission checks passed. getGroupsForUsernow also advertiseshytale:Adminfor any user who effectively resolves the*permission (superuser). Granting a HyperPerms group the*node makes its members OP, recognized by Hytale and OP-gated features. Permission resolution itself is unchanged (still funneled throughuser:<uuid>).
Changed
- Reverted the authoritative-provider mode added in 2.9.5. HyperPerms no longer removes Hytale's built-in provider; it registers itself first and keeps the built-in provider registered (its removal aggravated the OP break, because Hytale's
getGroupsForUseraggregates across all providers).
Upgrade
Drop-in replacement for 2.9.5/2.9.4. No config changes. Replace the jar in mods/ and restart.
Requirements: Hytale 0.5.2+, Java 25
Full Changelog:2.9.5...2.9.6
Discord:https://discord.gg/SNPjyfkYPc
2.9.5 — Hytale 0.5.2 Support
Server Version:0.5.2 ("Update 5", rev 8b2f3de, Java 25)
Compatibility release for Hytale 0.5.2. Verified by booting the local 0.5.2 server: HyperPerms loads, enables, and registers as the authoritative permission provider with no errors.
Fixed
- Plugin failed to load on 0.5.2 (manifest). 0.5.2 added a strict
SemverRangecodec that rejected the manifest's bareServerVersion(0.5.2) and the spaced>= 1.0.2optional-dependency range. Now uses^0.5.2and>=1.0.2. Without this the plugin did not load at all. PermissionProviderinterface conformance. 0.5.2 expanded the interface from 10 to 14 methods. Implemented the four new ones (setUserGroup,getGroupParent,getAllRegisteredGroups,getEffectiveGroupPermissions).- Deny-by-default permission model. A group using
-*(deny-all) plus specific grants previously had every granted permission silently denied on native command checks. HyperPerms now resolves these correctly — standard "deny-all, then grant" setups work, and native checks agree with/hp check.
Changed
- Authoritative permission provider. HyperPerms now removes Hytale's built-in provider while enabled (and restores it on disable), so it is the single source of permission decisions. Manage everything via
/hp— vanilla/perm,/setgroupand/opoperate on data HyperPerms no longer consults, and/op selfis advisory-disabled while HyperPerms is active (grant admin via a group with the*node). - Default build channel is now
release(targets 0.5.2). Use-Phytale_channel=pre-releasefor pre-release builds.
Added
- Registered the 0.5.2 built-in nodes so they surface in the web editor and wildcard expansion:
hytale.world_map.teleport.coordinate,hytale.world_map.teleport.marker,hytale.system.update.notify(+ matching wildcards).
Removed
- Obsolete
warnAboutVanillaGroupOverwritestartup check (tested the legacyOP/Defaultgroup keys that no longer exist in 0.5.2).
Requirements: Hytale 0.5.2+, Java 25
Full Changelog:2.9.4...2.9.5
Discord:https://discord.gg/SNPjyfkYPc
HyperPerms v2.9.4
Fixed
- TabListListener runtime crash —
Universe.getPlayers()return type differs between Maven artifact (Collection) and runtime server (List), causingNoSuchMethodError. Fixed by copying intonew ArrayList<>()to decouple from the return type descriptor
Server Version:2026.03.26-89796e57b
Full Changelog:https://github.com/HyperSystems-Development/HyperPerms/blob/main/CHANGELOG.md
HyperPerms v2.9.3
v2.9.3 — March 26 Server Support
Server Version:2026.03.26 (release & pre-release)
What's New (since 2.9.1)
Added
- Per-world permissions —
setpermandunsetpermcommands (group and user) now accept an optionalworldargument to restrict permissions to a specific world - Context display in info commands — Group and user info now shows context restrictions (e.g.
[world=Survival]) on permission nodes
Fixed
- API compatibility — Updated
TabListListenerto handleUniverse.get().getPlayers()returningCollection<PlayerRef>instead ofList<PlayerRef>, fixing compilation against the March 26 server update - Group inheritance priority — Child group permissions now always take precedence over inherited parent group permissions, regardless of weight values
- LuckPerms H2 migration version mismatch — Use isolated classloader when loading H2 driver from LuckPerms libs
- H2 driver selection — Prefer modern H2 driver over legacy to match current LuckPerms database format
- H2 migration column access — Use unquoted column name for ResultSet access
- Analytics flush data loss — Prevent race condition where permission check counters could be lost during flush
- ImportCommand silent failures — Await all group save futures before reporting success
- Non-atomic node mutations — Synchronize compound removeIf+add operations in setNode and addGroup
- SQL serialization — Use Gson instead of hand-rolled JSON parser for correct escaping of special characters
- Cycle detection case sensitivity — Normalize group names to lowercase in inheritance cycle detection
- Template loader race condition — Prevent concurrent template loading from clearing the map mid-load
- Confirmation memory leak — Clean up expired pending confirmations to prevent unbounded map growth
- Migration thread starvation — Use dedicated executor instead of common ForkJoinPool for LuckPerms migration
- SQLite nested ResultSet — Collect all rows before loading nodes to avoid driver conflicts on single connection
- SQLite backup consistency — Checkpoint WAL before copying database file to capture all committed writes
- SQLite restore PRAGMAs — Re-enable WAL and foreign_keys after restoring a backup
- Clone command data loss — Await save future in clone command before reporting success
- Group rename atomicity — Create new group before deleting old to prevent data loss on crash; await all save futures
- JSON storage path traversal — Validate names on load/delete paths to prevent directory traversal
- WildcardMatcher trace inconsistency — Add stripped-prefix matching to
checkWithTrace()to matchcheck()behavior
Full Changelog: v2.9.1...v2.9.3
HyperPerms v2.9.1
v2.9.1 — Permission Resolution, Templates & PermissionsPlus Migration
Added
PermissionsPlus Migration Tool
Full migration support for servers transitioning from PermissionsPlus to HyperPerms.
/hp migrate permissionsplus— Preview migration (dry-run)/hp migrate permissionsplus --confirm— Execute migration- Reads PermissionsPlus JSON data files and transforms groups, users, and permissions into HyperPerms format
- Automatic permission cleaning and validation for PermissionsPlus-specific formats
- Comprehensive test coverage for data models, permission cleaning, and validation
SSP Auto-Owner Assignment
First player to join a single-player (SSP) world is automatically assigned the owner group, removing the need for manual /hp user addgroup setup on fresh worlds.
Fixed
Permission Resolution Order
The resolver now evaluates permissions in most-specific-first order:
a.b.c → a.b.* → a.* → *
Previously, a broad wildcard like a.* could override a more specific grant or denial on a.b.c. This is now resolved — specific permissions always take priority.
Template Application with Existing Groups
/hp template apply no longer fails when groups from the template already exist on the server. Existing groups are gracefully skipped or merged instead of throwing an error.
Template Clearing Nodes and Tracks
Fixed UnsupportedOperationException when applying templates that clear existing nodes and tracks. Template application now uses proper mutable collection methods instead of operating on immutable list views.
SSP Owner Assignment Race Condition
Added synchronization guard to prevent duplicate owner group assignments when multiple players connect simultaneously during first server start.
Chore
- Bumped version to 2.9.1
- Updated CHANGELOG.md
Full Commit Log
| Type | Scope | Description |
|---|---|---|
feat | migration | Add PermissionsPlus data models |
feat | migration | Add PermissionsPlus migrator with JSON reading and transformation |
feat | migration | Register PermissionsPlus migrator in /hp migrate command |
test | migration | Add PermissionsPlus data model tests |
test | migration | Add PermissionsPlus permission cleaning and validation tests |
refactor | migration | Apply code review fixes to PermissionsPlus migrator |
fix | resolver | Change to most-specific-first permission resolution order |
fix | template | Gracefully handle existing groups during template application |
feat | ssp | Auto-assign owner group to first player |
fix | ssp | Prevent race condition in first-player owner assignment |
fix | template | Use proper mutable methods for clearing nodes and tracks |
chore | — | Bump version to 2.9.1 and update changelog |
v2.9.0-rc1: Permission Resolution, Template & SSP Fixes
Fixes
- Permission Resolution: Specific grants (e.g.
+ simpleclaims.edit-party) now correctly override global denies (- *). Resolution order changed to most-specific-first. - Template Application: Fixed "Failed to apply template: null" error when applying templates to servers with existing groups. Template applier now uses proper mutable methods for updating groups and tracks.
- SSP Auto-Owner: First player on an empty server is automatically assigned the configured owner group.
Testing
Download HyperPerms-2.9.0.jar and replace your existing plugin JAR. Please report any issues.
HyperPerms v2.9.0
Hotfix: Web Editor Session Create
Fixed
- Web editor returning 500 on
/hp editor— The gzip compression introduced in 2.8.9 was applied to all session create requests, but the Cloudflare Worker API does not supportContent-Encoding: gzipon incoming request bodies. This caused every/hp editorcommand to fail with "Server returned status 500". Compression is now only applied to payloads exceeding 500KB, keeping normal requests uncompressed while still protecting very large servers from HTTP 413 errors.
If you are on 2.8.9, update immediately.
HyperPerms v2.8.9
Architecture Rehaul & MMOSkillTree Integration
First-Class MMOSkillTree Support
HyperPerms now has full, first-class integration with MMOSkillTree — one of the biggest plugins on Hytale.
- 200+ permission nodes registered across admin, command, skill, boost, and alternate prefix categories
- All 23 skill nodes —
mmoskilltree.skill.mining,.woodcutting,.excavation,.harvesting,.fishing,.swords,.daggers,.polearms,.staves,.axes,.blunt,.archery,.unarmed,.defense,.taming,.acrobatics,.crafting,.repair,.alchemy,.enchanting,.cooking,.smithing,.building - All 140 XP boost permission nodes covering personal and global boosts for all skills, skill categories, and all-skills targets with varying multipliers, durations, and cooldowns
ziggfreed.*alternate prefix support — MMOSkillTree checks permissions through bothmmoskilltree.*andziggfreed.mmoskilltree.*prefixes. HyperPerms now correctly resolves both via bidirectional aliases- Hytale command path aliases —
com.ziggfreed.mmoskilltree.command.*paths resolve to theirmmoskilltree.command.*equivalents - Wildcard expansion for all MMST permission categories
- Tab completion & web editor now show all MMST permission nodes
- Updated RPG & Survival templates with appropriate MMST permissions at each rank tier (XP boosts scale with rank progression)
Staged Plugin Lifecycle
The plugin initialization system has been completely rewritten with a clean, modular architecture:
- 11 ordered stages: Config → Storage → CoreManager → Resolver → Registry → Chat → Integration → Web → Scheduler → Analytics → DefaultGroups
PluginLifecycleorchestrator initializes stages in order and shuts them down in reverse — if any stage fails, previously initialized stages are safely torn downServiceContainerprovides typed dependency injection across all stagesHyperPerms.javareduced from ~400 lines of monolithic init to ~25 lines — all setup logic now lives in dedicatedStageimplementations
Annotation-Based Command Framework
The entire command system has been rebuilt using a declarative annotation-driven approach:
- New annotations:
@CommandGroup,@Command,@Arg,@OptionalArg,@Permission,@Confirm CommandScannerautomatically discovers and registers annotated command methods at startupCommandDispatcherhandles argument parsing, permission checks, and confirmation flows- 5 annotated command groups replace 42 individual command classes:
GroupCommands,UserCommands,DebugCommands,RootCommands,PermsCommands,BackupCommands - Net reduction of ~1,500 lines with significantly better maintainability
Web Editor Improvements
- Gzip compressed session requests — Session create payloads are now gzip compressed before sending to the API, preventing HTTP 413 errors on servers with many groups and permissions
Bug Fixes
- Fixed config being null during early stage initialization
- Fixed default groups being created before storage was fully ready
- Integrated 2.8.8's centralized sync and diff-based permission logic into the new lifecycle system
HyperPerms v2.8.8
[2.8.8] - 2026-02-23
Server Version:2026.02.19-1a311a592
Fixed
- Permission pollution in Hytale's permissions.json -
syncPermissionsToHytale()previously pushed all resolved permissions on every change, causing hundreds of permissions to accumulate. Now uses diff-based sync that computes the delta between Hytale's current state and HyperPerms' resolved set, only adding missing and removing stale permissions - Race condition in concurrent permission syncs - Multiple threads (command thread, scheduler, CF pool, web editor) could call
syncPermissionsToHytale()simultaneously for the same user, racing on Hytale's non-thread-safeHashSetview fromgetUserPermissions(). Added per-UUID synchronization locks and defensive copying of the live view - Scattered manual sync calls - Six user commands and
HyperPermsPermissionProvidereach had their own inlinesyncPermissionsToHytale()call via bootstrap reflection. Centralized all sync logic into aCacheInvalidator.setSyncListener()hook — every cache invalidation now automatically triggers Hytale sync for affected online users - Group commands invalidated entire cache - Group permission/property changes (
setperm,unsetperm,setprefix,setsuffix,setweight,setexpiry,parent add/remove) calledinvalidateAll()instead of targetedinvalidateGroup(), causing unnecessary cache churn for unrelated users - Expired permissions not synced to Hytale -
ExpiryCleanupTaskremoved expired nodes but didn't invalidate the cache or trigger Hytale sync, so expired permissions remained active until the player reconnected - Inconsistent cache invalidation API - Some commands used
getCache().invalidate()(bypassing sync) while others usedgetCacheInvalidator().invalidate()(with sync). Unified all commands to usegetCacheInvalidator()