Java Bukkit Plugin #Wo liegt der Fehler?

09/27/2014 16:59 shouldnt#1
Will gar nicht lange drum herumreden sondern nur fragen wo mein Fehler liegt? Habe vor anzufangen und habe mir gleich ein Tut dafür gegeben aber bereits da scheiterts? :D

PHP Code:
package TestPlugin;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class 
TestPluginClass extends JavaPlugin {
    public 
void onEnable() {
        
System.out.println("[TestPlugin] Plugin gestartet");
    }
        public 
void onDisable() {
            
System.out.println("[TestPlugin] Plugin gestoppt");
        }
        public 
boolean onCommand(CommandSender senderCommand cmdString cmdLabelString[] args) {
            
            
Player p = (Player)sender;
        if (
cmd.getName().equalsIgnoreCase("heal")) {
                if (
p.hasPermission("testplugin.heal")) {
                    if (
args.length == 0) {
                        
p.sendMessage ("Du wurdest geheilt!");
                        
p.setHealth(20.0);
                    }
                }
                return 
true;
            }
            else {
                return 
false;
                    }
                }
            } 
09/27/2014 17:27 Mikesch01#2
Hi,

was ist denn die eigentliche Fehlermeldung?

So können wir nur raten.

ps. die Einrückung schaut sehr merkwürdig aus^^
09/27/2014 17:28 TeraTroll#3
Welcher Fehler wird denn ausgespuckt? Mehr Infos bitte =D
09/27/2014 19:31 Schlumpf9#4
Ich vermute stark, das onEnable und onDisable problemlos in der Log Datei und im CMD zu sehen sind oder?
Nach meiner Ansicht funktioniert der Command nicht?
Code:
public boolean onCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args) {
Um Commands abzufangen muss man noch die Klasse namens CommandExecutor einbinden. Der Code muss wie folgt erweitert werden:
Code:
public class TestPluginClass extends JavaPlugin  implements CommandExecutor {
   @Override
   public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
PS: Das @Override nicht vergessen, ansonsten noch in der plugin.yml:
Code:
commands:
      heal:
          usage: /<command>
Hoffe, das war der Fehler. Falls nicht bitte eine genaue Beschreibung was nicht funktioniert!
Grüße
09/27/2014 20:49 shouldnt#5
Also, der Fehler ist eben das der Befehl nicht funktioniert. Das TestPlugin spuckt in der CMD jedoch aus was es soll. Der Befehl jedoch existiert erst gar nicht, teste jetzt mal das von Schlumpf

Habs immernoch nicht verstanden
09/28/2014 18:57 Schlumpf9#6
Quote:
Originally Posted by shouldnt View Post
Also, der Fehler ist eben das der Befehl nicht funktioniert. Das TestPlugin spuckt in der CMD jedoch aus was es soll. Der Befehl jedoch existiert erst gar nicht, teste jetzt mal das von Schlumpf

Habs immernoch nicht verstanden
Ah sry, hab noch einen Teil vergessen:
Code:
this.getCommand("heal").setExecutor(new CommandManager()); //Register command to CommandManager class
Ich würde dir empfehlen sowieso eine neue Klasse zu erstellen, wo du seperat alle Commands verwaltest! Ansonsten müsste folgender Code im onEnable() stehen:
Code:
this.getCommand("heal").setExecutor(this);
Meine Empfehlung:
Main class:
Code:
package TestPlugin;

import org.bukkit.plugin.java.JavaPlugin;

public class TestPluginClass extends JavaPlugin {
   @Override   
   public void onEnable() {
      System.out.println("[TestPlugin] Plugin gestartet");
      CommandManager cm = new CommandManager();
      this.getCommand("heal").setExecutor(cm);
      this.getCommand("command2").setExecutor(cm);
   }

   @Override
   public void onDisable() {
      System.out.println("[TestPlugin] Plugin gestoppt");
   } 
}
CommandManager class:
Code:
package TestPlugin;
import org.bukkit.entity.Player;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;

public class CommandManager implements CommandExecutor {
   @Override
   public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
      Player p = (Player)sender;
      if (!cmd.getName().equalsIgnoreCase("heal")) {
         return false;      
      }
      if (!(sender instanceof Player)) {
         sender.sendMessage("Command can't be executed from console");
	 return true;
      }
      if (!p.hasPermission("testplugin.heal")) {
         p.sendMessage("Zu wenig permission");
         return true;
      }
      if (args.length != 0) {
         return false;
      }
      
      p.sendMessage ("Du wurdest geheilt!");
      p.setHealth(20.0);
      return true;
   }
}
Hoffe jetzt funktioniert es, falls nicht nochmals melden!
Wie immer Bedanken nicht vergessen ;)
09/29/2014 22:42 shouldnt#7
Test ich jetzt aus, melde mich gleich

