Реализация чекпоинтов, как в однопользовательских сюжетных играх

Версия Minecraft
1.16.5
API
Forge
Делаю квест для майнкрафта, возник вопрос. Можно ли сделать чекпоинты состояния мира? Нужно, чтобы чекпоинты работали как сохранение и загрузка в однопользовательских сюжетных играх. Запоминается расположение игроков, состояние и наполнение их инвентаря, расположение мобов. И в случае смерти какого-то игрока происходит откат к этому чекпоинту. Объясню на простом примере: в мир играют два игрока, спавняться они в домике с кнопкой. По нажатию на кнопку делается первый чекпоинт. Они выходят на улицу и подходят к зданию с пятью зомби. У каждого игрока в инвентаре 5 яблок, железный меч, лук и 10 стрел. Возле входа в здание кнопка, по нажатию на которую делается новый чекпоинт. Игроки заходят в здание. Одного ранят, он съедает 2 яблока, чтобы насытиться. Они убивают двух зомби, потратив при этом по 3 и 4 стрелы соответственно. Еще одного убивают мечом. но два оставшихся зомби убивают одного из игроков. И вот в этот момент, сразу после смерти хотя бы одного игрока нужно произвести отгрузку к последнему чекпоинту (который был перед входом в здание). Оба игрока снова окажутся на входе в здание, у каждого в инвентаре снова будет 5яблок, железный меч, лук и 10 стрел, а в самом здании снова будет 5 зомби, а не два. Как это реализовать? Желательно какой-то максимально простой способ. Версия forge - 1.16.5
 
Интересно, но сложно.

Мне кажется, самый просто способ такой:
Создание чекпоинта - замораживаем игру, сохраняем мир, копируем мир в новую папку, размораживаем игру.
Загрузка чекпоинта - завершаем сервер, удаляем карту, вставляем скопированный мир, запускаем сервер. В конце загрузки игроки должны заново подключится автоматически.
 
копируем мир в новую папку
Плохомаштабируемый способ при большом размере мира

Желательно какой-то максимально простой способ
Самый "простой" способ в моем понимании - отключить сериализацию чанков на диск и запоминать запоминать их. При создании нового чекпоинта сериализовать очередь чанков, ожидающих сохранения, и затем вновь запоминать измененные чанки. При откате к чекпоинту форсированно грузить чанки с диска в память, как это делается сервером игры по дефолту. Тоже самое и с данными игроков. После отката шлем пакеты синхронизации на клиент, на всякий случай.

И хотя это самый "простой" способ, тут есть ряд проблем:
1) Возможен только один чекпоинт
2) При краше/остановке сервера будет сохранен только прогресс на чекпоинте. Юзерам может очень непонравится откат к чекпоинту из-за внутренних проблем сервера, а не из-за действия игроков
3) Измененные чанки нужно где-то хранить, чтобы избежать их сброс при естественной выгрузке (игрок зашел на чанк, ушел, а потом прогрузил его опять и все это в пределах одного чекпоинта). Либо держать их в оперативной памяти, либо реализовывать дополнительное хранилище чтобы не пересекалось с уже сохраненным чанками. Это означает что либо растут требование к количеству оперативной памяти, либо решение перестает быть простым и требует реализации механизма стороннего хранилища чанков.
4) Может поломаться работоспособность модов, которые тащат чанклоадеры

Фича нефига не простая.
 
Это означает что либо растут требование к количеству оперативной памяти, либо решение перестает быть простым и требует реализации механизма стороннего хранилища чанков.
Нет. Оба варианта не простые из-за того, что всё равно надо реализовывать хранилище и без разницы на диске или в оперативной памяти.

UPD:
Можно, конечно, запретить отгрузку чанков, но так память быстро закончится.
 
всё равно надо реализовывать хранилище и без разницы на диске или в оперативной памяти
Неверно. Не нужно изобретать in-memory хранилище чанков т.к. сервер лишь продолжает в своей дефолтной манере держать их в памяти.
Можно, конечно, запретить отгрузку чанков, но так память быстро закончится.
Я об этом и говорю
 
По примеру одиночных игр с открытым миром можно сделать так:
  1. Мир сделать неизменяемым, убрав функцию сохранения чанков совсем, что позволит откатить любые изменения сделанные игроков. Мир должен быть как базовый шаблон.
  2. Создавать специальные объекты динамически должен скрипт. Он может выполняться в момент прогрузки нужного чанка и исходя из выполненных игроком квестов.
  3. Сохраняться может только инвентарь игрока и информация о выполненных квестах. Всё это и так хранится в профиле игрока.
В вашем случае загвоздка в желании сделать кооператив. Здесь придётся кто из игроков будет хостом, определяя состояние мира. Потому глубокий сюжет игры невозможно адаптироваться для мультиплеера – отсутствие главного игрока вокруг которого крутиться весь мир.
 
Назад
Сверху