> For the complete documentation index, see [llms.txt](https://esmp-fun.gitbook.io/plugins/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://esmp-fun.gitbook.io/plugins/better-trial-chambers/configuration/messages.yml.md).

# messages.yml

Want your plugin to match your server's vibe? The `messages.yml` file lets you customize every single message players see. Whether you're running a serious roleplay server or a meme-filled chaos realm, you've got full control.

{% hint style="info" %}
**Location:** `plugins/BetterTrialChambers/messages.yml`

After making changes, reload with `/trial reload`
{% endhint %}

{% hint style="info" %}
**Translating the admin GUI?** As of v1.3.0 every name, lore line, and button label across all 18 admin GUI views also lives here, under a nested `gui.*` section (\~330 keys). For the GUI-specific translation conventions — section layout, shared toggle templates, the `gui.common.*` reuse pattern — see the [Localization](/plugins/better-trial-chambers/configuration/localization.md) guide.
{% endhint %}

{% hint style="info" %}
**New in 1.7.1:** every remaining admin-command message moved into `messages.yml` — new key families `dungeon-*`, `container-*`, `claims-*`, `debug-*`, `reset-*` (confirmation queue), `snapshot-all-*` / `snapshot-missing-*`, `loot-audit-*`, `list-*`, and shared `pagination-*` keys, plus new `help-*` entries and `time-ago`. Older `messages.yml` files keep working — the startup schema check lists any keys your file is missing, and leftover keys from removed messages are harmless.
{% endhint %}

***

## Text formatting — MiniMessage and legacy `&` codes

**Added in v1.4.0.** BTC now supports the modern [MiniMessage](https://docs.advntr.dev/minimessage/format.html) syntax in every message — alongside the original `&` colour codes. You can use either format, or freely mix both in the same line.

{% hint style="success" %}
**Existing `messages.yml` files keep working unchanged.** Migrating an entry to MiniMessage is opt-in, line by line. Use whichever feels more natural — the parser handles both transparently.
{% endhint %}

### Legacy `&` codes (still supported)

```yaml
&0 - Black          &8 - Dark Gray
&1 - Dark Blue      &9 - Blue
&2 - Dark Green     &a - Green
&3 - Dark Aqua      &b - Aqua
&4 - Dark Red       &c - Red
&5 - Dark Purple    &d - Light Purple
&6 - Gold           &e - Yellow
&7 - Gray           &f - White
&l - Bold           &o - Italic
&n - Underline      &m - Strikethrough
&k - Magic          &r - Reset
&#FF5500 - Hex colour (any 6-digit code)
```

### MiniMessage tags

```yaml
<black>          <dark_gray>      <bold>            <italic>
<dark_blue>      <blue>           <underlined>      <strikethrough>
<dark_green>     <green>          <obfuscated>      <reset>
<dark_aqua>      <aqua>           <#FF5500>          (any hex)
<dark_red>       <red>
<dark_purple>    <light_purple>
<gold>           <yellow>
<gray>           <white>
```

Plus features that **`&` codes can't do** (these need MiniMessage):

```yaml
# Gradients
"<gradient:#ff0000:#00ff00>Sunset to ocean</gradient>"

# Clickable text — runs a command when clicked
"<click:run_command:'/trial menu'><yellow>[Open Menu]</yellow></click>"

# Hover tooltips — show extra text on hover
"<hover:show_text:'Bonus loot table active!'><gold>★</gold></hover>"

# Custom fonts (resource-pack supplied)
"<font:my_font:fancy>Stylised text</font>"
```

### Mixed examples

Both formats work on the same line:

```yaml
"&6&lBOLD GOLD TEXT"                           # legacy
"<gold><bold>BOLD GOLD TEXT</bold></gold>"     # MiniMessage
"&aHello <gradient:#ff0000:#0000ff>world</gradient>"   # mixed
"&#FF5500Custom hex"                           # legacy hex
"<#FF5500>Custom hex"                          # MM hex
```

{% hint style="info" %}
**Where MiniMessage shines:** GUI item names and lore, boss bars, and chat messages all support **full MiniMessage fidelity** in v1.4.0+ — gradients, click events, and hover tooltips render correctly everywhere.
{% endhint %}

{% hint style="success" %}
**Pro tip:** Use `&r` (or `<reset>`) to clear formatting before placeholders, so player names and chamber names don't inherit the previous colour. Example: `"&aWelcome &r&e{player}!"` resets to default before the yellow name.
{% endhint %}

***

## Message Categories

<details>

<summary><strong>General Messages</strong></summary>

```yaml
prefix: "&8[&6TCP&8]&r "
reload-success: "&aConfiguration reloaded successfully!"
no-permission: "&cYou don't have permission to use this command."
player-only: "&cThis command can only be used by players."
unknown-command: "&cUnknown subcommand. Use /trial help for help."
```

#### `prefix`

Prepended to most messages. Keep it short!

**Examples:**

* Minimalist: `"&8[&6TCP&8] "`
* Fancy: `"&8[&6 &eTrialChamber&6 &8] "`
* Roleplay: `"&7[&5Ancient Chamber&7] "`
* No prefix: `""` (empty string)

</details>

<details>

<summary><strong>Chamber Management</strong></summary>

```yaml
chamber-created: "&aChamber &e{chamber}&a created successfully!"
chamber-not-found: "&cChamber &e{chamber}&c not found."
chamber-deleted: "&aChamber &e{chamber}&a deleted successfully."
chamber-list-item: "&e{chamber} &7- &f{world} &7({volume} blocks)"
chamber-list-empty: "&cNo chambers registered yet."
no-selection: "&cYou must make a WorldEdit selection first."
worldedit-not-found: "&cWorldEdit is not installed or enabled."
```

**Placeholders:**

* `{chamber}` - Chamber name
* `{world}` - World name
* `{volume}` - Total blocks in chamber

**Customization ideas:**

Minimalist:

```yaml
chamber-created: "&a✓ Created {chamber}"
chamber-deleted: "&c✗ Deleted {chamber}"
```

Fancy:

```yaml
chamber-created: "&8[&a✓&8] &fChamber &6{chamber} &fhas been &aregistered&f!"
```

Roleplay:

```yaml
chamber-created: "&7The ancient chamber &e{chamber}&7 has been awakened..."
chamber-deleted: "&7The chamber &e{chamber}&7 fades from memory..."
```

</details>

<details>

<summary><strong>Scanning</strong></summary>

```yaml
scan-started: "&aScanning chamber &e{chamber}&a..."
scan-complete: "&aScanning complete! Found &e{vaults}&a vaults, &e{spawners}&a spawners, &e{pots}&a decorated pots."
```

**Placeholders:**

* `{chamber}` - Chamber name
* `{vaults}` - Number of vaults found
* `{spawners}` - Number of trial spawners found
* `{pots}` - Number of decorated pots found
* `{error}` - Error message (on failure)

**Examples:**

Tech-style:

```yaml
scan-started: "&7[SYSTEM] Initiating scan of &f{chamber}&7..."
scan-complete: "&a[SCAN COMPLETE] &7Detected: &f{vaults}x Vaults, {spawners}x Spawners, {pots}x Pots"
```

Adventure-style:

```yaml
scan-started: "&7Exploring the depths of &e{chamber}&7..."
scan-complete: "&aYou've mapped the chamber! Discovered &e{vaults} vaults&a, &e{spawners} monster cages&a, and &e{pots} ancient pots&a!"
```

</details>

<details>

<summary><strong>Snapshots</strong></summary>

```yaml
snapshot-creating: "&aCreating snapshot for &e{chamber}&a..."
snapshot-created: "&aSnapshot created successfully! (&e{blocks}&a blocks, &e{size}&a)"
snapshot-restoring: "&aRestoring chamber &e{chamber}&a from snapshot..."
snapshot-restored: "&aChamber restored successfully!"
snapshot-failed: "&cSnapshot operation failed: {error}"
```

**Placeholders:**

* `{chamber}` - Chamber name
* `{blocks}` - Block count
* `{size}` - File size (e.g., "1.2 MB")
* `{error}` - Error message

**Examples:**

Loading bar vibes:

```yaml
snapshot-creating: "&7[&e▰▰▰▱▱▱&7] Creating snapshot of &f{chamber}&7..."
snapshot-created: "&7[&a▰▰▰▰▰▰&7] &aSnapshot saved! &7({blocks} blocks, {size})"
```

Immersive:

```yaml
snapshot-creating: "&7Capturing the essence of &e{chamber}&7..."
snapshot-created: "&aThe chamber's memory has been preserved. &7({blocks} blocks)"
```

</details>

<details>

<summary><strong>Chamber Resets</strong></summary>

```yaml
chamber-reset-warning: "&eWarning: &7{chamber} will reset in &6{time}&7!"
chamber-reset-complete: "&aThe chamber has been reset!"
chamber-resetting: "&aResetting chamber &e{chamber}&a..."
reset-success: "&aChamber &e{chamber}&a reset successfully!"
reset-failed: "&cFailed to reset chamber: {error}"
```

**Placeholders:**

* `{chamber}` - Chamber name
* `{time}` - Time remaining (e.g., "5m 30s")
* `{error}` - Error message

**Examples:**

Urgent/dramatic:

```yaml
chamber-reset-warning: "&c&l⚠ WARNING ⚠ &e{chamber} &cresets in &4&l{time}&c!"
chamber-reset-complete: "&6✦ &fThe chamber has been restored to its former glory!"
```

Calm/informative:

```yaml
chamber-reset-warning: "&7[Notice] &e{chamber}&7 will reset in &f{time}&7. Please finish up!"
chamber-reset-complete: "&aReset complete. The chamber is ready for new challengers."
```

Roleplay/lore:

```yaml
chamber-reset-warning: "&7The magic sustaining &e{chamber}&7 weakens... &6{time}&7 until collapse!"
chamber-reset-complete: "&dThe chamber's ancient power has been renewed!"
```

</details>

<details>

<summary><strong>Vaults</strong></summary>

```yaml
vault-opened: "&aYou opened a {type} Vault!"
vault-cooldown: "&cThis {type} Vault is on cooldown for &e{time}&c."
vault-locked: "&cYou have already opened this {type} Vault! It will unlock when the chamber resets."
vault-reset: "&aVault cooldown reset for &e{player}&a."
wrong-key-type: "&cYou need a {required_type} Trial Key to open this vault!"
no-key: "&cYou need a Trial Key to open this vault!"
vault-not-found: "&cNo vault found at this location."
vault-loot-table-missing: "&cVault configuration error! Loot table not found. Please contact an admin."
vault-no-loot-generated: "&cVault is empty! No loot was generated. Please contact an admin."
vault-error: "&cAn error occurred while opening the vault. Please try again."
```

**Placeholders:**

* `{type}` - Vault type: "Normal" or "Ominous"
* `{time}` - Cooldown time remaining
* `{player}` - Player name
* `{required_type}` - Key type needed

**New in v1.2.19:**

* `vault-loot-table-missing` - Shown when the configured loot table doesn't exist (indicates configuration error)
* `vault-no-loot-generated` - Shown when a loot table exists but generates no items (empty weighted-items or bad config)

**New in v1.2.21:**

* `vault-locked` - Shown when a player has already opened a vault (permanent cooldown until reset)
* `vault-error` - Shown when the vault block state can't be updated (rare edge case)

{% hint style="info" %}
**Note:** In v1.2.19+, if error messages appear, **keys are NOT consumed**. The player keeps their key so they can try again once the issue is resolved.
{% endhint %}

{% hint style="success" %}
**v1.2.21+:** Vault cooldowns now use Paper's native API. The `vault-locked` message is shown for permanent cooldowns (vanilla behavior). This automatically resets when the chamber is restored from snapshot.
{% endhint %}

**Examples:**

Excited/rewarding:

```yaml
vault-opened: "&a&l✓ UNLOCKED! &r&7You opened a {type} Vault!"
vault-cooldown: "&7This {type} Vault has already been looted. Try again in &e{time}&7."
```

Mystical:

```yaml
vault-opened: "&dThe {type} Vault yields its treasures to you..."
vault-cooldown: "&5The vault's magic has not yet regenerated. Return in &d{time}&5."
```

Gameplay-focused:

```yaml
vault-opened: "&6[LOOT] &f{type} Vault opened!"
vault-cooldown: "&e[COOLDOWN] &7{time} remaining"
```

</details>

<details>

<summary><strong>Trial Keys</strong></summary>

```yaml
key-given: "&aGave &e{amount}&a {type} Trial Key(s) to &e{player}&a."
key-invalid-amount: "&cInvalid amount. Must be a positive number."
key-check: "&e{player}&a has &e{normal}&a Normal Key(s) and &e{ominous}&a Ominous Key(s)."
```

**Placeholders:**

* `{amount}` - Number of keys
* `{type}` - "Normal" or "Ominous"
* `{player}` - Player name
* `{normal}` - Normal key count
* `{ominous}` - Ominous key count

</details>

<details>

<summary><strong>Statistics</strong></summary>

```yaml
stats-header: "&6=== Statistics for {player} ==="
stats-chambers: "&eChambers Completed: &f{count}"
stats-normal-vaults: "&eNormal Vaults Opened: &f{count}"
stats-ominous-vaults: "&eOminous Vaults Opened: &f{count}"
stats-mobs: "&eMobs Killed: &f{count}"
stats-deaths: "&eDeaths: &f{count}"
stats-time: "&eTime Spent: &f{time}"
statistics-disabled: "&cStatistics are disabled in the configuration."
invalid-stat-type: "&cInvalid stat type. Use: chambers, normal, ominous, mobs, or time"
```

**Placeholders:**

* `{player}` - Player name
* `{count}` - Stat count
* `{time}` - Formatted time (e.g., "2h 15m")

**Customization:**

Clean list:

```yaml
stats-header: "&7───── &6Stats: {player} &7─────"
stats-chambers: "&8▸ &7Chambers: &f{count}"
stats-normal-vaults: "&8▸ &7Normal Vaults: &f{count}"
stats-ominous-vaults: "&8▸ &7Ominous Vaults: &f{count}"
```

Game-style:

```yaml
stats-header: "&6╔═══════════════════════╗\n&6║ &fStats: {player}\n&6╚═══════════════════════╝"
stats-chambers: "  &e⚔ Chambers Beaten: &a{count}"
stats-normal-vaults: "  &e🔓 Normal Vaults: &a{count}"
```

</details>

<details>

<summary><strong>Leaderboards</strong></summary>

```yaml
leaderboard-header: "&6=== Top Players - {stat} ==="
leaderboard-entry: "&e#{rank} &f{player}&7: &a{value}"
leaderboard-empty: "&7No statistics recorded yet."
```

**Placeholders:**

* `{stat}` - Stat type (e.g., "Chambers Completed")
* `{rank}` - Player's rank (1, 2, 3...)
* `{player}` - Player name
* `{value}` - Stat value

**Examples:**

Medal system:

```yaml
leaderboard-header: "&6&l🏆 TOP PLAYERS - {stat} 🏆"
leaderboard-entry: "&7{rank}. &f{player} &8- &e{value}"
```

With actual medals for top 3 (requires creative formatting):

```yaml
# For top 3, manually format with different entries if your plugin supports it
leaderboard-entry: "&e#{rank} &f{player}&7: &a{value}"
# Could be: 🥇 #1, 🥈 #2, 🥉 #3 for top 3
```

</details>

<details>

<summary><strong>Chamber Completion &#x26; Entry</strong></summary>

```yaml
chamber-entered: "&7Entered chamber: &e{chamber}"
chamber-exited: "&7Left chamber"
player-died-in-chamber: "&c{player} died in {chamber}"
```

**Placeholders:**

* `{chamber}` - Chamber name
* `{player}` - Player name

**Examples:**

Achievement-style:

```yaml
chamber-entered: "&7➜ Entering &e{chamber}&7..."
chamber-exited: "&7← Leaving chamber"
```

Subtle:

```yaml
chamber-entered: "&8[&7{chamber}&8]"
chamber-exited: ""
```

Dramatic:

```yaml
player-died-in-chamber: "&c☠ &7{player} fell in &c{chamber}"
```

</details>

<details>

<summary><strong>Protection</strong></summary>

```yaml
cannot-break-blocks: "&cYou cannot break blocks in a Trial Chamber!"
cannot-place-blocks: "&cYou cannot place blocks in a Trial Chamber!"
cannot-access-container: "&cYou cannot access containers in a Trial Chamber!"
```

**Customization:**

Strict:

```yaml
cannot-break-blocks: "&4[DENIED] &cBreaking blocks is not allowed here."
```

Funny:

```yaml
cannot-break-blocks: "&cHey! Stop that! This isn't your chamber to break."
cannot-place-blocks: "&cNo block placing in the ancient ruins, thanks."
```

Immersive:

```yaml
cannot-break-blocks: "&7An ancient magic prevents you from damaging the structure."
cannot-place-blocks: "&7The chamber's magic rejects your attempt to alter it."
```

</details>

<details>

<summary><strong>Teleportation</strong></summary>

```yaml
teleported-to-exit: "&aTeleported to exit of chamber &e{chamber}&a."
```

**Placeholders:**

* `{chamber}` - Chamber name

**Examples:**

Magical:

```yaml
teleported-to-exit: "&7You've been whisked away to safety..."
```

Simple:

```yaml
teleported-to-exit: "&7→ Exit"
```

</details>

<details>

<summary><strong>Chamber Info</strong></summary>

```yaml
info-header: "&6=== Chamber Info: {chamber} ==="
info-world: "&eWorld: &f{world}"
info-bounds: "&eBounds: &f{minX},{minY},{minZ} to {maxX},{maxY},{maxZ}"
info-volume: "&eVolume: &f{volume} blocks"
info-exit: "&eExit: &f{exit}"
info-reset-interval: "&eReset Interval: &f{interval}"
info-last-reset: "&eLast Reset: &f{time}"
info-snapshot: "&eSnapshot: &f{status}"
```

**Placeholders:**

* `{chamber}` - Chamber name
* `{world}` - World name
* `{minX}`, `{minY}`, `{minZ}`, `{maxX}`, `{maxY}`, `{maxZ}` - Coordinates
* `{volume}` - Block count
* `{exit}` - Exit location or "Not set"
* `{interval}` - Reset interval (e.g., "48 hours")
* `{time}` - Last reset time
* `{count}` - Count of vaults/spawners
* `{status}` - Snapshot status

</details>

<details>

<summary><strong>Time Formatting</strong></summary>

```yaml
time-days: "{days}d"
time-hours: "{hours}h"
time-minutes: "{minutes}m"
time-seconds: "{seconds}s"
time-never: "Never"
time-now: "Just now"
time-ago: "{time} ago"
```

**Placeholders:**

* `{days}`, `{hours}`, `{minutes}`, `{seconds}` - Time values
* `{time}` (in `time-ago`) - The already-formatted duration

Used for cooldowns, reset warnings, `/trial info`, stats and leaderboards. Non-zero units are joined with spaces, like `"2d 5h 30m"`; `time-ago` wraps that for relative timestamps ("5m ago") and `time-now` replaces durations under a minute. *As of 1.7.1 these keys are actually applied everywhere durations are shown (they previously existed but were unused).*

**Examples:**

Verbose:

```yaml
time-days: "{days} days"
time-hours: "{hours} hours"
time-minutes: "{minutes} minutes"
time-seconds: "{seconds} seconds"
```

Ultra-minimal:

```yaml
time-days: "{days}d"
time-hours: "{hours}h"
time-minutes: "{minutes}m"
time-seconds: "{seconds}s"
```

</details>

<details>

<summary><strong>System Messages</strong></summary>

```yaml
plugin-starting-up: "&eBetterTrialChambers is still starting up. Please try again in a moment..."
```

Shown when commands are used before the plugin finishes async initialization.

</details>

<details>

<summary><strong>Info Display Format</strong></summary>

```yaml
# Used in /trial info output
info-exit-location-set: "&a{x}, {y}, {z}"
info-exit-location-not-set: "&cNot set"
info-snapshot-created: "&aCreated"
info-snapshot-not-created: "&cNot created"
```

**Placeholders:**

* `{x}`, `{y}`, `{z}` - Coordinates

These are displayed as values in the chamber info command output.

</details>

<details>

<summary><strong>Spawner Waves</strong></summary>

```yaml
spawner-wave-complete: "&a✓ {type} Spawner wave complete! &7Killed &e{killed}&7 mobs in &f{duration}"

# Boss bar messages (no prefix added - displayed on boss bar)
spawner-wave-boss-bar-complete: "Wave Complete!"
spawner-wave-boss-bar-ominous: "Ominous Trial - Wave {wave}"
spawner-wave-boss-bar-normal: "Trial Spawner - Wave {wave}"
spawner-wave-boss-bar-progress: "{type} - {killed}/{total}"
```

**Placeholders:**

* `{type}` - Spawner type: "Trial" or "Ominous"
* `{killed}` - Number of mobs killed
* `{total}` - Total mobs expected
* `{duration}` - Time to complete (e.g., "1m 30s")
* `{wave}` - Wave number

**Examples:**

Celebratory:

```yaml
spawner-wave-complete: "&6🎉 &e{type} Wave Cleared! &7{killed} mobs defeated in {duration}!"
spawner-wave-boss-bar-complete: "✓ Victory!"
```

Competitive:

```yaml
spawner-wave-complete: "&a[WAVE COMPLETE] &7{killed} kills in &f{duration}"
spawner-wave-boss-bar-progress: "{killed}/{total} eliminated"
```

</details>

<details>

<summary><strong>Spectator Mode</strong></summary>

```yaml
spectate-offer: "&7You died in &e{chamber}&7. Would you like to spectate?"
spectate-hint: "&7Type &aspectate &7to watch or &cno &7to respawn normally."
spectate-offer-expired: "&7Spectate offer expired."
spectate-started: "&aYou are now spectating &e{chamber}&a!"
spectate-exit-hint: "&7Type &eexit &7to leave spectator mode."
spectate-exited: "&7You have left spectator mode."
spectate-declined: "&7Spectator mode declined."
spectate-boundary-warning: "&cYou cannot leave the chamber while spectating!"
spectate-no-players: "&7No other players are in the chamber to spectate."
spectate-chamber-not-found: "&cThe chamber no longer exists."
```

**Placeholders:**

* `{chamber}` - Chamber name

**Examples:**

Encouraging:

```yaml
spectate-offer: "&7Tough luck! Want to watch your teammates in &e{chamber}&7?"
spectate-started: "&a👀 Spectating &e{chamber}&a - Cheer them on!"
```

Roleplay:

```yaml
spectate-offer: "&7Your spirit lingers near &e{chamber}&7... Watch from beyond?"
spectate-started: "&d✦ &7Your spirit observes the trial of &e{chamber}&7..."
spectate-exited: "&7Your spirit returns to the mortal plane."
```

</details>

<details>

<summary><strong>GUI Action Messages</strong></summary>

```yaml
# Chamber Operations
gui-chamber-world-not-loaded: "&cChamber world not loaded!"
gui-teleport-to-center: "&aTeleported to center of {chamber}"
gui-forcing-reset: "&eForcing reset for '{chamber}'..."
gui-chamber-reset-complete: "&aChamber '{chamber}' has been reset!"
gui-reset-failed: "&cFailed to reset chamber: {error}"
gui-no-players-in-chamber: "&eNo players are currently in this chamber."
gui-players-ejected: "&aEjected {count} player(s) from '{chamber}'!"
gui-reset-scheduled: "&eChamber '{chamber}' will reset in {seconds} seconds."
gui-exit-scheduled: "&ePlayers will be ejected from '{chamber}' in {seconds} seconds."
gui-exit-warning: "&cYou will be ejected from this chamber in {seconds} seconds!"
gui-player-ejected: "&eYou have been ejected from the chamber!"

# Snapshot Operations
gui-no-snapshot-exists: "&cNo snapshot exists for this chamber!"
gui-restoring-snapshot: "&eRestoring snapshot for '{chamber}'..."
gui-snapshot-restored: "&aSnapshot restored!"
gui-restore-failed: "&cFailed to restore: {error}"
gui-creating-snapshot: "&eCreating snapshot for '{chamber}'..."
gui-snapshot-created: "&aSnapshot created!"
gui-snapshot-create-failed: "&cFailed to create snapshot: {error}"

# Chamber Settings
gui-reset-interval-set: "&aReset interval set to {value}"
gui-reset-interval-failed: "&cFailed to update reset interval"
gui-exit-location-set: "&aExit location set to your current position"
gui-exit-location-failed: "&cFailed to set exit location"
gui-no-exit-location: "&cNo exit location set for this chamber"
gui-teleport-to-exit: "&aTeleported to exit location"
gui-spawner-cooldown-set: "&aSpawner cooldown set to {value}"
gui-spawner-cooldown-failed: "&cFailed to update spawner cooldown"
gui-spawner-cooldown-reset: "&aSpawner cooldown reset to global config"

# Loot Table Settings
gui-no-loot-tables: "&cNo loot tables available"
gui-loot-table-set: "&a{type} loot table set to: {table}"
gui-loot-table-failed: "&cFailed to set loot table"
gui-loot-table-cleared: "&a{type} loot table override cleared"
gui-loot-clear-failed: "&cFailed to clear loot table override"

# Loot Editor
gui-hold-item-to-add: "&cHold an item to add!"
gui-item-added-to-loot: "&aAdded {item} to loot table"
gui-loot-changes-saved: "&aLoot table changes saved!"
gui-loot-pool-saved: "&aPool '{pool}' changes saved!"

# Info Messages
gui-pool-create-hint: "&eTo add a new pool, edit loot.yml directly and /trial reload"
gui-pool-create-coming-soon: "&7GUI pool creation coming soon!"
```

**Placeholders:**

* `{chamber}` - Chamber name
* `{count}` - Number of players
* `{seconds}` - Time in seconds
* `{error}` - Error message
* `{value}` - Setting value (e.g., "5 minutes", "Enabled")
* `{type}` - Vault/loot type: "Normal" or "Ominous"
* `{table}` - Loot table name
* `{item}` - Item type name
* `{pool}` - Pool name

**Customization:**

Tech-style:

```yaml
gui-forcing-reset: "&7[SYSTEM] Initiating reset of &f{chamber}&7..."
gui-chamber-reset-complete: "&a[COMPLETE] &7Chamber &f{chamber}&7 restored"
gui-reset-scheduled: "&7[SCHEDULED] &f{chamber}&7 reset in &e{seconds}s"
```

Immersive:

```yaml
gui-forcing-reset: "&7The ancient magic begins to stir in &e{chamber}&7..."
gui-chamber-reset-complete: "&d✦ &7The chamber &e{chamber}&7 has been renewed!"
gui-player-ejected: "&7An unseen force gently pushes you from the chamber..."
```

</details>

<details>

<summary><strong>Help Messages</strong></summary>

```yaml
help-header: "&6=== BetterTrialChambers Commands ==="
help-scan: "&e/trial scan <chamber> &7- Scan for vaults/spawners"
help-generate: "&e/trial generate <mode> ... &7- Register chamber from various sources"
# ... (all help entries)
```

Customize the entire help menu to match your server's command style!

**Examples:**

Compact:

```yaml
help-header: "&6Commands:"
help-scan: "&e/trial scan <chamber> &8▸ &7Scan for blocks"
help-generate: "&e/trial generate <mode> &8▸ &7Register chamber"
```

Detailed:

```yaml
help-header: "&6╔════════════════════════════╗\n&6║ &fBetterTrialChambers Commands\n&6╚════════════════════════════╝"
help-generate: "&e/trial generate wand <name>\n  &7Registers a chamber from your WorldEdit selection"
```

</details>

***

## Complete Theme Examples

<details>

<summary><strong>Minimalist Theme</strong></summary>

```yaml
prefix: "&8[&6TCP&8] "
chamber-created: "&a✓ Created {chamber}"
chamber-deleted: "&c✗ Deleted {chamber}"
vault-opened: "&a{type} vault unlocked"
vault-cooldown: "&7Cooldown: &e{time}"
chamber-reset-warning: "&e{chamber} &7resets in {time}"
stats-header: "&7─── &6{player} &7───"
```

**Vibe:** Clean, no-nonsense, modern.

</details>

<details>

<summary><strong>Fantasy/Roleplay Theme</strong></summary>

```yaml
prefix: "&7[&5Ancient Trials&7] "
chamber-created: "&7The chamber &e{chamber}&7 awakens from its slumber..."
chamber-deleted: "&7The memory of &e{chamber}&7 fades into legend..."
vault-opened: "&dThe {type} Vault bestows its treasures upon you!"
vault-cooldown: "&5The vault's magic has not yet recovered. Return in &d{time}&5."
chamber-reset-warning: "&7The magic of &e{chamber}&7 wanes... &6{time}&7 until renewal!"
chamber-reset-complete: "&d✦ The chamber's ancient power has been restored! ✦"
stats-header: "&5╔════════════════════════╗\n&5║ &fLegend of {player}\n&5╚════════════════════════╝"
```

**Vibe:** Immersive, magical, story-driven.

</details>

<details>

<summary><strong>Competitive/PvP Theme</strong></summary>

```yaml
prefix: "&c[&4PvP&c] "
chamber-created: "&c[NEW ARENA] &f{chamber} &cregistered"
vault-opened: "&a[LOOTED] &f{type} Vault"
vault-cooldown: "&e[ON COOLDOWN] &7{time} remaining"
chamber-reset-warning: "&4⚠ ARENA RESET: &c{time}"
player-died-in-chamber: "&c☠ {player} &7was slain in &c{chamber}"
stats-header: "&4╔════════════════════╗\n&4║ &c{player} Stats\n&4╚════════════════════╝"
leaderboard-header: "&4&l⚔ TOP FIGHTERS - {stat} ⚔"
```

**Vibe:** Intense, competitive, action-focused.

</details>

<details>

<summary><strong>Casual/Friendly Theme</strong></summary>

```yaml
prefix: "&b[Trial] "
chamber-created: "&aWoohoo! Chamber &e{chamber}&a is ready to go!"
vault-opened: "&a🎉 You got loot from a {type} vault!"
vault-cooldown: "&eOops! This vault is still cooling down. Try again in &6{time}&e!"
chamber-reset-warning: "&eHeads up! &b{chamber}&e is resetting in &6{time}&e. Wrap it up!"
stats-header: "&b=== How's {player} doing? ==="
cannot-break-blocks: "&cHey now! No breaking stuff in here 😊"
```

**Vibe:** Friendly, approachable, lighthearted.

</details>

***

## Multi-Language Support

Want to support multiple languages? You can create separate message files!

1. Copy `messages.yml` to `messages_es.yml` (Spanish), `messages_fr.yml` (French), etc.
2. Translate all messages
3. Use a language switcher plugin to change which file is loaded per-player

{% hint style="info" %}
**Note:** BetterTrialChambers doesn't have built-in per-player language switching (yet), but you can manually swap files and reload for server-wide language changes.
{% endhint %}

***

## Pro Tips

{% hint style="success" %}
**Test your messages!** Trigger each message in-game to see how it looks in chat. Some look great in the config but ugly in-game.
{% endhint %}

{% hint style="warning" %}
**Don't overdo colors.** Too many colors = eyesore. Stick to 2-3 main colors for consistency.
{% endhint %}

{% hint style="info" %}
**Use prefixes wisely.** If you have a very long prefix, consider shortening it or removing it entirely for certain messages (like warnings).
{% endhint %}

***

## Color Palette Ideas

### Earthy/Natural

* Primary: `&a` (green), `&e` (yellow)
* Accent: `&6` (gold), `&7` (gray)

### Mystical/Magical

* Primary: `&d` (light purple), `&5` (dark purple)
* Accent: `&b` (aqua), `&f` (white)

### Tech/Modern

* Primary: `&b` (cyan), `&f` (white)
* Accent: `&7` (gray), `&8` (dark gray)

### Fire/Danger

* Primary: `&c` (red), `&6` (gold)
* Accent: `&4` (dark red), `&e` (yellow)

***

## Keeping messages.yml up-to-date after plugin upgrades

**Since 1.5.19 this is automatic.** On startup, BetterTrialChambers merges any message keys added in the new release into your existing `messages.yml` — **with their comments** — while leaving your existing translations and customisations untouched. The previous file is saved as `messages.yml.bak` first. So new keys just appear; you never have to delete and regenerate the file.

What you'll see in console when keys are added:

```
[BTC] messages.yml: added 4 new key(s) introduced in this version
[BTC] (your existing entries are kept; previous file saved as messages.yml.bak).
```

**Older behaviour (before 1.5.19):** the file was only written when absent, so upgraders' files were missing new keys and the plugin fell back to the literal text `<missing: key.name>` in chat / GUI / boss bars. A startup schema check (v1.4.1) warned about this; with the auto-merge it no longer triggers, but it remains as a backstop if a merge ever fails.

{% hint style="info" %}
**Translating?** Your edits are safe across updates — the merge only **adds** missing keys, it never changes or removes your values. See [Localization](/plugins/better-trial-chambers/configuration/localization.md) for translating the new `{type}` labels (`vault-type-normal` / `vault-type-ominous`, `wave-type-*`, `wave-boss-type-*`) and other player-facing text.
{% endhint %}

***

## Applying Changes

After editing `messages.yml`:

```
/trial reload
```

All messages update immediately. No restart needed!

***

## Common Questions

**"Can I remove the prefix from all messages?"** Yes! Set `prefix: ""` (empty string).

**"What if I want different prefixes for different message types?"** You'll need to manually add prefixes to individual messages instead of using the global prefix.

**"Can I use hex color codes?"** Yes — since **v1.4.0**. Use legacy `&#FF5500` or MiniMessage `<#FF5500>` (and gradients like `<gradient:#FF5500:#00AAFF>…</gradient>`). See the **Text formatting — MiniMessage and legacy `&` codes** section near the top of this page.

**"What if I mess up the YAML formatting?"** The plugin will fail to load messages and log errors. Always backup before editing!

**"Can I add custom messages for my own plugins?"** BetterTrialChambers only uses the messages defined here. For custom messages, you'd need to modify the plugin or request new placeholder support.

***

## What's Next?

You've completed the configuration trilogy!

Where to go next:

{% content-ref url="/pages/KytI1a3NlpSBoFlBNUJ7" %}
[loot.yml](/plugins/better-trial-chambers/configuration/loot.yml.md)
{% endcontent-ref %}

{% content-ref url="/pages/c2p910l1L2ur7dYHFGnx" %}
[config.yml](/plugins/better-trial-chambers/configuration/config.yml.md)
{% endcontent-ref %}

{% content-ref url="/pages/1YbCuDn1NyjWIL9pQWdC" %}
[Commands](/plugins/better-trial-chambers/reference/commands.md)
{% endcontent-ref %}

Now go make those messages uniquely yours!