#Was ist der Unterschied von Eclipse Luna und ... Juno heissts glaub?

So, anscheinend bin ich einfach zu dämlich, klappt auch so nicht
09/30/2014 06:57 TeraTroll#8
Eclipse ist eine IDE(Entwickler Umgebung), luna ist ein Package für eclipse(eine Art addon) und juna sagt mir nichts ;)
09/30/2014 14:10 Schlumpf9#9
Quote:
Originally Posted by shouldnt View Post
Test ich jetzt aus, melde mich gleich

#Was ist der Unterschied von Eclipse Luna und ... Juno heissts glaub?

So, anscheinend bin ich einfach zu dämlich, klappt auch so nicht
Also bis jetzt hab ich dir alles ohne zu testen gesendet. Nun hab ich es getestet und es funktioniert, deshalb jetzt nochmals ausführlich, was eventuell falsch war!

Zunächst einmal die Struktur bei mir:
[Only registered and activated users can see links. Click Here To Register...] (Kann leider noch kein Bild einbinden, bitte drauf gehen)
So sieht es bei mir in Eclipse aus.

Plugin.yml:
Code:
name: Test
main: test.test
version: 0.1
website: 
author: Schlumpf
depend: 
database: false
description: 
commands:
      heal:
          usage: /<command>
test.java:
Code:
package test;

import org.bukkit.plugin.java.JavaPlugin;

public class test extends JavaPlugin {
	 @Override   
   public void onEnable() {
      System.out.println("[TestPlugin] Plugin gestartet");
      CommandManager cm = new CommandManager();
      this.getCommand("heal").setExecutor(cm);
   }

   @Override
   public void onDisable() {
      System.out.println("[TestPlugin] Plugin gestoppt");
   } 
}
CommandManager.java:
Code:
package test;

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

public class CommandManager implements CommandExecutor {
	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    	if (cmd.getName().equalsIgnoreCase("heal")) {    
    		if (!(sender instanceof Player)) {
    			sender.sendMessage("Command can't be executed from console");
    			return true;
    		}
    		Player p = (Player)sender;
    		if (!p.hasPermission("testplugin.heal")) {
    			p.sendMessage("Zu wenig permission");
    			return true;
    		}
    		if (args.length != 0) {
    			return false;
    		}
	      
    		p.sendMessage ("Du wurdest geheilt!");
	      	p.setHealth(20.0);
	      	return true;
    	}
    	return false;
	}
}
So funktioniert es bei mir 1a... Als Java Build Path hast du ja sicherlich die craftbukkit.jar eingebunden, sonst würde es ja gar nicht funktionieren.
Zum Testen bitte auch nur dieses Plugin anwenden, also keine anderen noch dazu testen.

Hoffe, wenn du das mal 1 zu 1 überträgst funktioniert es.

Solltest du beim Versuch zuvor folgenden Fehler (oder Ähnlich) erhalten haben:
lag es daran, das der Command nicht richtig in der plugin.yml eingetragen wurde!

