Skip to content

Content packs

A mod is a content pack folder (or a zip of that folder). The game discovers packs under local Mods, Steam Workshop installs, and staged upload candidates.

Required identity

Field Purpose
UniqueModName Stable prefix for all ids (modname.thing)
DisplayName Mods browser / Workshop title
Description Listing text

Author modinfo.json (Mod Prep does not accept modinfo.lua-only packs).

Typical layout

MyPack/
  modinfo.json
  item_my_sword.json
  structure_my_box.json
  Items/my_sword.lua
  worldprofile_my_world.json   # optional sandbox world type
  WorldGenerator/…             # optional world-gen details / icon
  Spawning/…                   # optional spawn groups for world profiles
  Parallax/…                   # optional sky definition for world profiles
  recipes.xml                  # optional craft recipes
  preview.png                  # optional Workshop preview (Mod Prep)

A full worked example is Example Mod (Energysabre, Shotel, Glick, Tahz, Scrap Helmet, Chickenmancer clothing, Flatlands / Moon world profiles, recipes).

Content JSON filenames must use known prefixes (item_, structure_, flora_, projectile_, worldprofile_, …) or the game will ignore them. Body armor and clothing use item_*.json with an "ArmorItem" root (equip + damage reduction + EquipmentEffects, optional LuaScriptPathArmor / self.armor). Helmet/hat use WornSpriteMalePath / WornSpriteFemalePath. Body slots use WornBonesMale / WornBonesFemale (role→PNG: neck, ribcage, stomach, pelvis, thigh, lowerLeg, boot, upperArm, forearm, glove). Padded frames pivot on the canvas center.

Sandbox world profiles

Packs can add Sandbox menu world types with worldprofile_*.json plus WorldGenerator/, Spawning/, and optional Parallax/ data. See Sandbox world profiles and Authoring world-gen details.

Inventory sprites

Set InventorySpritePath to a pack-relative PNG (for example Items/MySword/Sprites/sword.png). Optional secondary paths (ChargeBarSpritePath, GrowingSpritePath, …) are packed with it at load time. Older packs that still use InventorySpriteSheetPath + map + name continue to work. Hand-authored animation sheets stay as you packed them.

Recipes and configs

Optional root files such as recipes.xml and known config JSON names are validated by Mod Prep.

Publishing

  1. Validate with Mod Prep.
  2. Stage a WorkshopUpload/ package.
  3. In-game Mods → Upload / Update submits to Steam (Mod Prep itself does not talk to Steam).

Hot load and disable

  • Load Now merges a pack into a running single-player session when eligible.
  • Disable marks a pack off for the next launch; unloading mid-session reloads content and recreates Lua scripts.

Multiplayer does not offer Load Now for untrusted mid-session merges.