Two Clients, One Server
Top window is Luanti 5.13.0-dev. Bottom is Minecraft 1.21.4. Both are joined to the same vanilla Minecraft server, looking at each other.
MineLuanti is a fork of the Luanti (Minetest) client that speaks
the Minecraft Java Edition protocol — 1.21.4, protocol 769. Luanti's engine below MapBlock
never touches a socket: map storage, mesh generation, ClientMap culling and the Irrlicht
renderer are handed an IGameDef* and nothing else. So the fork leaves all of that unchanged
and replaces only the layer above it — src/mcnet/ for framing, VarInt, NBT and the protocol
state machine, src/mcworld/ for chunk transcoding and block state → MapNode, and
src/mccontent/ for locally registered nodes and items in place of the nodedef a Luanti
server would normally send. Both engines use 16×16×16 chunk sections, Y-up axes and 4-bit
light nibbles, which is why chunk data and lighting transcode almost directly.
What the shot shows working: chunks streaming into Luanti MapBlocks carrying Minecraft's own
lighting, biome tint on grass and leaves, entities with nametags — the sheep, cows, zombies and
creepers labelled around the frame — health and hunger HUD, hotbar, and player skins on both
sides. Movement is reconciled against the server using Minecraft's own constants (4.317 m/s
walk, 32 m/s² gravity, 0.42 blocks/tick jump) reported at 20 Hz, so there is no rubber-banding
and nothing trips anti-cheat.
None of Mojang's assets are redistributed. The 2464 nodes, 27866 block states and 1962 textures are generated from your own 1.21.4 jar, and the build refuses to configure until that has run.