Description
MazePvP
Tired of fighting other players on a dull, easy-to-navigate terrain? With this plugin, you can fight in a maze which is constantly changing shape while you're not looking! Even the players can reshape the maze with the right items. Beware of the mobs that appear and be on a lookout for treasure chests.
The source of this plugin is available in the jar files and also on github.
Features
- Ability to create multiple mazes of any size
- Indestructible bosses that can teleport and kill players instantly (by default)
- Projectile items such as eggs, snowballs and ender pearls behave differently inside mazes
- Mobs and chests randomly appear
Chasms
Holes can appear in the floor either naturally or because of players. They are filled with spikes, and anyone who falls into them instantly dies, so be sure not to fall! These can actually be jumped over if the timing and angle is exactly right.

Items
When a player enters a maze, he will get some items to use. When exiting the maze, the inventory gets cleared, so don't go near the exit if you are still planning to fight inside. You can find more items inside treasure chests, and you can store them in ender chests so that you don't lose them after dying. Some items behave differently inside mazes.
Eggs
Eggs can be used to break the walls and floor. However, they do not break the "pillars" that are marked as mossy stone bricks. The floor will smoke for a few seconds before disappearing, so use that time to find safe footing!
Snowballs
You can use snowballs to restore parts of the floor or walls. Just throw them at a pillar or in a chasm.
Ender pearls
Instead of teleporting to where the pearl landed, you will teleport to a random location inside the maze, and you won't suffer any damage. These can really come in handy if you're falling into a chasm or facing a lot of enemies!
Bosses
Bosses are zombies with black clothes and a wither skeleton mask. By default, one will appear in every maze. He can teleport to any location, so you never know when you'll encounter him! If he falls into a chasm, he will teleport away before hitting the bottom. His HP and strength can be customized in the config file. By default, he cannot be killed and he can kill players with one hit.

