Перейти к содержимому

ServerReplay

Полностью серверный fabric-мод, позволяющий записывать реплеи для replay mod или flashback.

Fabric
Загрузчики
Fabric
Скачиваний на Modrinth
191 тыс.
Подписчиков на Modrinth
243
версий
110
Обновлён
11 октября 202611 окт.
Опубликован
в 2024

Коротко о моде

Работает на Fabric
Для Minecraft 1.18.2, 1.19.4–26.3 …
Ставится только на сервер; игрокам ставить не нужно
Последняя версия — 3.6.0-beta.5+26.3 от 11 октября 2026
Нужен Fabric API и Fabric Language Kotlin
Лицензия MIT — бесплатно
Где нужен
В игрене нуженНа сервереобязателен

Ставится только на сервер; игрокам ставить не нужно

Версии игры1.17.1, 1.18.2, 1.19.4–26.3
Описание переведено автоматическиПоказать оригинал (EN)

Server Replay

English | 中文

Полностью серверная реализация Replay Mod и Flashback, этот мод позволяет записывать сразу нескольких игроков, находящихся онлайн, или области чанков на сервере. Это создаёт файлы реплеев, которые затем можно использовать с replay mod или flashback для рендеринга.

Modrinth download

Почему серверная сторона?

По сравнению с клиентскими Replay Mod или Flashback, запись на серверной стороне имеет много преимуществ:

  • Возможность записывать статичные чанки.

    • Можно указать точный размер чанка (не ограничен дальностью прорисовки сервера).
    • Записанные чанки могут быть выгружены без влияния на реплей.
    • Никакого мерцания чанков (от выгрузки и загрузки чанков).
    • Чанки также не будут загружаться рекордером (как, например, PCRC).
    • Приостанавливайте и возобновляйте запись в зависимости от того, загружаются ли чанки или есть ли игроки в чанках
  • Возможность записывать отдельных игроков.

    • Игрокам не требуется устанавливать replay mod или flashback.
    • Можно записывать все POV одновременно.
    • Записи можно автоматизировать с помощью конфигурации.
  • Записи могут быть запущены в любое время операторами (или любым, у кого есть права).

Однако есть и некоторые недостатки и известные проблемы:

  • Некоторые функции не записываются в записях чанков, например, пользовательские boss bars.
  • Записи игроков могут быть не на 100% совместимы с клиентским Replay Mod или Flashback.
  • ServerReplay не особо рассчитан на серверы с большим количеством модов. Более сложные моды, реализующие собственные пакеты, могут быть несовместимы.

    • Если вы столкнётесь с проблемами совместимости, пожалуйста, создайте issue.

Использование

Этот мод требует fabric launcher, fabric-api и fabric-kotlin.

Есть два способа записи на сервере: вы можете настроить его на слежение и запись игроков от их лица. Либо вы можете записывать статичную область чанков.

Быстрый старт

Примечание: Эта документация предназначена для последней версии мода, для более старых версий мода смотрите другие ветки

Этот раздел документации кратко проведёт вас через базовую настройку. А также содержит некоторую важную информацию.

Игроки

Чтобы записать игрока на вашем сервере, выполните /replay start players <player(s)>, например:

/replay start players senseiwells
/replay start players @a
/replay start players @a[gamemode=survival]

Записи игроков привязаны к игроку и будут записываться с дальностью прорисовки сервера.

Если игрок выйдет или сервер остановится, запись автоматически остановится и сохранится.

Либо, если вы хотите остановить запись вручную, выполните /replay stop players <player(s)> <save?>, с помощью этой команды вы также можете остановить запись без сохранения, например:

/replay stop players senseiwells
/replay stop players @r
/replay stop players senseiwells false

Затем запись будет сохранена в указанное вами место "player_recording_path" в папке с uuid игрока. По умолчанию это будет `./recordings/players//.mcpr`.

Этот файл затем можно поместить в ./replay_recordings на вашем клиенте и открыть с помощью replay mod.

