#pragma once #include "NetworkInterface.h" #include #include #include #include #include namespace ZL { struct LocalServerBox { Eigen::Vector3f position; Eigen::Matrix3f rotation; float collisionRadius = 2.0f; bool destroyed = false; }; struct LocalProjectile { int shooterId = -1; uint64_t spawnMs = 0; Eigen::Vector3f pos; Eigen::Vector3f vel; float lifeMs = 5000.0f; }; struct LocalNPC { int id = -1; ClientState currentState; ClientStateInterval stateHistory; Eigen::Vector3f targetPosition; uint64_t lastStateUpdateMs = 0; }; class LocalClient : public INetworkClient { private: std::queue messageQueue; std::vector serverBoxes; std::vector projectiles; std::vector pendingProjectiles; std::vector pendingDeaths; std::vector pendingBoxDestructions; std::vector pendingRespawns; uint64_t lastUpdateMs = 0; ClientState localPlayerState; bool hasLocalPlayerState = false; std::vector npcs; void updatePhysics(); void checkCollisions(); void generateBoxes(); void initializeNPCs(); void updateNPCs(); Eigen::Vector3f generateRandomPosition(); public: void Connect(const std::string& host, uint16_t port) override; void Poll() override; void Send(const std::string& message) override; bool IsConnected() const override { return true; } int GetClientId() const override { return 1; } std::vector getPendingProjectiles() override; std::unordered_map getRemotePlayers() override; std::vector> getServerBoxes() override; std::vector getPendingDeaths() override; std::vector getPendingRespawns() override { return {}; } std::vector getPendingBoxDestructions() override; void setLocalPlayerState(const ClientState& state) { localPlayerState = state; hasLocalPlayerState = true; } }; }