Configuration
Three main files/folders:
plugins/KGInfoServs-QuestsTrack/config.yml— General plugin configurationplugins/KGInfoServs-QuestsTrack/quests_config.yml— Quest texts, steps and objectivesplugins/KGInfoServs-QuestsTrack/lang/<locale>.yml— Interface translation files
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 YAML key of a category (configKey), not its displayName.
Menu categories (menuItems.categories)
Categories organize quests in the GUI menu. You can define up to 4 categories. Each category is fully customizable and its displayName can be multilingual.
menuItems:
categories:
story: # configKey — used for matching with questCategory
displayName: # Multilingual format (recommended)
fr-FR: "Histoire"
en-US: "Story"
material: WRITABLE_BOOK
customModelData: 0
autoTrack: true
secondary:
displayName:
fr-FR: "Secondaires"
en-US: "Secondary"
material: BOOK
customModelData: 0
autoTrack: false
dailyQuests:
displayName:
fr-FR: "Journalieres"
en-US: "Daily"
material: CLOCK
customModelData: 0
autoTrack: false
other:
displayName: "Other" # Simple format — always supported
material: BOOKSHELF
customModelData: 0
autoTrack: false
Properties of a category
| Property | Required | Default | Description |
|---|---|---|---|
displayName | No | configKey | Name displayed in the GUI menu. Supports simple or multilingual format (see below). |
material | Yes | — | Minecraft material for the icon (e.g. WRITABLE_BOOK, CLOCK) |
customModelData | No | 0 | Custom model data for the resource pack |
autoTrack | No | false | If true, quests in this category are automatically added to scoreboard tracking when activated |
configKey vs displayName
The configKey (the YAML key, e.g. story) is the category's stable identifier:
- This is what you use in
questCategoryon the BetonQuest side (questCategory: story) - It is also used to index quests internally and identify the category in the code
The displayName is used only for display in the GUI menu. You can change it (or translate it) without breaking matching with your BetonQuest packages.
Before this version, questCategory had to match the displayName (e.g. questCategory: "Story"). It must now match the configKey (e.g. questCategory: story).
If you are updating from an older version, you must edit your BetonQuest package.yml files:
questCategory: "Story"→questCategory: storyquestCategory: "Daily"→questCategory: dailyQuestsquestCategory: "Other"→questCategory: other
Without this migration, all your quests will fall back to the default category.
Multilingual displayName
The displayName field accepts two formats:
Simple format — a single language (legacy format, always supported):
displayName: "Story"
Multilingual format — one text per language:
displayName:
fr-FR: "Histoire"
en-US: "Story"
de-DE: "Geschichte"
The displayed language is chosen based on the player opening the menu (see Language per player).
Subcategories
Each category can have subcategories for finer organization:
menuItems:
categories:
dailyQuests:
displayName:
fr-FR: "Journalieres"
en-US: "Daily"
material: CLOCK
customModelData: 0
autoTrack: false
subcategories:
monsters: # configKey of the subcategory
displayName:
fr-FR: "Monstres"
en-US: "Monsters"
material: ZOMBIE_HEAD
farming:
displayName:
fr-FR: "Agriculture"
en-US: "Farming"
material: NETHERITE_HOE
mining:
displayName: "Mining" # Simple format also accepted
material: NETHERITE_PICKAXE
To place a quest in a subcategory, use the hierarchical dotted format in BetonQuest, using the configKey values:
# In the BetonQuest quest's package.yml
questParameters:
questCategory: dailyQuests.monsters
The format is: configKey_category.configKey_subcategory
Before this version, the format was displayName.displayName (e.g. Daily.Monsters). You must now use the configKey values (e.g. dailyQuests.monsters).
Navigating the menu
- 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 showing 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/)
Interface translations (menus, commands, scoreboard, tracking messages, console logs) are managed through individual language files located in:
plugins/KGInfoServs-QuestsTrack/lang/<locale>.yml
Built-in locales
The plugin includes 5 languages by default:
| File | Language |
|---|---|
lang/fr-FR.yml | French |
lang/en-US.yml | English |
lang/de-DE.yml | German |
lang/pt-BR.yml | Portuguese (Brazil) |
lang/pl-PL.yml | Polish |
Language selection
QuestsTracker resolves the language per player, relying on BetonQuest's native system.
Language per player
Each player can choose their own language with the BetonQuest command /questlang:
/questlang fr-FR
/questlang en-US
/ql de-DE
BetonQuest persists this choice in PlayerData. QuestsTracker reads this value every time a menu is opened, the scoreboard is updated, or the log is refreshed.
When a player runs /questlang, the plugin detects the command and immediately refreshes:
- The player's scoreboard (with the newly translated texts)
- The open quest menu (if they have one)
No other action is needed — everything switches to the new language instantly.
Default language (fallback)
If a player has never run /questlang, the plugin uses the server's global language:
# In plugins/BetonQuest/config.yml
language: fr-FR
If the corresponding language file does not exist in lang/, the plugin uses the first available file.
Fields supporting multilingual content
The following fields automatically support the multilingual format:
| File | Field |
|---|---|
config.yml | menuItems.categories.<key>.displayName |
config.yml | menuItems.categories.<key>.subcategories.<key>.displayName |
quests_config.yml | title, locked_description, finished_text |
quests_config.yml | Steps: text, inprogress / completed objectives |
package.yml (BetonQuest) | questParameters.questReward |
All of these fields accept either a simple string or a {lang-code: text} map.
Key categories
Each language file contains the following categories:
| Prefix | Description |
|---|---|
command.* | Command messages (/quests, /kgquests, etc.) |
tracking.* | Messages related to quest tracking (add, remove, limits) |
menu.* | GUI interface texts (titles, statuses, buttons, lore format) |
scoreboard.* | Scoreboard texts (title, separator, empty/disabled messages) |
console.* | Startup and console log messages |
Adding a new language
- Copy an existing file (for example
lang/en-US.yml) - Rename it with the desired locale code (for example
lang/es-ES.yml) - Translate all the values in the file
- In the BetonQuest configuration, set
language: es-ES - Reload the plugin with
/questsreload
The menu.* keys support the MiniMessage format. Examples:
<gold>Golden text</gold><#55C4FF>Hex color</#55C4FF><gradient:#800080:#D33D22>Gradient</gradient><b>Bold</b>,<st>Strikethrough</st>,<i>Italic</i>
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 on the scoreboard (MiniMessage format) |
When scoreboard.enabled: false, no resources are used for the scoreboard (no ticks, no network packets, no cached memory). This is the recommended approach if you use an external scoreboard plugin like TAB.
The scoreboard generates no ticks. It updates only when an event occurs (quest activation, progress, step change). Even when enabled, it has virtually no impact on performance.
PlaceholderAPI
placeholders:
enabled: true
| Property | Default | Description |
|---|---|---|
enabled | true | Enables/disables the %kgquetes_*% placeholders |
Disable this if you do not use PlaceholderAPI, to reduce Redis/database 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 HikariCP pool |
minIdle | 5 | Minimum number of idle connections maintained |
connectionTimeoutMs | 10000 | Maximum wait time to obtain a connection (10s) |
idleTimeoutMs | 300000 | Closes idle connections after 5 minutes |
- ~100 players: default values (maxSize: 30)
- 500+ players: increase
maxSizeto 50 - 1000+ players: increase
maxSizeto 80-100
Automatic update (updater)
updater:
auto-download: false
| Property | Default | Description |
|---|---|---|
auto-download | false | If true, automatically downloads new versions into plugins/update/. The JAR will be applied on the next server restart. |
The update check runs automatically on startup. If a new version is available, a message is displayed in the console and administrators are notified when they connect.
You can also force the 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 the 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, objectives' inprogress/completed) support two formats:
Simple format (a 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: fr-FR in BetonQuest's config.yml).
The fallback order is: configured language → first available language → default value.
The legacy format (simple text without language keys) remains fully functional. You can migrate your quests to the multilingual format progressively.
Structure of a quest
quests:
ma_quete:
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 possible:
Simple format (list of texts)
steps:
'1':
- "Talk to the merchant"
- "Buy a map"
Format with a 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 simple list (without language keys):
text:
- "Talk to the merchant"
- "Buy a map"
Format with trackable objectives
This format allows tracking the individual progress of 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_ma_quete:objective.kill_zombies.amount%/10)"
en-US: "Kill zombies (%betonquest_ma_quete: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_ma_quete:objective.collect_wood.amount%/20)"
en-US: "Collect wood (%betonquest_ma_quete: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 while the objective is in progress (multilingual, supports 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:
histoire_chapitre1:
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_histoire_chapitre1:objective.kill_dummies.amount%/3)"
en-US: "Beat training dummies (%betonquest_histoire_chapitre1:objective.kill_dummies.amount%/3)"
completed:
fr-FR: "Battre <green>3/3 Mannequins <white>✔"
en-US: "Beat <green>3/3 Dummies <white>✔"
daily_minerai:
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_minerai:objective.mine_iron.amount%/32)"
en-US: "Mine iron (%betonquest_daily_minerai: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_minerai:objective.mine_gold.amount%/16)"
en-US: "Mine gold (%betonquest_daily_minerai: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.ymlor the files inlang/ - Run
/questsreload - Verify in game
See also
- BetonQuest Integration — Configure events and tags
- Commands — Reload commands
- Multi-server — Redis configuration