Предупреждение: Попытка записать carpet ботов или других ненастоящих игроков может привести к неожиданному поведению. Если вы хотите записать большую область чанков, пожалуйста, используйте запись чанков вместо этого!

Чанки

Примечание: Хотя мод запишет указанные вами чанки, клиент Minecraft не будет отрисовывать самые внешние чанки. Поэтому, чтобы записать область видимых чанков, вы должны добавить один чанк к вашей границе, например, для записи видимой области от -5, -5 до 5, 5 вы должны записывать между -6, -6 и 6, 6.

Чтобы записать область чанков на вашем сервере, выполните `/replay start chunks from to in <dimension?> named <name?>`, например:

/replay start chunks from -5 -5 to 5 5 in minecraft:overworld named MyChunkRecording
/replay start chunks from 54 67 to 109 124
/replay start chunks from 30 30 to 60 60 in minecraft:the_nether 

Либо вы можете указать чанк и радиус вокруг него для записи `/replay start chunks around radius in <dimension?> named <name?>`, например:

/replay start chunks around 0 0 radius 5
/replay start chunks around 67 12 radius 16 in minecraft:overworld named Perimeter Recorder

Записи чанков статичны и не могут перемещаться, они записывают указанные чанки. Важно отметить, что при запуске записи указанные чанки будут загружены (и сгенерированы при необходимости). Однако после этого запись чанков не загружает чанки.

Вы можете дополнительно настроить это с помощью параметра "chunk_recorder_load_radius", который задаст максимальный начальный радиус, который будет загружать запись чанков; любые чанки за пределами этого радиуса, которые записываются, должны быть загружены «естественно», чтобы быть записанными.

Если сервер остановится, запись автоматически остановится и сохранится.

Также, если вы хотите остановить запись вручную, вы можете остановить определённый рекордер, используя его имя, командой `/replay stop chunks named <save?>`, например:

/replay stop chunks named "Perimeter Recorder" false
/replay stop chunks named MyChunkRecording

Затем запись будет сохранена в вашу папку "chunk_recording_path", указанную в конфиге, в папке с именем рекордера чанков. По умолчанию это будет `./recordings/chunks//.mcpr`.

Этот файл затем можно поместить в ./replay_recordings на вашем клиенте и открыть с помощью replay mod.

Кодирование

ServerReplay поддерживает flashback (для более новых версий), а также записи replay mod.

По умолчанию все записи будут записываться в формате replay mod; однако вы можете изменить это, выполнив следующие команды в игре:

/replay encoding default set flashback
/replay encoding default set replay_mod

Примечание: Вы можете записывать перспективу игрока, используя flashback и replay-mod одновременно. Для этого установите кодирование по умолчанию на flashback, начните запись, затем установите кодирование на replay_mod и начните ещё одну запись.

То же самое можно сделать для записей чанков, но каждому рекордеру нужно дать уникальное имя.

Просмотр

После завершения записи вы можете полностью просмотреть запись на стороне сервера. Игрок, просматривающий запись, будет полностью удалён с реального сервера, пока смотрит запись, и будет считаться офлайн.

По сути, это просто "запускает" другой сервер, который отправляет клиенту пакеты. Это работает асинхронно от основного сервера, так что влияние на производительность минимально или отсутствует.

Когда запись завершится, вы можете кликнуть по зелёному тексту в чате, чтобы просмотреть только что завершённую запись. Команда для просмотра записей чанков: `/replay view chunks , а для игроков: /replay view players `, например:

/replay view player "d4fca8c4-e083-4300-9a73-bf438847861c" "2024-05-11--19-19-55"
/replay view chunks "Chunks (183, 166) to (203, 186)" "2024-05-11--19-19-55"

