How does getConfigurationSection work?

Discussion in 'Plugin Development' started by Xp10d3, Dec 24, 2019.

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

    Xp10d3

    Alright, so a couple of days ago I got some help with looping through some items for my onItemClick event in my GUI, but that changed my config a lot (thank goodness, because it was super messy) but now I have to use getConfigurationSection, which I'm super confused about. Well, I guess I kind of get it, but I don't know how I would get the item material or name. If my config is like this:

    Code:
    shop:
      items:
        MATERIAL
        name: <name>
        price: <cost>
        command: <command>
    
    How would I get the material? Or name, for that matter? Based on the help I got it doesn't say how to get the material, but the name in the onClick event is based off of the current item (event.getCurrentItem) which I can't use in public Inventory. Looping through the items isn't that difficult for me, it's just getting the item/material from the config. Thanks for the help!

    Code I got help with:
    Code:
    @EventHandler
        public void onItemClick(InventoryClickEvent event) {
            Player player = (Player) event.getWhoClicked();
            String itemName = event.getCurrentItem().getType().name();
           
            ConfigurationSection cfg = getConfig().getConfigurationSection("shop.items");
            if (cfg == null) return;
            if (!cfg.getKeys(false).contains(itemName)) return;
           
            int cost = cfg.getInt(itemName + ".cost");
            String command = cfg.getString(itemName + ".command");
            if (command == null) return;
           
            try {
                PreparedStatement statement = this.getConnection()
                        .prepareStatement("SELECT * FROM " + this.table + " WHERE UUID=?");
                statement.setString(1, player.getUniqueId().toString());
                ResultSet results = statement.executeQuery();
                results.next();
               
                int coins = results.getInt("GOLD");
                if (coins >= cost) {
                    player.closeInventory();
                    coins -= cost;
                    getServer().dispatchCommand(getServer().getConsoleSender(), command);
                } else {
                    player.closeInventory();
                    player.sendMessage("You don't have enough coins!");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
    This is where I specifically need help with in my class:
    Code:
            final Inventory inventory = Bukkit.createInventory(null, 18, ChatColor.BLACK + "Shop");
           
            //Here -> ConfigurationSection cfg = core.getConfig().getConfigurationSection("shop.items");
           // Here ->  String itemName = cfg.getString(itemName + ".name");
            int cost = cfg.getInt(itemName + ".cost");
    
    Commands Class:
    Code:
    package xp10d3.corelia.main;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.UUID;
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.configuration.ConfigurationSection;
    import org.bukkit.entity.Player;
    import org.bukkit.event.inventory.InventoryOpenEvent;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    public class Commands implements CommandExecutor {
       
        public Commands(Core core) {
            this.core = core;
            Bukkit.getPluginCommand("eshop").setExecutor(this);
            Bukkit.getPluginCommand("pay").setExecutor(this);
            Bukkit.getPluginCommand("gold").setExecutor(this);
        }
       
        private Core core;
       
        public Inventory shopGUI(InventoryOpenEvent event) {
           
            /*
            // Gets the config/material values for items one through twenty four.
            Material itemZero = Material.getMaterial(core.config.getString("shop.items.itemZero"));
            Material itemOne = Material.getMaterial(core.config.getString("shop.to.item.itemOne"));
            Material itemTwo = Material.getMaterial(core.config.getString("shop.to.item.itemTwo"));
            Material itemThree = Material.getMaterial(core.config.getString("shop.to.item.itemThree"));
            Material itemFour = Material.getMaterial(core.config.getString("shop.to.item.itemFour"));
            Material itemFive = Material.getMaterial(core.config.getString("shop.to.item.itemFive"));
            Material itemSix = Material.getMaterial(core.config.getString("shop.to.item.itemSix"));
            Material itemSeven = Material.getMaterial(core.config.getString("shop.to.item.itemSeven"));
            Material itemEight = Material.getMaterial(core.config.getString("shop.to.item.itemEight"));
            Material itemNine = Material.getMaterial(core.config.getString("shop.to.item.itemNine"));
            Material itemTen = Material.getMaterial(core.config.getString("shop.to.item.itemTen"));
            Material itemEleven = Material.getMaterial(core.config.getString("shop.to.item.itemEleven"));
            Material itemTwelve = Material.getMaterial(core.config.getString("shop.to.item.itemTwelve"));
            Material itemThirteen = Material.getMaterial(core.config.getString("shop.to.item.itemThirteen"));
            Material itemFourteen = Material.getMaterial(core.config.getString("shop.to.item.itemFourteen"));
            Material itemFifteen = Material.getMaterial(core.config.getString("shop.to.item.itemFifteen"));
            Material itemSixteen = Material.getMaterial(core.config.getString("shop.to.item.itemSixteen"));
            Material itemSeventeen = Material.getMaterial(core.config.getString("shop.to.item.itemSeventeen"));
            */
            // Creates the inventory.
            final Inventory inventory = Bukkit.createInventory(null, 18, ChatColor.BLACK + "Shop");
           
            ConfigurationSection cfg = core.getConfig().getConfigurationSection("shop.items");
            String itemName = cfg.getString(itemName + ".name");
            int cost = cfg.getInt(itemName + ".cost");
            /*
            // Gets the material in each GUI from 1-24.
            final ItemStack item0 = new ItemStack(itemZero);
            final ItemMeta item0Meta = item0.getItemMeta();
            final ItemStack item1 = new ItemStack(itemOne);
            final ItemMeta item1Meta = item1.getItemMeta();
            final ItemStack item2 = new ItemStack(itemTwo);
            final ItemMeta item2Meta = item2.getItemMeta();
            final ItemStack item3 = new ItemStack(itemThree);
            final ItemMeta item3Meta = item3.getItemMeta();
            final ItemStack item4 = new ItemStack(itemFour);
            final ItemMeta item4Meta = item4.getItemMeta();
            final ItemStack item5 = new ItemStack(itemFive);
            final ItemMeta item5Meta = item5.getItemMeta();
            final ItemStack item6 = new ItemStack(itemSix);
            final ItemMeta item6Meta = item1.getItemMeta();
            final ItemStack item7 = new ItemStack(itemSeven);
            final ItemMeta item7Meta = item7.getItemMeta();
            final ItemStack item8 = new ItemStack(itemEight);
            final ItemMeta item8Meta = item8.getItemMeta();
            final ItemStack item9 = new ItemStack(itemNine);
            final ItemMeta item9Meta = item9.getItemMeta();
            final ItemStack item10 = new ItemStack(itemTen);
            final ItemMeta item10Meta = item10.getItemMeta();
            final ItemStack item11 = new ItemStack(itemEleven);
            final ItemMeta item11Meta = item11.getItemMeta();
            final ItemStack item12 = new ItemStack(itemTwelve);
            final ItemMeta item12Meta = item12.getItemMeta();
            final ItemStack item13 = new ItemStack(itemThirteen);
            final ItemMeta item13Meta = item13.getItemMeta();
            final ItemStack item14 = new ItemStack(itemFourteen);
            final ItemMeta item14Meta = item14.getItemMeta();
            final ItemStack item15 = new ItemStack(itemFifteen);
            final ItemMeta item15Meta = item15.getItemMeta();
            final ItemStack item16 = new ItemStack(itemSixteen);
            final ItemMeta item16Meta = item16.getItemMeta();
            final ItemStack item17 = new ItemStack(itemSeventeen);
            final ItemMeta item17Meta = item17.getItemMeta();
           
            // Sets the display name for each item and sets the ItemMeta for it.
            item0Meta.setDisplayName(ChatColor.WHITE + "Item");
            item0.setItemMeta(item0Meta);
            item1Meta.setDisplayName(ChatColor.WHITE + "Item");
            item1.setItemMeta(item1Meta);
            item2Meta.setDisplayName(ChatColor.WHITE + "Item");
            item3.setItemMeta(item3Meta);
            item4Meta.setDisplayName(ChatColor.WHITE + "Item");
            item4.setItemMeta(item4Meta);
            item5Meta.setDisplayName(ChatColor.WHITE + "Item");
            item5.setItemMeta(item5Meta);
            item6Meta.setDisplayName(ChatColor.WHITE + "Item");
            item6.setItemMeta(item6Meta);
            item6Meta.setDisplayName(ChatColor.WHITE + "Item");
            item7.setItemMeta(item7Meta);
            item8Meta.setDisplayName(ChatColor.WHITE + "Item");
            item8.setItemMeta(item8Meta);
            item9Meta.setDisplayName(ChatColor.WHITE + "Item");
            item9.setItemMeta(item9Meta);
            item10Meta.setDisplayName(ChatColor.WHITE + "Item");
            item10.setItemMeta(item10Meta);
            item11Meta.setDisplayName(ChatColor.WHITE + "Item");
            item11.setItemMeta(item11Meta);
            item12Meta.setDisplayName(ChatColor.WHITE + "Item");
            item12.setItemMeta(item12Meta);
            item13Meta.setDisplayName(ChatColor.WHITE + "Item");
            item13.setItemMeta(item13Meta);
            item14Meta.setDisplayName(ChatColor.WHITE + "Item");
            item14.setItemMeta(item14Meta);
            item15Meta.setDisplayName(ChatColor.WHITE + "Item");
            item15.setItemMeta(item15Meta);
            item16Meta.setDisplayName(ChatColor.WHITE + "Item");
            item16.setItemMeta(item16Meta);
            item17Meta.setDisplayName(ChatColor.WHITE + "Item");
            item17.setItemMeta(item17Meta);
           
            // Sets the item for each GUI slot.
            inventory.setItem(0, item0);
            inventory.setItem(1, item1);
            inventory.setItem(2, item2);
            inventory.setItem(3, item3);
            inventory.setItem(4, item4);
            inventory.setItem(5, item5);
            inventory.setItem(6, item6);
            inventory.setItem(7, item7);
            inventory.setItem(8, item8);
            inventory.setItem(9, item9);
            inventory.setItem(10, item10);
            inventory.setItem(11, item11);
            inventory.setItem(12, item12);
            inventory.setItem(13, item13);
            inventory.setItem(14, item14);
            inventory.setItem(15, item15);
            inventory.setItem(16, item16);
            inventory.setItem(17, item17);
            */
           
            return inventory;
           
        }
       
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String lable, String[] args) {
            Player player = (Player) sender;
            UUID uuid = player.getUniqueId();
            if (!(sender instanceof Player)) {
                sender.sendMessage("You must be a player to access this command!");
            }
            if (cmd.getName().equalsIgnoreCase("eshop")) {
                if (args.length == 0) {
                    player.openInventory(shopGUI(player, core));
                    return true;
                } else {
                    player.sendMessage("Too many arguments! Correct usage: /eshop");
                }
            }
            if (cmd.getName().equalsIgnoreCase("gold")) {
                if (args.length == 0) {
                    try {
                        PreparedStatement statement = core.getConnection().prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                        statement.setString(1, uuid.toString());
                        ResultSet results = statement.executeQuery();
                        results.next();
                        player.sendMessage("You have " + results.getInt("GOLD") + " gold.");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    return true;
                } else {
                    player.sendMessage("Too many arguments! Correct usage: /gold");
                }
            }
            if (cmd.getName().equalsIgnoreCase("pay")) {
                if (args.length == 2) {
                    Player target = Bukkit.getServer().getPlayer(args[0]);
                    if (target == null) {
                        player.sendMessage(ChatColor.RED + "That player isn't online!");
                    } else {
                        if (isInt(args[1]) == true) {
                            int argumentTwo = Integer.parseInt(args[1]);
                            try {
                                PreparedStatement statement = core.getConnection()
                                        .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                                statement.setString(1, uuid.toString());
                                ResultSet results = statement.executeQuery();
                                results.next();
                                int coinsAmount = (results.getInt("GOLD"));
                                if (argumentTwo < 1) {
                                    player.sendMessage(ChatColor.RED + "You can't pay another person a negative amount!");
                                    return false;
                                } else if (coinsAmount < 1 || argumentTwo < coinsAmount) {
                                    player.sendMessage(ChatColor.RED + "You don't have enough gold!");
                                    return false;
                                } else {
                                    /*
                                    coins.put(target.getUniqueId(), results.getInt("GOLD") + argumentTwo);
                                    coins.put(player.getUniqueId(), results.getInt("GOLD") - argumentTwo);
                                    player.sendMessage("Gave " + target + argumentTwo + " gold.");
                                    target.sendMessage(ChatColor.GREEN + "You have recieved " + argumentTwo + " gold.");
                                    */
                                    PreparedStatement statement1 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                                    statement1.setInt(1, argumentTwo);
                                    statement1.setString(2, target.getUniqueId().toString());
                                    statement1.executeUpdate();
                                    PreparedStatement statement2 = core.getConnection().prepareStatement("UPDATE " + core.table + " SET GOLD = GOLD + ? WHERE UUID=?");
                                    statement2.setInt(1, -argumentTwo);
                                    statement2.setString(2, player.getUniqueId().toString());
                                    statement2.executeUpdate();
                                    player.sendMessage("Gave " + target.getName() + " " + argumentTwo + " gold.");
                                    target.sendMessage(ChatColor.GREEN + "You have recieved " + argumentTwo + " gold.");
                                }
                            } catch (SQLException e) {
                                e.printStackTrace();
                            }
                        } else {
                            player.sendMessage(ChatColor.RED + "Please use an integer. Example: /pay Xp10d3 50");
                        }
                    }
                } else {
                    player.sendMessage(ChatColor.RED + "Too few arguments! Correct usage: /pay <player> <amount>");
                }
            }
            return false;
        }
       
        public boolean isInt(String s) {
            try {
                Integer.parseInt(s);
                return true;
            } catch (NumberFormatException e) {
                return false;
            }
        }
       
        public void getCoins(UUID uuid) {
            try {
                PreparedStatement statement = core.getConnection()
                        .prepareStatement("SELECT * FROM " + core.table + " WHERE UUID=?");
                statement.setString(1, uuid.toString());
                ResultSet results = statement.executeQuery();
                results.next();
                //System.out.print("Player has " + results.getInt("GOLD") + " gold.");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
    
     
  2. Offline

    Irantwomiles

    I think you have to change your cfg.getString(itemName + ".name") to just ".name" because from the config you posted it shows that it is structured like shop.items.name
     
    Xp10d3 likes this.
  3. Offline

    Strahan

    cfg represents your config data at "shop.items". Your config example is slightly broken. It should be:
    Code:
    shop:
      items:
        MATERIAL:
          name: <name>
          price: <cost>
          command: <command>
    The material name should be a key, so it should have a colon after it. If you are building a GUI for a shop, I'd add a slot: value along with name, price and command. Then you just loop the shop.items and add as needed.

    if you are trying to add it by the material name, like you had a function with a constructor like private void addItem(int slot, String material); or something you would get fields like cfg.getInt(material + ".cost") for cost, cfg.getString(material + ".name") for name. Etc, etc.
     
    Xp10d3 likes this.
  4. Offline

    Xp10d3

    Alright. Thanks! I got it to work. But after changing some code and some help from a Discord server, I have this as my code:
    But I am getting a null error. I updated my config in my workspace and updated my config on my test server, yet what I don't understand is that it says it's null even when I add more items than necessary. It says Material can't be null even when I have all the materials added and have different items for each slot.
    Config:
    Here is my error:
     
  5. Offline

    Strahan

    There are several issues. You should be null checking a variable directly after you made it, not later after which you've already tried to use it. When the material is not found, material will be null then when you try to do "final ItemStack item = new ItemStack(material);" it will crash. Also be sure you've set api-version in the plugin.yml.

    You're doing the same thing with name; attempting to use it then checking if it's null after the fact. Similarly with your sender instanceof check; you are casting it to Player then checking later if sender is Player. For obvious reasons, that will fail.

    I'd also recommend using matchMaterial instead of getMaterial. It'd remove the need to uppercase it; matchMaterial is more forgiving.

    GOLD and IRON are also not valid Material names. I'm not sure why you are looping the item set either, that doesn't seem logical. You should store the desired slot number in config and use that to place it.
     
Thread Status:
Not open for further replies.

Share This Page