Jump to content

Spigot API | Überprüfen was für ein Item in der MainHand liegt


Empfohlene Beiträge

Hey Leute :)

 

Ich bin gerade dabei mich mit der Programmierung von Bukkit/Spigot Plugins auseinanderzusetzen.

Ich benutze die Spigot API und Eclipse als Entwicklungsumgebung.

 

Ich habe dieses Tutorial gefunden mit einem kleinen Code um Blöcke zu verändern.

Hatte dann aus Spaß die Idee das immer unter dem Spieler ein Block erstellt wird, das man quasi einfach nach oben in die Luft laufen kann, was auch Super funktioniert. Ich weiß hat keinen Sinn :D Aber ich lerne eher durchs tun, als nur durchs lesen.

Jetzt stört es mich aber das ich nicht mehr runter kann, da ja immer direkt unter dem Spieler der Block erstellt wird. Daher will ich das so machen, dass solange man ein Blatt in der Hand hält, der Block immer zwei Blöcke unter einem platziert wird, und wenn man einen Stick in der Hand hält, direkt unter einem.

Ich benutze die Version 1.11.1

 

Vom Code her dürfte es (meiner Meinung nach :D) klappen. Verstehe nur die API noch nicht so gut. Das Javadoc hilft mir da auch nicht weiter, bzw bin ich zu unfähig und weiß nicht wie ich das alles verstehen soll.

Hab die Letzte Zeit fast nur mit PHP gearbeitet.

Also hier ist erstmal die Listener Klasse in der die Methode steht. (Die Listener Klasse wird in der Main Klasse aus der onEnable Methode gestartet):

package test.testplugin;

import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack;

public class Listeners implements Listener{

	@EventHandler
	public void onPlayerMove(PlayerMoveEvent event, PlayerInteractEvent e) {
		
		Player player = e.getPlayer();
		ItemStack item = player.getInventory().getItemInMainHand();
		
		if (item.getType() == Material.PAPER) {
			Location loc = event.getPlayer().getLocation();
	    	loc.setY(loc.getY() - 2);
		    Block b = loc.getBlock();
		    b.setType(Material.GLASS);
		} else if (item.getType() == Material.STICK) {
			Location loc = event.getPlayer().getLocation();
	    	loc.setY(loc.getY() - 1);
		    Block b = loc.getBlock();
		    b.setType(Material.GLASS);
		}
	}
}

Also die Klasse und Methode funktioniert problemlos ohne die Abfrage welcher Block in der Hand ist.

Aber sobald ich die Abfrage mache passiert nichts mehr.

Was hab ich falsch gemacht? Was kann ich besser machen? Und könnte mit bitte jemand erklären wie ich die Javadoc verstehen und richtig anwende kann?

 

Edit: Kann es sein das ich für das überprüfen des Items irgendwie eine eigene Methode machen muss?

 

Vielen Dank im Voraus für Antworten! :)

bearbeitet von mik3_1802
Mir ist noch eine Frage eingefallen
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb BloodSKreaper:

bekommst du in der Konsole ne NullpointerException? Wenn ja, so wäre sicherlich der Stacktrace hilfreich.

Danke für die schnelle Antwort :)

 

Nein in der Konsole passiert nichts, außer der Ausgabe dass das Plugin funktioniert, die ja in onEnable ausgeführt wird.

Also es passiert einfach nichts. Kein Fehler, keine Meldung oder sonst was.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Minuten schrieb BloodSKreaper:

Ich muss zugeben, dass ich deinen Constructor nicht ganz verstehe. Was hat das für einen Sinn, dass du mit zwei Events arbeitest?

Hab gedacht das passt so. Wie gesagt weiß ich noch nicht wie ich das ganze richtig anwende.

Ich finde viele Tutorials dazu, aber nur mit Code Beispiel. Ohne das wirklich erklärt wird, was das jetzt genau macht und wieso..

 

Mir ist eben doch was aufgefallen in der Konsole:

[13:40:20 ERROR]: [Testplugin] Testplugin v1.0.3 attempted to register an invalid EventHandler method signature "public void test.testplugin.Listeners.onPlayerMove(org.bukkit.event.player.PlayerMoveEvent,org.bukkit.event.player.PlayerInteractEvent)" in class test.testplugin.Listeners

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja gut da haben wir doch das Problem XD

