Default Config Files

Last updated Sep 21, 2026

Default Config Files

Shipped defaults from SoapsTraits 1.1.5.
On first run, missing files are copied to plugins/SoapsTraits/.
Edit the server copies. Reload does not reset existing files to these defaults.

plugin.yml is not listed here (commands and permissions live on Commands and Permissions).

Schema and key explanations: Traits Configuration. Full dumps below.


config.yml

# SoapsTraits Configuration
# ============================================================
#
# gui.enabled — suite master GUI kill-switch (SoapsCommon).
#

# Fallback trait for players who don't have a class-bound trait.
# If a trait has 'class: WARRIOR' in traits.yml and the player picks
# the Warrior class, that trait is assigned automatically.
# This default is only used when no class match is found.
default-trait: human

settings:
  # Print debug info to console (trigger/condition/action logs)
  debug-mode: false

  # If true, invalid actions/conditions cause that effect to be skipped.
  strict-config-validation: true

  # Keep the active trait aligned with the player's MMOCore class binding
  # on join (class change always reassigns when a binding exists).
  class-sync: true

  # When true, /sts set (manual assign) is preserved across relogs instead of
  # being overwritten by class-sync. Class changes still update the trait.
  respect-manual-assign: true

  # How often passive (tick) effects run, in ticks. (20 = 1 second)
  tick-interval: 20

  # Auto-save player data interval in ticks. (6000 = 5 minutes)
  save-interval: 6000

  # Hard safety cap for effect cooldown values.
  max-cooldown-ticks: 72000

  # Debounce GUI clicks to avoid spam-triggering actions.
  gui-click-debounce-ms: 150

gui:
  enabled: true

traits.yml

# ============================================================
#  SoapsTraits - Trait Configuration
# ============================================================
#
#  Each trait can optionally be linked to an MMOCore class.
#  When a player picks that class, the trait is auto-assigned
#  (see settings.class-sync in config.yml).
#
#  - class: WARRIOR          <-- binds this trait to the Warrior class
#
#  If no class is set, the trait can only be assigned manually
#  via /sts set <player> <trait>.
#
# ---- TRIGGERS ----
#  attack         Player hits something
#  damaged        Player takes damage
#  kill           Player kills an entity
#  crit           MythicLib weapon/skill crit (vanilla crit fallback)
#  skill_cast     Player casts an MMOCore skill
#  tick           Runs every X ticks (see config.yml)
#  death          Player dies
#  respawn        Player respawns
#  crouch         Player toggles sneak
#
# ---- CONDITIONS ----
#  health_below: 30%            HP percentage check
#  health_above: 70%
#  health_between: 30-60%       Inclusive HP window
#  chance: 25%                  Random roll
#  biome: plains
#  time: NIGHT / DAY
#  distance_to_target: 5        Within this many blocks
#  distance_above: 10           At least this many blocks away
#  behind_target: true          Backstab check
#  has_stat: attack_damage      Non-zero stat check
#  is_sprinting: true
#  is_sneaking: true
#  is_blocking: true            Shield blocking
#  is_in_combat: true           MMOCore combat tag (false = out of combat)
#  has_potion_effect: SPEED
#  target_type: ZOMBIE
#  has_target: true             Context currently has a target
#  target_is_player: true       Target must be a player
#  target_health_below: 35%     Target HP percentage check
#  world: world_nether
#  mana_above: 50%
#  mana_below: 20%
#  level_above: 10              MMOCore level at least 10
#  weather: CLEAR / RAIN / THUNDER
#
# ---- ACTIONS ----
#  damage_bonus: 25%            Flat or % outgoing damage
#  reduce_damage: 30%           Flat or % incoming reduction
#  heal: 4                      Heal HP
#  give_mana: 10                Restore mana
#  cancel_event: true           Cancel the event (dodge)
#  send_message: "&aHello!"
#  play_sound: ENTITY_PLAYER_LEVELUP
#  set_on_fire: 60              Ticks (60 = 3 seconds)
#  remove_potion_effect: SLOWNESS
#  feed: 6                      Restore hunger points
#  knockback_target: 1.2        Push current target back
#  teleport_forward: 4          Blink forward by distance
#  clear_negative_effects: true Remove common debuffs
#
#  add_stat:                    Temporary stat buff
#    defense: 15
#    duration: 100              Ticks (100 = 5 seconds)
#
#  apply_potion_effect:
#    type: SPEED
#    duration: 60               Ticks (60 = 3 seconds)
#    level: 1                   Potion level (1 = Speed I, 2 = Speed II)
#    target: true               Optional — apply to current target instead of self
#
#  spawn_particle:
#    type: FLAME                Any Bukkit particle name
#    amount: 15
#    spread: 0.3                Spread on all axes (shorthand)
#    spread_x: 0.3              Or set each axis individually
#    spread_y: 0.5
#    spread_z: 0.3
#    speed: 0.05                Particle velocity
#
# ---- COOLDOWNS ----
#  Add 'cooldown' to any effect to limit how often it fires.
#  Value is always in ticks (20 ticks = 1 second).
#
# ---- DURATIONS ----
#  All duration values are always in ticks.
#  20 ticks = 1 second.
#
# ---- STATS ----
#  attack_damage, crit_chance, crit_damage, defense,
#  max_health, speed, health_regen, mana, mana_regen,
#  cooldown_reduction
#
# ============================================================

