mik3_1802 Posted July 10, 2017 Posted July 10, 2017 (edited) 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 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 ) 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! Edited July 10, 2017 by mik3_1802 Mir ist noch eine Frage eingefallen
BloodSKreaper Posted July 10, 2017 Posted July 10, 2017 Guten Tag, bekommst du in der Konsole ne NullpointerException? Wenn ja, so wäre sicherlich der Stacktrace hilfreich. Freundliche Grüße BloodSKreaper
mik3_1802 Posted July 10, 2017 Author Posted July 10, 2017 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.
BloodSKreaper Posted July 10, 2017 Posted July 10, 2017 Ich muss zugeben, dass ich deinen Constructor nicht ganz verstehe. Was hat das für einen Sinn, dass du mit zwei Events arbeitest? vor 31 Minuten schrieb mik3_1802: public void onPlayerMove(PlayerMoveEvent event, PlayerInteractEvent e) {
mik3_1802 Posted July 10, 2017 Author Posted July 10, 2017 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
BloodSKreaper Posted July 10, 2017 Posted July 10, 2017 Ja gut da haben wir doch das Problem 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
mik3_1802 Posted July 10, 2017 Author Posted July 10, 2017 (edited) 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 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? Edited July 10, 2017 by mik3_1802
mik3_1802 Posted July 10, 2017 Author Posted July 10, 2017 vor 9 Minuten schrieb BloodSKreaper: Ich habe aus deiner Beschreibung nicht wirklich herausgelesen, wann genau der Block erstellt werden soll. So lange ich einen Stick oder Papier in der Haupt-Hand halte
BloodSKreaper Posted July 10, 2017 Posted July 10, 2017 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
mik3_1802 Posted July 10, 2017 Author Posted July 10, 2017 (edited) vor 10 Minuten schrieb BloodSKreaper: Kannst es ja mal testen und dein Ergebnis hier präsentieren Wow es klappt Super Danke!! 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? 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.. Edited July 10, 2017 by mik3_1802
BloodSKreaper Posted July 10, 2017 Posted July 10, 2017 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 Ich kann nur empfehlen, dass du zunächst mit Java Grundlagen anfängst, da diese essentiell sind.
mik3_1802 Posted July 10, 2017 Author Posted July 10, 2017 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 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!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now