【发布时间】:2015-09-14 15:06:20
【问题描述】:
每次玩家发出特定命令时,都会根据 MySQL 表的内容生成虚拟库存,然后将其显示给玩家。效果很好。
现在,当玩家将物品从这个虚拟物品栏移动到他自己的物品栏中时,它应该检查物品是否仍在数据库中。如果没有,则应取消该活动。当玩家将物品从他的库存移动到虚拟库存时,它们应该被添加到数据库表中。
我对 MySQL 查询没有任何问题,但我不知道应该为事件使用哪个 EventHandler(Player Inv -> Virtual Inv,Virtual Inv -> Player Inv)。 Bukkit Inventory Events
InventoryMoveItemEvent 会很完美,但它只在方块(漏斗、分配器等)移动物品时调用,而不是玩家。
InventoryClickEvent 不是解决方案,因为将物品移动到另一个库存有很多不同的可能性:
- 按住 Shift 键单击只会调用一次事件
- 拾起物品并使用光标将其移动到其他物品栏会调用该事件两次。
- 拿起一个物品堆并将其物品分散到其他库存中会调用
InventoryClickEvent和InventoryDragEvent。 - 等等……
有人知道我该如何解决这个问题吗?
【问题讨论】:
-
我只有创建库存的代码(这里不需要)。由于我不知道应该使用哪个事件,所以我还没有任何事件代码。
-
很遗憾,Bukkit 的库存事件有很多问题。您可以改用重复任务,清除插槽以模拟取消。
-
@FrancescoMenzani 使用 MySQL 查询重复任务不会导致服务器延迟,尤其是当一些玩家同时打开库存时?
-
对,您应该为这些任务使用异步线程。您可以使用 Bukkit 调度程序(推荐)或 Java 内置并发 API,或两者兼而有之。