跳到主要内容

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对局期间服务器或插件关闭保留并灵魂绑定

在对局开始前离开永远不会改动物品栏。参见死亡与物品损失。

对局结果​

ExtractionMatchOutcomeExtractioncraft 何时使用
DEFEAT15 分钟计时结束,或最后一名活跃玩家离开对局(包括通过撤离离开)
NEUTRAL倒计时期间玩家人数降到 minPlayers 以下
VICTORYExtractioncraft 自身从不设置;只有调用 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
}
}
}