开发者 API
其他插件可以用星月造物的 API 打开奖池、替玩家抽奖、拿宝箱物品与钥匙、读保底次数,并监听开箱与中奖事件。
API 都在套件 dev.starplugins.crate.api。
加入依赖
把 StarCrate-<版本>-簡體授權版.jar 放进你的项目(例如 libs/),只在编译时依赖,不要打包进你的 jar。
Gradle
dependencies {
compileOnly files('libs/StarCrate-1.0.0-簡體授權版.jar')
}
Maven
<dependency>
<groupId>dev.starplugins</groupId>
<artifactId>starcrate</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/StarCrate-1.0.0-簡體授權版.jar</systemPath>
</dependency>
plugin.yml
softdepend: [StarCrate] # 必须要有星月造物才能运作的话,改成 depend: [StarCrate]
StarCrateAPI
全部是静态方法。除了 available() 与 crates(),其他方法在星月造物没有启用或授权还没通过时会抛出 IllegalStateException,请先检查 available()。
| 方法 | 回传 | 说明 |
|---|---|---|
available() | boolean | 星月造物已启用且授权已通过 |
crates() | Collection<String> | 所有奖池 ID |
open(Player p, String crate) | boolean | 为玩家打开奖池预览(自选奖池打开选择界面)。奖池不存在时回传 false |
draw(Player p, String crate, int count, boolean free) | boolean | 替玩家抽奖,会播放动画、发放奖励、计入保底与记录。count 为 10 以上 = 十连,其他 = 单抽。free = true 时不扣任何花费,也不检查开启权限与每日上限。奖池不存在时回传 false |
crateItem(String crate, int amount) | ItemStack | 这个奖池的宝箱物品(数量最多一组)。奖池不存在时回传 null |
keyItem(String crate, int amount) | ItemStack | 这个奖池的钥匙(数量最多一组)。奖池不存在时回传 null |
pity(UUID uuid, String crate) | int | 玩家在这个奖池的保底次数。只对在线玩家有效,离线玩家回传 0 |
奖池 ID 不分大小写。open 与 draw 会排进玩家所在的线程执行(支持 Folia),回传 true 只代表奖池存在、已经排入执行;
抽奖是否成功(花费够不够、有没有权限)会直接提示玩家。
import dev.starplugins.crate.api.StarCrateAPI;
public void reward(Player player) {
if (!StarCrateAPI.available()) return;
// 签到奖励:免费十连
StarCrateAPI.draw(player, "xinghui", 10, true);
}
public void giveCrate(Player player) {
if (!StarCrateAPI.available()) return;
ItemStack box = StarCrateAPI.crateItem("xinghui", 1);
if (box != null) player.getInventory().addItem(box);
}
事件
CrateOpenEvent
玩家开始一次抽奖、扣除花费之前触发,可以取消。
| 方法 | 说明 |
|---|---|
getPlayer() | 抽奖的玩家 |
crate() | 奖池 ID |
count() | 抽奖时是 1 或 10;自选奖池是这次选了几个奖品 |
via() | 从哪里开启:MENU(结果界面等)、BLOCK(抽奖方块打开的预览)、ITEM(宝箱物品打开的预览)、COMMAND(/sc open、/sc draw、API)、FREE(免费代抽) |
setCancelled(true) | 取消这次抽奖:不扣费、不抽奖,也不会给玩家任何提示(请自己发消息说明原因) |
触发时机:
- 抽奖:奖池的开启权限、是否允许十连、有没有奖品都已经检查过;每日上限、剩余可抽数量与花费还没检查。
- 自选奖池:玩家按「确认选择」、通过开启权限检查之后触发(每日上限与花费还没检查),
via()是打开选择界面的方式。
@EventHandler
public void onOpen(CrateOpenEvent e) {
// 战斗中不能开箱
if (combat.isTagged(e.getPlayer()) && !e.via().equals("FREE")) {
e.setCancelled(true);
e.getPlayer().sendMessage("§c战斗中不能抽奖");
}
}
PrizeWinEvent
每抽到一个奖品触发一次(十连触发 10 次,自选奖池每个选中的奖品各一次)。在结果抽出之后(同时开始写入数据库)、动画播放之前触发,只用来通知,不能取消。
| 方法 | 说明 |
|---|---|
getPlayer() | 抽奖的玩家 |
crate() | 奖池 ID |
prize() | 奖品编号(例如 p7) |
item() | 奖品物品(复制品,修改它不会影响奖励) |
rarity() | 稀有度 ID |
grand() | 是否终极大奖 |
因为在动画之前触发,请不要用它向全服宣布结果(会比动画先剧透);需要公告时使用星月造物内置的 全服公告。
@EventHandler
public void onWin(PrizeWinEvent e) {
if (e.grand()) {
// 记录终极大奖到自己的统计
stats.addGrand(e.getPlayer().getUniqueId(), e.crate(), e.prize());
}
}
两个事件都在玩家所在的线程触发(Folia 上是玩家所在区域的线程)。