Migrating a Content Pack to 1.6.0
Every pack file shape 1.6.0 changed, in one table, each row pointing at the page that teaches it
Overview
1.6.0 changed the shape of several pack-authored file types. None of it touches your manifest, your pack id, or how packs load and merge; it is a named list of file shapes, each with a direct replacement. This page is a checklist, not a tutorial: every row links to the page that actually teaches the new shape, so nothing here is re-explained twice.
Most rows are worth doing but not urgent - the older shape still loads. Four are not, and each one costs you something in game rather than refusing to start: a contract still authoring a flat reward list (the file does not decode, so the contract is gone), a placement still spelling its gate Conditions (an unknown key, so the gate reads empty and the character always appears), an ability still gating on HeldWeaponCategory (the same, so it casts with anything in hand), and a modifier still written with Key, a CONDITIONAL wrapper or flat HP bounds (the modifier is dropped and reported). Do those first, and run /mmoconfig validate afterwards.
Two ways to check your pack
- 1
Run /mmomigrate --action=pack on your server
With your pack installed, this scans it and reports what it still carries in an older shape, without changing anything on disk. - 2
Use the web Migration Converter
Upload your pack (or point it at a folder) at the Migration Converter, entirely in your browser. Your files never leave your machine either way.
What changed, and where to read the new shape
The quest, achievement and contract rows below describe files in the shared Server/ZiggfreedCommon/ store. The older per-mod Server/MMOSkillTree/Quests/ and /Achievements/ shape, with its lower-case criteria, rewards and visibility keys, is a separate dialect and keeps loading exactly as it always did.
| What changed | Old shape | New shape | Full reference |
|---|---|---|---|
| Lucky finds in blocks | Server/MMOSkillTree/LuckLoot/*.json, plus a "LuckLoot" control key | Server/MMOSkillTree/BonusDrops/*.json, one row per file with a When block; no whole-type control key | Bonus Drops: Shipping rows in a content pack |
| Dialogue flags | SetFlag, Flag, NotFlag | Once (a one-time entry or option) plus a declared Memories block for named state | Dialogues: Once and Memories |
| Crediting a conversation | The Talk action (and its option shorthand) | MarkTalked, the one way a conversation counts as having happened | Dialogues: MarkTalked |
| Choosing which worlds a rule applies to | A named world-selector file | An inline Where block, carrying a Match pattern or a GameplayConfig key | World Rules: Choosing the worlds a rule applies to |
| A world rule's gameplay knobs | XpMultiplier, AbilitiesEnabled and friends flat at the rule's top level (the 1.5.x spelling; still honored, with one boot warning per rule) | The same six knobs inside one nested Rules block, beside the top-level Where | World Rules |
| Mastery tracks | A Name/Payload envelope with lower-case target/nodes, plus MasteryTemplates/ and the extends/params DSL | One structured PascalCase file per track (Nodes keyed by node id); reuse via an Abstract Parent base, whole families via MasteryGenerators/ | Masteries |
| Quests and achievements | Server/MMOSkillTree/Quests/ and /Achievements/, still read | Server/ZiggfreedCommon/Quests/ and /Achievements/, one file per id, Parent inheritance | Quests: The older shape (still read) |
| Conversations (optional move) | Server/MMOSkillTree/Dialogues/, still loads unchanged | Server/ZiggfreedCommon/Dialogues/<YourPack>/, folded by every reader; the same id in both folders logs a collision warning | Dialogues |
| An achievement's criteria | "Criteria": [ ... ] - a positional list | "Criteria": { "kill-entity": { ... } } - a map keyed by criterion id | Achievements: the shared fileBoth converters rewrite a list in place onto the position strings saved progress was already filed under ("0", "1", ...), so nobody starts over. Rename those to readable keys only on content nobody has started. |
| How a quest or achievement pays out | A flat "Rewards": [ ... ], an achievement's second "ClaimRewards" list, and "Flow": { "AutoClaim": ... } | One "Rewards": { "Auto": [ ... ], "Claim": [ ... ] } group. Claim is the default | Shared Schemas: the two bucketsRefreshed in place by the converter: the old list becomes Claim, an old auto-claim flag selects Auto. |
| A board contract's pay | "Rewards": [ ... ] on a Bounties/ file | "Rewards": { "Claim": [ ... ] } - the same two-bucket group | Quests: the contract fileA flat list here does not decode at all, so the contract is dropped with the file named. Wrap it in Claim (or Auto for pay that lands in the field). |
| Whether a quest or achievement is listed | A top-level "Visibility" group | Listing.Hidden and Listing.RequirePrerequisites, beside Category and SortOrder | Quests: the groups |
| An NPC placement's gate | "Requires": { "Conditions": [ ... ] } | "Requires": { "Factors": [ ... ] } | Dialogues: NPC placementsWorth doing even though nothing errors: the old key is simply unknown, so the gate reads empty and the character stands there unconditionally. Renamed in place by the converter. |
| How NPC ids are spelled | MMO_Hub, MMO_QuestGiver, MMO_Mastery_Trainer | Mmo_Hub, Mmo_QuestGiver, Mmo_Mastery_Trainer | Dialogues: IdentityRole and character lookups ignore case, so an older spelling keeps standing your NPC up. The display key does NOT: npcs.<id>.name must match the id's own spelling, so rename an id and its lang key together or not at all. Neither converter renames ids for you. |
| An ability's weapon gate | Casting.HeldWeaponCategory (a single string) | Casting.HeldWeaponCategories (an array; any one of them satisfies it) | Ability authoringNo shim reads the singular spelling: it is an unknown key, so the gate goes missing and the ability casts with anything in hand. |
| What an ability actually does | An "Effects" key in an ability file or override | "Body": the interaction chain the ability runs | Ability authoring |
| A modifier written in the older grammar | "Key", a CONDITIONAL wrapper, and flat HP bounds (selfHpMin, selfHpMax, targetHpMin, targetHpMax) | "ParamKey", a "Condition" field on the modifier itself, and the nested SelfHp / TargetHp { Min, Max } groups inside it | Masteries: the modifier grammarRe-spell these: none of the three parses any more. The shape words OVERRIDE and ADD_PARAM do still read, both as SET, so those need no edit - though SET is what to write from here. |
| A block or item marked usable | "Flags": { "IsUsable": true } | Delete the line. Hytale Update 6 dropped the flag and ignores it with one warning | Both converters REPORT this one and never rewrite it, because what a file should say instead depends on what the block is for. |
| Built-in ability files | A flat Server/MMOSkillTree/Abilities/ folder | Filed one folder per skill; ids unchanged, folders carry no meaning | Nothing to do. A pack file still overrides a built-in by id from wherever you put it. |
What did not change
Still exactly as it was
- Your pack id, your manifest, and your Control file.
- Precedence: built-in defaults, then packs, then a server owner's own overrides.
- The older quest and achievement shape under
Server/MMOSkillTree/keeps loading unchanged, and the older dialogue folder does too; moving either to the shared shape is worthwhile but never required by this upgrade. - How a pack is discovered, loaded, and merged at server start.
After you convert
- 1
Re-zip your pack
See Building the zip for the exact packaging rules, including the forward-slash entry-name caveat on Windows. - 2
Reinstall it
Drop the new zip into the server Mods/ folder in place of the old one and restart. - 3
Confirm with /mmoconfig validate
Audits your content and names anything still pointing at an old shape.
/mmomigrate --action=pack
/mmoconfig validateRelated
- Upgrading to 1.6.0 - the server-owner side of this same release: backups, the automatic owner-file folds, and the retired-file table.
- Migration Converter - convert a pack's files in your browser.
- Publishing & Translations - zipping, installing, and updating a pack.