Configuration
Three configuration areas:
plugins/kginfoservs_queststrack/config.yml-- General plugin configurationplugins/kginfoservs_queststrack/quests_config.yml-- Quest texts, steps, and objectivesplugins/kginfoservs_queststrack/lang/<locale>.yml-- UI translations (menu, commands, scoreboard, console messages)
config.yml -- Complete reference
Here is the complete structure of the config.yml file with all available options.
Default category (defaultCategory)
defaultCategory: "other"
Category used for quests that do not specify questParameters.questCategory in their BetonQuest configuration. The value must match the configuration key of a category (not the displayName).
Menu categories (menuItems.categories)
Categories organize quests in the GUI menu. You can define up to 4 categories. Each category is fully customizable.
menuItems:
categories:
story:
displayName: "Story"
material: WRITABLE_BOOK
customModelData: 0
autoTrack: true
secondary:
displayName: "Secondary"
material: BOOK
customModelData: 0
autoTrack: false
dailyQuests:
displayName: "Daily"
material: CLOCK
customModelData: 0
autoTrack: false
other:
displayName: "Other"
material: BOOKSHELF
customModelData: 0
autoTrack: false
Category properties
| Property | Required | Default | Description |
|---|---|---|---|
displayName | No | Configuration key | Name displayed in the GUI menu. This is the value you use in questCategory in BetonQuest. |
material | Yes | -- | Minecraft material for the icon (e.g., WRITABLE_BOOK, CLOCK) |
customModelData | No | 0 | Custom model data for resource packs |
autoTrack | No | false | If true, quests in this category are automatically added to the scoreboard tracking when activated |
The value of questCategory in BetonQuest must match exactly the displayName of the category (case-sensitive and accent-sensitive).
Example: if your category has displayName: "Daily", your quests must have questCategory: "Daily" (not "daily" or "DAILY").
If no displayName is defined, the configuration key is used (e.g., dailyQuests).
Subcategories
Each category can have subcategories for finer organization:
menuItems:
categories:
dailyQuests:
displayName: "Daily"
material: CLOCK
customModelData: 0
autoTrack: false
subcategories:
monsters:
displayName: "Monsters"
material: ZOMBIE_HEAD
farming:
displayName: "Farming"
material: NETHERITE_HOE
mining:
displayName: "Mining"
material: NETHERITE_PICKAXE
To place a quest in a subcategory, use the hierarchical format with a dot in BetonQuest:
# In the BetonQuest quest package.yml
questParameters:
questCategory: "Daily.Monsters"
The format is: category_displayName.subcategory_displayName
Menu navigation
- The player opens
/quests - Selects the "Daily" category
- Sees the subcategories (Monsters, Farming, Mining)
- Selects a subcategory
- Sees the quests in that subcategory
Each subcategory automatically displays a progress bar indicating the percentage of completed quests.
Menu buttons
menuItems:
toggleCompleted:
visible:
material: LIME_DYE
customModelData: 0
hidden:
material: GRAY_DYE
customModelData: 0
nextPage:
material: PAPER
customModelData: 0
prevPage:
material: PAPER
customModelData: 0
closeButton:
material: BARRIER
customModelData: 0
| Button | Description |
|---|---|
toggleCompleted.visible | Icon when completed quests are visible |
toggleCompleted.hidden | Icon when completed quests are hidden |
nextPage | Next page button |
prevPage | Previous page button |
closeButton | Close menu button |
Language files (lang/)
All UI translations (menu labels, command messages, scoreboard text, console output) are stored in per-locale YAML files under plugins/kginfoservs_queststrack/lang/.
The active language is determined by the language setting in your BetonQuest config.yml (server-wide).
Built-in locales
The plugin ships with 5 built-in locale files, generated automatically on first startup:
| File | Language |
|---|---|
lang/fr-FR.yml | French |
lang/en-US.yml | English |
lang/de-DE.yml | German |
lang/pt-BR.yml | Brazilian Portuguese |
lang/pl-PL.yml | Polish |
Key categories
Each lang file is organized into the following sections:
| Prefix | Description |
|---|---|
command.* | Messages displayed by plugin commands (/quests, /kgquests, etc.) |
tracking.* | Tracking-related messages (auto-track, manual track/untrack) |
menu.* | All GUI menu labels: header, quest statuses, buttons, lore format |
scoreboard.* | Scoreboard title, separator, and fallback text |
console.* | Console/log messages (startup, reload, errors) |
Example excerpt (en-US.yml)
command:
reload_success: "Configuration reloaded successfully."
no_permission: "You do not have permission to use this command."
tracking:
auto_track: "Now tracking: {quest}"
untrack: "Stopped tracking: {quest}"
menu:
header: "Quests"
header_other: "Quests - {player}"
quest_active: "Active"
quest_finished: "Finished"
quest_locked: "Locked"
completed_quests_visible: "Completed Quests: Visible"
completed_quests_hidden: "Completed Quests: Hidden"
close_button: "Close"
rewards_title: "Rewards:"
lore_format:
objective_prefix: "<#55C4FF>> </#55C4FF><gray>"
separator: "<dark_gray><st> </st></dark_gray>"
reward_prefix: "<green>+</green> <white>"
status_prefix: "<gray>Status: </gray>"
scoreboard:
title: "<gradient:#800080:#D33D22>Quest Tracker</gradient>"
separator: "<gradient:#800080:#D33D22>--------------</gradient>"
console:
plugin_enabled: "QuestsTracker enabled."
All values under menu.* support MiniMessage format. Examples:
<gold>Gold text</gold><#55C4FF>Hex color</#55C4FF><gradient:#800080:#D33D22>Gradient</gradient><b>Bold</b>,<st>Strikethrough</st>,<i>Italic</i>
Adding a new language
- Copy an existing file, e.g.
lang/en-US.yml, and rename it to your locale code (e.g.lang/es-ES.yml). - Translate every value in the file.
- Set
language: es-ESin your BetonQuestconfig.yml. - Run
/questsreloadto apply.
The plugin will automatically pick up any .yml file in the lang/ folder whose name matches the configured BetonQuest language.
Scoreboard
The scoreboard displays in real time the objectives of the quests tracked by the player.
scoreboard:
enabled: true
title: "<gradient:#800080:#D33D22>◈KGInfoServs Quests◈</gradient>"
separator: "<gradient:#800080:#D33D22>--------------</gradient>"
| Property | Default | Description |
|---|---|---|
enabled | true | Enables/disables the scoreboard globally for all players. If false, no scoreboard is created. |
title | Purple-red gradient | Scoreboard title (MiniMessage format) |
separator | Purple-red gradient | Separator between quests in the scoreboard (MiniMessage format) |
When scoreboard.enabled: false, no resources are used for the scoreboard (no ticks, no network packets, no cache memory). This is the recommended approach if you use an external scoreboard plugin like TAB.
The scoreboard generates no ticks. It only updates when an event occurs (quest activation, progression, step change). Even when enabled, it has virtually no impact on performance.
PlaceholderAPI
placeholders:
enabled: true
| Property | Default | Description |
|---|---|---|
enabled | true | Enables/disables %kgquetes_*% placeholders |
Disable if you are not using PlaceholderAPI to reduce Redis/DB calls.
Available placeholders
Prefix: %kgquetes_
| Placeholder | Description |
|---|---|
%kgquetes_title% | Title of the currently tracked quest |
%kgquetes_objective_1% | First objective line of the tracked quest |
%kgquetes_objective_2% | Second objective line |
%kgquetes_objective_N% | Nth objective line |
Database connection pool (database)
database:
pool:
maxSize: 30
minIdle: 5
connectionTimeoutMs: 10000
idleTimeoutMs: 300000
| Property | Default | Description |
|---|---|---|
maxSize | 30 | Maximum number of connections in the pool |
minIdle | 5 | Minimum number of idle connections maintained |
connectionTimeoutMs | 10000 | Maximum time (ms) to wait for a connection from the pool |
idleTimeoutMs | 300000 | Maximum time (ms) a connection can remain idle before being closed |
- ~100 players: default values (
maxSize: 30) - 500+ players: increase
maxSizeto 50 - 1000+ players: increase
maxSizeto 80-100
Automatic updates (updater)
updater:
auto-download: false
| Property | Default | Description |
|---|---|---|
auto-download | false | If true, automatically downloads new versions to plugins/update/. The JAR will be applied on the next server restart. |
The update check is performed automatically at startup. If a new version is available, a message is displayed in the console and administrators are notified upon login.
You can also force a check with /kgquests update.
Redis
redis:
enabled: true
host: "127.0.0.1"
port: 6379
password: ""
| Property | Default | Description |
|---|---|---|
enabled | true | Enables/disables Redis synchronization |
host | "127.0.0.1" | Redis server address |
port | 6379 | Redis server port |
password | "" | Redis password (empty if none) |
See Multi-server for detailed configuration.
quests_config.yml -- Quest texts and steps
This file defines the text content, steps, and objectives for each quest displayed in the menu and scoreboard.
Multilingual support
All text fields (title, locked_description, finished_text, step texts, inprogress/completed for objectives) support two formats:
Simple format (single language):
title: "<gold>The Lost Treasure</gold>"
Multilingual format (BetonQuest style):
title:
fr-FR: "<gold>Le Tresor Perdu</gold>"
en-US: "<gold>The Lost Treasure</gold>"
The language is read from the BetonQuest configuration (language: en-US in BetonQuest's config.yml).
The fallback order is: configured language -> first available language -> raw default value.
The legacy format (plain text without locale keys) remains fully functional. You can migrate your quests to the multilingual format progressively.
Quest structure
quests:
my_quest:
title:
fr-FR: "<gold>Le Tresor Perdu</gold>"
en-US: "<gold>The Lost Treasure</gold>"
locked_description:
fr-FR: "Trouvez l'indice pour debloquer cette quete."
en-US: "Find the clue to unlock this quest."
finished_text:
fr-FR: "Felicitations ! Vous avez trouve le tresor !"
en-US: "Congratulations! You found the treasure!"
steps:
'1':
text:
fr-FR:
- "Parlez au marchand du village"
- "Achetez une carte au tresor"
en-US:
- "Talk to the village merchant"
- "Buy a treasure map"
'2':
text:
fr-FR:
- "Suivez la carte jusqu'a la foret"
- "Trouvez l'entree de la grotte"
en-US:
- "Follow the map to the forest"
- "Find the cave entrance"
Key reference
| Key | Required | Description |
|---|---|---|
title | Yes | Quest title (supports MiniMessage, multilingual) |
locked_description | No | Text displayed when the quest is locked (multilingual) |
finished_text | No | Text displayed when the quest is completed (multilingual, supports | for multiline) |
steps | Yes | Quest steps with objectives |
Step format (steps)
Steps are numbered starting from 1. Three formats are available:
Simple format (text list)
steps:
'1':
- "Talk to the merchant"
- "Buy a map"
Format with text section (multilingual)
steps:
'1':
text:
fr-FR:
- "Parlez au marchand"
- "Achetez une carte"
en-US:
- "Talk to the merchant"
- "Buy a map"
The text section also accepts a plain list (without locale keys):
text:
- "Talk to the merchant"
- "Buy a map"
Format with trackable objectives
This format allows tracking individual progress for each objective:
steps:
'1':
text:
fr-FR:
- "Parlez au marchand"
en-US:
- "Talk to the merchant"
objectives:
- id: "kill_zombies"
inprogress:
fr-FR: "Tuer des zombies (%betonquest_my_quest:objective.kill_zombies.amount%/10)"
en-US: "Kill zombies (%betonquest_my_quest:objective.kill_zombies.amount%/10)"
completed:
fr-FR: "Tuer <green>10/10 Zombies <white>✔"
en-US: "Kill <green>10/10 Zombies <white>✔"
- id: "collect_wood"
inprogress:
fr-FR: "Collecter du bois (%betonquest_my_quest:objective.collect_wood.amount%/20)"
en-US: "Collect wood (%betonquest_my_quest:objective.collect_wood.amount%/20)"
completed:
fr-FR: "Collecter <green>20/20 Bois <white>✔"
en-US: "Collect <green>20/20 Wood <white>✔"
| Property | Description |
|---|---|
id | Objective identifier (must match the BetonQuest objective) |
inprogress | Text displayed when the objective is in progress (multilingual, supports BetonQuest placeholders) |
completed | Text displayed when the objective is completed (multilingual) |
Use BetonQuest placeholders to display real-time progress:
%betonquest_PACKAGE:objective.ID.amount%-- Current progress%betonquest_PACKAGE:objective.ID.absoluteamount%-- Total required%betonquest_PACKAGE:constant.KEY%-- Quest constants
Example: Kill zombies (3/10) updates automatically.
Complete example
quests:
story_chapter1:
title:
fr-FR: "<gold>Le Reveil du Heros</gold>"
en-US: "<gold>The Hero's Awakening</gold>"
locked_description:
fr-FR: "Commencez votre aventure en parlant au guide."
en-US: "Start your adventure by talking to the guide."
finished_text:
fr-FR: |
Vous avez fait vos premiers pas !
Continuez votre aventure.
en-US: |
You took your first steps!
Continue your adventure.
steps:
'1':
text:
fr-FR:
- "Parlez au guide du village"
- "Acceptez la quete"
en-US:
- "Talk to the village guide"
- "Accept the quest"
'2':
text:
fr-FR:
- "Visitez la forge"
en-US:
- "Visit the forge"
objectives:
- id: "visit_forge"
inprogress:
fr-FR: "Se rendre a la forge"
en-US: "Go to the forge"
completed:
fr-FR: "<green>- Forge visitee <white>✔"
en-US: "<green>- Forge visited <white>✔"
- id: "get_sword"
inprogress:
fr-FR: "Obtenir une epee"
en-US: "Get a sword"
completed:
fr-FR: "<green>- Epee obtenue <white>✔"
en-US: "<green>- Sword obtained <white>✔"
'3':
objectives:
- id: "kill_dummies"
inprogress:
fr-FR: "Battre des mannequins (%betonquest_story_chapter1:objective.kill_dummies.amount%/3)"
en-US: "Beat training dummies (%betonquest_story_chapter1:objective.kill_dummies.amount%/3)"
completed:
fr-FR: "Beat <green>3/3 Dummies <white>✔"
en-US: "Beat <green>3/3 Dummies <white>✔"
daily_mining:
title:
fr-FR: "<aqua>Collecte Quotidienne</aqua>"
en-US: "<aqua>Daily Collection</aqua>"
locked_description:
fr-FR: "Disponible chaque jour."
en-US: "Available every day."
finished_text:
fr-FR: "Beau travail, mineur !"
en-US: "Good work, miner!"
steps:
'1':
objectives:
- id: "mine_iron"
inprogress:
fr-FR: "Miner du fer (%betonquest_daily_mining:objective.mine_iron.amount%/32)"
en-US: "Mine iron (%betonquest_daily_mining:objective.mine_iron.amount%/32)"
completed:
fr-FR: "Miner <green>32/32 Fer <white>✔"
en-US: "Mine <green>32/32 Iron <white>✔"
- id: "mine_gold"
inprogress:
fr-FR: "Miner de l'or (%betonquest_daily_mining:objective.mine_gold.amount%/16)"
en-US: "Mine gold (%betonquest_daily_mining:objective.mine_gold.amount%/16)"
completed:
fr-FR: "Miner <green>16/16 Or <white>✔"
en-US: "Mine <green>16/16 Gold <white>✔"
Applying changes
- Edit
config.yml,quests_config.yml, or anylang/*.ymlfile - Run
/questsreload - Verify in-game
See also
- BetonQuest Integration -- Configure events and tags
- Commands -- Reload commands
- Multi-server -- Redis configuration