Доработка пайплайн машины (требуется пересмотр технологии)
This commit is contained in:
@@ -16,7 +16,7 @@ World::~World() {
|
||||
|
||||
}
|
||||
|
||||
std::vector<Pos::GlobalRegion> World::onRemoteClient_RegionsEnter(std::shared_ptr<RemoteClient> cec, const std::vector<Pos::GlobalRegion>& enter) {
|
||||
std::vector<Pos::GlobalRegion> World::onRemoteClient_RegionsEnter(WorldId_t worldId, std::shared_ptr<RemoteClient> cec, const std::vector<Pos::GlobalRegion>& enter) {
|
||||
std::vector<Pos::GlobalRegion> out;
|
||||
|
||||
for(const Pos::GlobalRegion &pos : enter) {
|
||||
@@ -43,18 +43,49 @@ std::vector<Pos::GlobalRegion> World::onRemoteClient_RegionsEnter(std::shared_pt
|
||||
nodes[Pos::bvec4u(x, y, z)] = region.Nodes[Pos::bvec4u(x, y, z).pack()].data();
|
||||
}
|
||||
|
||||
|
||||
if(!region.Entityes.empty()) {
|
||||
std::vector<std::tuple<ServerEntityId_t, const Entity*>> updates;
|
||||
updates.reserve(region.Entityes.size());
|
||||
|
||||
for(size_t iter = 0; iter < region.Entityes.size(); iter++) {
|
||||
const Entity& entity = region.Entityes[iter];
|
||||
if(entity.IsRemoved)
|
||||
continue;
|
||||
|
||||
ServerEntityId_t entityId = {worldId, pos, static_cast<RegionEntityId_t>(iter)};
|
||||
updates.emplace_back(entityId, &entity);
|
||||
}
|
||||
|
||||
if(!updates.empty())
|
||||
cec->prepareEntitiesUpdate(updates);
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
void World::onRemoteClient_RegionsLost(std::shared_ptr<RemoteClient> cec, const std::vector<Pos::GlobalRegion> &lost) {
|
||||
void World::onRemoteClient_RegionsLost(WorldId_t worldId, std::shared_ptr<RemoteClient> cec, const std::vector<Pos::GlobalRegion> &lost) {
|
||||
for(const Pos::GlobalRegion &pos : lost) {
|
||||
auto region = Regions.find(pos);
|
||||
if(region == Regions.end())
|
||||
continue;
|
||||
|
||||
if(!region->second->Entityes.empty()) {
|
||||
std::vector<ServerEntityId_t> removed;
|
||||
removed.reserve(region->second->Entityes.size());
|
||||
|
||||
for(size_t iter = 0; iter < region->second->Entityes.size(); iter++) {
|
||||
const Entity& entity = region->second->Entityes[iter];
|
||||
if(entity.IsRemoved)
|
||||
continue;
|
||||
|
||||
removed.emplace_back(worldId, pos, static_cast<RegionEntityId_t>(iter));
|
||||
}
|
||||
|
||||
if(!removed.empty())
|
||||
cec->prepareEntitiesRemove(removed);
|
||||
}
|
||||
|
||||
std::vector<std::shared_ptr<RemoteClient>> &CECs = region->second->RMs;
|
||||
for(size_t iter = 0; iter < CECs.size(); iter++) {
|
||||
if(CECs[iter] == cec) {
|
||||
@@ -74,6 +105,7 @@ void World::pushRegions(std::vector<std::pair<Pos::GlobalRegion, RegionIn>> regi
|
||||
Region ®ion = *(Regions[key] = std::make_unique<Region>());
|
||||
region.Voxels = std::move(value.Voxels);
|
||||
region.Nodes = value.Nodes;
|
||||
region.Entityes = std::move(value.Entityes);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,4 +113,4 @@ void World::onUpdate(GameServer *server, float dtime) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user