开发者 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。