Затем вы будете телепортированы на новый "сервер", где начнётся воспроизведение записи. При просмотре записей вам будет доступен только ограниченный набор команд, включая:

  • /replay view pause Приостанавливает воспроизведение текущей записи.
  • /replay view unpause Возобновляет воспроизведение текущей записи.
  • `/replay view speed ` Устанавливает скорость воспроизведения текущей записи.
  • /replay view restart Перезапускает воспроизведение текущей записи.
  • /replay view close Закрывает текущую запись и возвращает вас на сервер.
  • /replay view progress <hide|show> Скрывает или показывает боссбар прогресса.

Если вы отключитесь во время просмотра записи, при входе вы вернётесь на сервер.

Скачивание

Вы можете скачать любую запись с сервера, если в конфиге включён параметр "allow_downloading_replays" и server-ip и порт для скачивания настроены правильно.

Вы можете использовать команду /replay download, чтобы получить URL для скачивания указанной записи, например:

/replay download players d4fca8c4-e083-4300-9a73-bf438847861c "2024-05-11--19-19-55"
/replay download chunks "Chunks (183, 166) to (203, 186)" "2024-05-11--19-19-55"

Вам придёт сообщение в чат; вы можете кликнуть по предоставленной ссылке, и файл скачается.

Команды

Примечание для всех команд: игроки должны либо иметь op (уровень 4), либо, если у вас есть мод на права (например, LuckPerms), игроки могут иметь право server-replay.commands.replay для доступа к этим командам.

  • /replay start players <player(s)> Вручную начинает запись реплея для указанных игроков.
  • `/replay start chunks from to in <dimension?> named <name?>` Вручную начинает запись реплея для указанной области чанков; если измерение не указано, будет использовано измерение отправителя команды, а имя определяет, куда будет сохранён файл реплея в папке записей.
  • `/replay start chunks around radius in <dimension?> named <name?>` Делает то же, что и команда выше; однако вместо области можно указать радиус вокруг заданного чанка.
  • /replay stop players <player(s)> <save?> Вручную останавливает запись реплея для указанных игроков, при желании можно указать, нужно ли сохранять реплей; по умолчанию — да.
  • `/replay stop chunks from to in <dimension?> <save?>` Вручную останавливает запись реплея для указанной области чанков; если измерение не указано, будет использовано измерение отправителя команды, при желании можно указать, нужно ли сохранять реплей; по умолчанию — да.
  • `/replay stop chunks named <save?>` Позволяет сделать то же, что и команда выше; однако область чанков можно указать по её имени.
  • /replay stop [chunks|players] all <save?> Вручную останавливает все записи чанков или игроков; при желании можно указать, нужно ли сохранять реплей; по умолчанию — да.
  • /replay status Отправляет сообщение о том, включена ли запись реплеев, а также список всех игроков и чанков, которые сейчас записываются, как долго идёт запись и размеры их файлов.
  • /replay reload Перезагружает файл конфигурации для replay mod.
  • `/replay encoding default set Задаёт тип записываемого реплея:flashbackилиreplay_mod`

Настройка

После запуска сервера по пути ./config/server-replay/config.json будет создан новый файл, по умолчанию он должен выглядеть так:

{
  "default_encoding": "replay_mod",
  "world_name": "World",
  "server_name": "Server",
  "chunk_recording_path": "./recordings/chunks",
  "player_recording_path": "./recordings/players",
  "player_recording_name": "{uuid}",
  "max_file_size": "0 B",
  "restart_after_max_file_size": false,
  "max_duration": "0s",
  "restart_after_max_duration": false,
  "recover_unsaved_replays": true,
  "delete_replays_after_duration": "0s",
  "log_deleted_replays": true,
  "chunk_recorder_load_radius": -1,
  "chunk_recording_strategy": "always",
  "pause_notify_players": true,
  "notify_admins_of_status": true,
  "include_resource_packs": true,
  "ignore_custom_payloads": false,
  "ignore_sound_packets": false,
  "ignore_light_packets": true,
  "ignore_chat_packets": false,
  "ignore_action_bar_packets": false,
  "ignore_scoreboard_packets": false,
  "optimize_explosion_packets": true,
  "optimize_entity_packets": false,
  "record_hotbar": false,
  "record_voice_chat": false,
  "replay_server_ip": null,
  "allow_downloading_replays": false,
  "automatically_record": false,
  "player_predicate": {
    "type": "none"
  },
  "chunks": []
}
ConfigDescription
"default_encoding"

