Spigot Plugin

LightningSwordPlugin

Crea un plugin per Spigot 1.19 (compatibile con versioni successive) che permette ai giocatori di lanciare fulmini sul punto a cui stanno guardando premendo il tasto destro con una spada specifica. Il plugin deve includere le seguenti caratteristiche: 1. **Configurazione del plugin**: - Un file `config.yml` che permette la personalizzazione delle spade abilitate (es. Diamante, Oro). - Configurare la distanza massima in blocchi del lancio del fulmine (default: 50 blocchi). - Messaggi personalizzabili per feedback ai giocatori (es. "Fulmine lanciato!", "Distanza troppo lontana").

Read the full description

2. **Comportamento del plugin**: - Riconoscimento dei tasti: il plugin deve intercettare l'evento di click destro del giocatore su una spada. - Verifica dei requisiti: controllare che il giocatore stia guardando un punto all'interno della distanza permessa. - Generazione del fulmine: generare un fulmine nel punto bersaglio se i criteri sono soddisfatti. 3. **Permessi**: - Creare permessi per limitare l'uso di questa abilità a determinati gruppi o giocatori. Esempi di permessi: `lightning.sword.use` e `lightning.sword.admin` per gli amministratori che possono modificare le impostazioni. 4. **Comandi**: - `/lightningsword reload`: Ricarica il file di configurazione senza dover riavviare il server. - `/lightningsword give <giocatore> [tipo_spada]`: Assegna una spada abilitata a un giocatore specificato. Richiede permesso `lightning.sword.admin`. 5. **Database**: - Utilizzare un file SQLite per tracciare le statistiche dei lanci di fulmini (opzionale). Tabelle potrebbero includere: - `lightning_usage` con campi: `player_uuid`, `timestamp`, `location`. 6. **Messaggi e feedback**: - Mostrare messaggi di successo o errore al giocatore tramite il sistema di messaggi di Minecraft. - Inviarli come messaggi di chat o come titoli/sottotitoli sullo schermo secondo le personalizzazioni del file `config.yml`. 7. **Eccezioni e gestione errori**: - Assicurarsi che il plugin gestisca situazioni problematiche come un click fuori dallo spazio limitato o in un punto non bersagliabile. - Aggiungere un log dettagliato per gli amministratori per diagnosticare eventuali problemi di esecuzione del plugin. 8. **Integrazione con altre API**: - Considerare l'uso di Vault per abilitare il costo dell'uso della spada in valuta di gioco, se richiesto. - Compatibilità con PlaceholderAPI per mostrare statistiche personalizzate nei messaggi. Il plugin deve essere facile da usare e configurabile per i gestori del server, garantendo al contempo un’esperienza coinvolgente per i giocatori che utilizzano la spada speciale.

src/main/java/eu/codexe/lightningsword/LightningSwordPlugin.java
package eu.codexe.lightningsword;

import eu.codexe.lightningsword.commands.LightningSwordCommand;
import eu.codexe.lightningsword.config.PluginConfig;
import eu.codexe.lightningsword.listeners.PlayerInteractListener;
import eu.codexe.lightningsword.managers.CooldownManager;
import eu.codexe.lightningsword.managers.EconomyManager;
import eu.codexe.lightningsword.managers.LightningManager;
import eu.codexe.lightningsword.placeholders.LightningSwordExpansion;
import eu.codexe.lightningsword.storage.StorageManager;
import eu.codexe.lightningsword.storage.impl.MySQLStorage;
import eu.codexe.lightningsword.storage.impl.SQLiteStorage;
import eu.codexe.lightningsword.storage.impl.YamlStorage;
import eu.codexe.lightningsword.utils.MessageUtil;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.logging.Level;

public final class LightningSwordPlugin extends JavaPlugin {

    private static LightningSwordPlugin instance;

    private PluginConfig pluginConfig;
    private MessageUtil messageUtil;
    private StorageManager storageManager;
    private CooldownManager cooldownManager;
    private EconomyManager economyManager;
    private LightningManager lightningManager;

    @Override
    public void onEnable() {
        instance = this;

        // Save default resource files on first run
        saveDefaultConfig();
        saveResource("messages.yml", false);

        // Initialize configuration wrapper and message utility
        pluginConfig = new PluginConfig(this);
        messageUtil = new MessageUtil(this);

        // Initialize storage backend; disable plugin on failure
        if (!initStorage()) {
            getLogger().severe("Failed to initialize storage backend! Disabling LightningSwordPlugin.");
            Bukkit.getPluginManager().disablePlugin(this);
            return;
        }

        // Initialize feature managers
        cooldownManager = new CooldownManager(this);
        economyManager  = new EconomyManager(this);
        lightningManager = new LightningManager(this);

        // Register event listeners
        getServer().getPluginManager().registerEvents(new PlayerInteractListener(this), this);

        // Register commands
        LightningSwordCommand commandHandler = new LightningSwordCommand(this);