Create and Mekanism capabilities
Clean-room capability audit of main 5c2583c030 (2026-11-08); no foreign mod or NeoForge source consulted. Status applies to the stated engine operation, not a completed port. Tests below were inspected, not run here. Public wiki requirements are unversioned unless noted; exact release applicability remains unknown. Create's official CurseForge description (listing 6.0.10 for Minecraft 1.21.1) establishes animated automation, but no detailed interaction contract. The Create manual and Fandom Deployer page were inaccessible; detailed moving-structure requirements come from #794, and fake-player interactions are the audit scope requested by #806, not a claimed Create contract.
From the modding book of arismoko/horizonbfbda6a
Source abbreviations: items, fluids (v9 upgrade note), energy (V10 upgrade note), chemicals, sides are official Mekanism user wiki pages. They motivate operations, not engine implementation details.
Repository references below are verified paths and lines. Prefix API = crates/horizon-mod-vocab/src/; Game = crates/horizon-client/src/game/.
Insert items through a sided block provider and roll back an aborted write (items).
- Status
- Works
- Evidence and covered route
- API
parts/tests North forwarding to a chest, Up refusing slots, commit and abort. Gamecapabilities.rs:392 blocks/resolves the holder,machines/ native_ items.rs:52 :65selects face slots,:73handles root-commit notification.
Move fluid between block holders, retrying a partial acceptance atomically (fluids).
- Status
- Works
- Evidence and covered route
- API
resource.rs:601implements nested transaction extraction/insertion and retries the accepted amount after rollback. Gameblocks/tests partial cauldron transfer throughmachines/ native_ fluids.rs:554 LevelRef::;capability(FLUIDS) :365and:425implement tank writes. This test uses no side; side-specific fluid transfer is not established here.
Query a block entity from a particular side (sides).
- Status
- Works
- Evidence and covered route
- API
parts/independently asserts different Up/North results and forwards to the neighbour. This is a FakeHost provider test, supplemented by the native container face route above.capabilities.rs:392
Obtain typed energy storage and transfer it transactionally (energy).
- Status
- Works
- Evidence and covered route
- API
energy_definescapability.rs:12 EnergyHandler,:27theENERGYkey,:72move_. Energy is an amount, not a resource identity. Gameenergy blocks/tests sides, limits, movement and abort;machines/ native_ energy.rs:294 :62writes journalled block-entity NBT.
Transfer a mod-defined chemical between two providers with rollback (chemicals).
- Status
- Works
- Evidence and covered route
- Game
runtime/tests two mods sharingtransactions.rs:1486 CHEMICALS: 600 becomes 350/250 after moving 250; abort restores prior amounts. APIparts/is the tank Part implementation andcapabilities.rs:245 :261writes through block-entity saved data.
Refuse chemical identity conversion in a tank (chemicals).
- Status
- Works
- Evidence and covered route
- API
parts/rejects insertion of a different held identity;capabilities.rs:284 :303extracts only a matching identity. Covered route is the example mod handler used by the chemical test, not an engine guarantee for arbitrary mod handlers.
Encode/decode tank contents in machine NBT (fluids).
- Status
- Works
- Evidence and covered route
- Game
blocks/tests NBT round-trip and missing entries;machines/ native_ fluids.rs:1097 :1128tests empty-fluid serialization. This establishes the machine-data codec, not disk restart.
Preserve committed tank contents across a complete world save/reload (fluids; persistence is an audit requirement).
- Status
- Works
- Evidence and covered route
- Game
blocks/fills a mod block's game-owned tanks (machines/ tank_ reopen_ tests.rs native_) with a mod fluid and lava in a committed transaction (an aborted insert is rolled back). It saves withblock_ entity_ fluids Game::, drops the game, opens the folder in a new game and streams the chunk back from its region file: both tanks keep their identity and amount. Route: an integrated server in one process with a native mod. LAN, a dedicated server process and wasm mods are not covered by this test.save_ game
Expose a capability on an entity holder (items/energy/fluids).
- Status
- Works
- Evidence and covered route
- API
entity_checks the live level, selects entity-type providers, invokes them with the entity/context and falls through to the game answer. Gamecapability.rs:95–123 blocks/tests entity energy/fluid movement and rollback.machines/ native_ energy.rs:151
Expose a capability on an item holder (items/energy).
- Status
- Works
- Evidence and covered route
- API
item_resolves the current stack, selects providers by item type, invokes the Part with the item place and returns the typed answer. This traced provider path establishes lookup, not every provider's mutation/persistence behaviour.place.rs:561–591
Reject a retained block-entity handle after replacement (machine data).
- Status
- Works
- Evidence and covered route
- Game
modding/tests replacement refusal and identity restoration on rollback. This does not establish lifetime behaviour for every item/entity capability wrapper.native_ block_ entity_ refs.rs:627
Perform a fake-player action and restore its setup after success/refusal (#806 scope).
- Status
- Works
- Evidence and covered route
- Game
modding/implements scoped actions;native_ server.rs:549 :3739tests returned items and persistent-state restoration;:3832tests viewpoint/secondary-use setup and refusal restoration;:3980tests hook visibility. API receiver is the player service'splayer_atperform_ action_ scoped host/.players.rs:406
Assemble blocks and block entities into one movable, rotating owner (#794).
- Status
- Gap
- Evidence and covered route
- API entity Parts and handles provide no structure assembly/carrier operation; searches for
StructureRef,assemble_,structure moving_in API and Game find no implementation. Entity capability lookup above only queries existing holders; it does not transfer ownership of blocks/tickers. See the gap brief below.structure
Verified gap
Assemble two blocks, retaining block-entity contents and one ticking owner; translate/rotate, save and synchronize that owner. Main exposes no assembly operation or structure handle; ordinary entity capability providers cannot perform that ownership transfer.
- Reproducible missing call and natural receiver
- Place two machine blocks at (0,64,0)/(1,64,0). A mod needs
level.assemble_returning a proposedstructure(host, cells, pivot) StructureRef, thenstructure.set_. Neither entry point exists. Proposed API belongs ontransform(host, transform) LevelReffor assembly and the returned structure handle for motion; atomic ownership transfer must be engine-owned. - Issue/design
- Existing #794; design PR #2310, intended page
concepts/once landed. These are proposed names pending that design, not current API.moving-structures.md
Route limits
Works rows establish exactly the listed operation. Game tests use an in-process host (some set dedicated options), not a running network acceptance scene. LAN, integrated-server scheduling, actual dedicated networking and wasm execution were not verified for these rows. Item/entity lookup implementations were traced through provider dispatch; no claim is made that every provider journals correctly. API wire_resources.rs:18–30 explicitly refuses erased capabilities across link groups; this audit does not establish typed provider interoperability across all native/wasm groups. Chemical identity policy remains the provider's responsibility.
No hook count or complete-port claim follows from these results. Board searches used gh issue list -R arismoko/horizon --state all --search with energy, fake player, and moving structures; the verified carrier gap maps to #794. No issues were filed and no additional gap is inferred from untested routes.
Edit this page on GitHub · Spotted something wrong? Open an issue .