Active · Latest 2.0 · MC 1.20+

CPVPEvent+ documentation

Everything you need to run events on a Crystal PvP server. Border, storm sickness, parties, rekits, RevFights, and a /regen command that actually works.

Plugin version
2.0 stable
API target
Spigot 1.20+
Tested on
Paper · Purpur
Author
heuxil

What CPVPEvent+ does.

CPVPEvent+ is one plugin that handles everything you need to run an event on a Crystal PvP server. The world, the border, the kits, the chat, the spectators, the auto events, the gulag, and the parties. All in one config file.

Drop the jar in, paste your license key, tell it which world is your event world, done. The rest of this page explains how each piece works. If you just want to get it running, go straight to Installation and License Activation.

i

New here? Read these in order: Installation → License → Configuring Worlds → Setting Up /regen. That's enough to get the basics working.

Demo · YouTube
CPVPEvent+ in action
Quick video showing how the plugin works in-game.

What's inside.

One jar, one config. No extra plugins required (PlaceholderAPI and TAB are optional, the plugin works fine without them).

Smart Border

Animated shrink, pause/resume, optional damage scaling, and an optional action bar that pops in showing live size while the border moves.

Storm Sickness

Configurable tick threshold, warnings, and an optional safe-zone radius.

Rekit System

Auto-enable rekits after N deaths, with manual override, action-bar progress, and titles.

Multi-World /regen

Restart-safe map regen using a templates folder. Reset multiple worlds in parallel on the next boot. Same approach as MultiReset, built in.

RevFights Gulag

Pair dead players into fresh 1v1 worlds with a 50-block border and a 3-minute timer. Winners revive, losers stay out. Arenas auto-clean.

Party / Team System

Up to 8-player parties with team glow (only teammates see it), party chat, invites, kicks, and admin override.

Four Event Modes

Schedule by clock or run on-demand. Modes: Automatic (full sequence), HighPlayers, LowPlayers, and Manually for full hands-on control.

Visual GUI

Tweak settings live with /eventsettings. Force-start or normal-start any mode with a click. No config reloads needed.

Death Title

Customizable red "You died!" title flashes on every death. Toggle it from config.yml if you don't want it.

Spawn-Block Filter

Players only land on configured blocks (grass, sand, snow, mycelium, …) at event start. No more dropping into oceans or lava pits.

{}

PlaceholderAPI

Players alive, border size (auto-tracks the configured event world), rekit deaths, totem count, party size, ping, and more.

/eventstatus

Live read of where the Automatic sequence is: past steps, current step, and time until the next one.

Server requirements.

Component Supported
Minecraft1.20.4 to 1.21.x
Server softwarePaper, Purpur (recommended). Spigot may work but is not actively tested.
JavaJava 17 or higher.
Required pluginsNone.
Soft-dependenciesPlaceholderAPI, TAB
Internet accessRequired for license validation on startup.
!

Purpur tip. Purpur ignores worlds listed in bukkit.yml, so the plugin auto-loads the configured target world on enable. You don't need to add anything to bukkit.yml.

Drop in, restart, configure.

The jar carries everything it needs. The whole install takes about two minutes.

  1. Download CPVPEvent+.jar

    Grab the latest jar from your BuiltByBit purchase page.

  2. Drop it in plugins/

    Place the jar in your server's plugins/ folder. If you want PlaceholderAPI placeholders or TAB integration, install those too. they're optional but supported.

  3. Start the server once

    This generates plugins/CPVPEvent+/config.yml. The plugin will disable itself with a license error. that's expected on first boot.

  4. Paste your license key

    Open config.yml and replace PASTE-YOUR-KEY-HERE with the key from your BuiltByBit purchase. See License Activation for the full walkthrough.

  5. Configure your worlds

    Set world.target-world and world.spawn-world. See Configuring Worlds.

  6. Restart the server

    On a clean boot you should see License verified and Plugin enabled in the console.

Setting up your license key.

The plugin checks your license key every time the server starts. If it's missing or wrong, the plugin shuts itself off and prints an error in the console.

Step 1 · Find your key

Go to BuiltByBit, open your CPVPEvent+ purchase page, and grab the key from the Licenses tab. It looks like a long string of letters and numbers.

Step 2 · Open config.yml

The file lives at plugins/CPVPEvent+/config.yml. The license block is right at the top.

