市场对接

市场样式

打开/预览

打开:游戏中按下 H 点击市场

预览:在游戏中输入 /mldproxy market 进行预览

一、完成市场界面并实现方法

继承BaseGuiMarket,并实现其抽象方法
/**
 * 玩家尝试上架某商品
 *
 * @param material 验证用。建议在获取槽位物品后用此校验,避免错误。
 * @param slot     玩家PlayerInventory的槽位
 */
abstract void tryPutOnSale(String material, int slot, int amount, int price);
/*
 * 玩家尝试将某物品下架
 * 当前暂不会被调用。
 *
 * @param uuid 商品的UUID
 * */
abstract void tryPutOffShelves(UUID uuid);
/*
 * 玩家尝试购买某商品
 * 若玩家购买成功,请使用operateGoods方法隐藏已购买物品,以保证用户体验。
 *
 * @param uuid 商品的UUID
 * */
abstract void tryPurchase(UUID uuid, int amount);
/**
 * 列表请求物品(流式)
 * 客户端拥有一个容器存储缓存,每当玩家浏览到底,将会触发该请求获得更多物品。
 *
 * @param sortType 排序类型,每个类型对应一个客户端缓存容器。
 *                 注意,BY_SEARCH_PRICE_ASC将会被分流至  requestSearchGoodsProperty,无需在此开发。
 * @param index    需求的索引位置,通常为容器已缓存数量
 * @param step     需求的数量,非必要回执数量请勿超出step。
 * @return 若无更新,结果可以为NULL。
 */
abstract List<GoodsProperty> requestGoodsProperty(SortTypeEnum sortType, int index, int step);
/**
 * 搜索列表请求物品(流式)
 * 玩家在客户端搜索栏输入搜索关键词,并回车后,将会触发该请求获取更多物品。
 *
 * @param keyword 搜索栏填写的关键词
 * @param index   需求的索引位置,通常为容器已缓存数量
 * @param step    需求的数量,非必要回执数量请勿超出step。
 * @return 若无更新,结果可以为NULL。
 */
abstract List<GoodsProperty> requestSearchGoodsProperty(String keyword, int index, int step);
GoodsProperty结构解释 —— 货物DOM
GoodsProperty property = new GoodsProperty();
//货物的UUID,将用于回调
property.uuid.set(UUID.randomUUID());
//货物的价格
property.price.set((long) new Random().nextInt(Integer.MAX_VALUE));
//货物的上架日期
property.putOnTime.set(System.currentTimeMillis());
//货物卖家信息
property.sellerName.set(getViewer().getName());
//货物所承载的ItemStack
property.goods.set(ItemProperty.of(new ItemStack(Material.COMPASS, new Random().nextInt(64))));

你可以通过operteGoods方法操作货物状态,使用范例如下所示。

/*
 * 预期:购买后在客户端使对应物品消失,否则用户会产生购买失败的错觉
 * 
 * 为什么这么做?该物品已被缓存入客户端容器中,直接删除易导致index被扰乱。
 * */
void tryPurchase(UUID uuid, int amount) {
    //在客户端界面之中隐藏货物,类似于css@display: none
    operateGoods(uuid).hide().apply();
    info("成功购买物品!" + uuid + ">" + amount);
}

二、对接接口

  • 实现 IMarketProvider

  • 注册实现即可

Last updated

Was this helpful?