#pragma once #ifdef NETWORK #include "NetworkInterface.h" #include #include #include #include #include namespace ZL { class WebSocketClient : public INetworkClient { private: // Переиспользуем io_context из TaskManager boost::asio::io_context& ioc_; // Объекты переехали в члены класса std::unique_ptr> ws_; boost::beast::flat_buffer buffer_; std::queue messageQueue; std::mutex queueMutex; // Защита для messageQueue std::queue> writeQueue_; bool isWriting_ = false; std::mutex writeMutex_; // Отдельный мьютекс для очереди записи bool connected = false; int clientId = -1; std::unordered_map remotePlayers; std::mutex playersMutex; // Серверные коробки std::vector> serverBoxes_; std::mutex boxesMutex; std::vector pendingProjectiles_; std::mutex projMutex_; std::vector pendingDeaths_; std::mutex deathsMutex_; std::vector pendingRespawns_; std::mutex respawnMutex_; std::vector pendingBoxDestructions_; std::mutex boxDestructionsMutex_; void startAsyncRead(); void processIncomingMessage(const std::string& msg); public: explicit WebSocketClient(boost::asio::io_context& ioc) : ioc_(ioc) {} void Connect(const std::string& host, uint16_t port) override; void Poll() override; void Send(const std::string& message) override; void doWrite(); bool IsConnected() const override { return connected; } int GetClientId() const override { return clientId; } std::unordered_map getRemotePlayers() override { std::lock_guard lock(playersMutex); return remotePlayers; } std::vector> getServerBoxes() override { std::lock_guard lock(boxesMutex); return serverBoxes_; } std::vector getPendingProjectiles() override; std::vector getPendingDeaths() override; std::vector getPendingRespawns() override; std::vector getPendingBoxDestructions() override; }; } #endif