# CPVPEvent+ Configuration
# Support: https://discord.gg/7KKz3rYs8U
# Purchase: https://builtbybit.com/resources/cpvpevent.96670/

license:
  key: 'PASTE-YOUR-KEY-HERE'

Step 3 · Paste the key

Replace the placeholder with your actual key. Keep the surrounding single quotes.

license:
  key: 'a1b2c3d4-XXXX-XXXX-XXXX-c5d6e7f80912'

Step 4 · Restart the server

A reload (/reload or /cepreload) is not enough. The license check runs in onEnable, so you need a full restart.

Step 5 · Verify activation

On success, the plugin prints a banner like this in the console:

╔══════════════════════════════════════════╗
║         CPVPEvent+. License          ║
╠══════════════════════════════════════════╣
║  ✔  License verified                     ║
║  ✔  License valid                        ║
║  ✔  Plugin enabled                       ║
╚══════════════════════════════════════════╝

If you see a red banner with ✗ License validation failed, jump to Troubleshooting.

!

Don't share your key. Each license is tied to your BuiltByBit account. Sharing the file or the key publicly will invalidate it and trigger a manual review.

Target world & spawn world.

You've got two worlds to set up: the event world (where the actual PvP happens, with the border) and the spawn world (the lobby players go back to). Both are configured in the world: block of config.yml.

world:
  target-world: world_minecraft_desert   # the event map
  spawn-world:  world                    # the lobby
  10-seconds-safe-protection: false
  auto-kit: false
  default-kit: /k1
  load-publickit-before-default-kit: false
  spawn-location:
    x: 0.5
    y: 64.0
    z: 0.5
    yaw: 180
    pitch: 0.0

What goes where

KeyPurpose
target-worldThe world the border lives in. Players join the event by being teleported here. /regen rebuilds this world by default.
spawn-worldThe lobby world. /tpspawn sends players here, and so do all "exit event" flows.
spawn-locationThe exact coordinates inside the event world where players appear when joining the event.
auto-kitIf true, runs the default-kit command on join automatically.
10-seconds-safe-protectionGrants 10 seconds of damage immunity on respawn into the event world.
i

If the configured target-world isn't loaded by the server (common on Purpur), CPVPEvent+ will load it itself with WorldCreator on enable.

How to set up /regen.

/regen resets your event maps. It deletes the live world folders and replaces them with clean templates you set up beforehand. The actual swap happens on the next server boot, before any world is loaded, so it's always safe.

The system supports multiple worlds at once. Drop one template folder per world into plugins/CPVPEvent+/regen-templates/ and the plugin resets all of them in parallel on the next startup. Same approach as the MultiReset plugin, but built in.

How it works

When you run /regen: the plugin writes a small flag file, blinds and kicks players, then triggers a server restart. On the next startup, before Bukkit loads any world, the plugin sees the flag and spins up one thread per template folder. Each thread deletes the live world and copies the template in its place. The main thread waits until every reset finishes, then deletes the flag and the server boots normally.

Step 1 · Create clean backups of your event worlds

Stop the server. For each world you want resettable, copy its folder to your local machine and clean it up: remove chunks you don't want, reset spawn protection, whatever. These are the worlds players will get back every time someone runs /regen.

Pro tip, pre-generate your world with Chunky: install Chunky, run /chunky world <world> + /chunky radius <blocks> + /chunky start, and let it pre-generate every chunk within the radius before you capture the template. Without this step, the template only contains the chunks that happened to be loaded at copy time, and any unloaded area will be regenerated fresh the first time a player walks into it after a /regen, which can break terrain consistency or even spawn players in mid-generation chunks.

Step 2 · Place templates in regen-templates/

Drop each backup world folder into plugins/CPVPEvent+/regen-templates/. The folder is created automatically on first start. Each subfolder name must exactly match the live world name on disk.

plugins/
└── CPVPEvent+/
    ├── config.yml
    ├── regen-templates/  # ← templates folder (one subfolder per world)
    │   ├── world/  # template for the overworld
    │   │   ├── level.dat
    │   │   └── region/
    │   ├── world_minecraft_plains/
    │   ├── world_minecraft_desert/
    │   └── world_minecraft_mushroom/
    └── RevFights-Worlds/  # gulag arenas (separate)

Step 3 · Tune the regen block in config.yml

The defaults work for most setups. The two settings worth knowing about are templates-folder and restart-method.