Кодировка, в которой будут записываться реплеи: "replay_mod" или "flashback". По умолчанию (если не указано) — "replay_mod".

"world_name"

Название мира, которое будет отображаться в файле реплея.

| "server_name" |

Имя сервера, которое будет отображаться в файле реплея.

| | "player_recording_path" |

Путь, по которому вы хотите сохранять записи игроков.

| | "chunk_recording_path" |

Путь, по которому вы хотите сохранять записи чанков.

| | "player_recording_name" |

Определяет имя директории записи каждого конкретного игрока. По умолчанию установлено "{uuid}", что использует uuid игрока. Вы также можете вставить имя игрока с помощью "{username}". Например, можно сделать так: "Recordings for: {username} ({uuid})".

| | "max_file_size" |

Задаёт max_file_size для реплея: если лимит достигнут, запись автоматически остановится. Этот размер файла относится к размеру сырой записи, а *не* к итоговому размеру сжатого реплея — обычно итоговый сжатый реплей будет намного меньше.

| | "restart_after_max_file_size" |

Если задан max_file_size и этот лимит достигнут, запись реплея автоматически перезапустится, создав новый файл реплея.

| | "max_duration" |

Задаёт максимальную длительность реплея: как только реплей записывается указанное количество времени, он остановится. Это любое число, за которым следуют единицы измерения (можно также указать несколько единиц), например "4h 35m 2.1s". Установите "0s", чтобы не было ограничения по максимальной длительности. Примечание: если запись приостановлена, её длительность не увеличивается.

| | "restart_after_max_duration" |

Если задан max_duration и этот лимит достигнут, запись реплея автоматически перезапустится, создав новый файл реплея.

| | "recover_unsaved_replays" |

Пытается восстановить любые несохранённые реплеи, например, если ваш сервер упал или остановился до того, как реплей был остановлен или завершил сохранение. Это не гарантирует, что реплей не будет повреждён, но попытается спасти то, что доступно.

| | "delete_replays_after_duration" |

Длительность, по истечении которой удаляются старые файлы реплеев. Это длительность с момента последнего изменения файла. Формат длительности такой же, как у параметра max_duration, например "5d 10h". Установите "0s", чтобы отключить.

|
| "log_deleted_replays" |

Выводить ли запись в лог сервера, когда реплей удаляется из-за устаревания. Для этого должна быть включена настройка delete_replays_after_duration.

| | "fixed_daylight_cycle" |

Это фиксирует цикл дня и ночи в реплее, если вы не хотите постоянной смены дня и ночи в длинных таймлапсах. Здесь следует указать время суток в тиках, например 6000 (полдень). Чтобы отключить фиксированный цикл дня и ночи, установите значение -1.

| | "chunk_recorder_load_radius" |

Это задаёт стандартный радиус загрузки для записи чанков; полезно, когда вы хотите записать очень большую область и не хотите, чтобы все записываемые чанки загружались сразу.

Например, если вы записываете область 13x13 чанков, можно установить радиус 3, тогда изначально загрузятся центральные 7x7, а остальные чанки будут записаны, когда они будут загружены «естественным» образом.

Установите -1, чтобы загружать все чанки.

| | "chunk_recording_strategy" |

Это определяет, как будет записывать recorder чанков; есть 4 варианта:

  • "always" — всегда записывает чанки, даже когда они выгружены (как будто они загружены)
  • "chunk_loaded" — записывает только когда любой из чанков в области загружен; если все чанки выгружены, запись приостанавливается
  • "chunk_contains_player" — записывает чанки только когда игрок находится в области (только flashback)
  • "chunk_contains_non_spectator_player" — то же, что выше, но только для игроков не в режиме наблюдателя (только flashback)
