MMO Mob Scaling: Files and Packs

Its files, its commands, and what a content pack needs

MMO Mob Scaling is a separate companion mod (see Add-ons). It makes open-world mobs tougher the deeper the zone, the farther from spawn and the stronger the players nearby, and some spawn Rare, Epic or Legendary with affixes. This page is for server owners and pack authors: where its files are, how they layer, and what a pack has to do to change it. Players need none of it.

Where the files live

Every file is created under mods/MmoMobScaling/, inside the folder your server runs from, not next to the jar. They appear on the first start. Every start the log prints their full paths: search it for [MobScalingConfig] config:.

PathWhat it is
mods/MmoMobScaling/mob-scaling.jsonYour settings. It starts empty, so every setting keeps its default. Add only the keys you change.
mods/MmoMobScaling/_reference/defaults-mob-scaling.jsonEvery setting at its default, rewritten on every start so it matches the version you run. Copy keys from it into mob-scaling.json. Editing it does nothing.
mods/MmoMobScaling/worlds/One file per world rule. Starts empty, with a README.txt.
mods/MmoMobScaling/difficulty/One file per zone or biome floor you retune. Starts empty, with a README.txt.
mods/MmoMobScaling/casters/One file per spell-casting roster you switch on, switch off or add. Starts empty, with a README.txt.

In the three folders the file name is the id, in any case: Zone2.json and zone2.json are the same file. A file named after one the mod ships changes that one, and deleting yours brings the shipped one back.

Hand edits are read at the next restart. What you change in /mobscaling ui, or with /mobscaling preset or /mobscaling hud, is saved to these files and applies at once. Switching the whole mod on or off always takes a restart.

Settings and presets

mob-scaling.json takes the same keys as the reference file: Enabled (the whole mod), ActivePreset, RaritySpawnChance, Difficulty (the floor, the caps, the distance escalation and the curve that turns difficulty into health and damage), OpenWorld (how the power of nearby players counts), and the two cards, ZoneHud and InspectorHud. A group you fill in part of keeps its defaults for the rest.

Four presets ship: Default, Casual, Hardcore and Playtest. A preset only sets what it changes, and your own keys sit on top of it. Switch with /mobscaling preset --presetName=Hardcore, which saves ActivePreset for you.

mods/MmoMobScaling/mob-scaling.json
{
  "ActivePreset": "Casual",
  "Difficulty": { "DistanceEscalation": { "Enabled": false } }
}

Zone and biome floors

A floor is the difficulty a spawn starts from in a zone or biome, before distance from spawn and the players nearby add to it. The mod ships its floors one file each, under Server/MmoMobScaling/Difficulty/ in its jar. A zone's floor also covers its sub-zones unless one has a floor of its own.

