diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index eb4ebc16..2993d0e5 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -43,7 +43,7 @@ public: ~Client(); void Connect(std::string address, int port); - void Update() override; + void Update(double dt) override; private: UDPClient m_Unreliable; TCPClient m_Reliable; diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index 3bae27ab..b6c47f71 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -22,7 +22,7 @@ public: Network(World* world, EventBroker* eventBroker); virtual ~Network() { }; - virtual void Update() = 0; + virtual void Update(double dt) = 0; protected: World* m_World; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 86b0e993..52f2a0c2 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -34,7 +34,7 @@ public: Server(World* world, EventBroker* eventBroker, int port); ~Server(); - void Update() override; + void Update(double dt) override; private: // Network channels @@ -44,6 +44,7 @@ private: // dont forget to set these in the childrens receive logic boost::asio::ip::address m_Address; int m_Port = 27666; + bool m_GameIsOver = false; // Sending messages to client logic std::map m_ConnectedPlayers; std::vector m_PlayersToDisconnect; @@ -87,6 +88,7 @@ private: void kick(PlayerID player); PlayerID getPlayerIDFromEndpoint(); PlayerID getPlayerIDFromEntityID(EntityID entityID); + void resetMap(); void parsePlayerTransform(Packet& packet); void parseOnInputCommand(Packet& packet); void parseClientPing(); diff --git a/resources/Schema/Components/CapturePointGameMode.xml b/resources/Schema/Components/CapturePointGameMode.xml index 3104e71f..f8e04eaf 100644 --- a/resources/Schema/Components/CapturePointGameMode.xml +++ b/resources/Schema/Components/CapturePointGameMode.xml @@ -2,4 +2,5 @@ 0.0 8.0 + 10.0 \ No newline at end of file diff --git a/resources/Schema/Components/CapturePointGameMode.xsd b/resources/Schema/Components/CapturePointGameMode.xsd index 8b81d67a..791b75b1 100644 --- a/resources/Schema/Components/CapturePointGameMode.xsd +++ b/resources/Schema/Components/CapturePointGameMode.xsd @@ -12,6 +12,9 @@ Players will be spawned when RespawnTime reaches this. + + The map will be reset when time reaches 0. + diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 480e2653..575cb2ff 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -48,7 +48,7 @@ void Client::Connect(std::string address, int port) } } -void Client::Update() +void Client::Update(double dt) { m_EventBroker->Process(); while (m_Unreliable.IsSocketAvailable()) { diff --git a/src/Engine/Network/Network.cpp b/src/Engine/Network/Network.cpp index a4683e1e..b69fba09 100644 --- a/src/Engine/Network/Network.cpp +++ b/src/Engine/Network/Network.cpp @@ -9,7 +9,7 @@ Network::Network(World* world, EventBroker* eventBroker) m_TimeoutMs = config->Get("Networking.TimeoutMs", 20000); } -void Network::Update() +void Network::Update(double dt) { updateNetworkData(); } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 87be786e..839f3a02 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -31,7 +31,7 @@ Server::~Server() } -void Server::Update() +void Server::Update(double dt) { m_Reliable.AcceptNewConnections(m_NextPlayerID, m_ConnectedPlayers); @@ -106,7 +106,23 @@ void Server::Update() } m_EventBroker->Process(); if (isReadingData) { - Network::Update(); + Network::Update(dt); + } + + if (m_GameIsOver) { + auto pool = m_World->GetComponents("CapturePointGameMode"); + if (pool != nullptr && pool->size() > 0) { + // Take the first CapturePointGameMode component found. + ComponentWrapper& modeComponent = *pool->begin(); + // Decrease timer. + double& timer = (double&)modeComponent["ResetCountdown"]; + timer -= dt; + if (timer < 0) { + resetMap(); + } + } else { + resetMap(); + } } } @@ -165,7 +181,7 @@ void Server::reliableBroadcast(Packet& packet) void Server::unreliableBroadcast(Packet& packet) { - m_Unreliable.SendToConnectedPlayers(packet, m_ConnectedPlayers); + m_Unreliable.SendToConnectedPlayers(packet, m_ConnectedPlayers); } // Send snapshot fields @@ -550,18 +566,8 @@ bool Server::OnPlayerDeath(const Events::PlayerDeath& e) bool Server::OnWin(const Events::Win & e) { - // Postpone this code and trigger after some time in a update - Events::Reset reset; - m_EventBroker->Publish(reset); - Packet removeMap(MessageType::RemoveWorld); - reliableBroadcast(removeMap); - removeWorld(); - // Hardcoded for now. - auto entityFile = ResourceManager::Load("Schema/Entities/CP_Rocky2.xml"); - entityFile->MergeInto(m_World); - Packet newWorld(MessageType::Snapshot); - createWorldSnapshot(newWorld); - reliableBroadcast(newWorld); + // Postpone the gameover reset + m_GameIsOver = true; return true; } @@ -686,4 +692,20 @@ PlayerID Server::getPlayerIDFromEntityID(EntityID entityID) } } return -1; +} + +void Server::resetMap() +{ + m_GameIsOver = false; + Events::Reset reset; + m_EventBroker->Publish(reset); + Packet removeMap(MessageType::RemoveWorld); + reliableBroadcast(removeMap); + removeWorld(); + // Hardcoded for now. + auto entityFile = ResourceManager::Load("Schema/Entities/CP_Rocky2.xml"); + entityFile->MergeInto(m_World); + Packet newWorld(MessageType::Snapshot); + createWorldSnapshot(newWorld); + reliableBroadcast(newWorld); } \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 7b80727e..9d31cecf 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -229,10 +229,10 @@ void Game::Tick() PerformanceTimer::StartTimerAndStopPrevious("Network"); m_EventBroker->Process(); if (m_NetworkClient != nullptr) { - m_NetworkClient->Update(); + m_NetworkClient->Update(dt); } if (m_NetworkServer != nullptr) { - m_NetworkServer->Update(); + m_NetworkServer->Update(dt); } //m_SoundManager->Update(dt);