Jens Becker Posted January 6, 2017 Share Posted January 6, 2017 (edited) Hallo, Ich möchte/habe ein Spigot Plugin programmiert was folgendes bewirken soll: -Spieler gibt /elytra ein und bekommt Elytra (funktoiniert) -Spieler kann mit Elytra fliegen (funktioniert) -Spieler soll Elytra weggenommen bekommen wenn er landet (funktioniert teilweise, denn: Wie mach ich das das dauernt überprüt werden soll ob sich unter dem Spieler keine Luft befindet?? Weil wenn ich das wie unten zusehen mit einer whileschleife mache stürzt der Server ab weil dauernd ja text ausgegeben werden soll?! Hier der Code: (An der plugin.yml Datei liegt es nicht) package me.Jensis.EinwegElytra; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.java.JavaPlugin; public class EinwegElytra extends JavaPlugin { public void onEnable() { System.out.println("[EE] GELADEN UND AKTIVIERT"); } public void onDisable() { System.out.println("[EE] DEAKTIVIERT UND ENTLADEN"); } public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if (cmd.getName().equalsIgnoreCase("elytra")) { Player spieler = (Player) sender; ItemStack item = new ItemStack(Material.ELYTRA, 1); ItemMeta met =item.getItemMeta(); item.setItemMeta(met); spieler.getInventory().setChestplate(item); int zahl = 2; while (zahl== 2) { if (spieler.getLocation().getBlock().getRelative(BlockFace.DOWN).getType() == Material.AIR) { // spieler.sendMessage("Du bist in der Luft!"); } else { spieler.sendMessage("Du bist gelandet, deine Elytra ist jetzt weg!"); ItemStack item1 = new ItemStack(Material.AIR, 1); ItemMeta met1 =item.getItemMeta(); item.setItemMeta(met1); spieler.getInventory().setChestplate(item1); } } } return true; } } Edited January 7, 2017 by Jens Becker Link to comment Share on other sites More sharing options...
Joey Posted January 6, 2017 Share Posted January 6, 2017 Du könntest dass onPlayerMoveEvent verwenden und dabei abfragen, ob der Block unter ihm Luft ist. Beachte dabei, dass dieses Event bei jeder Bewegung getriggert wird(Auch beim drehen oder Kopf bewegen) daher würde ich vorher mit getTo() und getFrom() die y Koordinaten vergleichen um zu gucken ob sich die Höhe verändert hat. Mfg, Joey Link to comment Share on other sites More sharing options...
Jens Becker Posted January 6, 2017 Author Share Posted January 6, 2017 vor einer Stunde schrieb Joey: Du könntest dass onPlayerMoveEvent verwenden und dabei abfragen, ob der Block unter ihm Luft ist. Beachte dabei, dass dieses Event bei jeder Bewegung getriggert wird(Auch beim drehen oder Kopf bewegen) daher würde ich vorher mit getTo() und getFrom() die y Koordinaten vergleichen um zu gucken ob sich die Höhe verändert hat. Mfg, Joey Okay, danke schonmal, aber ich kenne mich leider noch nicht so gut mit Spigot Programmieren aus. Aber das eigentliche was ich ja brauche ist, dass Das Plugin erst dann anfängt zu prüfen ob Luft unter dem Spieler ist wenn er sich vom Spawn hinunter Stürtzt und fliegt. Und dann sollte die Methode nicht den Server zum abstürzen bringen also denke ich mal kann man schonmal keine Schleife die dauernt überprüft benutzen, oder? Aber wie ich den Block unter dem Spieler überprüft habe, war doch mit diesem Event, oder? Wenn nicht wie macht man es damit. P.s.: Ich verwende ein Plugin welches den Spieler während des Elytraflugs, nach Wunsch in die Höhe boosted, gibt es daher vielleicht eine Möglichkeit zu schauen wann der Spieler wieder aufrecht nach dem Flug steht oder so? Link to comment Share on other sites More sharing options...
Joey Posted January 6, 2017 Share Posted January 6, 2017 vor 2 Stunden schrieb Jens Becker: prüfen ob Luft unter dem Spieler ist wenn er sich vom Spawn hinunter Stürtzt und fliegt. Ich würde wie schon erwähnt dass onPlayerMoveEvent nutzen. Klar du kannst so Sachen machen wie dass du dem Spieler am Spawn(Wenn du ihm die Elytra gibst) in ne ArrayList packst und beim Event abfragst ob er in der Array ist. Wenn er dann drin ist und Boden unter den Füßen hat, schmeist du ihn aus der Array raus und löscht die Elytra. vor 2 Stunden schrieb Jens Becker: der Spieler wieder aufrecht Das müsste ja wenn ein Event sein, ansonsten müsstest du auch das regelmäßig überprüfen mfg, Joey Link to comment Share on other sites More sharing options...
Jens Becker Posted January 7, 2017 Author Share Posted January 7, 2017 vor 17 Stunden schrieb Joey: Ich würde wie schon erwähnt dass onPlayerMoveEvent nutzen. Klar du kannst so Sachen machen wie dass du dem Spieler am Spawn(Wenn du ihm die Elytra gibst) in ne ArrayList packst und beim Event abfragst ob er in der Array ist. Wenn er dann drin ist und Boden unter den Füßen hat, schmeist du ihn aus der Array raus und löscht die Elytra. Das müsste ja wenn ein Event sein, ansonsten müsstest du auch das regelmäßig überprüfen mfg, Joey Ich habe das jetzt so: package me.Jensis.EinwegElytra; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.java.JavaPlugin; public class EinwegElytra extends JavaPlugin implements Listener { public void onEnable() { System.out.println("[EE] GELADEN UND AKTIVIERT"); Bukkit.getPluginManager().registerEvents(this, this); } public void onDisable() { System.out.println("[EE] DEAKTIVIERT UND ENTLADEN"); } public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if (cmd.getName().equalsIgnoreCase("elytra")) { Player spieler = (Player) sender; spieler.sendMessage("Du hast jetzt eine Einweg Elytra an!"); ItemStack item1 = new ItemStack(Material.ELYTRA, 1); ItemMeta met1 =item1.getItemMeta(); item1.setItemMeta(met1); spieler.getInventory().setChestplate(item1); } return true; } @EventHandler public void onPlayerMoveEvent (PlayerMoveEvent event) { Block b1 = event.getPlayer().getLocation().add(0, -1, 0).getBlock(); Player p = event.getPlayer(); if(b1.getType() == Material.AIR) { p.sendMessage("Du hast jetzt eine Einweg-Elytra an!"); ItemStack item1 = new ItemStack(Material.ELYTRA, 1); ItemMeta met1 =item1.getItemMeta(); item1.setItemMeta(met1); p.getInventory().setChestplate(item1); } else { p.sendMessage("§7Deine Einweg-Elytra ist beim landen kaputt gegangen!"); ItemStack item1 = new ItemStack(Material.AIR, 1); ItemMeta met1 =item1.getItemMeta(); item1.setItemMeta(met1); p.getInventory().setChestplate(item1); } }} Aber wie bekomme ich das jetzt hin, dass er erst mit dem Event prüft ob der Spieler in der Luft ist wenn er die startplattform verlassen hat. (Außerdem soll der Spieler nur auf der Plattform eine Einweg Elytra bekommen können) Link to comment Share on other sites More sharing options...
Joey Posted January 9, 2017 Share Posted January 9, 2017 Naja so war das nicht gemeint. Mit dem onPlayerMoveEvent solltest du dem Spieler die Elytra nur wegnehmen. Wann möchtest du dem Spieler denn eine "Einweg"-Elytra geben? Wenn er stirbt und am Spawn respawned oder wie ist das gemeint? Link to comment Share on other sites More sharing options...
Yuki Posted January 10, 2017 Share Posted January 10, 2017 Hi, 1. Post *hust* Zitat -Spieler gibt /elytra ein und bekommt Elytra (funktoiniert) Ganz davon ab, warum nicht gleich den Flugstatus des Players abfragen, wenn die Möglichkeit doch besteht. ... PlayerMoveEvent e Player p = e.getPlayer(); if (p.isFlying()) { - z.B. prüfen, ob in einem Array, wo man einfach alle zwischenspeichert, die fliegen (wie von Joey vorgeschlagen) } else { - Prüfen, ob in dem Flug-Array und wenn ja, dann daraus entfernen und Elytra wegnehmen } -Yuki Link to comment Share on other sites More sharing options...
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