• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Plugin Problem

K

Kleeraphie

Guest
Hi,
ich programmiere gerade ein Plugin, das Hebel automatisch bei einer bestimmten Spielerzahl umlegt, allerdings funktioniert der Command noch nicht. Das Plugin gibt immer nur /acd zurück und im Log steht kein Fehler.

Der Code:
Code:
package autoclockdeaktivator.kleeraphie.de;

import org.bukkit.command.CommandExecutor;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.material.Lever;
import java.io.File;


public class Main extends JavaPlugin implements Listener, CommandExecutor {
    public String prefix = "§7[§2" + "AutoClockDeaktivator" + "§2]";
    public String error = prefix + "§cBitte benutze /acd add oder /acd remove <Hebel-Nummer>!";
    public String noperm = prefix + "§cDafür hast du nicht genügend Berechtigungen!";
    public File file;
    public FileConfiguration cfg;
    private int Nummer = 0;
    private CommandSender sender;
    private Command cmd;
    private String label;
    private String[] args;
    private PlayerInteractEvent e;

    @Override
    public void onEnable() {

        saveDefaultConfig();

        file = new File("plugins/AutoClockDeaktivator", "config.yml");
        cfg = YamlConfiguration.loadConfiguration(file);

        Bukkit.getConsoleSender().sendMessage(prefix + "§a erfolgreich aktiviert!");

        getCommand("acd").setExecutor(this);
        this.getServer().getPluginManager().registerEvents(this, this);


    }

    @Override
    public void onDisable() {

        Bukkit.getConsoleSender().sendMessage(prefix + "§a erfolgreich deaktiviert");
    }

    public void onMaxPlayers() {

        if(Bukkit.getOnlinePlayers().size() >= cfg.getInt("Maximale Spieler")) {

            int maxNummer;

            for(maxNummer = 0; maxNummer <= Nummer; maxNummer++) {

                World w = (World) this.getConfig().getConfigurationSection("Hebel-Nummer" + Nummer).get("Welt");
                int X = (int) this.getConfig().getConfigurationSection("Hebel-Nummer" + Nummer).get("X");
                int Y =  (int) this.getConfig().getConfigurationSection("Hebel-Nummer" + Nummer).get("Y");
                int Z = (int) this.getConfig().getConfigurationSection("Hebel-Nummer" + Nummer).get("Z");

                Block lever = w.getBlockAt(X, Y, Z);

                BlockState bs = lever.getState();
                ((Lever) lever).setPowered(true);
                bs.update();
            }
        }
    }