traits:
  # ---------------------------------------------------------
  #  Balance goals (MMOCore companion layer)
  # ---------------------------------------------------------
  #  Traits should feel like class identity — not a second skill tree.
  #  - Passive stats: small, always-on flavor (~1 role axis)
  #  - Procs: situational windows with clear tradeoffs
  #  - chance:            usually 10–30%
  #  - damage_bonus:      usually 12–28%
  #  - reduce_damage:     keep under 40%
  #  - teleport_forward:  2–5 blocks
  #  - knockback_target:  0.5–1.2
  #  - tick trigger:      always pair with cooldown
  #  - Use is_in_combat / level_above sparingly for progression feel
  #
  # ---------------------------------------------------------
  #  HUMAN - Reliable sustain and recovery
  # ---------------------------------------------------------
  human:
    class: HUMAN
    stats:
      max_health: 4
      health_regen: 0.5
      mana_regen: 0.5

    effects:
      # Second wind while fighting in the danger band
      - trigger: damaged
        cooldown: 180
        conditions:
          - is_in_combat: true
          - health_between: 20-45%
          - chance: 28%
        actions:
          - heal: 3
          - clear_negative_effects: true
          - send_message: "&eYou steady yourself."

      # Out-of-combat recovery pulse (travel / downtime)
      - trigger: tick
        cooldown: 140
        conditions:
          - is_in_combat: false
          - health_below: 75%
        actions:
          - heal: 1
          - feed:
              food: 1
              saturation: 0.5

  # ---------------------------------------------------------
  #  WARRIOR - Frontline pressure and shield control
  # ---------------------------------------------------------
  warrior:
    class: WARRIOR
    stats:
      max_health: 8
      defense: 6
      attack_damage: 3

    effects:
      # Finish pressure on weakened targets
      - trigger: attack
        cooldown: 90
        conditions:
          - has_target: true
          - target_health_below: 35%
          - is_in_combat: true
        actions:
          - damage_bonus: 18%
          - knockback_target: 0.7
          - play_sound: ENTITY_PLAYER_ATTACK_STRONG

      # Brace while shield-blocking
      - trigger: damaged
        cooldown: 100
        conditions:
          - is_blocking: true
        actions:
          - reduce_damage: 26%
          - clear_negative_effects: true
          - spawn_particle:
              type: CRIT
              amount: 8
              spread: 0.35
              speed: 0.02

      # Momentum after a kill mid-fight
      - trigger: kill
        cooldown: 120
        conditions:
          - is_in_combat: true
          - health_below: 80%
        actions:
          - heal: 2
          - add_stat:
              defense: 6
              duration: 60

  # ---------------------------------------------------------
  #  MAGE - Mana economy and escape tools
  # ---------------------------------------------------------
  mage:
    class: MAGE
    stats:
      mana: 28
      mana_regen: 2.2
      cooldown_reduction: 5

    effects:
      # Mana surge when casting on empty reserves
      - trigger: skill_cast
        cooldown: 100
        conditions:
          - mana_below: 40%
          - chance: 32%
        actions:
          - give_mana: 16
          - spawn_particle:
              type: ENCHANT
              amount: 14
              spread: 0.5
              speed: 0.08

      # Stronger surge once past early levels
      - trigger: skill_cast
        cooldown: 160
        conditions:
          - level_above: 12
          - mana_below: 30%
          - chance: 22%
        actions:
          - give_mana: 22
          - clear_negative_effects: true
          - send_message: "&bArcane reserves flood back."

      # Arcane blink under pressure
      - trigger: damaged
        cooldown: 200
        conditions:
          - health_between: 20-55%
          - chance: 20%
        actions:
          - teleport_forward: 4
          - send_message: "&bArcane blink!"
          - play_sound: ENTITY_ENDERMAN_TELEPORT

  # ---------------------------------------------------------
  #  ROGUE - Positional burst and evasive tempo
  # ---------------------------------------------------------
  rogue:
    class: ROGUE
    stats:
      crit_chance: 10
      crit_damage: 8
      speed: 0.03

    effects:
      # Backstab opener (works in PvE and PvP)
      - trigger: attack
        cooldown: 70
        conditions:
          - has_target: true
          - behind_target: true
        actions:
          - damage_bonus: 24%
          - spawn_particle:
              type: SMOKE
              amount: 10
              spread: 0.25
              speed: 0.01

      # Sprint dodge under pressure
      - trigger: damaged
        cooldown: 160
        conditions:
          - is_sprinting: true
          - chance: 12%
        actions:
          - cancel_event: true
          - teleport_forward: 3
          - play_sound: ENTITY_PHANTOM_FLAP

      # Crit finisher — tracks MythicLib critical strikes
      - trigger: crit
        cooldown: 100
        conditions:
          - has_target: true
          - target_health_below: 30%
        actions:
          - knockback_target: 0.9
          - feed:
              food: 2
              saturation: 1

  # ---------------------------------------------------------
  #  PALADIN - Guarded anchor with cleanse windows
  # ---------------------------------------------------------
  paladin:
    class: PALADIN
    stats:
      max_health: 7
      defense: 8
      health_regen: 1.0

    effects:
      # Guarded mitigation
      - trigger: damaged
        cooldown: 80
        conditions:
          - is_blocking: true
        actions:
          - reduce_damage: 32%
          - spawn_particle:
              type: END_ROD
              amount: 8
              spread: 0.4
              speed: 0.02

      # Divine recovery when injured in combat
      - trigger: damaged
        cooldown: 200
        conditions:
          - is_in_combat: true
          - health_below: 35%
        actions:
          - heal: 4
          - clear_negative_effects: true
          - play_sound: BLOCK_AMETHYST_BLOCK_CHIME

      # Judgement strike on weakened foes
      - trigger: attack
        cooldown: 120
        conditions:
          - has_target: true
          - target_health_below: 35%
        actions:
          - damage_bonus: 14%
          - set_on_fire: 40

  # ---------------------------------------------------------
  #  ARCHER - Range control and kiting tempo
  # ---------------------------------------------------------
  archer:
    class: ARCHER
    stats:
      attack_damage: 3
      crit_chance: 7
      speed: 0.025

    effects:
      # True long-range precision (rewards spacing)
      - trigger: attack
        cooldown: 70
        conditions:
          - has_target: true
          - distance_above: 10
          - chance: 35%
        actions:
          - damage_bonus: 20%
          - play_sound: ENTITY_ARROW_HIT_PLAYER

      # Disengage when focused (PvE + PvP)
      - trigger: damaged
        cooldown: 180
        conditions:
          - has_target: true
          - is_in_combat: true
          - chance: 28%
        actions:
          - knockback_target: 1.0
          - apply_potion_effect:
              type: SPEED
              duration: 50
              level: 2

      # Finisher mark on MythicLib crits — glow the target
      - trigger: crit
        cooldown: 120
        conditions:
          - has_target: true
          - target_health_below: 40%
        actions:
          - apply_potion_effect:
              type: GLOWING
              duration: 80
              level: 1
              target: true

  # ---------------------------------------------------------
  #  BERSERKER - Aggressive low-health momentum
  # ---------------------------------------------------------
  berserker:
    class: BERSERKER
    stats:
      attack_damage: 6
      max_health: 2
      health_regen: 0.3

    effects:
      # Rage breakpoint burst
      - trigger: attack
        cooldown: 70
        conditions:
          - health_below: 40%
          - is_in_combat: true
        actions:
          - damage_bonus: 26%
          - spawn_particle:
              type: DAMAGE_INDICATOR
              amount: 6
              spread: 0.25
              speed: 0.02

      # Last stand conversion
      - trigger: damaged
        cooldown: 180
        conditions:
          - health_between: 10-30%
        actions:
          - add_stat:
              defense: 12
              duration: 80
          - feed:
              food: 2
              saturation: 1
          - send_message: "&4Rage hardens your resolve!"

      # Kill chain sustain
      - trigger: kill
        cooldown: 100
        conditions:
          - health_below: 55%
        actions:
          - heal: 3
          - clear_negative_effects: true
          - play_sound: ENTITY_ENDER_DRAGON_GROWL

  # ---------------------------------------------------------
  #  SHOWCASE TRAITS (no class binding)
  #  Manual assign only — useful for events or testing.
  # ---------------------------------------------------------
  shadowstep_showcase:
    stats:
      speed: 0.02
    effects:
      - trigger: crouch
        cooldown: 160
        conditions:
          - time: NIGHT
          - health_between: 30-90%
        actions:
          - teleport_forward: 5
          - apply_potion_effect:
              type: INVISIBILITY
              duration: 60
              level: 1
          - play_sound: ENTITY_ENDERMAN_TELEPORT

  executioner_showcase:
    stats:
      attack_damage: 2
    effects:
      - trigger: attack
        cooldown: 100
        conditions:
          - has_target: true
          - target_health_below: 25%
        actions:
          - damage_bonus: 30%
          - knockback_target: 1.1
          - send_message: "&cExecution window!"

  guardian_showcase:
    stats:
      defense: 3
    effects:
      - trigger: damaged
        cooldown: 140
        conditions:
          - health_between: 20-55%
          - chance: 40%
        actions:
          - clear_negative_effects: true
          - reduce_damage: 18%
          - heal: 2
          - spawn_particle:
              type: TOTEM_OF_UNDYING
              amount: 5
              spread: 0.3
              speed: 0.01

