Skip to content

Portals & apertures

Need a recipe? Use JEI in game. Need a starting route? Start here

Module: Hard Hoof: Portals (hardhoof_portals)
Operator tooling and see-through views are live; survival portal crafting is not the focus of this page.

Hard Hoof portals are linked apertures between worlds. Walk through an open doorway and the far side is already streamed, rendered, and ready -- not a loading screen with nether-portal vibes.

What a portal is

A portal endpoint is server-authoritative state: an id, a dimension, an oriented rectangular frame, an optional link to its partner, and an open flag. Clients never invent endpoints; they learn them from sync and draw a view for every visible one.

The frame is the single geometric object the module agrees on: origin corner, unit right and up, width and height in blocks. Local coordinates are (u, v, w) across the aperture; w > 0 is the front (entry) side. Linked frames share handedness, so crossing is a rotation, never a mirror. Rendering, travel, raycasts, velocity, and entity split all consume one transform: PortalTransform.between(source, destination).

Closed (open = false) endpoints still exist and can show the far side for pre-warming; nothing may cross until they are open.

Travel (what works now)

Path Behavior
Seamless cross-dimension On the client, when the interpolated eye passes an open doorway whose far world is loaded, the same local player moves into that ClientLevel. The client sends SeamlessCrossPayload; the server validates and teleports. Position, yaw, body, and velocity follow the shared transform.
Legacy / fallback Same-world doorways, riding or carrying, or a client that never received the far world still use the server's vanilla-respawn-style path after a grace window.
Interaction Raycasts and block/entity interaction can go through a portal (client and server), with foreign-outline suppression so you target the far side cleanly.

Known limits from architecture notes: seamless crossing is for a player who is not riding or carrying anything, between two different worlds. Living-model copies on non-yaw pairs stay upright (vanilla Y-only body rotation). Entity shadows are dropped rather than rotated. Moving portals and full cross-boundary collision are not shipped yet.

Gamemaster permission (/hardhoofportals, permission level for commands gamemaster). Useful entry points:

Command What it does
/hardhoofportals setup [name] Creates a void pocket dimension, places a 2x3 doorway ahead of you (clear solid floor 2-8 blocks ahead), links a matching doorway on a 17x17 stone pad at (0, 80, 0) in the pocket, and syncs everyone. Default name pocket.
/hardhoofportals portal create [width] [height] Creates an unlinked endpoint at the player (default 2x3).
/hardhoofportals portal createat / pair Place or pair endpoints by dimension, block pos, facing, optional size.
/hardhoofportals portal link <a> <b> Mutual link between two existing endpoints.
/hardhoofportals portal list / remove Inspect or delete.
/hardhoofportals list / create / adopt / info / delete / restore Runtime dimension catalog -- see Runtime dimensions.

Client-only attach under the same root (no extra permission): /hardhoofportals diag, clip on|off, preview on|off for renderer readback.

After setup: wait until the destination view appears in the doorway, walk through, turn around to return.

Views and streaming

Looking through a portal is not a screenshot. The server tickets and streams destination chunks (and entities) to viewers; the client renders a private view into the aperture. Details: Streaming views.

↑↓ move↵ openesc close