ServerPlugin Befehle in meinem plugin funktionieren nicht!

Dieses Thema im Forum "Programmierung" wurde erstellt von 2801MC, 16. August 2014.

  1. 2801MC
    Offline

    2801MC

    Registriert seit:
    15. August 2013
    Beiträge:
    77
    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 (Text):
    1.  
    2. public boolean onComman(CommandSender sender, Command cmd, String label, String[] args){
    3.         Player p = null;
    4.         if(sender instanceof Player){
    5.             p = (Player) sender;
    6.         }
    7.         if(cmd.getName().equalsIgnoreCase("Level")){
    8.             if(p == null){
    9.                 sender.sendMessage(ChatColor.RED + "EIN GEIST!!!");
    10.             }
    11.             if(p != null){
    12.                 p.sendMessage(ChatColor.GOLD + "Deine EP: " + ChatColor.AQUA + getConfig().getInt("EP." + p.getName()));
    13.                 p.sendMessage(ChatColor.GOLD + "Dein Level: " + ChatColor.AQUA + getConfig().getInt("Lv." + p.getName()));
    14.                 p.sendMessage(ChatColor.GOLD + "Dein Angriffswert: " + ChatColor.AQUA + getConfig().getInt("Ang." + p.getName()));
    15.                 p.sendMessage(ChatColor.GOLD + "Dein Verteidigungswert: " + ChatColor.AQUA + getConfig().getInt("Vert." + p.getName()));
    16.             }
    17.         }
    18.         if(cmd.getName().equalsIgnoreCase("LevelUp")){
    19.             if(p == null){
    20.                 sender.sendMessage(ChatColor.RED + "EIN GEIST!!!");
    21.             }
    22.             if(p != null){
    23.                 int Level = getConfig().getInt("Level." + p.getName());
    24.                 int EP = getConfig().getInt("EP." + p.getName());
    25.                 int EPLU = Level * 100;
    26.                 int LUE = EP - EPLU;
    27.                 int LevelUp = Level + 1;
    28.                 if(EP >= EPLU){
    29.                     p.sendMessage(ChatColor.GOLD + "Deine EP (Vor LevelUp): " + ChatColor.AQUA + EP);
    30.                     p.sendMessage(ChatColor.GOLD + "Gebraucht: " + ChatColor.AQUA + EPLU);
    31.                     p.sendMessage(ChatColor.GOLD + "Deine EP (Jetzt): " + ChatColor.AQUA + LUE);
    32.                     getConfig().set("EP." + p.getName(), LUE);
    33.                     getConfig().set("Level." + p.getName(), LevelUp);
    34.                     Bukkit.broadcastMessage(ChatColor.GOLD + "Passt gut auf! " + ChatColor.AQUA + p.getName() + ChatColor.GOLD + " ist jetzt auf Level " + ChatColor.AQUA + LevelUp + ChatColor.GOLD + "!");
    35.                     save();
    36.                 }
    37.             }
    38.         }
    39.         return true;
    40.     }
    41.  
    Die plugin.yml:
    Code (Text):
    1.  
    2. name: RPGCraft
    3. version: 1.0.0
    4. author: 2801MC
    5. main: de.mc.rpgc.RPGCraft
    6. commands:
    7.   level:
    8.     aliases: [ep, ang, angriff, vert, verteidigung]
    9.     usage: /<command>
    10.   levelup:
    11.     usage: /<command>
    12.  
    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!
     
    #1
  2. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Steht die Methode in der Hauptklasse oder in einer anderen Klasse? Bzw. hast du noch andere Klassen, die die Befehle verarbeiten?
     
    #2
  3. 2801MC
    Offline

    2801MC

    Registriert seit:
    15. August 2013
    Beiträge:
    77
    In der hauptklasse
     
    #3
  4. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Schreibe mal nach der 1. Zeile vom Code "sender.sendMessage("teste");" und führe den Befehl aus. Wenn du dann keine Nachricht "teste" bekommst, dann poste bitte die komplette Hauptklasse hier.
     
    #4
  5. 2801MC
    Offline

    2801MC

    Registriert seit:
    15. August 2013
    Beiträge:
    77
    Geht nicht :/
    Code (Text):
    1.  
    2. package de.mc.rpgc;
    3.  
    4. import org.bukkit.Bukkit;
    5. import org.bukkit.ChatColor;
    6. import org.bukkit.command.Command;
    7. import org.bukkit.command.CommandSender;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.event.EventHandler;
    10. import org.bukkit.event.EventPriority;
    11. import org.bukkit.event.Listener;
    12. import org.bukkit.event.entity.EntityDamageByEntityEvent;
    13. import org.bukkit.event.entity.EntityDeathEvent;
    14. import org.bukkit.event.player.PlayerJoinEvent;
    15. import org.bukkit.plugin.java.JavaPlugin;
    16.  
    17. public class RPGCraft extends JavaPlugin implements Listener {
    18.    
    19.     public void level(Player p){
    20.        
    21.     }
    22.    
    23.     public void levelup(Player p){
    24.        
    25.     }
    26.    
    27.     public void save(){
    28.         this.saveConfig();
    29.     }
    30.    
    31.     public void onEnable(){
    32.         this.reloadConfig();
    33.         this.getServer().getPluginManager().registerEvents(this, this);
    34.         System.out.println(ChatColor.GREEN + "RPGCraft Aktiviert!");
    35.     }
    36.    
    37.     public void onDisable(){
    38.         System.out.println(ChatColor.RED + "RPGCraft Deaktiviert!");
    39.     }
    40.    
    41.     public boolean onComman(CommandSender sender, Command cmd, String label, String[] args){
    42.         Player p = null;
    43.         if(sender instanceof Player){
    44.             p = (Player) sender;
    45.         }
    46.         if(cmd.getName().equalsIgnoreCase("Level")){
    47.             if(p == null){
    48.                 sender.sendMessage(ChatColor.RED + "EIN GEIST!!!");
    49.             }
    50.             if(p != null){
    51.                 p.sendMessage(ChatColor.GOLD + "Deine EP: " + ChatColor.AQUA + getConfig().getInt("EP." + p.getName()));
    52.                 p.sendMessage(ChatColor.GOLD + "Dein Level: " + ChatColor.AQUA + getConfig().getInt("Lv." + p.getName()));
    53.                 p.sendMessage(ChatColor.GOLD + "Dein Angriffswert: " + ChatColor.AQUA + getConfig().getInt("Ang." + p.getName()));
    54.                 p.sendMessage(ChatColor.GOLD + "Dein Verteidigungswert: " + ChatColor.AQUA + getConfig().getInt("Vert." + p.getName()));
    55.             }
    56.         }
    57.         if(cmd.getName().equalsIgnoreCase("LevelUp")){
    58.             if(p == null){
    59.                 sender.sendMessage(ChatColor.RED + "EIN GEIST!!!");
    60.             }
    61.             if(p != null){
    62.                 int Level = getConfig().getInt("Level." + p.getName());
    63.                 int EP = getConfig().getInt("EP." + p.getName());
    64.                 int EPLU = Level * 100;
    65.                 int LUE = EP - EPLU;
    66.                 int LevelUp = Level + 1;
    67.                 if(EP >= EPLU){
    68.                     p.sendMessage(ChatColor.GOLD + "Deine EP (Vor LevelUp): " + ChatColor.AQUA + EP);
    69.                     p.sendMessage(ChatColor.GOLD + "Gebraucht: " + ChatColor.AQUA + EPLU);
    70.                     p.sendMessage(ChatColor.GOLD + "Deine EP (Jetzt): " + ChatColor.AQUA + LUE);
    71.                     getConfig().set("EP." + p.getName(), LUE);
    72.                     getConfig().set("Level." + p.getName(), LevelUp);
    73.                     Bukkit.broadcastMessage(ChatColor.GOLD + "Passt gut auf! " + ChatColor.AQUA + p.getName() + ChatColor.GOLD + " ist jetzt auf Level " + ChatColor.AQUA + LevelUp + ChatColor.GOLD + "!");
    74.                     save();
    75.                 }
    76.             }
    77.         }
    78.         return true;
    79.     }
    80.    
    81.     @EventHandler(priority = EventPriority.HIGHEST)
    82.     public void onEntityDamage(EntityDamageByEntityEvent e){
    83.         Player pD = null;
    84.         Player pE = null;
    85.         int Ang = 0;
    86.         int Vert = 0;
    87.         int Damage = 0;
    88.         if(e.getDamager() instanceof Player){
    89.             pD = (Player) e.getDamager();
    90.             Ang = getConfig().getInt("Ang." + pD.getName());
    91.         } else {
    92.             Ang = 1;
    93.         }
    94.         if(e.getEntity() instanceof Player){
    95.             pE = (Player) e.getEntity();
    96.             Vert = getConfig().getInt("Vert." + pE.getName());
    97.         } else {
    98.             Vert = 1;
    99.         }
    100.         if(Ang != 0 && Vert != 0){
    101.             Damage = Ang / Vert;
    102.             e.setDamage(Damage);
    103.         } else {
    104.             System.out.println(ChatColor.RED + "Fehler bei einem Angriff! Der Angriffs oder Verteidigungswert bei einem Spieler oder Monster wurde nicht erkannt!");
    105.         }
    106.     }
    107.     @EventHandler(priority = EventPriority.HIGH)
    108.     public void onEntityDeath(EntityDeathEvent e){
    109.         Player p = null;
    110.         int epo = 0;
    111.         int epa = 0;
    112.         int epn = 0;
    113.         if(e.getEntity().getKiller() instanceof Player){
    114.             p = e.getEntity().getKiller();
    115.             epo = getConfig().getInt("EP." + p.getName());
    116.             if(e.getEntity() instanceof Player){
    117.                 epa = 5;
    118.             } else {
    119.                 epa = 1;
    120.             }
    121.             epn = epo + epa;
    122.             getConfig().set("EP." + p.getName(), epn);
    123.             save();
    124.             p.sendMessage(ChatColor.GOLD + "Du hast " + ChatColor.AQUA + epa + ChatColor.GOLD + " EP bekommen!");
    125.         }
    126.     }
    127.     @EventHandler(priority = EventPriority.NORMAL)
    128.     public void onPlayerJoin(PlayerJoinEvent e){
    129.         Player p = e.getPlayer();
    130.         int neu = getConfig().getInt("Spieler." + p.getName());
    131.         int Spieler = getConfig().getInt("Spielerzahl");
    132.         if(neu != 1){
    133.             int SN = Spieler + 1;
    134.             getConfig().set("Spielerzahl", SN);
    135.             Bukkit.broadcastMessage(ChatColor.GOLD + "Willkommen " + ChatColor.AQUA + p.getName() + ChatColor.GOLD + "! " + ChatColor.AQUA + "[" + ChatColor.GOLD + SN + ChatColor.AQUA + "]");
    136.             getConfig().set("EP." + p.getName(), 0);
    137.             getConfig().set("Level." + p.getName(), 1);
    138.             getConfig().set("Ang." + p.getName(), 1);
    139.             getConfig().set("Vert." + p.getName(), 1);
    140.             getConfig().set("Spieler." + p.getName(), 1);
    141.             save();
    142.         }
    143.     }
    144. }
    145.  
    Code (Text):
    1.  
    2. name: RPGCraft
    3. version: 1.0.0
    4. author: 2801MC
    5. main: de.mc.rpgc.RPGCraft
    6. commands:
    7.   level:
    8.     aliases: [ep, ang, angriff, vert, verteidigung]
    9.     usage: /<command>
    10.   levelup:
    11.     usage: /<command>
    12.  
     
    #5
  6. Mario52
    Offline

    Mario52

    Registriert seit:
    19. August 2013
    Beiträge:
    511
    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;
     
    #6
  7. games6471
    Online

    games6471

     
    #7
  8. 2801MC
    Offline

    2801MC

    Registriert seit:
    15. August 2013
    Beiträge:
    77
    Hab ich gestern schon gefunden aber danke ;)
     
    #8
  9. Zahn
    Offline

    Zahn

    Registriert seit:
    17. Juni 2014
    Beiträge:
    4
    Hey,
    Ich habe das gleiche Problem komme aber nicht wirklich weiter:

    ChatClear
    Code (Text):
    1. package com.Zahn.System.Commands;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.command.Command;
    5. import org.bukkit.command.CommandSender;
    6. import org.bukkit.event.Listener;
    7.  
    8. public class ChatClear implements Listener
    9. {
    10.     public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
    11.         if(cmd.getName().equalsIgnoreCase("cc"))
    12.         {
    13.             if(sender.hasPermission("System.Team"))
    14.             {
    15.                 for(int i = 0; i<=250; i++)
    16.                 {
    17.                     Bukkit.broadcastMessage(" ");
    18.                 }
    19.                     Bukkit.broadcastMessage("§7[§4System§7] §bDer Chat wurde von §6" + sender.getName() + "§bgeleert!");
    20.                     sender.sendMessage("§7[§4System§7] §bDu hast den Chat geleert!");
    21.                     return true;
    22.             }
    23.         }
    24.         return false;
    25.     }
    26. }
    Plugin.yml

    Code (Text):
    1. name: System
    2. version: 0.0.1b2
    3. main: com.Zahn.System.Main
    4. commands:
    5.    team:
    6.       description: Zeigt dir das Server Team.
    7.       usage: /<command>
    8.    cc:
    9.       description: Leere den Chat.
    10.       usage: /<command>
     
    #9
  10. MiCrJonas
    Offline

    MiCrJonas

    Registriert seit:
    29. Oktober 2012
    Beiträge:
    1.069
    Wird die Klasse auch irgendwo geladen bzw. die Methode aufgerufen? Nur weil die Methode onCommand() heißt, bedeutet das nicht, dass diese auch aufgerufen wird, wenn man einen Befehl eingibt(!).
     
    #10
  11. games6471
    Online

    games6471

    @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.
     
    #11
  12. Zahn
    Offline

    Zahn

    Registriert seit:
    17. Juni 2014
    Beiträge:
    4
    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 (Text):
    1. name: System
    2. version: 0.0.2b1
    3. main: com.X_MrZahn_X.System.Main
    4.  
    5. author: X_MrZahn_X
    6. commands:
    7.   cc:
    8.     description: Leere den Chat
    9.     usage: Gebe /cc ein
    ChatClear
    Code (Text):
    1. package com.X_MrZahn_X.System.Commands;
    2.  
    3. import org.bukkit.command.Command;
    4. import org.bukkit.command.CommandExecutor;
    5. import org.bukkit.command.CommandSender;
    6.  
    7. import com.X_MrZahn_X.System.Main;
    8.  
    9. public class ChatClear implements CommandExecutor
    10.     {
    11.         public ChatClear(Main main)
    12.             {
    13.             }
    14.  
    15.         @Override
    16.         public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
    17.             {  
    18.                 if (cmd.getName().equalsIgnoreCase("cc"))
    19.                     {
    20.                     sender.sendMessage("Test -> /cc geht!");
    21.                     }
    22.                 return false;
    23.             }
    24.     }
    In der Mainklasse habe ich es so eingefügt:
    Code (Text):
    1. this.getCommand("cc").setExecutor(new ChatClear(this));
    Hier wird folgendes als Fehler markiert:
    Code (Text):
    1. (new ChatClear(this))
    Würde mich über Hilfe freuen. @games6471
     
    #12
  13. games6471
    Online

    games6471

    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.
     
    #13
  14. Stufferus
    Offline

    Stufferus

    Registriert seit:
    3. Januar 2014
    Beiträge:
    1
    Achja. Speicher die Spielerdaten nicht mit p.getName() ab. Speicher stattdesen die UUID p.getUniqueId() weil ab der 1.8 namens änderungen möglich sein werden.
     
    #14
  15. Zahn
    Offline

    Zahn

    Registriert seit:
    17. Juni 2014
    Beiträge:
    4
    @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 (Text):
    1. if(sender.hasPermission("System.Team"))
    2.             {
    3.                 for(int i = 0; i<=250; i++)
    4.                 {
    5.                     Bukkit.broadcastMessage(" ");
    6.                 }
    7.                     Bukkit.broadcastMessage("§7[§4System§7] §bDer Chat wurde von §6" + sender.getName() + "§bgeleert!");
    8.                     sender.sendMessage("§7[§4System§7] §bDu hast den Chat geleert!");
    9.                     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 :)
     
    #15
  16. TheBlackIPs
    Offline

    TheBlackIPs

    Registriert seit:
    12. März 2014
    Beiträge:
    5
    Wurde eine Fehlermeldung in der Konsole angezeigt? Funktionieren beide broadcasts nicht?
     
    #16
  17. Zahn
    Offline

    Zahn

    Registriert seit:
    17. Juni 2014
    Beiträge:
    4
    Es wurden keine Fehler angezeigt. Kein Broadcast geht.
     
    #17
  18. MrFlieder
    Offline

    MrFlieder

    Registriert seit:
    30. Dezember 2011
    Beiträge:
    333
    Ort:
    Österreich
    Minecraft:
    MrFlieder
    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 (Text):
    1. for(Player p : Bukkit.getOnlinePlayers())
    2.     p.sendMessage(" ");
     
    #18