messages.yml

# SoapsTraits Messages
# Gradient system (consistent by meaning, no bold formatting):
# - Success: #22c55e -> #14b8a6
# - Error/Danger: #ef4444 -> #f97316
# - Warning: #f59e0b -> #f97316
# - Info/Neutral: #60a5fa -> #a78bfa
# - Headers/Titles: #fbbf24 -> #a78bfa
# - Navigation/Clickable: #38bdf8 -> #22d3ee
# - Debug: #e879f9 -> #60a5fa
#
# Legacy & and § codes are accepted alongside MiniMessage (parsed via suite SoapsText where wired).

prefix: "<gradient:#fbbf24:#a78bfa>[SoapsTraits] </gradient>"

# === Trait Assignment ===
trait-assigned: "<gradient:#22c55e:#14b8a6>Assigned trait {trait}.</gradient>"
trait-changed: "<gradient:#60a5fa:#a78bfa>Your active trait is now {trait}.</gradient>"
trait-default-assigned: "<gradient:#60a5fa:#a78bfa>You were assigned the default trait: {trait}.</gradient>"
trait-class-synced: "<gradient:#60a5fa:#a78bfa>Class {class} awakened trait {trait}.</gradient>"

# === Permissions ===
no-permission: "<gradient:#ef4444:#f97316>You do not have permission to use this command.</gradient>"

