Bukkit Programmierung : Was ist falsch?

02/03/2013 20:04 HappyMajor#1
Hey Leute,
ich möchte für ein Freund ein Plugin erstellen und weiß gerade nicht mehr weiter.
Vorerst was ich möchte :
Ich möchte das wenn ein Spieler Zucker in der Hand hält und dann Rechtsklickt,das der Zucker verschwindet und der Spieler schneller wird,also ein Speed PotionEffect bekommt.

Hier ist der Code :
Code:
@EventHandler
    public void onPlayerInteract(PlayerInteractEvent event){
    if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
    Player player = event.getPlayer();
    if (event.getItem() == null) {
    return;
    } else {
    if (event.getItem().getType() == Material.SUGAR) {
		
    if (player.getInventory().getItemInHand().getAmount() == 1) {
    event.getPlayer().getInventory().removeItem(new ItemStack(event.getItem().getTypeId(), 1));
    p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 60, 1));
    } else {
    int amount = player.getInventory().getItemInHand().getAmount();
    amount--;
    player.getInventory().getItemInHand().setAmount(amount);
    p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 60, 1));
    }
    }
    }
    }
    }
    }
}
02/03/2013 21:17 Elevenn#2
Nicht if event.getItem = sugar sonder if player.getItemInHand = sugar ;)
Bei deinem Code klappt das auch nur wenn du ein Zucker in der Hand hast.
02/03/2013 21:28 eagle3000#3
Das muss
Code:
if(player.getItemInHand().getType() == Material.SUGAR) {
// do sth.
}

(Check, ob es das Item ist.)
bzw.
Code:
if (!(player.getItemInHand().getType() == Material.SUGAR)) {
// do sth.
}

(Check, ob es das Item NICHT ist.)
heißen. Außerdem musst du p.xxx durch player.xxx ersetzen.
02/03/2013 21:52 HappyMajor#4
Danke für eure Hinweise,doch irgendwie passiert immer noch gar nichts.
Code :
Code:
package main;


import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_4_R1.Overridden;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

public class Zucker extends JavaPlugin {

	@Overridden
    public void onDisable() {
        // TODO Auto-generated method stub
    }

    @Overridden
    public void onEnable() {
        // TODO Auto-generated method stub
    }
    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event){
    if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
    Player player = event.getPlayer();
    if (player.getItemInHand() == null) {
    return;
    } else {
    if (player.getItemInHand().getType() == Material.SUGAR) {
		
    if (player.getInventory().getItemInHand().getAmount() == 1) {
    event.getPlayer().getInventory().removeItem(new ItemStack(event.getItem().getTypeId(), 1));
    player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 60, 1));
    } else {
    int amount = player.getInventory().getItemInHand().getAmount();
    amount -=1;
    player.getInventory().getItemInHand().setAmount(amount);
    player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 60, 1));
    }
    }
    }
    }
    }
}
eagle3000:
Wie füg ich in dem Code denn eig noch ein Rechtsklick Event ein?
Einfach mit UND(&&)?
Code:
if(player.getItemInHand().getType() == Material.SUGAR && event.getAction() == Action.RIGH_CLICK_BLOCK)) {
// do sth.
}
02/03/2013 22:02 ComputerBaer#5
PlayerInteract wird eigentlich nur aufgerufen wenn ein Spieler einen Rechtsklick macht. (Beim Linksklick kommen die DamageEvents zum tragen)

Edit:
Was machst du denn mit dem "Overridden" da? Das sehe ich jetzt zum ersten mal und ich vermute das es mit dem Aushebeln neuen Schutzfunktion von Bukkit zu tun hat.

Quote:
Originally Posted by Elevenn View Post
Nicht if event.getItem = sugar sonder if player.getItemInHand = sugar ;)
Mit getItem() sollte man auch an das Item in der Hand kommen.
02/03/2013 22:23 eagle3000#6
Code:
	@EventHandler
    public void onPlayerInteract(PlayerInteractEvent event){
    if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
    Player player = event.getPlayer();
    if (!(player.getItemInHand().getType() == Material.SUGAR)) {
    return;
    } else {
    if (player.getItemInHand().getType() == Material.SUGAR) {
    if (player.getInventory().getItemInHand().getAmount() == 1) {
    player.getInventory().removeItem(new ItemStack(event.getItem().getTypeId(), 1));
    player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 60, 1));
    } else
    {
    int amount = player.getInventory().getItemInHand().getAmount();
    amount--;
    player.getInventory().getItemInHand().setAmount(amount);
    player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 60, 1));
     }
    }
    }
    }
    }
Sollte so funktionieren, gucks dir aber bitte an und versteh' es.
02/04/2013 00:35 ComputerBaer#7
Ohh, da habe ich (und alle anderen auch) wohl nicht besonders gut aufgepasst. Es ist klar das nichts passiert, weil du das Event garnicht registrierst.

@eagle3000
In diesem Fall wo die Abfrage liefern soll, dass es kein Zucker ist würde ich Ungleich (!=) bevorzugen, das ganze könnte auch sehr geringen Geschwindigkeitsvorteil bringen. Aber letztendlich ist das wohl Geschmackssache.

@HappyMajor
Ich würde den Code für bessere Lesbarkeit einrücken. Das sieht dann ungefähr so aus:
Ob du den Klammern eine eigene Zeile spendierst oder sie in die selbe Zeile schreibst musst du dir aussuchen.

Hier noch ein wenig Optimiert: (Sachen die vorher nicht gingen, werden auch hier nicht gehen, der Code ist weiterhin ungetestet)
Nachtrag: Allerdings ist mir beim Optimieren ein Fehler aufgefallen, mehr dazu weiter unten.
02/04/2013 16:05 HappyMajor#8
ComputerBaer :
Danke du bist mein Retter!!
Ich habe völlig vergessen den Listener zu registrieren,jetzt funktioniert es.
Und danke für deine Verbesserung :)