Bukkit - Erste Schritte zur Plugin-programmierung

04/14/2013 00:22 renamed-123#31
Abend,
ich versche mich nun auch schon ne weile an einem Plugin. Es gibt weder beim kompilieren noch in der Mc-Konsole fehler. Wenn ich jedoch den befehl aus meinen Plugin aufrufe kommt nur der befehl zurück im chat. Also wenn ich /pickup mache kommt "/pickup" zurück
die plugin.yml und die mail class habe ich nach der anleitung von wiki.bukkit.org angelegt.
plugin.yml
Code:
commands:
name: JumpBlock by Henry
main: de.mccrafting.JumpBlock.JumpBlock
version: 0.1

commands:
   pickup:
      description: Aufheben von Items Aktivieren/deaktivieren
      usage: /<command>
      permission: jumpblock.pickup
      permission-message: You don't have <permission>
permissions:
    jumpblock.pickup:
        description: Erlaubt den zugriff auch /pickup
        default: op
Die MAin class:
Code:
package de.mccrafting.testplugin;

import java.util.logging.Logger;

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

public class testplugin extends JavaPlugin {
	Logger log = Logger.getLogger("Minecraft");
	public void onEnable(){ 
		log.info("Testplugin aktiviert");	 
	}
	 
	public void onDisable(){
		log.info("testplugin deaktiviert");	
	 
	}
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String args){
    	if(cmd.getName().equalsIgnoreCase("pickup")){
    		if (!(sender instanceof Player)) {
    	           sender.sendMessage(ChatColor.RED + "Befehl kann nur als Spieler ausgeführt werden!");
    	           return true;
    	        }
    	        Player player = (Player) sender;
    	        if(player.getCanPickupItems() == true){
        	        player.setCanPickupItems(false);
        	        if (sender instanceof Player) {
         	        	player.sendMessage("PickUp Deaktiviert");;
         	        	return false;
         	        }
    	        } else {
    	        	player.setCanPickupItems(true);
        	        if (sender instanceof Player) {
         	        	player.sendMessage("PickUp Aktiviert");;
         	        	return false;
         	        }    	        	
    	        }
    		return true;
    	}
    	return false; 
    }


}
MfG
04/14/2013 00:38 ComputerBaer#32
Zeile 32 und 38 sind die Ursache.

Wenn false zurück kommt, sendet Bukkit den "usage"-Text.
04/14/2013 01:21 renamed-123#33
Danke für die Hilfreiche info, jedoch hat sich nix geändert obwohl überall return true steht...

MfG
04/14/2013 01:57 ComputerBaer#34
Hmm, das sollte eigentlich nurnoch passieren, wenn er Zeile 43 erreicht, was aber eigentlich nicht passieren sollte.

Kommen denn die Nachrichten ("PickUp Aktiviert", "PickUp Deaktiviert")? Oder werden die nicht angezeigt?

Die Abfragen in Zeile 30 und 36 sind überflüssig, weil du alle "Nicht-Spieler" ohnehin schon Zeile 23 rauswirfst.

Edit:
Kann es sein, dass du einen Error verursachst? In dem Fall könnte Bukkit auch den "usage"-Text ausgeben.

Du hats aufjedenfall einen Fehler in Zeile 21. Die "args" sind ein String-Array und kein String.
Richtig wäre also: "... , String[] args) ..."
04/15/2013 19:43 renamed-123#35
Vielen Dank, an dem String[] lag es.
Vielen lieben Dank.
MfG
05/02/2013 23:54 Jege#36
Thank you so much ! :D
05/10/2013 05:51 SinSay#37
das tut hilft bestimmt viele ;) hast du gut gemacht
05/12/2013 18:21 SBotDE#38
Wenn du es noch nicht im Text ist könntest du ja es nochmal Editieren und einfügen wie man eine .jar draus erstellt!
05/12/2013 18:33 ComputerBaer#39
Quote:
Originally Posted by SBotDE View Post
Wenn du es noch nicht im Text ist könntest du ja es nochmal Editieren und einfügen wie man eine .jar draus erstellt!
Zu faul zum Lesen, oder?
Sieh dir mal die letzte Zeile ganz genau an.
06/17/2013 20:27 crazyyzarc#40
Ab wann beginnt der erste Befehl ?:

public boolean onCommand(CommandSender sender, Command cmd, String commandlabel,String[] args)
{
boolean succeed = false;
Player player = (Player) sender;
if(cmd.getName().equalsIgnoreCase("hello"))
{

player.sendMessage("Willkommen auf meinem Server " + player.getName());

succeed = true;
}
if(cmd.getName().equalsIgnoreCase("heal"))
{
player.setHealth(20);
}
if(cmd.getName().equalsIgnoreCase("storm"))
{
Block targetblock = player.getTargetBlock(null, 50);
targetblock.getWorld().strikeLightning(targetblock .getLocation());
succeed = true;
}
return succeed;
}
}
06/17/2013 21:37 ComputerBaer#41
Was ist das für eine Frage? Ich hoffe ich verstehe sie richtig.
Der erste Befehl (hello) beginnt in Zeile 4, bzw. Zeile 6.
01/06/2014 16:46 Ixxiflo#42
wenn der Spieler Joint soll er gekickt werden doch es passiert garnix



JoinListener:


package Listeners;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;

import Data.Data;

public class WartungListener implements Listener {


@EventHandler
public void onPlayerJoin(PlayerJoinEvent e)
{


Player player = (Player) e;
if (Data.Wartungen = true)
player.kickPlayer("ServerWartungen");
{

}
}
}



Wartungen enabler:

package Commands;

import Data.Data;

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

public class Wartungen
implements CommandExecutor
{
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
{
if (sender.hasPermission("change.Wartungen")) {
if (Data.Wartungen) {
Data.Wartungen = false;
Bukkit.broadcastMessage(Data.SysPrefix + ChatColor.AQUA + " Wartungen wurde deaktiviert!");
return true;
}
Data.Wartungen = true;
for (Player target : Bukkit.getOnlinePlayers())
target.kickPlayer(ChatColor.BLUE + "WartungsArbeiten");
Bukkit.broadcastMessage(Data.SysPrefix + ChatColor.AQUA + " Wartungen wurde aktiviert!");
return true;
}

sender.sendMessage(Data.NoPerm);

return true;
}
}



:confused::confused:
01/06/2014 16:55 lordsill#43
Einfach ein anderes Event nehmen

also statt:

Code:
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e)
{


Player player = (Player) e;
if (Data.Wartungen = true)
player.kickPlayer("ServerWartungen");
{

}
}
}
eher:

Code:
@EventHandler
public void onPlayerLogin(PlayerLoginEvent event)
{
if(Data.Wartungen)
{
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server Wartung");
}
}
zudem "(Player) e" fehlerhaft ist, da ein Event sich nicht in ein Player casten läst.
Bei meinem Code wird nun einfach jeder gekickt, der dem Server joinen möchte

Edit:
geht natürlich auch auf deine Art und Weiße, aber dann so:

Code:
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e)
{
Player player = e.getPlayer();
if (Data.Wartungen == true)
{
player.kickPlayer("ServerWartungen");
}
}
01/06/2014 19:48 Ixxiflo#44
Jetzt gehts wenn ihr den source haben wollt oder das Plugin mit globalmute wartungsmodus dann schreibt mich an :D
02/22/2014 19:41 i0N#45
Eine Frage: Warum erstellst du eine "Player Variable" für CommandSender sender, wenn sender bereits wie ein Player gehandhabt wird? Zumindest für sendMessage musst du sender nicht zu Player casten. Einfach sender.sendMessage("bla") benutzen.

Ansonsten spitze Einstieg für Beginner.