# === Errors ===
trait-not-found: "<gradient:#ef4444:#f97316>Trait {trait} not found.</gradient>"
player-not-found: "<gradient:#ef4444:#f97316>Player {player} not found.</gradient>"
player-no-trait: "<gradient:#ef4444:#f97316>{player} has no trait assigned.</gradient>"

# === Info Command ===
trait-info-header: "<gradient:#fbbf24:#a78bfa>---------- Trait Info ----------</gradient>"
trait-info-trait: "<gradient:#60a5fa:#a78bfa>Active trait: {trait}</gradient>"
trait-info-status: "<gradient:#60a5fa:#a78bfa>Effects: {status}</gradient>"
trait-info-status-on: "enabled"
trait-info-status-off: "disabled (/sts toggle)"
trait-info-class-binding: "<gradient:#60a5fa:#a78bfa>Bound class: {class}</gradient>"
trait-info-mmocore-class: "<gradient:#60a5fa:#a78bfa>MMOCore class: {class}</gradient>"
trait-info-no-class: "none"
trait-info-stats-header: "<gradient:#60a5fa:#a78bfa>Stat modifiers:</gradient>"
trait-info-stat-entry: "<gradient:#60a5fa:#a78bfa>  - {stat}: +{value}</gradient>"
trait-info-no-stats: "<gradient:#f59e0b:#f97316>  None</gradient>"
trait-info-effects: "<gradient:#60a5fa:#a78bfa>Configured effects: {count}</gradient>"
trait-info-none: "<gradient:#f59e0b:#f97316>You do not currently have a trait assigned.</gradient>"

# === Admin Commands ===
trait-set-success: "<gradient:#22c55e:#14b8a6>Set {player}'s trait to {trait}.</gradient>"
trait-remove-success: "<gradient:#22c55e:#14b8a6>Removed {player}'s trait. Assigned default trait {default}.</gradient>"
reload-success: "<gradient:#22c55e:#14b8a6>SoapsTraits reloaded successfully.</gradient>"
reload-merge-none: "<gradient:#60a5fa:#a78bfa>No new default keys needed merging.</gradient>"
reload-merge-file: "<gradient:#60a5fa:#a78bfa>Merged {count} new default key(s) into {file}.</gradient>"

# === List Command ===
trait-list-header: "<gradient:#fbbf24:#a78bfa>---------- Available Traits ----------</gradient>"
trait-list-entry: "<gradient:#60a5fa:#a78bfa>  - {trait}</gradient>"

# === Debug Command ===
debug-toggle-on: "<gradient:#22c55e:#14b8a6>Debug monitoring enabled for {player}.</gradient>"
debug-toggle-off: "<gradient:#ef4444:#f97316>Debug monitoring disabled for {player}.</gradient>"
debug-header: "<gradient:#e879f9:#60a5fa>---------- Debug: {player} ----------</gradient>"
debug-trait: "<gradient:#e879f9:#60a5fa>Active trait: {trait}</gradient>"
debug-stats: "<gradient:#e879f9:#60a5fa>Base stats: {stats}</gradient>"
debug-effects: "<gradient:#e879f9:#60a5fa>Configured effects: {count}</gradient>"
debug-chat-prefix: "<gradient:#e879f9:#60a5fa>[Debug] </gradient>"
debug-value-true: "true"
debug-value-false: "false"
debug-line-trigger: "<gradient:#e879f9:#60a5fa>[Trigger] {trigger} fired</gradient>"
debug-line-condition: "<gradient:#e879f9:#60a5fa>[Condition] {description} -> {result}</gradient>"
debug-line-action: "<gradient:#e879f9:#60a5fa>[Action] {description} executed</gradient>"
debug-line-stat-duration: "<gradient:#e879f9:#60a5fa> for {duration}</gradient>"
debug-line-stat: "<gradient:#e879f9:#60a5fa>[Stat] {stat} {value}{duration}</gradient>"
debug-stats-none-value: "none"

# === Help (paginated) ===
help-header: "<gradient:#fbbf24:#a78bfa>---------- SoapsTraits Help ----------</gradient>"
help-page-info: "<gradient:#60a5fa:#a78bfa>Page {page}/{total} · Click a command to insert it</gradient>"
help-divider: "<gradient:#60a5fa:#a78bfa>----------------------------------------</gradient>"
help-entry: "<click:suggest_command:'/sts {command}'><hover:show_text:'<gray>{usage}</gray>'><gradient:#38bdf8:#22d3ee>  /sts {command}</gradient> <gradient:#60a5fa:#a78bfa>— {description}</gradient></hover></click>"
help-nav: "{prev}<gradient:#60a5fa:#a78bfa> Page {page}/{total} </gradient>{next}"
help-nav-prev: "<click:run_command:'/sts help {page}'><hover:show_text:'<gray>Go to page {page}</gray>'><gradient:#38bdf8:#22d3ee>« Back</gradient></hover></click>"
help-nav-next: "<click:run_command:'/sts help {page}'><hover:show_text:'<gray>Go to page {page}</gray>'><gradient:#38bdf8:#22d3ee>Next »</gradient></hover></click>"
help-nav-prev-empty: "<dark_gray>« Back</dark_gray>"
help-nav-next-empty: "<dark_gray>Next »</dark_gray>"
help-empty: "<gradient:#f59e0b:#f97316>No commands available for your permissions.</gradient>"
help-console-header: "---------- SoapsTraits Help (page {page}/{total}) ----------"
help-console-entry: "  /sts {command} — {description}"
help-console-footer: "Use /sts help <page> for more pages."
# Kept for older configs that still reference this key
command-usage: "<gradient:#60a5fa:#a78bfa>Use /sts help for commands.</gradient>"

