跳到主要内容

开发者 API

其他插件可以监听云商城的每一笔买卖:在交易前取消(例如活动期间禁止卖某样东西),或在交易后做事(成就、任务进度、记录)。

事件都在 dev.cloudplugins.shop.api 包里:

类什么时候
ShopTransactionEvent钱与物品交换之前,可以取消
ShopTransactionEvent.Done交易完成之后,不能取消

引入​

把云商城的 jar 加进编译依赖(只在编译时使用,不要打包进你的插件),例如 Gradle:

dependencies {
compileOnly files('libs/CloudShop.jar') // 资源中心下载的云商城 jar
}

plugin.yml 加上软依赖:

softdepend: [CloudShop]

ShopTransactionEvent​

方法说明
getPlayer()玩家
getShop()商店 ID(文件名)
getItem()商品 key
getAction()Action.BUY 或 Action.SELL
getUnits()份数
getAmount()物品数量(份数 × 每份数量)
getPrice()这笔的总金额文字,例如 5,000 金币 + 50 点券
setCancelled(true)取消这笔交易:不扣钱、不给 / 不拿物品,玩家看到「交易被取消了」

事件在玩家所在的线程触发(Paper 是主线程,Folia 是玩家所在区域的线程),此时余额、背包空间、限购都已检查通过。

import dev.cloudplugins.shop.api.ShopTransactionEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

public final class ShopListener implements Listener {
// 活动期间矿物交易所不收钻石
@EventHandler
public void onTrade(ShopTransactionEvent e) {
if (e.getAction() == ShopTransactionEvent.Action.SELL
&& e.getShop().equals("ores") && e.getItem().equals("diamond")) {
e.setCancelled(true);
}
}

// 交易完成后:累计任务进度
@EventHandler
public void onDone(ShopTransactionEvent.Done e) {
ShopTransactionEvent t = e.getTrade();
if (t.getAction() == ShopTransactionEvent.Action.BUY) {
t.getPlayer().sendMessage("任务进度 +" + t.getAmount());
}
}
}
  • 出售箱、/sell hand、/sell all 卖多种物品时,每一种物品各触发一次;取消其中一种只会让那一种不卖,其他照常。
  • 只执行指令的商品(give-item: false)也会触发,getAmount() 是份数 × amount。

打开商店​

从 NPC、菜单插件或你自己的插件打开商店,用指令即可(以控制台执行):

/cs open <商店> <玩家>
/cs open main <玩家>
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "cs open blocks " + player.getName());

会照玩家的情况自动选择云界面画面或箱子菜单,并检查商店的进入权限与开放的子服。在云界面画面的按钮上可以直接用动作 cloudshop: <商店>,见 云界面联动。

PlaceholderAPI​

价格、限购、库存、行情、余额等数值可以通过 变量 读取。