0x03 着手使用商店管理器(Shop(Manager))
ShopManager 是 QuickShop-Hikari 的核心部分,大部分与商店交互的操作都通过 ShopManager 完成。
获取 ShopManager 实例
ShopManager manager = api.getShopManager();
获取商店
因为 Minecraft 有一个特殊的“大型箱子”,我们不能直接通过坐标绘制商店分布地图。
QuickShop-Hikari 的商店只会与半个“大型箱子”绑定,所以若要获取商店信息,你需要找到箱子方块本身,以及与其相连的另一个箱子。
好消息是,插件内置了一个 API,能快速处理这种情况。
这个操作必须在服务器的主线程上进行。
Shop shop = manager.getShopIncludeAttached(location);
默认情况下,我们会使用 ShopCache 来提升方法的性能。
我们会妥善处理商店缓存的更新,所以你不应该绕过缓存操作,除非出现了某些非预期结果。 无缓存查找相对有更高的性能开销,且它只能在服务器主线程上执行。
Shop bypassCacheShop = manager.getShopIncludeAttached(location,false);
获取服务器上的所有商店
此方法通常不会消耗太多性能,但我们仍不推荐你频繁调用此 API(例如每秒 20 次)。
List<Shop> allShops = manager.getAllShops();
获取所有已载入的商店
这个方法只会返回处于活跃状态的商店(例如位于已加载区块内或其他原因保持激活的商店)。
此方法不会唤起完整的商店查找,且这些商店会由 QuickShop 单独保存。
List<Shop> loadedShops = manager.getLoadedShops();
商店的载入&卸载
这个操作必须在服务器的主线程上进行。
Shop shop = ...;
ShopManager manager = ...;
manager.unloadShop(shop); // load the shop and put it into loaded shops list
manager.loadShop(shop); // unload the shop and remove it from loaded shops list
删除或禁用商店
这个操作必须在服务器的主线程上进行。
Shop shop = ...;
ShopManager manager = ...;
manager.deleteShop(shop) // 从内存与数据库中完全删除此商店
识别商店
需要注意的是,商店位置是一种内部变量,且不应通过坐标查找商店。
另外,RuntimeRandomUniqueId 不应用于识别商店,因为正如其名称所述,它的值会在服务器每次重启时刷新,因此它应当只用于玩家与服务器交互时的场景。
long shopId = shop.getShopId(); // 除非商店被删除,否则一般不会出现变化。若商店尚未准备好,则有可能为 -1。如 ShopCreateEvent。这种情况下应当使用 ShopCreateSuccessEvent。
获取收购或出售模式下的商店
ShopType type = shop.getShopType();
// 可为 ShopType.SELLING 或 ShopType.BUYING
获取商店剩余物品量
尽管这个值存储在实现过程中的 ItemStack 内,你仍不应直接从 ItemStack 获取该值,它可以在运行时由配置文件覆盖。
int stackingAmount = shop.getShopStackingAmount();
物品比较
QuickShop-Hikari 有两种物品比较的实现方式,各有不同的选项,适用于不同的情况。所以你应该避免使用 ItemStack.isSimilar(),否则可能导致非预期的情况出现。
商店比较
若你需要比较商店内的物品,你可以参考如下代码:
Shop shop = ...;
boolean applicable = shop.matches(YOUR_ITEM_STACK);
或在独立物品之间比较(不推荐,不同的字段顺序也可能导致不同的结果。)
ItemMatcher matcher = api.getItemMatcher();
boolean applicable = matcher.matches(ORIGINAL, TARGET);