# === New Command Messages ===
player-reset-success: "<gradient:#22c55e:#14b8a6>Reset trait data for {player}.</gradient>"
trait-toggle-on: "<gradient:#22c55e:#14b8a6>Trait {trait} is now enabled.</gradient>"
trait-toggle-off: "<gradient:#f59e0b:#f97316>Trait {trait} is now disabled.</gradient>"
stats-header: "<gradient:#fbbf24:#a78bfa>---------- Stats for {player} ----------</gradient>"
stats-trait: "<gradient:#60a5fa:#a78bfa>Trait: {trait}</gradient>"
stats-enabled: "<gradient:#60a5fa:#a78bfa>Effects: {status}</gradient>"
stats-live-header: "<gradient:#60a5fa:#a78bfa>Live MythicLib stats:</gradient>"
stats-live-entry: "<gradient:#60a5fa:#a78bfa>  - {stat}: +{bonus} (live {live})</gradient>"
stats-entry: "<gradient:#60a5fa:#a78bfa>  - {stat}: {value}</gradient>"
stats-cooldowns-header: "<gradient:#60a5fa:#a78bfa>Active cooldowns:</gradient>"
stats-global-cooldown: "<gradient:#f59e0b:#f97316>  - Trait lock: {seconds}s</gradient>"
stats-effect-cooldown: "<gradient:#60a5fa:#a78bfa>  - Effect #{index} ({trigger}): {seconds}s</gradient>"
stats-cooldowns-none: "<gradient:#22c55e:#14b8a6>  None — all effects ready</gradient>"
migrate-success: "<gradient:#22c55e:#14b8a6>Migrated {count} players from {old} to {new}.</gradient>"
cooldown-set: "<gradient:#22c55e:#14b8a6>Set cooldown for trait {trait} to {ticks} ticks for {player}.</gradient>"
plugin-version: "<gradient:#60a5fa:#a78bfa>SoapsTraits version: {version}</gradient>"
trait-test-success: "<gradient:#22c55e:#14b8a6>Tested trait {trait} on {player}.</gradient>"
import-success: "<gradient:#22c55e:#14b8a6>Imported {count} traits from {file}.</gradient>"
export-success: "<gradient:#22c55e:#14b8a6>Exported {count} traits to {file}.</gradient>"
import-failed: "<gradient:#ef4444:#f97316>Failed to import traits from {file}.</gradient>"
export-failed: "<gradient:#ef4444:#f97316>Failed to export traits to {file}.</gradient>"
player-only-command: "<gradient:#ef4444:#f97316>This command can only be used by players.</gradient>"
invalid-number: "<gradient:#ef4444:#f97316>Please enter a valid number.</gradient>"
gui-disabled: "<gradient:#ef4444:#f97316>The GUI editor is disabled in config.yml.</gradient>"

# ============================================================
# GUI EDITOR TEXT
# ============================================================

# --- Trait List GUI ---
gui-title-trait-list: "<gradient:#fbbf24:#a78bfa>Trait Editor (Page {page})</gradient>"
gui-create-new-trait: "<gradient:#22c55e:#14b8a6>Create Trait</gradient>"
gui-create-new-trait-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Start a brand-new trait profile.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>You can configure stats and effects next.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to create a new trait</gradient>"
gui-previous-page: "<gradient:#38bdf8:#22d3ee><- Previous Page</gradient>"
gui-previous-page-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Go to page {page}.</gradient>"
gui-next-page: "<gradient:#38bdf8:#22d3ee>Next Page -></gradient>"
gui-next-page-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Go to page {page}.</gradient>"
gui-trait-class: "<gradient:#60a5fa:#a78bfa>Bound class: {class}</gradient>"
gui-trait-effects: "<gradient:#60a5fa:#a78bfa>Effects: {count}</gradient>"
gui-trait-stats: "<gradient:#60a5fa:#a78bfa>Stats: {count}</gradient>"
gui-trait-stats-header: "<gradient:#60a5fa:#a78bfa>Active stats:</gradient>"
gui-trait-stat-entry: "<gradient:#60a5fa:#a78bfa>  {stat}: {value}</gradient>"
gui-click-to-edit: "<gradient:#38bdf8:#22d3ee>▶ Left-click to edit this trait</gradient>"
gui-trait-item-title: "<gradient:#fbbf24:#a78bfa>{trait}</gradient>"
gui-default-new-trait-name: "new_trait"
gui-unbound-class-value: "Unbound"
gui-empty-value: "empty"

