Spigot Plugin

BossConfiguratorPlugin

Make me a custom boss system that you can choose what name, what mob, how much damage, how much health, what weapons and armor and what loot it drops with a chance percentage each item and make the boss spawn at a set interval time and make all of this configurable using a gui and commandsgbbb

src/main/java/eu/codexe/bossconfigurator/BossConfiguratorPlugin.java
package eu.codexe.bossconfigurator;

import eu.codexe.bossconfigurator.commands.BossCommand;
import eu.codexe.bossconfigurator.gui.BossListGui;
import eu.codexe.bossconfigurator.listeners.BossDeathListener;
import eu.codexe.bossconfigurator.listeners.BossSpawnListener;
import eu.codexe.bossconfigurator.managers.BossManager;
import eu.codexe.bossconfigurator.storage.BossStorage;
import eu.codexe.bossconfigurator.storage.YamlBossStorage;
import eu.codexe.bossconfigurator.utils.MessageUtil;
import eu.codexe.bossconfigurator.utils.PluginConfig;
import org.bukkit.Bukkit;
import org.bukkit.command.PluginCommand;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.Objects;

public final class BossConfiguratorPlugin extends JavaPlugin {

    private PluginConfig pluginConfig;
    private MessageUtil messageUtil;
    private BossStorage storage;
    private BossManager bossManager;
    private BossListGui bossListGui;

    @Override
    public void onEnable() {
        saveDefaultConfig();

        this.pluginConfig = new PluginConfig(this);
        this.messageUtil = new MessageUtil(this, pluginConfig);
        this.storage = new YamlBossStorage(this, pluginConfig);
        this.bossManager = new BossManager(this, pluginConfig, messageUtil, storage);
        this.bossListGui = new BossListGui(this, bossManager, messageUtil);

        storage.loadAll();
        bossManager.loadScheduledBosses();

        Bukkit.getPluginManager().registerEvents(new BossDeathListener(this, bossManager, messageUtil), this);
        Bukkit.getPluginManager().registerEvents(new BossSpawnListener(this, bossManager), this);
        Bukkit.getPluginManager().registerEvents(bossListGui, this);

        PluginCommand command = Objects.requireNonNull(getCommand("boss"), "boss command missing from plugin.yml");
        BossCommand bossCommand = new BossCommand(this, bossManager, pluginConfig, messageUtil, bossListGui);
        command.setExecutor(bossCommand);
        command.setTabCompleter(bossCommand);
    }

    @Override
    public void onDisable() {
        if (bossManager != null) {
            bossManager.shutdown();
        }
        if (storage != null) {
            storage.saveAll();
        }
    }

    public PluginConfig getPluginConfigWrapper() {
        return pluginConfig;