Nodestate
This commit is contained in:
@@ -151,6 +151,7 @@ struct DefItemInfo {
|
|||||||
|
|
||||||
struct DefVoxel_t {};
|
struct DefVoxel_t {};
|
||||||
struct DefNode_t {
|
struct DefNode_t {
|
||||||
|
AssetsNodestate NodestateId = 0;
|
||||||
AssetsTexture TexId = 0;
|
AssetsTexture TexId = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -436,7 +436,7 @@ void ServerSession::update(GlobalTime gTime, float dTime) {
|
|||||||
// Профили
|
// Профили
|
||||||
std::unordered_map<DefVoxelId, void*> profile_Voxel_AddOrChange;
|
std::unordered_map<DefVoxelId, void*> profile_Voxel_AddOrChange;
|
||||||
std::vector<DefVoxelId> profile_Voxel_Lost;
|
std::vector<DefVoxelId> profile_Voxel_Lost;
|
||||||
std::unordered_map<DefNodeId, void*> profile_Node_AddOrChange;
|
std::unordered_map<DefNodeId, DefNode_t> profile_Node_AddOrChange;
|
||||||
std::vector<DefNodeId> profile_Node_Lost;
|
std::vector<DefNodeId> profile_Node_Lost;
|
||||||
std::unordered_map<DefWorldId, void*> profile_World_AddOrChange;
|
std::unordered_map<DefWorldId, void*> profile_World_AddOrChange;
|
||||||
std::vector<DefWorldId> profile_World_Lost;
|
std::vector<DefWorldId> 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) {
|
for(auto& [wId, lost] : regions_Lost_Result) {
|
||||||
@@ -1110,29 +1117,19 @@ coro<> ServerSession::rP_Definition(Net::AsyncSocket &sock) {
|
|||||||
}
|
}
|
||||||
case ToClient::L2Definition::Node:
|
case ToClient::L2Definition::Node:
|
||||||
{
|
{
|
||||||
// DefNodeId id;
|
DefNode_t def;
|
||||||
// DefNode_t def;
|
DefNodeId id = co_await sock.read<DefNodeId>();
|
||||||
// id = co_await sock.read<DefNodeId>();
|
def.NodestateId = co_await sock.read<uint32_t>();
|
||||||
// def.DrawType = (DefNode_t::EnumDrawType) co_await sock.read<uint8_t>();
|
def.TexId = id;
|
||||||
// for(int iter = 0; iter < 6; iter++) {
|
|
||||||
// auto &pl = def.Texs[iter].Pipeline;
|
|
||||||
// pl.resize(co_await sock.read<uint16_t>());
|
|
||||||
// co_await sock.read((std::byte*) pl.data(), pl.size());
|
|
||||||
// }
|
|
||||||
|
|
||||||
// PP_Definition_Node *packet = new PP_Definition_Node(
|
AsyncContext.ThisTickEntry.Profile_Node_AddOrChange.emplace_back(id, def);
|
||||||
// id,
|
|
||||||
// def
|
|
||||||
// );
|
|
||||||
|
|
||||||
// while(!NetInputPackets.push(packet));
|
co_return;
|
||||||
|
|
||||||
// co_return;
|
|
||||||
}
|
}
|
||||||
case ToClient::L2Definition::FreeNode:
|
case ToClient::L2Definition::FreeNode:
|
||||||
{
|
{
|
||||||
DefNodeId id = co_await sock.read<DefNodeId>();
|
DefNodeId id = co_await sock.read<DefNodeId>();
|
||||||
|
AsyncContext.ThisTickEntry.Profile_Node_Lost.push_back(id);
|
||||||
|
|
||||||
co_return;
|
co_return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ private:
|
|||||||
struct TickData {
|
struct TickData {
|
||||||
std::vector<std::pair<DefVoxelId, void*>> Profile_Voxel_AddOrChange;
|
std::vector<std::pair<DefVoxelId, void*>> Profile_Voxel_AddOrChange;
|
||||||
std::vector<DefVoxelId> Profile_Voxel_Lost;
|
std::vector<DefVoxelId> Profile_Voxel_Lost;
|
||||||
std::vector<std::pair<DefNodeId, void*>> Profile_Node_AddOrChange;
|
std::vector<std::pair<DefNodeId, DefNode_t>> Profile_Node_AddOrChange;
|
||||||
std::vector<DefNodeId> Profile_Node_Lost;
|
std::vector<DefNodeId> Profile_Node_Lost;
|
||||||
std::vector<std::pair<DefWorldId, void*>> Profile_World_AddOrChange;
|
std::vector<std::pair<DefWorldId, void*>> Profile_World_AddOrChange;
|
||||||
std::vector<DefWorldId> Profile_World_Lost;
|
std::vector<DefWorldId> Profile_World_Lost;
|
||||||
|
|||||||
@@ -1108,6 +1108,7 @@ uint16_t PreparedNodeState::parseCondition(const std::string_view expression) {
|
|||||||
ssize_t npos = pos;
|
ssize_t npos = pos;
|
||||||
for(; npos < expression.size() && std::isalpha(expression[npos]); npos++);
|
for(; npos < expression.size() && std::isalpha(expression[npos]); npos++);
|
||||||
std::string_view value = expression.substr(pos, npos-pos);
|
std::string_view value = expression.substr(pos, npos-pos);
|
||||||
|
pos += value.size();
|
||||||
if(value == "true")
|
if(value == "true")
|
||||||
tokens.push_back(1);
|
tokens.push_back(1);
|
||||||
else if(value == "false")
|
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<EnumTokenKind>(&tokens[index])) {
|
if(EnumTokenKind *kind = std::get_if<EnumTokenKind>(&tokens[index])) {
|
||||||
if(*kind != EnumTokenKind::Not && *kind != EnumTokenKind::Plus && *kind != EnumTokenKind::Minus)
|
if(*kind != EnumTokenKind::Not && *kind != EnumTokenKind::Plus && *kind != EnumTokenKind::Minus)
|
||||||
continue;
|
continue;
|
||||||
@@ -1367,11 +1368,7 @@ uint16_t PreparedNodeState::parseCondition(const std::string_view expression) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
uint16_t nodeId = lambdaParse(0);
|
return lambdaParse(0);
|
||||||
if(!tokens.empty())
|
|
||||||
MAKE_ERROR("Выражение не действительно");
|
|
||||||
|
|
||||||
return nodeId;
|
|
||||||
|
|
||||||
// std::unordered_map<std::string, int> vars;
|
// std::unordered_map<std::string, int> vars;
|
||||||
// std::function<int(uint16_t)> lambdaCalcNode = [&](uint16_t nodeId) -> int {
|
// std::function<int(uint16_t)> lambdaCalcNode = [&](uint16_t nodeId) -> int {
|
||||||
|
|||||||
@@ -262,6 +262,13 @@ std::tuple<ResourceId, std::optional<AssetsManager::DataEntry>&> AssetsManager::
|
|||||||
table.emplace_back(std::make_unique<TableEntry<DataEntry>>());
|
table.emplace_back(std::make_unique<TableEntry<DataEntry>>());
|
||||||
id = (table.size()-1)*TableEntry<DataEntry>::ChunkSize;
|
id = (table.size()-1)*TableEntry<DataEntry>::ChunkSize;
|
||||||
data = &table.back()->Entries[0];
|
data = &table.back()->Entries[0];
|
||||||
|
|
||||||
|
// Расширяем таблицу с ресурсами, если необходимо
|
||||||
|
if(type == EnumAssets::Nodestate)
|
||||||
|
Table_NodeState.emplace_back(std::make_unique<TableEntry<std::vector<AssetsModel>>>());
|
||||||
|
else if(type == EnumAssets::Model)
|
||||||
|
Table_Model.emplace_back(std::make_unique<TableEntry<ModelDependency>>());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {id, *data};
|
return {id, *data};
|
||||||
|
|||||||
@@ -120,17 +120,6 @@ private:
|
|||||||
auto [id, entry] = nextId(type);
|
auto [id, entry] = nextId(type);
|
||||||
keyToId[domain][key] = id;
|
keyToId[domain][key] = id;
|
||||||
|
|
||||||
// Расширяем таблицу с ресурсами, если необходимо
|
|
||||||
ssize_t tableChunks = (ssize_t) (id/TableEntry<DataEntry>::ChunkSize)-(ssize_t) Table[(int) type].size()+1;
|
|
||||||
for(; tableChunks > 0; tableChunks--) {
|
|
||||||
Table[(int) type].emplace_back(std::make_unique<TableEntry<DataEntry>>());
|
|
||||||
|
|
||||||
if(type == EnumAssets::Nodestate)
|
|
||||||
Table_NodeState.emplace_back(std::make_unique<TableEntry<std::vector<AssetsModel>>>());
|
|
||||||
else if(type == EnumAssets::Model)
|
|
||||||
Table_Model.emplace_back(std::make_unique<TableEntry<ModelDependency>>());
|
|
||||||
}
|
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -256,6 +245,8 @@ public:
|
|||||||
models.append_range(subModel->FullSubModelDeps);
|
models.append_range(subModel->FullSubModelDeps);
|
||||||
textures.append_range(subModel->FullSubTextureDeps);
|
textures.append_range(subModel->FullSubTextureDeps);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
LOG.debug() << "Для ноды " << domain << ':' << key << " отсутствует описание Nodestate";
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -271,6 +262,7 @@ public:
|
|||||||
textures.erase(eraseIter, textures.end());
|
textures.erase(eraseIter, textures.end());
|
||||||
textures.shrink_to_fit();
|
textures.shrink_to_fit();
|
||||||
}
|
}
|
||||||
|
|
||||||
return {nodestateId, std::move(models), std::move(textures)};
|
return {nodestateId, std::move(models), std::move(textures)};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,18 +4,22 @@
|
|||||||
|
|
||||||
namespace LV::Server {
|
namespace LV::Server {
|
||||||
|
|
||||||
ContentManager::ContentManager(asio::io_context& ioc) {
|
ContentManager::ContentManager(AssetsManager &am)
|
||||||
|
: AM(am)
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ContentManager::~ContentManager() = default;
|
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<DefNode>& node = getEntry_Node(id);
|
std::optional<DefNode>& node = getEntry_Node(id);
|
||||||
if(!node)
|
if(!node)
|
||||||
node.emplace();
|
node.emplace();
|
||||||
|
|
||||||
DefNode& def = *node;
|
DefNode& def = *node;
|
||||||
|
def.Domain = domain;
|
||||||
|
def.Key = key;
|
||||||
|
|
||||||
{
|
{
|
||||||
std::optional<std::variant<std::string, sol::table>> parent = profile.get<std::optional<std::variant<std::string, sol::table>>>("parent");
|
std::optional<std::variant<std::string, sol::table>> parent = profile.get<std::optional<std::variant<std::string, sol::table>>>("parent");
|
||||||
@@ -70,7 +74,7 @@ void ContentManager::registerBase_Node(ResourceId id, const sol::table& profile)
|
|||||||
// result.NodeAdvancementFactory = profile["node_advancement_factory"];
|
// 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<DefWorld>& world = getEntry_World(id);
|
std::optional<DefWorld>& world = getEntry_World(id);
|
||||||
if(!world)
|
if(!world)
|
||||||
world.emplace();
|
world.emplace();
|
||||||
@@ -82,9 +86,9 @@ void ContentManager::registerBase(EnumDefContent type, const std::string& domain
|
|||||||
ProfileChanges[(int) type].push_back(id);
|
ProfileChanges[(int) type].push_back(id);
|
||||||
|
|
||||||
if(type == EnumDefContent::Node)
|
if(type == EnumDefContent::Node)
|
||||||
registerBase_Node(id, profile);
|
registerBase_Node(id, domain, key, profile);
|
||||||
else if(type == EnumDefContent::World)
|
else if(type == EnumDefContent::World)
|
||||||
registerBase_World(id, profile);
|
registerBase_World(id, domain, key, profile);
|
||||||
else
|
else
|
||||||
MAKE_ERROR("Не реализовано");
|
MAKE_ERROR("Не реализовано");
|
||||||
}
|
}
|
||||||
@@ -117,8 +121,18 @@ ContentManager::Out_buildEndProfiles ContentManager::buildEndProfiles() {
|
|||||||
keys.erase(iterErase, keys.end());
|
keys.erase(iterErase, keys.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
for(ResourceId id : ProfileChanges[(int) EnumDefContent::Voxel]) {
|
for(ResourceId id : ProfileChanges[(int) EnumDefContent::Node]) {
|
||||||
|
std::optional<DefNode>& 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;
|
return result;
|
||||||
|
|||||||
@@ -29,7 +29,11 @@ struct ResourceBase {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct DefVoxel : public ResourceBase { };
|
struct DefVoxel : public ResourceBase { };
|
||||||
struct DefNode : public ResourceBase { };
|
struct DefNode : public ResourceBase {
|
||||||
|
AssetsNodestate NodestateId;
|
||||||
|
std::vector<AssetsModel> ModelDeps;
|
||||||
|
std::vector<AssetsTexture> TextureDeps;
|
||||||
|
};
|
||||||
struct DefWorld : public ResourceBase { };
|
struct DefWorld : public ResourceBase { };
|
||||||
struct DefPortal : public ResourceBase { };
|
struct DefPortal : public ResourceBase { };
|
||||||
struct DefEntity : public ResourceBase { };
|
struct DefEntity : public ResourceBase { };
|
||||||
@@ -126,11 +130,11 @@ class ContentManager {
|
|||||||
return resId;
|
return resId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerBase_Node(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 sol::table& profile);
|
void registerBase_World(ResourceId id, const std::string& domain, const std::string& key, const sol::table& profile);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ContentManager(asio::io_context& ioc);
|
ContentManager(AssetsManager &am);
|
||||||
~ContentManager();
|
~ContentManager();
|
||||||
|
|
||||||
// Регистрирует определение контента
|
// Регистрирует определение контента
|
||||||
@@ -199,6 +203,10 @@ public:
|
|||||||
else
|
else
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
TOS::Logger LOG = "Server>ContentManager";
|
||||||
|
AssetsManager& AM;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1472,6 +1472,7 @@ void GameServer::init(fs::path worldPath) {
|
|||||||
initLuaPost();
|
initLuaPost();
|
||||||
pushEvent("postInit");
|
pushEvent("postInit");
|
||||||
|
|
||||||
|
|
||||||
// Загрузить миры с существующими профилями
|
// Загрузить миры с существующими профилями
|
||||||
LOG.info() << "Загрузка существующих миров...";
|
LOG.info() << "Загрузка существующих миров...";
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ class GameServer : public AsyncObject {
|
|||||||
|
|
||||||
|
|
||||||
ContentObj(asio::io_context& ioc)
|
ContentObj(asio::io_context& ioc)
|
||||||
: AM(ioc), CM(ioc)
|
: AM(ioc), CM(AM)
|
||||||
{}
|
{}
|
||||||
} Content;
|
} Content;
|
||||||
|
|
||||||
|
|||||||
@@ -579,50 +579,34 @@ void RemoteClient::NetworkAndResource_t::informateDefVoxel(const std::vector<std
|
|||||||
|
|
||||||
void RemoteClient::NetworkAndResource_t::informateDefNode(const std::vector<std::pair<DefNodeId, DefNode*>>& nodes)
|
void RemoteClient::NetworkAndResource_t::informateDefNode(const std::vector<std::pair<DefNodeId, DefNode*>>& nodes)
|
||||||
{
|
{
|
||||||
// for(auto& [id, def] : nodes) {
|
for(auto& [id, def] : nodes) {
|
||||||
// if(!ResUses.DefNode.contains(id))
|
if(!ResUses.DefNode.contains(id))
|
||||||
// continue;
|
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++)
|
auto iterDefRef = ResUses.RefDefNode.find(id);
|
||||||
// reserve += def->Texs[iter].Pipeline.size();
|
if(iterDefRef != ResUses.RefDefNode.end()) {
|
||||||
|
decrementAssets(std::move(iterDefRef->second));
|
||||||
// checkPacketBorder(1+1+4+1+2*6+reserve);
|
iterDefRef->second = std::move(refs);
|
||||||
// NextPacket << (uint8_t) ToClient::L1::Definition
|
} else {
|
||||||
// << (uint8_t) ToClient::L2Definition::Node
|
ResUses.RefDefNode[id] = std::move(refs);
|
||||||
// << 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);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RemoteClient::NetworkAndResource_t::informateDefWorld(const std::vector<std::pair<DefWorldId, DefWorld*>>& worlds)
|
void RemoteClient::NetworkAndResource_t::informateDefWorld(const std::vector<std::pair<DefWorldId, DefWorld*>>& worlds)
|
||||||
|
|||||||
Reference in New Issue
Block a user