Bukkit Plugin Programmierung: playerCommandPreprocessEvent

08/06/2013 17:07 themrdomi#1
Hallo,
ich habe folgendes Programmiert, und komme nun nicht weiter:
Code:
   @EventHandler
    public void onPlayerInteract(PlayerInteractEvent e) {
		final Player p = e.getPlayer();
		if (p.getInventory().getItemInHand().getType() == Material.STICK) {
		if (e.getAction() == Action.RIGHT_CLICK_AIR) {

		if (p.hasPermission("troll.lightning")) {
		World world = p.getWorld();
		world.strikeLightning(p.getTargetBlock(null, 1000).getLocation());
		}
		} else {
			if (!p.hasPermission("troll.explosion")) {
				p.sendMessage(ChatColor.RED + "Keine Rechte!");
			} else {
			if (e.getAction() == Action.LEFT_CLICK_AIR) {
			World world = p.getWorld();
			world.createExplosion(p.getTargetBlock(null, 500).getLocation(), 30F);
			}
			}
		}
		}
		
		}
Ich will, das dass Event nur ausgeführt werden darf wenn ein bestimmter Befehl ausgeführt wird. Ich habe gehört das soll mit dem playerCommandPreprocessEvent gehen, ich habe allerdings keine Ahnung wie ich das Anstellen soll.

LG
Dominik
08/06/2013 17:41 ComputerBaer#2
Du machst ganznormal einen Befehl. Den ausführenden Spieler speicherst du dann in eine List oder Map. Beim Rechtklick überprüfst du dann ob er da drin steht und entfernst ihn wieder, falls du das willst.

Quote:
Originally Posted by themrdomi View Post
Ich habe gehört das soll mit dem playerCommandPreprocessEvent gehen, ich habe allerdings keine Ahnung wie ich das Anstellen soll.
Ich denke da habt ihr aneinander vorbei geredet, das was du willst geht nicht direkt mit CommandPreprocess.
08/06/2013 17:57 themrdomi#3
Kannst du mir dabei vielleicht noch ein bisschen helfen, denn ich blick da noch nicht ganz durch wie du das meinst

LG
Dominik
08/06/2013 18:27 ComputerBaer#4
Ich meine es ganz grob gezeigt so:
Code:
List aktiveSpieler;

onCommand()
{
    aktiveSpieler.add(playername);
}

