Extractioncraft 开发者 API
Extractioncraft 在 com.magmaguy.extractioncraft.api 下暴露了一个查询类和若干 Bukkit 事件,其他插件可以借此追踪对局并作出响应。所有事件都是标准的同步 Bukkit 事件。
查询
| 方法 | 返回值 |
|---|---|
ExtractionCraftAPI.getMatch(Player player) | 该玩家(以玩家或观战者身份)所在的 ExtractionMatch,不在对局中时为 null |
ExtractionCraftAPI.getMatches() | 所有已创建且尚未销毁的对局的副本 |
ExtractionMatch 继承自 Extractioncraft jar 中内置的 MagmaCore 副本的对局类,该类已被重定位到 com.magmaguy.extractioncraft.magmacore.match.Match。它的公共方法包括 getPhase()、getMatchPlayers()、getActivePlayers()、admit(players)、admitSpectator(player)、leave(player, reason)、start() 和 end(outcome)。Extractioncraft 没有加入或观战命令,因此其他插件要把更多玩家或观战者带进对局,就要使用 admit 和 admitSpectator。只有在对局等待期间才能接纳玩家,人数上限为其 maxPlayers;接纳观战者则需要内容包设置 spectatable: true。
事件
| 事件 | 可取消 | 暴露数据 | 触发时机 |
|---|---|---|---|
ExtractionMatchJoinEvent | 是 | ExtractionMatch match、Player player | 在玩家或观战者被接纳之前,每名玩家触发一次 |
ExtractionMatchStartEvent | 是 | ExtractionMatch match | 当 /exc start 通过最低玩家数检查时,在倒计时之前 |
ExtractionMatchLeaveEvent | 否 | ExtractionMatch match、Player player、ExtractionLeaveReason reason | 参与者正在离开时 |
ExtractionMatchEndEvent | 否 | ExtractionMatch match、ExtractionMatchOutcome outcome | 对局结束时 |
取消 ExtractionMatchJoinEvent 会把该玩家以及与其一同被接纳的所有玩家挡在外面。如果它拒绝的是刚生成的对局的创建者,该对局及其世界会被销毁,创建者会收到 The generated match could not be started.。
取消 ExtractionMatchStartEvent 会让对局保持等待状态。玩家可以再次运行 /exc start。
ExtractionMatchLeaveEvent 在 Extractioncraft 根据离开原因灵魂绑定或清空玩家物品栏之后触发,此时玩家仍是参与者,也仍在对局世界中。之后才会被传送出去。
ExtractionMatchEndEvent 在仍留在其中的玩家被移出之前触发。随后这些玩家以 MATCH_ENDED 离开。服务器关闭或插件重载会直接销毁对局而不结束它们,因此不会触发结束事件;玩家改为以 SHUTDOWN 离开。
离开原因
ExtractionLeaveReason | 含义 | 对局开始后的物品去向 |
|---|---|---|
QUIT | 主动离开,例如使用 /exc quit | 使用默认配置时丢失 |
DISCONNECT | 与服务器断开连接 | 使用默认配置时丢失 |
DIED | 受到致命伤害 | 使用默认配置时丢失 |
EXTRACTED | 在撤离点成功撤离 | 保留并灵魂绑定 |
MATCH_ENDED | 对局结束时仍在其中,包括计时结束的情况 | 使用默认配置时丢失 |
SHUTDOWN | 对局期间服务器或插件关闭 | 保留并灵魂绑定 |
在对局开始前离开永远不会改动物品栏。参见死亡与物品损失。
对局结果
ExtractionMatchOutcome | Extractioncraft 何时使用 |
|---|---|
DEFEAT | 15 分钟计时结束,或最后一名活跃玩家离开对局(包括通过撤离离开) |
NEUTRAL | 倒计时期间玩家人数降到 minPlayers 以下 |
VICTORY | Extractioncraft 自身从不设置;只有调用 end(...) 的插件才能产生此结果 |
使用示例
import com.magmaguy.extractioncraft.api.ExtractionLeaveReason;
import com.magmaguy.extractioncraft.api.ExtractionMatchLeaveEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class MyExtractionListener implements Listener {
@EventHandler
public void onLeave(ExtractionMatchLeaveEvent event) {
if (event.getReason() == ExtractionLeaveReason.EXTRACTED) {
// Reward the player for a successful extraction
}
}
}