To retune one, save a file named after it in difficulty/ holding just the Floor. It keeps the shipped target. A file with a new name is a new floor and needs all three keys: TargetType (Zone or Biome), TargetId (the game's own zone or biome name, or * for every one without a floor of its own) and Floor. The Floors tab of /mobscaling ui edits the same files.

mods/MmoMobScaling/difficulty/Zone2.json
{ "Floor": 60.0 }

One file per world

A file in worlds/ changes how scaling works in the worlds it names. Where picks them: Match takes world names (exact, Prefix*, *Suffix, *Contains*, or * for every world), GameplayConfig takes a world's config key (the one steady handle on an instance world, whose name changes every time), Placement takes NPC placement ids and matches wherever those placements may stand (CommonLib 2.5.0, the same Where every family mod reads), and ExcludeMatch drops worlds the others matched. When two rules match a world, the more specific one wins.

mods/MmoMobScaling/worlds/arena.json
{
  "Where": { "Match": ["Arena*"] },
  "Enabled": true,
  "Difficulty": { "Floor": 45.0 }
}
  • A rule can set Enabled (false turns scaling off there), RaritySpawnChance, Difficulty, OpenWorld, where the two cards sit or whether they show, and a Pool that allows or denies rarities, variants and affixes in that world.
  • "Parent": "<another file's id>" takes every key that file sets. Anything still unset falls back to mob-scaling.json. A file with no Where never matches a world itself and is only there to be a parent.
  • A file named after a shipped rule replaces that rule outright.
  • Four rules ship: scaling is off in Dungeon of Fear I and II and in Kweebec Nightmare's worlds, and Dungeon of Fear III scales without the distance escalation.
  • /mobscaling worlds lists every rule loaded, where it came from and whether it is on.

Mobs that cast spells

A caster roster gives a mob real MMO Skill Tree abilities to cast on its own schedule. One example ships, switched off: with it on, the Ember Dragon casts Fireball and an ice ball and dodges now and then. Turn it on with this file in casters/:

mods/MmoMobScaling/casters/demo_boss_caster.json
{ "Enabled": true }
  • A content pack can switch it on too: copy Demo_Boss_Caster.json out of the mod's jar (a jar is a zip) into the pack at the same path, Server/MmoMobScaling/CasterRosters/, and set "Enabled": true. Your copy replaces the shipped one, as long as the pack declares the dependency.
  • A file in casters/ named after a shipped roster changes only the keys it writes. An Abilities list you write replaces the shipped one whole.
  • "Enabled": false switches any roster off. A mob it would have armed falls to any other roster that matches it.
  • A file with a new name is a new roster and needs a Role (Id for one mob, Glob for a family) and its Abilities.

Content packs

A pack can add or replace presets, rarities, affixes, variants, floors, world rules and caster rosters under Server/MmoMobScaling/ (Settings/, Rarities/, Affixes/, Variants/, Difficulty/, Worlds/, CasterRosters/), replace its drop tables under Server/Drops/MmoMobScaling/, and override the two NPC groups below. The mod's own files load first, then packs, then your files in mods/MmoMobScaling/. Rarities, affixes and variants change only through a pack.

Declare the dependency, or nothing in your pack applies

A pack that changes anything here must list the mod in its manifest.json. Without it, Hytale loads your pack before the mod, the mod's defaults load on top, and every change in your pack is lost with no error.
manifest.json
{
  "Group": "YourName",
  "Name": "YourPack",
  "Version": "1.0.0",
  "ServerVersion": ">=0.7.0-pre.0 <0.8.0",
  "IncludesAssetPack": true,
  "Dependencies": { "Ziggfreed:MmoMobScaling": ">=1.1.0" }
}
  • The id is exactly Ziggfreed:MmoMobScaling, capitals included. A misspelt id stops the server loading any assets at all (see Troubleshooting).
  • manifest.json sits at the root of the zip, with no folder around it, or the pack is skipped.
  • While the mod is switched off in mob-scaling.json it loads none of its content, so a pack's Server/MmoMobScaling/ files are ignored too.
  • Every start, the log names each pack whose changes are being lost, with the line to add, and confirms the ones that load correctly. It also names any rarity, variant, affix or caster roster that points at an effect, drop table, NPC group, role or interaction that does not exist. These are warnings and never stop the server.

Bosses and excluded mobs

Two NPC groups decide which mobs are bosses and which are left alone. Both are Hytale's own group files.

  • Server/NPC/Groups/Mmoscaling_Bosses.json lists the world's roaming bosses. Every mob in it spawns at the Boss tier. It ships with Dragon_Fire, Dragon_Frost, Scarak_Broodmother and Dungeon_Scarak_Broodmother.
  • Server/NPC/Groups/Mmoscaling_Excluded.json ships empty. A mob in it is never scaled: no rarity, no affixes, no extra health, and any scaling left on it from before is removed when it loads.

To change either, ship a file of the same name in a content pack (with the dependency above):

  • Your file replaces the mod's IncludeRoles list whole. It does not add to it, so copy the shipped list first if you want to keep it.
  • Entries are role ids (the file names under Server/NPC/Roles/), never the names players see. Wildcards work: Trork* covers every Trork role.
  • A role id that does not exist is skipped with a warning in the log, never an error.
  • A boss from one of Hytale's scripted fights, such as the Feastmaster, is left alone whether it is listed or not. The fight sets its health. The one exception is a fight whose binding row lets a companion mod scale its boss (see Bosses that grow with their fight).
Server/NPC/Groups/Mmoscaling_Excluded.json (in your pack)
{
  "IncludeRoles": [ "Trork*" ]
}

Bosses that grow with their fight

A boss fight's binding row (a file under Server/ZiggfreedCommon/Encounters/) can let a companion mod scale its boss with Scale.Companion. Both switches are off unless written:

Server/ZiggfreedCommon/Encounters/Hallows_Eve_Headless_Horseman_Encounter.json (Seasons of Orbis, an excerpt)
"Scale": {
  "Companion": { "Health": true, "Damage": true }
}
  • With the row allowing it, MMO Mob Scaling scales the boss once, as the fight begins, with the same level his adds read where he stands. Health grows his health bar and Damage his own hits.
  • At the floor of the spot he stands on he is exactly what his role and his fight make him, and he grows only as a stronger group lifts the level. No rarity, affix, aura, spell kit or rename comes with it, and his kill XP and loot stay as they are.
  • The level is read once per fight. A wipe resets the fight, and the next one reads it again. A boss reloaded in the middle of a fight keeps the scale it took.
  • Seasons of Orbis's Headless Horseman is written this way on both rides, so a stronger group meets a tougher Horseman. Without MMO Mob Scaling, the switches do nothing.

Leave the row's own health growth off

The game adds two health multipliers together instead of multiplying them, so a row that grows the boss with its own Scale terms (HealthPerMember, HealthMultiplier, HealthPerPowerPoint) beside Companion.Health counts both in full. /zigencounter validate warns ENCOUNTER_COMPANION_HEALTH_STACKS. Let the fight's script add the party's steps instead, as the Horseman's does. A mod that spawns such a boss from code gives the spawn no health multiplier of its own, for the same reason.

Commands

/mobscaling needs the game's hytale:Admin group. The subcommand comes first, and any value after it goes by name, such as --presetName=Casual.

SubcommandWhat it does
uiOpens the settings page: Global, Zone HUD, Inspector, Worlds and Floors, with a live preview of how tough a skeleton gets.
inspectReports the difficulty where you stand and what goes into it.
preset [--presetName=<name>]Names the preset in use, or switches to another and saves it.
hud --hudTarget=<zone|inspector> --hudValue=<on|off|position>Shows, hides or moves a card for every player, and saves it. --hudOffsetX and --hudOffsetY nudge it.
worldsLists every world rule loaded.
purgeStrips scaling off loaded mobs. See Uninstalling.

Troubleshooting

The server stops with "Missing default DamageCause assets"

No asset pack loaded at all, because a pack's dependency id is wrong. Scroll up in the log to Missing required dependencies, which names the pack, and fix the id in its manifest.json. A wrong id inside a rarity or affix file never causes this: it only logs a warning.

A pack's changes do nothing

Check the start-up log for the pack line described in Content packs. The usual causes are a missing Ziggfreed:MmoMobScaling dependency, a manifest.json that is not at the root of the zip, or the mod switched off.

I cannot find the files

They are in mods/MmoMobScaling/ under the folder the server runs from. Search the log for [MobScalingConfig] config: to get the full path.

Uninstalling

While the mod is installed and switched on, it keeps saved mobs in step with your settings. Once it is gone it cannot, so before you remove the jar run /mobscaling purge from the server console. It strips scaling off every loaded mob in every world, and works even with the mod switched off. Run as a player, it sweeps only your world.