55555hhh

  1.           @EventHandler
  2.           public void closeingInvetory(InventoryCloseEvent event)
  3.           {
  4.             Inventory inventory = event.getInventory();
  5.             Player whoClosePlayer = (Player)event.getPlayer();
  6.             if (inventory.getName().equalsIgnoreCase("§a§l? §f§l重铸"))
  7.             {
  8.               List<ItemStack> itemStacks = new ArrayList();
  9.               if (inventory.getItem(13) != null) {
  10.                 itemStacks.add(inventory.getItem(13));
  11.               }
  12.               Thread sendItemThread = new Thread(new Runnable()
  13.               {
  14.                 public void run()
  15.                 {
  16.                   for (ItemStack itemStack : itemStacks) {
  17.                     whoClosePlayer.getInventory().addItem(new ItemStack[] { itemStack });
  18.                   }
  19.                 }
  20.               });
  21.               sendItemThread.start();
  22.             }
  23.           }
复制代码
这样写,把物品放入gui 直接关闭游戏 再上线 背包会有*2刚刚放入的物品
应该怎么写才能避免这种问题..
据我所知现在很多插件都是用这种方法,比如以前的sas...

狡诈师
你是想,Gui的物品东西在退出游戏或关闭服务器的时候返回玩家的背包?

这是关闭服务器时的例子

  1.     @Override
  2.     public void onDisable() {
  3.         for (Player player : Bukkit.getServer().getOnlinePlayers()) {
  4.             if (player.getOpenInventory().getTopInventory().getItem(3) != null) {
  5.                 player.getInventory().addItem(player.getOpenInventory().getTopInventory().getItem(3));
  6.             }
  7.         }
  8.     }
复制代码

  1. itemStacks.add(inventory.getItem(13));
  2. inventory.setItem(13, null);
复制代码


在获取物品后将物品删掉。
因为玩家离线时会触发两次 InventoryCloseEvent 事件。

hnfhu1
判断一下玩家在线的状态 如果是离线导致的 就要防止重复判断