Skip to content
RitomasssCommunity
Product documentation

EventPractice Documentation

EventPractice is a full-scale practice infrastructure plugin. The local source checkout is version 2.6.9, compiles with Java 21 bytecode release, and references Paper API 26.3 build 211. Its plugin descriptor declares API baseline 1.21, requires WorldEdit and declares Folia support. These source metadata do not establish the exact Minecraft server releases supported by a published binary. Core systems include WorldEdit-based automatic arena cloning, menu-based player events, unranked/ranked queue with live occupancy badges, per-mode ELO, shared/private FFA, TrainingBot bot duels, lobby spawn management, personal kits and kitroom, ticket economy, kill cosmetics, visual replay and SQLite/MySQL storage. This documentation walks you through setting up every system from scratch.

2.6.9Local source version
Java 21Bytecode release
Paper API 26.3 / 211Build dependency
WorldEditRequired dependency

Overview#

Product purpose, target audience, main systems and dependencies. Read this page before starting installation.

Quick links: Installation → First Setup → Arena Setup → Kit Setup → Match Modes & Queue → Bot System → Events & Tickets → Replay.

What is EventPractice?#

A complete PvP backbone plugin that delivers practice, duel, ranked queue, FFA, player-run events, bot training and match replay inside a single plugin. Beyond the classic "admin starts an event" flow, it is a player self-service combat hub.

Who is it for?#

Practice servers, PvP event servers, duel/ranked servers, KitPvP/FFA networks and TrainingBot-powered training servers; also modern Paper plugin packages distributed as premium resources.

Supported environments#

The plugin descriptor declares api-version: 1.21 and folia-supported: true. The POM references Paper API 26.3 build 211, and the source contains a Folia scheduler adapter. Confirm exact server-version compatibility against the release binary.

Main systems#

  • Automatic arena cloning (WorldEdit schematic + Arenasworld)
  • Match Mode system (kit, arena category, rules, potions, border)
  • Unranked and Ranked queue with live item amount indicators
  • Player self-service events (tickets, invite, ban, presets)
  • Shared/private FFA classification, Duel Wand and duel request system
  • TrainingBot-powered bot duel through /botduel
  • Lobby spawn management through /eventpractice setlobby and /spawn
  • Personal kits + Kitroom (inventory layout customization)
  • Visual Replay (recording, playback, camera modes, world snapshot)
  • Kill cosmetics, scoreboard, tablist, spawn items, PlaceholderAPI

Dependencies#

  • Java 21 bytecode release; the Maven build enforces JDK 25 or later for its Paper 26.3 API validation.
  • Required: WorldEdit (plugin.yml depend)
  • Optional: TrainingBot (bot duel), Citizens (replay visuals), packetevents (team glow), PlaceholderAPI (placeholders)
  • License key in config.yml for premium startup
  • MySQL Connector/J 8.3.0 loaded automatically via plugin libraries

Installation#

Steps to place the plugin jar on the server. Installation makes the plugin boot; the First Setup section prepares it for production.

Do not replace plugin jars while the server is running. Always back up the EventPractice folder and database before updating.
Upload WorldEdit to the /plugins folder.EventPractice hard-depends on WorldEdit via depend: [WorldEdit] in plugin.yml. Without WorldEdit, EventPractice will not start and you will see a dependency warning in console.
Upload the EventPractice jar to /plugins.You can also install optional hooks at this stage: TrainingBot (bot duel), Citizens (replay NPC visuals), packetevents (team glow), PlaceholderAPI (placeholders).
Start the server once.The plugin folder is created under plugins/EventPractice/ and config.yml, messages.yml, match-modes.yml, kitroom.yml, kits.yml, arenas.yml, kill-cosmetics.yml, scoreboard.yml, tablist.yml and the menus/ files are generated automatically.
Enter the license key into license-key in config.yml.If the license is invalid the plugin stops safely before starting its core systems; database, queue and replay modules never end up half-initialized.
Choose the storage type.config.yml → database.method is either SQLite (single server, recommended starting point) or MySQL (network/production). Details in the Storage section.
Restart the server and check the enable logs.Verify manager startup lines in console and hook messages such as TrainingBot found. Hooked into BotDeathListener successfully.

First Setup#

Recommended first configuration pass after the files are generated. Follow the order: nothing works without arenas and kits.

After every change, restart or run /eventpractice reload, then test with a real player.

Setup checklist#

  1. Set license-key in config.yml.
  2. Choose the arenas-world world (default Arenasworld). The plugin auto-creates it as a void world if missing.
  3. Stand at the desired lobby position and run /eventpractice setlobby.
  4. Register at least one arena template (Arena Setup section).
  5. Register at least one kit and bind it to a match mode (Kit Setup section).
  6. Fill the arena-category lists of your match modes.
  7. Review ELO and matchmaking settings if you run ranked.
  8. Install TrainingBot and assign bot-profile if you want bot duels.
  9. Configure the ticket economy (default-ticket-amount, -1 disables it).
  10. Skin messages.yml, scoreboard.yml, tablist.yml and the menus to your brand.

