#pragma once #include "Abstract.hpp" #include "Common/Abstract.hpp" #include "Common/Async.hpp" #include #include #include #include namespace LV::Server { /* Обменная единица мира */ struct SB_Region_In { // Список вокселей всех чанков std::unordered_map Voxels; // Привязка вокселей к ключу профиля std::vector> VoxelsMap; // Ноды всех чанков std::array, 4*4*4> Nodes; // Привязка нод к ключу профиля std::vector> NodeMap; // Сущности std::vector Entityes; // Привязка идентификатора к ключу профиля std::vector> EntityMap; }; struct DB_Region_Out { std::vector Voxels; std::array, 4*4*4> Nodes; std::vector Entityes; std::vector VoxelIdToKey, NodeIdToKey, EntityToKey; }; class IWorldSaveBackend { public: virtual ~IWorldSaveBackend(); struct TickSyncInfo_In { // Для загрузки и более не используемые (регионы автоматически подгружаются по списку загруженных) std::unordered_map> Load, Unload; // Регионы для сохранения std::unordered_map>> ToSave; }; struct TickSyncInfo_Out { std::unordered_map> NotExisten; std::unordered_map>> LoadedRegions; }; /* Обмен данными раз в такт Хотим списки на загрузку регионов Отдаём уже загруженные регионы и список отсутствующих в базе регионов */ virtual TickSyncInfo_Out tickSync(TickSyncInfo_In &&data) = 0; /* Устанавливает радиус вокруг прогруженного региона для предзагрузки регионов */ virtual void changePreloadDistance(uint8_t value) = 0; }; struct SB_Player { }; class IPlayerSaveBackend { public: virtual ~IPlayerSaveBackend(); // Существует ли игрок virtual bool isExist(PlayerId_t playerId) = 0; // Загрузить игрока virtual void load(PlayerId_t playerId, SB_Player *data) = 0; // Сохранить игрока virtual void save(PlayerId_t playerId, const SB_Player *data) = 0; // Удалить игрока virtual void remove(PlayerId_t playerId) = 0; }; struct SB_Auth { uint32_t Id; std::string PasswordHash; }; class IAuthSaveBackend { public: virtual ~IAuthSaveBackend(); // Существует ли игрок virtual coro isExist(std::string username) = 0; // Переименовать игрока virtual coro<> rename(std::string prevUsername, std::string newUsername) = 0; // Загрузить игрока (если есть, вернёт true) virtual coro load(std::string username, SB_Auth &data) = 0; // Сохранить игрока virtual coro<> save(std::string username, const SB_Auth &data) = 0; // Удалить игрока virtual coro<> remove(std::string username) = 0; }; class IModStorageSaveBackend { public: virtual ~IModStorageSaveBackend(); // // Загрузить запись // virtual void load(std::string domain, std::string key, std::string *data) = 0; // // Сохранить запись // virtual void save(std::string domain, std::string key, const std::string *data) = 0; // // Удалить запись // virtual void remove(std::string domain, std::string key) = 0; // // Удалить домен // virtual void remove(std::string domain) = 0; }; class ISaveBackendProvider { public: virtual ~ISaveBackendProvider(); virtual bool isAvailable() = 0; virtual std::string getName() = 0; virtual std::unique_ptr createWorld(boost::json::object data) = 0; virtual std::unique_ptr createPlayer(boost::json::object data) = 0; virtual std::unique_ptr createAuth(boost::json::object data) = 0; virtual std::unique_ptr createModStorage(boost::json::object data) = 0; }; }