# --- Trait Editor GUI ---
gui-title-trait-editor: "<gradient:#fbbf24:#a78bfa>Editing Trait: {trait}</gradient>"
gui-info-title: "<gradient:#fbbf24:#a78bfa>{trait}</gradient>"
gui-info-trait-name: "<gradient:#60a5fa:#a78bfa>Name: {name}</gradient>"
gui-info-trait-class: "<gradient:#60a5fa:#a78bfa>Class: {class}</gradient>"
gui-info-trait-stats: "<gradient:#60a5fa:#a78bfa>Stats: {count}</gradient>"
gui-info-trait-effects: "<gradient:#60a5fa:#a78bfa>Effects: {count}</gradient>"
gui-info-status-new: "<gradient:#22c55e:#14b8a6>New trait - not saved yet</gradient>"
gui-info-status-editing: "<gradient:#60a5fa:#a78bfa>Editing existing trait</gradient>"
gui-back-to-list: "<gradient:#38bdf8:#22d3ee>← Back to List</gradient>"
gui-back-to-list-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Return to the trait list.</gradient>"
  - ""
  - "<gradient:#f59e0b:#f97316>Warning: Unsaved edits will be lost.</gradient>"
gui-delete-trait: "<gradient:#ef4444:#f97316>Delete Trait</gradient>"
gui-delete-trait-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Permanently remove this trait from config.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Players using it lose access immediately.</gradient>"
  - ""
  - "<gradient:#ef4444:#f97316>This action cannot be undone.</gradient>"
gui-delete-disabled: "<gradient:#f59e0b:#f97316>Delete (unavailable)</gradient>"
gui-delete-disabled-lore: "<gradient:#f59e0b:#f97316>Save this trait before deleting.</gradient>"
gui-save-changes: "<gradient:#22c55e:#14b8a6>Save Changes</gradient>"
gui-save-changes-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Save this trait to traits.yml.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Changes persist through reloads and restarts.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to save changes</gradient>"
gui-edit-name: "<gradient:#38bdf8:#22d3ee>Rename Trait</gradient>"
gui-edit-name-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Current: {name}</gradient>"
  - ""
  - "<gradient:#60a5fa:#a78bfa>Rename this trait through chat input.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Its command identifier updates too.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to rename trait</gradient>"
gui-edit-class: "<gradient:#38bdf8:#22d3ee>Class Binding</gradient>"
gui-edit-class-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Current: {class}</gradient>"
  - ""
  - "<gradient:#60a5fa:#a78bfa>Bind this trait to an MMOCore class.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Players on that class can be</gradient>"
  - "<gradient:#60a5fa:#a78bfa>auto-assigned this trait.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to edit class binding</gradient>"
gui-edit-stats: "<gradient:#38bdf8:#22d3ee>Edit Stats</gradient>"
gui-edit-stats-current: "<gradient:#60a5fa:#a78bfa>Current Stats:</gradient>"
gui-edit-stats-none: "<gradient:#f59e0b:#f97316>  None configured</gradient>"
gui-edit-stats-entry: "<gradient:#60a5fa:#a78bfa>  • {stat}: {value}</gradient>"
gui-edit-stats-lore:
  - "<gradient:#60a5fa:#a78bfa>Add, edit, or remove stat modifiers.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Examples: attack_damage, defense,</gradient>"
  - "<gradient:#60a5fa:#a78bfa>max_health, mana, and more.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to open stats editor</gradient>"
gui-edit-effects: "<gradient:#38bdf8:#22d3ee>Edit Effects</gradient>"
gui-edit-effects-count: "<gradient:#60a5fa:#a78bfa>Current effects: {count}</gradient>"
gui-edit-effects-lore:
  - "<gradient:#60a5fa:#a78bfa>Add and configure trigger-based effects.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Each effect can define conditions,</gradient>"
  - "<gradient:#60a5fa:#a78bfa>actions, and a cooldown.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to open effect editor</gradient>"
gui-undo: "<gradient:#38bdf8:#22d3ee>Undo</gradient>"
gui-undo-disabled: "<gradient:#f59e0b:#f97316>Undo</gradient>"
gui-undo-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Revert your latest unsaved edit.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to undo</gradient>"
gui-undo-none: "<gradient:#f59e0b:#f97316>Nothing to undo</gradient>"
gui-redo: "<gradient:#38bdf8:#22d3ee>Redo</gradient>"
gui-redo-disabled: "<gradient:#f59e0b:#f97316>Redo</gradient>"
gui-redo-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Re-apply your last undone edit.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to redo</gradient>"
gui-redo-none: "<gradient:#f59e0b:#f97316>Nothing to redo</gradient>"

# --- Stats Editor GUI ---
gui-title-stats-editor: "<gradient:#fbbf24:#a78bfa>Edit Stats: {trait}</gradient>"
gui-back: "<gradient:#38bdf8:#22d3ee>← Back</gradient>"
gui-back-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Return to the previous editor view.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Your unsaved edits are kept.</gradient>"
gui-add-stat: "<gradient:#22c55e:#14b8a6>+ Add Stat</gradient>"
gui-add-stat-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Add a stat modifier through chat input.</gradient>"
  - ""
  - "<gradient:#60a5fa:#a78bfa>Format: <name> <value></gradient>"
  - "<gradient:#60a5fa:#a78bfa>Example: attack_damage 3</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to add stat</gradient>"
gui-stat-value: "<gradient:#60a5fa:#a78bfa>Value: {value}</gradient>"
gui-stat-edit: "<gradient:#38bdf8:#22d3ee>▶ Left-click to change value</gradient>"
gui-stat-delete: "<gradient:#ef4444:#f97316>▶ Right-click to remove</gradient>"
gui-stat-item-title: "<gradient:#fbbf24:#a78bfa>{stat}</gradient>"