Grüße
09/30/2014 16:45 shouldnt#10
Teste ich aus, übrigens meinte ich Juno? Oder so ähnlich, suche den genauen Namen heute nochmal.

Die Konsole spuckt mir iwie aus das er die Main nicht finden kann.

Habs übrigens:
[Only registered and activated users can see links. Click Here To Register...]
09/30/2014 21:26 Schlumpf9#11
Quote:
Originally Posted by shouldnt View Post
Teste ich aus, übrigens meinte ich Juno? Oder so ähnlich, suche den genauen Namen heute nochmal.

Die Konsole spuckt mir iwie aus das er die Main nicht finden kann.

Habs übrigens:
[Only registered and activated users can see links. Click Here To Register...]
In der plugin.yml steht:
Code:
main: test.test
Dieser Pfad muss deiner package Struktur entsprechen! Auf meinem Bild ist die Struktur:
src - test - test.java => ergibt: main: test.test

Wenn du dein package oder deine Klasse umbenannt hast musst du das auch in der plugin.yml kennzeichnen.
09/30/2014 21:57 XxharCs#12
Quote:
Originally Posted by shouldnt View Post
Teste ich aus, übrigens meinte ich Juno?
Eclipse Juno ist jetzt älter und man sollte mittlerweile die Kepler Version verwenden da sie stabiler etc. als Juno ist.
Edit: Weitere Infos zu den verschiedenen Eclipse Versionen bzw. weitere Infos zu Kepler findest auf der Eclipse homepage.
Edit2: Grad draufgekommen das es schon neuere Versionen von Eclipse(Luna) existiert :D
10/02/2014 22:32 shouldnt#13
Ich habe es eins zu eins so gemacht wirklich, 4 mal geschaut und auch so eingetragen etc. DIe Strukturierung stimmt eins zu eins und der Build Path ist auch in Ordnung. Kann doch nicht sein...
10/03/2014 13:40 Schlumpf9#14
Quote:
Originally Posted by shouldnt View Post
Ich habe es eins zu eins so gemacht wirklich, 4 mal geschaut und auch so eingetragen etc. DIe Strukturierung stimmt eins zu eins und der Build Path ist auch in Ordnung. Kann doch nicht sein...
Kannst du mal den ganzen Error hier posten?
10/07/2014 10:41 Terreox#15
Zum bisherigen Beitrag muss ich auf jedenfall eine Ergänzung einbringen, die mir etwas im Auge schmerzt:

Die erste Version der CommandManager.java sah folgendermaßen aus:
Code:
public class CommandManager implements CommandExecutor {
   @Override
   public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
      Player p = (Player)sender;
      if (!cmd.getName().equalsIgnoreCase("heal")) {
         return false;      
      }
      if (!(sender instanceof Player)) {
         sender.sendMessage("Command can't be executed from console");
	 return true;
      }
      if (!p.hasPermission("testplugin.heal")) {
         p.sendMessage("Zu wenig permission");
         return true;
      }
      if (args.length != 0) {
         return false;
      }
      
      p.sendMessage ("Du wurdest geheilt!");
      p.setHealth(20.0);
      return true;
   }
}
Der (fatale) Fehler, der hier gemacht wurde, wurde zwar in der nächsten Version verbessert, jedoch nicht drauf hingewiesen.
In der ersten Version wird zuerst die CommandSender Instanz in einen Player gecastet, ohne zu prüfen, ob es sich wirklich um einen Player handelt.
Später wurde dann überprüft, ob der sender ein Player ist oder nicht.

An sich würde die erste Version ohne Probleme funktionieren, ein guter Stil ist das aber nicht wirklich.
Wenn ein Befehl nur für Spieler gedacht ist, so sollte zuerst überprüft werden, ob der sender ein Player ist oder nicht und danach erst gecastet werden, ansonsten könnte die ganze Geschichte zu netten Exceptions führen.