How to use/install, quick setup
To install the plugin, just drop the jar in your plugins folder.
Here's a quick example setup:
- Create a two-floored, 4x4 maze named "myMaze" where you are standing by using the command /mpcreate myMaze 4 2 2
- If you'd like your players to enter the maze using join signs instead of the entrances, put three signs next to each other somewhere, look at the first one and type /mpjoinsign myMaze
- Change the minimum amount of players by typing /mpsetplayernum myMaze 1 5
This will allow at most 5 players to join, and 1 player is enough to start the fight. - If you want players to be transported to a waiting area while they are waiting for other players, build your waiting room and inside it, type /mpsetwp myMaze
- Put up a sign somewhere in the waiting area, then look at it and type /mpleavesign myMaze
This will create a sign that allows players to leave the waiting area if they get bored.
Now you're set! To test your maze, click on the join sign to get transported inside it. If you die 3 times or disconnect, you will return back to the join sign with your previous items.
You should only set the minimum players to 1 if you're testing the maze. When it's ready for other players to use, set it to a higher number.
Check the commands section below for details about the commands. You can also change the text of the signs and much more by editing the config.yml. Check the configuration section to see how.
Commands
These commands can be used to manage the mazes:
| /mpcreate <name> <width> [height] <entrancenum> [X] [Y] [Z] | Creates a maze with name <name> at [X] [Y] [Z] (or player's position if not specified). <width> is the number of 5x5 passages the maze should have, (for example, setting it to 5 will generaze a 25 block wide maze). [height] is the number of floors the maze should have (1 if omitted). Note that larger size mazes will take more time to generate (widths above 10 might take several seconds). <entrancenum> is the number of entrances/exits the maze should have. |
| /mpdelete <name> | Removes the maze with the specified name, deleting all its blocks and killing all mobs inside it |
| /mplist | Lists all mazes in the current world and their locations |
| /mpclear <name> | Clears a maze, making it ready for a new fight. It removes all entities in it and fills the chasms |
| /mpjoinsign <name> | Turns the sign in front of the player into a join sign for the specified maze. If the join sign's text is longer than 4 lines, there must be more signs next to each other. (If you use the default text, you need to have 3 signs next to each other) |
| /mpsetplayernum <name> <minplayers> <maxplayers> | Sets the minimum amount of players needed to start a fight and the maximum amount of players that can join. This only applies to mazes with join signs. |
| /mpsetwp <name> [X] [Y] [Z] | Sets the waiting place position for a maze to the specified coordinates, or to the players position if they are left out. When a player joins that maze using join signs, he gets teleported to the waiting place. |
| /mpleavesign <name> | Turns the sign in front of the player into a "leave sign" that can be used to leave the waiting place of the specified maze. This sign should be inside the waiting place of that maze |
| /mpremovewp <name> | Removes the waiting place for a maze. |
| /mpstopfight <name> | Stops the fight in the specified maze. This only applies to mazes with join signs. |
| /mpset [mazename] <property> <value> | Used to set a property for a maze. The properties can be found in the maze's config file. If the maze name is omitted, the default property (that gets copied to newly created mazes) is set instead. You cannot set the item properties (like bosses.bossX.drops or startItems) with this. For that, use /mpadditem or /mpremoveitem instead |
| /mpget [mazename] <property> | Shows the current value of the specified property of a maze. If the maze name is omitted, it shows the default property instead |
| /mpadditem [mazename] <property> [itemID] [amount] [weigh] | Adds an item to an item property, like startitems. If mazename is omitted, the default property is set. If itemID, amount and weigh is omitted, the item in the player's hand is used (this only copies the id and amount of the item, but special data like enchantments aren't copied in the current version of this plugin). If you specify something like startitems.item2 for property, that item will be overwritten instead of a new item getting added |
| /mpremoveitem | There are two ways to use this command: |
- /mpremoveitem [mazename] <property> [itemID] [amount], the property being something like startitems
In this case, the item with the specified id and amount gets removed from the property. If itemID and amount is omitted, the item in the player's hand is used. - /mpremoveitem [mazename] <property>, the property being something like boss.drops.item2
In this case, the item specified by property is removed.
| /mpaddboss [mazename] | Adds a new boss to a maze (or to the default config if mazename is omitted) with default properties |
| /mpremoveboss [mazename] <bossNum> | Removes the boss with number bossNum from the maze |
| /mpcopyboss [mazename] <bossNum> | Adds a new boss to the maze by copying the boss with number bossNum |
| /mprecover <mazename> | If there's saved player data for a maze (can only happen when the server crashed during a fight), this command recovers the items, enderchest content, gamemode and position of the players who were inside the maze |
Permissions
mazepvp: Gives access to all commands in MazePvP. By default, this is given to all ops.
Configuration
This plugin has a config.yml file, in which various settings can be changed. Each maze also has its own config file in the Minecraft world folder with the name <mazename>.yml. When a new maze is created, it gets the configuration values from the main config.yml file.
Some settings can be changed individually for each maze by editing their config file or with the /mpset command. These settings will be marked in italics.
| showHeadsOnSpikes | Whether the heads of fallen players and mobs should appear on the spikes |
| canPlayersSpectate | Whether players can enter the maze as spectators when the fight has already started |
| canSpectatorsSeeEachOther | Whether spectating players can see other spectators |
| replaceMobsWithBoss | Whether a boss should replace another mob when he respawns. This could be useful when there's a limit on how many mobs are allowed per chunk |
| protectMazes | Whether maze blocks should be protected from players breaking them |
| fightStartDelay | The amount of seconds before a fight starts after enough players have joined. You can set this to 0 if you want the fight to start immediately, but then there won't be time for additional players to join at the last moment |
| playerLives | The amount of lives a player has in a fight. If they run out, the player gets thrown out of the maze. |
| bosses.bossCount | The number of bosses in the maze |
| bosses.bossX.name | The name of the boss that should appear in the chat |
| bosses.bossX.hp | The health of the boss, in half-hearts. For a normal zombie, this value would be 20. If this is 0 or less, the boss will have infinite HP |
| bosses.bossX.attack | The strength of the boss. If this is 0 or less, the boss will have infinite attack |
| bosses.bossX.mazeLevel | The maze floor that the boss is bound to (1, 2, 3, etc.) 0 if he's not bound to any floor |
| bosses.bossX.drops.itemX | Items that the boss could drop. An item with higher weigh will have a higher chance of getting dropped |
| bosses.bossX.drops.itemCount | This number indicates how many items there are in bosses.bossX.drops.* For example, if bosses.bossX.drops has item1 and item2 set, this value should be 2 |
| commands.* | These are commands that get executed at certain events. You can use special symbols that get substituted as something else. These symbols are: |
- <player>: The name of the player who triggered the event
- <allPlayers>: If this is in the text, the command will execute for every player and their names will be substituted where this is found
- <otherPlayers>: Same as <allPlayers>, except that it doesn't contain the player who triggers the event.
| commands.fightStarted | The command to execute when the fight starts. <player> takes no value |
| commands.fightRespawn | The command to execute when a player respawns. <player> is the name of the respawning player |
| commands.fightPlayerOut | The command to execute when a fighting player leaves the maze, either by quitting or by losing all lives. <player> is the name of the leaving player |
| commands.fightWin | The command to execute when a player wins. <player> is the name of the winning player |
For example, if you want to teleport all players to the respawning player, you should put the following into commands.fightRespawn:
tp <otherPlayers> <player>
| texts.* | These are the texts that are showed to the players on a sign or during a fight. You can use special symbols that get substituted as something else. These symbols are: |
- <name>: The name of the maze the text is referring to
- <currentP>: The current number of players that joined the maze
- <minP>: The minimum number of players needed to start the fight
- <maxP>: The maximum number of players allowed in the maze
- <remainingP>: The number of players that have to join before the fight can start. This is basically minP − currentP
- <state>: The state of the maze: This shows whether the fight has started or not
- <timeLeft>: The amount of seconds left until the fight starts. This should only appear in the countdown message
- <livesLeft>: The amount of lives the player has left. This should only appear in the respawn message
If you're not sure how to use these, check the default configuration file to see how they are used.
| texts.startedState | The text that should replace <state> when the fight has started |
| texts.waitingState | The text that should replace <state> when the fight hasn't yet started |
| texts.joinSign | The text that appears on a join sign. This can have multiple lines. If it has more than 4 lines, the rest of the text is shown on the next sign |
| texts.leaveSign | Same as texts.joinSign, just for the "leave sign" that is used to leave a waiting area |
| texts.joinBroadcast | The message that gets sent to joined players when another player joins or leaves |
| texts.joinBroadcastWhenFull | Same as texts.joinBroadcast, except that this is sent when the required amount of players have joined already |
| texts.countdown | The message that gets sent to joined players each second during the countdown |
| texts.fightStarted | The message that gets sent to joined players when the fight starts |
| texts.fightRespawn | The message that gets sent to a player when he respawns during a fight |
| texts.fightRespawnLastLife | Same as texts.fightRespawn, except that this is sent when the player has 1 life left |
| texts.fightPlayerOut | The message that gets sent to players still in fight when a player loses all lives |
| texts.fightWin | The message that gets to the last remaining player |
| texts.fightStopped | The message that gets sent when someone uses the /mpstopfight command |
| texts.onJoin | The message that gets sent when a player joins a maze |
| texts.onLeave | The message that gets sent when a player leaves a maze |
| texts.onJoinAfterFightStarted | The message that gets sent when a player tries to join when the fight has already started |
| texts.onJoinWhenMazeFull | The message that gets sent when a player tries to join when the maze is full |
| texts.onJoinWhenAlreadyJoinedOtherMaze | The message that gets sent when a player tries to join a maze while he has joined another one |
| probabilities.groundReappear | The rate at which chasms in the ground will heal. If this is set to a low value, they will disappear slower |
| probabilities.chestAppear | The chance for a chest to appear at certain intervals. |
| probabilities.enderChestAppear | The chance for an ender chest to appear at certain intervals. |
| probabilities.mobAppear | The chance of a mob appearing at certain intervals. |
| chestItems.itemX | Items that can appear inside chests. Items with higher weigh will have a higher chance of appearing in treasure chests. |
| chestItems.itemCount | Like bosses.bossX.drops.itemCount, this number indicates how many items there are in chestItems.* For example, if chestItems has item1 through item10 set, this value should be 10 |
| startItems.itemX | Items that players get when entering a maze |
| startItems.itemCount | Like bosses.bossX.drops.itemCount, this number indicates how many items there are in startItems.* For example, if startItems has item1 through item4 set, this value should be 4 |
| blocks.* | These properties specify what kind of blocks the maze is made of. They store the block id and data of the blocks that make up some part of the maze. For example, if blocks.floor has the following value: |
98:1 98 98 98:1
98 41 41 98
98 41 41 98
98:1 98 98 98:1
That means that the floor has gold blocks in the middle, stone bricks on the sides, and mossy stone bricks at the four edges.
If these values are set using /mpset, then for the value you have to write all the blocks in each row as one line, with the values separated by some character that's not ":" (because that's used to specify the data value for a block). For example, you can change the floor to the above pattern with the following:
/mpset blocks.floor 98:1_98_98_98:1_98_41_41_98_98_41_41_98_98:1_98_98_98:1
| blocks.wall | The blocks for the walls of the maze |
| blocks.higherWall | The blocks for the walls of higher levels |
| blocks.outerWall | The blocks for the outermost walls |
| blocks.pillar | The blocks for the pillars (the ones that are by default covered with mossy cobblestone) |
| blocks.outerPillar | The blocks for the outermost pillars |
| blocks.floor | The blocks for the floor |
| blocks.higherWall | The blocks for the floor of higher levels |
| blocks.lowerFloor | The blocks for the part that's directly under the spikes |
| blocks.spikes | The blocks for the spikes in a chasm |
| blocks.ceiling | The blocks for the ceiling |
Support
If you have any suggestion or encounter a bug, post a comment or send me a PM!



