From 95fc3c7e748bd9f0f9154226d7f0e6ec5b02c41d Mon Sep 17 00:00:00 2001 From: DrSocalkwe3n Date: Mon, 1 Sep 2025 13:39:38 +0600 Subject: [PATCH] Nodestate --- Src/Client/Abstract.hpp | 1 + Src/Client/ServerSession.cpp | 33 ++++++++--------- Src/Client/ServerSession.hpp | 2 +- Src/Common/Abstract.cpp | 9 ++--- Src/Server/AssetsManager.cpp | 7 ++++ Src/Server/AssetsManager.hpp | 14 ++----- Src/Server/ContentManager.cpp | 26 ++++++++++--- Src/Server/ContentManager.hpp | 16 ++++++-- Src/Server/GameServer.cpp | 1 + Src/Server/GameServer.hpp | 2 +- Src/Server/RemoteClient.cpp | 70 ++++++++++++++--------------------- 11 files changed, 91 insertions(+), 90 deletions(-) diff --git a/Src/Client/Abstract.hpp b/Src/Client/Abstract.hpp index cd15276..0dab321 100644 --- a/Src/Client/Abstract.hpp +++ b/Src/Client/Abstract.hpp @@ -151,6 +151,7 @@ struct DefItemInfo { struct DefVoxel_t {}; struct DefNode_t { + AssetsNodestate NodestateId = 0; AssetsTexture TexId = 0; }; diff --git a/Src/Client/ServerSession.cpp b/Src/Client/ServerSession.cpp index 72f1c5b..cfdcd9f 100644 --- a/Src/Client/ServerSession.cpp +++ b/Src/Client/ServerSession.cpp @@ -436,7 +436,7 @@ void ServerSession::update(GlobalTime gTime, float dTime) { // Профили std::unordered_map profile_Voxel_AddOrChange; std::vector profile_Voxel_Lost; - std::unordered_map profile_Node_AddOrChange; + std::unordered_map profile_Node_AddOrChange; std::vector profile_Node_Lost; std::unordered_map profile_World_AddOrChange; std::vector profile_World_Lost; @@ -811,6 +811,13 @@ void ServerSession::update(GlobalTime gTime, float dTime) { } } + // Определения + { + for(auto& [resId, def] : profile_Node_AddOrChange) { + Profiles.DefNode[resId] = def; + } + } + // Чанки { for(auto& [wId, lost] : regions_Lost_Result) { @@ -1110,29 +1117,19 @@ coro<> ServerSession::rP_Definition(Net::AsyncSocket &sock) { } case ToClient::L2Definition::Node: { - // DefNodeId id; - // DefNode_t def; - // id = co_await sock.read(); - // def.DrawType = (DefNode_t::EnumDrawType) co_await sock.read(); - // for(int iter = 0; iter < 6; iter++) { - // auto &pl = def.Texs[iter].Pipeline; - // pl.resize(co_await sock.read()); - // co_await sock.read((std::byte*) pl.data(), pl.size()); - // } + DefNode_t def; + DefNodeId id = co_await sock.read(); + def.NodestateId = co_await sock.read(); + def.TexId = id; - // PP_Definition_Node *packet = new PP_Definition_Node( - // id, - // def - // ); + AsyncContext.ThisTickEntry.Profile_Node_AddOrChange.emplace_back(id, def); - // while(!NetInputPackets.push(packet)); - - // co_return; + co_return; } case ToClient::L2Definition::FreeNode: { DefNodeId id = co_await sock.read(); - + AsyncContext.ThisTickEntry.Profile_Node_Lost.push_back(id); co_return; } diff --git a/Src/Client/ServerSession.hpp b/Src/Client/ServerSession.hpp index d638cc0..5654282 100644 --- a/Src/Client/ServerSession.hpp +++ b/Src/Client/ServerSession.hpp @@ -94,7 +94,7 @@ private: struct TickData { std::vector> Profile_Voxel_AddOrChange; std::vector Profile_Voxel_Lost; - std::vector> Profile_Node_AddOrChange; + std::vector> Profile_Node_AddOrChange; std::vector Profile_Node_Lost; std::vector> Profile_World_AddOrChange; std::vector Profile_World_Lost; diff --git a/Src/Common/Abstract.cpp b/Src/Common/Abstract.cpp index 0038e09..094da2d 100644 --- a/Src/Common/Abstract.cpp +++ b/Src/Common/Abstract.cpp @@ -1108,6 +1108,7 @@ uint16_t PreparedNodeState::parseCondition(const std::string_view expression) { ssize_t npos = pos; for(; npos < expression.size() && std::isalpha(expression[npos]); npos++); std::string_view value = expression.substr(pos, npos-pos); + pos += value.size(); if(value == "true") tokens.push_back(1); else if(value == "false") @@ -1198,7 +1199,7 @@ uint16_t PreparedNodeState::parseCondition(const std::string_view expression) { } // Обрабатываем унарные операции - for(ssize_t index = end; index >= pos; index--) { + for(ssize_t index = end-1; index >= (ssize_t) pos; index--) { if(EnumTokenKind *kind = std::get_if(&tokens[index])) { if(*kind != EnumTokenKind::Not && *kind != EnumTokenKind::Plus && *kind != EnumTokenKind::Minus) continue; @@ -1367,11 +1368,7 @@ uint16_t PreparedNodeState::parseCondition(const std::string_view expression) { } }; - uint16_t nodeId = lambdaParse(0); - if(!tokens.empty()) - MAKE_ERROR("Выражение не действительно"); - - return nodeId; + return lambdaParse(0); // std::unordered_map vars; // std::function lambdaCalcNode = [&](uint16_t nodeId) -> int { diff --git a/Src/Server/AssetsManager.cpp b/Src/Server/AssetsManager.cpp index 809d295..6bef01c 100644 --- a/Src/Server/AssetsManager.cpp +++ b/Src/Server/AssetsManager.cpp @@ -262,6 +262,13 @@ std::tuple&> AssetsManager:: table.emplace_back(std::make_unique>()); id = (table.size()-1)*TableEntry::ChunkSize; data = &table.back()->Entries[0]; + + // Расширяем таблицу с ресурсами, если необходимо + if(type == EnumAssets::Nodestate) + Table_NodeState.emplace_back(std::make_unique>>()); + else if(type == EnumAssets::Model) + Table_Model.emplace_back(std::make_unique>()); + } return {id, *data}; diff --git a/Src/Server/AssetsManager.hpp b/Src/Server/AssetsManager.hpp index a97288a..4e140c9 100644 --- a/Src/Server/AssetsManager.hpp +++ b/Src/Server/AssetsManager.hpp @@ -120,17 +120,6 @@ private: auto [id, entry] = nextId(type); keyToId[domain][key] = id; - // Расширяем таблицу с ресурсами, если необходимо - ssize_t tableChunks = (ssize_t) (id/TableEntry::ChunkSize)-(ssize_t) Table[(int) type].size()+1; - for(; tableChunks > 0; tableChunks--) { - Table[(int) type].emplace_back(std::make_unique>()); - - if(type == EnumAssets::Nodestate) - Table_NodeState.emplace_back(std::make_unique>>()); - else if(type == EnumAssets::Model) - Table_Model.emplace_back(std::make_unique>()); - } - return id; } @@ -256,6 +245,8 @@ public: models.append_range(subModel->FullSubModelDeps); textures.append_range(subModel->FullSubTextureDeps); } + } else { + LOG.debug() << "Для ноды " << domain << ':' << key << " отсутствует описание Nodestate"; } { @@ -271,6 +262,7 @@ public: textures.erase(eraseIter, textures.end()); textures.shrink_to_fit(); } + return {nodestateId, std::move(models), std::move(textures)}; } diff --git a/Src/Server/ContentManager.cpp b/Src/Server/ContentManager.cpp index 53d44bc..096fa76 100644 --- a/Src/Server/ContentManager.cpp +++ b/Src/Server/ContentManager.cpp @@ -4,18 +4,22 @@ namespace LV::Server { -ContentManager::ContentManager(asio::io_context& ioc) { +ContentManager::ContentManager(AssetsManager &am) + : AM(am) +{ } ContentManager::~ContentManager() = default; -void ContentManager::registerBase_Node(ResourceId id, const sol::table& profile) { +void ContentManager::registerBase_Node(ResourceId id, const std::string& domain, const std::string& key, const sol::table& profile) { std::optional& node = getEntry_Node(id); if(!node) node.emplace(); DefNode& def = *node; + def.Domain = domain; + def.Key = key; { std::optional> parent = profile.get>>("parent"); @@ -70,7 +74,7 @@ void ContentManager::registerBase_Node(ResourceId id, const sol::table& profile) // result.NodeAdvancementFactory = profile["node_advancement_factory"]; } -void ContentManager::registerBase_World(ResourceId id, const sol::table& profile) { +void ContentManager::registerBase_World(ResourceId id, const std::string& domain, const std::string& key, const sol::table& profile) { std::optional& world = getEntry_World(id); if(!world) world.emplace(); @@ -82,9 +86,9 @@ void ContentManager::registerBase(EnumDefContent type, const std::string& domain ProfileChanges[(int) type].push_back(id); if(type == EnumDefContent::Node) - registerBase_Node(id, profile); + registerBase_Node(id, domain, key, profile); else if(type == EnumDefContent::World) - registerBase_World(id, profile); + registerBase_World(id, domain, key, profile); else MAKE_ERROR("Не реализовано"); } @@ -117,8 +121,18 @@ ContentManager::Out_buildEndProfiles ContentManager::buildEndProfiles() { keys.erase(iterErase, keys.end()); } - for(ResourceId id : ProfileChanges[(int) EnumDefContent::Voxel]) { + for(ResourceId id : ProfileChanges[(int) EnumDefContent::Node]) { + std::optional& node = getEntry_Node(id); + if(!node) { + continue; + } + auto [nodestateId, assetsModel, assetsTexture] + = AM.getNodeDependency(node->Domain, node->Key); + + node->NodestateId = nodestateId; + node->ModelDeps = std::move(assetsModel); + node->TextureDeps = std::move(assetsTexture); } return result; diff --git a/Src/Server/ContentManager.hpp b/Src/Server/ContentManager.hpp index d1eeb9b..f6b0337 100644 --- a/Src/Server/ContentManager.hpp +++ b/Src/Server/ContentManager.hpp @@ -29,7 +29,11 @@ struct ResourceBase { }; struct DefVoxel : public ResourceBase { }; -struct DefNode : public ResourceBase { }; +struct DefNode : public ResourceBase { + AssetsNodestate NodestateId; + std::vector ModelDeps; + std::vector TextureDeps; +}; struct DefWorld : public ResourceBase { }; struct DefPortal : public ResourceBase { }; struct DefEntity : public ResourceBase { }; @@ -126,11 +130,11 @@ class ContentManager { return resId; } - void registerBase_Node(ResourceId id, const sol::table& profile); - void registerBase_World(ResourceId id, const sol::table& profile); + void registerBase_Node(ResourceId id, const std::string& domain, const std::string& key, const sol::table& profile); + void registerBase_World(ResourceId id, const std::string& domain, const std::string& key, const sol::table& profile); public: - ContentManager(asio::io_context& ioc); + ContentManager(AssetsManager &am); ~ContentManager(); // Регистрирует определение контента @@ -199,6 +203,10 @@ public: else return std::nullopt; } + +private: + TOS::Logger LOG = "Server>ContentManager"; + AssetsManager& AM; }; } \ No newline at end of file diff --git a/Src/Server/GameServer.cpp b/Src/Server/GameServer.cpp index 8de01f5..aef64fe 100644 --- a/Src/Server/GameServer.cpp +++ b/Src/Server/GameServer.cpp @@ -1472,6 +1472,7 @@ void GameServer::init(fs::path worldPath) { initLuaPost(); pushEvent("postInit"); + // Загрузить миры с существующими профилями LOG.info() << "Загрузка существующих миров..."; diff --git a/Src/Server/GameServer.hpp b/Src/Server/GameServer.hpp index 0748d67..bd0f0ae 100644 --- a/Src/Server/GameServer.hpp +++ b/Src/Server/GameServer.hpp @@ -80,7 +80,7 @@ class GameServer : public AsyncObject { ContentObj(asio::io_context& ioc) - : AM(ioc), CM(ioc) + : AM(ioc), CM(AM) {} } Content; diff --git a/Src/Server/RemoteClient.cpp b/Src/Server/RemoteClient.cpp index 4fe4836..fe9030e 100644 --- a/Src/Server/RemoteClient.cpp +++ b/Src/Server/RemoteClient.cpp @@ -579,50 +579,34 @@ void RemoteClient::NetworkAndResource_t::informateDefVoxel(const std::vector>& nodes) { - // for(auto& [id, def] : nodes) { - // if(!ResUses.DefNode.contains(id)) - // continue; + for(auto& [id, def] : nodes) { + if(!ResUses.DefNode.contains(id)) + continue; + + checkPacketBorder(1+1+4+4); + NextPacket << (uint8_t) ToClient::L1::Definition + << (uint8_t) ToClient::L2Definition::Node + << id << (uint32_t) def->NodestateId; + + ResUses_t::RefAssets_t refs; + { + refs.Resources[(uint8_t) EnumAssets::Nodestate].push_back(def->NodestateId); + refs.Resources[(uint8_t) EnumAssets::Texture] = def->TextureDeps; + refs.Resources[(uint8_t) EnumAssets::Model] = def->ModelDeps; + + incrementAssets(refs); + } - // size_t reserve = 0; - // for(int iter = 0; iter < 6; iter++) - // reserve += def->Texs[iter].Pipeline.size(); - - // checkPacketBorder(1+1+4+1+2*6+reserve); - // NextPacket << (uint8_t) ToClient::L1::Definition - // << (uint8_t) ToClient::L2Definition::Node - // << id << (uint8_t) def->DrawType; - - // for(int iter = 0; iter < 6; iter++) { - // NextPacket << (uint16_t) def->Texs[iter].Pipeline.size(); - // NextPacket.write((const std::byte*) def->Texs[iter].Pipeline.data(), def->Texs[iter].Pipeline.size()); - // } - - // ResUsesObj::RefDefBin_t refs; - // { - // auto &array = refs.Resources[(uint8_t) EnumBinResource::Texture]; - // for(int iter = 0; iter < 6; iter++) { - // array.insert(array.end(), def->Texs[iter].BinTextures.begin(), def->Texs[iter].BinTextures.end()); - // } - - // std::sort(array.begin(), array.end()); - // auto eraseLast = std::unique(array.begin(), array.end()); - // array.erase(eraseLast, array.end()); - - // incrementBinary(refs); - // } - - - // { - // auto iterDefRef = ResUses.RefDefNode.find(id); - // if(iterDefRef != ResUses.RefDefNode.end()) { - // decrementBinary(std::move(iterDefRef->second)); - // iterDefRef->second = std::move(refs); - // } else { - // ResUses.RefDefNode[id] = std::move(refs); - // } - // } - - // } + { + auto iterDefRef = ResUses.RefDefNode.find(id); + if(iterDefRef != ResUses.RefDefNode.end()) { + decrementAssets(std::move(iterDefRef->second)); + iterDefRef->second = std::move(refs); + } else { + ResUses.RefDefNode[id] = std::move(refs); + } + } + } } void RemoteClient::NetworkAndResource_t::informateDefWorld(const std::vector>& worlds)