• 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!

Befehle in meinem plugin funktionieren nicht!

2801MC

Kuhfänger
Registriert
15 August 2013
Beiträge
77
Diamanten
0
Bin gerade dabei ein etwas grösseres plugin zu programmieren und habe version 1.0.0 auch schon fast fertig!
Dabei gibts nur 1 problem...
Wenn ich einen befehl benutzte dann passiert nicht das was passieren soll sondern dort steht dann nur der befehl im chat!
Also z.b. wenn ich /level mache steht dort auch nur /level aber nicht das was dort stehen sollte!
Die commands hab ich ganz normal gemacht also mit
Code:
public boolean onComman(CommandSender sender, Command cmd, String label, String[] args){
        Player p = null;
        if(sender instanceof Player){
            p = (Player) sender;
        }
        if(cmd.getName().equalsIgnoreCase("Level")){
            if(p == null){
                sender.sendMessage(ChatColor.RED + "EIN GEIST!!!");
            }
            if(p != null){
                p.sendMessage(ChatColor.GOLD + "Deine EP: " + ChatColor.AQUA + getConfig().getInt("EP." + p.getName()));
                p.sendMessage(ChatColor.GOLD + "Dein Level: " + ChatColor.AQUA + getConfig().getInt("Lv." + p.getName()));
                p.sendMessage(ChatColor.GOLD + "Dein Angriffswert: " + ChatColor.AQUA + getConfig().getInt("Ang." + p.getName()));
                p.sendMessage(ChatColor.GOLD + "Dein Verteidigungswert: " + ChatColor.AQUA + getConfig().getInt("Vert." + p.getName()));
            }
        }
        if(cmd.getName().equalsIgnoreCase("LevelUp")){
            if(p == null){
                sender.sendMessage(ChatColor.RED + "EIN GEIST!!!");
            }
            if(p != null){
                int Level = getConfig().getInt("Level." + p.getName());
                int EP = getConfig().getInt("EP." + p.getName());
                int EPLU = Level * 100;
                int LUE = EP - EPLU;
                int LevelUp = Level + 1;
                if(EP >= EPLU){
                    p.sendMessage(ChatColor.GOLD + "Deine EP (Vor LevelUp): " + ChatColor.AQUA + EP);
                    p.sendMessage(ChatColor.GOLD + "Gebraucht: " + ChatColor.AQUA + EPLU);
                    p.sendMessage(ChatColor.GOLD + "Deine EP (Jetzt): " + ChatColor.AQUA + LUE);
                    getConfig().set("EP." + p.getName(), LUE);
                    getConfig().set("Level." + p.getName(), LevelUp);
                    Bukkit.broadcastMessage(ChatColor.GOLD + "Passt gut auf! " + ChatColor.AQUA + p.getName() + ChatColor.GOLD + " ist jetzt auf Level " + ChatColor.AQUA + LevelUp + ChatColor.GOLD + "!");
                    save();
                }
            }
        }
        return true;
    }

Die plugin.yml:
Code:
name: RPGCraft
version: 1.0.0
author: 2801MC
main: de.mc.rpgc.RPGCraft
commands:
  level:
    aliases: [ep, ang, angriff, vert, verteidigung]
    usage: /<command>
  levelup:
    usage: /<command>

EDIT:
In der console kommt kein fehler (nicht beim plugin laden und auch nicht beim comand) und alles andere funktioniert genau so wie es soll!
 

2801MC

