Skip to content

Hytale world output (experimental) - #1514

Merged
louis-e merged 5 commits into
mainfrom
hytale-output
Nov 13, 2026
Merged

louis-e merged 5 commits into
mainfrom
hytale-output

Conversation

@louis-e

@louis-e louis-e commented Nov 13, 2026 •

Copy link
Copy Markdown
Owner

Adds Hytale as an experimental output format, next to Luanti: --hytale on the command line, and a Hytale switch under Settings → Advanced that shows a Hytale format button and a Hytale Save Path.

What it writes

A Hytale save folder (Arnis Hytale World N) in Hytale's Saves folder:

  • Mac: ~/Library/Application Support/Hytale/UserData/Saves
  • Windows: %APPDATA%\Hytale\UserData\Saves
  • Linux: ~/.local/share/Hytale/UserData/Saves, or the Flatpak launcher's

That folder is used once the game has run there; otherwise worlds go to Desktop/Arnis Hytale Worlds.

It contains config.json, client_metadata.json and universe/worlds/default (world config plus region files).

  • The layout follows a real 0.5.6 save (Gaia Trails from CurseForge), decoded byte for byte.
    • Region files: HytaleIndexedStorage v1, 1024 slots, 4 KiB segments.
    • Each chunk is zstd-compressed BSON with the eight components the server writes.
    • Each chunk is 32×32 columns of ten 32³ sections. Sections hold string block palettes, a rotation palette and a separate fluid layer.
  • Light is stored as stale, so the server lights each section when it loads.
  • The world uses the Void generator, so the area sits in void like Bedrock and Luanti.
  • Grass tint follows the biome Arnis gives the Java chunk.
  • Spawn, game mode (Survival plays as Adventure) and time of day carry over. The spawn moves to the nearest column within 40 blocks with ground to stand on (under a tree is fine; water, lava and cacti are not), else onto the water's surface.
  • Hytale is 320 blocks tall, so the world's bounds become Y −64..255, shifted up 64 on save. The terrain fit caps there. --disable-height-limit is refused, and the ground level range is −62..240.

Blocks

src/hytale_block_map.rs maps every Arnis block by material and shape:

  • Minecraft materials become Hytale families with stairs, half blocks and walls where Hytale has them, matched by map color. Concrete becomes smooth clay, terracotta becomes clay, wool becomes cloth.
  • Stairs and slabs carry their rotation. Stair facing was measured from the staircases in the reference save.
  • Water and lava go into the fluid layer, including waterlogged blocks.
  • All 291 names it produces exist in Hytale's block list.

Stand-ins and gaps:

  • Hytale has no plain glass, so glass is Prototype_Window_Middle.
  • Lamps are Build_Lightsource_*. Buildings use the flush ceiling lamps they use on Luanti, since there is no invisible light block.
  • Doors, beds, signs, carpets, rails and most fittings are left out.

What is not available for Hytale

Refused on the CLI and greyed in the window, with a reason:

  • One World and Live
  • map preview, map item, mob spawning
  • the data pack extras and moving vehicles
  • facade photo panels, signage
  • Voxy / Distant Horizons, baked lighting
  • B_Linear, world border, min/max Y
  • extended build height

Picking Hytale also turns Advanced features (Meld) off and greys the switch, since its cells and One World build for Java. Picking another format turns them back on, and Offline Mode stays in force meanwhile.

Window

  • Hytale switch with a New badge.
  • Hytale Save Path row.
  • The format buttons now keep a divider between every pair, so two unpicked formats never merge.
  • The game mode tooltip mentions Hytale.
  • Strings in all locales.

Speed (M-series Mac, warm caches)

Area Java Hytale Bedrock
Manhattan, Venice, Munich, farmland (2–3 km²) 2.0–2.7 s 2.4–3.3 s
Munich, 26 km² 12.1 s, 1.5 GB, 416 MB 16.6 s, 3.2 GB, 143 MB 13.0 s, 3.0 GB, 153 MB

Hytale holds the world until it saves, as Bedrock does, so its peak memory matches Bedrock's rather than Java's streaming writer.

Checked

  • Generated Hamburg, Zermatt, Manhattan, Venice, Munich and farmland.
  • Every chunk decodes with no leftover bytes, palette counts match, and all block names are known.
  • uNmINeD renders the worlds correctly.
  • fmt, clippy and the full test suite pass.

@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

⏱️ Benchmark run finished in 0m 40s
🏗️ Generation time: 28s (excl. data fetching)
🧠 Peak memory usage: 1314 MB (↗ 5% more)

📈 Compared against baseline: 48s time, 1250 MB memory
🧮 Delta: -20s time, 64 MB memory
🔢 Commit: ddb6724

✅ This PR improves generation time.
⚠️ This PR increases peak memory.

📅 Last benchmark: 2026-11-13 20:48:06 UTC

You can retrigger the benchmark by commenting retrigger-benchmark.

- Advanced features come back on when another format replaces Hytale; Offline Mode stays in force while Hytale holds them off
- Bake lighting and the LOD caches are only sent while their rows are available
- Saves go to Hytale's UserData once the game has run, else to the Desktop
- Spawn search reads Hytale's cells: no spawning on water, lava, trees or cacti
- One save-error path for every format, Args::java() for the Java-only checks
- Uniform sections map once; region files are written without a second copy
- Spawn search looks under trees, and falls back to the water's surface instead of the base level
- The upper half of tall seagrass is water, not a second plant
- Unticking Hytale gives Advanced features back; a settings reset still leaves them off
- Region files stream to disk; WorldFormat::game() names the game in messages and folders
- Drop the GUI height-limit override that no flag could reach
@louis-e
louis-e merged commit 4483a57 into main Nov 13, 2026
3 checks passed
@louis-e
louis-e deleted the hytale-output branch November 13, 2026 20:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant