This commit is contained in:
2025-06-30 18:03:56 +06:00
parent 6fd0b3e9d5
commit efc6dc0692
2 changed files with 52 additions and 38 deletions

View File

@@ -42,7 +42,6 @@ class GameServer : public AsyncObject {
struct { struct {
Lockable<std::set<std::string>> ConnectedPlayersSet; Lockable<std::set<std::string>> ConnectedPlayersSet;
Lockable<std::list<std::unique_ptr<RemoteClient>>> NewConnectedPlayers; Lockable<std::list<std::unique_ptr<RemoteClient>>> NewConnectedPlayers;
} External; } External;
struct ContentObj { struct ContentObj {

View File

@@ -2,6 +2,7 @@
#include "Abstract.hpp" #include "Abstract.hpp"
#include "Common/Abstract.hpp" #include "Common/Abstract.hpp"
#include "Common/Async.hpp"
#include <boost/json.hpp> #include <boost/json.hpp>
#include <boost/json/object.hpp> #include <boost/json/object.hpp>
#include <memory> #include <memory>
@@ -10,31 +11,51 @@
namespace LV::Server { namespace LV::Server {
/*
Обменная единица мира
*/
struct SB_Region { struct SB_Region {
std::vector<VoxelCube_Region> Voxels; // Список вокселей всех чанков
std::unordered_map<DefVoxelId_t, std::string> VoxelsMap; std::unordered_map<Pos::bvec4u, VoxelCube> Voxels;
std::unordered_map<Pos::bvec16u, Node> Nodes; // Привязка вокселей к ключу профиля
std::unordered_map<DefNodeId_t, std::string> NodeMap; std::vector<std::pair<DefVoxelId_t, std::string>> VoxelsMap;
// Ноды всех чанков
std::array<std::array<Node, 16*16*16>, 4*4*4> Nodes;
// Привязка нод к ключу профиля
std::vector<std::pair<DefNodeId_t, std::string>> NodeMap;
// Сущности
std::vector<Entity> Entityes; std::vector<Entity> Entityes;
std::unordered_map<DefEntityId_t, std::string> EntityMap; // Привязка идентификатора к ключу профиля
std::vector<std::pair<DefEntityId_t, std::string>> EntityMap;
}; };
class IWorldSaveBackend { class IWorldSaveBackend {
public: public:
virtual ~IWorldSaveBackend(); virtual ~IWorldSaveBackend();
// Может ли использоваться параллельно struct TickSyncInfo_In {
virtual bool isAsync() { return false; }; // Для загрузки и более не используемые (регионы автоматически подгружаются по списку загруженных)
// Существует ли регион std::vector<Pos::GlobalRegion> Load, Unload;
virtual bool isExist(std::string worldId, Pos::GlobalRegion regionPos) = 0; // Регионы для сохранения
// Загрузить регион std::vector<std::pair<Pos::GlobalRegion, std::unique_ptr<SB_Region>>> ToSave;
virtual void load(std::string worldId, Pos::GlobalRegion regionPos, SB_Region *data) = 0; };
// Сохранить регион
virtual void save(std::string worldId, Pos::GlobalRegion regionPos, const SB_Region *data) = 0; struct TickSyncInfo_Out {
// Удалить регион std::vector<Pos::GlobalRegion> NotExisten;
virtual void remove(std::string worldId, Pos::GlobalRegion regionPos) = 0; std::vector<std::pair<Pos::GlobalRegion, std::unique_ptr<SB_Region>>> LoadedRegions;
// Удалить мир };
virtual void remove(std::string worldId) = 0;
/*
Обмен данными раз в такт
Хотим списки на загрузку регионов
Отдаём уже загруженные регионы и список отсутствующих в базе регионов
*/
virtual TickSyncInfo_Out tickSync(TickSyncInfo_In &&data) = 0;
/*
Устанавливает радиус вокруг прогруженного региона для предзагрузки регионов
*/
virtual void changePreloadDistance(uint8_t value) = 0;
}; };
struct SB_Player { struct SB_Player {
@@ -45,8 +66,6 @@ class IPlayerSaveBackend {
public: public:
virtual ~IPlayerSaveBackend(); virtual ~IPlayerSaveBackend();
// Может ли использоваться параллельно
virtual bool isAsync() { return false; };
// Существует ли игрок // Существует ли игрок
virtual bool isExist(PlayerId_t playerId) = 0; virtual bool isExist(PlayerId_t playerId) = 0;
// Загрузить игрока // Загрузить игрока
@@ -66,34 +85,30 @@ class IAuthSaveBackend {
public: public:
virtual ~IAuthSaveBackend(); virtual ~IAuthSaveBackend();
// Может ли использоваться параллельно
virtual bool isAsync() { return false; };
// Существует ли игрок // Существует ли игрок
virtual bool isExist(std::string playerId) = 0; virtual coro<bool> isExist(std::string username) = 0;
// Переименовать игрока // Переименовать игрока
virtual void rename(std::string fromPlayerId, std::string toPlayerId) = 0; virtual coro<> rename(std::string prevUsername, std::string newUsername) = 0;
// Загрузить игрока // Загрузить игрока (если есть, вернёт true)
virtual void load(std::string playerId, SB_Auth *data) = 0; virtual coro<bool> load(std::string username, SB_Auth &data) = 0;
// Сохранить игрока // Сохранить игрока
virtual void save(std::string playerId, const SB_Auth *data) = 0; virtual coro<> save(std::string username, const SB_Auth &data) = 0;
// Удалить игрока // Удалить игрока
virtual void remove(std::string playerId) = 0; virtual coro<> remove(std::string username) = 0;
}; };
class IModStorageSaveBackend { class IModStorageSaveBackend {
public: public:
virtual ~IModStorageSaveBackend(); virtual ~IModStorageSaveBackend();
// Может ли использоваться параллельно // // Загрузить запись
virtual bool isAsync() { return false; }; // virtual void load(std::string domain, std::string key, std::string *data) = 0;
// Загрузить запись // // Сохранить запись
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 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, std::string key) = 0; // virtual void remove(std::string domain) = 0;
// Удалить домен
virtual void remove(std::string domain) = 0;
}; };
class ISaveBackendProvider { class ISaveBackendProvider {