ItemStack Changes Problem & Inventory Click Problem

Discussion in 'Plugin Development' started by Kassestral, Feb 16, 2015.

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

    Kassestral

    So I have two problems...

    One is that when a player opens the inventory and clicks on the itemstack they want to buy, the itemstack in the shop inventory changes amount, which it is not meant to.

    Another problem is that players can click inside their inventory on certain slots and buy there item for the same price as the one they are meant to buy the item from inside the shop inventory for.

    Basically what I am trying to do is ask is how do I stop the itemstack from changing, and how do I stop players from buying there own items in their inventory....

    Shop Class
    Code:
    package com.kassestral.plugins.imperium.events;
    
    import java.io.IOException;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.Material;
    import org.bukkit.block.Sign;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.ItemFrame;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.block.Action;
    import org.bukkit.event.block.SignChangeEvent;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    
    import com.kassestral.plugins.imperium.Account;
    import com.kassestral.plugins.imperium.Message;
    
    public class Shop implements Listener {
       
        private Double item_price;
       
        @EventHandler
        public void onShopCreate(SignChangeEvent event) {
            Player player = event.getPlayer();
           
            if(event.getLine(0).equalsIgnoreCase("shop")) {
                if(event.getLine(1).equalsIgnoreCase("buy")) {
                    if(player.isOp()) {
                        String buy;
                        buy = ChatColor.GREEN + "Buy";
                        buy = ChatColor.BOLD + buy;
                        event.setLine(0, ChatColor.WHITE + "=======");
                        event.setLine(1, ChatColor.GREEN.toString() + ChatColor.BOLD + "Buy");
                        event.setLine(2, ChatColor.YELLOW + "£" + event.getLine(2));
                        event.setLine(3, ChatColor.WHITE + "=======");
                    }
                    else {
                       
                    }
                }
                else if(event.getLine(1).equalsIgnoreCase("sell")) {
                    if(player.isOp()) {
                        String sell;
                        sell = ChatColor.RED + "Sell";
                        sell = ChatColor.BOLD + sell;
                        event.setLine(0, ChatColor.WHITE + "=======");
                        event.setLine(1, ChatColor.RED.toString() + ChatColor.BOLD + "Sell");
                        event.setLine(2, ChatColor.YELLOW + "£" + event.getLine(2));
                        event.setLine(3, ChatColor.WHITE + "=======");
                    }
                    else {
                       
                    }
                }
            }
        }
       
        @EventHandler
        public void onShopInteract(PlayerInteractEvent event) throws IOException {
                Player player = event.getPlayer();
              
                if(event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
                    if(event.getClickedBlock().getType().equals(Material.WALL_SIGN) || event.getClickedBlock().getType().equals(Material.SIGN_POST)){
                        Sign sign = (Sign) event.getClickedBlock().getState();
                       
                        if(sign.getLine(1).equalsIgnoreCase(ChatColor.GREEN.toString() + ChatColor.BOLD + "Buy")){
                            Location location = event.getClickedBlock().getLocation();
                            location.setY(location.getY()-1);
                           
                            String string_amount = ChatColor.stripColor(sign.getLine(2));
                            String fixed_amount = string_amount.replace("£", "");
                           
                            for (Entity entity : location.getChunk().getEntities()) {
                                if (entity.getLocation().getBlock().getLocation().equals(location)) {
                                    ItemFrame item = (ItemFrame) entity;
                                    ItemStack newstack = item.getItem();
                                    item_price = Double.parseDouble(fixed_amount);
                                    player.openInventory(Store(newstack, ChatColor.stripColor(sign.getLine(1)), fixed_amount));
                                }
                            }
                        }
                        else if(sign.getLine(1).equalsIgnoreCase(ChatColor.RED.toString() + ChatColor.BOLD + "Sell")){
                            Location location = event.getClickedBlock().getLocation();
                            location.setY(location.getY()+1);
                           
                            String string_amount = ChatColor.stripColor(sign.getLine(2));
                            String fixed_amount = string_amount.replace("£", "");
                           
                            for (Entity entity : location.getChunk().getEntities()) {
                                if (entity.getLocation().getBlock().getLocation().equals(location)) {
                                    ItemFrame item = (ItemFrame) entity;
                                    ItemStack newstack = item.getItem();
                                    item_price = Double.parseDouble(fixed_amount);
                                    player.openInventory(Store(newstack, ChatColor.stripColor(sign.getLine(1)), fixed_amount));
                                }
                            }
                        }
                    }
                }
            }
       
        @SuppressWarnings("deprecation")
        private Inventory Store(ItemStack item, String type, String price) {
            Inventory inventory = Bukkit.createInventory(null, 9, getStoreType(type));
           
            //Pane ItemStack Configuration
            ItemStack pane = new ItemStack(160, 1 , (byte) 8);
            ItemMeta meta = pane.getItemMeta();
            meta.setDisplayName(ChatColor.BLACK + ".");
            pane.setItemMeta(meta);
           
            inventory.setItem(0, pane);
            inventory.setItem(1, pane);
            inventory.setItem(2, pane);
            inventory.setItem(3, item);
            item.setAmount(32);
            inventory.setItem(4, item);
            item.setAmount(64);
            inventory.setItem(5, item);
            inventory.setItem(6, pane);
            inventory.setItem(7, pane);
            inventory.setItem(8, pane);
            return inventory;
        }
       
        private String getStoreType(String type) {
            if(ChatColor.stripColor(type).equalsIgnoreCase("Buy")){
                return ChatColor.GREEN.toString() + ChatColor.BOLD + "Buy";
            }
            else if(ChatColor.stripColor(type).equalsIgnoreCase("Sell")){
                return ChatColor.RED.toString() + ChatColor.BOLD + "Sell";
            }
            else {
                return "Uknown Store";
            }
        }
    
        @SuppressWarnings("deprecation")
        @EventHandler
        public void onInventoryInteract(InventoryClickEvent event) throws IOException {
            Player player = (Player) event.getWhoClicked();
            Inventory inventory = event.getInventory();
           
            if(inventory.getName().equalsIgnoreCase(ChatColor.GREEN.toString() + ChatColor.BOLD + "Buy")) {
                player.updateInventory();
                if(event.getSlot()==0) {
                    event.setCancelled(true);
                }
                else if(event.getSlot()==1) {
                    event.setCancelled(true);
                }
                else if(event.getSlot()==2) {
                    event.setCancelled(true);
                }
                else if(event.getSlot()==3) {
                    purchaseFromStore(player, event.getCurrentItem(), item_price);
                    event.setCancelled(true);
                }
                else if(event.getSlot()==4) {
                    purchaseFromStore(player, event.getCurrentItem(), item_price);
                    event.setCancelled(true);
                }
                else if(event.getSlot()==5) {
                    purchaseFromStore(player, event.getCurrentItem(), item_price);
                    event.setCancelled(true);
                }
                else if(event.getSlot()==6) {
                    event.setCancelled(true);
                }
                else if(event.getSlot()==7) {
                    event.setCancelled(true);
                }
                else if(event.getSlot()==8) {
                    event.setCancelled(true);
                }
            }
            else if(inventory.getName().equalsIgnoreCase(ChatColor.RED.toString() + ChatColor.BOLD + "Sell")) {
                if(event.getSlot()==1) {
                    event.setCancelled(true);
                }
                if(event.getSlot()==2) {
                    event.setCancelled(true);
                }
                if(event.getSlot()==3) {
                    event.setCancelled(true);
                }
                if(event.getSlot()==4) {
                    event.setCancelled(true);
                }
                if(event.getSlot()==5) {
                    event.setCancelled(true);
                }
                if(event.getSlot()==6) {
                    event.setCancelled(true);
                }
                if(event.getSlot()==7) {
                    event.setCancelled(true);
                }
                if(event.getSlot()==8) {
                    event.setCancelled(true);
                }
                if(event.getSlot()==8) {
                    event.setCancelled(true);
                }
            }
        }
       
        public void purchaseFromStore(Player player, ItemStack stack, double amount) throws IOException {
            Account account = new Account(player);
            Message message = new Message();
            Inventory inventory = player.getInventory();
           
            if(account.hasBalance(amount)) {
                if(inventory.firstEmpty() != -1) {
                    account.deductBalance(amount*stack.getAmount());
                    inventory.addItem(stack);
                    player.sendMessage(message.boughtItem(stack.getType().toString()));
                }
                else if(inventory.getItem(inventory.first(stack)).getAmount() + stack.getAmount() <= stack.getMaxStackSize()) {
                    account.deductBalance(amount*stack.getAmount());
                    inventory.addItem(stack);
                    player.sendMessage(message.boughtItem(stack.getType().toString()));
                }           
                else {
                    Bukkit.getServer().broadcastMessage(message.invalidInventorySpace());
                }
            }
            else {
                player.sendMessage(message.insufficientFunds());
            }
        }
       
    }
     
  2. Problem of changing amount: Two possibilities. 1) you set the amount. if so, just don't. 2) the event is setting the amoutn because the player klicked on the item. in this case you should cancel the event after you're done with your stuff. then nothing will happen.

    Problem of Player buing own items: check if the inventory the klicked item is in is equals to your shopinventory. if not, do nothing. if it is equals, do your buy sell whatever thing
     
  3. Offline

    Kassestral

    @Shmobi
    I checked if it's equal to the shopinventory, although for some reason it will still return true even when it's not that inventory
     
  4. Offline

    nj2miami

    The entire inventory window is in the shopinventory, so ANYTHING clicked will trigger it. You could check the rawslot clicked to see if is within the UPPER section. Set some debug messages to spit out the RAWSLOT when you click so you can understand what is being clicked and when.

    EDIT: Just read your code more and you are in fact using SLOT, which repeats for TOP and BOTTOM, so simply use RAWSLOT and I think you will find success.

    From there you should be able to figure it out fairly easily.

    I would do something like this off the top of my head...

    Code:
                // is this the GUI?
                if(e.getInventory().getName().equals(INVENTORY_NAME)) {
                    e.setCancelled(true);
    
                    // do some slot validation here
    
                    ItemStack item = e.getCurrentItem();
                    player.addItem(item);
                 }
                    
     
    Last edited: Feb 27, 2015
    Kassestral likes this.
Thread Status:
Not open for further replies.

Share This Page