InventoryCloseEvent

Discussion in 'Plugin Development' started by Ebbez, Oct 24, 2013.

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

    Ebbez

    Hello Guyz

    I have made a trade command thats trade the item in your hand with /trade <Player> [Money]

    and i have maked if someone press esc or something that the player get his item back

    Codes:

    Main:
    Code:java
    1. package achp;
    2.  
    3. import org.bukkit.ChatColor;
    4. import org.bukkit.Material;
    5. import org.bukkit.command.Command;
    6. import org.bukkit.command.CommandSender;
    7. import org.bukkit.entity.Player;
    8. import org.bukkit.inventory.Inventory;
    9. import org.bukkit.inventory.ItemStack;
    10. import org.bukkit.inventory.meta.ItemMeta;
    11. import org.bukkit.plugin.PluginDescriptionFile;
    12. import org.bukkit.plugin.java.JavaPlugin;
    13.  
    14. public class Main extends JavaPlugin{
    15.  
    16.  
    17.  
    18. public void onEnable(){
    19. PluginDescriptionFile pdf = this.getDescription();
    20. getLogger().info(pdf.getName() + " version " + pdf.getVersion() + " has been enabled");
    21. getServer().getPluginManager().registerEvents(new Events(), this);
    22. }
    23.  
    24. public void onDisable(){
    25. PluginDescriptionFile pdf = this.getDescription();
    26. getLogger().info(pdf.getName() + " has been disabled");
    27. }
    28.  
    29. public boolean onCommand(CommandSender sender, Command cmd, String CL, String[] args){
    30. if(sender instanceof Player){
    31. Player player = (Player) sender;
    32. switch(CL.toLowerCase()){
    33. case "trade":
    34. if(args.length == 2){
    35. Player target = getServer().getPlayerExact(args[0]);
    36. if(target instanceof Player){
    37. int Money = Integer.valueOf(args[1]);
    38. if(Money > -1 && Money < 10000000){
    39. Inventory tradinginv = target.getPlayer().getServer().createInventory(null, 9, "Trading");
    40.  
    41. ItemStack Accept = new ItemStack(Material.WOOL, 1);
    42. ItemMeta Am = Accept.getItemMeta();
    43. Am.setDisplayName(ChatColor.GREEN + "Accept");
    44. Accept.setItemMeta(Am);
    45.  
    46. ItemStack Decline = new ItemStack(Material.WOOL, 1);
    47. ItemMeta Dm = Decline.getItemMeta();
    48. Dm.setDisplayName(ChatColor.RED + "Decline");
    49. Decline.setItemMeta(Dm);
    50.  
    51. ItemStack Head = new ItemStack(Material.SKULL, 1);
    52. ItemMeta Hm = Head.getItemMeta();
    53. Hm.setDisplayName(player.getName());
    54. Head.setItemMeta(Hm);
    55.  
    56. ItemStack MoneyStack = new ItemStack(Material.GOLD_INGOT, 1);
    57. ItemMeta Msm = MoneyStack.getItemMeta();
    58. Msm.setDisplayName("Money: " + Money);
    59. MoneyStack.setItemMeta(Msm);
    60.  
    61. ItemStack TradeItem = new ItemStack(player.getItemInHand().getType(), player.getItemInHand().getAmount());
    62. ItemMeta Tim = TradeItem.getItemMeta();
    63. Tim.setDisplayName("Item");
    64. TradeItem.setItemMeta(Tim);
    65.  
    66. tradinginv.setItem(0, Accept);
    67. tradinginv.setItem(1, Decline);
    68. tradinginv.setItem(6, Head);
    69. tradinginv.setItem(7, MoneyStack);
    70. tradinginv.setItem(8, TradeItem);
    71.  
    72. target.openInventory(tradinginv);
    73.  
    74. player.getInventory().setItemInHand(new ItemStack(Material.AIR, 1));
    75. }else{
    76. player.sendMessage("Sorry your money must be under the 1 million and above -1");
    77. }
    78. }else{
    79. player.sendMessage("Sorry that player isnt online now");
    80. }
    81. }else{
    82. player.sendMessage("Usage: /trade <Player> [AmountMoney]");
    83. }
    84. break;
    85. }
    86. }
    87. return false;
    88. }
    89. }
    90.  


    Events:
    Code:java
    1. package achp;
    2.  
    3. import org.bukkit.ChatColor;
    4. import org.bukkit.entity.Player;
    5. import org.bukkit.event.EventHandler;
    6. import org.bukkit.event.Listener;
    7. import org.bukkit.event.inventory.InventoryClickEvent;
    8. import org.bukkit.event.inventory.InventoryCloseEvent;
    9. import org.bukkit.inventory.Inventory;
    10. import org.bukkit.inventory.ItemStack;
    11. public class Events implements Listener{
    12.  
    13.  
    14. @EventHandler
    15. public void onInventoryEvent(InventoryClickEvent event){
    16. Inventory inv = event.getInventory();
    17. if(inv.getName().equalsIgnoreCase("Trading")){
    18. Player player = (Player) event.getWhoClicked();
    19. Player target = player.getServer().getPlayerExact(inv.getItem(6).getItemMeta().getDisplayName());
    20. ItemStack Item = new ItemStack(inv.getItem(8).getType(), inv.getItem(8).getAmount());
    21. if(event.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.GREEN + "Accept")){
    22. player.getInventory().addItem(Item);
    23. target.sendMessage("Your item has buyed for " + inv.getItem(7).getItemMeta().getDisplayName());
    24. event.setCancelled(true);
    25. player.closeInventory();
    26. }else if(event.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase(ChatColor.RED + "Decline")){
    27. target.getInventory().addItem(Item);
    28. target.sendMessage(player.getName() + " has denied your trade");
    29. event.setCancelled(true);
    30. player.closeInventory();
    31. }else{
    32. event.setCancelled(true);
    33. player.sendMessage("Sorry you cant pick that item");
    34. }
    35. }
    36. }
    37.  
    38. @EventHandler
    39. public void onInventoryCloseEvent(InventoryCloseEvent event){
    40. Inventory inv = event.getInventory();
    41. if(inv.getName().equalsIgnoreCase("Trading")){
    42. Player player = (Player) event.getPlayer();
    43. Player target = player.getServer().getPlayerExact(inv.getItem(6).getItemMeta().getDisplayName());
    44. ItemStack Item = new ItemStack(inv.getItem(8).getType(), inv.getItem(8).getAmount());
    45. target.getInventory().addItem(Item);
    46. target.sendMessage(player.getName() + " has closed his inventory");
    47. }
    48. }
    49.  
    50. }
    51.  


    and my problem is that if the console the inventory closes (If i have pressed Accept or Decline)
    he gives the target and me my item

    Images:

    [​IMG]

    [​IMG]

    Can someone help me

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 5, 2016
  2. Offline

    remremrem

    I believe one thing that is happening is that, onInventoryCloseEvent is being called after every transaction and giving the target the item back every time.

    onInventoryCloseEvent should only give the target the item if the trade was not accepted.

    This does not explain why both parties will recieve the item when the transaction is declined, in fact it seems to me that the target would recieve a duplicate item in that situation. So I am probably missing something.
     
Thread Status:
Not open for further replies.

Share This Page