# --- Effect Editor GUI ---
gui-title-effect-editor: "<gradient:#fbbf24:#a78bfa>Edit Effects: {trait}</gradient>"
gui-title-effect-detail: "<gradient:#fbbf24:#a78bfa>Edit Effect #{index}: {trait}</gradient>"
gui-add-effect: "<gradient:#22c55e:#14b8a6>+ Add Effect</gradient>"
gui-add-effect-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Create a new effect with a trigger,</gradient>"
  - "<gradient:#60a5fa:#a78bfa>conditions, actions, and cooldown.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to add effect</gradient>"
gui-effect-trigger: "<gradient:#60a5fa:#a78bfa>Trigger: {trigger}</gradient>"
gui-effect-conditions: "<gradient:#60a5fa:#a78bfa>Conditions: {count}</gradient>"
gui-effect-actions: "<gradient:#60a5fa:#a78bfa>Actions: {count}</gradient>"
gui-effect-cooldown: "<gradient:#60a5fa:#a78bfa>Cooldown: {ticks} ticks</gradient>"
gui-effect-edit: "<gradient:#38bdf8:#22d3ee>▶ Left-click to configure</gradient>"
gui-effect-delete: "<gradient:#ef4444:#f97316>▶ Right-click to remove</gradient>"
gui-effect-detail-title: "<gradient:#fbbf24:#a78bfa>Effect #{index}</gradient>"
gui-effect-detail-trigger: "<gradient:#38bdf8:#22d3ee>Edit Trigger</gradient>"
gui-effect-detail-trigger-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Current: {trigger}</gradient>"
  - ""
  - "<gradient:#60a5fa:#a78bfa>Choose which event activates this effect.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Examples: ATTACK, KILL, TICK</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to edit trigger</gradient>"
gui-effect-detail-cooldown: "<gradient:#38bdf8:#22d3ee>Edit Cooldown</gradient>"
gui-effect-detail-cooldown-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Current: {ticks} ticks</gradient>"
  - ""
  - "<gradient:#60a5fa:#a78bfa>Set the delay between activations.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Use 0 for no cooldown.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to edit cooldown</gradient>"
gui-effect-detail-conditions: "<gradient:#38bdf8:#22d3ee>Edit Conditions</gradient>"
gui-effect-detail-conditions-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Current count: {count}</gradient>"
  - ""
  - "<gradient:#60a5fa:#a78bfa>Manage all condition checks.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>All conditions must pass.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to open condition editor</gradient>"
gui-effect-detail-actions: "<gradient:#38bdf8:#22d3ee>Edit Actions</gradient>"
gui-effect-detail-actions-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Current count: {count}</gradient>"
  - ""
  - "<gradient:#60a5fa:#a78bfa>Manage actions executed</gradient>"
  - "<gradient:#60a5fa:#a78bfa>when this effect activates.</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to open action editor</gradient>"
gui-effect-item-title: "<gradient:#fbbf24:#a78bfa>Effect #{index}</gradient>"
gui-condition-item-title: "<gradient:#fbbf24:#a78bfa>{type}</gradient>"
gui-action-item-title: "<gradient:#fbbf24:#a78bfa>{type}</gradient>"
gui-effect-trigger-unset: "Unset"
gui-title-condition-type-picker: "<gradient:#fbbf24:#a78bfa>Select Condition Type</gradient>"
gui-title-action-type-picker: "<gradient:#fbbf24:#a78bfa>Select Action Type</gradient>"
gui-type-picker-item-title: "<gradient:#fbbf24:#a78bfa>{type}</gradient>"
gui-default-trigger: "ATTACK"
gui-type-picker-select-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Type: {type}</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to select this type</gradient>"

# --- Condition Editor GUI ---
gui-title-condition-editor: "<gradient:#fbbf24:#a78bfa>Edit Conditions: {trait} # {index}</gradient>"
gui-add-condition: "<gradient:#22c55e:#14b8a6>+ Add Condition</gradient>"
gui-add-condition-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Select a condition type first,</gradient>"
  - "<gradient:#60a5fa:#a78bfa>then enter its value in chat.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Map format: key=value,key2=value2</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to add a condition</gradient>"
gui-condition-value: "<gradient:#60a5fa:#a78bfa>Value: {value}</gradient>"
gui-condition-edit: "<gradient:#38bdf8:#22d3ee>▶ Left-click to edit value</gradient>"
gui-condition-delete: "<gradient:#ef4444:#f97316>▶ Right-click to remove</gradient>"

# --- Action Editor GUI ---
gui-title-action-editor: "<gradient:#fbbf24:#a78bfa>Edit Actions: {trait} # {index}</gradient>"
gui-add-action: "<gradient:#22c55e:#14b8a6>+ Add Action</gradient>"
gui-add-action-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Select an action type first,</gradient>"
  - "<gradient:#60a5fa:#a78bfa>then enter its value in chat.</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Example scalar: 3</gradient>"
  - "<gradient:#60a5fa:#a78bfa>Example map: type=SPEED,duration=60,level=2</gradient>"
  - ""
  - "<gradient:#38bdf8:#22d3ee>Click to add an action</gradient>"