onInteract()
{
    if(aktiveSpieler.contains(playername))
}
08/06/2013 18:47 themrdomi#5
Hmm,
ich komm irgendwie überhaupt nicht zurecht damit :(
Kannst du mir dabei bitte nochmal weiterhelfen?
Bitte sei nicht so streng, ich bin noch ein ziemlichen Newbie in Sachen Bukkit programmierung / Java.
08/06/2013 19:40 Kante'#6
Ganz einfach: Erst Java lernen, dann Bukkit.

Dazu muss man sich aber nicht mit Java wirklich gut auskennen, um das zu verstehen. Es ist einfach:

Du hast eine Liste, die du so erstellst (kannst du beliebig nennen):
Code:
List aktiveSpieler;
. In dieser Liste stehen Spielernamen. Aber, dass der Spieler in die Liste reinkommt, muss man den Spieler hineinsetzen. Dies macht man mit :
Code:
aktiveSpieler.add(/*HierEinenSpielerNamen*/);
Es muss aber mit irgendwas verknüpft werde, dass diese Zeile ausgeführt wird, also z.B. ein Command:
Code:
	@Override
	public boolean onCommand(CommandSender cs, Command cmd, String commandLabel, String[] args){
		Player p = (Player) cs;
		if (cmd.getName().equalsIgnoreCase("blitz") ){
			aktiveSpieler.add(p.getName());
		}		
		return true;
	}
Dann prüfst du einfach bei dem Interact event das ab:
Code:
if (aktiveSpieler.contains(p.getName()){
//Dein Code hier
}
Hoffe ich konnte helfen und habe keine Fehler gemacht, falls ja, bitte korrigieren, habe es nur hier zusammengeschrieben.
08/06/2013 20:06 themrdomi#7
Hmm, also schonmal vielen dank, aber bei
Quote:
Code:
if (aktiveSpieler.contains(p.getName()){
//Dein Code hier
}
Zeigt er an: Syntax error on token(s), misplaced construct(s)

LG
Dominik
08/06/2013 20:09 Kante'#8
Hast du das in dein PlayerInteractEvent reingeschrieben? Schreib mal den ganzen Code hier rein
08/06/2013 20:11 ComputerBaer#9
Da fehlt eine Klammer zu ... warum siehst du das nicht? (Edit: Die meisten IDEs sagen einem sogar, dass eine Klammer fehlt ohne kryptische Meldungen)
Code:
if (aktiveSpieler.contains(p.getName())) {
//Dein Code hier
}
Quote:
Originally Posted by themrdomi View Post
Bitte sei nicht so streng, ich bin noch ein ziemlichen Newbie in Sachen Bukkit programmierung / Java.
Bezieht sich das auf die sehr dünnen Erklärungen?
Es geht mir vorallem darum, das du deinen Kopf einschaltest und selber etwas suchst und rumprobierst. Wenn ich die Lösung schreibe lernst du nicht so viel.
08/06/2013 20:11 themrdomi#10
Hmm, so siehts bis jetzt aus:
Code:
package me.themrdomi.TrollPlugin;
 
import java.awt.List;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;
 
public class main extends JavaPlugin implements Listener {

        public void onEnable() {
                Bukkit.getServer().getPluginManager().registerEvents(this, this);
                System.out.println("TrollPlugin aktiviert!");
        }
        //Programm
        List aktiveSpieler;

        @Override
    	public boolean onCommand(CommandSender cs, Command cmd, String commandLabel, String[] args){
    		Player p = (Player) cs;
    		if (cmd.getName().equalsIgnoreCase("blitz") ){
    			aktiveSpieler.add(p.getName());
    		}		
    		return true;

        	@EventHandler
            public void onPlayerInteract(PlayerInteractEvent e) {
            		final Player p = e.getPlayer();
            		if (p.getInventory().getItemInHand().getType() == Material.STICK) {
            		if (e.getAction() == Action.RIGHT_CLICK_AIR) {

            		if (p.hasPermission("troll.lightning")) {
            		World world = p.getWorld();
            		world.strikeLightning(p.getTargetBlock(null, 1000).getLocation());
            		}
            		} else {
            			if (!p.hasPermission("troll.explosion")) {
            				p.sendMessage(ChatColor.RED + "Keine Rechte!");
            			} else {
            			if (e.getAction() == Action.LEFT_CLICK_AIR) {
            			World world = p.getWorld();
            			world.createExplosion(p.getTargetBlock(null, 500).getLocation(), 30F);
            			}
            			}
                    }
                }
        	}
}
LG
Dominik
08/06/2013 20:21 Kante'#11
Bin ich jetzt Blind oder hast du die If-Abfrage (Die von ComputerBaer, habe eine Klammer vergessen) überhaupt nicht eingesetzt :confused:

Code:
if (aktiveSpieler.contains(p.getName())) {
//Dein Code hier
}
Falls du es nicht weißt, wo du sie einsetzten sollst, wäre ein Grundkurs in Java + Bukkit sehr angebracht
08/11/2013 12:31 BJ100#12
Ausserdem: Verwende nie System.out.println, lieber einen Logger (Wenn du nicht weißt was das ist --> Java Lernen)

Dann: Diese "List" gehört am besten über den onEnable Teil bei welchem eig. @Override fehlt ;)

Und zu guter letzt: Verwende lieber List<String> aktiveSpieler = new ArrayList<String>();
Ist übersichtshalber besser und du kannst durch deine IDE später bei Fehlern besser kontrollieren mit was die List gefüllt sein müsste ;)