| | "pause_notify_players" |

Если chunk_recording_strategy установлена в вариант, позволяющий recorder'у автоматически приостанавливаться, и это включено, то всякий раз, когда запись области чанков приостанавливается или возобновляется, все игроки онлайн будут уведомлены.

| | "notify_admins_of_status" |

Если включено, это будет уведомлять админов о начале реплея, об окончании реплея и о завершении сохранения реплея, а также о любых возникающих ошибках.

| | "include_resource_packs" |

Если включено, все серверные ресурспаки будут скопированы в файл реплея для обеспечения корректного воспроизведения. Отключение уменьшит размер файла, но вместо этого при просмотре реплея будет пытаться скачать пак из исходного источника; нет гарантии, что это сработает правильно. (только для replay mod)

| | "ignore_custom_payloads" |

Если включено, все custom payloads (пакеты модов) будут игнорироваться; это можно включить, если пакеты другого мода вызывают проблемы с записью

| | "ignore_sound_packets" |

Если вы записываете большую область для таймлапса, вряд ли вы захотите записывать звуки — они могут занимать значительное место на диске.

| | "ignore_light_packets" |

Свет рассчитывается как на клиенте, так и на сервере, поэтому пакеты света по большей части избыточны.

|
| "ignore_chat_packets" |

Прекращает запись пакетов чата (как от сервера, так и от других игроков), если они не нужны для вашего реплея.

| | "ignore_action_bar_packets" |

Прекращает запись пакетов action bar, если они не нужны для вашего реплея.

| | "ignore_scoreboard_packets" |

Прекращает запись пакетов таблицы очков (например, если у вас есть таблица очков, отображающая копание, то она не появится, а очки игроков также не будут записаны).

| | "optimize_explosion_packets" |

Это значительно уменьшает размер файла за счёт того, что клиенту не отправляются пакеты взрывов, а вместо этого отправляются только частицы и звуки взрывов.

| | "optimize_entity_packets" |

Это уменьшает размер файла, позволяя клиенту обрабатывать логику некоторых сущностей, например, снарядов и tnt. Это может вызвать некоторые несоответствия, однако, скорее всего, они будут незначительными.

| | "record_hotbar" |

Это включает запись хотбара для записей игроков для лучшего вида от первого лица. (только flashback)

| | "record_voice_chat" |

Это включает поддержку записи голосового чата, если у вас установлен мод simple-voice-chat, это будет работать из коробки при просмотре в flashback, но при просмотре реплея в replay-mod у вас должен быть установлен replay-voice-chat.

| | "replay_server_ip" |

Это требуется, если ваш сервер использует пользовательские серверные ресурспаки и вы хотите иметь возможность просматривать эти паки в серверном просмотрщике реплеев. Это также требуется, если вы хотите разрешить пользователям скачивать реплеи.

Здесь должен быть указан публичный IP-адрес вашего сервера.

| | "allow_downloading_replays" |

Определяет, смогут ли пользователи скачивать записанные реплеи.

| | "automatically_record" |

Автоматически записывать игроков или чанки на основе конфигурации "player_predicate" и/или "chunks". Если включено, все игроки, соответствующие заданному предикату, будут записываться автоматически, а все указанные чанки будут записываться при запуске сервера.

|
| "player_predicate" |

Предикат для автоматической записи игроков, подробнее в разделе Predicates.

| | "chunks" |

Список чанков для автоматической записи при запуске сервера, подробнее в разделе Chunks.

|

Конфигурация чанков

Вы можете задать области чанков, которые будут записываться автоматически при запуске сервера или когда вы включаете ServerReplay.

Каждое определение чанка должно включать: "name", "dimension", "from_x", "to_x", "from_z" и "to_z". Например:

{
  // ...
  "chunks": [
    {
      "name": "My Chunks",
      "dimension": "minecraft:overworld",
      "from_x": -5,
      "from_z": -5,
      "to_x": 5,
      "to_z": 5
    },
    {
      "name": "My Nether Chunks",
      "dimension": "minecraft:the_nether",
      "from_x": 100,
      "from_z": 50,
      "to_x": 90,
      "to_z": 60
    }
    // ...
  ]
}

