Pack format
my_campaign/├── pack.mcmeta Minecraft's resource pack file├── pack.json The campaign manifest├── pack.png Icon in Minecraft's pack list├── assets/│ └── my_campaign/│ ├── lang/en_us.json Translations│ └── textures/campaign/ Card art├── server_assets/│ ├── games/ Game assets, one per mission│ ├── maps/ Map assets│ └── templates/ Effect templates└── missions/ └── my_mission/ ├── mission.lua The script that runs first ├── spatial.json Triggers, markers, actors and more ├── sequences/ Recorded actor performances └── world/ The Minecraft worldScripts can be split into several Lua files in the mission folder. See include.
pack.mcmeta
Section titled “pack.mcmeta”A normal resource pack file. Minecraft 1.21.1 uses format 34.
{ "pack": { "pack_format": 34, "description": "My Campaign" }}pack.json
Section titled “pack.json”{ "id": "my_campaign", "name": "My Campaign", "author": "Your Name", "description": "What the campaign is about.", "version": "1.0.0", "apiVersion": 1, "modrinthProject": "", "missions": [ { "id": "my_mission", "name": "My Mission", "description": "What happens in this mission." } ]}| Field | Required | Description |
|---|---|---|
id |
Yes | Unique id, safe to use as a namespace. Used for saves and addressing missions. |
name |
Yes | Display name. |
nameKey |
No | Translation key for the name. |
author |
No | Author line. |
description |
No | Shown on the campaign’s card. |
descriptionKey |
No | Translation key for the description. |
version |
No | Pack version, shown to players. Defaults to 1.0. |
minModVersion |
No | The oldest BlockFront version that can load the pack. |
apiVersion |
No | The Lua API version your scripts target. Defaults to 1. |
modrinthProject |
No | Modrinth project id or slug, once published. |
icon |
No | Resource location of the card art. |
missions |
No | The missions, in play order. |
Mission fields
Section titled “Mission fields”| Field | Required | Description |
|---|---|---|
id |
Yes | The folder name under missions/. |
name |
Yes | Display name. |
nameKey |
No | Translation key for the name. |
description |
No | Short text for the mission card. |
descriptionKey |
No | Translation key for the description. |
alwaysUnlocked |
No | Playable without finishing earlier missions. Defaults to false. |
game |
No | The game asset hosting the mission. Defaults to camp_<id>. |
icon |
No | Resource location of the mission’s card art. |
Card art
Section titled “Card art”By default the game looks for these two files:
assets/<pack id>/textures/campaign/campaign.pngfor the campaignassets/<pack id>/textures/campaign/<mission id>.pngfor each mission
Translations
Section titled “Translations”Put your text in assets/<pack id>/lang/en_us.json and refer to it with nameKey, descriptionKey and tr() in scripts. Plain text is the fallback, so translation is optional.
Game assets
Section titled “Game assets”Each mission needs a game asset in server_assets/games/, named camp_<mission id>.json unless the mission sets game. It ties the mission to its map:
{ "gameName": "camp_my_mission", "mapName": "MyMap", "inRotation": false, "gameModeData": { "gameType": "camp", "mission": "my_mission", "environment": "night" }}A real asset also holds the lobby position and team spawns. Copying one from Pathfinder is the quickest way to get these right. The Assets section covers every field.
server_assets/ is shared by every mission in the pack, so missions can use the same maps and templates.
Folder or zip
Section titled “Folder or zip”A pack can be a folder or a zip, and the difference matters:
- A folder is for editing. Commands are enabled in its worlds, and the
/missiontools can save to it. - A zip is for release. It’s read-only.
Keep your pack as a folder while you work, and zip it to publish, with pack.json at the root of the zip.
