
AdvancedReplay
Плагин AdvancedReplay для Minecraft Spigot записывает действия игроков на сервере и позволяет просматривать повторы в любое время. Поддерживает запись движений, инвентаря, чата, блоков. Требуется ProtocolLib.
AdvancedReplay - это плагин для серверов Minecraft на Spigot (версии 1.8-1.21), который записывает действия игроков и даёт возможность воспроизводить их позже. Если вы администрируете сервер, повторы помогут разобрать нарушения, проверить подозрительное поведение или просто сохранить яркие моменты. Плагин пишет почти всё: передвижения, анимации рук, инвентарь, брошенные предметы, снаряды, изменения блоков и сообщения в чат. Данные можно хранить в файлах или базе данных.
Важно: плагин не работает без ProtocolLib. Установите его заранее.
Функции
- Управление повтором: пауза, смена скорости, телепортация к игроку.
- Гибкое сохранение: через API можно подключить свой способ хранения.
- Качество записи: настраивается от высокого до низкого - чем выше качество, тем больше размер файла.
- Запись при старте и автосохранение: можно включить автоматическую запись при запуске сервера и сохранение при остановке.
- Поддержка MySQL и S3: для централизованного хранения повторов.
- Офлайн-скины: если сервер в офлайн-режиме, плагин может подгружать скины с Mojang.
- Автоочистка: удаление старых повторов через заданное количество дней.
- Скрытие посторонних игроков: во время просмотра повтора можно спрятать всех, кто не участвует.
- Уведомления: настраиваемые сообщения о смерти, входе и выходе игроков.
Что именно записывается
- движения игроков
- действия (еда, анимация рук и т.п.)
- изменения инвентаря
- обновления метаданных
- снаряды (стрелы, файерболы и др.)
- выброшенные предметы
- изменения блоков, сделанные игроками
- сообщения в чат
Команды и права
/replay - список всех команд
/replay start [Имя]:[Длительность] <игроки> - начать запись
/replay stop <Имя> [-nosave|-force] - остановить и сохранить
/replay play <Имя> - воспроизвести повтор
/replay jump <Время> - перейти к определённому моменту
/replay leave - выйти из просмотра
/replay info <Имя> - информация о повторе
/replay delete <Имя> - удалить повтор
/replay list [Страница] - список всех повторов
/replay reload - перезагрузить конфиг
Права: replay.command.<команда> (например, replay.command.start)
Конфигурация
В config.yml настраиваются основные параметры: максимальная длина повтора (по умолчанию 3600 секунд), качество записей, автоочистка и другое. Если нужна база данных, дополнительно настраивается mysql.yml, а для S3-хранилища - s3.yml.
Пример config.yml
# General plugin settings
general:
# Maximum length of a replay in seconds
max_length: 3600
# Create a new recording on startup
# save_on_stop and add_new_players should be enabled
record_on_startup: false
# Should the Replay be saved on shutdown/when the maximum length is exceeded?
save_on_stop: false
# Should the plugin save the Replays to a mysql database?
# If enabled you need to configure the mysql.yml
use_mysql: false
# Save the Replays to an S3 compatible Storage
# If enabled you need to configure s3.yml
use_s3: false
# If enabled in offline mode, the plugin will fetch the skin data from Mojang
# Can slow down the server when recording a lot of players
use_offline_skins: true
# Change how detailed movement is recorded. Better quality results in larger replays
# Options: high, medium, low
quality: high
# Automatically delete replays after a specific amount of time (days)
# Use -1 to disable
cleanup_replays: -1
# Hide all players that are not participating in a replay
hide_players: false
# Should players when they join after a recording started be added to all running recordings
add_new_players: false
# Should AdvancedReplay check for new updates?
update_notifications: true
# This message is displayed when a player dies
death_message: '&6{name} &7died.'
# This message is displayed when a player leaves the game
quit_message: '&6{name} &7left the game.'
# This message is displayed when a player joins the game
join_message: '&6{name} &7joined the game.'
# Configuration of the replaying settings
replaying:
world:
# Reset block changes after watching a replay?
reset_changes: false
# How should the replay progress be displayed
# Options: action_bar, xp_bar, none
progress_display: action_bar
# Configuration of the recording data
recording:
blocks:
# Enable recording of block changes?
enabled: true
# Use real block changes when replaying?
real_changes: true
entities:
# Enable recording of all living entities?
enabled: true
items:
# Enable recording of items?
enabled: true
chat:
# Enable recording of chat messages?
enabled: true
# Format of recorded chat messages
format: '&r<{name}> {message}'
API (для разработчиков)
Плагин предоставляет API для расширения функциональности. Ниже примеры.
Регистрация собственного хранилища повторов
Пример кода
ReplayAPI.getInstance().registerReplaySaver(new IReplaySaver() {
@Override
public void saveReplay(Replay replay) {
ReplayData data = replay.getData();
// Здесь вызывается метод сохранения нового повтора
}
@Override
public boolean replayExists(String replayName) {
// Вернуть true, если повтор с таким именем существует
return false;
}
@Override
public void loadReplay(String replayName, Consumer<Replay> consumer) {
// Загрузка данных ReplayData и передача повтора в consumer
consumer.accept(new Replay(replayName, new ReplayData()));
}
@Override
public void deleteReplay(String replayName) {
// Удаление существующего повтора
}
@Override
public List<String> getReplays() {
// Вернуть список всех доступных повторов
return null;
}
});
Создание собственного ReplayHook
Пример кода
ReplayAPI.getInstance().registerHook(new IReplayHook() {
@Override
public PacketData onRecord(String playerName) {
/*
* Вызывается каждый тик для каждого записываемого игрока.
* Верните PacketData с данными, которые хотите добавить.
*/
return null;
}
@Override
public void onPlay(ActionData data, Replayer replayer) {
String name = data.getName();
PacketData packetData = data.getPacketData();
// Вызывается, когда нужно воспроизвести ранее записанное действие
}
});
События повторов
Пример
public void onReplayFinished(ReplaySessionFinishEvent e) {
Player player = e.getPlayer();
Replay replay = e.getReplay();
// Код при завершении повтора
}
Скачайте AdvancedReplay, чтобы записывать всё, что происходит на вашем сервере Minecraft, и разбирать важные моменты с максимальной детализацией.
