API для разработчиков Extractioncraft
Extractioncraft предоставляет класс запросов и события Bukkit в пакете com.magmaguy.extractioncraft.api, чтобы другие плагины могли отслеживать матчи и реагировать на них. Все события являются стандартными синхронными событиями Bukkit.
Запросы
| Метод | Возвращает |
|---|---|
ExtractionCraftAPI.getMatch(Player player) | ExtractionMatch, в котором находится игрок (как участник или наблюдатель), либо null |
ExtractionCraftAPI.getMatches() | Копию всех матчей, которые были созданы и ещё не уничтожены |
ExtractionMatch наследует класс матча из копии MagmaCore, встроенной в jar-файл Extractioncraft и перенесённой в 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
}
}
}