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. 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. 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 changedOld shapeNew shapeFull reference
Lucky finds in blocksServer/MMOSkillTree/LuckLoot/*.json, plus a "LuckLoot" control keyServer/MMOSkillTree/BonusDrops/*.json, one row per file with a When block; no whole-type control keyBonus Drops: Shipping rows in a content pack
Dialogue flagsSetFlag, Flag, NotFlagOnce (a one-time entry or option) plus a declared Memories block for named stateDialogues: Once and Memories
Crediting a conversationThe Talk action (and its option shorthand)MarkTalked, the one way a conversation counts as having happenedDialogues: MarkTalked
Choosing which worlds a rule applies toA named world-selector fileAn inline Where block, carrying a Match pattern or a GameplayConfig keyWorld Rules: Choosing the worlds a rule applies to
A world rule's gameplay knobsXpMultiplier, 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 WhereWorld Rules
Mastery tracksA Name/Payload envelope with lower-case target/nodes, plus MasteryTemplates/ and the extends/params DSLOne structured PascalCase file per track (Nodes keyed by node id); reuse via an Abstract Parent base, whole families via MasteryGenerators/Masteries
Quests and achievementsServer/MMOSkillTree/Quests/ and /Achievements/, still readServer/ZiggfreedCommon/Quests/ and /Achievements/, one file per id, Parent inheritanceQuests: The older shape (still read)
Conversations (optional move)Server/MMOSkillTree/Dialogues/, still loads unchangedServer/ZiggfreedCommon/Dialogues/<YourPack>/, folded by every reader; the same id in both folders logs a collision warningDialogues
An achievement's criteria"Criteria": [ ... ] - a positional list"Criteria": { "kill-entity": { ... } } - a map keyed by criterion idAchievements: 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 outA flat "Rewards": [ ... ], an achievement's second "ClaimRewards" list, and "Flow": { "AutoClaim": ... }One "Rewards": { "Auto": [ ... ], "Claim": [ ... ] } group. Claim is the defaultShared 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 groupQuests: 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 listedA top-level "Visibility" groupListing.Hidden and Listing.RequirePrerequisites, beside Category and SortOrderQuests: 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 spelledMMO_Hub, MMO_QuestGiver, MMO_Mastery_TrainerMmo_Hub, Mmo_QuestGiver, Mmo_Mastery_TrainerDialogues: 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 gateCasting.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 doesAn "Effects" key in an ability file or override"Body": the interaction chain the ability runsAbility 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 itMasteries: 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 warningBoth 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 filesA flat Server/MMOSkillTree/Abilities/ folderFiled one folder per skill; ids unchanged, folders carry no meaningNothing 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. 1

    Re-zip your pack

    See Building the zip for the exact packaging rules, including the forward-slash entry-name caveat on Windows.
  2. 2

    Reinstall it

    Drop the new zip into the server Mods/ folder in place of the old one and restart.
  3. 3

    Confirm with /mmoconfig validate

    Audits your content and names anything still pointing at an old shape.
Checking a pack from the server console
/mmomigrate --action=pack
/mmoconfig validate