Production notes#

  • Manage player and admin permissions with a permission plugin such as LuckPerms.
  • Back up the plugins/EventPractice/ folder (including arenas/*.schem) and SQL data before updates.
  • Prefer MySQL on large production servers for durable storage.
  • Run arena pregeneration (/arena pregen) outside peak hours since it pastes schematics.
  • The replay system uses disk; size max-stored and retention to your disk capacity.
  • Change one system at a time, test it, then move to the next.
/spawn returns players to lobby, clears their inventory and restores strictly validated lobby items.

License#

Premium builds validate a license key at startup. If the license is invalid the plugin stops safely.

Keep the key private. Anyone with the key can start a premium copy of your purchase.

How to configure#

  1. Copy the key from your buyer/download page.
  2. Paste it into license-key in config.yml.
  3. Restart the server and check the license line in the enable logs.
  4. If it shows invalid, re-check whitespace and quotation marks around the key.

Common license problems#

  • The key belongs in config.yml, not in any other generated YAML file.
  • The pasted key may have wrapped onto multiple lines or keep trailing spaces.
  • If the server files were copied to a new machine, the key must be re-entered.
  • If the key is lost, open a support ticket with proof of purchase; keys cannot be recovered from a broken server.
config.yml license excerpt
license-key: "YOUR-KEY"
color-format: "legacy" # Options: "legacy" (& codes) or "minimessage" (<color> tags)
A jar or license change requires a restart. /eventpractice reload does not re-validate licensing runtime state.

Change Workflow#

Use this checklist every time you change EventPractice config files.

Make one change → reload or restart → test in-game → move to the next change.

Reload vs restart#

ChangeApply with
match-modes.yml, kitroom.yml, scoreboard/tablist/eventpractice reload
messages.yml, menu files (menus/*.yml)/eventpractice reload
kits.yml (manual edits)/eventpractice reload
config.yml values (ELO, border, tickets)/eventpractice reload
Plugin jar updateServer restart
license-keyServer restart
database.method (SQLite ↔ MySQL)Server restart
arenas-world (new arena world)Server restart

Backup routine before every change#

  1. Copy the entire plugins/EventPractice/ folder to a backup location (including arenas/*.schem).
  2. Export the SQL database when using SQL storage.
  3. Note plugin version, server version and storage type next to the backup.
  4. Do not use tab characters in YAML files; indent with spaces. Tabs break a YAML file.
Arena commands (/arena save, /arena setspawn1 etc.) write to arenas.yml instantly; no reload is needed for them. Likewise /kitadmin save writes to kits.yml immediately.

Arena Setup#

The arena system is built on templates (schematics), categories, centers and spawn points. Queue, events, duels and FFA all pull arenas from these categories. No match can start without arenas.

Build arena templates inside the arenas-world world (default Arenasworld) before recording them. Spawn and center coordinates are stored relative to that world.

How the architecture works#

  • Template: An admin builds an arena once and records it as a WorldEdit schematic with /arena save (plugins/EventPractice/arenas/<category>.schem).
  • Cloning: When queue/duel/event needs an arena, the system pastes the template into a free spot inside Arenasworld; hundreds of matches on the same category run in parallel without ever mixing.
  • Category: Each match mode pulls arenas from the categories listed in its arena-category list. CrystalPvP and NetheritePot can use separate arena pools.
  • Auto-assignment: A newly registered category is automatically added to every match mode that has no categories yet.

Arena commands#

CommandDescriptionPermission
/arenaOpens the arena management GUIeventpractice.arena.gui or arena.*
/arena listLists all arenas and stateseventpractice.arena.list
/arena save <category> <radius>Saves the template as a schematiceventpractice.arena.save
/arena setcenter <category>Sets the paste centereventpractice.arena.setcenter
/arena setspawn1 <category>First player spawn pointeventpractice.arena.setspawn
/arena setspawn2 <category>Second player spawn pointeventpractice.arena.setspawn
/arena seticon <category>Sets the menu icon from the held itemeventpractice.arena.seticon
/arena addblock <category>Adds the held block to breakable blockseventpractice.arena.addblock
/arena pregen <category> <amount>Pre-generates pooled arena copieseventpractice.arena.pregen
/arena remove <category>Removes the category, schematic file and pool recordseventpractice.arena.remove
Step by step: registering your first arena standard setup
  1. Go to Arenasworld. Teleport to the Arenasworld world from console or with a teleport plugin. If the world does not exist yet, the plugin creates it as a void world during the first arena operation; still make sure the world exists before building.
  2. Build the arena. Create the floor, decoration and spawn platforms inside this world. You will stand near the center of the template.
  3. Stand at the center and save:
    /arena save crystal 60

    This command takes your location as the center and saves the whole region (60-block radius on x/z, full height from Y -64 to 256) as arenas/crystal.schem. The category center is set at the same time, and the category is auto-added to every match mode that has no categories.

  4. Set the duel spawn points. Spawn locations on a cloned arena are computed as offsets from the template's recorded positions, so record them from within the template itself:
    /arena setspawn1 crystal   # run while standing on player 1's spot
    /arena setspawn2 crystal   # run while standing on player 2's spot
  5. (Optional) Add breakable blocks. Hold the block item in your hand (e.g. OBSIDIAN) and run:
    /arena addblock crystal

    The block type is appended to the breakable-blocks list in arenas.yml; only listed blocks can be broken during matches.

  6. (Optional) Assign a menu icon. Hold the icon item and run:
    /arena seticon crystal
  7. Pregenerate the pool. Keep spare arenas ready so the first queue match starts instantly during busy hours:
    /arena pregen crystal 3

    The command sends a progress message every second (percentage, completed/total, elapsed time) and a completion message once all pastes finish.

  8. Verify:
    /arena list

    The output shows category, arena id, state (e.g. GENERATING/AVAILABLE) and owner info.

The radius defines the template coverage. 30-50 is typical for small flat arenas, 60-100 for large build arenas. A very large radius increases paste time and disk usage.
Step by step: category-based arena pools mode-specific arenas
  1. Register a template per PvP type with separate categories: /arena save crystal 60, /arena save netheritepot 40, /arena save builduhc 80 etc.
  2. Write the categories into each mode's arena-category list in match-modes.yml:
    modes:
      crystalpvp:
        arena-category:
          - "crystal"
      netheritepot:
        arena-category:
          - "netheritepot"
      builduhc:
        arena-category:
          - "builduhc"
          - "generic"
  3. Reload the plugin: /eventpractice reload.
  4. Start a match from the mode's queue menu and confirm the arena comes from the correct pool.
Empty list behavior

Leaving arena-category: [] makes the mode use every registered category (default behavior). Keep the list empty if you do not want to narrow the pool.

Spawn offsets

On a cloned arena, spawn1/spawn2 are recomputed from the x offset between the recorded positions and the center; therefore record spawns at their real positions inside the template instead of mirroring them around the center.

Step by step: deleting and re-recording arenas updating templates
  1. To remove a category completely:
    /arena remove crystal
    This deletes the arenas/crystal.schem file, the category record in arenas.yml and the persisted pooled instance records together.
  2. To only update a template, do not use remove; fix the build and run /arena save crystal 60 again with the same category name. The schematic file is overwritten.
  3. Re-apply center/spawn points with the same commands afterwards.
Do not change a template while matches are running on that category. Safest approach: wait for matches to finish or update during low traffic.
arenas.yml and Arenasworld world isolation

All arena pastes happen in the config.yml → arenas-world world (default Arenasworld). Your lobby and survival worlds stay clean of match blocks.

# config.yml
arenas-world: "Arenasworld"
When the world is missing the plugin creates a void world automatically. To use a different world name, change arenas-world and restart the server.

You do not need to edit arenas.yml by hand; every arena command keeps it up to date. The structure looks roughly like this:

arenas:
  crystal:
    size: 60
    center: {world: Arenasworld, x: 0, y: 64, z: 0, yaw: 0, pitch: 0}
    spawn1: {...}
    spawn2: {...}
    icon: {...}
    breakable-blocks:
      - OBSIDIAN
      - END_STONE
instances:
  crystal: [...]
Y limits

For build-enabled modes, limit the Y levels players can place/break with config.yml → y-coordinate.min/max (default -64 / 256).

World border

World border radius and damage per category/event; players can also adjust them from the event menu. Global bounds live under config.yml → world-border.

Kit Setup#

There are two kit flows: admin kits (the registered kit content) and player personal kits (their own inventory layout). The Kitroom is the layout editor area.

A match mode without a kit cannot start matches. Every mode's kit: field must point to a registered kit.
Step by step: registering your first kits /kitadmin
  1. Fill your own inventory with the content you want to register (armor included, with the hotbar arrangement — this layout is used when a player has no personal kit).
  2. Save the kit:
    /kitadmin save CrystalPvP

    The inventory is written to kits.yml instantly and you receive the "Kit has been saved successfully." message.

  3. Check the registered kits:
    /kitadmin list
  4. Test the kit by applying it to yourself:
    /kitadmin load CrystalPvP
  5. Bind the kit to a match mode. Write the exact kit name into the mode's kit field in match-modes.yml:
    modes:
      crystalpvp:
        kit: "CrystalPvP"
  6. Run /eventpractice reload, start a short match from the queue and confirm the kit arrives correctly.
Kit management commands kitadmin reference
CommandDescriptionPermission
/kitadminOpens the kit management GUImenu access
/kitadmin save <kit>Saves your inventory as a kiteventpractice.kit.admin.save
/kitadmin listLists all kitseventpractice.kit.admin.list
/kitadmin load <kit>Applies a kit to your inventoryeventpractice.kit.admin.load
/kitadmin seticon <kit>Makes the held item the kit icon (shown in menus)eventpractice.kit.admin.seticon
/kitadmin remove <kit>Deletes the kit and its kits.yml recordeventpractice.kit.admin.remove
Update the match modes that use a kit before deleting it; otherwise those modes cannot give kits.
Editing kitroom categories kitroom.yml

The Kitroom is the editor area where players customize the item layout of their match kit. kitroom.yml defines categories; each category carries a slot-based item list like a chest GUI page. The default file ships with example crystal-pvp, potions and misc categories.

  1. Edit via GUI (recommended): Hold the item you want to register, then
    /kitroom edit crystal-pvp
    to enter editor mode (permission: eventpractice.kitroom.edit). Slots you place items on are written into kitroom.yml live.
  2. If you prefer manual editing, the kitroom.yml structure is slot → item:
    categories:
      crystal-pvp:
        '0':
          material: NETHERITE_HELMET
          amount: 1
          enchantments:
            PROTECTION: 4
            UNBREAKING: 3
            MENDING: 1
            RESPIRATION: 3
            AQUA_AFFINITY: 1
          unbreakable: false
          durability: 407
        '2':
          material: OBSIDIAN
          amount: 64
        '22':
          material: TIPPED_ARROW
          amount: 64
          potion-effects:
            slow_falling:
              duration: 4800
              amplifier: 0
    potions:   # quick potion rows
      '0':
        material: SPLASH_POTION
        potion-effects:
          instant_health:
            duration: 1
            amplifier: 1
    misc:      # general item pool
      '0':
        material: DIAMOND_HELMET
        amount: 1
  3. Run /eventpractice reload after changes.
Player access

Players open their own editing area with /kitroom (eventpractice.kitroom.use, open to everyone by default). Layout saving is independent of the match flow.

Potion effect syntax

Under potion-effects you provide the effect name, duration (ticks) and amplifier. Tipped arrows and splash potions use the same structure.

Player personal kits /kit and custom layouts

A personal kit lets a player customize hotbar and inventory placement without changing the admin kit's content: which slot potions go to, where the sword sits, pearl/gapple positions are saved per player.

  1. The player opens the personal kit menu with /kit or /k (permission: eventpractice.kit.use).
  2. They pick the kit and rearrange the layout from the menu; the layout is stored permanently in the database (personal-kits storage).
  3. When a match starts, the player's personal layout is applied if they have one; otherwise the admin kit's default layout is given.
Personal kit data is stored in the database, so players keep their layout across logout/login. Remember to migrate the data when switching from SQLite to MySQL.
Full kit flow for a new PvP mode end-to-end example
  1. Arrange the inventory and register it with /kitadmin save BuildUHC.
  2. Set the menu icon with /kitadmin seticon BuildUHC using a held item.
  3. Add the mode to match-modes.yml (using the template in the Match Modes & Queue section) and set kit: "BuildUHC".
  4. If the mode is build-enabled, register an arena category (/arena save builduhc 80) and add it to the arena-category list.
  5. If players should see mode-specific items in the Kitroom, add a category in kitroom.yml.
  6. Reload, enter a test match from the queue, and verify the kit and arena pairing.

Match Modes and Queue Setup#

A match mode is not just a menu icon; it is an independent PvP profile carrying the kit, arena category, rules, potions, damage multiplier, enderpearl cooldown and bot profile.

The default file ships CrystalPvP, NetheritePot and DiamondPot examples. Adjust them for your server or add new modes.

Mode fields#

FieldDescription
display-nameName shown in menus and messages
enabledMode active/inactive
kitKit name given at match start
arena-categoryArena pool to use (empty = all)
enderpearl-cooldownMode-specific pearl cooldown
damage-multiplierDamage multiplier (%)
world-border.radius / damageMode-specific border values
icon-materialMenu icon material
bot-profileTrainingBot bot profile name
rulesITEM_DROP, ITEM_DAMAGE, ITEM_PICK, ELYTRA, BUILD, PUBLIC_PLAY, PUBLIC_SPECTATE
potionsPotion effects applied at match start

Queue admin editor#

You can add and edit modes from menus instead of touching YAML.

CommandDescription
/queueOpens the unranked queue menu
/queue add <mode>Creates a new match mode + queue menu item
/queue edit <mode>Opens the mode editor (kit, arenas, rules, bot profile)
/queue remove <mode>Removes the mode

These commands require eventpractice.queue.admin. The queue editor lists TrainingBot profiles when TrainingBot is installed (menus/queue-editor.yml).

Live queue indicator: menus/queue.yml and menus/ranked.yml use main-menu.queue-indicator. The default amount is queued players + 1, so one waiting player appears as 2. Refresh is sync and only sends GUI updates when the amount changes.
Step by step: adding a match mode via YAML match-modes.yml
  1. Open match-modes.yml, copy an existing template under modes: and add a new key (key = mode id, lowercase recommended):
    modes:
      nodebuff:
        display-name: "&9NoDebuff"
        enabled: true
        kit: "NoDebuff"
        arena-category:
          - "nodebuff"
        enderpearl-cooldown: 10
        damage-multiplier: 100
        world-border:
          radius: 50
          damage: 2
        icon-material: SPLASH_POTION
        bot-profile: null
        rules:
          ITEM_DROP: true
          ITEM_DAMAGE: true
          ITEM_PICK: true
          ELYTRA: false
          PUBLIC_PLAY: true
          PUBLIC_SPECTATE: true
          BUILD: false
        potions: []
  2. Register the kit (/kitadmin save NoDebuff) and an arena category (/arena save nodebuff 40).
  3. Run /eventpractice reload.
  4. Confirm the new mode appears in the /queue menu and test the kit + arena pairing.
Never rename a mode id; ranked ratings, queue records and bot profiles are bound to it. Instead add a new mode and set the old one to enabled: false.
Step by step: adding a mode via menus /queue add
  1. As an admin run /queue add nodebuff. The command:
    • creates a new MatchMode record in match-modes.yml,
    • adds a default PAPER item to menus/queue.yml (queue menus) named &9nodebuff with active players and queue status lore,
    • syncs the menus automatically.
  2. Open the editor with /queue edit nodebuff and configure the mode: display name, kit, arena categories, rules, border, damage multiplier, enderpearl cooldown and (with TrainingBot) the bot profile.
  3. Once kit and arena are ready, start a test match from the queue menu.
The command fails if a mode with the same name exists ("match mode exists"). Use /queue remove <mode> to delete a mode.
What the match mode rules do rules field
RuleEffect
ITEM_DROPWhether players can drop items
ITEM_PICKWhether players can pick items up
ITEM_DAMAGEItem damage/breakage simulation
ELYTRAAllow elytra usage
BUILDBlock place/break (together with y-coordinate limits)
PUBLIC_PLAYEvent open participation
PUBLIC_SPECTATEEvent open spectating

The config.yml → default-game-rules section defines the defaults for rules that are not overridden per mode or event.

Ranked and ELO Setup#

The ranked system tracks a separate rating per match mode. Instead of a single global ELO, CrystalPvP ELO and NetheritePot ELO are calculated independently.

Opening ranked queue to players requires eventpractice.ranked.use (open to everyone by default).
Step by step: enabling the ranked system config.yml
  1. Make sure at least one active match mode with kit and arena is ready (previous sections).
  2. Tune the ELO parameters in config.yml:
    elo:
      default-rating: 1000     # starting score for new players
      k-factor: 32             # score change coefficient
      minimum-rating: 100      # rating floor
      matchmaking:
        base-range: 100        # initial search range (+/- ELO)
        range-increase: 50     # ELO added per expansion
        increase-every-seconds: 10   # expansion interval
  3. Configure the ping-based matchmaking filter:
    queue:
      ping-range:
        enabled: true
        default: 60        # player's default ping gap limit (ms)
        minimum: 10
        maximum: 200
        step: 10           # increase/decrease step in the menu
        fallback-player-ping: 150   # used when ping cannot be read
  4. Reload. Players pick a mode from the Ranked Queue lobby item or /ranked and enter the queue.
Smart matchmaking

The search starts within a ±100 ELO band; the band widens by +50 every 10 seconds while the player waits. You get fair matches without leaving anyone stuck in queue.

Ping range

Players set their own ping limit from the profile menu (/settings); they will not be matched against opponents beyond that ping gap. This keeps ranked fair on ping.

Bot System (TrainingBot)#

Bot duel lets players train against bots when no opponent is online. The system hooks into the TrainingBot plugin with a soft-depend; when TrainingBot is absent, bot flows stay safely disabled.

Dependency declaration: plugin.yml → softdepend: [TrainingBot, Citizens, packetevents]. TrainingBot is not mandatory but required for bot duels.
Step by step: bot duel setup TrainingBot + EventPractice
  1. Install TrainingBot. Place the TrainingBot jar into /plugins and configure it according to its own docs (bot behaviors, difficulty levels).
  2. Create a bot profile in TrainingBot. Define global bot profile(s) on the TrainingBot side (difficulty, strafe, potion throwing behavior etc.). The EventPractice queue editor lists these profiles automatically from the TrainingBot API (getGlobalProfileNames).
  3. Start the server and verify the hook. You should see this line in console:
    TrainingBot found. Hooked into BotDeathListener successfully.

    If the message is missing, TrainingBot may have been loaded after EventPractice or the plugin name differs.

  4. Assign bot profiles to match modes. Write the TrainingBot profile name into the mode's bot-profile field in match-modes.yml:
    modes:
      netheritepot:
        bot-profile: "PotBotMedium"
  5. Customize the bot duel menu. Titles, items and layout are edited in menus/bot-duel.yml.
  6. Test it. Open the menu with /botduel or run /botduel <mode>, pick a mode and start the duel. When the bot dies, the BotDeathListener hook closes the match flow cleanly on the EventPractice side.
A mode with bot-profile: null returns the error "No bot profile defined for this mode." when a bot duel starts. Without TrainingBot installed, all bot commands return "Bot duel system is currently unavailable."
Bot system reference commands and behavior
ItemDetail
Command/botduel
Permissioneventpractice.bot.use (default: everyone)
Menumenus/bot-duel.yml
Profile sourceTrainingBot global profiles (also listed in the queue editor)
HookBotDeathListener - the match ends cleanly on the EventPractice side when the bot dies
Error messagesbot-not-available, bot-no-profile, bot-duel-started, bot-mode-not-found, bot-arena-not-prepared (messages.yml)
Citizens effect

With Citizens installed the replay and bot NPC experience is smoother; without it the system keeps working through the Armor Stand fallback.

Bot-only modes

You can tag specific modes for bot usage in the queue editor and manage their visibility in player lists separately.

Shared FFA Setup#

FFA is an always-on combat arena with no queue waiting. It is used for warmup, combo practice and fast PvP feel.

Permission: eventpractice.ffa.use (default: everyone). Command: /ffa (menu) or /ffa <mode> (direct join; running it again for the same mode leaves).
Step by step: enabling FFA config + modes
  1. Register an arena category suitable for FFA (large maps with multiple spawns recommended; see Arena Setup).
  2. Make sure the modes used in FFA are enabled: true in match-modes.yml and their kit/arena pairing works.
  3. Review the FFA behavior setting:
    ffa:
      refill-kit-on-kill: true   # refill kit after a kill (restock pots/items)
  4. Customize the FFA scoreboard (scoreboard.yml → in-game.ffa; killstreak, total kills/deaths fields are supported) and the FFA menu (menus/ffa.yml).
  5. Reload and test joining with /ffa, plus the FFA-appropriate respawn on death.

Event and Ticket Setup#

Players can create their own events from menus; the ticket system gates event creation behind an economy, and the preset system stores repeating settings.

Player permissions are open to everyone by default (eventpractice.player.create/join/start/invite/ban/spectate). Disable them in your permission plugin if you want to restrict them.
Step by step: ticket economy event creation limits
  1. Set the default ticket amount in config.yml:
    default-ticket-amount: 10   # set -1 to disable the ticket system completely
  2. Grant the ticket commands to your staff group with permissions:
    CommandDescriptionPermission
    /ticket info <player>Shows remaining ticketseventpractice.ticket.info
    /ticket add <player> <amount>Adds ticketseventpractice.ticket.add
    /ticket remove <player> <amount>Removes ticketseventpractice.ticket.remove
    /ticket set <player> <amount>Sets the ticket amount directlyeventpractice.ticket.set
  3. To attach tickets to VIP/shop packages, run /ticket add from your purchase flow (or console).
Step by step: the player event flow create → start
  1. A player opens the event menu with the lobby's Create Event item or /event create: kit, participant limit (players.min/max/default), winner count (winner-amount), border radius/damage (world-border), damage multiplier, rules, potions.
  2. Tickets are deducted when the event is created; the system picks a free arena and, while pasting, shows "Event is being created. It may take a few seconds...".
  3. Other players join with /event join <player> or the owner invites them with /event invite <player> (chat message with join button; invite-cooldown prevents spam).
  4. Advertise: /event advertise - throttled by advertise-cooldown (default 60s).
  5. The owner starts the countdown with /event start (countdown-seconds, required-players). The countdown is cancelled if there are not enough players.
  6. Spectating: /event spectate <player>. The owner can remove problem players with /event ban <player>.
  7. In-game controls: /event border <radius> <delay> and /event dropdown <targetY> let the event owner manage the border and Y levels.
Event preset system repeating settings

Players store frequently used event settings as presets (kit, damage multiplier, potions, rules, border). Menu: menus/preset.yml. Data is kept in the event-presets storage area and reached from the /settings profile menu.

Preset flow: profile menu → Event Presets → load an existing preset or save the current setup as a new preset. No more re-entering the same settings for every event.

Visual Replay Setup#

Finished matches can be watched again visually. The module has three layers — recording, storage and playback — and everything is managed from config.yml → visual-replay.

Replay consumes disk and CPU. Size max-stored, max-frames-per-recording and max-duration to match your server capacity.
Step by step: enabling replay recommended setup
  1. Confirm the system is enabled:
    visual-replay:
      enabled: true
      cooldown: 10s
      recording:
        enabled: true
        max-duration: 5m
        max-participants: 16
  2. Check the playback world. Replays are played back in a separate world instance:
        world-instance:
          enabled: true
          world: eventpractice_replay
          auto-create-world: true

    The world is created automatically; change the world name if you want your own replay world.

  3. Define storage and cleanup policy:
        storage:
          directory: replays
          retention: 15m        # how long recordings are kept
          max-stored: 250
          max-replay-size-mb: 10.0
          cleanup:
            enabled: false      # set true if you want automatic cleanup
  4. With Citizens installed, replay visuals render through NPCs; otherwise Armor Stand rendering is used with fallback-armorstand: true.
  5. Reload. Finish a match and verify the recording exists with /replay latest; /replay status shows system health.
Replay commands /replay
CommandDescription
/replay play <id>Plays a recording
/replay latest [player]Opens the latest recording
/replay recordings [limit] [gui]Recording list (gui argument opens the menu)
/replay stop / pause / resumePlayback controls
/replay speed <value>Playback speed (0.25x - 4x)
/replay skip <seconds>Skip forward/backward
/replay follow <player> / /replay pov <player> / /replay freeCamera modes
/replay controlsControls GUI
/replay share <id>Share the recording with online players (clickable watch button)
/replay delete <id>Deletes the file (permission: eventpractice.replay.delete)
/replay cleanupManual cleanup (permission: eventpractice.replay.cleanup)
/replay statusActive recordings/playbacks, stored files and queue state
Access mode

playback.access.mode: OWN_FIGHTS lets players watch only their own matches; it works together with the eventpractice.replay.use permission. Admin access uses eventpractice.replay.admin.

Camera modes

FREE (flight), FOLLOW (tracking) and POV (player view). Default mode is camera.default-mode, HUD format is playback.hud.format.

Config Files#

The blocks below are short excerpts, not full files. Every YAML file has exactly one job.

Validate YAML indentation before restarting. Tab characters break YAML files.
config.yml main runtime settings

License, color format, database, arena world, core event parameters, ELO, FFA, queue ping range, default game rules, lobby/spawn items and the visual-replay configuration.

license-key: contact the author
color-format: "legacy" # "legacy" (& codes) or "minimessage" (<color> tags)
database:
  method: "SQLite" # SQLite | MySQL
  data:
    host: "localhost"
    port: 3306
    database: "eventpractice"
    username: "root"
    password: ""
    ssl: false
arenas-world: "Arenasworld"
countdown-seconds: 10
required-players: 2
default-ticket-amount: 10 # -1 = ticket system disabled
delay-before-end: 5
advertise-cooldown: 60
invite-cooldown: 30
team-glow: true            # packet-based glow when packetevents is present
allowed-commands: [/msg, /stats, /ping]
y-coordinate: {min: -64, max: 256}
players: {max: -1, min: 2, default: 10}
winner-amount: {max: 5, min: 1, default: 1}
world-border:
  radius: {max: 150, min: 50, default: 100}
  damage: {max: 20, min: 0, default: 5}
damage-multiplier: {max: 100, min: 0, default: 0}
elo:
  default-rating: 1000
  k-factor: 32
  minimum-rating: 100
  matchmaking: {base-range: 100, range-increase: 50, increase-every-seconds: 10}
ffa:
  refill-kit-on-kill: true
queue:
  ping-range: {enabled: true, default: 60, minimum: 10, maximum: 200, step: 10, fallback-player-ping: 150}
spawn-items and lobby-items

Lobby items (Queue Duels, Ranked, Create Event, Bot Duel, Duel Wand, Profile) and in-event items (team selector, leave, settings) are fully YAML-defined: material, name, lore, slot. prevent-lobby-drop: true stops players from dropping lobby items.

winner-reward-command

A command executed for the match winner; use it to attach a winner reward economy.

match-modes.yml PvP profile definitions

Covered in detail in the Match Modes & Queue section. Each mode carries display-name, kit, arena-category, rules, border, potions, bot-profile and icon. Mode ids (keys) are permanent identifiers.

kitroom.yml item pools and categories

Categories (e.g. crystal-pvp), potions and misc sections carry slot → item definitions. Syntax examples are in the Kit Setup section.

kill-cosmetics.yml kill messages and effects
# Kill message styles: default, brutal, flashy + custom packs
# Placeholders: <killer>, <victim>, <mode>
# Kill effects: particle burst, totem burst, firework burst,
#               cosmetic lightning, dust ring
# Per effect: enabled, display name, lore, type, sound

Players pick their message and effect from the Kill Cosmetics screen in the profile menu. The file works together with the menus/kill-cosmetics.yml menu.

file responsibility table which setting lives where
FileResponsibility
config.ymlLicense, DB, arena world, event parameters, ELO, replay, lobby/spawn items
messages.ymlAll player messages and the prefix
match-modes.ymlPvP mode profiles
arenas.ymlArena categories, spawn/center, pooled instances (written by commands)
kits.ymlAdmin kits (written by /kitadmin)
kitroom.ymlKitroom item pools and categories
kill-cosmetics.ymlKill message styles and effects
scoreboard.ymlScoreboard state templates
tablist.ymlTablist header/footer/name formats
menus/*.ymlAll GUIs (arena, bot-duel, duel, ffa, in-game, kill-cosmetics, kit-admin, other, personal-kit, preset, profile, queue, queue-editor, ranked, replay)

Messages#

Every player-facing text lives in messages.yml. No message editing in Java code is needed.

The color format is chosen with config.yml → color-format: legacy (&a, &c codes) or minimessage (<yellow> tags).

Structure and prefix#

prefix: "&7[&eEvents&7] &r"
already-in-event: "&cYou are already in an event!"
no-arena-found: "&cNo available arena was found! ..."
invite-player: "&aYou have invited &e<player>&a."
replay-recordings-line: "&7- &e#<id> &7- &f<duration>s &7- &f<players>"
  • Messages use <placeholder> variables (<player>, <id>, <category> etc.).
  • Some fields like the replay HUD use PlaceholderAPI-style %id% placeholders.
  • Multi-line messages can be defined as YAML lists (see invited-to-event).

Things to keep in mind#

  • Do not delete a message key; the plugin looks it up and falls back to the raw string when missing.
  • Do not rename placeholders - only edit the surrounding text.
  • You must keep variables such as <arena> in format strings like arena-spawn-set.
  • /eventpractice reload is enough after changes.
  • Missing message keys are logged as a warning in console; check console after the first reload.

The entire player experience runs through menus. Menu files live under plugins/EventPractice/menus/.

Commands like /queue add sync menu files automatically; watch out for key collisions on manually added items.
  • queue.yml - queue mode list
  • queue-editor.yml - admin mode editor
  • ranked.yml - ranked mode menu
  • arena.yml - arena management GUI
  • bot-duel.yml - bot duel menu
  • duel.yml - duel request menu
  • ffa.yml - FFA mode selection
  • in-game.yml - in-match menus
  • kit-admin.yml - kit management GUI
  • personal-kit.yml - personal kit menu
  • preset.yml - event preset menu
  • profile.yml - profile/settings menu
  • kill-cosmetics.yml - cosmetic selection
  • replay.yml - replay menu
  • other.yml - other interfaces

Common fields: title, size, slot, material, name, lore, fill-item, click action, placeholder lore lines.

Example menu item queue.yml
main-menu:
  title: "&8Queue Selection"
  size: 27
  items:
    crystalpvp:
      material: END_CRYSTAL
      name: "&9Crystal PvP"
      lore:
        - "&8Mode Details"
        - "&7Active Players: &f<playing>"
        - "&7Queue Status: &f<queued>"
        - ""
        - "&eClick to select this mode."
Dynamic placeholders

Values like <playing> and <queued> update live when the menu opens and while it ticks.

Seticon commands

Arena and kit icons are applied to menus from held items via /arena seticon and /kitadmin seticon.

Scoreboard and Tablist#

Separate YAML templates per player state. Players can hide their own scoreboard and tablist from the /settings menu.

Scoreboard lines support both PlaceholderAPI placeholders (%player_name%, %server_tps_1%) and internal fields (<kit>, <arena>, <alive>, <kills>).

scoreboard.yml states#

  • lobby - lobby stats panel
  • in-game.solo / in-game.team - in-match panel
  • in-game.ffa - killstreak, total kills/deaths
  • queue - queue waiting panel
  • update-time - tick refresh rate (default 20)
scoreboard:
  update-time: 20
  enabled: true
  color-format: "legacy"
  lobby:
    title: "&e&lPvP Events"
    lines:
      - "&e&l%player_name%:"
      - "&7• &f⚔ Kills: &e%statistic_PLAYER_KILLS%"

tablist.yml states#

  • Lobby, Queue, Ranked, FFA, In Match and Spectator states
  • Each state defines its own header, footer and player name format
  • States are edited per state in tablist.yml
  • Personal hiding: toggles in the profile menu are kept in player-settings storage

PlaceholderAPI#

When PlaceholderAPI is installed, placeholders are provided automatically under the eventpractice identifier.

Without PlaceholderAPI these placeholders do not work in external plugins; internal <field> placeholders keep working in menus/scoreboards.
PlaceholderDescription
%eventpractice_host%Owner of the current event
%eventpractice_players%Total players in the arena
%eventpractice_alive%Alive player count
%eventpractice_spectators%Spectator count
%eventpractice_state%Arena / event state
%eventpractice_timer%Event duration
%eventpractice_kit%Current kit name
%eventpractice_arena%Arena category
%eventpractice_winner_amount%Winner count
%eventpractice_kills%Player's kills in the current match
%eventpractice_world_border%Active world border value
%eventpractice_damage_multiplier%Damage multiplier
%eventpractice_elo%ELO for the current context
%eventpractice_elo_<mode>%ELO for a specific mode (e.g. elo_crystalpvp)
%eventpractice_queue_type%Queue type
%eventpractice_queue_ping_range%Player's ping range setting
%eventpractice_stats_kills% / _deaths / _wins / _losses / _kdGlobal career statistics

Storage and Database#

Data types are managed under separate storage connection names. SQLite for single servers, MySQL for networks/production.

When migrating SQLite → MySQL, carry the existing data over; otherwise players restart with empty kits, tickets, stats and ratings.

Storage areas#

AreaContent
personal-kitsPlayer personal kit layouts
ticketsTicket balances
player-statsKill/death/win/loss statistics
event-presetsSaved event settings
player-settingsToggles, ping range, cosmetic selection
player-ratingsPer-mode ELO values

MySQL migration#

  1. config.yml → database.method: "MySQL"
  2. Fill in host, port, database, username, password and ssl under data.
  3. MySQL Connector/J 8.3.0 loads automatically through plugin.yml libraries.
  4. Restart the server and confirm there are no connection errors in the startup logs.
  5. Replay files live in plugins/EventPractice/replays/, not in the database.

Commands#

All commands listed per their plugin.yml registrations.

Player help flow is /event help (permission: eventpractice.player.help); the full admin list is /eventpractice help.
/eventMain event command
Description

Event create, join, start, invite, advertise, ban, spectate, border, dropdown.

Permission

eventpractice.player.*

Example

/event create, /event join Steve, /event start

When to use

When players self-create and manage events.

/arenaAlias: /arenaadmin
Description

Arena management hub: list, save, setcenter, setspawn1/2, seticon, addblock, pregen, remove + GUI.

Permission

eventpractice.arena.*

Example

/arena save crystal 60

When to use

When adding a new arena or updating a template.

/kitadminKit management
Description

Save, list, load, icon and remove kits + GUI.

Permission

eventpractice.kit.admin.*

Example

/kitadmin save NoDebuff

When to use

When preparing kits for a new PvP mode.

/kitAlias: /k
Description

Player personal kit menu; customizes layout without changing kit content.

Permission

eventpractice.kit.use

Example

/kit

When to use

When players want their own hotbar arrangement.

/kitroomKitroom
Description

Open the kitroom; admin side edits item pools with /kitroom edit <category>.

Permission

eventpractice.kitroom.use / edit

Example

/kitroom edit crystal-pvp

When to use

When updating category item pools.

/queueAliases: /practice /pvp
Description

Unranked queue menu; admin subcommands add/edit/remove.

Permission

queue open; admin adds: eventpractice.queue.admin

Example

/queue add nodebuff

When to use

For fast risk-free matches or adding new modes.

/rankedRanked queue
Description

Pick a mode and enter the ELO queue.

Permission

eventpractice.ranked.use

Example

/ranked

When to use

When grinding rating in competitive modes.

/ffaShared FFA
Description

FFA menu or direct join/leave with /ffa <mode>.

Permission

eventpractice.ffa.use

Example

/ffa crystalpvp

When to use

For continuous PvP practice without queueing.

/botAlias: /botduel
Description

TrainingBot-powered bot duel menu.

Permission

eventpractice.bot.use

Example

/bot

When to use

Training against bots when no opponent is around.

/replayAliases: /ereplay /eventreplay
Description

Replay play, cameras, speed, share, delete and system status.

Permission

eventpractice.replay.use / admin / delete / cleanup

Example

/replay latest

When to use

Post-match analysis.

/ticket · /stats · /settings · /duel · /spectate · /leave · /winvUtility commands
Description

Ticket management; stats view; profile/settings menu; duel requests; event/match spectating; leaving an event; winner inventory inspection.

Permission

ticket: eventpractice.ticket.*; others use permissions

Example

/ticket info Steve, /duel Steve

When to use

Daily operations and player flows.

/eventpracticeAliases: /eventadmin /ep
Description

Main admin command: reload and help.

Permission

eventpractice.admin.reload, eventpractice.admin.help

Example

/ep reload

When to use

After YAML changes.

Permissions#

Permissions listed per plugin.yml definitions. Assign admin and bypass permissions carefully.

/lp group admin permission set eventpractice.arena.* true
/lp group default permission set eventpractice.ranked.use true

Player Event Permissions#

eventpractice.player.create

Create events.

Default: true
eventpractice.player.join

Join events.

Default: true
eventpractice.player.leave

Leave events.

Default: true
eventpractice.player.start

Start events.

Default: true
eventpractice.player.invite

Send event invites.

Default: true
eventpractice.player.ban

Ban players from events.

Default: true
eventpractice.player.spectate

Spectate events.

Default: true
eventpractice.player.border

Move the border in owned events.

Default: true
eventpractice.player.dropdown

Clear blocks above a Y level in owned events.

Default: true
eventpractice.player.help

See the player command help.

Default: true

Admin Permissions#

eventpractice.admin.reload

/eventpractice reload.

Default: op
eventpractice.admin.seticon

Set icons.

Default: op
eventpractice.admin.help

Full command list.

Default: op
eventpractice.queue.admin

/queue add, edit, remove.

Default: op

Arena Permissions#

eventpractice.arena.*

Wildcard for all arena commands.

Owner/Admin
eventpractice.arena.list

List arenas.

Default: op
eventpractice.arena.save

Save arenas.

Default: op
eventpractice.arena.remove

Remove arenas.

Default: op
eventpractice.arena.gui

Arena GUI access.

Admin
eventpractice.arena.pregen

Pre-generate arena copies.

Admin
eventpractice.arena.setcenter

Set the center.

Admin
eventpractice.arena.setspawn

Set Spawn1/Spawn2 (both setspawn1 and setspawn2 check this node).

Admin
eventpractice.arena.seticon

Assign the arena menu icon.

Admin
eventpractice.arena.addblock

Add to the breakable blocks list.

Admin

Kit, Kitroom and Ticket Permissions#

eventpractice.kit.use

Personal kit menu.

Default: true
eventpractice.kitroom.use

Open the kitroom.

Default: true
eventpractice.kitroom.edit

Edit the kitroom.

Default: op
eventpractice.kit.admin.list / save / load / remove

Kit admin commands.

Default: opWildcard: kit.admin.*
eventpractice.ticket.info / add / remove / set

Ticket management commands.

Default: op

Practice and Replay Permissions#

eventpractice.stats.use

View statistics.

Default: true
eventpractice.settings.use

Profile/settings menu.

Default: true
eventpractice.bot.use

Use bot duels.

Default: true
eventpractice.ranked.use

Use the ranked queue.

Default: true
eventpractice.ffa.use

Enter FFA.

Default: true
eventpractice.replay.use

Watch owned replay recordings.

Default: true
eventpractice.replay.admin

Replay admin access.

Default: op
eventpractice.replay.delete

Delete replay files.

Default: op
eventpractice.replay.cleanup

Run replay cleanup.

Default: op
eventpractice.bypass.replay-cooldown

Bypass the replay cooldown.

Default: op
eventpractice.bypass.replay-combat-lock

Watch replays while in an event.

Default: op

Troubleshooting#

The most common problems and fixes. The first step is always checking console logs and the /eventpractice help output.

Before opening a bug report, note the plugin version, server core/version, Java version, storage type, WorldEdit version and the full stack trace from console.

Plugin does not start - WorldEdit error#

WorldEdit is a hard dependency of EventPractice. Make sure an up-to-date WorldEdit is in plugins/ and loads without errors itself.

Players get "No available arena was found!"#

No registered arena exists or every arena in the category is busy. Follow the Arena Setup section, grow the pool with /arena pregen <category> <amount> and verify the mode's arena-category list contains the right category.

"forgot-to-set-min/max/spawn" after arena save#

The template or spawn points were recorded incompletely. Re-run /arena save for the template, then run setspawn1 and setspawn2 while standing on the real positions inside the template.

Bot duel is "currently unavailable"#

TrainingBot is missing or was loaded after EventPractice. Install TrainingBot, restart the server and verify the hook message in console.

"No bot profile defined" on a mode#

The mode's bot-profile field is null in match-modes.yml. Write the TrainingBot global profile name and reload.

Event creation takes too long#

Arena paste time is proportional to the schematic size. Shrink the template radius and keep spare arenas ready with /arena pregen. Paste progress is reported to the player via messages.

Cannot watch replay - "cannot watch a replay while in an event"#

Playback combat lock is on (default). Grant staff eventpractice.bypass.replay-combat-lock or set visual-replay.playback.block-while-in-combat: false.

Replay files consume too much disk#

Lower max-stored, retention and max-replay-size-mb under visual-replay.recording.storage and enable cleanup.enabled: true. Manual cleanup: /replay cleanup.

Team glow not working#

Confirm config.yml → team-glow: true and that packetevents is installed. Without packetevents the NMS fallback adapter takes over; check console logs if the problem persists.

YAML change not applied#

Run /eventpractice reload; jar, license, database.method and arenas-world changes require a full restart (see the Change Workflow table). SnakeYAML scanner errors usually come from tab characters.

FAQ#

Frequently asked questions and short answers.

If the answer is not here, use the Support section.

What is the minimum number of arenas?#

At least 2-3 arenas per category is recommended for healthy queue and duel flow; pre-generated arena copies via /arena pregen can match the simultaneous match count.

How many events can run at once?#

The arena paste queue runs sequentially; concurrent events are limited by the arena pool size and server RAM. Replay max-participants (default 16) limits the recording side.

Is Folia supported?#

Yes - folia-supported: true with the scheduler adapter infrastructure. Bukkit calls requiring a region thread are routed automatically to the right thread.

Where are personal kits stored?#

In the personal-kits database connection (SQLite/MySQL). Not in YAML; they cannot be moved manually and require DB migration.

Is Citizens required for replay?#

No. With Citizens installed you get high-fidelity NPC rendering; without it, Armor Stand rendering is used via fallback-armorstand: true.

I deleted a match mode, what happens to ranked points?#

Ratings are stored under player-ratings per mode id; deleting a mode makes the points bound to that id unreachable. This is why disabling a mode with enabled: false is recommended instead of deleting it.

Support#

Bug reports, feature requests and license support.

Support channels#

  • Discord support server: use the link on the purchase page.
  • License issues and download links are managed from the buyer panel.
  • Documentation: www.ritomasss.com/docs/eventpractice

Bug report template#

Plugin version:
Server version:
Java version:
Server software:
Dependencies (WorldEdit version, TrainingBot, Citizens...):
Storage type:
Error log:
Steps to reproduce:
Expected behavior:
Screenshots/video:

2.4.0 Updates#

Recent EventPractice updates that affect daily player and admin workflows.

Keep the generated menu files after updating so the queue indicator settings can be merged safely.

The 2.4.0 notes below are historical. The local source checkout is version 2.6.9, uses Java 21 bytecode, references Paper API build 26.3.211 and enforces JDK 25 or later for Maven validation. Verify published-binary compatibility separately.

Live queue amount indicators#

  • Unranked and ranked mode icons display queued players + 1 as the item amount.
  • One waiting player therefore appears as amount 2, including on sword or other non-stackable icons.
  • Open menus refresh on a sync interval and only update when the queue amount changes.
  • Configure main-menu.queue-indicator.enabled, base-amount and refresh-ticks in menus/queue.yml and menus/ranked.yml.

Lobby and arena classification#

  • Use /eventpractice setlobby with eventpractice.admin.setlobby to save the lobby.
  • /spawn teleports the player, clears inventory and restores strictly name/lore-validated lobby items.
  • Use /botduel; the legacy /bot command is not registered.
  • Arena filters keep SHARED_FFA, PRIVATE_FFA, DUEL and ALL views distinct.