Publishing & Translations

Ship your pack: translations, zip-building, cosmetic and integration packs, and security

Translation packs

Translations are not an MMO Skill Tree custom content type. They use Hytale's native .lang format under Server/Languages/<bcp47>/, which the engine discovers and merges via its I18nModule without any MMO-specific asset code. A pack ships one mmoskilltree.langfile per locale:

MyTranslationPack.zip
├── manifest.json
└── Server/
    └── Languages/
        ├── es-ES/mmoskilltree.lang
        └── ko-KR/mmoskilltree.lang

.lang format is plain key = value text (UTF-8, no BOM, # for comments). Placeholders like {0} are kept verbatim from the English string.

# Server/Languages/it-IT/mmoskilltree.lang
ui.settings.title = Impostazioni
ui.viewxp.total_level = Livello Totale
ui.viewxp.level_prefix = Lv. {0}

The filename gotcha

Hytale's loader prepends the filename (minus .lang) as a dot-separated prefix to every key in the file. MMO Skill Tree looks up keys under the mmoskilltree. prefix, so the file must be named mmoskilltree.lang for the keys to line up. Don't split a locale across sibling files (ui.lang + skills.lang) — each file gets a different prefix and breaks the lookup.

Rules & fallback

  • Empty values are rejected. key = with nothing after aborts the whole file — omit the key entirely instead, and it falls back to English.
  • Fallback chain: admin override → pack/JAR translations → in-code English defaults. Missing keys never show a raw key to players.
  • Locale codes: the player's ISO code maps to a BCP 47 folder (itit-IT, ptpt-BR, etc.).

Zip gotcha: the loader only sees Server/Languages/ if the zip contains explicit directory entries, not just files. PowerShell's Compress-Archive omits them and the pack is silently skipped — use the [IO.Compression.ZipFile] script below, which writes directory entries.

Contribute a language by forking the open-source MMO Skill Translations Pack (ships Spanish, French, German, Italian, Portuguese, Russian, Hungarian, Turkish). See the in-game Localization page for how players pick a language.

Building the zip

Hytale's asset loader silently drops zip entries that use backslash separators (the default from PowerShell's Compress-Archive on Windows). Build with the lower-level zip API using forward-slashrelative paths, and exclude top-level docs:

$pack = 'C:\path\to\MyMmoPack'
$zipPath = "$pack\MyMmoPack.zip"
Remove-Item $zipPath -ErrorAction SilentlyContinue
Add-Type -A 'System.IO.Compression.FileSystem'
$zip = [IO.Compression.ZipFile]::Open($zipPath, 'Create')
$files = Get-ChildItem -Path $pack -Recurse -File | Where-Object {
    $_.Name -notin 'MyMmoPack.zip','README.md','CLAUDE.md'
}
foreach ($f in $files) {
    $rel = $f.FullName.Substring($pack.Length + 1).Replace('\','/')
    $entry = $zip.CreateEntry($rel, [IO.Compression.CompressionLevel]::Optimal)
    $stream = $entry.Open()
    $bytes = [IO.File]::ReadAllBytes($f.FullName)
    $stream.Write($bytes, 0, $bytes.Length)
    $stream.Close()
}
$zip.Dispose()

Cosmetic / asset-only packs

Not every pack touches MMO content. The Capes Pack is a pure Hytale asset pack — it ships the 20 mastery cape items, a custom rarity, models, textures, and per-locale names, with no gameplay logic. Grant such items through command rewards, the admin give command, or your own logic.

Coexistence: if a cosmetic pack's items are also bundled by the mod, don't install both — duplicate item ids produce warnings at server start.

Feature-gated integration packs

The Taming Pack is the pattern for content that depends on another mod: every quest, achievement, and XP map is gated with requiresFeatures: ["taming"], so the entire pack stays hidden unless the companion mod is installed. A pack cannot ship a new skill (skills are code-backed) — it ships the content that hangs off one. See feature gating.

Installing & updating

Packs are discovered at server start. To add, update, or remove a pack, change the mods directory and restart the server. An in-game pack-management view shows which packs are loaded and how many entries each contributes per type.

Keeping a pack in sync with the mod

A pack and the mod co-evolve. If a content type's structure changes (a new field, a new reward type referenced by your entries), re-emit the affected JSON and confirm against the version you target. Structural changes bump the relevant config SCHEMA_VERSION in the mod; additive content does not.

Security

Command rewards, quests, and achievements may run arbitrary console commands (the COMMAND reward type, achievement announcementCommand). Review packs from untrusted sources before installing them — a malicious pack could grant items, change permissions, or run any other console operation. The mod does not strip commands from packs; firing admin commands is the legitimate use case for the content type.