regen:
  templates-folder:  regen-templates           # subfolder of plugins/CPVPEvent+/
  restart-method:    restart                   # 'restart' (recommended) or 'shutdown'
  kick-message:      '&cThe map is regenerating. Try again later.'
  restart-delay:     40                          # ticks between announce and kick (40 = 2s)

  # Legacy single-world fallback. Only used if the templates
  # folder is empty AND a single world is found at the path
  # below. Most setups can ignore these two lines.
  world-name:        world_minecraft_desert
  backup-folder:     world_minecraft_desert

Step 4 · Make sure your host can restart the server

With restart-method: restart (the default), the plugin dispatches Bukkit's /restart command. That uses your bukkit.yml's settings.restart-script when one is configured, otherwise it falls back to a clean shutdown.

On hosts with auto-restart-on-crash (Pterodactyl, Folium, systemd, screen-loop wrappers), either method will bring the server back up. If restart misbehaves on your host, set restart-method: shutdown instead, which forces a clean Bukkit.shutdown() and lets the wrapper handle the relaunch.

!

Pterodactyl note: the panel has a 60-second cooldown between auto-restarts. If you run /regen twice within a minute, the second one will leave your server offline until the cooldown expires.

Step 5 · Test it

As an op, run /regen. You'll see a title and chat broadcast, players get kicked with the configured message, and the server restarts. On boot you'll see something like:

[CPVPEvent+] Regen flag detected - applying templates (MultiReset-style)...
[CPVPEvent+] Resetting 3 world(s) in parallel...
[CPVPEvent+] Resetting 'world_minecraft_plains' from .../regen-templates/world_minecraft_plains
[CPVPEvent+] Resetting 'world_minecraft_desert' from .../regen-templates/world_minecraft_desert
[CPVPEvent+] Resetting 'world' from .../regen-templates/world
[CPVPEvent+] 'world_minecraft_plains' reset in 412ms.
[CPVPEvent+] 'world' reset in 588ms.
[CPVPEvent+] 'world_minecraft_desert' reset in 624ms.
[CPVPEvent+] Regen complete - 3 world(s) ready for startup.
!

If the templates folder is empty, /regen will refuse to run and tell you the path it expected. The plugin never deletes a world it can't replace.

Setting up the gulag.

/revfights <n> grabs n pairs of dead spectators, copies a fresh arena world for each pair, and throws them into a 1v1 with a 50-block border and a 3-minute timer. Winners come back to life, losers stay dead. Arena copies get deleted on the next restart.

Step 1 · Build your arenas

You can have as many arena templates as you want. The plugin picks one at random for each fight. Each one is just a regular world folder with a level.dat. Build them on a creative server, in singleplayer, wherever, then copy the world folder over.

Step 2 · Place templates in RevFights-Worlds/

Drop each arena world folder into plugins/CPVPEvent+/RevFights-Worlds/. The folder is created automatically on first start.

plugins/
└── CPVPEvent+/
    └── RevFights-Worlds/
        ├── arena_desert/
        ├── arena_ice/
        └── arena_pit/

Step 3 · Run a fight

As an op, while the event is live:

/revfights 4   # start 4 simultaneous 1v1s (8 dead players)
/rflist       # list active fights

Loaded copies are named RevFightWorld-001, -002, … in the server root. They're all deleted automatically on the next restart, but if you want to flag them for cleanup right now use /delrfworlds.

i

Spawn point of each arena = the world's level.dat spawn. Set it where you want fighters to drop in.

Command reference.

Every command requires its corresponding cpvpevent.<name> permission, or op.

Event control

CommandDescription
/startevent <min> <mode> <announce>Start an event after a countdown. Modes: Automatic · HighPlayers · LowPlayers · Manually. Announce: announcestart or silentstart.
/startforce <mode> <announce>Force-start the event immediately, no countdown.
/stopeventStop the auto-event sequence cleanly.
/pauseeventPause the auto-event sequence.
/resumeeventResume a paused auto-event sequence.
/eventstatusShow where the Automatic event sequence is. Past steps, current step, time until the next one.
/announcewinnerBroadcast the winner of the event.
/announce <message>Send a styled title announcement.

World & border

