#include "World.hpp" #include "TOSLib.hpp" #include namespace LV::Server { World::World(DefWorldId_t defId) : DefId(defId) { } World::~World() { } std::vector World::onCEC_RegionsEnter(std::shared_ptr cec, const std::vector& enter) { std::vector out; TOS::Logger("Test").debug() << "Start"; for(const Pos::GlobalRegion &pos : enter) { auto iterRegion = Regions.find(pos); if(iterRegion == Regions.end()) { out.push_back(pos); continue; } auto ®ion = *iterRegion->second; region.CECs.push_back(cec); region.NewCECs.push_back(cec); // Отправить клиенту информацию о чанках и сущностях std::unordered_map*> voxels; std::unordered_map nodes; for(auto& [key, value] : region.Voxels) { voxels[key] = &value; } for(int z = 0; z < 4; z++) for(int y = 0; y < 4; y++) for(int x = 0; x < 4; x++) { nodes[Pos::bvec4u(x, y, z)] = (const Node*) ®ion.Nodes[0][0][0][x][y][z]; } } TOS::Logger("Test").debug() << "End"; return out; } void World::onCEC_RegionsLost(std::shared_ptr cec, const std::vector &lost) { for(const Pos::GlobalRegion &pos : lost) { auto region = Regions.find(pos); if(region == Regions.end()) continue; std::vector> &CECs = region->second->CECs; for(size_t iter = 0; iter < CECs.size(); iter++) { if(CECs[iter] == cec) { CECs.erase(CECs.begin()+iter); break; } } } } World::SaveUnloadInfo World::onStepDatabaseSync() { return {}; } void World::pushRegions(std::vector> regions) { for(auto& [key, value] : regions) { Region ®ion = *(Regions[key] = std::make_unique()); region.Voxels = std::move(value.Voxels); Node *ptr = (Node*) region.Nodes; for(std::array& nodes : value.Nodes) { std::copy(nodes.data(), nodes.data()+16*16*16, ptr); ptr += 16*16*16; } } } void World::onUpdate(GameServer *server, float dtime) { } }