From 167c04b107364fae2f4b6fb96e916cb7ba036d75 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 2 Mar 2026 14:05:23 +0600 Subject: [PATCH 1/2] install --- proj-web/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/proj-web/README.md b/proj-web/README.md index 3d0307f..7969215 100644 --- a/proj-web/README.md +++ b/proj-web/README.md @@ -3,6 +3,7 @@ Activate the environment: ``` +C:\Work\Projects\emsdk\emsdk.bat install latest C:\Work\Projects\emsdk\emsdk.bat activate latest C:\Work\Projects\emsdk\emsdk_env.bat ``` From 3879eb1d751e221316a36f88cc850ae1b4200dc9 Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 3 Mar 2026 19:17:07 +0600 Subject: [PATCH 2/2] fixed web ship types boxes / local boxes collision and projectiles --- src/Game.cpp | 10 +++++-- src/network/LocalClient.cpp | 8 ++++-- src/network/WebSocketClientEmscripten.cpp | 34 +++++++++++++++++++---- src/network/WebSocketClientEmscripten.h | 4 +++ 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index 210d181..8bcc280 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -174,6 +174,12 @@ namespace ZL std::cerr << "Sent JOIN: " << joinMsg << std::endl; } + space.boxCoordsArr.clear(); + space.boxRenderArr.clear(); + //space.boxLabels.clear(); + space.boxAlive.clear(); + space.serverBoxesApplied = false; + lastTickCount = 0; spaceGameStarted = 1; }; @@ -440,12 +446,12 @@ namespace ZL render(); if (networkClient) { -#ifndef NETWORK +//#ifndef NETWORK auto localClient = dynamic_cast(networkClient.get()); if (localClient) { localClient->setLocalPlayerState(Environment::shipState); } -#endif +//#endif networkClient->Poll(); } mainThreadHandler.processMainThreadTasks(); diff --git a/src/network/LocalClient.cpp b/src/network/LocalClient.cpp index 1d43a78..4125593 100644 --- a/src/network/LocalClient.cpp +++ b/src/network/LocalClient.cpp @@ -418,11 +418,13 @@ namespace ZL { pinfo.position = pr.pos; pinfo.rotation = dir.toRotationMatrix(); pinfo.velocity = velocity; - pendingProjectiles.push_back(pinfo); - std::cout << "LocalClient: Created projectile at pos (" << shotPos.x() << ", " + if (pinfo.shooterId != GetClientId()) { + pendingProjectiles.push_back(pinfo); + } + std::cout << "LocalClient: Created server projectile at pos (" << shotPos.x() << ", " << shotPos.y() << ", " << shotPos.z() << ") vel (" << pr.vel.x() << ", " - << pr.vel.y() << ", " << pr.vel.z() << ")" << std::endl; + << pr.vel.y() << ", " << pr.vel.z() << ") shooter=" << pr.shooterId << std::endl; } } } diff --git a/src/network/WebSocketClientEmscripten.cpp b/src/network/WebSocketClientEmscripten.cpp index 9534cf0..931f3fe 100644 --- a/src/network/WebSocketClientEmscripten.cpp +++ b/src/network/WebSocketClientEmscripten.cpp @@ -22,13 +22,32 @@ namespace ZL { emscripten_websocket_set_onmessage_callback(socket_, this, onMessage); emscripten_websocket_set_onerror_callback(socket_, this, onError); emscripten_websocket_set_onclose_callback(socket_, this, onClose); + + connected = false; + } + + void WebSocketClientEmscripten::flushOutgoingQueue() { + std::lock_guard lock(outgoingMutex); + if (!socket_) return; + while (!outgoingQueue.empty()) { + const std::string &m = outgoingQueue.front(); + emscripten_websocket_send_utf8_text(socket_, m.c_str()); + outgoingQueue.pop(); + } } void WebSocketClientEmscripten::Send(const std::string& message) { - if (connected && socket_ > 0) { - auto signedMsg = SignMessage(message); - std::cout << "[WebWS] Sending message: " << signedMsg << std::endl; - emscripten_websocket_send_utf8_text(socket_, signedMsg.c_str()); + std::string signedMsg = SignMessage(message); + + { + std::lock_guard lock(outgoingMutex); + if (connected && socket_ > 0) { + std::cout << "[WebWS] Sending message (immediate): " << signedMsg << std::endl; + emscripten_websocket_send_utf8_text(socket_, signedMsg.c_str()); + return; + } + outgoingQueue.push(signedMsg); + std::cout << "[WebWS] Queued outgoing message (waiting for open): " << signedMsg << std::endl; } } @@ -44,11 +63,11 @@ namespace ZL { while (!localQueue.empty()) { const std::string& msg = localQueue.front(); - std::cout << "[WebWS] Processing message: " << msg << std::endl; + std::cout << "[WebWS] Processing message: " << msg << std::endl; // Передаем в базовый класс для парсинга игровых событий (BOXES, UPD, и т.д.) HandlePollMessage(msg); - + localQueue.pop(); } } @@ -59,6 +78,9 @@ namespace ZL { auto* self = static_cast(userData); self->connected = true; std::cout << "[WebWS] Connection opened" << std::endl; + + self->flushOutgoingQueue(); + return EM_TRUE; } diff --git a/src/network/WebSocketClientEmscripten.h b/src/network/WebSocketClientEmscripten.h index 2aac059..6e27c2e 100644 --- a/src/network/WebSocketClientEmscripten.h +++ b/src/network/WebSocketClientEmscripten.h @@ -20,6 +20,10 @@ namespace ZL { std::queue messageQueue; std::mutex queueMutex; + std::queue outgoingQueue; + std::mutex outgoingMutex; + void flushOutgoingQueue(); + public: WebSocketClientEmscripten() = default; virtual ~WebSocketClientEmscripten() = default;