CommandDescription
/border <distance> <time>Animate the border to the given distance over the given time (in seconds).
/stopborderFreeze the border at its current position.
/resumeborderResume the border toward its saved target.
/drop <deepslate|bedrock>Drop all blocks above the given level inside the border.
/setnetheriteConvert all bedrock inside the border to netherite blocks.
/setbedrockConvert all netherite blocks inside the border back to bedrock.
/clearblockClear configured blocks from the event world.
/clearspawnClear configured blocks from the spawn world.
/regenRegenerate the event world from the backup folder.
/tpspawnTeleport to the configured spawn world.

Players & rekits

CommandDescription
/revive <player>Revive a specific player.
/reviveallRevive every dead player.
/rekit <enable|disable>Toggle the rekit commands manually.
/rekitset <deaths|disable>Set the rekit death-count threshold or disable the system.
/rekitstatusShow the current rekit death-system status.
/kitall <k1..k9>Run the chosen kit command for every alive player.
/joinspectator <true|false>Toggle "new players join as spectator".

Toggles

CommandDescription
/pvp <enable|disable>Toggle PVP.
/chat <enable|disable>Toggle chat for non-staff.
/protection <enable|disable>Toggle block place/break protection.
/staffchat <true|false>Switch your messages to staff chat mode.

RevFights & party

CommandDescription
/revfights <n>Start n 1v1 gulag fights using random arena templates.
/rflistList all active RevFights and the players in each.
/delrfworldsFlag every RevFights world for deletion on next restart.
/party <sub>Manage parties: create, invite, accept, decline, leave, kick, transfer, rename, disband, info, invites.

Tools & admin

CommandDescription
/eventsettingsOpen the visual event-settings GUI.
/eventoolsGive yourself the event tools (nether star + help book).
/helpDisplay the in-game help book with every command.
/cepreloadReload the plugin configuration without restarting.

Permission nodes.

Each command has its own node, all under the cpvpevent. prefix. Two convenient umbrella nodes exist for staff:

NodeGrants
cpvpevent.*Every CPVPEvent+ command, including admin party subcommands.
cpvpevent.partyUse of /party for normal players. Default: true.
cpvpevent.party.adminAdmin party subcommands: disable, enable, disbandall. Default: op.

For everything else, use cpvpevent.<command>, for example cpvpevent.regen, cpvpevent.revfights, cpvpevent.startevent, cpvpevent.eventstatus. The full list of nodes is in plugin.yml.

The settings you'll actually touch.

config.yml has comments on basically every line. The most useful settings are listed below. The rest is mostly cosmetic stuff (titles, chat messages, colors).

General settings

settings:
  join-as-spectator:     false
  rekit-enabled:         true
  chat-enabled:          true
  protection-enabled:    false
  pvp-enabled:           true
  fall-damage-enabled:   false

suppress-chat-messages:  false   # silence plugin broadcasts

Border & storm sickness

border:
  initial-size: 100     # radius in blocks

border-damage:
  enabled:          true
  base-damage:      2.0
  max-damage:       8.0
  damage-increase:  0.5

storm-sickness:
  enabled:            true
  tick-threshold:     15
  warning-threshold:  5
  warning-interval:   5
  safe-zone-distance: 0

Border action bar

Optional pop-in action bar that shows the live border size while it's animating to a new target. When active, it takes priority over the rekit action bar and the countdown action bar.

border-action-bar:
  enabled: false
  format:  '&#FFCC00Border: &#FF2B2B<current_border_size> &#AAAAAA-> &#FF2B2B<border_final_size>'

Placeholders: <current_border_size> and <border_final_size> (radius in blocks). Standard & color codes and &#RRGGBB hex codes both work.

"You died!" title

Red title that flashes when a player dies. Set enabled: false to turn it off entirely.

titles:
  you-died:
    enabled:  true
    main:     '&#FF2B2B&lYou died! ☠︎'
    subtitle: ''
    fade-in:  5
    stay:     40
    fade-out: 10

Allowed spawn blocks

The random teleport at event start (and on late-join into a running event) only lands players on top of one of these block types. After 60 failed tries the plugin falls back to "any solid surface" so a player is never left un-teleported.

allowed-spawn-blocks:
  - GRASS_BLOCK
  - MYCELIUM
  - SAND
  - RED_SAND
  - SNOW          # 1-8 layer snow
  - SNOW_BLOCK    # full snow block
  - POWDER_SNOW

Use any Bukkit Material name, case-insensitive. Leave the list empty to use the built-in defaults shown above.

Blocked commands during events

