Jinnai4 Posted August 27, 2017 Share Posted August 27, 2017 (edited) Hallo ! Bin gerade dabei mich mit der Plugin-Programmierung zu beschäftigen und Java-Anfänger. Bis jetzt bin ich auch ganz gut zurechtgekommen. Jetzt hänge ich allerdings und suche schon seit 2 Stunden nach einer Möglichkeit auf den 1. Slot in der Hotbar zuzugreifen. Da fertige Plugin soll ein Schwert erzeugen was an den Spieler gebunden ist und nicht entfernt werden kann, sowie mit jedem Kill 1 Enchantment Stufe steigt. Mein Problem ist jetzt aber, dass das Schwert zwar auf den 1 Slot gesetzt wird, falls sich aber ein Item auf diesem Slot befindet, dieses einfach überschrieben wird. Gibt es einen drop Befehl mit dem ich, bevor das Schwert auf den Slot gesetzt wird, das Item welches sich dort befindet dropen kann? Vielen Dank für die Hilfe liebe Grüße import java.util.ArrayList; import java.util.Arrays; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Item; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.java.JavaPlugin; @SuppressWarnings("deprecation") public class thecurse<privat> extends JavaPlugin implements Listener { ArrayList<String> verflucht = new ArrayList<String>(); private static ItemStack cursedsword = new ItemStack(Material.DIAMOND_SWORD); public void onEnable() { this.getLogger().info("\n\n\n[PLUGIN] THE_CURSED_SWORD wurde aktiviert!\n\n\n"); getServer().getPluginManager().registerEvents(this, this); ItemMeta metaData = cursedsword.getItemMeta(); metaData.setDisplayName("Muramasa"); metaData.setLore(Arrays.asList("TEXT1", "TEXT2", "~seelengebunden")); metaData.setUnbreakable(true); cursedsword.setItemMeta(metaData); cursedsword.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, 1); cursedsword.addUnsafeEnchantment(Enchantment.LUCK, 99); ShapedRecipe cursedswordrecipe = new ShapedRecipe(cursedsword); cursedswordrecipe.shape("odo", "odo", "o/o"); cursedswordrecipe.setIngredient('o', Material.BEDROCK); cursedswordrecipe.setIngredient('d', Material.DIAMOND); cursedswordrecipe.setIngredient('/', Material.STICK); this.getServer().addRecipe(cursedswordrecipe); } public void onDisable() { this.getLogger().info("\n\n\n[PLUGIN] THE_CURSED_SWORD wurde deaktiviert!\n\n\n"); } public boolean onCommand(CommandSender sender, Command cmd, String string, String[] args) { return true; } @EventHandler public void onEvent(PlayerPickupItemEvent e) { Player player = e.getPlayer(); ItemStack vergleich = e.getItem().getItemStack(); if (vergleich.equals(cursedsword)) { player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "Du wurdest verflucht!"); verflucht.add(player.getUniqueId().toString()); player.sendMessage(verflucht.toString()); // Später LÖSCHEN und Liste erzeugen player.getInventory().setItem(0, cursedsword); } } @EventHandler public void onEvent(PlayerDropItemEvent e) { Player player = e.getPlayer(); Item drop = e.getItemDrop(); if (drop.getItemStack().equals(cursedsword)) { player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "TEXT"); e.setCancelled(true); } } @EventHandler public void onEvent(InventoryClickEvent e) { Player player = (Player) e.getWhoClicked(); if(e.getCurrentItem().equals(cursedsword)) { player.sendMessage(ChatColor.DARK_RED + "" + ChatColor.BOLD + "TEXT"); player.getInventory().setItem(0, cursedsword); e.setCancelled(true); } } } Edited August 27, 2017 by Jinnai4 Code-Layout Link to comment Share on other sites More sharing options...
Baustein Posted August 28, 2017 Share Posted August 28, 2017 Schau dir mal die Methode world.dropItem(player.getLocation(), item); an. Hier müsste world halt die Welt des Spielers ein (player.getLocation().getWorld()), player der Spieler, und item der ItemStack in seiner Hotbar. Du solltest vielleicht noch überprüfen, ob item überhaupt existiert (Nullcheck). Liebe Grüße, Baustein Link to comment Share on other sites More sharing options...
Jinnai4 Posted August 28, 2017 Author Share Posted August 28, 2017 (edited) vor 2 Stunden schrieb Baustein: Schau dir mal die Methode world.dropItem(player.getLocation(), item); an. Hier müsste world halt die Welt des Spielers ein (player.getLocation().getWorld()), player der Spieler, und item der ItemStack in seiner Hotbar. Du solltest vielleicht noch überprüfen, ob item überhaupt existiert (Nullcheck). Liebe Grüße, Baustein Vielen Dank für die schnelle Antwort! Ah das macht das wesentlich einfacher, dachte man muss den ItemStack auswählen, aber gut das man da direkt auf den Slot zugreifen kann. Danke nochmals lg Für die, welche es interessiert ein kleiner Ausschnitt @EventHandler public void onEvent(InventoryClickEvent e) { Player player = (Player) e.getWhoClicked(); ItemStack drop = player.getInventory().getItem(0); boolean curse = player.getInventory().contains(cursedsword); if (e.getCurrentItem().equals(cursedsword) && curse == false) { // Item wird zum Beispiel von Truhe genommen // oder erschaffen e.setCancelled(false); } else if(e.getCurrentItem().equals(cursedsword) && curse == true) { // Item wird im Inventar angeklickt if(drop != cursedsword) { try { player.getWorld().dropItem(player.getLocation(), drop); } catch (NullPointerException ex) { } Edited August 28, 2017 by Jinnai4 erneute Formatierung 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