Kuhfänger
Registriert
15 August 2013
Beiträge
77
Diamanten
0
Geht nicht :/
Code:
package de.mc.rpgc;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class RPGCraft extends JavaPlugin implements Listener {
   
    public void level(Player p){
       
    }
   
    public void levelup(Player p){
       
    }
   
    public void save(){
        this.saveConfig();
    }
   
    public void onEnable(){
        this.reloadConfig();
        this.getServer().getPluginManager().registerEvents(this, this);
        System.out.println(ChatColor.GREEN + "RPGCraft Aktiviert!");
    }
   
    public void onDisable(){
        System.out.println(ChatColor.RED + "RPGCraft Deaktiviert!");
    }
   
    public boolean onComman(CommandSender sender, Command cmd, String label, String[] args){
        Player p = null;
        if(sender instanceof Player){
            p = (Player) sender;
        }
        if(cmd.getName().equalsIgnoreCase("Level")){
            if(p == null){
                sender.sendMessage(ChatColor.RED + "EIN GEIST!!!");
            }
            if(p != null){
                p.sendMessage(ChatColor.GOLD + "Deine EP: " + ChatColor.AQUA + getConfig().getInt("EP." + p.getName()));
                p.sendMessage(ChatColor.GOLD + "Dein Level: " + ChatColor.AQUA + getConfig().getInt("Lv." + p.getName()));
                p.sendMessage(ChatColor.GOLD + "Dein Angriffswert: " + ChatColor.AQUA + getConfig().getInt("Ang." + p.getName()));
                p.sendMessage(ChatColor.GOLD + "Dein Verteidigungswert: " + ChatColor.AQUA + getConfig().getInt("Vert." + p.getName()));
            }
        }
        if(cmd.getName().equalsIgnoreCase("LevelUp")){
            if(p == null){
                sender.sendMessage(ChatColor.RED + "EIN GEIST!!!");
            }
            if(p != null){
                int Level = getConfig().getInt("Level." + p.getName());
                int EP = getConfig().getInt("EP." + p.getName());
                int EPLU = Level * 100;
                int LUE = EP - EPLU;
                int LevelUp = Level + 1;
                if(EP >= EPLU){
                    p.sendMessage(ChatColor.GOLD + "Deine EP (Vor LevelUp): " + ChatColor.AQUA + EP);
                    p.sendMessage(ChatColor.GOLD + "Gebraucht: " + ChatColor.AQUA + EPLU);
                    p.sendMessage(ChatColor.GOLD + "Deine EP (Jetzt): " + ChatColor.AQUA + LUE);
                    getConfig().set("EP." + p.getName(), LUE);
                    getConfig().set("Level." + p.getName(), LevelUp);
                    Bukkit.broadcastMessage(ChatColor.GOLD + "Passt gut auf! " + ChatColor.AQUA + p.getName() + ChatColor.GOLD + " ist jetzt auf Level " + ChatColor.AQUA + LevelUp + ChatColor.GOLD + "!");
                    save();
                }
            }
        }
        return true;
    }
   
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onEntityDamage(EntityDamageByEntityEvent e){
        Player pD = null;
        Player pE = null;
        int Ang = 0;
        int Vert = 0;
        int Damage = 0;
        if(e.getDamager() instanceof Player){
            pD = (Player) e.getDamager();
            Ang = getConfig().getInt("Ang." + pD.getName());
        } else {
            Ang = 1;
        }
        if(e.getEntity() instanceof Player){
            pE = (Player) e.getEntity();
            Vert = getConfig().getInt("Vert." + pE.getName());
        } else {
            Vert = 1;
        }
        if(Ang != 0 && Vert != 0){
            Damage = Ang / Vert;
            e.setDamage(Damage);
        } else {
            System.out.println(ChatColor.RED + "Fehler bei einem Angriff! Der Angriffs oder Verteidigungswert bei einem Spieler oder Monster wurde nicht erkannt!");
        }
    }
    @EventHandler(priority = EventPriority.HIGH)
    public void onEntityDeath(EntityDeathEvent e){
        Player p = null;
        int epo = 0;
        int epa = 0;
        int epn = 0;
        if(e.getEntity().getKiller() instanceof Player){
            p = e.getEntity().getKiller();
            epo = getConfig().getInt("EP." + p.getName());
            if(e.getEntity() instanceof Player){
                epa = 5;
            } else {
                epa = 1;
            }
            epn = epo + epa;
            getConfig().set("EP." + p.getName(), epn);
            save();
            p.sendMessage(ChatColor.GOLD + "Du hast " + ChatColor.AQUA + epa + ChatColor.GOLD + " EP bekommen!");
        }
    }
    @EventHandler(priority = EventPriority.NORMAL)
    public void onPlayerJoin(PlayerJoinEvent e){
        Player p = e.getPlayer();
        int neu = getConfig().getInt("Spieler." + p.getName());
        int Spieler = getConfig().getInt("Spielerzahl");
        if(neu != 1){
            int SN = Spieler + 1;
            getConfig().set("Spielerzahl", SN);
            Bukkit.broadcastMessage(ChatColor.GOLD + "Willkommen " + ChatColor.AQUA + p.getName() + ChatColor.GOLD + "! " + ChatColor.AQUA + "[" + ChatColor.GOLD + SN + ChatColor.AQUA + "]");
            getConfig().set("EP." + p.getName(), 0);
            getConfig().set("Level." + p.getName(), 1);
            getConfig().set("Ang." + p.getName(), 1);
            getConfig().set("Vert." + p.getName(), 1);
            getConfig().set("Spieler." + p.getName(), 1);
            save();
        }
    }
}
Code:
name: RPGCraft
version: 1.0.0
author: 2801MC
main: de.mc.rpgc.RPGCraft
commands:
  level:
    aliases: [ep, ang, angriff, vert, verteidigung]
    usage: /<command>
  levelup:
    usage: /<command>
 