    public boolean onCommand(CommandSender sender,Command cmd, String label, String[] args, PlayerInteractEvent e) {

        if(sender instanceof Player) {

            Player p = (Player) sender;
            Block b = e.getClickedBlock();


            if(cmd.getName().equalsIgnoreCase("acd")) {
                if(p.hasPermission("acd.use")) {
                    if(args[0].equalsIgnoreCase("add")) {

                            p.sendMessage("§eBitte klicke auf den Hebel, der hinzugefügt werden soll!");

                            if(e.getAction() == Action.RIGHT_CLICK_BLOCK) {
                                if(b instanceof Lever) try {
                                    String name = p.getName();
                                    String world = p.getWorld().getName();
                                    double x = b.getLocation().getX();
                                    double y = b.getLocation().getY();
                                    double z = b.getLocation().getZ();

                                    FileConfiguration cfg = getConfig();
                                    cfg.createSection("Hebel-Nummer" + Nummer + 1);
                                    cfg.getConfigurationSection("Hebel-Nummer" + Nummer).set("Besitzer", name);
                                    cfg.getConfigurationSection("Hebel-Nummer" + Nummer).set("Welt", world);
                                    cfg.getConfigurationSection("Hebel-Nummer" + Nummer).set("X", x);
                                    cfg.getConfigurationSection("Hebel-Nummer" + Nummer).set("Y", y);
                                    cfg.getConfigurationSection("Hebel-Nummer" + Nummer).set("Z", z);
                                    saveConfig();

                                    p.sendMessage("§2Der " + "§aHebel " + "§2wurde hinzugefügt!");
                                    e.setCancelled(true);

                                } catch (Exception e2) {
                                    System.out.println(e2.toString()); // nur jetzt um zu gucken, ob Fehler auftreten
                                }
                                else {
                                    p.sendMessage(prefix + "§cDu musst auf ein Hebel klicken");
                                }
                            }
                    }
                    else if(args[0].equalsIgnoreCase("remove")) {

                        if(args[0] != null) {

                            try{
                                e.getPlayer();
                                b.getLocation();
                                String Hebelnummer = args[0];
                                String Name = p.getName();

                                if(Name == this.getConfig().getConfigurationSection(Hebelnummer).get("Besitzer") | p.hasPermission("acd.all")) {

                                    ConfigurationSection section = cfg.getConfigurationSection(Hebelnummer);
                                    section.set(Hebelnummer, null);

                                    p.sendMessage("§2Der " + "§aHebel " + "§2wurde entfernt!");
                                } else {
                                    p.sendMessage("§cDu musst den Hebel hinzugefügt haben, um ihn entfernen zu dürfen!");
                                }
                            }    catch(Exception e1){

                                System.out.println(e1.toString()); // nur jetzt um zu gucken, ob Fehler auftreten)
                                p.sendMessage(prefix + "§cDer Hebel wurde noch nicht hinzuefügt!");
                            }
                        }
                    }    else{
                        p.sendMessage(error);
                    }

                }    else {
                    p.sendMessage(noperm);
                    return true;
                }
            }
        }
        return true;
    }
}
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Zuerst einmal würde ich empfehlen, bereits einfachere Plugins in mehrere Klassen aufzuteilen. Zum einen ist das eine gute "Vorbereitung", falls mal größere Plugins kommen sollten, zum anderen ist das Erweitern dann normalerweise einfacher, falls neue Funktionen gewünscht sind.
Konkret: CommandExecutor auslagern.

Zudem übergibst du bei deiner "onCommand"-Funktion ein "PlayerInteractEvent" - woher kommt das? Dir solte klar sein, dass die Methode "CommandExecutor$onCommand" mit Override überschrieben werden muss, damit das funktioniert.
Wenn du also das PlayerInteractEvent rausnimmst und ein "@Override" die Spalte davor setzt, müsste der Cmd auch ausgeführt werden.

Ich hab mal etwas daran "rumgepfuscht". 1. ist das immernoch eine Klasse, was nicht umbedingt schön ist, 2. hab ich auch nicht alles perfekt gemacht... Aber ich denke, dass du damit arbeiten können solltest.
Ist nicht getestet, müsste aber laufen (die paar kleinen Fehler wirst du selbst finden können :p )

