From 62959a36b29dffe81df0e2e37f8e7dd70a0f5661 Mon Sep 17 00:00:00 2001 From: DrSocalkwe3n Date: Thu, 10 Jul 2025 17:06:53 +0600 Subject: [PATCH] * --- CMakeLists.txt | 9 +- Cache/db.sqlite3 | Bin 0 -> 12288 bytes Src/Client/ServerSession.cpp | 12 +- Src/Client/Vulkan/VertexPool.hpp | 30 +- Src/Client/Vulkan/Vulkan.cpp | 15 + Src/Client/Vulkan/VulkanRenderSession.cpp | 19 +- Src/Common/Abstract.hpp | 2 +- Src/Common/Packets.hpp | 28 +- Src/Server/ContentEventController.cpp | 16 +- Src/Server/ContentEventController.hpp | 21 + Src/Server/GameServer.cpp | 119 +- Src/Server/GameServer.hpp | 27 +- Src/Server/RemoteClient.cpp | 45 +- assets/textures/8.png | Bin 0 -> 5940 bytes assets/textures/grass.png | Bin 10253 -> 14212 bytes assets/textures/grass.png~ | Bin 0 -> 10253 bytes assets/textures/tropical_rainforest_wood.png | Bin 2089 -> 1453 bytes assets/textures/willow_wood.png | Bin 1453 -> 2089 bytes assets/textures/xnether_blue_wood.png | Bin 5940 -> 6101 bytes assets/textures/xnether_purple_wood.png | Bin 6101 -> 10253 bytes log.raw | 1798 ++++++++++++++++++ 21 files changed, 2053 insertions(+), 88 deletions(-) create mode 100644 Cache/db.sqlite3 create mode 100644 assets/textures/8.png create mode 100644 assets/textures/grass.png~ create mode 100644 log.raw diff --git a/CMakeLists.txt b/CMakeLists.txt index 047b755..6a9a444 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,9 +17,14 @@ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections") # -rdy # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") # sanitizer -# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") +# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=null -fno-sanitize=alignment") +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=null -fno-sanitize=alignment -fsanitize=address -fno-omit-frame-pointer") +# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=null -fno-sanitize=alignment -fsanitize=address") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address,undefined -fno-omit-frame-pointer -fno-sanitize-recover=all") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address,undefined") project(LuaVox VERSION 0.0 DESCRIPTION "LuaVox Description") diff --git a/Cache/db.sqlite3 b/Cache/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..23e5b5b6fc9c17d674e8be208e79531889b91e98 GIT binary patch literal 12288 zcmeI#Jxjwt7zgmXDk_D(Y+0W%0V~*|n_wduiXo+%%puY%29j32ixf90`0d>KVH~}S zNfyC6m;VFz@+5hVyI-cepZTd0v{=35iJ}qfGtSvH5o3(&cA#4wCO@nbJ(_%1aCY|L zbb4Q`)!nl0w)eTK0Pi6H0SG_<0uX=z1Rwwb2tWV={}p(D<;Rv~@y)GD9x|~=Ga<{a zb#v#9Lyy9->w8o_vfEUJd`yNHmvu(u`cu~)4IT3&n1&QYzJIFcg8?-)St3n$sa42{gU~RF9&n4KQW#i)Adb+i+6AOHafKmY;|fB*y_009U<00O1JH&mHa1poj5 literal 0 HcmV?d00001 diff --git a/Src/Client/ServerSession.cpp b/Src/Client/ServerSession.cpp index 9110ad3..a5ca791 100644 --- a/Src/Client/ServerSession.cpp +++ b/Src/Client/ServerSession.cpp @@ -286,6 +286,7 @@ void ServerSession::atFreeDrawTime(GlobalTime gTime, float dTime) { Node *nodes = (Node*) Data.Worlds[p.Id].Regions[rPos].Chunks[cPos.x][cPos.y][cPos.z].Nodes; std::copy((const Node*) p.Nodes, ((const Node*) p.Nodes)+16*16*16, nodes); + auto &pair = changeOrAddList_removeList[p.Id]; std::get<0>(pair).insert(p.Pos); } else if(l2 == ToClient::L2Content::RemoveRegion) { @@ -293,11 +294,12 @@ void ServerSession::atFreeDrawTime(GlobalTime gTime, float dTime) { auto ®ions = Data.Worlds[p.Id].Regions; auto obj = regions.find(p.Pos); - assert(obj != regions.end()); - regions.erase(obj); + if(obj != regions.end()) { + regions.erase(obj); - auto &pair = changeOrAddList_removeList[p.Id]; - std::get<1>(pair).insert(p.Pos); + auto &pair = changeOrAddList_removeList[p.Id]; + std::get<1>(pair).insert(p.Pos); + } } } @@ -583,7 +585,7 @@ coro<> ServerSession::rP_Content(Net::AsyncSocket &sock) { co_return; case ToClient::L2Content::RemoveRegion: { - WorldId_t wcId = co_await sock.read(); + WorldId_t wcId = co_await sock.read(); Pos::GlobalChunk pos; pos.unpack(co_await sock.read()); diff --git a/Src/Client/Vulkan/VertexPool.hpp b/Src/Client/Vulkan/VertexPool.hpp index 1b47157..149f295 100644 --- a/Src/Client/Vulkan/VertexPool.hpp +++ b/Src/Client/Vulkan/VertexPool.hpp @@ -14,6 +14,7 @@ namespace LV::Client::VK { Получаемые вершины сначала пишутся в общий буфер, потом передаются на устройство */ +// Нужна реализация индексного буфера template class VertexPool { static constexpr size_t HC_Buffer_Size = size_t(PerBlock)*size_t(PerPool); @@ -63,8 +64,9 @@ private: // Пишем в общий буфер, TasksWait Vertex *ptr = HCPtr+WritePos; std::copy(data.begin(), data.end(), ptr); + size_t count = data.size(); TasksWait.push({std::move(data), WritePos, poolId, blockId}); - WritePos += data.size(); + WritePos += count; } else { // Отложим запись на следующий такт TasksPostponed.push(Task(std::move(data), -1, poolId, blockId)); @@ -219,7 +221,9 @@ public: void update(VkCommandPool commandPool) { if(TasksWait.empty()) return; - + + assert(WritePos); + VkCommandBufferAllocateInfo allocInfo { VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, @@ -240,6 +244,28 @@ public: vkBeginCommandBuffer(commandBuffer, &beginInfo); + VkBufferMemoryBarrier barrier = { + VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, + nullptr, + VK_ACCESS_HOST_WRITE_BIT, + VK_ACCESS_TRANSFER_READ_BIT, + VK_QUEUE_FAMILY_IGNORED, + VK_QUEUE_FAMILY_IGNORED, + HostCoherent.getBuffer(), + 0, + WritePos*sizeof(Vertex) + }; + + vkCmdPipelineBarrier( + commandBuffer, + VK_PIPELINE_STAGE_HOST_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, + 0, nullptr, + 1, &barrier, + 0, nullptr + ); + while(!TasksWait.empty()) { Task& task = TasksWait.front(); diff --git a/Src/Client/Vulkan/Vulkan.cpp b/Src/Client/Vulkan/Vulkan.cpp index 8388321..ffd93bb 100644 --- a/Src/Client/Vulkan/Vulkan.cpp +++ b/Src/Client/Vulkan/Vulkan.cpp @@ -7,6 +7,7 @@ #include "Client/ServerSession.hpp" #include "Common/Async.hpp" #include "Common/Net.hpp" +#include "TOSLib.hpp" #include "assets.hpp" #include "imgui.h" #include @@ -216,6 +217,7 @@ void Vulkan::run() } else if (err == VK_SUBOPTIMAL_KHR) { LOGGER.debug() << "VK_SUBOPTIMAL_KHR Pre"; + continue; } else if(err == VK_SUCCESS) { Screen.State = DrawState::Drawing; @@ -2079,6 +2081,17 @@ void Vulkan::gui_MainMenu() { ImGui::InputText("Username", ConnectionProgress.Username, sizeof(ConnectionProgress.Username)); ImGui::InputText("Password", ConnectionProgress.Password, sizeof(ConnectionProgress.Password), ImGuiInputTextFlags_Password); + static bool flag = false; + if(!flag) { + flag = true; + Game.Server = std::make_unique(IOC); + ConnectionProgress.Progress = "Сервер запущен на порту " + std::to_string(Game.Server->LS.getPort()); + ConnectionProgress.InProgress = true; + ConnectionProgress.Cancel = false; + ConnectionProgress.Progress.clear(); + co_spawn(ConnectionProgress.connect(IOC)); + } + if(!ConnectionProgress.InProgress && !ConnectionProgress.Socket) { if(ImGui::Button("Подключиться")) { ConnectionProgress.InProgress = true; @@ -3510,6 +3523,8 @@ void DynamicImage::changeData(int32_t x, int32_t y, uint16_t width, uint16_t hei // Выполняем все команды buffer.execute(); + Time::sleep3(50); + // Удаляем не нужную картинку vkDestroyImage(Instance->Graphics.Device, tempImage, nullptr); vkFreeMemory(Instance->Graphics.Device, tempMemory, nullptr); diff --git a/Src/Client/Vulkan/VulkanRenderSession.cpp b/Src/Client/Vulkan/VulkanRenderSession.cpp index cee62e7..e052601 100644 --- a/Src/Client/Vulkan/VulkanRenderSession.cpp +++ b/Src/Client/Vulkan/VulkanRenderSession.cpp @@ -197,12 +197,18 @@ void VulkanRenderSession::init(Vulkan *instance) { return true; }); + { + uint16_t texId = VKCTX->MainTest.atlasAddTexture(2, 2); + uint32_t colors[4] = {0xfffffffful, 0x00fffffful, 0xffffff00ul, 0xff00fffful}; + VKCTX->MainTest.atlasChangeTextureData(texId, (const uint32_t*) colors); + } + int width, height; bool hasAlpha; for(const char *path : { "grass.png", - "tropical_rainforest_wood.png", "willow_wood.png", + "tropical_rainforest_wood.png", "xnether_blue_wood.png", "xnether_purple_wood.png" }) { @@ -617,12 +623,6 @@ void VulkanRenderSession::onChunksChange(WorldId_t worldId, const std::unordered auto &table = External.ChunkVoxelMesh[worldId]; for(Pos::GlobalChunk pos : changeOrAddList) { - if(pos.y < 0) { - int g = 0; - g++; - } - - Pos::GlobalRegion rPos = pos >> 2; Pos::bvec4u cPos = pos & 0x3; @@ -639,6 +639,7 @@ void VulkanRenderSession::onChunksChange(WorldId_t worldId, const std::unordered } std::vector vertexs2 = generateMeshForNodeChunks(chunk.Nodes); + if(vertexs2.empty()) { VKCTX->VertexPool_Nodes.dropVertexs(std::get<1>(buffers)); } else { @@ -697,7 +698,7 @@ void VulkanRenderSession::drawWorld(GlobalTime gTime, float dTime, VkCommandBuff // Сместить в координаты игрока, повернуть относительно взгляда проецировать на экран // Изначально взгляд в z-1 PCO.ProjView = glm::mat4(1); - PCO.ProjView = glm::translate(PCO.ProjView, -glm::vec3(Pos)/float(Pos::Object_t::BS)); + PCO.ProjView = glm::translate(PCO.ProjView, -glm::vec3(Pos.z, Pos.y, Pos.x)/float(Pos::Object_t::BS)); PCO.ProjView = proj*glm::mat4(Quat)*PCO.ProjView; PCO.Model = glm::mat4(1); @@ -771,7 +772,7 @@ void VulkanRenderSession::drawWorld(GlobalTime gTime, float dTime, VkCommandBuff for(auto &pair : iterWorld->second) { if(auto& nodes = std::get<1>(pair.second)) { - glm::vec3 cpos(pair.first.x, pair.first.y, pair.first.z); + glm::vec3 cpos(pair.first.z, pair.first.y, pair.first.x); PCO.Model = glm::translate(orig, cpos*16.f); auto [vkBuffer, offset] = VKCTX->VertexPool_Nodes.map(nodes); diff --git a/Src/Common/Abstract.hpp b/Src/Common/Abstract.hpp index 93a6678..6dd0017 100644 --- a/Src/Common/Abstract.hpp +++ b/Src/Common/Abstract.hpp @@ -375,7 +375,7 @@ struct Object_t { static glm::vec3 asFloatVec(const Object &obj) { return glm::vec3(float(obj[0])/float(BS), float(obj[1])/float(BS), float(obj[2])/float(BS)); } static GlobalNode asNodePos(const Object &obj) { return (GlobalNode) (obj >> BS_Bit); } static GlobalChunk asChunkPos(const Object &obj) { return (GlobalChunk) (obj >> BS_Bit >> 4); } - static GlobalRegion asRegionsPos(const Object &obj) { return (GlobalRegion) (obj >> BS_Bit >> 8); } + static GlobalRegion asRegionsPos(const Object &obj) { return (GlobalRegion) (obj >> BS_Bit >> 6); } }; } diff --git a/Src/Common/Packets.hpp b/Src/Common/Packets.hpp index 9a4e3e8..8deb7bc 100644 --- a/Src/Common/Packets.hpp +++ b/Src/Common/Packets.hpp @@ -24,22 +24,28 @@ struct PacketQuat { z = (quat.z+1)/2*0x3ff, w = (quat.w+1)/2*0x3ff; - for(uint8_t &val : Data) - val = 0; + uint64_t value = 0; - *(uint16_t*) Data |= x; - *(uint16_t*) (Data+1) |= y << 2; - *(uint16_t*) (Data+2) |= z << 4; - *(uint16_t*) (Data+3) |= w << 6; + value |= x & 0x3ff; + value |= uint64_t(y & 0x3ff) << 10; + value |= uint64_t(z & 0x3ff) << 20; + value |= uint64_t(w & 0x3ff) << 30; + + for(int iter = 0; iter < 5; iter++) + Data[iter] = (value >> (iter * 8)) & 0xff; } glm::quat toQuat() const { - const uint64_t &data = (const uint64_t&) *Data; + uint64_t value = 0; + + for(int iter = 0; iter < 5; iter++) + value |= (Data[iter] >> (iter*10)) & 0x3ff; + uint16_t - x = data & 0x3ff, - y = (data >> 10) & 0x3ff, - z = (data >> 20) & 0x3ff, - w = (data >> 30) & 0x3ff; + x = value & 0x3ff, + y = (value >> 10) & 0x3ff, + z = (value >> 20) & 0x3ff, + w = (value >> 30) & 0x3ff; float fx = (float(x)/0x3ff)*2-1; float fy = (float(y)/0x3ff)*2-1; diff --git a/Src/Server/ContentEventController.cpp b/Src/Server/ContentEventController.cpp index 5c0b73f..5e17a2d 100644 --- a/Src/Server/ContentEventController.cpp +++ b/Src/Server/ContentEventController.cpp @@ -11,6 +11,7 @@ namespace LV::Server { ContentEventController::ContentEventController(std::unique_ptr &&remote) : Remote(std::move(remote)) { + LastPos = Pos = {0, Remote->CameraPos}; } uint16_t ContentEventController::getViewRangeBackground() const { @@ -18,11 +19,11 @@ uint16_t ContentEventController::getViewRangeBackground() const { } ServerObjectPos ContentEventController::getLastPos() const { - return {0, Remote->CameraPos}; + return LastPos; } ServerObjectPos ContentEventController::getPos() const { - return {0, Remote->CameraPos}; + return Pos; } void ContentEventController::removeUnobservable(const ContentViewInfo_Diff& diff) { @@ -97,4 +98,15 @@ void ContentEventController::onPortalUpdates(const std::vector &portals) } +void ContentEventController::onUpdate() { + LastPos = Pos; + Pos.ObjectPos = Remote->CameraPos; + + Pos::GlobalRegion r1 = LastPos.ObjectPos >> 12 >> 4 >> 2; + Pos::GlobalRegion r2 = Pos.ObjectPos >> 12 >> 4 >> 2; + if(r1 != r2) { + CrossedBorder = true; + } +} + } \ No newline at end of file diff --git a/Src/Server/ContentEventController.hpp b/Src/Server/ContentEventController.hpp index a8a0295..139e55d 100644 --- a/Src/Server/ContentEventController.hpp +++ b/Src/Server/ContentEventController.hpp @@ -2,6 +2,7 @@ #include #include "Abstract.hpp" +#include "TOSLib.hpp" #include #include #include @@ -56,6 +57,10 @@ struct ContentViewInfo { if(iterWorld == obj.Regions.end()) { out.WorldsNew.push_back(key); out.RegionsNew[key] = regions; + + for(const Pos::GlobalRegion& rp : regions) { + TOS::Logger("New").debug() << rp.x << ' ' << rp.y << ' ' << rp.z; + } } else { auto &vec = out.RegionsNew[key]; vec.reserve(8*8); @@ -64,6 +69,10 @@ struct ContentViewInfo { iterWorld->second.begin(), iterWorld->second.end(), std::back_inserter(vec) ); + + for(Pos::GlobalRegion& rp : vec) { + TOS::Logger("New").debug() << rp.x << ' ' << rp.y << ' ' << rp.z; + } } } @@ -74,6 +83,10 @@ struct ContentViewInfo { if(iterWorld == Regions.end()) { out.WorldsLost.push_back(key); out.RegionsLost[key] = regions; + + for(const Pos::GlobalRegion& rp : regions) { + TOS::Logger("Lost").debug() << rp.x << ' ' << rp.y << ' ' << rp.z; + } } else { auto &vec = out.RegionsLost[key]; vec.reserve(8*8); @@ -82,6 +95,10 @@ struct ContentViewInfo { iterWorld->second.begin(), iterWorld->second.end(), std::back_inserter(vec) ); + + for(Pos::GlobalRegion& rp : vec) { + TOS::Logger("Lost").debug() << rp.x << ' ' << rp.y << ' ' << rp.z; + } } } @@ -135,6 +152,8 @@ public: // Если игрок пересекал границы чанка (для перерасчёта ContentViewState) bool CrossedBorder = true; + ServerObjectPos Pos, LastPos; + public: ContentEventController(std::unique_ptr&& remote); @@ -160,6 +179,8 @@ public: inline const SubscribedObj& getSubscribed() { return Subscribed; }; + void onUpdate(); + }; } diff --git a/Src/Server/GameServer.cpp b/Src/Server/GameServer.cpp index 6afa280..75fd472 100644 --- a/Src/Server/GameServer.cpp +++ b/Src/Server/GameServer.cpp @@ -39,6 +39,11 @@ GameServer::GameServer(asio::io_context &ioc, fs::path worldPath) for(size_t iter = 0; iter < BackingNoiseGenerator.Threads.size(); iter++) { BackingNoiseGenerator.Threads[iter] = std::thread(&BackingNoiseGenerator_t::run, &BackingNoiseGenerator, iter); } + + BackingAsyncLua.Threads.resize(2); + for(size_t iter = 0; iter < BackingAsyncLua.Threads.size(); iter++) { + BackingAsyncLua.Threads[iter] = std::thread(&BackingAsyncLua_t::run, &BackingAsyncLua, iter); + } } GameServer::~GameServer() { @@ -46,6 +51,7 @@ GameServer::~GameServer() { BackingChunkPressure.NeedShutdown = true; BackingChunkPressure.Symaphore.notify_all(); BackingNoiseGenerator.NeedShutdown = true; + BackingAsyncLua.NeedShutdown = true; RunThread.join(); WorkDeadline.cancel(); @@ -53,6 +59,7 @@ GameServer::~GameServer() { BackingChunkPressure.stop(); BackingNoiseGenerator.stop(); + BackingAsyncLua.stop(); LOG.info() << "Сервер уничтожен"; } @@ -227,7 +234,7 @@ void GameServer::BackingChunkPressure_t::run(int id) { for(auto& [chunkPos, chunk] : region.Nodes) { CompressedNodes cmp = compressNodes(chunk.data()); Pos::GlobalChunk chunkPosR = (Pos::GlobalChunk(regionPos) << 2) + chunkPos; - + for(auto& ptr : region.NewCECs) { bool accepted = ptr->Remote->maybe_prepareChunkUpdate_Nodes(worldId, chunkPosR, cmp.Compressed, cmp.Defines); @@ -369,6 +376,64 @@ void GameServer::BackingNoiseGenerator_t::run(int id) { } +void GameServer::BackingAsyncLua_t::run(int id) { + LOG.debug() << "Старт потока " << id; + + BackingNoiseGenerator_t::NoiseKey key; + std::array noise; + World::RegionIn out; + + try { + while(true) { + if(NeedShutdown) { + LOG.debug() << "Завершение выполнения потока " << id; + break; + } + + if(NoiseIn.get_read().empty()) + TOS::Time::sleep3(50); + + { + auto lock = NoiseIn.lock(); + if(lock->empty()) + continue; + + key = lock->front().first; + noise = lock->front().second; + lock->pop(); + } + + { + for(int z = 0; z < 64; z++) + for(int y = 0; y < 64; y++) + for(int x = 0; x < 64; x++) { + // DefVoxelId_t id = *ptr > 0.9 ? 1 : 0; + Pos::bvec64u nodePos(x, y, z); + auto &node = out.Nodes[Pos::bvec4u(nodePos >> 4).pack()][Pos::bvec16u(nodePos & 0xf).pack()]; + // node.NodeId = id; + // node.Meta = 0; + + if(x == 0 && z == 0) + node.NodeId = 1; + else if(y == 0 && z == 0) + node.NodeId = 2; + else if(x == 0 && y == 0) + node.NodeId = 3; + else + node.NodeId = 0; + + node.Meta = 0; + } + } + + RegionOut.lock()->push_back({key, out}); + } + } catch(const std::exception& exc) { + NeedShutdown = true; + LOG.error() << "Ошибка выполнения потока " << id << ":\n" << exc.what(); + } +} + static thread_local std::vector TL_Circles; std::vector GameServer::Expanse_t::accumulateContentViewCircles(ContentViewCircle circle, int depth) @@ -462,7 +527,7 @@ ContentViewInfo GameServer::Expanse_t::makeContentViewInfo(const std::vector newCVCs = Expanse.accumulateContentViewCircles(cvc); @@ -831,46 +896,32 @@ void GameServer::stepGeneratorAndLuaAsync(IWorldSaveBackend::TickSyncInfo_Out db // Синхронизация с генератором шума - std::vector>> calculatedNoise = BackingNoiseGenerator.tickSync(std::move(db.NotExisten)); - + std::unordered_map>> toLoadRegions; // Синхронизация с контроллером асинхронных обработчиков луа // 2.2 и 3.1 // Обработка шума на стороне луа - for(auto& [key, region] : calculatedNoise) { - auto &obj = toLoadRegions[key.WId].emplace_back(key.RegionPos, World::RegionIn()).second; - float *ptr = ®ion[0]; + { + std::vector>> calculatedNoise = BackingNoiseGenerator.tickSync(std::move(db.NotExisten)); + if(!calculatedNoise.empty()) { + auto lock = BackingAsyncLua.NoiseIn.lock(); - { - Node node; - node.Data = 0; - std::fill((Node*) obj.Nodes.data(), ((Node*) obj.Nodes.data())+64*64*64, node); + for(auto& pair : calculatedNoise) + lock->push(pair); } - if((key.RegionPos.x == 0 || key.RegionPos.x == 0) && key.RegionPos.y == 0 && key.RegionPos.z == 0) { - for(int z = 0; z < 64; z++) - for(int y = 0; y < 64; y++) - for(int x = 0; x < 64; x++, ptr++) { - // DefVoxelId_t id = *ptr > 0.9 ? 1 : 0; - Pos::bvec64u nodePos(x, y, z); - auto &node = obj.Nodes[Pos::bvec4u(nodePos >> 4).pack()][Pos::bvec16u(nodePos & 0xf).pack()]; - // node.NodeId = id; - // node.Meta = 0; + calculatedNoise.clear(); - if( - (y == 0 && z == 0) - // || (x == 0 && z == 0) - // || (x == 0 && y == 0) - ) { - if(x+y+z <= 18) - node.NodeId = (((x+y+z)/3)%3)+1; - } - - node.Meta = 0; + if(!BackingAsyncLua.RegionOut.get_read().empty()) { + std::vector< + std::pair + > toLoad = std::move(*BackingAsyncLua.RegionOut.lock()); + + for(auto& [key, region] : toLoad) { + toLoadRegions[key.WId].push_back({key.RegionPos, region}); } } - // obj.Nodes[0][0].NodeId = 1; } // Обработка идентификаторов на стороне луа @@ -1369,6 +1420,10 @@ void GameServer::stepGlobalStep() { } void GameServer::stepSyncContent() { + for(std::shared_ptr& cec : Game.CECs) { + cec->onUpdate(); + } + // Оповещения о ресурсах и профилях Content.Texture.update(CurrentTickDuration); if(Content.Texture.hasPreparedInformation()) { diff --git a/Src/Server/GameServer.hpp b/Src/Server/GameServer.hpp index f74ec0f..608e2a2 100644 --- a/Src/Server/GameServer.hpp +++ b/Src/Server/GameServer.hpp @@ -10,6 +10,7 @@ #include "RemoteClient.hpp" #include "Server/Abstract.hpp" #include +#include #include #include #include @@ -122,9 +123,6 @@ class GameServer : public AsyncObject { /* Обязательно между тактами - Генерация шума - OpenCL или пул - Конвертация ресурсов игры, их хранение в кеше и загрузка в память для отправки клиентам io_uring или последовательное чтение @@ -184,6 +182,9 @@ class GameServer : public AsyncObject { void run(int id); } BackingChunkPressure; + /* + Генератор шума + */ struct BackingNoiseGenerator_t { struct NoiseKey { WorldId_t WId; @@ -225,6 +226,26 @@ class GameServer : public AsyncObject { } } BackingNoiseGenerator; + /* + Обработчик асинронного луа + */ + struct BackingAsyncLua_t { + TOS::Logger LOG = "BackingAsyncLua"; + bool NeedShutdown = false; + std::vector Threads; + TOS::SpinlockObject>>> NoiseIn; + TOS::SpinlockObject>> RegionOut; + + void stop() { + NeedShutdown = true; + + for(std::thread& thread : Threads) + thread.join(); + } + + void run(int id); + } BackingAsyncLua; + public: GameServer(asio::io_context &ioc, fs::path worldPath); virtual ~GameServer(); diff --git a/Src/Server/RemoteClient.cpp b/Src/Server/RemoteClient.cpp index 89480d2..452d706 100644 --- a/Src/Server/RemoteClient.cpp +++ b/Src/Server/RemoteClient.cpp @@ -237,26 +237,26 @@ void RemoteClient::prepareRegionRemove(WorldId_t worldId, Pos::GlobalRegion regi assert(iterWorld != ResUses.RefChunk.end()); auto iterRegion = iterWorld->second.find(regionPos); - assert(iterRegion != iterWorld->second.end()); - - for(const auto &iterChunk : iterRegion->second) { - for(const DefVoxelId_t& id : iterChunk.Voxel) { - auto iter = ResUses.DefVoxel.find(id); - assert(iter != ResUses.DefVoxel.end()); // Воксель должен быть в зависимостях - if(--iter->second == 0) { - // Вокселя больше нет в зависимостях - lostTypesV.push_back(id); - ResUses.DefVoxel.erase(iter); + if(iterRegion != iterWorld->second.end()) { + for(const auto &iterChunk : iterRegion->second) { + for(const DefVoxelId_t& id : iterChunk.Voxel) { + auto iter = ResUses.DefVoxel.find(id); + assert(iter != ResUses.DefVoxel.end()); // Воксель должен быть в зависимостях + if(--iter->second == 0) { + // Вокселя больше нет в зависимостях + lostTypesV.push_back(id); + ResUses.DefVoxel.erase(iter); + } } - } - for(const DefNodeId_t& id : iterChunk.Node) { - auto iter = ResUses.DefNode.find(id); - assert(iter != ResUses.DefNode.end()); // Нода должна быть в зависимостях - if(--iter->second == 0) { - // Ноды больше нет в зависимостях - lostTypesN.push_back(id); - ResUses.DefNode.erase(iter); + for(const DefNodeId_t& id : iterChunk.Node) { + auto iter = ResUses.DefNode.find(id); + assert(iter != ResUses.DefNode.end()); // Нода должна быть в зависимостях + if(--iter->second == 0) { + // Ноды больше нет в зависимостях + lostTypesN.push_back(id); + ResUses.DefNode.erase(iter); + } } } } @@ -663,9 +663,12 @@ coro<> RemoteClient::rP_System(Net::AsyncSocket &sock) { } case ToServer::L2System::Test_CAM_PYR_POS: { - CameraPos.x = co_await sock.read(); - CameraPos.y = co_await sock.read(); - CameraPos.z = co_await sock.read(); + Pos::Object newPos; + newPos.x = co_await sock.read(); + newPos.y = co_await sock.read(); + newPos.z = co_await sock.read(); + + CameraPos = newPos; for(int iter = 0; iter < 5; iter++) CameraQuat.Data[iter] = co_await sock.read(); diff --git a/assets/textures/8.png b/assets/textures/8.png new file mode 100644 index 0000000000000000000000000000000000000000..6a989b8d2aa94ca8c23e4cd1fc43a1f832f68271 GIT binary patch literal 5940 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 literal 0 HcmV?d00001 diff --git a/assets/textures/grass.png b/assets/textures/grass.png index 3ec069ce303798e6c58657e59686b681b19d768c..4b48a99b87611000f95bb0cf6dd09a4aebf35e37 100644 GIT binary patch literal 14212 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 literal 10253 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 T2w=;e00000NkvXXu0mjfFoh(3 diff --git a/assets/textures/grass.png~ b/assets/textures/grass.png~ new file mode 100644 index 0000000000000000000000000000000000000000..3ec069ce303798e6c58657e59686b681b19d768c GIT binary patch literal 10253 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 T2w=;e00000NkvXXu0mjfFoh(3 literal 0 HcmV?d00001 diff --git a/assets/textures/tropical_rainforest_wood.png b/assets/textures/tropical_rainforest_wood.png index 6107044abdf71dcb7dd08e93001b800a04b1cddc..af57e116b29c54ac1866ab4041091b68d8dcec6b 100644 GIT binary patch literal 1453 zcmV;e1ycHnP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00k9EL_t(Y$4ypSjx0+Jj0n4W z<^V#v3t*RQg{`nA{*VA&&UB?C_;Ae;_0`HQS7ye`=HLJJ*H>L6DRkF)ABoqil_5#u zzK;#I0LCHkzP|{)uIrq)gCKE8h)iToKdAcncqN{h*a5@_WSFAJfC0KI_SZdo3j#zESAZmd_Kze0fFBo;ovI-?#pqH<9alB}M|2B$6}7K}k+X5|I!n z5#k_rYybwBBryO0qyjkVtB4q}#N-6u2xk%s>Fz9VNe}@n5%~UMK!HT)c+SB}o*_h{ z|MAb?_w@u4i07dg2ZUCT9v~FNUOoUUnMvRTA(fZ_RC#X9{?m)csS=X98o|oFkWk+> z1lk?|AgV;dW08^)lLQEaA*KKP_g%`2dyjMVD#zMGg-F6jg-J*ZsJ`Ghb2}tSP2w}~ zbkzh1kO8Jjy#OWs`uJEV?R=xNWL7*`tU<&c;{kmD7y&?V$-vf!j<443kVUacFbSio z1q1+iamgef-=YvFAPW={APyuF2r%akwy2$4g|QuX5{dD89isk^yx^DRsy0a|1+bl< z_FY00yA8$$f!H>JF17DBgsyU;0F+~ZRXS%V#d%-@D1l`B>h@m3D=;SzX)+EIus{NA zKGMu}2`rU}24M%h1fyhI!aXdo#d87%9v~%-olxAwMo6Lpf~us)~NcHov@{4-mr{vM4)?(10TCoc`@cQzQk1`|FAI1%^&U1}G7rL!c8gAhRk+ zwmMrv^ch1%swd!BM3V6VP!eJQR7nIdWD*Z0oikpgWqVYrw0%g+5c9+!SVViKM8_gt zt?#5z0x|-yIwUC+Qy0ec7(~@0*^rs4Uyx=a1K{hi_qJhxL zr#ur3fnv^gM_RSoPeVn}fBq~yJPpYz0g1;+$u>f$x64K3Qwgl$fk;AfpILxKRf(j* zndyO$2|3Q3$xVDyEzWkG9Bf-%8^!6?Zbk|?8>tCY0=%&cvAY`QC#9Klb$`C3D%*)k z&73FXvq8^s1e*Lhv5nl-rDtRl65h6F9S3lXMt>Nnt7hyN25gFiyRUdWCxF3LwIBhi zotbtjwS64Kud8iKrBa~S6naca_e^HTkOQE*OZ0sUNifNrv5`fbo-aJ9(#P%S| z;E<>yfo@TXx>Azp83HPLOfm+mI}v-w+r$97x?6T;=ALM4ZQDD&Rq?*lg|;*S$#d>Y zbv%h_Fi0$^SzzMBXGYSF0)VbpmpvYGhgbr5-|r0@P`C3xEV62Em3akY00000NkvXX Hu0mjf;RJOC literal 2089 zcmV+^2-f$BP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvw&N%a{bv=u1SBzt5ldK!h^Fr+lj?|33LTPOjgybCe_vsIgSQ+mYkb7aH@XF*@BtXCh5>J6_WR670qXM4{L(1Z~00Q!!8@yyE5&({JpBvvq8e`e>RHJ4A z2rmIkO94;@Rt|*?{E1G%q3p#w?|tymt4}@$2`=~$LJYn5T9U6s;Q~w#!VXP zL<=o8ZK>srHc)AEo8Q6~H{H^fcTjDY-R*u4d)#$Tdp=PkGhuzXKSzxY)OaA(2gVaM zd>Z3nf_gde9Wx-tj(~XV2!PPsF|$g}vFXrt%xprL6VLF{cW@eY#DJjNi2Y6{c3;Rn z;bxrsBi#5v&UEPh26CoDcZ1w3Zf{U)eYdGr%s{9w!=6+tSbq3iGi%-j-#8xazQ0Wg z`t^qMlp7w%OUic3Y`U7XYx?GMCtDtdu(qb1B1~o20j{IZpybX$rxdu{TP1>E`xwpt zKb5&E>M)X2uQA0oMrfev3AV-26Q)b%(UmZ}Htd&YZfZWwWTxP<&vjE zcuY!WocQ8mX}x%F>|I!QvifOMtG4MvcCc@5COBo7URll4Pmg*t*OGO*>c6MBjWU9R z4i3Xpd9KlOmyor5i_l}4$*atG8O%3*z{jY+D>5sg#)gS8Hh2zh@-8QfEq=VEX>4Tx0C=2zkv&MmKpe$i(@I4u3U&~6$WWauh>AFB6^c+H)C#RSm|XfHG-*gu zTpR`0f`cE6RR=bb;{*sk16O*>U#SDrpQP7X zTI>ku*#<7ITbi;5T;Y5-i%B}Z<9Duprtz_jda zt(%q&kOjw~#Ia4{P-do7re%}*)3pd?K)>DOX7-XDctMC^S{Q(#L2J9VmdpPzI3M=- ziz216*8+&ECoiij52{LezW~^)uWFRG$#~-7?wA;+wXrMO=-4exMiq~B%H|;dtWD$# z2>|--X2~2W#iJh(t8&6fDW?8{PzH!W$KmdMJvc-A;sY@C7u-JkobEdaVGzoILB~P6 z7rMNg=OhjqE7FFp7k;B$MvNz3cI&3 diff --git a/assets/textures/willow_wood.png b/assets/textures/willow_wood.png index af57e116b29c54ac1866ab4041091b68d8dcec6b..6107044abdf71dcb7dd08e93001b800a04b1cddc 100644 GIT binary patch literal 2089 zcmV+^2-f$BP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvw&N%a{bv=u1SBzt5ldK!h^Fr+lj?|33LTPOjgybCe_vsIgSQ+mYkb7aH@XF*@BtXCh5>J6_WR670qXM4{L(1Z~00Q!!8@yyE5&({JpBvvq8e`e>RHJ4A z2rmIkO94;@Rt|*?{E1G%q3p#w?|tymt4}@$2`=~$LJYn5T9U6s;Q~w#!VXP zL<=o8ZK>srHc)AEo8Q6~H{H^fcTjDY-R*u4d)#$Tdp=PkGhuzXKSzxY)OaA(2gVaM zd>Z3nf_gde9Wx-tj(~XV2!PPsF|$g}vFXrt%xprL6VLF{cW@eY#DJjNi2Y6{c3;Rn z;bxrsBi#5v&UEPh26CoDcZ1w3Zf{U)eYdGr%s{9w!=6+tSbq3iGi%-j-#8xazQ0Wg z`t^qMlp7w%OUic3Y`U7XYx?GMCtDtdu(qb1B1~o20j{IZpybX$rxdu{TP1>E`xwpt zKb5&E>M)X2uQA0oMrfev3AV-26Q)b%(UmZ}Htd&YZfZWwWTxP<&vjE zcuY!WocQ8mX}x%F>|I!QvifOMtG4MvcCc@5COBo7URll4Pmg*t*OGO*>c6MBjWU9R z4i3Xpd9KlOmyor5i_l}4$*atG8O%3*z{jY+D>5sg#)gS8Hh2zh@-8QfEq=VEX>4Tx0C=2zkv&MmKpe$i(@I4u3U&~6$WWauh>AFB6^c+H)C#RSm|XfHG-*gu zTpR`0f`cE6RR=bb;{*sk16O*>U#SDrpQP7X zTI>ku*#<7ITbi;5T;Y5-i%B}Z<9Duprtz_jda zt(%q&kOjw~#Ia4{P-do7re%}*)3pd?K)>DOX7-XDctMC^S{Q(#L2J9VmdpPzI3M=- ziz216*8+&ECoiij52{LezW~^)uWFRG$#~-7?wA;+wXrMO=-4exMiq~B%H|;dtWD$# z2>|--X2~2W#iJh(t8&6fDW?8{PzH!W$KmdMJvc-A;sY@C7u-JkobEdaVGzoILB~P6 z7rMNg=OhjqE7FFp7k;B$MvNz3cI&3 literal 1453 zcmV;e1ycHnP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00k9EL_t(Y$4ypSjx0+Jj0n4W z<^V#v3t*RQg{`nA{*VA&&UB?C_;Ae;_0`HQS7ye`=HLJJ*H>L6DRkF)ABoqil_5#u zzK;#I0LCHkzP|{)uIrq)gCKE8h)iToKdAcncqN{h*a5@_WSFAJfC0KI_SZdo3j#zESAZmd_Kze0fFBo;ovI-?#pqH<9alB}M|2B$6}7K}k+X5|I!n z5#k_rYybwBBryO0qyjkVtB4q}#N-6u2xk%s>Fz9VNe}@n5%~UMK!HT)c+SB}o*_h{ z|MAb?_w@u4i07dg2ZUCT9v~FNUOoUUnMvRTA(fZ_RC#X9{?m)csS=X98o|oFkWk+> z1lk?|AgV;dW08^)lLQEaA*KKP_g%`2dyjMVD#zMGg-F6jg-J*ZsJ`Ghb2}tSP2w}~ zbkzh1kO8Jjy#OWs`uJEV?R=xNWL7*`tU<&c;{kmD7y&?V$-vf!j<443kVUacFbSio z1q1+iamgef-=YvFAPW={APyuF2r%akwy2$4g|QuX5{dD89isk^yx^DRsy0a|1+bl< z_FY00yA8$$f!H>JF17DBgsyU;0F+~ZRXS%V#d%-@D1l`B>h@m3D=;SzX)+EIus{NA zKGMu}2`rU}24M%h1fyhI!aXdo#d87%9v~%-olxAwMo6Lpf~us)~NcHov@{4-mr{vM4)?(10TCoc`@cQzQk1`|FAI1%^&U1}G7rL!c8gAhRk+ zwmMrv^ch1%swd!BM3V6VP!eJQR7nIdWD*Z0oikpgWqVYrw0%g+5c9+!SVViKM8_gt zt?#5z0x|-yIwUC+Qy0ec7(~@0*^rs4Uyx=a1K{hi_qJhxL zr#ur3fnv^gM_RSoPeVn}fBq~yJPpYz0g1;+$u>f$x64K3Qwgl$fk;AfpILxKRf(j* zndyO$2|3Q3$xVDyEzWkG9Bf-%8^!6?Zbk|?8>tCY0=%&cvAY`QC#9Klb$`C3D%*)k z&73FXvq8^s1e*Lhv5nl-rDtRl65h6F9S3lXMt>Nnt7hyN25gFiyRUdWCxF3LwIBhi zotbtjwS64Kud8iKrBa~S6naca_e^HTkOQE*OZ0sUNifNrv5`fbo-aJ9(#P%S| z;E<>yfo@TXx>Azp83HPLOfm+mI}v-w+r$97x?6T;=ALM4ZQDD&Rq?*lg|;*S$#d>Y zbv%h_Fi0$^SzzMBXGYSF0)VbpmpvYGhgbr5-|r0@P`C3xEV62Em3akY00000NkvXX Hu0mjf;RJOC diff --git a/assets/textures/xnether_blue_wood.png b/assets/textures/xnether_blue_wood.png index 6a989b8d2aa94ca8c23e4cd1fc43a1f832f68271..cd668004c66ad57fc03cd7baf18c1c5847bd27ae 100644 GIT binary patch delta 2497 zcmV;y2|o6;F4ZrPBLW5@ktH90Te9pX4E$#mSppI-u^bF`Rd$f&rvZt1-1BpiagEJj zED3e1<#G2ve?RUoe3&Y`n2O|@v&SdaSh-;!et+6JlaK4HKfDb-=H0o$m#&{3 z{_WppaOP04(1(O^3T2%|BSAub%G3E& zMD)y1ruO#Pl{c+w=`Wcm#`Zv!}bi`lt{*)--P)i}jlu}M5Nvf&kkYi3c=aQ!=wh~Ho zC6!!Cky1;OAW@Q&KLQAUqM2&0rAn=}HTZ0>-0*b6g4Qm+!WFONu6&hCu6nf&`t;aS z&%Jc%wYR||4Cu$mqYN2!w3}{F>5g~0^IdMa>)jqu?FsIQPkQoG9(n514r&VPAIC3H zBSnoDQgdNBsA0AgGeJ{M(!>map^Fd@FB1X~nkQynC`O*hP0W0MWmH9C1eqpggC=4? zFy6%JA;Zq`Msya( z1ATM-fJz|^iK0u0!(ZHNS2b=2Ku+p*iu?X-)sm!xjGd}M7c_&} zAFp}XcEeYUUK5W%bV~5pGUZZ3LF^nP>~h&kIYz}}W=KW!Rj_=ZIJFbZk|Ml?FQ4&_3j<8 zU6iRs-;EJAfzpy9Z_RUQ!mXr<(wx=J111fmfs zY1%kiZpCE-^U$qq9|MoQNX9y{O7bKd--0*2I~i)Td0Db8>)wb!hF?#g%7uEaCJ)u^ zkvB))%CTQT(-2=Qv-*G2qoVcTI-1fE>tS&p#vIPkks9NNSJLMN_uQI)wFk|eyh)Tb z0PyO6HDY5}-ik2|)pUfSsJP1TCQ8v-6`iKwUuE=yQJLL)*CdPW0d*_~_?MK_(`!zr z+REe7n06I(qI-2x!u#x~k`>Ek8_v+fa@|pH$63@n()M zX!a{c%XF^8?o-#bcd3vY`s$+Kw$_7-rWfLWj{qp~Nagm#daBZ&R$i?btg4;8*0|wgze>r0^GBPkVWGysiH)bs~HZfx@IW}QpEi*YVV>vW2 zGht&jG$INhARu^ca7|4*Np5p=VQyn(Nkly&cx`YlX=!9SFgY|aV>mQ9EjTzhGc7bY zFk>w^GhsL_VKO&1IALOBH8wOgA_^cNAb4$XO-(vaa%pF2ZeeUhZ)0_BlU)iABsVf) zI5=W3FfC*@Vm2)_HaRjaVmM`GEjKtZH#KEsFl8|@GLw)BUkNcdH#s*oF)=ce_zKq} zW-~ZrW-v7^HexkqEi_|gWG!MjGh!`cWjSRvF=8<>GBaV5@(WG}H99pnIyE`7M+|NV z1ir(l{FAv9Gk*d(J0ig*OaK4^en~_@R5;5m(%ouZRTMzsG1r`H?Y(kNPSV&KF&1ho zT2O>u`T}123cj|Wq8JOMBu&o#JL}hr_y~jX$uF;d?Q5P`>%vkOF2WUqiv$-yAeD_% zS;;*!*9pTIeI)7`gGJ=Ki+6oX3#o17mTA4AVt5UhGk;ny)K)3IprUx^5mD3`(ax~v z<29eSBdmYL7uHSedtD00GT<8FG7ny2;7T4of*iDJ$eG@vaY zT`&gh?|q+^rv}Jrn(o z+A62A(&(hRk!u1vrh(uF8kL>x@HS!}PyZq+#1JXnQ(8e)+3Nv^aB7LUJRnU_=kd;S zK3=l7b5spCr6a9$6pu8aw9M`CPmcMKwarZFo_|y_YgyRJf@#1+X>@W;$hU_d`<#yd z8>rA7-Wei7p;2lE8jXfx?8AZRcc>Ua1NQ3hmMJ|_TPD>+?FAFh=y%Y;%aeoLGJ{3V zY|m(CcpVrmVxvV~9^O!TVJ$PYl_$o%bD!?%y&+Ed+%8a2Dg_nKRwkzM3A-Au`RCzx zwtu=X=jo}-DJqJ?aTqRX1^$?Bc}VxXJb%r8xMa&SH~X)VZ}va*B`;)7q>^b=8U=^L ziJ}>)dp15N$U^QL#VXN7P9>pE@fLVUcU;FCoH*uu#H%Ohh>4=k zV{f0mV=F7EC2~J8r$-tU5r=nyFZvC&RU*^}-o)<-3?R^2#fk7AQ29n#IRrke00000 LNkvXXu0mjfL`9S} delta 2269 zcmV<32qO2@FSIU@BLW51ktH90S(5B14E*O5?+8e2;y5gJ#N1$x{}Lm)+wS`5nR1j( zfzXyI;c~~n|D5g*K1|WOn2O|@v&SdaSh-;!et+6^Cm*l7{_r+<%)5JmF%|F(`=?}; zw|VjpP1G<--xSHvh5lTqQT5A9ks1oiBgSB=qN<7l?*&o?ZHMJ^mGV7*gnsPjv`A!s z-MaO$vyn~s^*a`1Zzk9Y%txT$aSuTq219b!O)PEBgM5^UG|vv3VSFs&?auM(+9Y~Lz+qOVR6 zE}#Ph6P~*UsZ3RX6v1?YGZcUTP@|9tRaKY^5fUi?sKIp(kvkBelz75Pjv-`VBfLyw zOQB1Y6Jy$89?c9$Bve@eHZ?SW6=MQ_N)&LYrI2DuDW{So)zosxF{hk!$*U=oF#;EV zO*7S8OO;w{Yp~g%xnXyMKx>_Q=&>i)b1z+b?QMWQBaSrkC__daZSo8g{bS}?rp!9q zK?kUG#3LQ~D2E*NXeX$426x6Yo%t-Mob_xsY6|O*>ldhzqQ)0eOR(IiVYU=gL93ml zg&6>27YT@$1px@n3o|biBQN9@X1+3isvHDFYsl#OiDIIJqD3m!n5h=N z1gDHx=30&;UXO&zdhCnq0KImh@UKnL`IIl2=4X6bi6g5T@?G@>&ey&pg$6u-ud$DD z#^kV$2<9cY&e{Fsr{QlCV;ciQ%3k8_lWRVkkj5=w+a8cq^@O%dJ_Pu_)_S&Z8#dyJ z>ThFA-?wBQ+4Mr+_FSJ?O=H3g>O@|FxScVLAXw@&loVNgVG^D3X{x^(ca)(XnN6Gu zJC*2eV{dCzYucy_P87>nXy#;pw;Z~uaVTOqPZT;a3K(|gHyU}`maFG;ZiCfT)Z#Te z{ItE|)7Dn`hHk#!&{B9!w+t%X2YJyo=fej-^J<+EkTqVgqdCKpe0#O{;~Y-GH- zKg^^USjk8+o~Xq@XLOo970znVS4~K`jvS3DJ;NLRm|Off0$xUwmWbDXbCk?slCh8 zcJsYrz!?>cIM8!mC9?P=Vn7?$Gzt_z+d4DnBkruF%6t>!4z0d8r&Rl5lfQew_Mj1w z;)0*s&*54g@eVy}&6!Sr-yb~(G`#!L^C{W=*gUL)&H2nmn>)3^%A=nF1 zBj>x}5p9(zM{CB~({Wa~M?S=8Jp2=@o7byDS(usUGS2XvJw%znk@4(muaf zG`!QUpK3L%eJWe&dI@PeGkD#o%F7aI9ICN{zB~Wou>K_>kWqr+RYx_m5%I3|pXaT= zn*YkreZtIlUB22GI$lW+y5dg^47exNLOB%0A=SFUPv$4twLZqML(ds20^O$+UY4y$ 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 T2w=;e00000NkvXXu0mjfFoh(3 literal 6101 zcmeHKXH-*5*ABg0P!N$KN(@a(NCE_sNbjJ;&=f3S${{2`5|Tgw6_6%~f~Y7U7Elli zMHEmJl%`%$x}vC25v57zB7*39g5~P^-aoGOz5mQwC+D1*XFq%IXZFmTNg?2!WTjQ5 zArOeHi?h84c$X7glH%aM`qUR91R@TL^77$&5P47*n;Ae02B6$X761hzXaNvNL{Guy zt>y2vWj;|AeTA1HF009edxsx6QR*DJ-EZ^!mA{8+unpwY2bu|hK+6X{mzeG_R|jtZ_-mO30RG}NdE3K zioVAZN;UgA3!!}XIhD-JIkQ%GZlnKHUvt`k{`}Oux!uVM>ihhr{a(};M?!!DWutND z2e+u%HkW1Bt*HxJt+*FbwM0+muCJdkSg*#G!I-&W^l}p1(cyzymtTW+z_D zqL$0wv1gpTER)=J#>Gv)E__#vc8QQ=VfI^Jm|{vzWr}|LdZ~J0+zw)WST{5?Ph5MF zmAGRqMCi2R8u<$skV-I34+z0-Kn><^9qZA%2Z~KPxaYt)_kfdhaY3$f=aMNoV`zr0 zW1^HC9io3n^z)ImuL$ecG#&B4Yq?xF|MnmmkL^EnZf)f-TG-L+u z-a8|s5_a`CgD{xJtDf40$M|2!e*g0VNL(5nDv8 zTyAXRiSKBXiOoxulS3#7%jM_<_^ow3dC%>^F2KuyB$}-q5U)+LM)Dg6*EF~fo07l2 zJxOW-S5aeH-ethq&r~rP<7q~^*(`mg>NWf1gJyLZ^N!DgiMUicn@N4r6MfoUc3!*o zQUK?jMfbWRtv43psR~_1!pzPM-8uE*cU47iay2WKjaICc=((ux2b-H*dZMQl^-&=s zL~pCIAJx3Z_Ca%DP=o*T;LT`;gf)IBeBb=%;75nf#_vCI!A8j>{;7ItUMqKc0`X>iq2`#Al# z?ia@@?;w5qL|Motk#WYlSe>~W62N5N=Jhwk39aHPN|MhWl+IpSlb5QSVj}O?S1GM^ zkx+h(sWE_`F_;KE;%Qs8d12>c`+$3Awm6;Eztpfor+w(9bdR^e8=W&G@YXTnyOp~5>s2ZzEZQGo@0xz(<#_@eppy0jk57Df{w zGSyZbtS*vX<9r8K?mDTt@@1S^%{mqOl}O)m_%J`&I>~?Isr!jhCE80LjbxZP@$X;u zx9ODgH@Gqv(|IQUpI5k?4*6kXsQMkXmi7$QH+wgC^oxCXo)c3c@$ke=mm_G%_z;>z z_TleC$v)yHe&oaeQi_Qg1qB?S%8&nZ~FK9j7)CTWZ!loaQDmUaihrI6her zeE+!j_3&H5SF+zkP7PdW&R81Ju4?DDGgI`FhDy&9LxpWRNAT^pgfSc1`QbUyAIN*T z6%nbXNl7}}k>>t`#{XO_+`jCir$&!~M8S#5zj(I&5xVt4^>Z#rmO4RMEwu#w{i!`?X?b7bx`pMrTP=2^B z)QbON=kpqo1jj_$rdG`9!OCpBc4IKZTjnM#Sza=EjizyP*5R|utJ6w%&dx?D_4~eP zUBJ$D-E4xKayD<4>D1;!Px7zIw#+xmZ#v}N%jwN>QPPa=tL~jx*`MDm+`2z2d)hoS z!N(xHtfTG{h2H4d=whom5}V(9$(w#DY~$y8mY=`xJKRH}=H+B9XSux7Nk)2Q z^5?vDnrw4s6t;h|EAfXNvn?@F#;zbFia-4){!85$qqx2=;n;FKqy~{Tg_0Hx-xKg6 zv^IU!xk%yJQ+xDlMoLX%vp04OhrpvmrFg?0(W-^#M~-^MI;9STqp^k(ij%7u^YEwP#VPowi)e)bYs~8 zfi&kRHsBeB_aa9Hk+Bq*m8G@3gDhY^ zZUm?ulMO&k3{4D?aEAz5xDm`!8fwm_1mHaE9lue4Zx*mXE|-NvAb32UAVb$LvJfakBqAgP@v{Yo>ktl-d<*EmT5!C;k068xz+r~5$$&#Rz~E~9 zOhF<4uxEv_gBR1GkP$#I5CTFupjXr{E}dN52tORO&tVJtO>|c;vTEM?z{Sup? zXEB|h0|Cu{@cx4Sp8FygM7g=)?3v^+L3l3q7BGQ-9EC}yQE-coShA6k5fV*-n*^8z zz)eh1WH{E8NP-(e08+Qw+Uc#z)BQwqL7BhUwH+? zf&-HQg(V8=6eL)r1#`jKu>m5N$@XG0gDqeJ3aG$xvAm(?UkAmR#sLwLf{OoE^PWKH z*SD`zAegq;1%)n_EsjY3>V!iK2Plh&A9?_(|2X+AegDYyN3P#e;J3hks_Tzjzoo!$f&Wz3|C?OW z{~mY%2KW`k1CKMc4Mm^8qmVdhy^}qpA5sOOvRF6yV2c#X*_Q)>{3S2AgkmWE8DOIX z*Tv02;+^CwVeC3so%RL@L^#^T-o^{l4DWbB-|oHK`ZcOMH)y1WjmLL9QAMqw>u(_> z_{|CX%}du-p3YbPt3cDO<@37X?$lYy_=&#}rO_inCw+$NJ(LXV72{Jym8_we2RwcM zwlMCNYEa&-IiwQr(03!1w|o6x=R^9A(rWTZ5wcmvTM%8FbZbuMNA%0Pcd4|ul=Z(s zpSt#@0moq|NiG=^iC-y&>t!Wl=!oD*hvnib@;ciR^xw00*_31>-s;nbPp4g+5G&A; zadM&+@1SQXPvgrn26(xNt16FXxAvmP&fQweuBX3YM5X7P`=@0~!1AUPQj4<5X*hH{ zQvChc8)mL6EHkld87ysyr1e;CRDMQ=VKQced6N9@#v4NOgL70%gR1An>gO#K7Sek3 z&XsozoUP6X62=woc_przd17STl%&4#3rw$3PWOf978~!U!$Nym^pxx7P&Y#VL<`5# zue^%mC2LloQOsSQZjyKP!N|nMw2v7T4>t^+^fC(aeR4mJcH5rDWxL(0+N(aFoAza8 zQQIoM3d}aooi46=Ac^$8Vb1`sNZCeYW@!AVu7$@|?ML<_VhXJTytcaL!|~6J;vHIo zTLY;PtCZoSGY)>M`GhDU+_)lB=S~gh)aYQ%8vMuSh6Hy#F~!zR+J%!+H&jbL_P^#; zRwMfd&o}Gp?P~~CHl&Gt&SFG5f4FHL^Dz1vrPPXXpy1CQqIs!`?QKZO zS00kFIk{<{d@!XgnYVhUsin?6+tHOxdhHH)tvvk1iU?=kw!15HG4FOYUep;#PRVZ} zGf&l!_4Utdv8_<&oKzL%_wx22=430pyCnFHV^T8Ewk=I5::do_complete(void*, boost::asio::detail::operation*, const boost::system::error_code&, std::size_t)'] +[16:43:26 RemoteClient -I]: Игрок '' отключился по запросу интерфейса Вы были отключены от игры +[16:43:26 RemoteClient -I]: Игрок '' отключился: Ошибка протокола (клиент) +[16:43:26 CacheHandlerBasic-I]: Поток чтения/записи остановлен +[16:43:26 CacheHandlerBasic-I]: Поток чтения остановлен +[16:43:26 CacheHandlerBasic-I]: ДеИнициализировано хранилище кеша: Cache +[16:43:26 GameServer-I]: Сервер завершил работу +[16:43:26 BackingChunkPressure-D]: Завершение выполнения потока 0 +[16:43:26 BackingNoiseGenerator-D]: Завершение выполнения потока 0 +[16:43:26 GameServer-I]: Сервер уничтожен + -*[ 2025.07.10 ]*- + +[17:02:19 Vulkan-D]: Отчёт о доступном оборудовании: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Имя устройства: Intel(R) UHD Graphics 630 (CFL GT2) + Тип устройства: ВСТРОЕННЫЙ ГРАФИЧЕСКИЙ процессор + Id поставщика: 32902 + Id устройства: 16017 + + QueueSurface: 0 + QueueGraphics: 0 + + Оценка устройства: 1 + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[17:02:19 Vulkan-D]: Формат экранного буфера по умолчанию: VK_FORMAT_B8G8R8A8_UNORM & VK_COLOR_SPACE_SRGB_NONLINEAR_KHR +[17:02:19 Vulkan-D]: Пересоздание цепочки вывода, текущий размер окна: 960 x 540 + Размер буффера, предоставленный оконной подсистемой: 960 x 540 + Количество изображений в цепочке смены кадров: min(3) / max(0); Запрошено оконной подсистемой: 3; утверждено: 3 + Используемая трансформация: VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR + Получено сменых изображений цепочки: 3 + +[17:02:19 Resources-D]: Ресурс "assets/default.ttf" найден в фс +[17:02:19 BackingAsyncLua-D]: Старт потока 0 +[17:02:19 BackingChunkPressure-D]: Старт потока 0 +[17:02:19 BackingNoiseGenerator-D]: Старт потока 0 +[17:02:19 BackingAsyncLua-D]: Старт потока 1 +[17:02:20 GameServer-I]: Подключился к игре +[17:02:20 Resources-D]: Ресурс "assets/textures/grass.png" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/textures/willow_wood.png" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/textures/tropical_rainforest_wood.png" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/textures/xnether_blue_wood.png" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/textures/xnether_purple_wood.png" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/shaders/chunk/voxel.vert.bin" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/shaders/chunk/voxel.geom.bin" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/shaders/chunk/voxel_opaque.frag.bin" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/shaders/chunk/voxel_transparent.frag.bin" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/shaders/chunk/node.vert.bin" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/shaders/chunk/node.geom.bin" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/shaders/chunk/node_opaque.frag.bin" найден в фс +[17:02:20 Resources-D]: Ресурс "assets/shaders/chunk/node_transparent.frag.bin" найден в фс +[17:02:20 CacheHandlerBasic-I]: Поток чтения запущен +[17:02:20 CacheHandlerBasic-I]: Инициализировано хранилище кеша: Cache +[17:02:20 CacheHandlerBasic-I]: Поток чтения/записи запущен +[17:02:20 New-D]: -1 -1 -1 +[17:02:20 New-D]: -1 -1 0 +[17:02:20 New-D]: -1 -1 1 +[17:02:20 New-D]: -1 0 -1 +[17:02:20 New-D]: -1 0 0 +[17:02:20 New-D]: -1 0 1 +[17:02:20 New-D]: -1 1 -1 +[17:02:20 New-D]: -1 1 0 +[17:02:20 New-D]: -1 1 1 +[17:02:20 New-D]: 0 -1 -1 +[17:02:20 New-D]: 0 -1 0 +[17:02:20 New-D]: 0 -1 1 +[17:02:20 New-D]: 0 0 -1 +[17:02:20 New-D]: 0 0 0 +[17:02:20 New-D]: 0 0 1 +[17:02:20 New-D]: 0 1 -1 +[17:02:20 New-D]: 0 1 0 +[17:02:20 New-D]: 0 1 1 +[17:02:20 New-D]: 1 -1 -1 +[17:02:20 New-D]: 1 -1 0 +[17:02:20 New-D]: 1 -1 1 +[17:02:20 New-D]: 1 0 -1 +[17:02:20 New-D]: 1 0 0 +[17:02:20 New-D]: 1 0 1 +[17:02:20 New-D]: 1 1 -1 +[17:02:20 New-D]: 1 1 0 +[17:02:20 New-D]: 1 1 1 +[17:02:32 New-D]: -2 -1 -1 +[17:02:32 New-D]: -2 -1 0 +[17:02:32 New-D]: -2 -1 1 +[17:02:32 New-D]: -2 0 -1 +[17:02:32 New-D]: -2 0 0 +[17:02:32 New-D]: -2 0 1 +[17:02:32 New-D]: -2 1 -1 +[17:02:32 New-D]: -2 1 0 +[17:02:32 New-D]: -2 1 1 +[17:02:32 Lost-D]: 1 -1 -1 +[17:02:32 Lost-D]: 1 -1 0 +[17:02:32 Lost-D]: 1 -1 1 +[17:02:32 Lost-D]: 1 0 -1 +[17:02:32 Lost-D]: 1 0 0 +[17:02:32 Lost-D]: 1 0 1 +[17:02:32 Lost-D]: 1 1 -1 +[17:02:32 Lost-D]: 1 1 0 +[17:02:32 Lost-D]: 1 1 1 +[17:02:42 New-D]: 1 -1 -1 +[17:02:42 New-D]: 1 -1 0 +[17:02:42 New-D]: 1 -1 1 +[17:02:42 New-D]: 1 0 -1 +[17:02:42 New-D]: 1 0 0 +[17:02:42 New-D]: 1 0 1 +[17:02:42 New-D]: 1 1 -1 +[17:02:42 New-D]: 1 1 0 +[17:02:42 New-D]: 1 1 1 +[17:02:42 Lost-D]: -2 -1 -1 +[17:02:42 Lost-D]: -2 -1 0 +[17:02:42 Lost-D]: -2 -1 1 +[17:02:42 Lost-D]: -2 0 -1 +[17:02:42 Lost-D]: -2 0 0 +[17:02:42 Lost-D]: -2 0 1 +[17:02:42 Lost-D]: -2 1 -1 +[17:02:42 Lost-D]: -2 1 0 +[17:02:42 Lost-D]: -2 1 1 +[17:03:29 ServerSession-I]: Отключение от сервера: по запросу интерфейса +[17:03:29 ServerSession-W]: End of file [asio.misc:2 at /home/mr_s/Workspace/Alpha/LuaVox/build/_deps/boost-src/libs/asio/include/boost/asio/detail/reactive_socket_recv_op.hpp:133:5 in function 'static void boost::asio::detail::reactive_socket_recv_op::do_complete(void*, boost::asio::detail::operation*, const boost::system::error_code&, std::size_t)'] +[17:03:29 RemoteClient -I]: Игрок '' отключился по запросу интерфейса Вы были отключены от игры +[17:03:29 RemoteClient -I]: Игрок '' отключился: Ошибка протокола (клиент) +[17:03:29 GameServer-I]: Сервер завершил работу +[17:03:29 CacheHandlerBasic-I]: Поток чтения остановлен +[17:03:29 CacheHandlerBasic-I]: Поток чтения/записи остановлен +[17:03:29 CacheHandlerBasic-I]: ДеИнициализировано хранилище кеша: Cache +[17:03:29 BackingChunkPressure-D]: Завершение выполнения потока 0 +[17:03:29 BackingNoiseGenerator-D]: Завершение выполнения потока 0 +[17:03:29 GameServer-I]: Сервер уничтожен + -*[ 2025.07.10 ]*- + +[17:05:09 Vulkan-D]: Отчёт о доступном оборудовании: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Имя устройства: Intel(R) UHD Graphics 630 (CFL GT2) + Тип устройства: ВСТРОЕННЫЙ ГРАФИЧЕСКИЙ процессор + Id поставщика: 32902 + Id устройства: 16017 + + QueueSurface: 0 + QueueGraphics: 0 + + Оценка устройства: 1 + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[17:05:09 Vulkan-D]: Формат экранного буфера по умолчанию: VK_FORMAT_B8G8R8A8_UNORM & VK_COLOR_SPACE_SRGB_NONLINEAR_KHR +[17:05:09 Vulkan-D]: Пересоздание цепочки вывода, текущий размер окна: 960 x 540 + Размер буффера, предоставленный оконной подсистемой: 960 x 540 + Количество изображений в цепочке смены кадров: min(3) / max(0); Запрошено оконной подсистемой: 3; утверждено: 3 + Используемая трансформация: VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR + Получено сменых изображений цепочки: 3 + +[17:05:09 Resources-D]: Ресурс "assets/default.ttf" найден в фс +[17:05:09 BackingChunkPressure-D]: Старт потока 0 +[17:05:09 BackingNoiseGenerator-D]: Старт потока 0 +[17:05:09 BackingAsyncLua-D]: Старт потока 0 +[17:05:09 BackingAsyncLua-D]: Старт потока 1 +[17:05:09 GameServer-I]: Подключился к игре +[17:05:09 Resources-D]: Ресурс "assets/textures/grass.png" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/textures/willow_wood.png" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/textures/tropical_rainforest_wood.png" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/textures/xnether_blue_wood.png" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/textures/xnether_purple_wood.png" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/shaders/chunk/voxel.vert.bin" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/shaders/chunk/voxel.geom.bin" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/shaders/chunk/voxel_opaque.frag.bin" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/shaders/chunk/voxel_transparent.frag.bin" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/shaders/chunk/node.vert.bin" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/shaders/chunk/node.geom.bin" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/shaders/chunk/node_opaque.frag.bin" найден в фс +[17:05:09 Resources-D]: Ресурс "assets/shaders/chunk/node_transparent.frag.bin" найден в фс +[17:05:09 CacheHandlerBasic-I]: Инициализировано хранилище кеша: Cache +[17:05:09 CacheHandlerBasic-I]: Поток чтения запущен +[17:05:09 CacheHandlerBasic-I]: Поток чтения/записи запущен +[17:05:09 New-D]: -1 -1 -1 +[17:05:09 New-D]: -1 -1 0 +[17:05:09 New-D]: -1 -1 1 +[17:05:09 New-D]: -1 0 -1 +[17:05:09 New-D]: -1 0 0 +[17:05:09 New-D]: -1 0 1 +[17:05:09 New-D]: -1 1 -1 +[17:05:09 New-D]: -1 1 0 +[17:05:09 New-D]: -1 1 1 +[17:05:09 New-D]: 0 -1 -1 +[17:05:09 New-D]: 0 -1 0 +[17:05:09 New-D]: 0 -1 1 +[17:05:09 New-D]: 0 0 -1 +[17:05:09 New-D]: 0 0 0 +[17:05:09 New-D]: 0 0 1 +[17:05:09 New-D]: 0 1 -1 +[17:05:09 New-D]: 0 1 0 +[17:05:09 New-D]: 0 1 1 +[17:05:09 New-D]: 1 -1 -1 +[17:05:09 New-D]: 1 -1 0 +[17:05:09 New-D]: 1 -1 1 +[17:05:09 New-D]: 1 0 -1 +[17:05:09 New-D]: 1 0 0 +[17:05:09 New-D]: 1 0 1 +[17:05:09 New-D]: 1 1 -1 +[17:05:09 New-D]: 1 1 0 +[17:05:09 New-D]: 1 1 1 +[17:05:20 New-D]: -1 -1 -2 +[17:05:20 New-D]: -1 0 -2 +[17:05:20 New-D]: -1 1 -2 +[17:05:20 New-D]: 0 -1 -2 +[17:05:20 New-D]: 0 0 -2 +[17:05:20 New-D]: 0 1 -2 +[17:05:20 New-D]: 1 -1 -2 +[17:05:20 New-D]: 1 0 -2 +[17:05:20 New-D]: 1 1 -2 +[17:05:20 Lost-D]: -1 -1 1 +[17:05:20 Lost-D]: -1 0 1 +[17:05:20 Lost-D]: -1 1 1 +[17:05:20 Lost-D]: 0 -1 1 +[17:05:20 Lost-D]: 0 0 1 +[17:05:20 Lost-D]: 0 1 1 +[17:05:20 Lost-D]: 1 -1 1 +[17:05:20 Lost-D]: 1 0 1 +[17:05:20 Lost-D]: 1 1 1 +[17:05:24 New-D]: -1 -1 1 +[17:05:24 New-D]: -1 0 1 +[17:05:24 New-D]: -1 1 1 +[17:05:24 New-D]: 0 -1 1 +[17:05:24 New-D]: 0 0 1 +[17:05:24 New-D]: 0 1 1 +[17:05:24 New-D]: 1 -1 1 +[17:05:24 New-D]: 1 0 1 +[17:05:24 New-D]: 1 1 1 +[17:05:24 Lost-D]: -1 -1 -2 +[17:05:24 Lost-D]: -1 0 -2 +[17:05:24 Lost-D]: -1 1 -2 +[17:05:24 Lost-D]: 0 -1 -2 +[17:05:24 Lost-D]: 0 0 -2 +[17:05:24 Lost-D]: 0 1 -2 +[17:05:24 Lost-D]: 1 -1 -2 +[17:05:24 Lost-D]: 1 0 -2 +[17:05:24 Lost-D]: 1 1 -2 +[17:05:31 New-D]: 2 -1 -1 +[17:05:31 New-D]: 2 -1 0 +[17:05:31 New-D]: 2 -1 1 +[17:05:31 New-D]: 2 0 -1 +[17:05:31 New-D]: 2 0 0 +[17:05:31 New-D]: 2 0 1 +[17:05:31 New-D]: 2 1 -1 +[17:05:31 New-D]: 2 1 0 +[17:05:31 New-D]: 2 1 1 +[17:05:31 Lost-D]: -1 -1 -1 +[17:05:31 Lost-D]: -1 -1 0 +[17:05:31 Lost-D]: -1 -1 1 +[17:05:31 Lost-D]: -1 0 -1 +[17:05:31 Lost-D]: -1 0 0 +[17:05:31 Lost-D]: -1 0 1 +[17:05:31 Lost-D]: -1 1 -1 +[17:05:31 Lost-D]: -1 1 0 +[17:05:31 Lost-D]: -1 1 1 +[17:05:36 New-D]: 3 -1 -1 +[17:05:36 New-D]: 3 -1 0 +[17:05:36 New-D]: 3 -1 1 +[17:05:36 New-D]: 3 0 -1 +[17:05:36 New-D]: 3 0 0 +[17:05:36 New-D]: 3 0 1 +[17:05:36 New-D]: 3 1 -1 +[17:05:36 New-D]: 3 1 0 +[17:05:36 New-D]: 3 1 1 +[17:05:36 Lost-D]: 0 -1 -1 +[17:05:36 Lost-D]: 0 -1 0 +[17:05:36 Lost-D]: 0 -1 1 +[17:05:36 Lost-D]: 0 0 -1 +[17:05:36 Lost-D]: 0 0 0 +[17:05:36 Lost-D]: 0 0 1 +[17:05:36 Lost-D]: 0 1 -1 +[17:05:36 Lost-D]: 0 1 0 +[17:05:36 Lost-D]: 0 1 1 +[17:05:39 New-D]: 4 -1 -1 +[17:05:39 New-D]: 4 -1 0 +[17:05:39 New-D]: 4 -1 1 +[17:05:39 New-D]: 4 0 -1 +[17:05:39 New-D]: 4 0 0 +[17:05:39 New-D]: 4 0 1 +[17:05:39 New-D]: 4 1 -1 +[17:05:39 New-D]: 4 1 0 +[17:05:39 New-D]: 4 1 1 +[17:05:39 Lost-D]: 1 -1 -1 +[17:05:39 Lost-D]: 1 -1 0 +[17:05:39 Lost-D]: 1 -1 1 +[17:05:39 Lost-D]: 1 0 -1 +[17:05:39 Lost-D]: 1 0 0 +[17:05:39 Lost-D]: 1 0 1 +[17:05:39 Lost-D]: 1 1 -1 +[17:05:39 Lost-D]: 1 1 0 +[17:05:39 Lost-D]: 1 1 1 +[17:05:44 New-D]: 5 -1 -1 +[17:05:44 New-D]: 5 -1 0 +[17:05:44 New-D]: 5 -1 1 +[17:05:44 New-D]: 5 0 -1 +[17:05:44 New-D]: 5 0 0 +[17:05:44 New-D]: 5 0 1 +[17:05:44 New-D]: 5 1 -1 +[17:05:44 New-D]: 5 1 0 +[17:05:44 New-D]: 5 1 1 +[17:05:44 Lost-D]: 2 -1 -1 +[17:05:44 Lost-D]: 2 -1 0 +[17:05:44 Lost-D]: 2 -1 1 +[17:05:44 Lost-D]: 2 0 -1 +[17:05:44 Lost-D]: 2 0 0 +[17:05:44 Lost-D]: 2 0 1 +[17:05:44 Lost-D]: 2 1 -1 +[17:05:44 Lost-D]: 2 1 0 +[17:05:44 Lost-D]: 2 1 1 +[17:05:48 New-D]: 2 -1 -1 +[17:05:48 New-D]: 2 -1 0 +[17:05:48 New-D]: 2 -1 1 +[17:05:48 New-D]: 2 0 -1 +[17:05:48 New-D]: 2 0 0 +[17:05:48 New-D]: 2 0 1 +[17:05:48 New-D]: 2 1 -1 +[17:05:48 New-D]: 2 1 0 +[17:05:48 New-D]: 2 1 1 +[17:05:48 Lost-D]: 5 -1 -1 +[17:05:48 Lost-D]: 5 -1 0 +[17:05:48 Lost-D]: 5 -1 1 +[17:05:48 Lost-D]: 5 0 -1 +[17:05:48 Lost-D]: 5 0 0 +[17:05:48 Lost-D]: 5 0 1 +[17:05:48 Lost-D]: 5 1 -1 +[17:05:48 Lost-D]: 5 1 0 +[17:05:48 Lost-D]: 5 1 1 +[17:05:49 New-D]: 1 -1 -1 +[17:05:49 New-D]: 1 -1 0 +[17:05:49 New-D]: 1 -1 1 +[17:05:49 New-D]: 1 0 -1 +[17:05:49 New-D]: 1 0 0 +[17:05:49 New-D]: 1 0 1 +[17:05:49 New-D]: 1 1 -1 +[17:05:49 New-D]: 1 1 0 +[17:05:49 New-D]: 1 1 1 +[17:05:49 Lost-D]: 4 -1 -1 +[17:05:49 Lost-D]: 4 -1 0 +[17:05:49 Lost-D]: 4 -1 1 +[17:05:49 Lost-D]: 4 0 -1 +[17:05:49 Lost-D]: 4 0 0 +[17:05:49 Lost-D]: 4 0 1 +[17:05:49 Lost-D]: 4 1 -1 +[17:05:49 Lost-D]: 4 1 0 +[17:05:49 Lost-D]: 4 1 1 +[17:05:51 New-D]: 1 -1 -2 +[17:05:51 New-D]: 1 0 -2 +[17:05:51 New-D]: 1 1 -2 +[17:05:51 New-D]: 2 -1 -2 +[17:05:51 New-D]: 2 0 -2 +[17:05:51 New-D]: 2 1 -2 +[17:05:51 New-D]: 3 -1 -2 +[17:05:51 New-D]: 3 0 -2 +[17:05:51 New-D]: 3 1 -2 +[17:05:51 Lost-D]: 1 -1 1 +[17:05:51 Lost-D]: 1 0 1 +[17:05:51 Lost-D]: 1 1 1 +[17:05:51 Lost-D]: 2 -1 1 +[17:05:51 Lost-D]: 2 0 1 +[17:05:51 Lost-D]: 2 1 1 +[17:05:51 Lost-D]: 3 -1 1 +[17:05:51 Lost-D]: 3 0 1 +[17:05:51 Lost-D]: 3 1 1 +[17:05:54 New-D]: -1 -1 -2 +[17:05:54 New-D]: -1 -1 -1 +[17:05:54 New-D]: -1 -1 0 +[17:05:54 New-D]: -1 0 -2 +[17:05:54 New-D]: -1 0 -1 +[17:05:54 New-D]: -1 0 0 +[17:05:54 New-D]: -1 1 -2 +[17:05:54 New-D]: -1 1 -1 +[17:05:54 New-D]: -1 1 0 +[17:05:54 New-D]: 0 -1 -2 +[17:05:54 New-D]: 0 -1 -1 +[17:05:54 New-D]: 0 -1 0 +[17:05:54 New-D]: 0 0 -2 +[17:05:54 New-D]: 0 0 -1 +[17:05:54 New-D]: 0 0 0 +[17:05:54 New-D]: 0 1 -2 +[17:05:54 New-D]: 0 1 -1 +[17:05:54 New-D]: 0 1 0 +[17:05:54 Lost-D]: 2 -1 -2 +[17:05:54 Lost-D]: 2 -1 -1 +[17:05:54 Lost-D]: 2 -1 0 +[17:05:54 Lost-D]: 2 0 -2 +[17:05:54 Lost-D]: 2 0 -1 +[17:05:54 Lost-D]: 2 0 0 +[17:05:54 Lost-D]: 2 1 -2 +[17:05:54 Lost-D]: 2 1 -1 +[17:05:54 Lost-D]: 2 1 0 +[17:05:54 Lost-D]: 3 -1 -2 +[17:05:54 Lost-D]: 3 -1 -1 +[17:05:54 Lost-D]: 3 -1 0 +[17:05:54 Lost-D]: 3 0 -2 +[17:05:54 Lost-D]: 3 0 -1 +[17:05:54 Lost-D]: 3 0 0 +[17:05:54 Lost-D]: 3 1 -2 +[17:05:54 Lost-D]: 3 1 -1 +[17:05:54 Lost-D]: 3 1 0 +[17:06:32 New-D]: -1 -1 1 +[17:06:32 New-D]: -1 0 1 +[17:06:32 New-D]: -1 1 1 +[17:06:32 New-D]: 0 -1 1 +[17:06:32 New-D]: 0 0 1 +[17:06:32 New-D]: 0 1 1 +[17:06:32 New-D]: 1 -1 1 +[17:06:32 New-D]: 1 0 1 +[17:06:32 New-D]: 1 1 1 +[17:06:32 Lost-D]: -1 -1 -2 +[17:06:32 Lost-D]: -1 0 -2 +[17:06:32 Lost-D]: -1 1 -2 +[17:06:32 Lost-D]: 0 -1 -2 +[17:06:32 Lost-D]: 0 0 -2 +[17:06:32 Lost-D]: 0 1 -2 +[17:06:32 Lost-D]: 1 -1 -2 +[17:06:32 Lost-D]: 1 0 -2 +[17:06:32 Lost-D]: 1 1 -2 +[17:06:35 New-D]: -2 -1 -2 +[17:06:35 New-D]: -2 -1 -1 +[17:06:35 New-D]: -2 -1 0 +[17:06:35 New-D]: -2 0 -2 +[17:06:35 New-D]: -2 0 -1 +[17:06:35 New-D]: -2 0 0 +[17:06:35 New-D]: -2 1 -2 +[17:06:35 New-D]: -2 1 -1 +[17:06:35 New-D]: -2 1 0 +[17:06:35 New-D]: -1 -1 -2 +[17:06:35 New-D]: -1 0 -2 +[17:06:35 New-D]: -1 1 -2 +[17:06:35 New-D]: 0 -1 -2 +[17:06:35 New-D]: 0 0 -2 +[17:06:35 New-D]: 0 1 -2 +[17:06:35 Lost-D]: -1 -1 1 +[17:06:35 Lost-D]: -1 0 1 +[17:06:35 Lost-D]: -1 1 1 +[17:06:35 Lost-D]: 0 -1 1 +[17:06:35 Lost-D]: 0 0 1 +[17:06:35 Lost-D]: 0 1 1 +[17:06:35 Lost-D]: 1 -1 -1 +[17:06:35 Lost-D]: 1 -1 0 +[17:06:35 Lost-D]: 1 -1 1 +[17:06:35 Lost-D]: 1 0 -1 +[17:06:35 Lost-D]: 1 0 0 +[17:06:35 Lost-D]: 1 0 1 +[17:06:35 Lost-D]: 1 1 -1 +[17:06:35 Lost-D]: 1 1 0 +[17:06:35 Lost-D]: 1 1 1 +[17:06:37 New-D]: -3 -1 -3 +[17:06:37 New-D]: -3 -1 -2 +[17:06:37 New-D]: -3 -1 -1 +[17:06:37 New-D]: -3 0 -3 +[17:06:37 New-D]: -3 0 -2 +[17:06:37 New-D]: -3 0 -1 +[17:06:37 New-D]: -3 1 -3 +[17:06:37 New-D]: -3 1 -2 +[17:06:37 New-D]: -3 1 -1 +[17:06:37 New-D]: -2 -1 -3 +[17:06:37 New-D]: -2 0 -3 +[17:06:37 New-D]: -2 1 -3 +[17:06:37 New-D]: -1 -1 -3 +[17:06:37 New-D]: -1 0 -3 +[17:06:37 New-D]: -1 1 -3 +[17:06:37 Lost-D]: -2 -1 0 +[17:06:37 Lost-D]: -2 0 0 +[17:06:37 Lost-D]: -2 1 0 +[17:06:37 Lost-D]: -1 -1 0 +[17:06:37 Lost-D]: -1 0 0 +[17:06:37 Lost-D]: -1 1 0 +[17:06:37 Lost-D]: 0 -1 -2 +[17:06:37 Lost-D]: 0 -1 -1 +[17:06:37 Lost-D]: 0 -1 0 +[17:06:37 Lost-D]: 0 0 -2 +[17:06:37 Lost-D]: 0 0 -1 +[17:06:37 Lost-D]: 0 0 0 +[17:06:37 Lost-D]: 0 1 -2 +[17:06:37 Lost-D]: 0 1 -1 +[17:06:37 Lost-D]: 0 1 0 +[17:06:41 New-D]: -3 -1 -5 +[17:06:41 New-D]: -3 -1 -4 +[17:06:41 New-D]: -3 0 -5 +[17:06:41 New-D]: -3 0 -4 +[17:06:41 New-D]: -3 1 -5 +[17:06:41 New-D]: -3 1 -4 +[17:06:41 New-D]: -2 -1 -5 +[17:06:41 New-D]: -2 -1 -4 +[17:06:41 New-D]: -2 0 -5 +[17:06:41 New-D]: -2 0 -4 +[17:06:41 New-D]: -2 1 -5 +[17:06:41 New-D]: -2 1 -4 +[17:06:41 New-D]: -1 -1 -5 +[17:06:41 New-D]: -1 -1 -4 +[17:06:41 New-D]: -1 0 -5 +[17:06:41 New-D]: -1 0 -4 +[17:06:41 New-D]: -1 1 -5 +[17:06:41 New-D]: -1 1 -4 +[17:06:41 Lost-D]: -3 -1 -2 +[17:06:41 Lost-D]: -3 -1 -1 +[17:06:41 Lost-D]: -3 0 -2 +[17:06:41 Lost-D]: -3 0 -1 +[17:06:41 Lost-D]: -3 1 -2 +[17:06:41 Lost-D]: -3 1 -1 +[17:06:41 Lost-D]: -2 -1 -2 +[17:06:41 Lost-D]: -2 -1 -1 +[17:06:41 Lost-D]: -2 0 -2 +[17:06:41 Lost-D]: -2 0 -1 +[17:06:41 Lost-D]: -2 1 -2 +[17:06:41 Lost-D]: -2 1 -1 +[17:06:41 Lost-D]: -1 -1 -2 +[17:06:41 Lost-D]: -1 -1 -1 +[17:06:41 Lost-D]: -1 0 -2 +[17:06:41 Lost-D]: -1 0 -1 +[17:06:41 Lost-D]: -1 1 -2 +[17:06:41 Lost-D]: -1 1 -1