Mario52

Workaholic
Registriert
19 August 2013
Beiträge
507
Diamanten
1
Minecraft
Mario_52
Könnte sein das du kein return benutzt hast. Wenn du in der plugin.yml usage einbaust musst du bei einer erfolgreichen Ausführung return true; hinschreiben und bei einer falschen return false;
 
Z

Zahn

Guest
Hey,
Ich habe das gleiche Problem komme aber nicht wirklich weiter:

ChatClear
Code:
package com.Zahn.System.Commands;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.event.Listener;

public class ChatClear implements Listener
{
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
        if(cmd.getName().equalsIgnoreCase("cc"))
        {
            if(sender.hasPermission("System.Team"))
            {
                for(int i = 0; i<=250; i++)
                {
                    Bukkit.broadcastMessage(" ");
                }
                    Bukkit.broadcastMessage("§7[§4System§7] §bDer Chat wurde von §6" + sender.getName() + "§bgeleert!");
                    sender.sendMessage("§7[§4System§7] §bDu hast den Chat geleert!");
                    return true;
            }
        }
        return false;
    }
}

Plugin.yml

Code:
name: System
version: 0.0.1b2
main: com.Zahn.System.Main
commands:
   team:
      description: Zeigt dir das Server Team.
      usage: /<command>
   cc:
      description: Leere den Chat.
      usage: /<command>
 
G

games6471

Guest
@Zahn

Wenn du die Befehle in der plugin.yml einträgst, werden diese in der Hauptklasse (die Klasse mit extends JavaPlugin) ausgeführt. Standartmässig wird dort einfach ein return false zurückgegeben, womit die Usage-Nachricht an den Sender geschickt wird. Wenn der Befehl in einer anderen Klasse ausgeführt werden soll, dann muss diese auch dorthin umgeleitet werden. Am Einfachsten geht es mit einem CommandExecutor (oder Unterklassen)

http://wiki.bukkit.org/Plugin_Tutorial#Using_a_separate_CommandExecutor_class