Конфигурация предикатов

Вы можете задать предикат, который определяет, какие игроки на вашем сервере будут записываться автоматически. Это можно сделать, указав, есть ли у игроков определённый uuid, имя, состоят ли они в определённой команде или являются ли они оператором.

После определения предиката вы должны выполнить /replay reload в игре, затем игроки должны перезайти, если они хотят записываться (и соответствуют критериям предиката).

Самый простой вариант — просто записывать всех игроков, для этого можно использовать:

{
  // ...
  "player_predicate": {
    "type": "all"
  }
}

Если вы хотите записывать только игроков с определёнными именами или uuid, можно сделать следующее:

{
  // ...
  "player_predicate": {
    "type": "has_name",
    "names": [
      "senseiwells",
      "foobar"
    ]
  }
}
{
  // ...
  "player_predicate": {
    "type": "has_uuid",
    "uuids": [
      "41048400-886d-497d-9d97-9fe7c9b63afa",
      "71266dbd-db0a-484a-b859-3f135590d7a9",
      "47d072ca-d7a2-467c-9b60-de501907e91d",
      "0e324e7f-e78e-4777-b501-7ae08a65b1eb",
      "7d9e24c2-9d0f-479f-81c7-27389624ebb2"
    ]
  }
}

Если вы хотите записывать только операторов:

{
  // ...
  "player_predicate": {
    "type": "has_op",
    "level": 4
  }
}

Если вы хотите записывать только игроков в определённых командах, это полезно, чтобы позволить игрокам добавляться и удаляться прямо в игре, так как вы можете просто добавить игроков в команду, и затем они перезайдут:

{
  // ...
  "player_predicate": {
    "type": "in_team",
    "teams": [
      "Red",
      "Blue",
      "Spectators"
    ]
  }
}

Вы также можете инвертировать предикаты с помощью 'not' и комбинировать их с помощью 'or' и 'and'. Например, если вы хотите записывать всех не-операторов, у которых также нет имени 'senseiwells' или которые не в красной команде:

{
  // ...
  "player_predicate": {
    "type": "and",
    "predicates": [
      {
        "type": "not",
        "predicate": {
          "type": "has_op",
          "level": 4
        }
      },
      {
        "type": "not",
        "predicate": {
          "type": "or",
          "predicates": [
            {
              "type": "has_name",
              "names": [
                "senseiwells"
              ]
            },
            {
              "type": "in_team",
              "teams": [
                "Red"
              ]
            }
          ]
        }
      } 
    ]
  }
}

Если вы используете carpet mod и у вас есть возможность спавнить фейковых игроков, возможно, вы захотите исключить их из записи.
Сделать это можно с помощью предиката `is_fake`:
```json5
{
  // ...
  "player_predicate": {
    "type": "not",
    "predicate": {
      "type": "is_fake"
    }
  }
}

Благодарности

Спасибо ExperimentalIdea за помощь в тестировании поддержки flashback!

Частые вопросы

Как установить ServerReplay?

Установите Fabric под свою версию Minecraft, скачайте ServerReplay под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.

Для каких версий Minecraft есть ServerReplay?

У ServerReplay есть сборки для Minecraft 1.17.1, 1.18.2, 1.19.4–26.3.

Нужен ли ServerReplay на сервере?

Ставится только на сервер; игрокам ставить не нужно

Лицензия и источник
MIT Licenseможно свободно использовать и распространять с указанием автора
Оригинал — Modrinth↗Файлы — без изменений, проверены по SHA-512Это ваш мод? Правообладателям

Сайт использует cookie: необходимые — для входа и темы, а также счётчики посещений Яндекс Метрика и LiveInternet — по ним мы видим, как пользуются сайтом. Рекламных cookie у нас нет. Подробнее