Solved GUI + ItemMeta = failure

Discussion in 'Plugin Development' started by MajorSkillage, Oct 25, 2014.

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

    MajorSkillage

    I want it so when someone clicks itemstack stack1 if they have enough points they get itemstack stack but it is not working even with enough points and it wont msg the player even if he/she does not have enough points! here is my code
    Code:
    package me.rockinroll99.BiomeCraftVotes;
     
    import org.bukkit.Bukkit;
    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.enchantments.EnchantmentWrapper;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    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;
    import org.bukkit.plugin.java.JavaPlugin;
     
    import com.vexsoftware.votifier.model.VotifierEvent;
     
    public class BiomeCraftVotes extends JavaPlugin implements Listener{
        public void onEnable(){
            getServer().getPluginManager().registerEvents(this, this);
            saveConfig();
            getConfig().options().copyDefaults(true);
            saveConfig();
            reloadConfig();
        }
        public static Inventory shop = Bukkit.createInventory(null, 9, "Voting points");
        static{
            ItemStack stack = new ItemStack(278, 0, (byte) 0);
            ItemMeta im = stack.getItemMeta();
            im.setDisplayName(ChatColor.RED + "75 Votes required");
            stack.setItemMeta(im);
            Enchantment e = new EnchantmentWrapper(32);
            Enchantment e1 = new EnchantmentWrapper(34);
            Enchantment e2 = new EnchantmentWrapper(35);
            stack.addUnsafeEnchantment(e, 5);
            stack.addUnsafeEnchantment(e1, 3);
            stack.addUnsafeEnchantment(e2, 3);
            shop.setItem(1, stack);
        }
        @EventHandler(priority=EventPriority.NORMAL)
        public void onVote(VotifierEvent e){
            String p = e.getVote().getUsername();
            if(getConfig().getInt(p) > 0){
                saveConfig();
                int count = getConfig().getInt(p);
                Player p1 =  Bukkit.getServer().getPlayer(p);
                getConfig().set(p, count + 1);
                getConfig().set(p + "_total_votes", getConfig().getInt(p) + 1);
                p1.sendMessage("Thanks for voting and helping our community grow! your total votes is " + (getConfig().getInt(p)));
                Bukkit.broadcastMessage(ChatColor.RED + "" + ChatColor.RED + p1.getName() + " " + ChatColor.GOLD + "Has just voted @ " + e.getVote().getServiceName() + ", use /vote if you would like to get rewarded and help the server");
                saveConfig();
                reloadConfig();
            } else {
                Player p1 =  Bukkit.getServer().getPlayer(p);
                saveConfig();
                getConfig().addDefault(p, 1);
                getConfig().addDefault(p + "_total_votes", 1);
            getConfig().set(p, 1);
            getConfig().options().copyDefaults(true);
            saveConfig();
            reloadConfig();
            p1.sendMessage("Thanks for voting and helping our community grow! your total vote is " + getConfig().getInt(p));
            Bukkit.broadcastMessage(ChatColor.RED + "" + ChatColor.RED + p1.getName() + " " + ChatColor.GOLD + "Has just voted @ " + e.getVote().getServiceName());
            saveConfig();
            }
        }
        public boolean onCommand(CommandSender Sender, Command cmd, String commandLabel, String[] args){
            Player p = (Player)Sender;
            if(commandLabel.equalsIgnoreCase("vote")){
                p.sendMessage(ChatColor.GOLD + "[" + ChatColor.GREEN + "BiomeCraft + ChatColor.GOLD + ]" + ChatColor.RED + "Vote links:");
                p.sendMessage(ChatColor.RED + "Still got to put some in :I");
            }
            if(commandLabel.equalsIgnoreCase("points"));
            ItemStack emerald = new ItemStack(Material.EMERALD);
            ItemMeta em = emerald.getItemMeta();
            em.setDisplayName(ChatColor.RED + "Vote Points: " + getConfig().getInt(p.getName()));
            emerald.setItemMeta(em);
            shop.setItem(0, emerald);
                p.openInventory(shop);
            return false;
        }
        @EventHandler
        public void onInvClick(InventoryClickEvent e){
            Enchantment e3 = new EnchantmentWrapper(32);
            Enchantment e1 = new EnchantmentWrapper(34);
            Enchantment e2 = new EnchantmentWrapper(35);
            ItemStack stack1 = new ItemStack(278, 0, (byte) 0);
            ItemMeta im1 = stack1.getItemMeta();
            im1.setDisplayName(ChatColor.RED + "75 Votes required");
            stack1.setItemMeta(im1);
            stack1.addUnsafeEnchantment(e1, 5);
            stack1.addUnsafeEnchantment(e1, 3);
            stack1.addUnsafeEnchantment(e2, 3);
            Player p = (Player) e.getWhoClicked();
            ItemStack stack = new ItemStack(278, 0, (byte) 0);
            ItemMeta im = stack.getItemMeta();
            im.setDisplayName(ChatColor.RED + p.getName() + "'s pickaxe");
            stack.setItemMeta(im);
            stack.addUnsafeEnchantment(e3, 5);
            stack.addUnsafeEnchantment(e1, 3);
            stack.addUnsafeEnchantment(e2, 3);
            stack.setItemMeta(im);
            if(e.getCurrentItem().equals(Material.EMERALD)){
                e.setCancelled(true);
            }
            if(e.getInventory().equals(shop) && getConfig().getInt(p.getName()) >= 75 && e.getCurrentItem().equals(stack1)){
                saveConfig();
                getConfig().set(p.getName(), getConfig().getInt(p.getName()) - 75);
                p.getInventory().addItem(stack);
                p.closeInventory();
                getConfig().options().copyDefaults(true);
                saveConfig();
                reloadConfig();
                e.setCancelled(true);
            } else if(e.getCurrentItem().equals(stack1) && e.getInventory().equals(shop)){
                saveConfig();
                reloadConfig();
                p.sendMessage(75 - getConfig().getInt(p.getName()) + " more votes required!");
                e.setCancelled(true);
            }
        }
    }
     
  2. Offline

    mine-care

    Some fixes:
    1. You are abusing static modifier
    2. You are casting sender to player without checking
    3. you kinda heavily use config, you open edit and save then reload it many many times. What I sugest to make your code much efficient, use hashmaps.
    4. In GUI you check if current item is the stack, but current item might be null.
    5. Nme your bariables so they describe their use, stack and stack1 are not good variable names. Instead use ingui(stack) and to give(stac1) Without the ( )
    6. To solve your problem try debugging your code and especially the ifs
     
  3. Offline

    MajorSkillage

    well ive never used hashmaps, could you give me an example i don't learn good from api's if i just see a bit of code i should know how. Anyway why wouldn't i cast a sender to a player? What else could it be? :p and for number 4 il probably just do if(getCurrentItem() != null) i guess, you think that would work? After i do that i will just check for errors in console, that is what i usually do also thanks for this
     
  4. Offline

    mine-care

    MajorSkillage
    Hash map is like a table with a lot of cells and 2 rows,
    In row 1 you store a key that when produced to the map it will return the value that has been stored in cell 2
    Example:
    HashMap<string,string> map= new hashmap<>();
    map.put("this is a key","and this is a value");
    Soo when I do:
    map.get("this is a key"); <--- this returns the value stored previously, so in this case it returns "and this is a value"
    Read more with examples here: http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

    Sender can be: commandblock, console sender, player ect so you do:
    If(sender instanceof Player){
    Player player =(player)sender;

    }
    Yes he if != null will help,
    for anything else you want please tell me =]
     
  5. Offline

    MajorSkillage

    Well i want it in config instead incase anyone wins more votes or etc or if an error happens where an admin needs to set it, anyway here is my new code documented as well. The problem now is it wont message when the user does not have enough points it still wont msg the player
    Code:
    package me.rockinroll99.BiomeCraftVotes;
     
    import org.bukkit.Bukkit;
    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.enchantments.EnchantmentWrapper;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.EventPriority;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.plugin.java.JavaPlugin;
     
    import com.vexsoftware.votifier.model.VotifierEvent;
     
    public class BiomeCraftVotes extends JavaPlugin implements Listener{
        public void onEnable(){
            getServer().getPluginManager().registerEvents(this, this);
            saveConfig();
        }
        public Inventory shop = Bukkit.createInventory(null, 9, "Voting points");
        //test adds items to the shop called on the /points command
        void test(){
            ItemStack stack = new ItemStack(278, 0, (byte) 0);
            ItemMeta im = stack.getItemMeta();
            im.setDisplayName(ChatColor.RED + "75 Votes required");
            stack.setItemMeta(im);
            Enchantment e = new EnchantmentWrapper(32);
            Enchantment e1 = new EnchantmentWrapper(34);
            Enchantment e2 = new EnchantmentWrapper(35);
            stack.addUnsafeEnchantment(e, 5);
            stack.addUnsafeEnchantment(e1, 3);
            stack.addUnsafeEnchantment(e2, 3);
            shop.setItem(1, stack);
        }
        //this happens on vote event
        @EventHandler(priority=EventPriority.NORMAL)
        public void onVote(VotifierEvent e){
            String p = e.getVote().getUsername();
            //if the user is in the config
            if(getConfig().getInt(p) >= 0){
                saveConfig();
                int count = getConfig().getInt(p);
                Player p1 =  Bukkit.getServer().getPlayer(p);
                //adds 1 to the user's points
                getConfig().set(p, count + 1);
                //shows how much total votes for admins
                getConfig().set(p + "_total_votes", getConfig().getInt(p) + 1);
                p1.sendMessage("Thanks for voting and helping our community grow! your total votes is " + (getConfig().getInt(p)));
                Bukkit.broadcastMessage(ChatColor.RED + "" + ChatColor.RED + p1.getName() + " " + ChatColor.GOLD + "Has just voted @ " + e.getVote().getServiceName() + ", use /vote if you would like to get rewarded and help the server");
                saveConfig();
            } else {
                //created so that the player can be messaged
                Player p1 =  Bukkit.getServer().getPlayer(p);
                //adds the user to the config
                getConfig().set(p, 1);
                getConfig().set(p + "_total_votes", 1);
            p1.sendMessage("Thanks for voting and helping our community grow! your total vote is " + getConfig().getInt(p));
            Bukkit.broadcastMessage(ChatColor.RED + "" + ChatColor.RED + p1.getName() + " " + ChatColor.GOLD + "Has just voted @ " + e.getVote().getServiceName());
            saveConfig();
            }
        }
        public boolean onCommand(CommandSender Sender, Command cmd, String commandLabel, String[] args){
            Player p = (Player)Sender;
            if(commandLabel.equalsIgnoreCase("vote")){
                p.sendMessage(ChatColor.GOLD + "[" + ChatColor.GREEN + "BiomeCraft + ChatColor.GOLD + ]" + ChatColor.RED + "Vote links:");
                p.sendMessage(ChatColor.RED + "Still got to put some in :I");
                //will create arrayList for config here later
            }
            if(commandLabel.equalsIgnoreCase("points"));
            //calls method to set inventory
            test();
            //creates a emerald and set's to the points the player has to display in the gui
            ItemStack emerald = new ItemStack(Material.EMERALD);
            ItemMeta em = emerald.getItemMeta();
            em.setDisplayName(ChatColor.RED + "Vote Points: " + getConfig().getInt(p.getName()));
            emerald.setItemMeta(em);
            shop.setItem(0, emerald);
            //opens the gui
                p.openInventory(shop);
            return false;
        }
        @EventHandler
        public void onInvClick(InventoryClickEvent e){
            Enchantment e3 = new EnchantmentWrapper(32);
            Enchantment e1 = new EnchantmentWrapper(34);
            Enchantment e2 = new EnchantmentWrapper(35);
            Player p = (Player) e.getWhoClicked();
            //checks for item
            if(e.getCurrentItem() != null){
                //stops emeralds from being taken
            if(e.getCurrentItem().getType().equals(Material.EMERALD)){
                e.setCancelled(true);
            }
            }
            //checks that the inventory is the correct gui and that the item being clicked is 278
            if(e.getInventory().equals(shop) && e.getCurrentItem().getTypeId() == 278){
                //checks for the correct item
                if(e.getCurrentItem().getItemMeta().getDisplayName().equals(ChatColor.RED + "75 Votes required")){
                    //checks if the user has enough votes
                if(getConfig().getInt(p.getName()) >= 75){
                    //removes the points on purchase and creates the item
                getConfig().set(p.getName(), getConfig().getInt(p.getName()) - 75);
                ItemStack stack = new ItemStack(278, 0, (byte) 0);
                ItemMeta im = stack.getItemMeta();
                im.setDisplayName(ChatColor.RED + p.getName() + "'s pickaxe");
                stack.addUnsafeEnchantment(e3, 5);
                stack.addUnsafeEnchantment(e1, 3);
                stack.addUnsafeEnchantment(e2, 3);
                stack.setItemMeta(im);
                //gives the user the pickaxe
                p.getInventory().addItem(stack);
                saveConfig();
                e.setCancelled(true);
                }
            } else if(getConfig().getInt(p.getName()) < 75 && e.getInventory().equals(shop) && e.getCurrentItem().getItemMeta().getDisplayName().equals(ChatColor.RED + "75 Votes required")){
                //if the user does not have enough and it is the correct gui and has clicked the correct item it will show
                //how much more the user needs
                if(e.getCurrentItem().getTypeId() == 278){
                p.sendMessage(75 - getConfig().getInt(p.getName()) + " more votes required!");
                e.setCancelled(true);
                }
                }
            }
            }
        //adds the user to the config if they have not been added
        @EventHandler
        public void onJoin(PlayerJoinEvent e){
            Player player = e.getPlayer();
            if(getConfig().getInt(player.getName()) < 1){
                getConfig().set(player.getName(), 0);
            }
        }
    }
     
  6. Offline

    mine-care

    Ok about the config, I say it because it is a heavy task for the server and a possible server exploit once it is triggered by users command, so if someone knows this and wants to crash a server he puts in 2-3 accounts to perform the command all time so the use will lag the server or even crash it, to resolve this you can save them in a hashmap and on disable export them in the config.
    Please fix the cast to player too
    Also in the inventorry click you are not checking if the inventorry is the one you are working on, so in all inventories people cannot click emeralds
    Also the problem about the points from config is that it actually is I. The wrong bracket, it should be on the above }
     
Thread Status:
Not open for further replies.

Share This Page