Solved Update GUI

Discussion in 'Plugin Development' started by VNGC, Apr 18, 2020.

Thread Status:
Not open for further replies.
  1. Offline

    VNGC

    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);
                        }
                    }
                }
            }
        }
    
    }
    
     
  2. Offline

    KarimAKL

    @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.
     
  3. Offline

    VNGC

    It just updates the whole inv if i do that, but it should only update the item, that the player cliekd
     
  4. Offline

    KarimAKL

    @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.
     
  5. Offline

    VNGC

    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
     
  6. Offline

    KarimAKL

    @VNGC There's no need to open the inventory again but, otherwise, i think it should work.
     
  7. Offline

    VNGC

    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)
     
  8. Offline

    KarimAKL

    @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.
     
  9. Offline

    VNGC

    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.
     
    Last edited by a moderator: Apr 19, 2020
    KarimAKL likes this.
Thread Status:
Not open for further replies.

Share This Page