Spigot Plugin

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.

src/main/java/eu/codexe/maceroulette/MaceRoulettePlugin.java
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();
        }
    }
}