For non-op players while the event is running. Spectators can still use the entries listed under spectator-allowed-commands.

blocked-commands:
  enabled: true
  commands:
    - spawn
    - rtp
    - regear
    - heal
    - repair

spectator-allowed-commands:
  enabled: true
  commands:
    - spawn
    - hub
    - lobby

Four modes, one command.

/startevent <minutes> <mode> <announce> queues an event with a countdown, sequential drops, kit broadcasts, border phases, and a winner announce.

ModeBehaviour
AutomaticFull pre-built sequence. The plugin runs the whole event for you: countdown → border shrinks → drops → revives → final kits → winner announce. Use /eventstatus to see where the sequence is.
HighPlayersFor bigger lobbies. Wider border, fewer rekits, longer phases.
LowPlayersFor smaller lobbies. Tighter border, more rekits, faster pace.
ManuallyNo automatic phase changes. You handle everything yourself.

While a sequence is live, use /pauseevent / /resumeevent to handle restarts or staff calls, and /stopevent to abort cleanly. /startforce <mode> <announce> skips the countdown if you need to start right now.

You can also start any of these from the visual GUI: /eventsettings → pick mode → Force Start or Normal Start. Same flow, no typing required.

Live readout for Automatic mode.

/eventstatus shows you exactly where the Automatic event sequence is right now. Past steps are dimmed, the current step is highlighted, and upcoming steps are listed with a countdown to the next fire.

Markers:

  •  step has already fired
  •  step is the most recent fire (current step)
  • ·  step is upcoming
/eventstatus

Event Status → Automatic mode (elapsed 4:23)
 ✓ T+0:00   Border 100m (instant)
 ✓ T+1:30   Drop deepslate
 ► T+3:00   Border 80m over 60s
 · T+5:00   Drop bedrock + reviveall
 · T+8:00   Border 50m over 90s
 · T+12:00  Finish
Next step in 0:37

The command works only while an event is running in Automatic mode. In any other mode (HighPlayers, LowPlayers, Manually) it tells you so. Permission node: cpvpevent.eventstatus (default: op).

Schedule a fight every day.

The plugin can fire /startevent automatically at the same time every day. Configured in config.yml:

daily-event:
  enabled:      true
  time:         '18:00'      # 24-hour, server timezone
  mode:         HighPlayers
  waiting-time: 10           # minutes between announce and start
  announce:     true

If you change daily-event.time at runtime, run /cepreload for the scheduler to pick it up.

Built-in teams with friendly fire off.

Players can group up to 8 with /party create and /party invite. Members see each other glowing (only teammates see the glow, nobody else), and they get their own chat channel with /p <message>.

/party create
/party invite Heuxil
/party accept
/party kick Evoma_the_bot
/party leave

If you want to disable parties for a specific event, the cpvpevent.party.admin permission unlocks disable, enable, and disbandall.

party:
  max-size: 8

No camping outside the border.

Storm Sickness counts ticks for any player who's outside the border. Once they go past tick-threshold ticks over the limit, they get eliminated with a death title. You can set up a safe-zone-distance around spawn where players are immune.

storm-sickness:
  enabled:            true
  tick-threshold:     15   # ticks past border before elimination
  warning-threshold:  5    # show warning at N ticks remaining
  warning-interval:   5
  safe-zone-distance: 0    # radius (blocks) of immune zone around spawn

To disable the mechanic entirely, set storm-sickness.enabled to false and reload.

Available placeholders.

If PlaceholderAPI is installed, the following placeholders register under the cpvp identifier.

PlaceholderReturns
%cpvp_players_alive%Number of players in survival or adventure mode.
%cpvp_border%Current border radius in blocks. Auto-tracks world.target-world from config.yml, so it follows whichever world you've set as the event world.
%cpvp_rekit%Enabled or Disabled.
%cpvp_rekit_deaths%Deaths remaining until the next auto-rekit, or status text.
%cpvp_totems%Number of totems of undying in the player's inventory.
%cpvp_team%Player's party size as n/max, or N/A.
%cpvp_ping%Player's ping in ms.

When something looks off.

License validation failed

Open the console and read the error line. The most common reasons:

  • The placeholder is still there. Make sure license.key is your real key, not PASTE-YOUR-KEY-HERE.
  • Quotes were dropped. Keep the surrounding single quotes in config.yml.
  • The server can't reach the API. Network issues or a firewall blocking outbound HTTP. The plugin needs to talk to the SunLicense API on enable.
  • You did /reload. A plugin reload doesn't re-run the license check. Use a full server restart.

