OrbisGuard | Region Management

Region protection plugin for Hytale servers. Define areas, set flags (block-break, block-place, use), and control who can build where. Based on WorldGuard for Minecraft.

File Details

OrbisGuard-0.8.0.jar

  • R
  • Feb 15, 2026
  • 457.33 KB
  • 207
  • Early Access

File Name

OrbisGuard-0.8.0.jar

Supported Versions

  • Early Access

[0.8.0] - 2026-02-15

Added

Region parenting (WorldGuard-style inheritance) - Regions can now have parent-child relationships. Set a parent with /rg setparent <region> <parent>, clear with /rg setparent <region> none.

How it works:

  • Flags - Unset flags walk up the parent chain. Setting a flag on the child overrides the parent.
  • Membership - Parent owners/members count as owners/members of all children.
  • Info display - /rg info shows parent and children.
  • Redefine - Redefining preserves parent-child relationships.

Example:

/rg define town
/rg flag town build deny
/rg addowner town Mayor

/rg define town-market
/rg setparent town-market town
/rg flag town-market chest-access allow
# town-market inherits build=deny and Mayor as owner, but overrides chest-access

API: setParent() - New IRegionManager.setParent(regionId, parentId). IRegion now exposes getParent() and getChildren().

Fire/flamethrower protection (requires OrbisGuard-Mixins, pre-release only) - Fire fluid spreading blocked in protected regions where build is denied. Hytale's fire is a fluid system (FireFluidTicker) that bypasses all ECS events, so we mixin on FluidTicker.spread() to intercept fire ticks. Does nothing on release servers where FireFluidTicker doesn't exist yet.

listExcludePrefixes config option - Hide regions from /rg list by prefix. Default: ["wiflowsclaims_"]. Footer shows how many were hidden. Use /rg list -a to show all. Configurable under settings.listExcludePrefixes.

door-access flag - Controls door, gate, and trapdoor access separately from other interactions. Default: allow for non-members.

Console -w world hint - Console commands show available worlds when -w is forgotten.

Changed

Exit deny now works like WorldGuard - exit=deny only blocks walking/movement, not teleportation. Before this, /tp and /spawn would snap the player back inside the region which was super annoying and prevented admins from teleporting players out. Movement jumps over 6 blocks are treated as teleports and allowed through.

Hammer flag actually works now - Both the DamageBlock system and CycleBlockGroup interaction were checking block-break/block-place instead of hammer. So hammer deny did literally nothing. Now checks hammer first, falls back to build.

minimap-label-scale is now absolute - Absolute pixel scale instead of a multiplier. 1 = smallest (3x5), 2 = double, 3 = triple. Auto-scales when not set.

Unified define/redefine - /rg define and /rg redefine auto-detect region type from selection mode. No more /rg definepoly.

  • /rg selmode cuboid → cuboid region
  • /rg selmode poly → polygonal region
  • /rg selmode chunk → cuboid region from chunks

use flag scope refined - use now only controls workbenches and tables (F-key crafting). Everything else has its own flag:

  • use - Workbenches, anvils, tables, crafting stations
  • door-access - Doors, gates, trapdoors (new)
  • chest-access - Chests and containers
  • seat - Chairs and benches
  • use-portals - Portal blocks

Before this, use controlled all non-container interactions including doors.

Fixed

Item durability protection not working - The mixin used a FIELD redirect on Player.gameMode which doesn't work in Hyxin. Rewrote to @Inject at HEAD of canDecreaseItemStackDurability. Also removed the unnecessary ThreadLocal hack.

Pickaxe mining blocked even with block-break allow - DamageBlockEvent only checked hammerbuild as fallback, completely ignoring block-break. If you had block-break allow but not build allow, block damage was denied. Fallback chain is now hammerblock-breakbuild.

Auto-pickup protection completely broken on latest server - The server changed item pickups to go through SpatialStructure.closest() + interaction chains instead of the old getInventory()/addItemStack() path. Rewrote the mixin to intercept closest() and return null to block denied pickups.

Crafting protection broken on latest server - CraftingManager.queueCraft() (all time-based recipes) doesn't fire CraftRecipeEvent.Pre — only craftItem() (instant crafts) did. Added a mixin on queueCraft() that fires the pre-event before queueing.

F-key item pickup required block-break permission - The harvest hook checked block-break first, which defaults to deny for non-members. But F-key harvest is a pickup, not a break. Now checks item-pickup instead.

/rg list freezing client with many regions - Was sending every region as a separate message with no pagination. 1800+ regions froze the client for seconds. Now paginated (10/page) with -f <pattern> to filter by name, -p <player> to filter by owner. All combine: /rg list -f spawn* -p Tig3r 2.

API redefine() causing stale lookups - redefine() updated bounds but didn't refresh the spatial index or chunk cache. Protection checks could miss the region at its new location. Index and cache now rebuild after redefine.

Player name cache not populated on join - Names were read on connect but never stored, so name resolution fell back to UUIDs. Now cached on join and persisted to disk.

Region index stale after /rg load - The findRegion() index was only built on first world load. Reloads left it outdated. Now rebuilt after every load.

Minimap labels cut off at chunk boundaries - Labels past the edge of a chunk image were clipped. Now each chunk draws its portion of the text so labels render across boundaries.

Server crash on release: FireFluidTickerMixin - Typo in method descriptor (lowercase iii instead of III). Crashed on startup with InvalidMemberDescriptorException.

Server crash on release: SelectionVisualizer - DisplayDebug packet used the pre-release 7-arg constructor which doesn't exist on release. Now uses no-arg constructor and sets opacity via reflection only when present.

Denial cooldown memory leak - DENIAL_COOLDOWNS map never cleaned on disconnect. Entries accumulated forever on long-running servers. Now cleared on disconnect.

entity-entry removing player-placed entities - entity-entry=deny was removing NPCs, item models, and holograms that admins placed. Now distinguishes world-spawned vs player-placed and skips:

  • Preview entities (NonSerialized)
  • Manually spawned NPCs (no spawn configuration)
  • Props and decorative items (PropComponent, PreventPickup)
  • Intangible/invulnerable entities
  • Model displays (ModelComponent without NPC behavior)

Mobs spawning before plugin loads - Mobs could spawn in protected regions during the brief window before the hook registered. Spawn mixins now block all spawns during startup by default. New spawnProtectionStartupMode config ("block" default, "allow" for legacy).

Performance

Minimap rendering O(N*P) → O(N+C*P) - Was iterating all regions for every pixel. With 1800 regions on a 32x32 chunk image that's 1.8M checks per chunk. Now pre-queries candidate regions once per chunk and only checks overlapping ones per pixel.

Protection hook allocations gone - Every protection check was allocating a HashSet + RegionWrapper per region just to pass to hooks. Now uses a lazy-wrapping view that only allocates if hooks actually inspect the set.

Spatial index reindex O(all buckets) → O(B) - reindex() scanned every bucket to remove one region. Now uses a reverse mapping for direct removal.

Misc:

  • PlaceholderConditionService - Initialization-on-demand holder instead of synchronized getInstance()
  • ProtectionHookRegistry - Deferred sorting to first processHooks() call instead of every registerHook()
  • RegionContainer.findRegion() - O(1) via global index instead of iterating all worlds

Removed

/rg definepoly - Merged into /rg define. Use /rg selmode poly then /rg define <id>.