Javascript:
package de.test.plugin

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.material.Lever;
import org.bukkit.plugin.java.JavaPlugin;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class Main extends JavaPlugin implements Listener, CommandExecutor {
    public String prefix = "§7[§2" + "AutoClockDeaktivator" + "§2]";
    public String noperm = prefix + "§cDafür hast du nicht genügend Berechtigungen!";
    public File file;
    public FileConfiguration cfg;

    private List<Location> locationList = new ArrayList<>();
    private List<Player> addLever = new ArrayList<>();
    private List<Player> removeLever = new ArrayList<>();

    @Override
    public void onEnable() {

        saveDefaultConfig();

        file = new File("plugins/AutoClockDeaktivator", "config.yml");
        cfg = YamlConfiguration.loadConfiguration(file);

        // Bukkit.getConsoleSender().sendMessage(prefix + "§a erfolgreich aktiviert!");
        // Bukkit hat bereits einen eigenen Logger dabei. einfach JavaPlugin$getLogger() benutzen
        getLogger().info("erfolgreich aktiviert!");

        getCommand("acd").setExecutor(this);
        this.getServer().getPluginManager().registerEvents(this, this);
    }

    private List<Location> getLocationList() {
        return (List<Location>)cfg.getList("locations");
        // hier könnte ein Laufzeitfehler kommen, wenn in der CFG rumgepfuscht wurde
    }

    private void addLocation(Location location) {
        List<Location> locations = getLocationList();
        if(locations.contains(location)) return;
        locations.add(location);
        cfg.set("locations", locations);
        try {
            cfg.save(file);     // keine Ahnung, wie man unter Bukkit die Cfgs speichert, ich benutz da ne Bib für
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    @Override
    public void onDisable() {
        getLogger().info("erfolgreich deaktiviert");
    }

    @EventHandler
    public void onMaxPlayers(PlayerJoinEvent event) {
        int playerCount = Bukkit.getOnlinePlayers().size();

        if(playerCount >= cfg.getInt("playerSize")) {
            for(Location loc : locationList) {
                Block lever = loc.getBlock();
                if(lever.getType() != Material.LEVER) {
                    continue;
                }

                BlockState bs = lever.getState();
                ((Lever) lever).setPowered(true);
                bs.update();
            }
        }
    }

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        if(addLever.contains(event.getPlayer())) {
            if(event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.LEVER) {
                locationList.add(event.getClickedBlock().getLocation());
                addLever.remove(event.getPlayer());
            }
        }
        if(removeLever.contains(event.getPlayer())) {
            if(event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.LEVER) {
                Location loc = event.getClickedBlock().getLocation();
                if(locationList.contains(loc)) {
                    locationList.remove(loc);
                    removeLever.remove(event.getPlayer());
                }
            }
        }
    }


    @Override
    public boolean onCommand(CommandSender sender,Command cmd, String label, String[] args) {

        if(!(sender instanceof Player)) {
            sender.sendMessage("Du musst ein Spieler sein, um diesen Cmd ausführen zu können!");
            return true;
        }

        Player p = (Player) sender;

        if(cmd.getName().equalsIgnoreCase("acd")) {
            if(p.hasPermission("acd.use")) {
                if(args[0].equalsIgnoreCase("add")) {
                    p.sendMessage("§eBitte klicke auf den Hebel, der hinzugefügt werden soll!");
                    addLever.add(p);

                    // Jetzt müssen wir noch irgendwie nach 30s den Spieler das Hebel hinzufügen verbieten...
                    Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
                        if(addLever.contains(p)) addLever.remove(p);
                        if(p.isOnline()) p.sendMessage("§cDu hast auf keinen Hebel geklickt.");
                    }, 30*20); // 30 Sekunden (kann auch in die Config ;)

                }
                else if(args[0].equalsIgnoreCase("remove")) {
                    p.sendMessage("§eBitte klicke auf den Hebel, der entfernt werden soll!");
                    removeLever.add(p);

                    // Jetzt müssen wir noch irgendwie nach 30s den Spieler das Hebel entfernen verbieten...
                    Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
                        if(removeLever.contains(p)) removeLever.remove(p);
                        if(p.isOnline()) p.sendMessage("§cDu hast auf keinen Hebel geklickt.");
                    }, 30*20); // 30 Sekunden (kann auch in die Config ;)
                }
            }    else {
                p.sendMessage(noperm);
            }
        }

        return true;
    }
}
 

SirYwell

PlotSquared Entwickler
Registriert
30 Juni 2017
Beiträge
540
Diamanten
488
Minecraft
SirYwell
Kleiner Hinweis zur config: mit getConfig() lässt sich die config in der Hauptklasse aufrufen und mit saveConfig() abspeichern. @Kleeraphie du hast das zwar verwendet, allerdings rufst du die config in der onEnable() unnötigerweise auf und weist sie der Variable cfg über eine file zu. Du kannst alternativ einfach cfg = getConfig() verwenden oder einfach cfg überall, wo du es verwendet hast, durch getConfig() zu ersetzen.

Wie @JOO200 erkannt hat, möchtest du anscheinend auch einen Listener verwenden. Den solltest du dann auch in eine extra Klasse auslagern. Damit tust du dir dann sicherlich selber einen Gefallen.

Viel Erfolg bei deinem Projekt!
 
Oben