#include "World.hpp" #include "TOSLib.hpp" #include namespace LV::Server { World::World(DefWorldId defId) : DefId(defId) { } World::~World() { } std::vector World::onRemoteClient_RegionsEnter(std::shared_ptr cec, const std::vector& enter) { std::vector out; 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.RMs.push_back(cec); region.NewRMs.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)] = region.Nodes[Pos::bvec4u(x, y, z).pack()].data(); } } return out; } void World::onRemoteClient_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->RMs; 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); region.Nodes = value.Nodes; } } void World::onUpdate(GameServer *server, float dtime) { } }