Skip to content

Custom Content

The quest system uses a Base+Custom architecture that separates default content from your modifications. This means your custom quests, chapters and pool entries survive mod updates without any manual merging.

When the server starts, the quest system loads content in two phases:

  1. Base files from configs/ — these are maintained by the mod and get updated automatically
  2. Custom files from custom/ — these are yours and are never overwritten

The merge process combines both sets. If a custom quest has the same ID as a base quest, the custom version wins.

configs/kyuubisoft_questbook/
configs/ <-- Base content (auto-updated by the mod)
quests.json
story_quests.json
chapters.json
daily_pool.json
weekly_pool.json
custom/ <-- Your content (never touched by updates)
custom_quests.json
custom_story_quests.json
custom_chapters.json
custom_daily_pool.json
custom_weekly_pool.json
my_event_pack.json <-- Additional files auto-loaded

Every custom file follows the same pattern with three fields:

custom/custom_quests.json
{
"_info": "Admin-created/modified quests. This file is NOT overwritten on mod updates.",
"disabled_base_ids": ["daily_mine_stone", "daily_harvest"],
"quests": [
{
"id": "my_custom_quest",
"type": "side",
"category": "exploration",
"name": { "en-US": "Lost Temple", "de-DE": "Verlorener Tempel" },
"objectives": [
{ "id": "find_temple", "type": "zone_entered", "targets": ["Forgotten_Temple"], "count": 1 }
],
"rewards": [
{ "type": "quest_tokens", "amount": 5 }
]
}
]
}

This is the key mechanism for hiding default quests you do not want on your server. Instead of deleting them from the base file (which would get restored on the next update), you list their IDs here:

{
"disabled_base_ids": [
"daily_mine_stone",
"daily_kill_mobs",
"weekly_master_miner"
],
"quests": []
}

The listed IDs are removed from the quest list during the merge phase. This works for all content types: quests, story quests, chapters, and pool entries.

Any .json file placed in the custom/ folder that does not start with custom_ is automatically loaded as additional content. This is how Quest Packs work on the server side.

The system:

  • Scans custom/ for .json files
  • Skips files starting with custom_ (already handled by the standard merge)
  • Skips .example files
  • Loads quests and chapters from each file
  • Processes files alphabetically (last file wins on duplicate IDs)

On first start, the mod extracts .example template files into custom/ for quests, story quests, chapters, daily pool, weekly pool and the token shop. To use one, rename it by removing the .example extension and edit its contents.

Adding a quest — Rename custom_quests.json.example to custom_quests.json, add your quest to the "quests" array, then run /ksquestadmin reload.

Disabling a default quest — Open custom/custom_quests.json, add the quest ID to "disabled_base_ids", then reload.

Adding to the daily pool — Create custom/custom_daily_pool.json with entries like { "quest_id": "my_daily", "weight": 1 } in the "pool" array.

When the mod updates, this is what happens:

LocationBehavior
configs/*.jsonBacked up and replaced if version is newer
custom/custom_*.jsonNever touched
custom/*.json (additional)Never touched
config.jsonOnly created if missing, never overwritten

Backups of replaced base files are saved as filename.json.backup-v{N} so you can always compare changes.

The version-aware extraction uses the _config_version field in base files. If the version in your configs/ folder is lower than the version shipped with the mod, the old file is backed up and replaced.

CommandDescription
/ksquestadmin reloadReloads all config files (base + custom)
/ksquestadmin export allFull backup export of all quest data
/ksquestadmin export quest <id>Export a single quest as JSON
/ksquestadmin debugShows your active quests, progress, and facts