"World 'X' not found! Run /regen first."

The world configured as world.target-world doesn't exist on disk. Either generate it manually, set the value to a world that does exist, or place a template folder in plugins/CPVPEvent+/regen-templates/ and run /regen once.

/regen kicks players but never restarts

The plugin dispatches /restart by default. If your host doesn't have a working settings.restart-script in bukkit.yml, the server will shutdown and your wrapper needs to bring it back up. Two things to check:

  • On Pterodactyl/Folium, make sure Auto-restart on crash is on in the panel.
  • If /restart misbehaves on your host, try regen.restart-method: shutdown in config.yml to force a clean shutdown instead.

/regen finished but my world looks the same

Two common causes:

  • The template folder is empty or invalid. Each subfolder under regen-templates/ needs a real level.dat + chunks. If it's empty, the plugin "resets" to nothing and Minecraft regenerates fresh terrain.
  • You captured the template after your changes. The template is whatever you copied. If it already has your changes baked in, the regen "works" but the result looks identical to what was there before. Re-capture from a fresh world.

/regen looks fine right after, but breaks once players walk around

Your template doesn't include all the chunks. World folders only contain the chunks that were loaded on disk when you copied them, so any unvisited chunk gets regenerated from scratch the first time a player walks into it after /regen, which produces patchy terrain, weird biome borders, and players occasionally spawning in mid-generation chunks.

Fix: install Chunky, run /chunky world <name> + /chunky radius <blocks> + /chunky start to pre-generate every chunk inside the event area, then capture the template. See the FAQ for the full sequence.

Border placeholder shows wrong world

As of the latest version, %cpvp_border% and the in-game scoreboard Border: line both auto-track world.target-world from config.yml. If you're on an older build and seeing a hardcoded world name, update the plugin.

RevFights does nothing

Check the console for [RevFights] No world templates found in .... That means you haven't put any arenas in plugins/CPVPEvent+/RevFights-Worlds/. Each subfolder in there counts as one arena template.

Placeholders don't expand

Make sure PlaceholderAPI is installed. On startup you should see PlaceholderAPI register result: true in the console. If you don't see it, the plugin will warn you.

Common questions.

Stuff people ask a lot. Short answers first.

How do I set up my license key? +

Open plugins/CPVPEvent+/config.yml, replace PASTE-YOUR-KEY-HERE on the license.key line with your BuiltByBit key, keep the single quotes, and fully restart the server.

A /reload won't trigger the check. See License Activation for the step-by-step.

How do I set up the world for /regen? +

Make a clean copy of each event world folder you want resettable, and drop them inside plugins/CPVPEvent+/regen-templates/. One subfolder per world. Subfolder names must match the live world names exactly.

So for a server with world + world_minecraft_plains, you'd end up with:

  • plugins/CPVPEvent+/regen-templates/world/level.dat
  • plugins/CPVPEvent+/regen-templates/world_minecraft_plains/level.dat

All listed worlds get reset in parallel on the next boot. Full walkthrough in Setting Up /regen.

Can /regen reset multiple worlds at once? +

Yes. Drop one subfolder per world into plugins/CPVPEvent+/regen-templates/ and the plugin spawns one thread per template, runs them in parallel, and waits for all of them before booting. Same approach as the MultiReset plugin.

Single-world legacy setups (one folder directly inside plugins/CPVPEvent+/ matching regen.backup-folder) still work as a fallback.

My /regen is bugging out / terrain looks weird after regen +

You probably didn't pre-generate the world with Chunky before capturing the template. This is the #1 cause of weird regen behaviour.

What happens: when you copy a world folder, you only copy the chunks that were actually loaded on disk. Any chunk that was never visited stays empty in the template. After /regen, those empty areas get freshly generated by Minecraft the first time a player walks into them, which means the seed and biome data might not match the rest of the world, players can spawn in mid-generation chunks, and the border can push people into ungenerated terrain.

Fix: install Chunky, then before capturing your template:

/chunky world <your-world>
/chunky radius 200      # a bit larger than your event border
/chunky start
# wait for it to finish (can take a while on big radii)

Then stop the server, copy the world folder into plugins/CPVPEvent+/regen-templates/, and you're good. Re-run Chunky if you ever expand the border.

