From 7ccda081b0799487eb77bae218f15aedf17b2f53 Mon Sep 17 00:00:00 2001 From: Vladislav Khorev Date: Fri, 6 Mar 2026 23:15:56 +0300 Subject: [PATCH] Fixing bugs --- src/Game.cpp | 9 ++++++++ src/MenuManager.cpp | 2 ++ src/MenuManager.h | 1 + src/Space.cpp | 27 ++++++++++++++--------- src/Space.h | 1 + src/network/NetworkInterface.h | 1 + src/network/WebSocketClient.cpp | 9 ++++++++ src/network/WebSocketClient.h | 1 + src/network/WebSocketClientEmscripten.cpp | 9 ++++++++ src/network/WebSocketClientEmscripten.h | 1 + 10 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index 63ad172..5dc8aff 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -146,6 +146,13 @@ namespace ZL menuManager.setupMenu(); + menuManager.onMainMenuEntered = [this]() { + if (networkClient) { + networkClient->Disconnect(); + networkClient.reset(); + } + }; + menuManager.onSingleplayerPressed = [this](const std::string& nickname, int shipType) { Environment::shipState.nickname = nickname; Environment::shipState.shipType = shipType; @@ -169,6 +176,7 @@ namespace ZL networkClient = std::unique_ptr(localClient); networkClient->Connect("", 0); + space.resetPlayerState(); lastTickCount = 0; }; @@ -195,6 +203,7 @@ namespace ZL space.boxAlive.clear(); space.serverBoxesApplied = false; + space.resetPlayerState(); connectingStartTicks = SDL_GetTicks(); lastTickCount = 0; }; diff --git a/src/MenuManager.cpp b/src/MenuManager.cpp index d56ce79..8b63165 100644 --- a/src/MenuManager.cpp +++ b/src/MenuManager.cpp @@ -35,6 +35,8 @@ namespace ZL { state = GameState::MainMenu; uiManager.replaceRoot(mainMenuRoot); + if (onMainMenuEntered) onMainMenuEntered(); + uiManager.setButtonCallback("singleButton", [this](const std::string&) { enterShipSelectionSingle(); }); diff --git a/src/MenuManager.h b/src/MenuManager.h index f254118..083492b 100644 --- a/src/MenuManager.h +++ b/src/MenuManager.h @@ -66,6 +66,7 @@ namespace ZL { void notifyConnectionFailed(); // Callbacks set by Game/Space + std::function onMainMenuEntered; std::function onRestartPressed; std::function onVelocityChanged; std::function onFirePressed; diff --git a/src/Space.cpp b/src/Space.cpp index e884170..b7b558d 100644 --- a/src/Space.cpp +++ b/src/Space.cpp @@ -252,20 +252,26 @@ namespace ZL Space::~Space() { } + void Space::resetPlayerState() + { + shipAlive = true; + gameOver = false; + showExplosion = false; + explosionEmitter.setEmissionPoints(std::vector()); + Environment::shipState.position = Vector3f{ 0, 0, 45000.f }; + Environment::shipState.velocity = 0.0f; + Environment::shipState.rotation = Eigen::Matrix3f::Identity(); + Environment::inverseShipMatrix = Eigen::Matrix3f::Identity(); + Environment::zoom = DEFAULT_ZOOM; + Environment::tapDownHold = false; + playerScore = 0; + } + void Space::setup() { menuManager.onRestartPressed = [this]() { - this->shipAlive = true; - this->gameOver = false; - this->showExplosion = false; - this->explosionEmitter.setEmissionPoints(std::vector()); - Environment::shipState.position = Vector3f{ 0, 0, 45000.f }; - Environment::shipState.velocity = 0.0f; - Environment::shipState.rotation = Eigen::Matrix3f::Identity(); - Environment::inverseShipMatrix = Eigen::Matrix3f::Identity(); - Environment::zoom = DEFAULT_ZOOM; - Environment::tapDownHold = false; + resetPlayerState(); if (networkClient) { try { @@ -276,7 +282,6 @@ namespace ZL std::cerr << "Client: Failed to send RESPAWN\n"; } } - this->playerScore = 0; std::cerr << "Game restarted\n"; }; diff --git a/src/Space.h b/src/Space.h index 54f54d5..759e36f 100644 --- a/src/Space.h +++ b/src/Space.h @@ -141,6 +141,7 @@ namespace ZL { void drawTargetHud(); // рисует рамку или стрелку int pickTargetId() const; // ???????? ???? (????: ????????? ????? ????????? ?????) + void resetPlayerState(); void clearTextRendererCache(); // Crosshair HUD diff --git a/src/network/NetworkInterface.h b/src/network/NetworkInterface.h index 191445d..a5dd5c9 100644 --- a/src/network/NetworkInterface.h +++ b/src/network/NetworkInterface.h @@ -34,6 +34,7 @@ namespace ZL { public: virtual ~INetworkClient() = default; virtual void Connect(const std::string& host, uint16_t port) = 0; + virtual void Disconnect() {} virtual void Send(const std::string& message) = 0; virtual bool IsConnected() const = 0; virtual void Poll() = 0; // ƒл¤ обработки вход¤щих пакетов diff --git a/src/network/WebSocketClient.cpp b/src/network/WebSocketClient.cpp index d19463a..69301c7 100644 --- a/src/network/WebSocketClient.cpp +++ b/src/network/WebSocketClient.cpp @@ -28,6 +28,15 @@ namespace ZL { } } + void WebSocketClient::Disconnect() { + if (!ws_ || !connected) return; + connected = false; + try { + boost::beast::get_lowest_layer(*ws_).cancel(); + } + catch (...) {} + } + void WebSocketClient::startAsyncRead() { ws_->async_read(buffer_, [this](boost::beast::error_code ec, std::size_t bytes) { if (!ec) { diff --git a/src/network/WebSocketClient.h b/src/network/WebSocketClient.h index bd01ba2..956aeae 100644 --- a/src/network/WebSocketClient.h +++ b/src/network/WebSocketClient.h @@ -54,6 +54,7 @@ namespace ZL { {} void Connect(const std::string& host, uint16_t port) override; + void Disconnect() override; void Poll() override; diff --git a/src/network/WebSocketClientEmscripten.cpp b/src/network/WebSocketClientEmscripten.cpp index e879a89..1cb8e96 100644 --- a/src/network/WebSocketClientEmscripten.cpp +++ b/src/network/WebSocketClientEmscripten.cpp @@ -26,6 +26,15 @@ namespace ZL { connected = false; } + void WebSocketClientEmscripten::Disconnect() { + if (socket_ > 0) { + emscripten_websocket_close(socket_, 1000, "User disconnected"); + emscripten_websocket_delete(socket_); + socket_ = 0; + } + connected = false; + } + void WebSocketClientEmscripten::flushOutgoingQueue() { std::lock_guard lock(outgoingMutex); if (!socket_) return; diff --git a/src/network/WebSocketClientEmscripten.h b/src/network/WebSocketClientEmscripten.h index a6467ba..5e347e6 100644 --- a/src/network/WebSocketClientEmscripten.h +++ b/src/network/WebSocketClientEmscripten.h @@ -28,6 +28,7 @@ namespace ZL { virtual ~WebSocketClientEmscripten() = default; void Connect(const std::string& host, uint16_t port) override; + void Disconnect() override; void Send(const std::string& message) override; void Poll() override;