Jetzt musst du entscheiden, ob du das beim PlayerMove ausführen willst, oder ob du es beim PlayerInteract ausführen willst. Ich habe aus deiner Beschreibung nicht wirklich herausgelesen, wann genau der Block erstellt werden soll.

 

 

Freundliche Grüße

BloodSKreaper

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb BloodSKreaper:

ob du das beim PlayerMove ausführen willst, oder ob du es beim PlayerInteract ausführen willst

Das ist die Frage :D

Wenn ich es im PlayerInteract mache, wird dass dann so lange ausgeführt wie ich dieses Item in der Hand habe, oder nur wenn ich auf das Item wechsle?

Oder muss ich es dann doch eher im PayerMove machen, dass dann immer wenn ich mich bewege überprüft wird ob das Item in der Hand ist und das der Block dann erstellt wird?

bearbeitet von mik3_1802
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ne nicht ganz.

Hier, sowie an anderen Stellen, lohnt sich ein Blick in die Javadocs

Auszug aus https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/player/PlayerInteractEvent.html

Zitat

Represents an event that is called when a player interacts with an object or air, potentially fired once for each hand. The hand can be determined using getHand().

This event will fire as cancelled if the vanilla behavior is to do nothing (e.g interacting with air)

Also wird dies nur ausgeführt, wenn der Spieler aktiv mit den Maustasten klickt. Dies ist also nicht sehr praktisch für das Vorhaben.

 

Schauen wir uns das PlayerMoveEvent (https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/player/PlayerMoveEvent.html) an

Zitat

Holds information for player movement events

Das wird also ausgeführt, wenn sich ein Spieler bewegt. Das hört sich schonmal besser an. Dann ändern wir mal deinen Code dazu.

package test.testplugin;

import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack;

public class Listeners implements Listener{

	@EventHandler
	public void onPlayerMove(PlayerMoveEvent event) {
		
		Player player = event.getPlayer();
		ItemStack item = player.getInventory().getItemInMainHand();
		
		if (item.getType() == Material.PAPER) {
			Location loc = event.getPlayer().getLocation();
	    	loc.setY(loc.getY() - 2);
		    Block b = loc.getBlock();
		    b.setType(Material.GLASS);
		} else if (item.getType() == Material.STICK) {
			Location loc = event.getPlayer().getLocation();
	    	loc.setY(loc.getY() - 1);
		    Block b = loc.getBlock();
		    b.setType(Material.GLASS);
		}
	}
}

Kannst es ja mal testen und dein Ergebnis hier präsentieren ;)

 

Freundliche Grüße
BloodSKreaper

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Minuten schrieb BloodSKreaper:

Kannst es ja mal testen und dein Ergebnis hier präsentieren ;)

Wow es klappt :) Super Danke!! :D

Die Map sieht jetzt schon ganz verrückt aus mit den Spuren in der Luft haha

 

Nur nochmal zum Verständnis: Zwei Events im Konstruktor ist ein Nogo? :D

Und noch eine Frage: Kennst du eine gute Tutorial-Reihe oder sowas dass die Spigot API und Java gut erklärt? Weil mit der Javadoc komme ich irgendwie nicht zurecht bzw weiß nicht wie ich die richtig verstehen soll..

bearbeitet von mik3_1802
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 22 Minuten schrieb mik3_1802:

[13:40:20 ERROR]: [Testplugin] Testplugin v1.0.3 attempted to register an invalid EventHandler method signature "public void test.testplugin.Listeners.onPlayerMove(org.bukkit.event.player.PlayerMoveEvent,org.bukkit.event.player.PlayerInteractEvent)" in class test.testplugin.Listeners

 

Das sollte deine 1. Frage beantworten.

Zu guter Tutorialreihe kann ich dir leider nichts sagen, aber es gibt genug davon. Hierfür musst du lediglich googlen :D Ich kann nur empfehlen, dass du zunächst mit Java Grundlagen anfängst, da diese essentiell sind.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb BloodSKreaper:

Das sollte deine 1. Frage beantworten.

Stimmt.

 

Ja ich hab viel mit Google geschaut, aber da wird nie so richtig auf die Materie eingegangen..

Und ja das mit Java sollte ich echt mal machen :D Hab mich früher immer wieder mal dran versucht aber dann keine Lust mehr gehabt, weil es dann an irgendwas hing. Aber jetzt bin ich ja etwas älter und das Verständnis ist besser, deswegen will ich mich da wieder dran versuchen :)

Also Danke dir nochmal für die Hilfe! :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...
B
B