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));
}
}
}
}
}
}
}
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
Nicht if event.getItem = sugar sonder if player.getItemInHand = sugar
Mit getItem() sollte man auch an das Item in der Hand kommen.
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:
@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));
}
}
}
}
}
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.
Spätestens jetzt sollte auffallen, dass nach dieser Abfrage überhaupt nichts mehr an Code kommt. Weshalb der if-Teil irgendwie überflüssig wird, da man das if nicht streichen kann, wird die Abfrage umformuliert und das else gestrichen.
Code:
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));
}
}
// Für den Fall, dass du doch irgendwann einen Grund hast vorzeitig rauszuspringen, wenn es kein Zucker ist kannst du das else wieder anhängen:
// else
// {
// return;
// }
Des Weiteren kann man erkennen, dass du eine Codezeile unnötigerweise doppelt drin hast. Solltest du den Effekt jetzt mal ändern wollen, musst du das an zwei Stellen tun. Aus dem Grund machen wir das einfach nach dem Zuckerabziehen.
Code:
if (player.getItemInHand().getType() == Material.SUGAR)
{
if (player.getInventory().getItemInHand().getAmount() == 1)
{
player.getInventory().removeItem(new ItemStack(event.getItem().getTypeId(), 1));
}
else
{
int amount = player.getInventory().getItemInHand().getAmount();
amount--;
player.getInventory().getItemInHand().setAmount(amount);
}
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 60, 1));
}
So, jetzt ist mir doch tatsächlich noch ein Fehler aufgefallen. Wenn du versuchst ein Item aus dem Inventar zu entfernen, solltets du auch das Item entfernen und nicht ein neues Erstellen, dass du dann entfernst.
Bei der Gelegenheit kürze ich auch noch ein paar unnötig lange Anweisungen. (Das Reduzieren um 1 stopfe ich auch in eine Zeile, das ist aber irgendwo auch wieder Geschmackssache.)
@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)
{
if (player.getItemInHand().getAmount() == 1)
{
player.getInventory().removeItem(player.getItemInHand());
}
else
{
player.getItemInHand().setAmount(player.getItemInHand().getAmount() - 1);
}
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 60, 1));
}
// Für den Fall, dass du doch irgendwann einen Grund hast vorzeitig rauszuspringen, wenn es kein Zucker ist kannst du das else wieder anhängen:
// else
// {
// return;
// }
}
}
ComputerBaer :
Danke du bist mein Retter!!
Ich habe völlig vergessen den Listener zu registrieren,jetzt funktioniert es.
Und danke für deine Verbesserung
Bukkit - Erste Schritte zur Plugin-programmierung 11/22/2019 - Minecraft Guides & Strategies - 58 Replies In diesem Texttutorial bringe ich euch die ersten Schritte zur Bukkit Plugin-Programmierung näher. Nun, zu erst ein mal muss ich euch sagen, dass ich manchmal ein paar Schwierigkeiten habe mich aus zudrücken. Ich bitte euch, dies zu verkraften.
Was brauchen wir, um ein Plugin zu schreiben?
*Eclipse: Klicke hier
Dies ist die Programmierumgebung. Hier werden euch sofort Syntax-Fehler angezeigt und die dazu gehörenden Problembehandlungsmöglichkeiten.
*CraftBukkit devBuild: Klicke hier...
[B]Bukkit Plugin Programmierung / Server Einrichtung 08/06/2013 - Minecraft Trading - 24 Replies http://i.epvpimg.com/LCCMg.png
Wenn Sie maßgeschneiderte Bukkit Plugins suche, sind sie hier genau richtig! Zögern Sie nicht lange, schicken Sie mir eine Private Nachricht hier im Forum.
Bitte beachten Sie dass Ihre Nachricht folgenden Punkte beinhaltet:
Plugin Name
Funktionen
Kurze Beschreibung
[B]Bukkit Plugin Programmierung für 10€ / Server Einrichtung 08/27/2012 - Minecraft Trading - 0 Replies Hallo,
wie der Titel schon sagt programmiere ich Bukkit Plugins und erstelle Server ein.
Bukkit Plugins:
Preis: 10€
Was Programmiere ich?
normale Bukkit Plugins keine Spout Plugins.