CPVPEvent+
v2.0Permanent links
- Get it on BuiltByBit (CPVPEvent-2.0.jar)
- How to install it
- License activation
- Full command list
- Config reference
- Permission nodes
- Frequently asked questions
- Troubleshooting
- Watch the demo
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.
New here? Read these in order: Installation → License → Configuring Worlds → Setting Up /regen. That's enough to get the basics working.
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. Rebuilds multiple worlds in parallel on boot, strips the world ID so you never hit the duplicate-world error, and warns you in console if a template is missing its terrain.
Unbreakable Armor
Optional. Armor stops losing durability inside the event world only, so gear never breaks mid-fight on long events while your other worlds keep normal wear.
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 |
|---|---|
| Minecraft | 1.20.4 to 1.21.x |
| Server software | Paper, Purpur (recommended). Spigot may work but is not actively tested. |
| Java | Java 17 or higher. |
| Required plugins | None. |
| Soft-dependencies | PlaceholderAPI, TAB |
| Internet access | Required 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.
-
Download CPVPEvent+.jar
Grab the latest jar from your BuiltByBit purchase page.
-
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. -
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. -
Paste your license key
Open
config.ymland replacePASTE-YOUR-KEY-HEREwith the key from your BuiltByBit purchase. See License Activation for the full walkthrough. -
Configure your worlds
Set
world.target-worldandworld.spawn-world. See Configuring Worlds. -
Restart the server
On a clean boot you should see
License verifiedandPlugin enabledin 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
safe-protection-duration: 10 # seconds of spawn immunity (new)
grace-period-duration: 10 # seconds before /drop and /reviveall arm pvp (new)
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
| Key | Purpose |
|---|---|
target-world | The world the border lives in. Players join the event by being teleported here. /regen rebuilds this world by default. |
spawn-world | The lobby world. /tpspawn sends players here, and so do all "exit event" flows. |
spawn-location | The exact coordinates inside the event world where players appear when joining the event. |
auto-kit | If true, runs the default-kit command on join automatically. |
10-seconds-safe-protection | Grants spawn immunity on respawn into the event world. The length is set by safe-protection-duration. |
safe-protection-duration | How many seconds that spawn immunity lasts. Defaults to 10. |
grace-period-duration | How long /drop and /reviveall wait before pvp, protection and fall damage flip back on, ending with the 3, 2, 1 countdown. Defaults to 10. |
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.
The regen rebuilds your event maps from clean templates you set up once. It deletes the live world folders and drops your templates back in their place. This happens on server startup, before any world is loaded, so the swap is always safe and nothing is holding the files open while it runs.
You set up one template folder per world inside plugins/CPVPEvent+/regen-world/
and the plugin rebuilds all of them in parallel every time the server boots.
/regen itself is just the button that makes this happen on demand: it warns
players, kicks them, and restarts the server so a fresh rebuild runs on the way back up.
How it works
On every boot, before Bukkit loads a single world, the plugin looks inside your
regen-world/ folder and spins up one thread per template. Each thread deletes
the matching live world and copies the template in its place. The main thread waits for all
of them to finish before the server is allowed to load any world, so players never join
mid-swap.
Two things happen automatically on each copy so you don't have to think about them. The
plugin deletes the world's uid.dat from the fresh copy, which stops Paper from
throwing the "is a duplicate of another world" error when your template was cloned
from an existing world. It also runs a quick check on the template and prints a loud warning
in console if the terrain looks missing or the folder is laid out wrong, so an empty map
never catches you by surprise (more on that in the FAQ).
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-world/
Drop each backup world folder into plugins/CPVPEvent+/regen-world/.
The folder is created automatically on first start. Each subfolder name must exactly match
the live world name on disk.
└── CPVPEvent+/
├── config.yml
├── regen-world/ # ← 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-world # 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)
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, watch the console.
A healthy rebuild looks like this:
[CPVPEvent+] Regenerating 3 world(s) in parallel (MultiReset-style)...
[CPVPEvent+] Resetting 'world_minecraft_plains' from .../regen-world/world_minecraft_plains
[CPVPEvent+] Resetting 'world_minecraft_desert' from .../regen-world/world_minecraft_desert
[CPVPEvent+] Resetting 'world' from .../regen-world/world
[CPVPEvent+] 'world_minecraft_plains' reset in 1840ms.
[CPVPEvent+] 'world' reset in 2210ms.
[CPVPEvent+] 'world_minecraft_desert' reset in 2032ms.
[CPVPEvent+] Regen complete - 3 world(s) ready for startup.
Watch the reset time. A real world with terrain takes a second or two to copy. If a reset finishes in something tiny like 150ms, your template is basically empty and the map will load as void. If you ever see a block that starts with ===== REGEN TEMPLATE PROBLEM =====, read it. It tells you exactly what's missing. There's a whole FAQ entry on this below.
If the regen-world/ folder is empty, the plugin won't delete anything. It only rebuilds worlds it has a template for, so it can never wipe a map and leave you with nothing.
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.
└── 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.
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
| Command | Description |
|---|---|
/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. |
/stopevent | Stop the auto-event sequence cleanly. |
/pauseevent | Pause the auto-event sequence. |
/resumeevent | Resume a paused auto-event sequence. |
/eventstatus | Show where the Automatic event sequence is. Past steps, current step, time until the next one. |
/announcewinner | Broadcast the winner of the event. |
/announce <message> | Send a styled title announcement. |
World & border
| Command | Description |
|---|---|
/border <distance> <time> | Animate the border to the given distance over the given time (in seconds). |
/stopborder | Freeze the border at its current position. |
/resumeborder | Resume the border toward its saved target. |
/drop <deepslate|bedrock> | Drop all blocks above the given level inside the border. |
/setnetherite | Convert all bedrock inside the border to netherite blocks. |
/setbedrock | Convert all netherite blocks inside the border back to bedrock. |
/clearblock | Clear configured blocks from the event world. |
/clearspawn | Clear configured blocks from the spawn world. |
/regen | Regenerate the event world from the backup folder. |
/tpspawn | Teleport to the configured spawn world. |
Players & rekits
| Command | Description |
|---|---|
/revive <player> | Revive a specific player. |
/reviveall | Revive every dead player. |
/rekit <enable|disable> | Toggle the rekit commands manually. |
/rekitset <deaths|disable> | Set the rekit death-count threshold or disable the system. |
/rekitstatus | Show 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
| Command | Description |
|---|---|
/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
| Command | Description |
|---|---|
/revfights <n> | Start n 1v1 gulag fights using random arena templates. |
/rflist | List all active RevFights and the players in each. |
/delrfworlds | Flag 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
| Command | Description |
|---|---|
/eventsettings | Open the visual event-settings GUI. |
/eventools | Give yourself the event tools (nether star + help book). |
/help | Display the in-game help book with every command. |
/cepreload | Reload 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:
| Node | Grants |
|---|---|
cpvpevent.* | Every CPVPEvent+ command, including admin party subcommands. |
cpvpevent.party | Use of /party for normal players. Default: true. |
cpvpevent.party.admin | Admin 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
Extra options
The extra: block at the bottom of config.yml holds a few on/off switches. Two of these are recent additions.
extra:
event-command-enabled: true # require /event to join the event
disable-pvp-protection-countdown: false
unbreakable-armor: false # armor never loses durability (new)
disable-back-command: false # block /back inside the event world (new)
| Key | Purpose |
|---|---|
unbreakable-armor | When on, armor never loses durability while a player is in the event world. Only applies inside target-world, so survival worlds keep normal armor wear. Great for long events where you don't want gear breaking mid-fight. |
disable-back-command | When on, players can't use /back to teleport back into the event world after dying or leaving. It only blocks /back while they're in the event world, so the lobby is untouched. Stops people from skipping the spawn flow and dropping straight back into a fight. |
Four modes, one command.
/startevent <minutes> <mode> <announce> queues an event with a countdown, sequential drops, kit broadcasts, border phases, and a winner announce.
| Mode | Behaviour |
|---|---|
Automatic | Full 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. |
HighPlayers | For bigger lobbies. Wider border, fewer rekits, longer phases. |
LowPlayers | For smaller lobbies. Tighter border, more rekits, faster pace. |
Manually | No 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.
The party glow and friendly-fire-off only apply inside the event world, so a teammate you bump into back at spawn won't be glowing or protected. The glow also refreshes when someone crosses between worlds, and parties stay usable whether or not rekits are currently on.
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.
| Placeholder | Returns |
|---|---|
%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.keyis your real key, notPASTE-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-world/ 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
/restartmisbehaves on your host, tryregen.restart-method: shutdowninconfig.ymlto 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-world/needs a reallevel.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.
My event world loads but it's completely empty (void)
The world loads but there are no blocks. This almost always means your template is missing
its terrain. The actual blocks of a world live in a region/ folder full of
.mca files. If that folder isn't sitting directly inside your template, the
world loads with nothing in it.
Open plugins/CPVPEvent+/regen-world/<your-world>/ and check what's inside.
You want to see level.dat and a region/ folder right there at the
top level. If region/ isn't there, that's your problem. The newest build also
prints a warning in console on boot when it spots this:
===== REGEN TEMPLATE PROBLEM =====
Template: .../regen-world/event-world
- Missing 'region/' folder with .mca files. The regenerated world will be EMPTY (no terrain).
A correct template looks like: regen-world/event-world/ { level.dat, region/, entities/, poi/... }
===================================
Two common reasons the region/ ends up missing: you uploaded the world folder
file by file in a web panel and the upload dropped half the .mca files
(upload a single zip and unzip it on the server instead, or use SFTP), or your world is the
dimensions/ case below.
My world has a dimensions/ folder instead of region/
If you open your template and find a dimensions/ folder instead of a
region/, your map was made as a custom dimension (this is normal for single
biome worlds built with a custom generator or a datapack). The terrain is buried at
something like dimensions/minecraft/<name>/region/.
The catch: when CPVPEvent+ sends players into your event world, Paper loads that world's
overworld, and the overworld reads its terrain from region/ at the top level,
never from dimensions/. So the arena is right there on disk, just in a spot the
overworld doesn't look at. You can't make dimensions/ work as the overworld,
that's a Minecraft rule, not a plugin limit.
Fix it once: go into dimensions/minecraft/<name>/, and move the
region/ folder (plus entities/ and poi/ if they're
next to it) up so they sit directly inside your template folder next to
level.dat. Delete the now-empty dimensions/ folder, then restart.
Once the template is fixed, every future regen copies it correctly.
Console says "World X is a duplicate of another world"
Full message: "World X is a duplicate of another world and has been prevented from
loading. Please delete the uid.dat file...". Every world folder carries a
uid.dat holding a unique ID. When you build a template by copying an existing
world, the copy carries the same ID, and Paper refuses to load two worlds with the same one.
The current build handles this for you. It deletes uid.dat from every world it
rebuilds, so the server just makes a fresh ID on load. If you're seeing this error, either
update to the latest version, or as a one-time fix delete the uid.dat file from
the world folder it names and restart.
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-world/. 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-world/world/level.datplugins/CPVPEvent+/regen-world/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-world/ and the plugin spawns one thread per template, runs them in parallel, and waits for all of them before booting.
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-world/, and you're good. Re-run Chunky if you ever expand the border.
My event world is completely empty after a regen +
The map loads but there's nothing in it, just void. Your template is missing the terrain. The blocks of any world live in a region/ folder full of .mca files, and if that folder isn't directly inside your template, the world comes back empty.
Open plugins/CPVPEvent+/regen-world/<your-world>/ and look. You should see level.dat and a region/ folder right there:
regen-world/event-world/
├── level.dat
├── region/ # the terrain (r.X.Z.mca files)
├── entities/
└── poi/
No region/? That's the issue. Quick way to tell from console too: a real world takes a second or two to copy. If the log says something like reset in 150ms, the folder is basically empty. The latest build also prints a ===== REGEN TEMPLATE PROBLEM ===== warning when it catches this.
Usual causes: the upload dropped files (uploading a folder file by file in a web panel loses .mca files all the time, so zip it and unzip on the server, or use SFTP), or you've got the dimensions/ case in the next question.
My world folder has a dimensions/ folder, not a region/ one +
This happens when your map was built as a custom dimension, which is super common for single biome event worlds (one biome, no caves, no structures, made with a custom generator or datapack). Your terrain is hiding at dimensions/minecraft/<name>/region/ instead of at the top level.
Why it loads empty: when CPVPEvent+ teleports players into your event world, Paper loads that world's overworld, and the overworld only reads terrain from region/ at the top level. It never looks inside dimensions/. So your arena is on disk, just somewhere the overworld ignores. There's no way to make dimensions/ act as the overworld, that's how Minecraft works, not the plugin.
Fix it one time: go into dimensions/minecraft/<name>/ and move region/ (and entities/ + poi/ if they're there) up a level so they sit next to level.dat in your template folder. Delete the leftover dimensions/ folder and restart. After that the regen copies it right every time.
Console says "World X is a duplicate of another world" +
Every world folder has a uid.dat file with a unique ID inside. When you make a template by copying an existing world, the copy keeps that same ID, and Paper won't load two worlds that share one. So it blocks your event world and tells you to delete the uid.dat.
The current build already does this for you. It strips uid.dat off every world it rebuilds, so the server just generates a fresh ID on load and the error never shows up. If you're still seeing it, update the plugin, or delete the uid.dat file it points at one time and restart.
Does the regen really run on every restart? +
Yes. As long as you have template folders in regen-world/, the plugin rebuilds those worlds from the templates every time the server boots, before any world loads. That's the point: your event map is fresh on every startup.
/regen is just the on-demand button. It kicks players and restarts so the rebuild happens right now instead of waiting for the next restart. If you don't want a world reset anymore, take its folder out of regen-world/.
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 doing the swap on startup instead, before any world is loaded. /regen kicks everyone and restarts so that fresh swap runs on the way back up.
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.
Can I make armor not break during events? +
Yeah. Set extra.unbreakable-armor to true in config.yml and restart. Armor stops taking durability damage while players are in the event world, so nobody's chestplate pops mid-fight on a long event.
It only kicks in inside target-world. Your survival or other worlds keep normal armor wear, so you can leave it on without messing up the rest of the server.
How do I stop players using /back to get into the event world? +
Set extra.disable-back-command to true in config.yml and restart. After that, /back won't drop players back into the event world, so they can't skip the spawn flow and teleport straight onto someone after dying.
It only blocks /back while a player is in the event world, so using /back anywhere else (like the lobby) still works fine. Plugin versions of the command like essentials:back are covered too.
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:
- PlaceholderAPI is installed and enabled (it's a soft-dep, not bundled).
- On startup, the console says
PlaceholderAPI register result: true. - 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.
