我最近在我的Spigot/Bukkit插件中遇到了一个奇怪的bug,这完全没有任何意义。请注意,这个问题可能很长,因为我正在处理的项目相当大,并且由于源代码(下面提供)包含不会包含在这里的类,我会尽力描述我的问题。
在Minecraft中,使用BukkitAPI您可以创建图形菜单(GUI),您可以在其中将项目放置在某些插槽中,单击时,您可以调整功能。
在我的例子中,我创建了Menu
基础类,其中包含创建此类菜单的基本方法。然后,扩展Menu类的PurchaseMenu
用于在特定位置触发功能,以模拟可以从菜单中单击的产品交易。
在深度上,我将包含的菜单包含“工具包”显示(如游戏类),当一个左键单击显示时,玩家可以购买它,或者如果它已经购买,玩家将只选择该工具包使用。当一个右键单击显示时,玩家可以将工具包升级到3级。
在这两种情况下,必须弹出一个交易菜单才能购买或升级点击的工具包。我的设计非常简单,通过从每个PurchaseMenu
类的构造函数传递点击的工具包。
上面所有的问题是,工具包是从构造函数正确传递的,但是实际购买或升级的工具包是随机的(显然不是,但是还没有找到任何证据),这通常发生在一些尝试之后。
我的设计:
InventoryClick
在单击(交互)菜单显示时调用。InventoryConstruct
在创建(打开)菜单时调用。购买成功时调用PurchaseProducts
。PrePaymentChecks
是购买前需要运行的必要检查。我的问题:
感谢任何形式的帮助,我希望我详细描述了我的问题,如果您需要任何进一步的源代码,请在下面发表评论。
因为这个问题不仅仅是30k个字符,所以我把整个项目上传到了一个Git存储库中。
https://github.com/parat26/core
Menu.java:https://github.com/parat26/core/blob/master/src/src/ares/core/menu/Menu.java
PurchaseMenu.java:https://github.com/parat26/core/blob/master/src/src/ares/core/menu/PurchaseMenu.java
BattleOptionsMenu.java:https://github.com/parat26/core/blob/master/src/src/ares/core/menu/type/MenuBattleOptions.java
PurchaseMenuKit.java:https://github.com/parat26/core/blob/master/src/src/ares/core/menu/type/PurchaseMenuKit.java
尝试将PurchaseMenu. object更改为最终,看看输出是什么。此外,System.out.println()
是您的朋友。
我不建议您将Object用于您的套件,因为当您将object
设置为sellableKit
时,它可能会更改对象。制作一个名为Sellable的接口
private final ItemStack item;
protected final Sellable<? super Kit> kit;
private final GoldCurrency currency;
public PurchaseMenu(String menuName, ItemStack sellableItem, Sellable<? super Kit> sellableKit, GoldCurrency currencyType)
{
super(Material.STONE, menuName, 54);
item = sellableItem;
kit = sellableKit;
currency = currencyType;
DependOnEvents(true);
}
将这些字段设为最终字段也是一种很好的做法,因为在对象创建后似乎没有设置这些字段,并且让任何人立即知道这些对象永远不会改变。它还应该启发情况,因为最终对象不能更改。
您应该删除私有工具包;
字段来自BuyKitOwnership Menu
,因为您只是制作对象的副本。您的PurchaseProducts()
方法可以更改为
@Override
public void PurchaseProduct(GoldCurrency currency, Client client)
{
client.getManager().setKitOwned(kit, true);
}
因为套件现在受到保护,处于超级类中。