diff --git a/Src/Client/Vulkan/Vulkan.cpp b/Src/Client/Vulkan/Vulkan.cpp index b697f6b..208b114 100644 --- a/Src/Client/Vulkan/Vulkan.cpp +++ b/Src/Client/Vulkan/Vulkan.cpp @@ -84,7 +84,11 @@ Vulkan::Vulkan(asio::io_context &ioc) Game.MainThread = std::thread([&]() { auto useLock = Game.UseLock.lock(); - run(); + try { + run(); + } catch(const std::exception &exc) { + LOG.error() << "Vulkan::run: " << exc.what(); + } GuardLock.reset(); }); } @@ -138,16 +142,31 @@ void Vulkan::run() if(!NeedShutdown && glfwWindowShouldClose(Graphics.Window)) { NeedShutdown = true; - if(Game.Session) - Game.Session->shutdown(EnumDisconnect::ByInterface); - - if(Game.Server) { - Game.Server->GS.shutdown("Завершение работы из-за остановки клиента"); + try { + if(Game.Session) + Game.Session->shutdown(EnumDisconnect::ByInterface); + } catch(const std::exception &exc) { + LOG.error() << "Game.Session->shutdown: " << exc.what(); } - Game.RSession = nullptr; - Game.Session = nullptr; - Game.Server = nullptr; + try { + if(Game.Server) + Game.Server->GS.shutdown("Завершение работы из-за остановки клиента"); + } catch(const std::exception &exc) { + LOG.error() << "Game.Server->GS.shutdown: " << exc.what(); + } + + try { Game.RSession = nullptr; } catch(const std::exception &exc) { + LOG.error() << "Game.RSession = nullptr: " << exc.what(); + } + + try { Game.Session = nullptr; } catch(const std::exception &exc) { + LOG.error() << "Game.Session = nullptr: " << exc.what(); + } + + try { Game.Server = nullptr; } catch(const std::exception &exc) { + LOG.error() << "Game.Server = nullptr: " << exc.what(); + } } if(Game.Session) { diff --git a/Src/Client/Vulkan/Vulkan.hpp b/Src/Client/Vulkan/Vulkan.hpp index cf640b2..98f4d94 100644 --- a/Src/Client/Vulkan/Vulkan.hpp +++ b/Src/Client/Vulkan/Vulkan.hpp @@ -71,6 +71,8 @@ class Buffer; class Vulkan : public AsyncObject { private: + Logger LOG = "Vulkan"; + struct vkInstanceLayer { std::string LayerName = "nullptr", Description = "nullptr"; uint32_t SpecVersion = -2, ImplementationVersion = -2; @@ -351,7 +353,6 @@ public: return std::this_thread::get_id() == Graphics.ThisThread; } - void shutdown() { NeedShutdown = true; } void addImGUIFont(std::string_view view); void gui_MainMenu(); diff --git a/Src/Common/Net.cpp b/Src/Common/Net.cpp index 377ba84..28b0f99 100644 --- a/Src/Common/Net.cpp +++ b/Src/Common/Net.cpp @@ -46,9 +46,9 @@ coro Server::run() { // TODO: std::cout << exc.what() << std::endl; } + Lock.cancel(); IsAlive.store(false); IsAlive.notify_all(); - Lock.cancel(); } diff --git a/Src/Server/RemoteClient.cpp b/Src/Server/RemoteClient.cpp index 1af42a2..8ac961d 100644 --- a/Src/Server/RemoteClient.cpp +++ b/Src/Server/RemoteClient.cpp @@ -70,8 +70,8 @@ void RemoteClient::shutdown(EnumDisconnect type, const std::string reason) { void RemoteClient::prepareChunkUpdate_Voxels(WorldId_t worldId, Pos::GlobalChunk chunkPos, const std::vector &voxels) { - WorldId_c wcId = ResRemap.Worlds.toClient(worldId); - assert(wcId != WorldId_c(-1)); + WorldId_c wcId = worldId ? ResRemap.Worlds.toClient(worldId) : 0; + assert(wcId != WorldId_c(-1)); // Пока ожидается, что игрок не будет одновременно наблюдать 256 миров // Перебиндить идентификаторы вокселей std::vector NeedVoxels;