What's the difference between target-world and spawn-world? +

target-world is your event world: the one with the border, where fights happen, the one /regen rebuilds.

spawn-world is your lobby: where /tpspawn sends players, and where the "back to spawn" flows lead. They are usually two different worlds.

How do I set up RevFights arenas? +

Build each arena as a normal Minecraft world, then drop the entire world folder into plugins/CPVPEvent+/RevFights-Worlds/. You can have as many as you want, and the plugin picks one at random per fight.

Each arena folder must contain a valid level.dat. The level.dat spawn point is where fighters drop in. See RevFights Arenas.

Why does /regen need a server restart? +

Bukkit holds open file handles on a loaded world, so you can't safely delete and replace the folder while the server is running. The plugin gets around this by writing a flag file, kicking everyone, and restarting. On the next boot, before any world loads, the swap happens cleanly.

It's the same trick MultiReset uses, just built in.

How do I enable a daily event? +

In config.yml, find the daily-event block and set enabled: true, then choose a time: in 24-hour format (server timezone) and a mode. Reload with /cepreload.

Example: time: '21:00' + mode: HighPlayers + waiting-time: 10 = announce at 21:00, start at 21:10. See Daily Events.

How do I disable Storm Sickness? +

Set storm-sickness.enabled to false in config.yml and reload with /cepreload. Players outside the border will then only take normal world-border damage.

How do I block extra commands during events? +

Add the command name (no leading slash) to the blocked-commands.commands list in config.yml. Defaults already block spawn, rtp, heal, repair, clear, etc. Reload with /cepreload.

Op players are never affected.

How do I add custom kit commands to the rekit-disabled list? +

Add them to the rekit-commands list in config.yml, without the leading slash. Entries can be either bare command names (k1) or full command + first argument (publickit kit1) to block only that exact usage.

Placeholders aren't expanding. what's wrong? +

Three things to check, in order:

  1. PlaceholderAPI is installed and enabled (it's a soft-dep, not bundled).
  2. On startup, the console says PlaceholderAPI register result: true.
  3. You are using the cpvp_ prefix, for example %cpvp_players_alive%, not %players_alive%.
Can I change the border size mid-event? +

Yes. /border <new-radius> <seconds> animates the border to the new size over the given duration. Use /stopborder to freeze, /resumeborder to keep going.

The action bar reflects the live size automatically.

How does the auto-rekit death system work? +

You set a death threshold via /rekitset <n>. After n total event deaths, rekits enable themselves for a configurable window (with chat broadcast). The action bar shows progress as you approach the threshold. Set with /rekitset disable to turn the system off.

Manual /rekit enable|disable overrides the system temporarily.

What's the new Automatic mode? +

It's a fully pre-built event sequence. You start it with /startevent <min> Automatic <announce> (or pick it in the GUI) and the plugin runs the whole thing for you: countdown, border phases, drops, revives, kit broadcasts, winner announce. You don't need to touch anything mid-event.

While it's running, /eventstatus shows you exactly where the sequence is: past steps, current step, time until the next one. See Event Status.

How do I turn on the border action bar? +

In config.yml, find border-action-bar and set enabled: true, then reload with /cepreload. The action bar pops in any time the border is animating to a new size and disappears once it stops.

Customize the format string with <current_border_size> and <border_final_size> placeholders. Both & color codes and &#RRGGBB hex codes work.

How do I disable the "You died!" title? +

Set titles.you-died.enabled to false in config.yml and reload with /cepreload. You can also rewrite the text and timing under the same block. See Configuration.

Players spawn on weird blocks (water, lava, leaves) at event start +

Adjust the allowed-spawn-blocks list in config.yml. The plugin tries 60 random spots looking for one of these blocks before falling back to "any solid surface". If the list is too restrictive, increase it; if it's too loose, narrow it down.

Default list includes grass, mycelium, sand, red sand, and snow types. Add any Bukkit Material name (case-insensitive).

What if my problem isn't listed here? +

Open a ticket on Discord. When you do, include: server software (Paper, Spigot, etc.) + version, plugin version, the relevant config block, and any error lines from the console.

Need help?

Open a ticket on Discord and I'll get back to you. When you do, please include your server software (Paper, Spigot, etc.), the plugin version, and any error lines from the console. Saves a ton of back and forth.

Thanks for using CPVPEvent+. Bug reports, feature ideas, weird questions, all welcome.