Also für dich heißt das:
  1. ChatClear muss das Interface CommandExecutor implementieren (implements)
  2. Beim aktivieren deines Plugins Bukkit anzuweisen mit welcher Klasse der Befehl ausgeführt wird. (
    getCommand("basic").setExecutor()
  3. Der Befehl muss dennoch in der plugin.yml eingetragen sein. Ansonsten würde getCommand() null zurückgeben, was bei einem weiteren Zugriff (objekt.doSomething()) auf das Objekt zu einer NPE (NullPointerException) führen würde.
 
Z

Zahn

Guest
Erstmal Danke. Ich hätte sagen müssen das ich Anfänger bin, was Coden allgemein angeht.
Die Lösung klingt logisch, aber ich bekomm es nicht hin. Ich weis nicht was wo hin soll. Währe nett wenn ich mir nochmal helft.

EDIT:
Ich habe mich nochmal intensiv damit beschäftigt, und bin ein bisschen weiter gekommen.
Aber: Wenn ich nun meinen Befehl ( /cc ) eingebe, kommt zwar alles was kommen soll, danach komm aber noch das was in der plugin.yml bei usage seteht.

Es sieht dann so aus:
Test -> /cc geht!
Gebe /cc ein || <- Das soll aber weg.

Plugin.yml
Code:
name: System
version: 0.0.2b1
main: com.X_MrZahn_X.System.Main

author: X_MrZahn_X
commands:
  cc:
    description: Leere den Chat
    usage: Gebe /cc ein

ChatClear
Code:
package com.X_MrZahn_X.System.Commands;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

import com.X_MrZahn_X.System.Main;

public class ChatClear implements CommandExecutor
    {
        public ChatClear(Main main)
            {
            }

        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
            {   
                if (cmd.getName().equalsIgnoreCase("cc"))
                    {
                    sender.sendMessage("Test -> /cc geht!");
                    }
                return false;
            }
    }

In der Mainklasse habe ich es so eingefügt:
Code:
this.getCommand("cc").setExecutor(new ChatClear(this));

Hier wird folgendes als Fehler markiert:
Code:
(new ChatClear(this))

Würde mich über Hilfe freuen. @games6471
 
Zuletzt bearbeitet von einem Moderator:
G

games6471

Guest
Sorry, dass ich gestern dir nicht mehr geantwortet habe, aber ich war noch bis spät auf der Arbeit. Die Usage-Nachricht wird dem CommandSender zurückgegebn, wenn du bei onCommand false zurückgibst (return false) und somit Bukkit signalisierst dass der Befehl nicht richtig eingeben wurde. Gib einfach true (return true) zurück, wenn die Ausführung erfolgreich war.
 
Z

Zahn

Guest
@games6471 Ist doch kein Problem :)
@Stufferus Danke werde ich machen :)

Ich habe in der Plugin.yml einfach Usage weggemacht - das hat funktioniert.

Anderes Problem:
Code:
if(sender.hasPermission("System.Team"))
            {
                for(int i = 0; i<=250; i++)
                {
                    Bukkit.broadcastMessage(" ");
                }
                    Bukkit.broadcastMessage("§7[§4System§7] §bDer Chat wurde von §6" + sender.getName() + "§bgeleert!");
                    sender.sendMessage("§7[§4System§7] §bDu hast den Chat geleert!");
                    return true;

Leider funktioniert dieser Code nicht. Bei sender.SendMessage("ABC") bekomme ich die Nachricht. Nur der broadcast geht nicht. Währe nett wenn nochmal jemand Hilft :)
 

MrFlieder

Braumeister
Registriert
30 Dezember 2011
Beiträge
332
Diamanten
0
Minecraft
MrFlieder
Bei sender.SendMessage("ABC") bekomme ich die Nachricht. Nur der broadcast geht nicht.
Dann probier mal, jedem einzelnen Spieler die Leerzeilen zu schicken anstatt einem öffentlichen Broadcast.
Hat übrigens auch den Vorteil, dass die Serverlog nicht mit Leerzeilen zugespammt wird.

Code:
for(Player p : Bukkit.getOnlinePlayers())
    p.sendMessage(" ");
 
Oben