Frostyh Plugins

Plugins / PracticeCore

PracticeCore Coming soon

Full practice PvP core: ranked ELO, duels, 2v2, parties, tournaments, kit editor, arena copies.

Get PracticeCore

Coming soon Not on sale yet. This page gets a buy button the day it is.

Try it live

PracticeCore runs on a public demo server, set up so you can use it yourself. Join, try it, then decide.

Address: try.zeropvp.xyz:25570 (Java Edition 1.21.11)

In Minecraft: Multiplayer, Add Server, paste the address, Join. Type /demo go practicecore to land at its booth, or right-click the compass and pick it. The world resets every night.

Overview

PracticeCore

A complete practice PvP server in one plugin: queues, ranked, duels, parties and tournaments

Everything a practice server needs, without a stack of plugins that do not know about each other. Save a kit from your inventory, walk an arena through a wizard, copy it five times with one command, and players can queue, duel, climb a ranked ladder, fight in parties and play tournaments. Every menu is a real Minecraft dialog window, and every word on it is yours to change in config.yml.

A NoDebuff duel: the action bar counts time, combo and hits, the sidebar the score.

Latest version
1.2.0
Server
Paper or Purpur, Java 21
BuiltByBit
coming soon
What changed in 1.2.0
  • New: leaderboard holograms. Stand in your lobby and run /practice hologram create <name> <kit|global> to place floating text that shows the top players of a ranked kit or the global board. It updates itself, needs no hologram plugin, and survives restarts (kept in holograms.yml).
  • New commands: /practice hologram move <name> (moves it to where you stand), /practice hologram delete <name> and /practice hologram list. All need practicecore.admin and have tab completion.
  • New config section holograms: enabled, lines (places shown), update-seconds, background (an #AARRGGBB colour) and scale (text size). The text is in the new messages hologram-title, hologram-line-top, hologram-line, hologram-empty and hologram-footer.
  • New: a setup checklist. /practice setup lists what a new server still has to do (lobby, a kit, a ready arena, an arena for every kit), with the command for each missing step one click away. Staff who join while a step is open see it once per server start, and the staff screen (/practice admin) lists the open steps too. Once everything is done it stops showing on its own.
  • New setting setup-hints (default true) turns the checklist on join off.
  • /practice help lists the new commands for staff.
  • An existing config.yml does not need the new keys: without them the defaults above are used. Add them only if you want to change a value or a text.

Features

Why server owners pick it

What makes it different

Works with

Highlights

What you get: kits and the kit editor

Arenas

Queues and ratings

Ranked queues per kit, with your rating and how many are waiting.

Duels and fights

The countdown before a duel, players frozen in place.

The match summary in chat, with each fighter's hits, combo and pots.

Parties and tournaments

Leaderboards, stats, scoreboard

Self-updating leaderboard holograms, global and per kit.

Menus

The main menu: unranked, ranked, duels, party, kit editor, leaderboards, stats, tournaments.

PlaceholderAPI

Optional. When PlaceholderAPI is installed, any scoreboard, tab or hologram plugin can show:

%practicecore_elo_<kit>%            %practicecore_division_<kit>%
%practicecore_wins_<kit>%           %practicecore_losses_<kit>%
%practicecore_ranked_wins_<kit>%    %practicecore_ranked_losses_<kit>%
%practicecore_streak_<kit>%         %practicecore_best_streak_<kit>%
%practicecore_position_<kit>%       %practicecore_global_elo%   %practicecore_global_division%
%practicecore_total_wins%           %practicecore_total_losses%
%practicecore_lb_<kit|global>_<place>_<name|elo|wins|losses|division>%
%practicecore_status%               %practicecore_queue_kit%    %practicecore_queue_type%   %practicecore_queue_time%
%practicecore_match_kit%            %practicecore_match_opponent%   %practicecore_match_score%
%practicecore_match_time%           %practicecore_match_combo%  %practicecore_match_hits%
%practicecore_party_size%           %practicecore_party_leader%
%practicecore_queued_total%         %practicecore_fighting_total%
%practicecore_queued_<kit>%         %practicecore_fighting_<kit>%
%practicecore_event_state%          %practicecore_event_kit%    %practicecore_event_players%
%practicecore_event_round%          %practicecore_event_seconds%

The built-in sidebar reads PlaceholderAPI placeholders of other plugins too.

FAQ

Which servers does it run on?

Paper or Purpur 1.21.11 or a newer 1.21.x, with Java 21.

Do I need other plugins?

No. PlaceholderAPI is optional, and SQLite is built in.

Is there DRM or a licence key?

No. There is nothing to activate and no licence server to reach, and the code is not obfuscated.

How long does setup take?

Drop the jar into /plugins and restart. The setup guide above has 6 short steps.

Can I try it before I buy?

Yes. This page has a test server with the plugin installed.

Where do I get help?

In the active support Discord, in the discussion tab on this page, or in the documentation.

Do I need a hologram plugin for leaderboards?

No. /practice hologram create places self-updating leaderboard holograms on its own.

Updates

Released on October 14, 2026 and updated once since. The latest version is v1.2.0 (October 16, 2026). Every update is free, new Minecraft versions included.

Also by Frostyh

If this plugin helps your server, a short review on this page would mean a lot. Thank you!

Installation

Requirements

Server software
Paper, or a Paper fork such as Purpur. Spigot and CraftBukkit are not supported: the plugin uses Paper-only APIs.
Minecraft version
plugin.yml api-version 1.21; built against Paper API 1.21.11
Java
21 or newer
Required plugins
none
Optional plugins
PlaceholderAPI
Libraries
org.xerial:sqlite-jdbc:3.53.2.1, downloaded by the server at startup (plugin.yml libraries)

Steps

  1. Download PracticeCore.jar from BuiltByBit. There is no licence key to enter.
  2. Stop the server and put the jar into the plugins folder.
  3. Start the server. The plugin creates plugins/PracticeCore/config.yml with the defaults shown under Configuration.
  4. Edit config.yml to suit your server.
  5. Apply the changes with /practice reload, or restart the server.

Setup guide

  1. Drop PracticeCore.jar into /plugins and restart. (PlaceholderAPI is optional.)
  2. Stand in your lobby and run /practice setlobby.
  3. Put a kit in your inventory (armour on, offhand set, potion effects if you want them) and run /practice kit create nodebuff.
  4. Build an arena, run /practice arena setup arena1, and press Spawn 1, Spawn 2 and Auto box where you stand.
  5. Optional: /practice arena copy arena1 5 for five more, and kit rules and arena tags in /practice admin.
  6. Players right-click the hotbar items, or use /queue, /ranked, /duel, /party and /event.

Commands

From plugin.yml. "Not set" in the permission column means plugin.yml attaches no permission to the command itself; the nodes the plugin checks are listed under Permissions.

CommandAliasesUsageDescriptionPermission
/practice/prac, /pc/practice [help|admin|setup|kit|arena|hologram|setlobby|lobby|reload|refresh|end|elo|season]The practice menu, and the staff tools behind it.not set
/duelnone/duel <player> [kit] [rounds] [arena] | /duel accept|decline [player]Challenge a player, or answer a challenge.not set
/queuenone/queue [kit] [unranked|ranked]Join a queue.not set
/rankednone/ranked [kit]The ranked queues.not set
/unrankednone/unranked [kit]The unranked queues.not set
/leavenone/leaveLeave your queue, your fight or the fight you are watching.not set
/spectate/spec/spectate [player]Watch a fight.not set
/leaderboard/lb, /leaderboards/leaderboard [kit]The leaderboards.not set
/statsnone/stats [player]Ratings and records.not set
/history/matches/history [player]Recent fights.not set
/kiteditor/editkit, /layout/kiteditor [kit]Arrange your kits.not set
/partynone/party [create|invite|join|leave|kick|disband|chat|split|ffa|duel|info]Parties and party fights.not set
/event/tournament, /events/event [join|leave|status|host <kit>|start|cancel]Tournaments. Join, leave and watch; staff host, start and cancel.not set
/matchinv/matchinventory, /minv/matchinv <id>Open a fighter's inventory from the end of a fight.not set
/settings/practicesettings/settingsYour own switches, such as duel requests and the scoreboard.not set

Subcommands in detail

Players:

/practice                         The main menu (aliases /prac, /pc).
/queue [kit] [unranked|ranked]    Join a queue, or open the queue screen.
/ranked [kit]  /unranked [kit]    The ranked and unranked queues.
/duel <player> [kit] [rounds] [arena]   Challenge somebody (no kit: the duel screen).
/duel accept|decline [player]     Answer a challenge.
/leave                            Leave your queue, fight, audience or tournament.
/spectate [player]                Watch a fight (alias /spec).
/kiteditor [kit]                  Arrange your kits (aliases /editkit, /layout).
/leaderboard [kit]                Leaderboards (aliases /lb, /leaderboards).
/stats [player]                   Ratings and records.
/history [player]                 Recent fights (alias /matches).
/matchinv <id>                    A fighter's inventory after a fight.
/settings                         Duel requests and the scoreboard on or off.
/event [join|leave|status]        Tournaments (alias /tournament).
/party create|invite|join|leave|kick|disband|chat|split|ffa|duel|queue|info
/practice setup                           What is still missing, with one-click fixes.
/practice hologram create <name> <kit|global> · move · delete · list

Staff:

/practice admin                   The staff screens: kits, arenas, lobby, reload.
/practice setlobby | lobby        Set or visit the lobby spawn.
/practice kit create <kit> [player]       Save an inventory as a kit.
/practice kit items <kit> [player]        Replace a kit's items.
/practice kit load <kit>                  Put the kit on yourself to change it.
/practice kit set <kit> <rule> true|false ranked, unranked, build, hunger, regen, water-kills, fall-damage
/practice kit tags|icon|display|edit|delete|list ...
/practice arena setup <arena>             Create it if needed and open the wizard.
/practice arena spawn1|spawn2|corner1|corner2 <arena> [x y z [yaw pitch] [world]]
/practice arena autobox|tags|enable|disable|tp|info|delete|list ...
/practice arena copy <arena> <count>      Paste copies and register them.
/practice arena removecopies <arena>      Remove the copies, blocks included.
/event host <kit> | start | cancel        Run a tournament.
/practice end <player>                    End a fight with no winner.
/practice elo <player> <kit|all> <value|reset>
/practice season reset confirm            A new ranked season.
/practice refresh | reload

Every staff command except the menus also works from the console.

Permissions

From plugin.yml.

NodeDefaultDescriptionChildren
practicecore.event.hostoperatorsHost, start early and cancel tournaments.none
practicecore.event.joineveryoneJoin tournaments and hear about them.none
practicecore.duel.bypassoperatorsSend duel requests to players who switched them off.none
practicecore.adminoperatorsKits, arenas, the lobby, reload, ending fights and setting ratings.none
practicecore.dueleveryoneSend duel requests.none
practicecore.rankedeveryoneJoin ranked queues.none
practicecore.ranked.bypassoperatorsJoin ranked without the unranked wins the config may ask for.none
practicecore.partyeveryoneCreate and join parties.none
practicecore.spectateeveryoneWatch fights.none
practicecore.spectate.silentoperatorsWatch a fight without the fighters being told.none
practicecore.bypass.commandsoperatorsUse any command during a fight.none

Placeholders

Registered with PlaceholderAPI under the identifier practicecore. PlaceholderAPI must be installed for these to work.

These work in any scoreboard, tab or hologram plugin. Kit names never contain an underscore, so the parts split cleanly.

PlaceholderValue
%practicecore_elo_<kit>%, %practicecore_division_<kit>%Rating and division in a kit.
%practicecore_wins_<kit>%, %practicecore_losses_<kit>%All wins and losses in a kit.
%practicecore_ranked_wins_<kit>%, %practicecore_ranked_losses_<kit>%Ranked only.
%practicecore_streak_<kit>%, %practicecore_best_streak_<kit>%Win streaks.
%practicecore_position_<kit>%Place on the kit's leaderboard (0 when not on it).
%practicecore_global_elo%, %practicecore_global_division%The average over ranked kits.
%practicecore_total_wins%, %practicecore_total_losses%Over every kit.
%practicecore_lb_<kit|global>_<place>_<name|elo|wins|losses|division>%Leaderboard rows.
%practicecore_status%Lobby, queued, fighting or spectating.
%practicecore_queue_kit%, %practicecore_queue_type%, %practicecore_queue_time%The player's queue.
%practicecore_match_kit%, %practicecore_match_opponent%, %practicecore_match_score%, %practicecore_match_time%, %practicecore_match_combo%, %practicecore_match_hits%The player's fight.
%practicecore_party_size%, %practicecore_party_leader%The player's party.
%practicecore_queued_total%, %practicecore_fighting_total%Server-wide counts.
%practicecore_queued_<kit>%, %practicecore_fighting_<kit>%Per kit.
%practicecore_event_state%, %practicecore_event_kit%, %practicecore_event_players%, %practicecore_event_round%, %practicecore_event_seconds%The current tournament.

With PlaceholderAPI installed, it fills in placeholders from other plugins inside its own text.

Configuration reference

The default files as they ship in the jar, with their comments. The plugin writes them to plugins/PracticeCore/ on first start.

config.yml

Top-level keys:

KeyDefaultComment above it
lobbysection, 2 keysWhere players wait between fights. Set the spawn with /practice setlobby.
hotbarsection, 8 keysThe items players hold in the lobby. Right click runs the action. The hotbar empties the inventory before it hands the items out, so it only runs in the lobby: the worlds listed under worlds, or the lobby spawn's world when that list is empty. With no...
matchsection, 13 keysnone
arenasection, 4 keysnone
queuesection, 6 keysnone
duelsection, 3 keysnone
partysection, 4 keysnone
elosection, 3 keysnone
divisionslist of 6Names for rating bands, shown in menus and as %practicecore_division_<kit>%. Lowest first.
leaderboardsection, 2 keysnone
hologramssection, 5 keysLeaderboard holograms: floating text in your lobby that shows a board and keeps itself current. Stand where it should go and run /practice hologram create <name> <kit|global>. They are drawn with Minecraft's own text displays, so no hologram plugin is...
setup-hintstrueStaff who join while the server is not set up yet (no lobby, no kit, no ready arena, or a kit with no arena) see a checklist with the command for each missing step, once per server start. It stops on its own when everything is done. /practice setup shows...
historysection, 2 keysnone
spectatesection, 1 keynone
eventsection, 6 keysTournaments: /event host <kit> (or the Events screen), players join while sign-up is open, then a single-elimination bracket plays itself out. A sumo kit makes a sumo event.
scoreboardsection, 5 keysThe built-in sidebar. Switch it off if a scoreboard plugin draws yours (every number here is also a %practicecore_...% placeholder). Players can hide it for themselves in /settings. It gives each player a scoreboard of their own, which replaces team...
themesection, 12 keysEvery message below is written against these names, not against hex codes: <accent>Open</accent> rather than <#ff4f8b>Open</#ff4f8b>. Change a colour here and it changes everywhere at once.
messagessection, 543 keysnone
plugins/PracticeCore/config.yml
# PracticeCore: kits, arenas, duels, ranked and unranked queues, ratings, leaderboards and parties.
#
# Quick start (the whole thing is also in /practice admin as menus):
#   1. Stand in your lobby:                    /practice setlobby
#   2. Put a kit in your inventory:            /practice kit create nodebuff
#   3. Build an arena and walk the wizard:     /practice arena setup arena1
#   4. Players right-click the hotbar items, or use /queue, /ranked, /duel, /party.
#   5. Optional, a leaderboard in the lobby:   /practice hologram create top global
# /practice setup shows which of these steps are still missing.
#
# Text is MiniMessage (<red>, <bold>, <gradient:#hex:#hex>, <click:...>, ...). Messages are written
# against the theme colours (<accent>, <text>, <muted>, ...), so one hex in the theme block below
# re-colours every screen.
#
# Updating: keys added in a new version work straight away, even if your config.yml is older,
# because the plugin falls back to its built-in defaults for anything missing here.

# ============================================================================
#  █     ██  ███  ███  █ █
#  █    █  █ █  █ █  █ █ █
#  █    █  █ ███  ███   █
#  █    █  █ █  █ █  █  █
#  ████  ██  ███  ███   █
# ============================================================================
# Where players wait between fights. Set the spawn with /practice setlobby.
lobby:
  # Send players to the lobby spawn when they join.
  teleport-on-join: true
  # Idle players in the lobby take no damage and get no hunger. The lobby is the hotbar's worlds
  # (see hotbar.worlds), so this does nothing until a lobby exists.
  protect: true

# ============================================================================
#  █  █  ██  ███ ███   ██  ███
#  █  █ █  █  █  █  █ █  █ █  █
#  ████ █  █  █  ███  ████ ███
#  █  █ █  █  █  █  █ █  █ █ █
#  █  █  ██   █  ███  █  █ █  █
# ============================================================================
# The items players hold in the lobby. Right click runs the action.
#
# The hotbar empties the inventory before it hands the items out, so it only runs in the lobby:
# the worlds listed under worlds, or the lobby spawn's world when that list is empty. With no
# lobby and no worlds it does nothing at all, which keeps survival inventories safe on a server
# that also runs other modes.
#
# Actions: menu, unranked, ranked, duel, editor, leaderboard, party, stats, history, spectate,
#          leave-queue, party-split, party-ffa, party-leave, event, event-leave, settings,
#          or "command:<command without slash>".
# leader-only: true shows an item to the party leader only.
hotbar:
  enabled: true
  give-on-join: true
  # Staff in creative keep their own inventory.
  skip-creative: true
  worlds: []
  lobby:
    unranked:
      slot: 0
      material: IRON_SWORD
      name: "<accent>Unranked</accent> <muted>(right click)</muted>"
      lore: ["<text>Fight anybody, no rating at stake.</text>"]
      action: unranked
    ranked:
      slot: 1
      material: DIAMOND_SWORD
      name: "<accent>Ranked</accent> <muted>(right click)</muted>"
      lore: ["<text>Fight players near your rating.</text>"]
      action: ranked
    event:
      slot: 2
      material: TOTEM_OF_UNDYING
      name: "<accent>Events</accent> <muted>(right click)</muted>"
      lore: ["<text>Tournaments: join one or watch it.</text>"]
      action: event
    editor:
      slot: 4
      material: BOOK
      name: "<accent>Kit editor</accent> <muted>(right click)</muted>"
      lore: ["<text>Put every item where your hands expect it.</text>"]
      action: editor
    leaderboard:
      slot: 6
      material: NETHER_STAR
      name: "<accent>Leaderboards</accent> <muted>(right click)</muted>"
      lore: ["<text>The best players of every kit.</text>"]
      action: leaderboard
    party:
      slot: 7
      material: NAME_TAG
      name: "<accent>Party</accent> <muted>(right click)</muted>"
      lore: ["<text>Play with your friends.</text>"]
      action: party
    menu:
      slot: 8
      material: COMPASS
      name: "<accent>Practice menu</accent> <muted>(right click)</muted>"
      lore: ["<text>Duels, stats, history and spectating.</text>"]
      action: menu
  queue:
    editor:
      slot: 4
      material: BOOK
      name: "<accent>Kit editor</accent> <muted>(right click)</muted>"
      lore: ["<text>Arrange your kit while you wait.</text>"]
      action: editor
    leave:
      slot: 8
      material: RED_DYE
      name: "<bad>Leave the queue</bad> <muted>(right click)</muted>"
      lore: ["<text>Queued for {kit}.</text>"]
      action: leave-queue
  # While signed up for a tournament and waiting for the next fight.
  event:
    event:
      slot: 0
      material: TOTEM_OF_UNDYING
      name: "<accent>Tournament</accent> <muted>(right click)</muted>"
      lore: ["<text>The bracket and the fights going on.</text>"]
      action: event
    editor:
      slot: 4
      material: BOOK
      name: "<accent>Kit editor</accent> <muted>(right click)</muted>"
      lore: ["<text>Arrange your kit while you wait.</text>"]
      action: editor
    leave:
      slot: 8
      material: RED_DYE
      name: "<bad>Leave the tournament</bad> <muted>(right click)</muted>"
      lore: ["<text>Gives up your place in the bracket.</text>"]
      action: event-leave
  party:
    menu:
      slot: 0
      material: NAME_TAG
      name: "<accent>Party</accent> <muted>({party} players)</muted>"
      lore: ["<text>Members, invites and party duels.</text>"]
      action: party
    split:
      slot: 1
      material: SHEARS
      name: "<accent>Split fight</accent> <muted>(right click)</muted>"
      lore: ["<text>Two random teams out of your party.</text>"]
      action: party-split
      leader-only: true
    ffa:
      slot: 2
      material: BLAZE_POWDER
      name: "<accent>Party FFA</accent> <muted>(right click)</muted>"
      lore: ["<text>Everybody for themselves.</text>"]
      action: party-ffa
      leader-only: true
    queue:
      slot: 3
      material: IRON_SWORD
      name: "<accent>2v2 queue</accent> <muted>(right click)</muted>"
      lore: ["<text>Your party against another party of two.</text>"]
      action: party-queue
      leader-only: true
    editor:
      slot: 4
      material: BOOK
      name: "<accent>Kit editor</accent> <muted>(right click)</muted>"
      lore: ["<text>Put every item where your hands expect it.</text>"]
      action: editor
    leave:
      slot: 8
      material: RED_DYE
      name: "<bad>Leave the party</bad> <muted>(right click)</muted>"
      lore: ["<text>The next member becomes leader.</text>"]
      action: party-leave

# ============================================================================
#  █   █  ██  ███  ███ █  █ ████  ███
#  ██ ██ █  █  █  █    █  █ █    █
#  █ █ █ ████  █  █    ████ ███   ██
#  █   █ █  █  █  █    █  █ █       █
#  █   █ █  █  █   ███ █  █ ████ ███
# ============================================================================
match:
  # Seconds of countdown before each round.
  countdown: 5
  # Players cannot walk during the countdown (looking around is fine).
  freeze-countdown: true
  # Seconds between rounds of a best-of match.
  round-delay: 3
  # Seconds the result stays on screen before everybody goes home.
  end-delay: 4
  # A fight still going after this many minutes ends with no winner. 0 for no limit.
  max-minutes: 15
  # The last hit counts as the kill when it landed within this many seconds.
  kill-credit-seconds: 15
  # Players go back to the lobby spawn afterwards. Off sends them back where they stood.
  return-to-lobby: true
  # A line above the hotbar during the fight (see messages.match-actionbar).
  actionbar: true
  # Drinking a potion leaves no empty bottle in your hand.
  remove-empty-bottles: true
  # Players listed in the summary at most (team fights).
  summary-max-lines: 10
  # Commands players may use during a fight (and while spectating). Everything else is blocked,
  # except for practicecore.bypass.commands.
  allowed-commands: [leave, msg, tell, w, r, reply, party, stats, history, matchinv]
  # The inventory each fighter had left, linked by name in the summary (/matchinv <id>).
  inventories:
    enabled: true
    # How long a fight's inventories can be opened, and how many are kept at most.
    minutes: 10
    keep: 300
  # Console commands after a fight, for each winner and loser. Placeholders: {player} (the one the
  # line runs for), {winner}, {loser}, {kit}, {mode}, and {elo} (the new rating, ranked only).
  # Examples: "eco give {player} 10", "crates key give {player} vote 1".
  commands:
    win: []
    lose: []
    ranked-win: []
    ranked-lose: []

arena:
  # Spawns set from the wizard snap to the middle of the block, look straight ahead and face the
  # nearest of the eight compass directions.
  center-spawns: true
  # Explosions cannot damage an arena that is not being fought in.
  protect-idle: true
  # The box "Auto box" draws around both spawns: blocks sideways, below and above.
  auto-box:
    side: 12
    down: 6
    up: 20
  # /practice arena copy <arena> <count>: pastes the arena's box side by side and makes every copy
  # an arena of its own with the same tags. A copy only goes into empty air that touches no other
  # arena; an occupied spot is skipped.
  copies:
    # Blocks of air between two copies.
    gap: 32
    # Lay the copies out along "x" or "z".
    direction: x
    # Blocks placed per tick. Lower it if a big copy makes the server stutter.
    blocks-per-tick: 4000
    max-per-command: 20

# ============================================================================
#   ██  █  █ ████ █  █ ████  ███
#  █  █ █  █ █    █  █ █    █
#  █  █ █  █ ███  █  █ ███   ██
#  █ ██ █  █ █    █  █ █       █
#   ███  ██  ████  ██  ████ ███
# ============================================================================
queue:
  # Rounds a queue match is played to (best of). 1, 3 or 5.
  unranked-best-of: 1
  ranked-best-of: 1
  # The party queue (/party queue <kit>): a party of exactly party-size players fights the next
  # party of that size in the same kit. 2 makes it a 2v2 queue. Counts as unranked.
  party-queue: true
  party-size: 2
  # Unranked wins a player needs before ranked opens. 0 opens it straight away.
  ranked-min-unranked-wins: 0
  # How far apart two ranked ratings may be: start, plus step every so many seconds, up to max.
  ranked-range:
    start: 75
    step: 25
    every-seconds: 5
    max: 400

# ============================================================================
#  ███  █  █ ████ █     ███
#  █  █ █  █ █    █    █
#  █  █ █  █ ███  █     ██
#  █  █ █  █ █    █       █
#  ███   ██  ████ ████ ███
# ============================================================================
duel:
  # Seconds a request stays open.
  request-seconds: 60
  # The best-of choices on the duel screen and for /duel <player> <kit> <rounds>.
  rounds: [1, 3, 5]
  # Show an arena picker on the duel screen.
  arena-choice: true

# ============================================================================
#  ███   ██  ███  ███ ███ ████  ███
#  █  █ █  █ █  █  █   █  █    █
#  ███  ████ ███   █   █  ███   ██
#  █    █  █ █ █   █   █  █       █
#  █    █  █ █  █  █  ███ ████ ███
# ============================================================================
party:
  max-size: 16
  # Seconds an invite stays open.
  invite-seconds: 60
  # Best of for party split fights.
  split-best-of: 1
  # FFA spawns: "circle" spreads players round the middle of the arena (falling back to the two
  # spawns when the circle would put somebody in a wall), "spawns" alternates the two spawns.
  ffa-spawns: circle

# ============================================================================
#  ███   ██  ███ ███ █  █  ███  ███
#  █  █ █  █  █   █  ██ █ █    █
#  ███  ████  █   █  █ ██ █ ██  ██
#  █ █  █  █  █   █  █  █ █  █    █
#  █  █ █  █  █  ███ █  █  ███ ███
# ============================================================================
elo:
  # Everybody's rating in a kit before their first ranked fight.
  start: 1000
  # How much one fight can move a rating. 32 is chess's club value: higher swings faster.
  k-factor: 32
  # A rating never drops below this.
  floor: 100

# Names for rating bands, shown in menus and as %practicecore_division_<kit>%. Lowest first.
divisions:
  - {name: "Bronze", min: 0}
  - {name: "Silver", min: 900}
  - {name: "Gold", min: 1100}
  - {name: "Platinum", min: 1300}
  - {name: "Diamond", min: 1500}
  - {name: "Master", min: 1700}

leaderboard:
  # Places per board.
  size: 10
  # Seconds between refreshes from the database.
  refresh-seconds: 120

# Leaderboard holograms: floating text in your lobby that shows a board and keeps itself current.
# Stand where it should go and run /practice hologram create <name> <kit|global>. They are drawn
# with Minecraft's own text displays, so no hologram plugin is needed, and kept in holograms.yml.
# The text is hologram-title, hologram-line-top, hologram-line, hologram-empty and hologram-footer
# under messages.
holograms:
  enabled: true
  # Places shown on each hologram (the board itself holds leaderboard.size places).
  lines: 10
  # Seconds between redraws. The numbers come from the leaderboard refresh above.
  update-seconds: 5
  # The box behind the text as "#AARRGGBB" (AA is the opacity), "#00000000" for none, or "" for
  # Minecraft's default grey box.
  background: "#60000000"
  # Text size: 1.0 is normal, 1.5 is half as big again.
  scale: 1.0

# Staff who join while the server is not set up yet (no lobby, no kit, no ready arena, or a kit with
# no arena) see a checklist with the command for each missing step, once per server start. It stops
# on its own when everything is done. /practice setup shows it any time.
setup-hints: true

# ============================================================================
#  █  █ ███  ███ ███  ██  ███  █ █
#  █  █  █  █     █  █  █ █  █ █ █
#  ████  █   ██   █  █  █ ███   █
#  █  █  █     █  █  █  █ █ █   █
#  █  █ ███ ███   █   ██  █  █  █
# ============================================================================
history:
  # Fights kept per player.
  keep: 50
  # Fights shown on the /history screen (up to 20).
  show: 10

spectate:
  # Tell the fighters when somebody starts watching (practicecore.spectate.silent skips it).
  announce: true

# ============================================================================
#  ████ █   █ ████ █  █ ███  ███
#  █    █   █ █    ██ █  █  █
#  ███  █   █ ███  █ ██  █   ██
#  █     █ █  █    █  █  █     █
#  ████   █   ████ █  █  █  ███
# ============================================================================
# Tournaments: /event host <kit> (or the Events screen), players join while sign-up is open, then
# a single-elimination bracket plays itself out. A sumo kit makes a sumo event.
event:
  # Seconds the sign-up stays open. Staff can start early with /event start.
  join-seconds: 60
  min-players: 2
  max-players: 64
  # Seconds left on the sign-up at which everybody is reminded (with a [JOIN] button).
  reminders: [30, 10]
  # Rounds each tournament fight is played to.
  best-of: 1
  # Console commands for the winner. Placeholders: {player}, {kit}.
  commands:
    win: []

# ============================================================================
#   ███  ███  ██  ███  ████ ███   ██   ██  ███  ███
#  █    █    █  █ █  █ █    █  █ █  █ █  █ █  █ █  █
#   ██  █    █  █ ███  ███  ███  █  █ ████ ███  █  █
#     █ █    █  █ █ █  █    █  █ █  █ █  █ █ █  █  █
#  ███   ███  ██  █  █ ████ ███   ██  █  █ █  █ ███
# ============================================================================
# The built-in sidebar. Switch it off if a scoreboard plugin draws yours (every number here is
# also a %practicecore_...% placeholder). Players can hide it for themselves in /settings.
# It gives each player a scoreboard of their own, which replaces team colours another plugin set
# on the main scoreboard while it shows.
scoreboard:
  enabled: true
  # Worlds it shows in when the player is idle. Empty: the lobby worlds (hotbar.worlds, or the
  # lobby spawn's world). It always shows while queued, fighting, watching or in a tournament.
  worlds: []
  update-ticks: 10
  title: "<accent><bold>PRACTICE</bold></accent>"
  # Up to 15 lines each. Everywhere: {player} {online} {queued} {fighting} {elo} {division} {wins}
  # {losses} {ping}. Queue: {kit} {mode} {time} {kit-elo}. Match and spectate: {kit} {arena} {time}
  # {score} {opponent} {opponent-ping} {combo} {hits} {mode} {players} {spectators}.
  # Event: {kit} {event-players} {event-round} {event-seconds} {event-status}.
  # With PlaceholderAPI installed, %placeholders% of any plugin work too.
  lines:
    lobby:
      - "<muted><strikethrough>                    </strikethrough></muted>"
      - "<text>Online: </text><value>{online}</value>"
      - "<text>Fighting: </text><value>{fighting}</value>"
      - "<text>Queued: </text><value>{queued}</value>"
      - ""
      - "<text>Rating: </text><accent>{elo}</accent> <muted>{division}</muted>"
      - "<text>Wins: </text><good>{wins}</good> <muted>·</muted> <text>Losses: </text><bad>{losses}</bad>"
      - "<muted><strikethrough>                    </strikethrough></muted>"
    queue:
      - "<muted><strikethrough>                    </strikethrough></muted>"
      - "<text>Queue: </text><value>{kit}</value>"
      - "<text>Type: </text><value>{mode}</value>"
      - "<text>Waiting: </text><value>{time}</value>"
      - ""
      - "<text>Online: </text><value>{online}</value>"
      - "<muted><strikethrough>                    </strikethrough></muted>"
    match:
      - "<muted><strikethrough>                    </strikethrough></muted>"
      - "<text>Opponent: </text><value>{opponent}</value>"
      - "<text>Kit: </text><value>{kit}</value>"
      - "<text>Time: </text><value>{time}</value>"
      - "<text>Score: </text><value>{score}</value>"
      - ""
      - "<text>Combo: </text><accent>{combo}</accent> <muted>·</muted> <text>Hits: </text><accent>{hits}</accent>"
      - "<text>Ping: </text><value>{ping}</value> <muted>vs</muted> <value>{opponent-ping}</value>"
      - "<muted><strikethrough>                    </strikethrough></muted>"
    spectate:
      - "<muted><strikethrough>                    </strikethrough></muted>"
      - "<text>Watching</text>"
      - "<value>{players}</value>"
      - "<text>Kit: </text><value>{kit}</value>"
      - "<text>Time: </text><value>{time}</value>"
      - "<muted><strikethrough>                    </strikethrough></muted>"
    event:
      - "<muted><strikethrough>                    </strikethrough></muted>"
      - "<accent>Tournament</accent> <muted>{event-status}</muted>"
      - "<text>Kit: </text><value>{kit}</value>"
      - "<text>Players left: </text><value>{event-players}</value>"
      - "<text>Round: </text><value>{event-round}</value>"
      - "<muted><strikethrough>                    </strikethrough></muted>"

# ============================================================================
#  ███ █  █ ████ █   █ ████
#   █  █  █ █    ██ ██ █
#   █  ████ ███  █ █ █ ███
#   █  █  █ █    █   █ █
#   █  █  █ ████ █   █ ████
# ============================================================================
# Every message below is written against these names, not against hex codes: <accent>Open</accent>
# rather than <#ff4f8b>Open</#ff4f8b>. Change a colour here and it changes everywhere at once.
theme:
  accent: "#ff4f8b"     # your colour: headings and anything the player is meant to click
  accent2: "#ff9cc0"    # a lighter accent, for a second level of emphasis
  title: "#f4f7ff"      # screen titles
  text: "#c2ccdd"       # ordinary prose
  muted: "#6b7a94"      # hints, separators, anything the eye should skip
  value: "#ffffff"      # the numbers and names the player opened the screen to read
  good: "#57e08a"
  warn: "#ffc857"
  bad: "#ff6b6b"
  small-caps: false     # a garnish; whole menus in it read badly
  # Real Minecraft item pictures beside the buttons, drawn from the client's own textures: no
  # resource pack. Needs a 1.21.9 or newer client; older ones see the words only.
  item-icons: true
  # A short sound on every click, open and result.
  sounds: true

# ============================================================================
#  █   █ ████  ███  ███  ██   ███ ████  ███
#  ██ ██ █    █    █    █  █ █    █    █
#  █ █ █ ███   ██   ██  ████ █ ██ ███   ██
#  █   █ █       █    █ █  █ █  █ █       █
#  █   █ ████ ███  ███  █  █  ███ ████ ███
# ============================================================================
messages:
  prefix: "<accent><bold>Practice</bold></accent> <muted>»</muted> "

  # ---- general ----
  no-permission: "<bad>You cannot do that.</bad>"
  players-only: "<bad>Only players can do that.</bad>"
  usage: "<text>Usage: </text><value>{usage}</value>"
  reloaded: "<good>Config, kits and arenas reloaded.</good>"
  player-offline: "<bad>{player} is not online.</bad>"
  player-unknown: "<bad>Nobody called {player} has played here.</bad>"
  profile-loading: "<warn>Your stats are still loading. Try again in a second.</warn>"
  unknown-kit: "<bad>There is no kit called {kit}.</bad>"
  unknown-arena: "<bad>There is no ready arena called {arena}.</bad>"
  unknown-world: "<bad>There is no world called {world}.</bad>"
  no-kits: "<bad>There are no kits yet.</bad>"
  kit-empty: "<bad>The kit {kit} has no items yet.</bad>"
  no-arena-for-kit: "<bad>No arena is set up for {kit} yet.</bad>"
  no-free-arena: "<warn>Every arena is busy right now. Try again in a moment.</warn>"
  arena-wrong-kit: "<bad>{arena} is not an arena for {kit}.</bad>"
  busy-fighting: "<bad>You are in a fight.</bad>"
  busy-dead: "<bad>Respawn first.</bad>"
  busy-spectating: "<bad>You are watching a fight. </bad><text>/leave first.</text>"
  busy-queued: "<bad>You are in a queue. </bad><text>/leave first.</text>"
  nothing-to-leave: "<text>You are not in a queue, a fight or an audience.</text>"
  command-blocked: "<bad>You cannot use that command right now.</bad>"
  menu-error: "<bad>That did not work. </bad><text>The console has the details.</text>"
  help-player: "<text>/queue <muted>·</muted> /ranked <muted>·</muted> /duel <player> <muted>·</muted> /party <muted>·</muted> /event <muted>·</muted> /kiteditor <muted>·</muted> /leaderboard <muted>·</muted> /stats <muted>·</muted> /history <muted>·</muted> /spectate <muted>·</muted> /settings <muted>·</muted> /leave</text>"
  help-admin: "<accent>Staff</accent><br><text>/practice admin</text> <muted>the staff screens</muted><br><text>/practice kit create|items|load|delete|list|edit|set|tags|icon|display</text><br><text>/practice arena setup|create|delete|list|spawn1|spawn2|corner1|corner2|autobox|tags|enable|disable|tp|info</text><br><text>/practice arena copy <arena> <count> | removecopies <arena></text><br><text>/event host <kit> | start | cancel</text><br><text>/practice setlobby | lobby | reload | refresh | end <player> | elo <player> <kit|all> <value|reset> | season reset</text>"
  busy-event: "<bad>You are signed up for a tournament. </bad><text>/event leave first.</text>"
  duel-target-disabled: "<bad>{player} does not take duel requests.</bad>"
  settings-saved: "<good>Settings saved.</good>"
  season-confirm: "<warn>This sets every ranked rating back to the start and clears ranked wins and losses. Unranked records, layouts and history stay.</warn> <text>Run </text><value>/practice season reset confirm</value><text> to go ahead.</text>"
  season-reset: "<good>New season: {rows} ratings are back at {elo}.</good>"
  # More staff lines under help-admin (the setup checklist and the holograms).
  help-admin-more: "<text>/practice setup</text> <muted>what a new server still has to do</muted><br><text>/practice hologram create <name> <kit|global> | move <name> | delete <name> | list</text>"

  # ---- the setup checklist (/practice setup) ----
  setup-head: "<accent><bold>Setup</bold></accent> <muted>{done} of {total} done</muted>"
  setup-step-done: " <good>{n}. {step}</good> <muted>done</muted>"
  setup-step-todo: " <bad>{n}.</bad> <text>{step}</text> <click:suggest_command:'{command}'><hover:show_text:'<text>Put the command in the chat box</text>'><accent>[{label}]</accent></hover></click>"
  setup-lobby: "Set the lobby spawn where you stand"
  setup-kit: "Create a kit from your inventory"
  setup-arena: "Set up an arena: two spawns and a box"
  setup-fit: "Give every kit an arena{missing}"
  setup-fit-missing: " (no ready arena fits {kits})"
  setup-complete: "<good>Everything is set up. Players can queue now.</good> <text>Next: a leaderboard hologram with </text><value>/practice hologram create top global</value>"
  setup-join-note: "<muted>Shown to staff until setup is done. setup-hints: false in config.yml turns it off.</muted>"
  setup-panel-head: "<warn>Still to do:</warn>"
  setup-panel-line: "<bad>{n}.</bad> <text>{step}</text> <muted>{label}</muted>"

  # ---- leaderboard holograms ----
  hologram-title: "<accent><bold>{board}</bold></accent><br><muted>Ranked leaderboard</muted>"
  hologram-line-top: "<accent>#{pos}</accent> <value>{name}</value> <muted>·</muted> <accent>{elo}</accent> <muted>{division}</muted>"
  hologram-line: "<muted>#{pos}</muted> <text>{name}</text> <muted>·</muted> <value>{elo}</value>"
  hologram-empty: "<muted>Nobody has played ranked here yet.</muted>"
  # An extra line at the bottom; empty for none.
  hologram-footer: ""
  hologram-created: "<good>Hologram {name} placed here, showing {board}.</good>"
  hologram-moved: "<good>Hologram {name} moved here.</good>"
  hologram-deleted: "<text>Hologram {name} removed.</text>"
  hologram-exists: "<bad>There is already a hologram called {name}.</bad> <text>/practice hologram move {name} moves it.</text>"
  hologram-unknown: "<bad>There is no hologram called {name}.</bad>"
  hologram-board-unknown: "<bad>{board} is not a ranked kit.</bad> <text>Use a kit with a ranked queue, or global.</text>"
  hologram-list-empty: "<text>No holograms yet. </text><value>/practice hologram create <name> <kit|global></value>"
  hologram-list-line: "<value>{name}</value> <muted>·</muted> <text>{board}</text> <muted>· {world} {x}, {y}, {z}</muted>"
  hologram-off: "<warn>Holograms are switched off (holograms.enabled in config.yml), so nothing is drawn.</warn>"

  # ---- tournaments ----
  mode-event: "Tournament"
  event-hosted: "<accent><bold>Tournament!</bold></accent> <value>{host}</value><text> is hosting a </text><accent>{kit}</accent><text> tournament. Sign-up closes in {seconds}s ({max} places).</text>"
  event-join-button: "<click:run_command:'/event join'><hover:show_text:'<text>Sign up for the {kit} tournament</text>'><good><bold>[JOIN THE TOURNAMENT]</bold></good></hover></click>"
  event-reminder: "<text>The </text><accent>{kit}</accent><text> tournament starts in {seconds}s. {count} signed up.</text>"
  event-already: "<bad>A tournament is already on.</bad>"
  event-none: "<bad>There is no tournament right now.</bad>"
  event-started: "<bad>The tournament has already started.</bad>"
  event-already-in: "<text>You are already signed up.</text>"
  event-not-in: "<bad>You are not in a tournament.</bad>"
  event-in-party: "<bad>Leave your party to join the tournament.</bad>"
  event-full: "<bad>The tournament is full ({max}).</bad>"
  event-joined: "<value>{player}</value><text> joined the tournament. </text><muted>{count}/{max}</muted>"
  event-left: "<text>You left the tournament.</text>"
  event-player-left: "<value>{player}</value><text> left the tournament. </text><muted>{count} signed up</muted>"
  event-too-few: "<warn>The tournament was called off: it needs at least {min} players.</warn>"
  event-begins: "<accent><bold>The {kit} tournament begins</bold></accent> <text>with {count} players.</text>"
  event-round: "<accent>{label}</accent> <muted>· {count} players left</muted>"
  event-round-n: "Round {round}"
  event-round-semi: "Semi-finals"
  event-round-final: "The final"
  event-bye: "<text>Nobody left to draw you against in round {round}: you go straight through.</text>"
  event-fight: "<value>{a}</value> <muted>vs</muted> <value>{b}</value> <muted>· round {round}</muted>"
  event-waiting-arena: "<warn>Your tournament fight starts as soon as an arena is free.</warn>"
  event-out: "<value>{player}</value><text> is out. </text><muted>{left} left</muted>"
  event-won: "<accent><bold>{player} won the {kit} tournament!</bold></accent>"
  event-no-winner: "<warn>The tournament ended without a winner.</warn>"
  event-cancelled: "<warn>The tournament was cancelled.</warn>"
  event-cancelled-by-you: "<text>Tournament cancelled.</text>"
  event-status: "{status}"
  event-status-none: "<muted>No tournament right now.</muted>"
  event-status-joining: "<accent>{kit}</accent><text> tournament by {host}: sign-up open, {count}/{max} players, {seconds}s left.</text>"
  event-status-running: "<accent>{kit}</accent><text> tournament: round {round}, {count} players left.</text>"
  event-state-none: "<muted>none</muted>"
  event-state-joining: "<good>sign-up</good>"
  event-state-running: "<warn>running</warn>"

  # ---- inventories after a fight ----
  summary-inventories: " <muted>Inventories:</muted> {links}"
  summary-inventory-link: "<click:run_command:'/matchinv {id}'><hover:show_text:'<text>What {name} had left</text>'><accent>[{name}]</accent></hover></click>"
  matchinv-gone: "<bad>That inventory is no longer kept.</bad>"
  matchinv-title: "<accent>{player}</accent> <title>{kit}</title>"
  matchinv-health: "<bad>{health} hearts</bad>"
  matchinv-food: "<warn>{food} hunger</warn>"
  matchinv-heals: "<accent>{heals} healing left</accent>"
  matchinv-heals-lore: "<text>Health potions and soups still in the inventory.</text>"
  matchinv-effects: "<accent2>{count} effects</accent2>"
  matchinv-effect-line: "<text>{effect} {level}</text> <muted>{time}</muted>"
  matchinv-stats: "<value>Fight numbers</value>"
  matchinv-stats-lore: "<text>{damage} hearts dealt, {taken} taken</text><br><text>{hits} hits, longest combo {combo}</text><br><text>{pots} potions used</text>"

  # ---- modes and states ----
  mode-duel: "Duel"
  mode-unranked: "Unranked"
  mode-ranked: "Ranked"
  mode-party-split: "Party split"
  mode-party-ffa: "Party FFA"
  mode-party-vs: "Party duel"
  status-lobby: "<text>In the lobby</text>"
  status-queued: "<warn>Queued</warn>"
  status-fighting: "<bad>Fighting</bad>"
  status-spectating: "<accent2>Spectating</accent2>"
  state-lobby: "<good>ready</good>"
  state-busy: "<warn>busy</warn>"
  result-win: "<good>W</good>"
  result-loss: "<bad>L</bad>"
  team-1: "<bad>Red</bad>"
  team-2: "<accent2>Blue</accent2>"
  opponents-ffa: "{count} others"
  placeholder-empty-name: "<muted>---</muted>"
  placeholder-empty-value: "<muted>0</muted>"

  # ---- queues ----
  queue-joined: "<text>Queued for </text><value>{kit}</value><text> unranked. </text><muted>{waiting} waiting</muted>"
  queue-joined-ranked: "<text>Queued for </text><value>{kit}</value><text> ranked at </text><accent>{elo}</accent><text>. </text><muted>{waiting} waiting</muted>"
  queue-left: "<text>You left the {kit} queue.</text>"
  queue-already: "<text>You are already in that queue.</text>"
  queue-in-party: "<bad>Queues are for solo players. </bad><text>Leave your party or use party fights.</text>"
  queue-not-ranked: "<bad>{kit} has no ranked queue.</bad>"
  queue-not-unranked: "<bad>{kit} has no unranked queue.</bad>"
  queue-ranked-locked: "<bad>Ranked opens after {wins} unranked wins. </bad><text>You have {have}.</text>"
  queue-waiting-arena: "<warn>Opponent found, waiting for a free arena.</warn>"
  queue-joined-party: "<text>Your party is queued for </text><value>{kit}</value><text> ({size}v{size}). The leader can /leave.</text>"
  queue-party-size: "<bad>The party queue is for parties of exactly {size}.</bad>"
  queue-party-dropped: "<warn>The party changed, so it left the queue.</warn>"
  mode-team-queue: "Party queue"
  queue-actionbar: "<text>Queued </text><value>{kit}</value> <muted>·</muted> <text>{time}</text> <muted>·</muted> <text>{waiting} in queue</text>"
  queue-actionbar-ranked: "<text>Ranked </text><value>{kit}</value> <muted>·</muted> <accent>{elo}</accent> <muted>±{range}</muted> <muted>·</muted> <text>{time}</text>"

  # ---- duels ----
  duel-sent: "<text>Duel request sent to </text><value>{player}</value><text>: {kit}{rounds}{arena}.</text>"
  duel-received: "<value>{player}</value><text> wants to duel you: </text><accent>{kit}</accent><text>{rounds}{arena}. It runs out in {seconds}s.</text>"
  duel-buttons: "<click:run_command:'/duel accept {player}'><hover:show_text:'<text>Accept the duel</text>'><good><bold>[ACCEPT]</bold></good></hover></click>  <click:run_command:'/duel decline {player}'><hover:show_text:'<text>Decline it</text>'><bad><bold>[DECLINE]</bold></bad></hover></click>"
  duel-rounds: ", best of {rounds}"
  duel-arena: ", in {arena}"
  duel-self: "<bad>You cannot duel yourself.</bad>"
  duel-none: "<bad>No duel request from {player}.</bad>"
  duel-in-party: "<bad>You are in a party. </bad><text>Use /party duel for party fights.</text>"
  duel-target-in-party: "<bad>{player} is in a party.</bad>"
  duel-target-busy: "<bad>{player} is busy right now.</bad>"
  duel-failed: "<bad>The duel with {player} could not start.</bad>"
  duel-declined-target: "<text>You declined {player}'s duel.</text>"
  duel-declined-sender: "<bad>{player} declined your duel.</bad>"
  duel-expired-sender: "<text>Your duel request to {player} ran out.</text>"
  duel-expired-target: "<text>The duel request from {player} ran out.</text>"

  # ---- fights ----
  match-start: "<text>{mode} against </text><value>{opponent}</value> <muted>·</muted> <accent>{kit}</accent> <muted>·</muted> <text>{arena}</text>"
  match-start-ranked: "<text>Ranked against </text><value>{opponent}</value> <muted>({elo})</muted> <muted>·</muted> <accent>{kit}</accent> <muted>·</muted> <text>{arena}</text>"
  round-start: "<text>Round </text><value>{round}</value> <muted>·</muted> <text>score </text><value>{score}</value>"
  round-won: "<value>{team}</value><text> takes round {round}. </text><muted>{score}</muted>"
  round-draw: "<text>Nobody took that round. </text><muted>{score}</muted>"
  death-killed: "<value>{player}</value><text> died.</text>"
  death-killed-by: "<value>{player}</value><text> was killed by </text><value>{killer}</value> <muted>({health} hearts left)</muted>"
  death-void: "<value>{player}</value><text> fell out of the arena.</text>"
  death-void-by: "<value>{player}</value><text> was knocked out by </text><value>{killer}</value><text>.</text>"
  death-water: "<value>{player}</value><text> touched the water.</text>"
  death-water-by: "<value>{player}</value><text> was knocked into the water by </text><value>{killer}</value><text>.</text>"
  death-left: "<value>{player}</value><text> left the fight.</text>"
  death-left-by: "<value>{player}</value><text> left the fight against </text><value>{killer}</value><text>.</text>"
  death-quit: "<value>{player}</value><text> disconnected.</text>"
  death-quit-by: "<value>{player}</value><text> disconnected while fighting </text><value>{killer}</value><text>.</text>"
  left-match: "<text>You left the fight.</text>"
  match-time-up: "<warn>Time is up. Nobody wins.</warn>"
  match-ended-by-staff: "<warn>Staff ended this fight.</warn>"
  match-ended-by-reload: "<warn>The fight was stopped because the server is reloading.</warn>"
  match-ended: "<text>Ended the fight of {player}.</text>"
  match-actionbar: "<text>{kit}</text> <muted>·</muted> <text>{time}</text> <muted>·</muted> <text>combo </text><value>{combo}</value> <muted>·</muted> <text>hits </text><value>{hits}</value>"
  title-countdown: "<accent><bold>{seconds}</bold></accent>"
  subtitle-countdown: "<text>{kit}</text>"
  title-fight: "<good><bold>FIGHT</bold></good>"
  subtitle-fight: ""
  title-round-won: "<good><bold>ROUND WON</bold></good>"
  title-round-lost: "<bad><bold>ROUND LOST</bold></bad>"
  subtitle-round: "<text>{score}</text>"
  title-victory: "<good><bold>VICTORY</bold></good>"
  subtitle-victory: "<text>{score}</text> {elo}"
  title-defeat: "<bad><bold>DEFEAT</bold></bad>"
  subtitle-defeat: "<text>{score}</text> {elo}"
  title-draw: "<warn><bold>DRAW</bold></warn>"
  subtitle-draw: "<text>Nobody won.</text>"
  subtitle-elo: "<muted>·</muted> <accent>{change}</accent> <muted>({elo})</muted>"

  # ---- the summary after a fight ----
  summary-top: "<muted><strikethrough>                                                  </strikethrough></muted>"
  summary-header: "<accent><bold>{mode}</bold></accent> <muted>·</muted> <text>{kit}</text> <muted>·</muted> <text>{time}</text> <muted>·</muted> <muted>{arena}</muted>"
  summary-winner: "<good>Winner: </good><value>{winner}</value> <muted>({score})</muted>"
  summary-draw: "<warn>No winner</warn> <muted>({score})</muted>"
  summary-line-winner: " <good>{name}</good> <muted>»</muted> <text>{damage} hearts dealt · {hits} hits · combo {combo} · {pots} pots · {health} hearts left</text>{elo}"
  summary-line: " <bad>{name}</bad> <muted>»</muted> <text>{damage} hearts dealt · {hits} hits · combo {combo} · {pots} pots</text>{elo}"
  summary-elo: " <muted>·</muted> <accent>{change}</accent> <muted>({elo})</muted>"
  summary-actions: " <click:run_command:'/duel {opponent} {kit}'><hover:show_text:'<text>Send {opponent} the same duel again</text>'><accent><bold>[REMATCH]</bold></accent></hover></click>  <click:run_command:'/history'><hover:show_text:'<text>Your last fights</text>'><text>[HISTORY]</text></hover></click>"
  summary-actions-short: " <click:run_command:'/history'><hover:show_text:'<text>Your last fights</text>'><text>[HISTORY]</text></hover></click>  <click:run_command:'/stats'><hover:show_text:'<text>Your ratings</text>'><text>[STATS]</text></hover></click>"

  # ---- spectating ----
  spectate-start: "<text>Watching </text><value>{player}</value><text> ({kit}). </text><muted>/leave to stop.</muted>"
  spectate-stop: "<text>You stopped watching.</text>"
  spectate-joined: "<muted>{player} is watching.</muted>"
  spectate-not-fighting: "<bad>{player} is not in a fight.</bad>"

  # ---- the kit editor (a chest) ----
  editor-title: "<accent>Editing</accent> <title>{kit}</title>"
  editor-save: "<good><bold>Save layout</bold></good>"
  editor-save-lore: "<text>Every fight in {kit} uses this order.</text>"
  editor-reset: "<warn><bold>Default layout</bold></warn>"
  editor-reset-lore: "<text>Back to the kit's own order.</text>"
  editor-cancel: "<bad><bold>Cancel</bold></bad>"
  editor-cancel-lore: "<text>Close without saving.</text>"
  editor-saved: "<good>Layout saved for {kit}.</good>"
  editor-reset-done: "<text>{kit} is back to the default layout.</text>"
  editor-closed: "<muted>Closed without saving.</muted>"
  editor-cursor: "<bad>Put the item on your cursor down first.</bad>"
  editor-mismatch: "<bad>Something is missing from the layout. </bad><text>Put every item back and save again.</text>"

  # ---- parties ----
  party-help: "<text>/party create | invite <player> | join <leader> | leave | kick <player> | disband | chat <message> | split [kit] | ffa [kit] | duel <leader> [kit] | queue [kit]</text>"
  party-created: "<good>Party created. </good><text>/party invite <player></text>"
  party-already: "<bad>You are already in a party.</bad>"
  party-none: "<bad>You are not in a party.</bad>"
  party-not-leader: "<bad>Only the party leader can do that.</bad>"
  party-target-not-leader: "<bad>{player} does not lead a party.</bad>"
  party-invite-self: "<bad>You cannot invite yourself.</bad>"
  party-target-in-party: "<bad>{player} is already in a party.</bad>"
  party-full: "<bad>The party is full ({max}).</bad>"
  party-invited: "<value>{player}</value><text> was invited.</text>"
  party-invite-received: "<value>{player}</value><text> invited you to their party. It runs out in {seconds}s.</text>"
  party-invite-buttons: "<click:run_command:'/party join {player}'><hover:show_text:'<text>Join the party</text>'><good><bold>[JOIN]</bold></good></hover></click>"
  party-no-invite: "<bad>You have no invite from {player}.</bad>"
  party-joined: "<value>{player}</value><text> joined the party.</text>"
  party-left-self: "<text>You left the party.</text>"
  party-member-left: "<value>{player}</value><text> left the party.</text>"
  party-member-quit: "<value>{player}</value><text> disconnected and left the party.</text>"
  party-new-leader: "<value>{player}</value><text> leads the party now.</text>"
  party-kicked: "<value>{player}</value><text> was removed from the party.</text>"
  party-kicked-self: "<bad>You were removed from the party.</bad>"
  party-not-member: "<bad>{player} is not in your party.</bad>"
  party-disbanded: "<text>The party was disbanded.</text>"
  party-chat: "<accent>Party</accent> <value>{player}</value><muted>:</muted> <text>{message}</text>"
  party-member-offline: "<bad>Every member has to be online.</bad>"
  party-member-busy: "<bad>{player} is busy right now.</bad>"
  party-too-small: "<bad>A party fight needs at least two players.</bad>"
  party-team-name: "{leader}'s party"
  party-duel-sent: "<text>Party duel request sent to </text><value>{player}</value><text>: {kit}{rounds}.</text>"
  party-duel-received: "<value>{player}</value><text>'s party ({size}) wants to fight yours: </text><accent>{kit}</accent><text>{rounds}. It runs out in {seconds}s.</text>"

  # ---- staff ----
  lobby-set: "<good>Lobby spawn set here.</good>"
  lobby-unset: "<bad>There is no lobby yet. </bad><text>/practice setlobby</text>"
  leaderboards-refreshed: "<good>Leaderboards refreshed.</good>"
  bad-name: "<bad>Names are 1 to 24 characters: a-z, 0-9 and -. </bad><muted>({name})</muted>"
  bad-icon: "<bad>{icon} is not an item.</bad>"
  kit-created: "<good>Kit {kit} created from your inventory.</good>"
  kit-exists: "<bad>The kit {kit} exists already.</bad>"
  kit-items-saved: "<good>{kit} now has your inventory. </good><text>Saved layouts of it were reset.</text>"
  kit-loaded: "<text>You are wearing {kit}. Change it, then </text><value>/practice kit items {kit}</value><text>.</text>"
  kit-saved: "<good>{kit} saved.</good>"
  kit-deleted: "<text>Kit {kit} deleted.</text>"
  kit-no-arena: "<warn>No ready arena fits {kit} yet. Give an arena one of its tags, or clear the kit's tags.</warn>"
  kit-rule-set: "<text>{kit}: </text><value>{rule}</value><text> is now </text><value>{value}</value><text>.</text>"
  kit-tags-set: "<text>{kit} fights in arenas tagged: </text><value>{tags}</value>"
  kit-icon-set: "<text>{kit} icon: </text><value>{icon}</value>"
  kit-list-line: "<value>{kit}</value> <muted>({name})</muted> <text>{rules}</text> <muted>· arenas: {tags}</muted>"
  admin-kits-empty-chat: "<text>No kits yet. </text><value>/practice kit create <name></value>"
  admin-arenas-empty-chat: "<text>No arenas yet. </text><value>/practice arena setup <name></value>"
  arena-list-line: "<value>{arena}</value> <text>{state}</text> <muted>· tags: {tags}</muted>"
  arena-created: "<good>Arena {arena} created.</good>"
  arena-exists: "<bad>The arena {arena} exists already.</bad>"
  arena-deleted: "<text>Arena {arena} deleted.</text>"
  arena-busy: "<bad>{arena} is being fought in. Try again when the fight is over.</bad>"
  arena-point-set: "<text>{arena}: </text><value>{part}</value><text> set at {where}.</text>"
  arena-ready: "<good>{arena} is ready to fight in.</good>"
  arena-world-changed: "<warn>That point is in {world}, so the arena moved there and its other points were cleared.</warn>"
  arena-autobox: "<good>Drew the box round both spawns of {arena}.</good>"
  arena-autobox-failed: "<bad>{arena} needs both spawns first.</bad>"
  arena-tags-set: "<text>{arena} takes kits tagged: </text><value>{tags}</value>"
  arena-toggled: "<text>{arena}: {state}</text>"
  arena-no-spawn: "<bad>{arena} has no spawn yet.</bad>"
  elo-set: "<text>{player}'s {kit} rating is now </text><value>{elo}</value><text>.</text>"
  elo-reset: "<text>Reset {player}'s ratings ({kit}).</text>"
  arena-part-spawn1: "Spawn 1"
  arena-part-spawn2: "Spawn 2"
  arena-part-corner1: "Corner 1"
  arena-part-corner2: "Corner 2"
  arena-part-spawn1-outside: "spawn 1 is outside the box"
  arena-part-spawn2-outside: "spawn 2 is outside the box"
  arena-state-ready: "<good>ready</good>"
  arena-state-busy: "<warn>in use</warn>"
  arena-state-off: "<muted>switched off</muted>"
  arena-state-missing: "<bad>missing: {parts}</bad>"
  arena-state-no-world: "<bad>world {world} is not loaded</bad>"
  rule-ranked: "ranked"
  rule-unranked: "unranked"
  rule-build: "build"
  rule-hunger: "hunger"
  rule-no-regen: "no regen"
  rule-water-kills: "water kills"
  rule-no-fall: "no fall damage"
  arena-copy-of-copy: "<bad>{arena} is a copy of {source}. Copy {source} instead.</bad>"
  arena-copy-not-ready: "<bad>{arena} has to be ready (both spawns and the box) before it can be copied.</bad>"
  arena-copy-running: "<warn>Arena copies are still being built. Wait for them to finish.</warn>"
  arena-copy-count: "<bad>Copy 1 to {max} at a time.</bad>"
  arena-copy-no-space: "<bad>No empty space next to {arena} for a copy. </bad><text>Copies need clear air and must not touch another arena (arena.copies in config.yml).</text>"
  arena-copy-started: "<text>Building {count} copies of {arena} ({blocks} blocks). They switch on when done.</text>"
  arena-copy-done: "<good>{arena} is ready: a copy of {source}.</good>"
  arena-copy-none: "<text>{arena} has no copies that are free to remove.</text>"
  arena-uncopy-started: "<text>Removing {count} copies of {arena}, blocks included.</text>"
  arena-uncopy-done: "<text>Copy {arena} removed.</text>"

  # ============================================================================
  #  █   █ ████ █  █ █  █  ███
  #  ██ ██ █    ██ █ █  █ █
  #  █ █ █ ███  █ ██ █  █  ██
  #  █   █ █    █  █ █  █    █
  #  █   █ ████ █  █  ██  ███
  # ============================================================================
  # Every screen title, body line, button label and tooltip. {icon} is a kit's item picture.
  menu-close: "<white><icon:close></white><text>Close</text>"
  menu-back: "<white><icon:back></white><text>Back</text>"
  menu-back-tip: "<text>The previous screen.</text>"
  menu-no-kits: "<muted>No kits here yet.</muted>"
  menu-field-player: "<text>Player name</text>"
  menu-field-kit: "<text>Kit</text>"
  menu-field-rounds: "<text>Rounds</text>"
  menu-field-arena: "<text>Arena</text>"

  menu-hub-title: "<title>Practice</title>"
  menu-hub-body: "<value>{player}</value><text> · rating </text><accent>{elo}</accent> <muted>({division})</muted><text> · {wins} wins, {losses} losses</text><br><muted>{queued} queued · {fighting} fighting</muted>"
  menu-hub-unranked: "<white><icon:unranked></white><value>Unranked</value>"
  menu-hub-unranked-tip: "<text>Fight anybody, no rating at stake.</text>"
  menu-hub-ranked: "<white><icon:ranked></white><value>Ranked</value>"
  menu-hub-ranked-tip: "<text>Fight players near your rating.</text>"
  menu-hub-duel: "<white><icon:duel></white><value>Duel a player</value>"
  menu-hub-duel-tip: "<text>Pick somebody, a kit and the rounds.</text>"
  menu-hub-party: "<white><icon:party></white><value>Party</value>"
  menu-hub-party-tip: "<text>Play with friends: split, FFA, party duels.</text>"
  menu-hub-editor: "<white><icon:editor></white><value>Kit editor</value>"
  menu-hub-editor-tip: "<text>Arrange every kit the way you like it.</text>"
  menu-hub-leaderboard: "<white><icon:leaderboard></white><value>Leaderboards</value>"
  menu-hub-leaderboard-tip: "<text>The best players of every kit.</text>"
  menu-hub-stats: "<white><icon:stats></white><value>My stats</value>"
  menu-hub-stats-tip: "<text>Ratings and records per kit.</text>"
  menu-hub-history: "<white><icon:history></white><value>My last fights</value>"
  menu-hub-history-tip: "<text>Results, ratings and numbers.</text>"
  menu-hub-spectate: "<white><icon:spectate></white><value>Spectate</value>"
  menu-hub-spectate-tip: "<text>Watch a fight going on now.</text>"
  menu-hub-event: "<white><icon:event></white><value>Tournaments</value>"
  menu-hub-event-tip: "<text>{status}</text>"
  menu-hub-settings: "<white><icon:options></white><value>Settings</value>"
  menu-hub-settings-tip: "<text>Duel requests and the scoreboard.</text>"
  menu-hub-admin: "<white><icon:settings></white><warn>Staff</warn>"
  menu-hub-admin-tip: "<text>Kits, arenas and the lobby.</text>"

  menu-queue-title: "<title>Unranked</title>"
  menu-queue-title-ranked: "<title>Ranked</title>"
  menu-queue-intro: "<text>Pick a kit. You fight the next player who picks the same one.</text>"
  menu-queue-intro-ranked: "<text>Pick a kit. You fight somebody near your rating; the longer you wait, the wider the search.</text>"
  menu-queue-current: "<warn>Queued for {kit} ({mode}), {time}.</warn>"
  menu-queue-kit: "{icon}<value>{kit}</value> <muted>{queued} queued · {fighting} fighting</muted>"
  menu-queue-kit-ranked: "{icon}<value>{kit}</value> <accent>{elo}</accent> <muted>{queued} queued</muted>"
  menu-queue-kit-tip: "<text>Join the {kit} queue.</text>"
  menu-queue-kit-tip-ranked: "<text>Your {kit} rating: {elo} ({division}).</text>"
  menu-queue-leave: "<white><icon:leave></white><bad>Leave the queue</bad>"
  menu-queue-leave-tip: "<text>Stop searching.</text>"

  menu-duel-pick-title: "<title>Duel</title>"
  menu-duel-pick-intro: "<text>Pick a player, or type a name.</text>"
  menu-duel-pick-none: "<muted>Nobody else is free right now.</muted>"
  menu-duel-pick-player: "<white><icon:player></white><value>{player}</value>"
  menu-duel-pick-player-tip: "<text>Set up a duel with {player}.</text>"
  menu-duel-pick-next: "<white><icon:next></white><value>Next</value>"
  menu-duel-pick-next-tip: "<text>Duel the player named above.</text>"
  menu-duel-title: "<title>Duel {player}</title>"
  menu-duel-intro: "<text>Pick the kit and how many rounds, then send it. {player} gets a message to accept.</text>"
  menu-duel-round-one: "One round"
  menu-duel-round-many: "Best of {rounds}"
  menu-duel-arena-random: "Any arena"
  menu-duel-send: "<white><icon:duel></white><good>Send the request</good>"
  menu-duel-send-tip: "<text>{player} has a minute to accept.</text>"
  menu-party-duel-title: "<title>Party duel</title>"
  menu-party-duel-intro: "<text>Your party against {player}'s party. Pick the kit and the rounds.</text>"

  menu-editor-title: "<title>Kit editor</title>"
  menu-editor-intro: "<text>Pick a kit, drag the items where you want them, and press Save. Every fight in that kit uses your order.</text>"
  menu-editor-kit: "{icon}<value>{kit}</value> <muted>{state}</muted>"
  menu-editor-kit-tip: "<text>Arrange {kit}.</text>"
  menu-editor-own: "your layout"
  menu-editor-default: "default"

  menu-lb-title: "<title>Leaderboards</title>"
  menu-lb-head: "<accent>{board}</accent>"
  menu-lb-global: "Global"
  menu-lb-line-top: "<accent>#{pos}</accent> <value>{name}</value> <muted>·</muted> <accent>{elo}</accent> <muted>{division} · {wins}W {losses}L</muted>"
  menu-lb-line: "<muted>#{pos}</muted> <text>{name}</text> <muted>·</muted> <value>{elo}</value> <muted>{division} · {wins}W {losses}L</muted>"
  menu-lb-empty: "<muted>Nobody has played ranked here yet.</muted>"
  menu-lb-you: "<text>You are </text><accent>#{pos}</accent><text> on this board.</text>"
  menu-lb-pick: "{icon}<text>{board}</text>"
  menu-lb-pick-current: "{icon}<accent>{board}</accent>"
  menu-lb-pick-tip: "<text>Show this board.</text>"

  menu-stats-title: "<title>{player}</title>"
  menu-stats-head: "<value>{player}</value><text> · rating </text><accent>{elo}</accent> <muted>({division})</muted><br><text>{wins} wins, {losses} losses, {rate}% won</text>"
  menu-stats-kit: "<value>{kit}</value> <accent>{elo}</accent> <muted>{division}</muted> <text>· ranked {rwins}W {rlosses}L · unranked {wins}W {losses}L · streak {streak} (best {best})</text>"
  menu-stats-empty: "<muted>No fights yet.</muted>"
  menu-stats-history: "<white><icon:history></white><value>Last fights</value>"
  menu-stats-history-tip: "<text>Results, ratings and numbers.</text>"

  menu-history-title: "<title>{player}: last fights</title>"
  menu-history-head: "<text>Newest first.</text>"
  menu-history-line: "{result} <value>{opponent}</value> <muted>·</muted> <text>{kit}</text> <muted>{mode} {score}</muted>{elo} <muted>· {damage} hearts, {hits} hits, combo {combo}, {pots} pots · {time} · {ago} ago</muted>"
  menu-history-elo: " <accent>{change}</accent>"
  menu-history-empty: "<muted>No fights yet.</muted>"
  menu-history-stats: "<white><icon:stats></white><value>Stats</value>"
  menu-history-stats-tip: "<text>Ratings and records per kit.</text>"

  menu-party-title: "<title>Party</title>"
  menu-party-none: "<text>You are not in a party. Make one, or join one you were invited to.</text>"
  menu-party-create: "<white><icon:party></white><good>Create a party</good>"
  menu-party-create-tip: "<text>You lead it and start its fights.</text>"
  menu-party-join: "<white><icon:invite></white><good>Join {player}</good>"
  menu-party-join-tip: "<text>{player} invited you.</text>"
  menu-party-head: "<text>Leader </text><value>{leader}</value> <muted>· {size}/{max} players</muted>"
  menu-party-member-leader: "<accent>{player}</accent> <muted>leader · {state}</muted>"
  menu-party-member: "<value>{player}</value> <muted>{state}</muted>"
  menu-party-member-note: "<muted>The leader starts the fights.</muted>"
  menu-party-invite: "<white><icon:invite></white><value>Invite</value>"
  menu-party-invite-tip: "<text>Invite the player named above.</text>"
  menu-party-split: "<white><icon:split></white><value>Split fight</value>"
  menu-party-split-tip: "<text>Two random teams out of the party.</text>"
  menu-party-split-title: "<title>Split fight: pick a kit</title>"
  menu-party-ffa: "<white><icon:ffa></white><value>FFA</value>"
  menu-party-ffa-tip: "<text>Everybody for themselves.</text>"
  menu-party-ffa-title: "<title>Party FFA: pick a kit</title>"
  menu-party-queue: "<white><icon:queue></white><value>{size}v{size} queue</value>"
  menu-party-queue-tip: "<text>Fight the next party of {size} that queues.</text>"
  menu-party-queue-title: "<title>{size}v{size} queue: pick a kit</title>"
  menu-party-duel: "<white><icon:duel></white><value>Duel a party</value>"
  menu-party-duel-tip: "<text>Challenge the party led by the player named above.</text>"
  menu-party-kick: "<white><icon:delete></white><bad>Kick</bad>"
  menu-party-kick-tip: "<text>Remove the player named above.</text>"
  menu-party-disband: "<white><icon:close></white><bad>Disband</bad>"
  menu-party-disband-tip: "<text>Ends the party for everybody.</text>"
  menu-party-leave: "<white><icon:leave></white><bad>Leave</bad>"
  menu-party-leave-tip: "<text>Leave the party.</text>"
  menu-kit-pick: "{icon}<value>{kit}</value>"
  menu-kit-pick-tip: "<text>Fight in {kit}.</text>"

  menu-event-title: "<title>Tournaments</title>"
  menu-event-intro: "<text>One kit, one bracket, one winner. Lose once and you are out.</text>"
  menu-event-join: "<white><icon:join></white><good>Join</good>"
  menu-event-join-tip: "<text>Sign up for this tournament.</text>"
  menu-event-leave: "<white><icon:leave></white><bad>Leave</bad>"
  menu-event-leave-tip: "<text>Give up your place.</text>"
  menu-event-watch: "<white><icon:spectate></white><value>{players}</value>"
  menu-event-watch-tip: "<text>Watch this tournament fight.</text>"
  menu-event-host: "<white><icon:event></white><good>Host a tournament</good>"
  menu-event-host-tip: "<text>Opens sign-up for everybody in the kit above.</text>"
  menu-event-start: "<white><icon:next></white><good>Start now</good>"
  menu-event-start-tip: "<text>Close sign-up and draw the bracket.</text>"
  menu-event-cancel: "<white><icon:close></white><bad>Cancel</bad>"
  menu-event-cancel-tip: "<text>Ends the tournament; fights going on end with no winner.</text>"

  menu-settings-title: "<title>Settings</title>"
  menu-settings-intro: "<text>Your own switches. They are kept between visits.</text>"
  menu-settings-duels: "<text>Take duel requests</text>"
  menu-settings-board: "<text>Show the scoreboard</text>"
  menu-settings-save: "<white><icon:save></white><good>Save</good>"
  menu-settings-save-tip: "<text>Keeps the switches above.</text>"

  menu-spectate-title: "<title>Spectate</title>"
  menu-spectate-intro: "<text>Fights going on now. </text><muted>/leave stops watching.</muted>"
  menu-spectate-empty: "<muted>Nobody is fighting right now.</muted>"
  menu-spectate-match: "{icon}<value>{players}</value> <muted>{kit}</muted>"
  menu-spectate-match-tip: "<text>{kit} in {arena}, {time} in.</text>"
  menu-spectate-vs: " vs "

  admin-panel-title: "<title>PracticeCore staff</title>"
  admin-panel-body: "<text>{kits} kits · {arenas} arenas ({ready} ready) · {fights} fights now</text><br><text>Lobby: </text>{lobby}"
  admin-lobby-set: "<good>set in {world}</good>"
  admin-lobby-unset: "<bad>not set</bad>"
  admin-kits: "<white><icon:kits></white><value>Kits</value>"
  admin-kits-tip: "<text>Make kits and set their rules.</text>"
  admin-arenas: "<white><icon:arenas></white><value>Arenas</value>"
  admin-arenas-tip: "<text>Spawns, boxes and tags.</text>"
  admin-setlobby: "<white><icon:lobby></white><value>Set the lobby here</value>"
  admin-setlobby-tip: "<text>Players come back here after a fight.</text>"
  admin-reload: "<white><icon:reload></white><value>Reload</value>"
  admin-reload-tip: "<text>Re-read config.yml, kits.yml and arenas.yml.</text>"
  admin-player-menu: "<white><icon:player></white><value>Player menu</value>"
  admin-player-menu-tip: "<text>What players see.</text>"
  admin-any: "any"
  admin-any-kit: "any kit"
  admin-none: "none"

  admin-kits-title: "<title>Kits</title>"
  admin-kits-intro: "<text>A kit is whatever you carry when you create it: items, armour, offhand and your potion effects.</text>"
  admin-kits-line: "<value>{kit}</value> <muted>({name})</muted> <text>{rules}</text> <muted>· arenas: {tags}</muted>"
  admin-kits-empty: "<muted>No kits yet. Fill your inventory, type a name and press Create.</muted>"
  admin-kits-open: "{icon}<value>{kit}</value>"
  admin-kits-open-tip: "<text>Rules, items and arena tags.</text>"
  admin-field-new-kit: "<text>New kit name (a-z, 0-9, -)</text>"
  admin-kits-create: "<white><icon:save></white><good>Create from my inventory</good>"
  admin-kits-create-tip: "<text>Saves what you carry as the new kit.</text>"
  admin-kit-title: "<title>Kit: {kit}</title>"
  admin-kit-head: "<value>{kit}</value> <muted>({name})</muted><text> · {items} items · {effects} effects · icon {icon} · {arenas} arenas fit</text>"
  admin-field-display: "<text>Display name (MiniMessage)</text>"
  admin-field-icon: "<text>Icon (an item name)</text>"
  admin-field-tags: "<text>Arena tags, comma separated (empty: any arena)</text>"
  admin-field-ranked: "<text>Ranked queue</text>"
  admin-field-unranked: "<text>Unranked queue</text>"
  admin-field-build: "<text>Building (placed blocks are removed after)</text>"
  admin-field-hunger: "<text>Hunger</text>"
  admin-field-regen: "<text>Natural regeneration</text>"
  admin-field-water: "<text>Touching water loses the round (sumo)</text>"
  admin-field-fall: "<text>Fall damage</text>"
  admin-kit-save: "<white><icon:save></white><good>Save</good>"
  admin-kit-save-tip: "<text>Saves the name, icon, tags and rules above.</text>"
  admin-kit-items: "<white><icon:items></white><value>Use my inventory</value>"
  admin-kit-items-tip: "<text>Replaces the kit's items with what you carry. Saved layouts reset.</text>"
  admin-kit-load: "<white><icon:kit></white><value>Give me the kit</value>"
  admin-kit-load-tip: "<text>Puts the kit on you to change it. Your inventory is replaced.</text>"
  admin-kit-delete: "<white><icon:delete></white><bad>Delete</bad>"
  admin-kit-delete-tip: "<text>Asks first.</text>"
  admin-confirm-title: "<title>Are you sure?</title>"
  admin-confirm-kit: "<text>Delete the kit </text><value>{kit}</value><text> and every layout of it? Ratings stay.</text>"
  admin-confirm-arena: "<text>Delete the arena </text><value>{arena}</value><text>?</text>"
  admin-confirm-yes: "<white><icon:delete></white><bad>Yes, delete</bad>"
  admin-confirm-no: "<white><icon:back></white><text>No</text>"

  admin-arenas-title: "<title>Arenas</title>"
  admin-arenas-intro: "<text>An arena is two spawns and a box. One fight at a time; build several copies for busy kits.</text>"
  admin-arenas-line: "<value>{arena}</value> <text>{state}</text> <muted>· tags: {tags}</muted>"
  admin-arenas-empty: "<muted>No arenas yet. Type a name and press Create.</muted>"
  admin-arenas-open: "<white><icon:arena></white><value>{arena}</value>"
  admin-arenas-open-tip: "<text>Open the setup wizard.</text>"
  admin-field-new-arena: "<text>New arena name (a-z, 0-9, -)</text>"
  admin-arenas-create: "<white><icon:save></white><good>Create</good>"
  admin-arenas-create-tip: "<text>Makes the arena and opens its wizard.</text>"
  admin-field-arena-tags: "<text>Tags, comma separated (empty: every kit)</text>"

  wizard-title: "<title>Arena: {arena}</title>"
  wizard-head: "<value>{arena}</value> <text>{state}</text>"
  wizard-step-done: "<good>{n}. {part}</good> <muted>{where}</muted>"
  wizard-step-missing: "<bad>{n}. {part}</bad> <muted>not set</muted>"
  wizard-box: "<text>Box: {x} x {y} x {z} blocks.</text>"
  wizard-warn-spawn1-outside: "<warn>Spawn 1 is outside the box.</warn>"
  wizard-warn-spawn2-outside: "<warn>Spawn 2 is outside the box.</warn>"
  wizard-tags: "<text>Takes kits tagged: </text><value>{tags}</value>"
  wizard-hint: "<muted>Stand on each spot and press its button. The box should hold the whole fight, with air above it. Auto box draws one round the spawns.</muted>"
  wizard-done: "<good>Ready. Players can fight here now.</good>"
  wizard-spawn1: "<white><icon:spawn></white><value>1. Spawn 1 here</value>"
  wizard-spawn1-tip: "<text>Where the first player (or team) starts, facing the way you face.</text>"
  wizard-spawn2: "<white><icon:spawn></white><value>2. Spawn 2 here</value>"
  wizard-spawn2-tip: "<text>Where the second player (or team) starts.</text>"
  wizard-corner1: "<white><icon:corner></white><value>3. Corner 1 here</value>"
  wizard-corner1-tip: "<text>One corner of the box, low down.</text>"
  wizard-corner2: "<white><icon:corner></white><value>4. Corner 2 here</value>"
  wizard-corner2-tip: "<text>The opposite corner, high up.</text>"
  wizard-autobox: "<white><icon:auto></white><value>Auto box</value>"
  wizard-autobox-tip: "<text>Draws corners 1 and 2 round both spawns (arena.auto-box in config.yml).</text>"
  wizard-save-tags: "<white><icon:tag></white><value>Save tags</value>"
  wizard-save-tags-tip: "<text>Kits with one of these tags may use this arena.</text>"
  wizard-enable: "<white><icon:on></white><good>Switch on</good>"
  wizard-disable: "<white><icon:off></white><warn>Switch off</warn>"
  wizard-toggle-tip: "<text>A switched-off arena gets no new fights.</text>"
  wizard-teleport: "<white><icon:teleport></white><value>Go to spawn 1</value>"
  wizard-teleport-tip: "<text>Teleports you there.</text>"
  wizard-is-copy: "<muted>A copy of {source}, made by the plugin.</muted>"
  wizard-copy: "<white><icon:copy></white><value>Make a copy</value>"
  wizard-copy-tip: "<text>Pastes this arena next to itself as a new arena with the same tags. It has {count} copies now.</text>"
  wizard-delete: "<white><icon:delete></white><bad>Delete</bad>"
  wizard-delete-tip: "<text>Asks first.</text>"

FAQ

Which servers and versions does it run on?

It needs Paper or a Paper fork such as Purpur, because it uses Paper-only APIs (the dialog API for its menus, Adventure text components). Spigot and CraftBukkit are not supported. plugin.yml declares api-version 1.21, the jar is built against Paper API 1.21.11, and it needs Java 21 or newer.

Does it need other plugins?

No other plugin is required (plugin.yml has no hard dependencies). Optional: PlaceholderAPI (plugin.yml softdepend), used when present. The server downloads org.xerial:sqlite-jdbc:3.53.2.1 at startup, so it needs internet access on first start.

How do I apply config changes?

Edit plugins/PracticeCore/config.yml and run /practice reload. A restart works too.

Does it run on Folia, or for Bedrock players?

Not tested on Folia, and plugin.yml does not declare folia-supported. Bedrock players (through Geyser) have not been tested either.

What licence do I get?

The licence terms are the BuiltByBit EULA shown on the listing. There is no licence key to enter, and the plugin never contacts a licence server.