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 (
it→it-IT,pt→pt-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.
All 9 supported languages ship inside the mod jar, so no extra pack is needed for the bundled locales. Add a new locale with a pack that drops a single mmoskilltree.lang under Server/Languages/<bcp47>/ as shown above; the engine merges it through its I18nModule. See the in-game Localization page for the full key reference.
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 20 cape items (19 skill capes plus the Master Cape), 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.
Ability & gear-stat packs (Since 1.6.0)
A third pattern targets combat tuning instead of quest content: ship new Abilities/, an AbilityMods/ improvement a quest or shop entry grants, or items whose Armor/ Weapon block carries MMO_* StatModifiers. No plugin code is needed for any of this - see Ability authoring and Gear stats for the field references and worked examples.
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.