|
You last visited: Today at 21:04
Advertisement
Bukkit Programmierung : Was ist falsch?
Discussion on Bukkit Programmierung : Was ist falsch? within the Minecraft forum part of the Other Online Games category.
02/03/2013, 20:04
|
#1
|
elite*gold: 0
Join Date: Jul 2012
Posts: 1,554
Received Thanks: 484
|
Bukkit Programmierung : Was ist falsch?
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
|
#2
|
elite*gold: 3
Join Date: Mar 2012
Posts: 1,432
Received Thanks: 266
|
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
|
#3
|
elite*gold: 0
Join Date: Feb 2010
Posts: 26
Received Thanks: 6
|
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.*** durch player.*** ersetzen.
|
|
|
02/03/2013, 21:52
|
#4
|
elite*gold: 0
Join Date: Jul 2012
Posts: 1,554
Received Thanks: 484
|
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
|
#5
|
Moderator
elite*gold: 558
Join Date: Feb 2010
Posts: 6,546
Received Thanks: 1,418
|
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.
|
|
|
02/03/2013, 22:23
|
#6
|
elite*gold: 0
Join Date: Feb 2010
Posts: 26
Received Thanks: 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
|
#7
|
Moderator
elite*gold: 558
Join Date: Feb 2010
Posts: 6,546
Received Thanks: 1,418
|
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:
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));
}
}
}
}
}
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.
Wenn du Abfragst ob es kein Zucker ist, dann muss es beim else zwangläufig Zucker sein, also ist die zweite Abfrage überflüssig:
Code:
if (player.getItemInHand().getType() != Material.SUGAR)
{
return;
}
else
{
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));
}
}
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.)
Code:
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));
}
Am Ende sieht der gesamte Code jetzt so aus:
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)
{
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;
// }
}
}
|
|
|
02/04/2013, 16:05
|
#8
|
elite*gold: 0
Join Date: Jul 2012
Posts: 1,554
Received Thanks: 484
|
ComputerBaer :
Danke du bist mein Retter!!
Ich habe völlig vergessen den Listener zu registrieren,jetzt funktioniert es.
Und danke für deine Verbesserung
|
|
|
 |
Similar Threads
|
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
|
Bukkit Plugin Programmierung ab $5
12/08/2012 - Minecraft Trading - 0 Replies
z.Z. nur im deutschen Minecraftforum
|
Bukkit Plugin Programmierung für 10€
12/07/2012 - Minecraft Trading - 14 Replies
http://www.elitepvpers.com/forum/minecraft-trading /2281632-bukkit-plugin-programmierung-ab-5-a.html
|
[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.
|
All times are GMT +1. The time now is 21:07.
|
|