ocdex-5.2: Отправка чанков на клиент

This commit is contained in:
2026-01-04 20:23:44 +06:00
parent dbebf50552
commit 01ea7eee74
2 changed files with 66 additions and 0 deletions

View File

@@ -258,6 +258,15 @@ void RemoteClient::shutdown(EnumDisconnect type, const std::string reason) {
void RemoteClient::NetworkAndResource_t::prepareRegionsRemove(WorldId_t worldId, std::vector<Pos::GlobalRegion> regionPoses) void RemoteClient::NetworkAndResource_t::prepareRegionsRemove(WorldId_t worldId, std::vector<Pos::GlobalRegion> regionPoses)
{ {
auto worldIter = ChunksToSend.find(worldId);
if(worldIter != ChunksToSend.end()) {
for(const Pos::GlobalRegion &regionPos : regionPoses)
worldIter->second.erase(regionPos);
if(worldIter->second.empty())
ChunksToSend.erase(worldIter);
}
for(Pos::GlobalRegion regionPos : regionPoses) { for(Pos::GlobalRegion regionPos : regionPoses) {
checkPacketBorder(16); checkPacketBorder(16);
NextPacket << (uint8_t) ToClient::RemoveRegion NextPacket << (uint8_t) ToClient::RemoveRegion
@@ -265,6 +274,60 @@ void RemoteClient::NetworkAndResource_t::prepareRegionsRemove(WorldId_t worldId,
} }
} }
void RemoteClient::NetworkAndResource_t::flushChunksToPackets()
{
for(auto &worldPair : ChunksToSend) {
const WorldId_t worldId = worldPair.first;
auto &regions = worldPair.second;
for(auto &regionPair : regions) {
const Pos::GlobalRegion regionPos = regionPair.first;
auto &voxels = regionPair.second.first;
auto &nodes = regionPair.second.second;
for(auto &chunkPair : voxels) {
const Pos::bvec4u chunkPos = chunkPair.first;
const std::u8string &compressed = chunkPair.second;
Pos::GlobalChunk globalPos = (Pos::GlobalChunk) regionPos;
globalPos <<= 2;
globalPos += (Pos::GlobalChunk) chunkPos;
const size_t size = 1 + sizeof(WorldId_t)
+ sizeof(Pos::GlobalChunk::Pack)
+ sizeof(uint32_t)
+ compressed.size();
checkPacketBorder(static_cast<uint16_t>(std::min<size_t>(size, 64000)));
NextPacket << (uint8_t) ToClient::ChunkVoxels
<< worldId << globalPos.pack() << uint32_t(compressed.size());
NextPacket.write((const std::byte*) compressed.data(), compressed.size());
}
for(auto &chunkPair : nodes) {
const Pos::bvec4u chunkPos = chunkPair.first;
const std::u8string &compressed = chunkPair.second;
Pos::GlobalChunk globalPos = (Pos::GlobalChunk) regionPos;
globalPos <<= 2;
globalPos += (Pos::GlobalChunk) chunkPos;
const size_t size = 1 + sizeof(WorldId_t)
+ sizeof(Pos::GlobalChunk::Pack)
+ sizeof(uint32_t)
+ compressed.size();
checkPacketBorder(static_cast<uint16_t>(std::min<size_t>(size, 64000)));
NextPacket << (uint8_t) ToClient::ChunkNodes
<< worldId << globalPos.pack() << uint32_t(compressed.size());
NextPacket.write((const std::byte*) compressed.data(), compressed.size());
}
}
}
ChunksToSend.clear();
}
void RemoteClient::NetworkAndResource_t::prepareEntitiesUpdate(const std::vector<std::tuple<ServerEntityId_t, const Entity*>>& entities) void RemoteClient::NetworkAndResource_t::prepareEntitiesUpdate(const std::vector<std::tuple<ServerEntityId_t, const Entity*>>& entities)
{ {
// for(auto& [entityId, entity] : entities) { // for(auto& [entityId, entity] : entities) {
@@ -337,6 +400,7 @@ ResourceRequest RemoteClient::pushPreparedPackets() {
{ {
auto lock = NetworkAndResource.lock(); auto lock = NetworkAndResource.lock();
lock->flushChunksToPackets();
if(lock->NextPacket.size()) if(lock->NextPacket.size())
lock->SimplePackets.push_back(std::move(lock->NextPacket)); lock->SimplePackets.push_back(std::move(lock->NextPacket));

View File

@@ -233,6 +233,8 @@ class RemoteClient {
ChunksToSend[worldId][regionPos].second[chunkPos] = compressed_nodes; ChunksToSend[worldId][regionPos].second[chunkPos] = compressed_nodes;
} }
void flushChunksToPackets();
void prepareEntitiesRemove(const std::vector<ServerEntityId_t>& entityId); void prepareEntitiesRemove(const std::vector<ServerEntityId_t>& entityId);
void prepareRegionsRemove(WorldId_t worldId, std::vector<Pos::GlobalRegion> regionPoses); void prepareRegionsRemove(WorldId_t worldId, std::vector<Pos::GlobalRegion> regionPoses);
void prepareWorldRemove(WorldId_t worldId); void prepareWorldRemove(WorldId_t worldId);