Configuration
Configuration
Section titled “Configuration”The Quest System is configured through config.json in the root of your quest data folder. This file controls reset schedules, economy, streaks, the HUD tracker, anti-exploit settings and more.
After editing config.json, run /ksquestadmin reload in-game to apply changes without restarting the server.
Full Config Structure
Section titled “Full Config Structure”Below is the complete config.json with all available fields and their default values:
{ "_config_version": 5, "language": "en-US", "timezone": "Europe/Berlin", "dailyResetTime": "04:00", "weeklyResetDay": "MONDAY", "dailyQuestCount": 3, "weeklyQuestCount": 5, "saveIntervalSeconds": 300, "debug": false, "useCustomContent": true, "loadDefaultQuests": true, "loadDefaultStoryQuests": true, "loadDefaultDailyPool": true, "loadDefaultWeeklyPool": true, "loadDefaultChapters": true,
"streak": { ... }, "questItem": { ... }, "questTracker": { ... }, "notifications": { ... }, "economy": { ... }, "tierSystem": { ... }, "reroll": { ... }, "placedBlockTracker": { ... }, "proximityToast": { ... }}General Settings
Section titled “General Settings”| Field | Type | Default | Description |
|---|---|---|---|
language | string | "en-US" | UI and localization language. Supported: en-US, de-DE |
timezone | string | "Europe/Berlin" | Timezone for reset calculations (Java ZoneId format) |
dailyResetTime | string | "04:00" | Time when daily quests rotate (24h format, e.g. "04:00") |
weeklyResetDay | string | "MONDAY" | Day when weekly quests rotate (e.g. MONDAY, FRIDAY) |
dailyQuestCount | int | 3 | Number of daily quests assigned to each player |
weeklyQuestCount | int | 5 | Number of weekly quests assigned to each player |
saveIntervalSeconds | int | 300 | Auto-save interval for player data in seconds |
debug | bool | false | Enable verbose debug logging to console |
useCustomContent | bool | true | Load content from the custom/ folder |
loadDefaultQuests | bool | true | Load base quests from quests.json. Set false to only use custom quests |
loadDefaultStoryQuests | bool | true | Load base story quests from story_quests.json. Set false to only use custom story quests |
loadDefaultDailyPool | bool | true | Load base daily quest pool from daily_pool.json. Set false to only use custom pool |
loadDefaultWeeklyPool | bool | true | Load base weekly quest pool from weekly_pool.json. Set false to only use custom pool |
loadDefaultChapters | bool | true | Load base chapters from chapters.json. Set false to only use custom chapters |
Streak System
Section titled “Streak System”The streak system rewards players for completing at least one quest per day. It uses a cumulative model with a grace period to avoid punishing missed days.
"streak": { "enabled": true, "cumulative": true, "gracePeriodDays": 7, "gracePeriodWindow": 14, "milestones": [ { "days": 7, "lootbagId": "streak_reward_7", "tier": "bronze" }, { "days": 14, "lootbagId": "streak_reward_14", "tier": "silver" }, { "days": 21, "lootbagId": "streak_reward_21", "tier": "gold" }, { "days": 28, "lootbagId": "streak_reward_28", "tier": "platinum" } ]}| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | true | Enable/disable the streak system |
cumulative | bool | true | Anti-FOMO mode: days don’t need to be consecutive |
gracePeriodDays | int | 7 | Required active days within the window |
gracePeriodWindow | int | 14 | Rolling window in days (e.g. 7 days out of 14) |
milestones | array | 4 tiers | Milestone rewards at specific day counts |
Each milestone grants a loot bag reward when the player reaches the specified day count.
Quest Item
Section titled “Quest Item”Controls the physical Quest Book item given to players.
"questItem": { "enabled": true, "itemId": "QuestBook", "hotbarSlot": 8, "giveOnJoin": true, "giveDelay": 500}| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | true | Give players a quest book item |
itemId | string | "QuestBook" | The item ID to use |
hotbarSlot | int | 8 | Hotbar slot (0-8) to place the item |
giveOnJoin | bool | true | Automatically give item when player joins |
giveDelay | int | 500 | Delay in ms before giving the item after join |
Quest Tracker (HUD)
Section titled “Quest Tracker (HUD)”Controls the on-screen HUD that displays tracked quest progress.
"questTracker": { "enabled": true, "maxDisplayedQuests": 5, "maxDisplayedObjectives": 5, "showOnJoin": true, "position": "right", "maxTrackedQuests": 5, "autoUntrackCompleted": true, "defaultPositionPreset": "top_right", "defaultShowEmptyState": true}| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | true | Enable the HUD tracker |
maxDisplayedQuests | int | 5 | Max quests shown on the HUD at once |
maxDisplayedObjectives | int | 5 | Max objectives shown per quest |
showOnJoin | bool | true | Show tracker automatically when player joins |
position | string | "right" | HUD side: "left" or "right" |
maxTrackedQuests | int | 5 | Max quests a player can track simultaneously |
autoUntrackCompleted | bool | true | Auto-remove completed quests from tracker |
defaultPositionPreset | string | "top_right" | Default position for new players. Options: top_left, top_right, middle_left, middle_right, bottom_left, bottom_right |
defaultShowEmptyState | bool | true | Show the HUD even when no quests are tracked |
Notifications
Section titled “Notifications”"notifications": { "enabled": true, "showProgress": true, "progressThreshold": 25, "broadcastCompletion": false}| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | true | Enable quest notifications |
showProgress | bool | true | Show progress milestones (25%, 50%, 75%) |
progressThreshold | int | 25 | Percentage interval for progress notifications |
broadcastCompletion | bool | false | Broadcast quest completions to all players |
Economy
Section titled “Economy”Controls quest economy, currency display, reroll costs, and token earnings.
"economy": { "provider": "auto", "primaryCurrency": "quest_tokens", "alternativeCurrency": "gold", "rewardCurrency": "quest_tokens", "tokenExchangeRate": 100, "rerollCostTokens": 5, "rerollCostGold": 200, "tokenEarnings": { "dailyQuestComplete": 1, "allDailiesBonus": 2, "weeklyQuestComplete": 5, "streakBronze": 5, "streakSilver": 10, "streakGold": 15, "streakPlatinum": 20 }}| Field | Type | Default | Description |
|---|---|---|---|
provider | string | "auto" | Economy provider. auto detects VaultUnlocked → EliteEssentials. Options: auto, vaultunlocked, eliteessentials, internal, command |
primaryCurrency | string | "quest_tokens" | Primary currency identifier |
alternativeCurrency | string | "gold" | Alternative currency identifier (used for gold rerolls) |
rewardCurrency | string | "quest_tokens" | Currency used for quest rewards. Set to "economy" to grant external currency (e.g. Gold) instead of tokens. Token amounts are converted via tokenExchangeRate |
tokenExchangeRate | int | 100 | Conversion rate: 1 Quest Token = X Gold. Only used when rewardCurrency = "economy" |
rerollCostTokens | int | 5 | Token cost per quest reroll. Set to 0 to disable token rerolls |
rerollCostGold | int | 200 | Gold cost per quest reroll. Set to 0 to disable gold rerolls. Requires external economy |
tokenEarnings.dailyQuestComplete | int | 1 | Tokens earned per daily quest completed |
tokenEarnings.allDailiesBonus | int | 2 | Bonus tokens for completing ALL daily quests |
tokenEarnings.weeklyQuestComplete | int | 5 | Tokens earned per weekly quest completed |
Tier System
Section titled “Tier System”The tier system assigns rarity tiers to daily/weekly quests. Higher tiers have harder objectives but better rewards.
"tierSystem": { "enabled": true, "tiers": [ { "id": "common", "difficulty": "easy", "color": "#A0A0A0", "multiplier": 1.0, "weight": 50, "name": { "en": "Common", "de": "Gewoehnlich" } }, { "id": "rare", "difficulty": "medium", "color": "#4169E1", "multiplier": 2.0, "weight": 30, "name": { "en": "Rare", "de": "Selten" } }, { "id": "epic", "difficulty": "hard", "color": "#9932CC", "multiplier": 3.0, "weight": 15, "name": { "en": "Epic", "de": "Episch" } }, { "id": "legendary", "difficulty": "legendary", "color": "#FFD700", "multiplier": 5.0, "weight": 5, "name": { "en": "Legendary", "de": "Legendaer" } } ]}| Field | Type | Description |
|---|---|---|
id | string | Unique tier identifier (referenced in quest definitions) |
difficulty | string | Difficulty label |
color | string | Hex color code for UI display |
multiplier | float | Reward multiplier for this tier |
weight | int | Selection weight (higher = more likely to appear) |
name | object | Localized display name |
Reroll System
Section titled “Reroll System”Allows players to re-roll their daily quests.
"reroll": { "enabled": true, "freeRerollsPerDay": 1, "paidRerollCost": 10, "maxPaidRerollsPerDay": 5, "allowRerollStarted": false}| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | true | Enable quest rerolling |
freeRerollsPerDay | int | 1 | Free rerolls per day |
paidRerollCost | int | 10 | Quest token cost for a paid reroll (doubles each time) |
maxPaidRerollsPerDay | int | 5 | Maximum paid rerolls per day |
allowRerollStarted | bool | false | Allow rerolling quests that have progress |
Paid reroll costs double with each use: 10 -> 20 -> 40 -> 80 -> 160. This prevents abuse while still giving players flexibility.
:::tip Per-Quest Reroll Limit
Individual quests can set their own reroll limit via options.maxRerolls in the quest definition. This overrides the global maxPaidRerollsPerDay setting for that specific quest. Default per-quest limit is 1.
:::
Placed Block Tracker (Anti-Exploit)
Section titled “Placed Block Tracker (Anti-Exploit)”Prevents players from gaining quest progress by placing and breaking their own blocks.
"placedBlockTracker": { "enabled": true, "expiryMinutes": 30}| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | true | Enable the anti-exploit tracker |
expiryMinutes | int | 30 | After this time, placed blocks count as natural again |
Proximity Toast
Section titled “Proximity Toast”Shows an NPC toast notification on the HUD when a player approaches a quest NPC.
"proximityToast": { "enabled": true, "range": 20, "cooldown": 300, "durationMs": 0}| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | true | Enable proximity toast notifications |
range | int | 20 | Detection radius in blocks |
cooldown | int | 300 | Seconds between proximity toasts per NPC per player |
durationMs | int | 0 | Display duration. 0 = stays while in range, >0 = auto-hide after N ms |