Hey, i need to update my GUI, if i click on an item, and it works because i only have one Item in the GUI. but how can i do it if i have more than one item in the GUI? it should show if a challenge is enabled or disabled, and i think its tricky to update it, because if have to check if every single Item is now enabled or disabled. Code: package de.vngc.xChallenges; import java.util.Arrays; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; public class Settings implements CommandExecutor, Listener { public static Inventory inv = Bukkit.createInventory(null, 54, "§5§lChallenges-Menü"); public static boolean place = false; public static boolean blockbreak = false; @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { ItemStack cobble = new ItemStack(Material.COBBLESTONE); ItemStack pickaxe = new ItemStack(Material.DIAMOND_PICKAXE); ItemStack disabled = new ItemStack(Material.ROSE_RED); ItemStack enabled = new ItemStack(Material.LIME_DYE); ItemMeta cobblemeta = cobble.getItemMeta(); ItemMeta pickaxemeta = pickaxe.getItemMeta(); ItemMeta disabledmeta = disabled.getItemMeta(); ItemMeta enabledmeta = enabled.getItemMeta(); cobblemeta.setDisplayName("§6Place = Tot"); pickaxemeta.setDisplayName("§6Abbauen = Tot"); disabledmeta.setDisplayName("§cDeaktiviert"); enabledmeta.setDisplayName("§6Aktiviert"); cobblemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block platziert!")); pickaxemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block abbaut!")); cobble.setItemMeta(cobblemeta); pickaxe.setItemMeta(pickaxemeta); disabled.setItemMeta(disabledmeta); enabled.setItemMeta(enabledmeta); if (cmd.getName().equalsIgnoreCase("settings")) { if (sender instanceof Player) { Player player = (Player) sender; inv.setItem(1, cobble); inv.setItem(10, disabled); player.openInventory(inv); } else sender.sendMessage(Data.noplayer); } return false; } @EventHandler public void Click(InventoryClickEvent event) { ItemStack cobble = new ItemStack(Material.COBBLESTONE); ItemStack disabled = new ItemStack(Material.ROSE_RED); ItemStack enabled = new ItemStack(Material.LIME_DYE); ItemMeta cobblemeta = cobble.getItemMeta(); ItemMeta disabledmeta = disabled.getItemMeta(); ItemMeta enabledmeta = enabled.getItemMeta(); cobblemeta.setDisplayName("§6NoBlockPlace"); disabledmeta.setDisplayName("§cDeaktiviert"); enabledmeta.setDisplayName("§6Aktiviert"); cobblemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block platziert!")); cobble.setItemMeta(cobblemeta); disabled.setItemMeta(disabledmeta); enabled.setItemMeta(enabledmeta); Player player = (Player) event.getWhoClicked(); if (event.getView().getTitle().equals("§5§lChallenges-Menü")) { event.setCancelled(true); if (event.getCurrentItem().getType() != null) { if (event.getCurrentItem().getType() == Material.COBBLESTONE) { if (place) { place = false; player.closeInventory(); Inventory inv = Bukkit.createInventory(null, 54, "§5§lChallenges-Menü"); inv.setItem(1, cobble); inv.setItem(10, disabled); player.openInventory(inv); } else { place = true; player.closeInventory(); Inventory inv = Bukkit.createInventory(null, 54, "§5§lChallenges-Menü"); inv.setItem(1, cobble); inv.setItem(10, enabled); player.openInventory(inv); } } } } } }
@VNGC You simply have to set a new item in that slot. You could create a method for copying an item (if one doesn't already exist, i can't remember at the moment), then just copy the item, and replace some properties from "enabled" to "disabled", etc.
It just updates the whole inv if i do that, but it should only update the item, that the player cliekd
@VNGC You shouldn't create a new inventory, just save the inventory to a field, then set the item in that inventory. It should automatically update that slot for the player without reopening the inventory.
so if i get it right, this should work? cant test right now, as im on my laptop not at home, and have no mc installed here. Code: package de.vngc.xChallenges; import java.util.Arrays; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; public class Settings implements CommandExecutor { public static Inventory inv = Bukkit.createInventory(null, 54, "§6Challenge-Settings"); public static boolean blockplace = false; public static boolean blockbreak = false; public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { ItemStack cobble = new ItemStack(Material.COBBLESTONE); ItemStack pickaxe = new ItemStack(Material.DIAMOND_PICKAXE); ItemStack disabled = new ItemStack(Material.ROSE_RED); ItemStack enabled = new ItemStack(Material.LIME_DYE); ItemMeta cobblemeta = cobble.getItemMeta(); ItemMeta pickaxemeta = pickaxe.getItemMeta(); ItemMeta disabledmeta = disabled.getItemMeta(); ItemMeta enabledmeta = enabled.getItemMeta(); cobblemeta.setDisplayName("§6Place = Tot"); pickaxemeta.setDisplayName("§6Abbauen = Tot"); disabledmeta.setDisplayName("§cDeaktiviert"); enabledmeta.setDisplayName("§6Aktiviert"); cobblemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block platziert!")); pickaxemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block abbaut!")); cobble.setItemMeta(cobblemeta); pickaxe.setItemMeta(pickaxemeta); disabled.setItemMeta(disabledmeta); enabled.setItemMeta(enabledmeta); if (sender instanceof Player) { Player player = (Player) sender; if (cmd.getName().equalsIgnoreCase("settings")) { inv.setItem(1, cobble); inv.setItem(3, pickaxe); if (blockplace) { inv.setItem(10, enabled); } else { inv.setItem(10, disabled); } if (blockbreak) { inv.setItem(12, enabled); } else { inv.setItem(12, disabled); } player.openInventory(inv); } } return false; } @EventHandler public void handleClick(InventoryClickEvent event) { Player player = (Player) event.getWhoClicked(); ItemStack cobble = new ItemStack(Material.COBBLESTONE); ItemStack pickaxe = new ItemStack(Material.DIAMOND_PICKAXE); ItemStack disabled = new ItemStack(Material.ROSE_RED); ItemStack enabled = new ItemStack(Material.LIME_DYE); ItemMeta cobblemeta = cobble.getItemMeta(); ItemMeta pickaxemeta = pickaxe.getItemMeta(); ItemMeta disabledmeta = disabled.getItemMeta(); ItemMeta enabledmeta = enabled.getItemMeta(); cobblemeta.setDisplayName("§6Place = Tot"); pickaxemeta.setDisplayName("§6Abbauen = Tot"); disabledmeta.setDisplayName("§cDeaktiviert"); enabledmeta.setDisplayName("§6Aktiviert"); cobblemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block platziert!")); pickaxemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block abbaut!")); cobble.setItemMeta(cobblemeta); pickaxe.setItemMeta(pickaxemeta); disabled.setItemMeta(disabledmeta); enabled.setItemMeta(enabledmeta); if (event.getCurrentItem() != null) { if (event.getCurrentItem().getType() == Material.COBBLESTONE) { if (blockplace) { inv.setItem(10, enabled); } else { inv.setItem(10, disabled); } } else if (event.getCurrentItem().getType() == Material.DIAMOND_PICKAXE) { if (blockbreak) { inv.setItem(10, enabled); } else { inv.setItem(10, disabled); } } player.openInventory(inv); } } } edit: 1st: dont wonder about the messages, i am german 2nd: i just made a new class, i saw that my class was very confusing before
the most things works, but it doesnt get updated on click. it only gets updated if i close it and manually re-open it with the command. is there a way to do this automatically? (in best case without moving the cursor to the middle again)
@VNGC I don't think i see anything wrong with the code. I can test your code myself later, then see if it works for me, or if i can get it working.
would be very nice! this is my actual: Code: package de.vngc.xChallenges; import java.util.Arrays; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; public class Settings implements CommandExecutor, Listener { public static Inventory inv = Bukkit.createInventory(null, 54, "§6Challenge-Settings"); public static boolean blockplace = false; public static boolean blockbreak = false; public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { ItemStack cobble = new ItemStack(Material.COBBLESTONE); ItemStack pickaxe = new ItemStack(Material.DIAMOND_PICKAXE); ItemStack disabled = new ItemStack(Material.ROSE_RED); ItemStack enabled = new ItemStack(Material.LIME_DYE); ItemMeta cobblemeta = cobble.getItemMeta(); ItemMeta pickaxemeta = pickaxe.getItemMeta(); ItemMeta disabledmeta = disabled.getItemMeta(); ItemMeta enabledmeta = enabled.getItemMeta(); cobblemeta.setDisplayName("§6Place = Tot"); pickaxemeta.setDisplayName("§6Abbauen = Tot"); disabledmeta.setDisplayName("§cDeaktiviert"); enabledmeta.setDisplayName("§6Aktiviert"); cobblemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block platziert!")); pickaxemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block abbaut!")); cobble.setItemMeta(cobblemeta); pickaxe.setItemMeta(pickaxemeta); disabled.setItemMeta(disabledmeta); enabled.setItemMeta(enabledmeta); if (sender instanceof Player) { Player player = (Player) sender; if (cmd.getName().equalsIgnoreCase("settings")) { inv.setItem(1, cobble); inv.setItem(3, pickaxe); if (blockplace) { inv.setItem(10, enabled); } else { inv.setItem(10, disabled); } if (blockbreak) { inv.setItem(12, enabled); } else { inv.setItem(12, disabled); } player.openInventory(inv); } } return false; } @EventHandler public void handleClick(InventoryClickEvent event) { Player player = (Player) event.getWhoClicked(); ItemStack cobble = new ItemStack(Material.COBBLESTONE); ItemStack pickaxe = new ItemStack(Material.DIAMOND_PICKAXE); ItemStack disabled = new ItemStack(Material.ROSE_RED); ItemStack enabled = new ItemStack(Material.LIME_DYE); ItemMeta cobblemeta = cobble.getItemMeta(); ItemMeta pickaxemeta = pickaxe.getItemMeta(); ItemMeta disabledmeta = disabled.getItemMeta(); ItemMeta enabledmeta = enabled.getItemMeta(); cobblemeta.setDisplayName("§6Place = Tot"); pickaxemeta.setDisplayName("§6Abbauen = Tot"); disabledmeta.setDisplayName("§cDeaktiviert"); enabledmeta.setDisplayName("§6Aktiviert"); cobblemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block platziert!")); pickaxemeta.setLore(Arrays.asList("§eDie Challenge ist vorbei, sobald ein Spieler einen Block abbaut!")); cobble.setItemMeta(cobblemeta); pickaxe.setItemMeta(pickaxemeta); disabled.setItemMeta(disabledmeta); enabled.setItemMeta(enabledmeta); if (event.getCurrentItem() != null) { if (event.getCurrentItem().getType() == Material.COBBLESTONE) { if (blockplace) { blockplace = false; inv.setItem(10, enabled); player.openInventory(inv); } else { blockplace = true; inv.setItem(10, disabled); player.openInventory(inv); } } else if (event.getCurrentItem().getType() == Material.DIAMOND_PICKAXE) { if (blockbreak) { blockbreak = false; inv.setItem(12, enabled); player.openInventory(inv); } else { blockbreak = true; inv.setItem(12, disabled); player.openInventory(inv); } player.openInventory(inv); } event.setCancelled(true); } } } now its working. but ty anyway for the great help! EDIT by Moderator: merged posts, please use the edit button instead of double posting.