Skip to main content

Configuration

Three main files/folders:

  • plugins/KGInfoServs-QuestsTrack/config.yml — General plugin configuration
  • plugins/KGInfoServs-QuestsTrack/quests_config.yml — Quest texts, steps and objectives
  • plugins/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.

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​

PropertyRequiredDefaultDescription
displayNameNoconfigKeyName displayed in the GUI menu. Supports simple or multilingual format (see below).
materialYes—Minecraft material for the icon (e.g. WRITABLE_BOOK, CLOCK)
customModelDataNo0Custom model data for the resource pack
autoTrackNofalseIf 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 questCategory on 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.

Migrating from an earlier version

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: story
  • questCategory: "Daily" → questCategory: dailyQuests
  • questCategory: "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

Legacy format

Before this version, the format was displayName.displayName (e.g. Daily.Monsters). You must now use the configKey values (e.g. dailyQuests.monsters).

  1. The player opens /quests
  2. Selects the "Daily" category
  3. Sees the subcategories (Monsters, Farming, Mining)
  4. Selects a subcategory
  5. Sees the quests in that subcategory

Each subcategory automatically displays a progress bar showing the percentage of completed quests.

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
ButtonDescription
toggleCompleted.visibleIcon when completed quests are visible
toggleCompleted.hiddenIcon when completed quests are hidden
nextPageNext page button
prevPagePrevious page button
closeButtonClose 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:

FileLanguage
lang/fr-FR.ymlFrench
lang/en-US.ymlEnglish
lang/de-DE.ymlGerman
lang/pt-BR.ymlPortuguese (Brazil)
lang/pl-PL.ymlPolish

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.

Automatic refresh

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:

FileField
config.ymlmenuItems.categories.<key>.displayName
config.ymlmenuItems.categories.<key>.subcategories.<key>.displayName
quests_config.ymltitle, locked_description, finished_text
quests_config.ymlSteps: 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:

PrefixDescription
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​

  1. Copy an existing file (for example lang/en-US.yml)
  2. Rename it with the desired locale code (for example lang/es-ES.yml)
  3. Translate all the values in the file
  4. In the BetonQuest configuration, set language: es-ES
  5. Reload the plugin with /questsreload
MiniMessage format

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>"
PropertyDefaultDescription
enabledtrueEnables/disables the scoreboard globally for all players. If false, no scoreboard is created.
titlePurple-red gradientScoreboard title (MiniMessage format)
separatorPurple-red gradientSeparator between quests on the scoreboard (MiniMessage format)
Performance

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.

Event-driven scoreboard

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
PropertyDefaultDescription
enabledtrueEnables/disables the %kgquetes_*% placeholders

Disable this if you do not use PlaceholderAPI, to reduce Redis/database calls.

Available placeholders​

Prefix: %kgquetes_

PlaceholderDescription
%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
PropertyDefaultDescription
maxSize30Maximum number of connections in the HikariCP pool
minIdle5Minimum number of idle connections maintained
connectionTimeoutMs10000Maximum wait time to obtain a connection (10s)
idleTimeoutMs300000Closes idle connections after 5 minutes
Sizing based on player count
  • ~100 players: default values (maxSize: 30)
  • 500+ players: increase maxSize to 50
  • 1000+ players: increase maxSize to 80-100

Automatic update (updater)​

updater:
auto-download: false
PropertyDefaultDescription
auto-downloadfalseIf 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: ""
PropertyDefaultDescription
enabledtrueEnables/disables Redis synchronization
host"127.0.0.1"Redis server address
port6379Redis 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.

Backward compatibility

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​

KeyRequiredDescription
titleYesQuest title (supports MiniMessage, multilingual)
locked_descriptionNoText displayed when the quest is locked (multilingual)
finished_textNoText displayed when the quest is completed (multilingual, supports | for multiline)
stepsYesQuest 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"
Simple text format

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>✔"
PropertyDescription
idObjective identifier (must match the BetonQuest objective)
inprogressText displayed while the objective is in progress (multilingual, supports placeholders)
completedText displayed when the objective is completed (multilingual)
BetonQuest placeholders in objectives

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​

  1. Edit config.yml, quests_config.yml or the files in lang/
  2. Run /questsreload
  3. Verify in game

See also​