Skip to content

Known Limitations

goshi-hider edited this page Jul 24, 2026 · 1 revision

Known Limitations

OmniMixin is built incrementally, subsystem by subsystem, and each hook is only shipped once its real vanilla target has been verified against this project's pinned Yarn mappings (1.21+build.9). That means a handful of pieces from the original design are deliberately left out for now, rather than shipped as a guess. This page lists all of them in one place, with the actual reason each one was held back.

If you need one of these and can verify the real call site yourself, pull requests are very welcome — these aren't "no," they're "not yet, and here's exactly why."

Movement

  • PlaySpeed.MODIFY_AIR / MODIFY_SWIM / MODIFY_CLIMB — vanilla doesn't calculate separate speed values per movement medium the way the original design assumed; only one ground-speed hook (MODIFY_GROUND) exists to wrap.
  • PlaySprint.MODIFY_FOV_MULTIPLIER — superseded entirely by PlayCamera.CALCULATE_FOV, which already receives vanilla's sprint FOV boost baked into its base value. A second hook here would be redundant.
  • PlayFly.TOGGLE / ALLOW_ELYTRAflying/allowFlying are raw public fields set from several different call sites (client input packets, a dedicated C2S packet, elytra activation checks), not one central method. There's no single place to hook that covers all of them correctly.
  • PlayCollision.BLOCK_COLLISION / STEP_HEIGHT — the block collision math is a dense, multi-overload static method built on shape-stream types that would need extensive verification to hook safely. Step height has no confirmed public setter at this project's pinned version.

Combat

  • PlayStatusEffect.TICK — the original spec's named target, StatusEffectInstance.upgrade(), turns out to be about combining two status effect instances of the same type, not per-tick processing. The real per-tick call site for status effects hasn't been verified yet.
  • A raw LivingEntity.setHealth(float) hook — deliberately not exposed. That method is called from many unrelated places (damage application, healing, respawning, creative-mode instant-death commands, regeneration ticking) with no shared context to give listeners, unlike PlayHealth.HEAL and PlayHealth.DEATH, which each have exactly one clear, well-known call site.

World and Blocks

  • PlayBlock.INTERACT item-based interactions — the current INTERACT hook covers the general "use" interaction only, not item-based interactions like using bonemeal or flint-and-steel on a block. That's a genuinely separate vanilla method with a different result type (ItemActionResult), left for a future pass.
  • PlayRedstone.ON_SIGNAL_CHANGE — the closest verified vanilla call site for "a redstone signal changed" is the exact same neighborUpdate call already exposed as PlayBlock.NEIGHBOR_UPDATE. A second event here would just fire twice for the same thing, so it isn't duplicated.

Items and Inventory

  • PlayItem.COOLDOWN — item cooldowns are managed through a separate ItemCooldownManager class that hasn't been verified for this version yet.
  • PlayInventory.ITEM_TRANSFER / PICKUP_ITEM — item movement also happens through hoppers and direct inventory manipulation, each of which needs its own separate verification pass rather than being bundled in under the slot-click hook.
  • PlayLoot.ENTITY_LOOT — entity death loot builds a full loot context (damage source, killer, luck modifiers) before reaching the shared loot table machinery, unlike block drops, which had a much simpler single call site to verify and hook.

Entity Lifecycle and AI

  • PlayGoal.REGISTER_GOALS doesn't hook MobEntity.initGoals() — that method doesn't exist; vanilla mobs each wire up their AI goals inline in their own constructors. This hooks the shared GoalSelector.add(...) call instead, which means the context can't tell you which entity, or which selector (a mob's normal goal selector vs. its target selector), a given addition belongs to. See the Entity Lifecycle and AI page for how to work around this.

Rendering

  • PlayRender.WORLD_LAST — a hook at the very end of the whole world render pass (WorldRenderer.render(...)) isn't implemented. That method's parameter list is one of the largest and most version-volatile in the entire game (camera, frustum, projection matrix, light data, and more, all of which have changed shape release to release), and it couldn't be verified with enough confidence against this project's pinned Yarn build to ship responsibly. PlayRender.PRE_ENTITY / POST_ENTITY cover the per-entity case instead, since EntityRenderDispatcher.render(...) has a single, stable, confirmed public signature.
  • InGameHud.MODIFY_BAR_VALUE, PlayCamera.TRANSFORM_CAMERA — not yet implemented; both need further verification of their exact vanilla call sites before they can be added safely.

A version-sensitivity note

A few of the mixins that are implemented depend on method names that are known to have changed between nearby Minecraft versions, so if you fork this project onto a different Yarn build, double-check these first:

  • LivingEntity.setAbsorptionAmountUnclamped(float) (backing PlayHealth.ABSORPTION_CHANGE) was renamed from setAbsorptionAmount in this version line.
  • EntityRenderDispatcher.render(...) (backing PlayRender.PRE_ENTITY / POST_ENTITY) is a single public generic method at this project's pinned version, but was split into several private EntityRenderState-based overloads starting in Minecraft 1.21.5. If you bump past 1.21.4, this mixin's target needs to be re-verified and very likely re-pointed at the new overload.
  • Entity.saveSelfNbt(NbtCompound) / Entity.readNbt(NbtCompound) (backing the Networking and Data Sync subsystem) are the concrete methods that internally call the abstract writeCustomDataToNbt / readCustomDataFromNbt every entity subclass implements individually — those two abstract methods themselves can't be mixin targets, since Mixin needs an actual method body on the target class to inject into.

This hasn't been run in a live game yet

Every mixin listed as "implemented" throughout this wiki has been written and individually cross-checked against real Yarn 1.21+build.9 documentation, but the environment this project was developed in has no access to Minecraft's Maven repositories, so nothing here has actually been compiled with ./gradlew build or booted in a real game instance yet. If you're the first to do that and something doesn't line up, please open an issue with the specific class and error — that kind of report is exactly what this project needs next.

Clone this wiki locally