promotional bannermobile promotional banner

OrbisGuard Mixins

Companion module for OrbisGuard that closes all protection bypasses through server-level mixins.
Back to Files

OrbisGuard-Mixins-0.10.0.jar

File nameOrbisGuard-Mixins-0.10.0.jar
Uploader
wiflowwiflow
Uploaded
Aug 29, 2026
Downloads
76
Size
134.9 KB
File ID
8760566
Type
R
Release
Supported game versions
  • Early Access

What's new

Changelog

All notable changes to OrbisGuard-Mixins will be documented in this file.


[0.10.0] - 2026-08-29 (Release 0.6.2 Compatibility)

Compatibility pass for the Hytale release server 0.6.2, moving off the May 2026 pre-release (2026.05.07-5efa15f6d). Far smaller than 0.9.0: all 28 mixin target classes still exist, so no @Mixin target had to move and no vanilla body had to be re-derived. 5 of 28 mixins needed changes, all descriptor or signature level; the other 23 target-match unchanged. Toolchain unchanged — javac still reads the v69 server JAR while emitting Java 16 (class v60) mixin bytecode for Hyinit's compatibilityLevel JAVA_16 cap.

Verdict

Hyinit is still required, and no mixin can be retired. 0.6.2 does ship new ECS events, and two of them look at first glance like they could replace mixins — but they cannot, because they are not cancellable. Both server.core.event.events.ecs.EnvironmentBreakBlockEvent and builtin.portals.events.EnterPortalEvent extend plain EcsEvent, not CancellableEcsEvent, so they are observation-only and cannot stop an explosion or a portal use. The one genuine candidate is RespawnEvent, which does extend CancellableEcsEvent — but it carries no location payload, so it only partly covers RespawnLocationMixin and cannot yet drive the respawn-location flag on its own.

There is still no MobSpawnEvent, PlayerDeathEvent, DurabilityChangeEvent, FireSpreadEvent, AutoPickupEvent, hammer-cycle, scythe-harvest, workbench-access, crafting-queue, builder-tools, command-interception, or flood-fill hook. Every protection currently delivered via mixin must continue to be delivered via mixin.

Updated mixins (5)

PlayerItemEntityPickupSystemMixincompiles clean, would have failed at boot. SpatialStructure moved its whole query surface from org.joml.Vector3d to the read-only org.joml.Vector3dc (closest, collect, collectBox, collectCylinder, ordered, ordered3DAxis). Source passing a Vector3d still compiles because it implements Vector3dc, but the baked descriptors no longer match. Both @Redirect targets updated — closest(Lorg/joml/Vector3dc;)Ljava/lang/Object; and ordered(Lorg/joml/Vector3dc;DLjava/util/List;)V — and the two handler parameters retyped to Vector3dc.

BlockHarvestUtilsMixincompiles clean, would have failed at boot. removeBlock gained a BlockSection parameter immediately before its trailing ComponentAccessor<ChunkStore>, part of the section-based chunk storage rework. Three coordinated edits: the @Shadow stub signature, the @Redirect target= descriptor, and the handler — which now accepts the BlockSection and forwards it on the delegate call. The method = "performPickupByInteraction" selector is a bare name with no descriptor, so it kept resolving even though that method also gained a BlockSection.

ExplosionBlockDamageMixin — the one with both halves stale. BlockHarvestUtils.performBlockDamage changed on both sides of this redirect: the outer convenience overload this mixin selects went 8-arg → 9-arg (a boolean inserted at position 6), and the inner call it redirects went 11-arg → 13-arg (a second Ref<EntityStore> for the damage source at position 2, plus a boolean at position 10). Both the method= selector and the at.target= descriptor rewritten, and the handler now takes sourceRef and skipInteractions and forwards them to the 13-arg call. The null-ref test that identifies an explosion (rather than a player) is unchanged.

HarvestCropInteractionMixincompiles clean, would have failed at boot. FarmingUtil.harvest swapped its first parameter from World to ComponentAccessor<ChunkStore>. Target descriptor rewritten and the handler's first parameter retyped. The guard needed the world name for the region lookup, which is no longer handed to it directly — it now resolves it from the entity accessor via accessor.getExternalData().getWorld().getName(), the same pattern ExplosionBlockDamageMixin already used.

CraftingManagerMixin — the only one that failed to compile, and the only one that got simpler. Two upstream removals hit the same block: BlockModule.BlockStateInfo.getChunkRef() became getSectionRef() (now pointing at a section, not a chunk), and ChunkUtil.xFromBlockInColumn / yFromBlockInColumn / zFromBlockInColumn were deleted outright. Rather than re-deriving the arithmetic against sections, the chest-position block now uses the new first-class API: blockStateInfo.fillWorldPos(store, worldPos). Five lines of manual chunk math collapse to one call, and the ChunkUtil and WorldChunk imports are gone (org.joml.Vector3i added). The @Redirect on Ref.isValid()Z in getContainersAroundBench is unchanged.

Unchanged mixins (23)

All still compile and target-match against 0.6.2, verified descriptor by descriptor: CommandManagerMixin, SpawnMarkerEntityMixin, WorldSpawnJobSystemsMixin, NPCPluginSpawnMixin, FloodFillPositionSelectorMixin, InteractionEntryMixin, InteractionChainMixin, StoreAddEntityMixin, DeathItemDropMixin, NPCDeathItemDropMixin, ItemDurabilityMixin, BenchWindowMixin, BuilderToolsPacketHandlerMixin, TeleporterInteractionMixin, EnterPortalInteractionMixin, ReturnPortalInteractionMixin, TeleportConfigInstanceInteractionMixin, TeleportInstanceInteractionMixin, ExitInstanceInteractionMixin, FireFluidTickerMixin, HubPortalInteractionMixin, CycleBlockGroupInteractionMixin, RespawnLocationMixin.

The @WrapMethod conversion from 0.9.0 paid off here. Several of those 23 target methods did change upstream in 0.6.2 — the portal and instance interactions in particular saw their private lambdas rewritten around BlockModule.BlockStateInfo where they previously took BlockComponentChunk. Because those mixins no longer carry copied vanilla bodies and simply delegate to original.call(...), the new vanilla behaviour came along for free and none of them needed an edit.

BuilderToolsPacketHandlerMixin is worth calling out for the same reason. BuilderToolsPacketHandler saw heavy upstream churn in 0.6.2 — hasPermission(PlayerRef, String) became hasPermission(PlayerRef, PermissionQuery), and new handleBuilderToolColorAction, handleBuilderToolSetEntityType, handleGMaskPresetLoadResponse, isAuthorizedForTool, parseBrushShape, and estimateClipboardBlocks members were added. None of it touched the wrapped methods' own signatures, so the mixin was unaffected.

Verification

  • gradle build succeeds, including test, verifyBridgeSlots, verifyNoMixinShadowing, and check.
  • All 83 injection points (@At targets, method selectors, @Shadow members) re-resolve against the 0.6.2 JAR.
  • Emitted mixin bytecode confirmed at class file v60 (Java 16), matching compatibilityLevel JAVA_16.
  • Bridge protocol and slot constants unchanged this release — no ProtectionBridge / MixinBridge edits were required.

This mod has no additional files