gui-action-value: "<gradient:#60a5fa:#a78bfa>Value: {value}</gradient>"
gui-action-edit: "<gradient:#38bdf8:#22d3ee>▶ Left-click to edit value</gradient>"
gui-action-delete: "<gradient:#ef4444:#f97316>▶ Right-click to remove</gradient>"

# --- Confirmation Dialog ---
gui-title-confirm: "<gradient:#f59e0b:#f97316>Confirm Action</gradient>"
gui-confirm-delete: "<gradient:#ef4444:#f97316>Delete: {trait}</gradient>"
gui-confirm-save: "<gradient:#22c55e:#14b8a6>Save: {trait}</gradient>"
gui-confirm-irreversible: "<gradient:#ef4444:#f97316>This action cannot be undone.</gradient>"
gui-confirm: "<gradient:#22c55e:#14b8a6>✔ Confirm</gradient>"
gui-confirm-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Proceed with this action.</gradient>"
gui-cancel: "<gradient:#f59e0b:#f97316>✘ Cancel</gradient>"
gui-cancel-lore:
  - ""
  - "<gradient:#60a5fa:#a78bfa>Cancel and return to the editor.</gradient>"

# --- Chat Input Prompts ---
gui-prompt-trait-name: "<gradient:#38bdf8:#22d3ee>Enter a new trait name in chat, or type cancel.</gradient>"
gui-prompt-class-name: "<gradient:#38bdf8:#22d3ee>Enter a class name to bind (or none to clear), or type cancel.</gradient>"
gui-prompt-add-stat: "<gradient:#38bdf8:#22d3ee>Enter stat and value: <name> <value> (example: attack_damage 3), or type cancel.</gradient>"
gui-prompt-edit-stat: "<gradient:#38bdf8:#22d3ee>Enter a new value for {stat}, or type cancel.</gradient>"
gui-prompt-edit-effect-trigger: "<gradient:#38bdf8:#22d3ee>Enter a trigger: ATTACK, DAMAGED, KILL, CRIT, SKILL_CAST, TICK, DEATH, RESPAWN, CROUCH, or type cancel.</gradient>"
gui-prompt-edit-effect-cooldown: "<gradient:#38bdf8:#22d3ee>Enter cooldown in ticks (example: 60), or type cancel.</gradient>"
gui-prompt-add-condition-value: "<gradient:#38bdf8:#22d3ee>Condition {type} selected. Enter its value now, or type cancel.</gradient>"
gui-prompt-edit-condition: "<gradient:#38bdf8:#22d3ee>Editing {type} (current: {value}). Enter a new value, or type cancel.</gradient>"
gui-prompt-add-action-value: "<gradient:#38bdf8:#22d3ee>Action {type} selected. Enter its value now, or type cancel.</gradient>"
gui-prompt-edit-action: "<gradient:#38bdf8:#22d3ee>Editing {type} (current: {value}). Enter a new value, or type cancel.</gradient>"
gui-chat-cancel-keyword: "cancel"
gui-chat-none-keyword: "none"
gui-chat-cancelled: "<gradient:#f59e0b:#f97316>Input cancelled.</gradient>"
gui-chat-invalid-format: "<gradient:#ef4444:#f97316>Invalid format. Use: <name> <value>.</gradient>"
gui-chat-invalid-stat-key: "<gradient:#ef4444:#f97316>Invalid stat key. Use lowercase letters, numbers, underscore, dot, or dash.</gradient>"
gui-chat-invalid-number: "<gradient:#ef4444:#f97316>Invalid number.</gradient>"
gui-chat-cooldown-clamped: "<gradient:#f59e0b:#f97316>Cooldown exceeds max value. Clamped to {max} ticks.</gradient>"
gui-chat-invalid-trigger: "<gradient:#ef4444:#f97316>Invalid trigger. Use: ATTACK, DAMAGED, KILL, CRIT, SKILL_CAST, TICK, DEATH, RESPAWN, CROUCH.</gradient>"
gui-chat-invalid-value: "<gradient:#ef4444:#f97316>Invalid value for that type.</gradient>"
gui-chat-invalid-trait-name: "<gradient:#ef4444:#f97316>Invalid trait name. Use 3-32 chars: lowercase letters, numbers, _ or -.</gradient>"
gui-chat-trait-name-taken: "<gradient:#ef4444:#f97316>A trait named {trait} already exists.</gradient>"
gui-chat-error: "<gradient:#ef4444:#f97316>Error: {message}</gradient>"
gui-editor-capacity-warning: "<gradient:#f59e0b:#f97316>Too many entries ({count}). Showing first {limit}.</gradient>"

# --- Action Messages ---
gui-trait-saved: "<gradient:#22c55e:#14b8a6>Trait '{trait}' saved.</gradient>"
gui-trait-deleted: "<gradient:#ef4444:#f97316>Trait '{trait}' deleted.</gradient>"

Data (runtime)

File Notes
playerdata.yml Created at runtime. Do not hand-edit unless you know the format.

Example shape:

<uuid>:
  trait: warrior
  enabled: true
  manual-override: false
  cooldowns: {}
  runtime-stats: {}
Field Meaning
trait Active trait id
enabled Effect procs on (/sts toggle)
manual-override Set by /sts set; protects against join class-sync when configured
cooldowns Admin trait-wide lock timestamps
runtime-stats Reserved / legacy map