MaceRoulettePlugin
Create a Minecraft Paper plugin for Minecraft 1.21+ called “MaceRoulette”. The plugin should be a fast PvP minigame where 4–6 players join a small arena platform and fight using a rotating mace mechanic. CORE GAMEPLAY: - Players join using /mr join - Game starts automatically when 4–6 players join - Players spawn on a platform that admins can configure - In the center of the platform there is a floating mace item - The mace rotates around the center every 5 seconds - The rotation should be smooth and visually cool using armor stands or display entities - When the rotation stops on a player:
Read the full description
- That player receives: - 1 Mace - Wind Charges - Temporary glowing effect - Sound + particle effects - The selected player becomes the “hunter” - The hunter must kill another player using the mace COMBAT: - Mace should have enhanced knockback and slam effects - Wind charges should help with mobility - Add hit particles and sounds - Add slow motion effect on kill if possible - Add combo and impact effects PLAYER DEATH: When a player dies: - Create a cinematic death animation - Example: - Explosion particles - Lightning strike - Player launched upward - Redstone/blood-like particles - Dramatic sound - Eliminate the player from the match - Put dead players into spectator mode ROUND SYSTEM: - After a player dies: - Remove the mace from current player - Wait 3 seconds - Start rotating mace again - Randomly choose another player - Continue until only 1 player remains - Last alive player wins WIN SYSTEM: - Broadcast winner title - Fireworks celebration - Reward commands configurable - End game after celebration ARENA SYSTEM: Commands: - /mr createarena <name> - /mr setspawn <id> - /mr setcenter - /mr setlobby - /mr start - /mr stop Arena settings: - Spawn locations - Platform center - Lobby location - Spectator location VISUALS: - Use Adventure API - BossBar countdown - ActionBar messages - Floating holograms - Particle trails - Smooth animations CONFIG: Provide: - config.yml - arenas.yml - messages.yml Everything configurable: - Rotation speed - Game timers - Particle effects - Sounds - Rewards - Minimum players - Maximum players TECHNICAL REQUIREMENTS: - Java 21 - Paper API 1.21+ - Maven project - Clean architecture - Managers/listeners system - Optimized and async-safe - No deprecated APIs - Use enums where possible - Fully commented code DELIVER: - Full source code - File structure - plugin.yml - pom.xml - Example configs - Build/setup instructions The plugin should feel polished, smooth, modern, and visually impressive like a premium minigame plugin.
package eu.codexe.maceroulette;
import eu.codexe.maceroulette.commands.MRCommand;
import eu.codexe.maceroulette.listeners.CombatListener;
import eu.codexe.maceroulette.listeners.JoinQuitListener;
import eu.codexe.maceroulette.listeners.PlayerDeathListener;
import eu.codexe.maceroulette.managers.ArenaManager;
import eu.codexe.maceroulette.managers.GameManager;
import eu.codexe.maceroulette.managers.MessageManager;
import eu.codexe.maceroulette.managers.VisualManager;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
public final class MaceRoulettePlugin extends JavaPlugin {
private ArenaManager arenaManager;
private MessageManager messageManager;
private VisualManager visualManager;
private GameManager gameManager;
@Override
public void onEnable() {
saveDefaultConfig();
saveResource("messages.yml", false);
this.messageManager = new MessageManager(this);
this.arenaManager = new ArenaManager(this);
this.visualManager = new VisualManager(this);
this.gameManager = new GameManager(this, arenaManager, messageManager, visualManager);
Bukkit.getPluginCommand("mr").setExecutor(new MRCommand(this, arenaManager, gameManager, messageManager));
Bukkit.getPluginManager().registerEvents(new JoinQuitListener(gameManager, messageManager), this);
Bukkit.getPluginManager().registerEvents(new CombatListener(gameManager, messageManager), this);
Bukkit.getPluginManager().registerEvents(new PlayerDeathListener(gameManager, messageManager), this);
}
@Override
public void onDisable() {
if (gameManager != null) {
gameManager.shutdown();
}
}
}