From 0c1a2d31605332be424f83e7f2e81e1ca1aa4507 Mon Sep 17 00:00:00 2001 From: Jocke Date: Sat, 12 Mar 2016 14:31:15 +0100 Subject: [PATCH 1/6] WIP --- include/Engine/Network/Client.h | 4 +++- include/Engine/Network/MessageType.h | 1 + include/Engine/Network/Network.h | 1 + include/Engine/Network/Server.h | 4 ++++ include/Game/Events/ERestart.h | 16 ++++++++++++++++ src/Engine/Network/Client.cpp | 24 ++++++++++-------------- src/Engine/Network/Network.cpp | 12 ++++++++++++ src/Engine/Network/Server.cpp | 13 +++++++++++++ 8 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 include/Game/Events/ERestart.h diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index ebf46361..ca7a0e87 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -32,6 +32,8 @@ #include "../Game/Events/EDashAbility.h" #include "Network/EDisplayServerlist.h" #include "Network/EConnectRequest.h" +#include "Network/EPlayerDisconnected.h" + class Client : public Network { public: @@ -100,6 +102,7 @@ private: void parseDoubleJump(Packet& packet); void parseDashEffect(Packet& packet); void parseAmmoPickup(Packet& packet); + void parseRemoveWorld(Packet& packet); void InterpolateFields(Packet& packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType); void parseSnapshot(Packet& packet); void identifyPacketLoss(); @@ -109,7 +112,6 @@ private: void sendLocalPlayerTransform(); void becomePlayer(); void displayServerlist(); - void removeWorld(); void createMainMenu(); // Mapping Logic // Returns if local EntityID exist in map diff --git a/include/Engine/Network/MessageType.h b/include/Engine/Network/MessageType.h index c34f584e..11fb85be 100644 --- a/include/Engine/Network/MessageType.h +++ b/include/Engine/Network/MessageType.h @@ -23,6 +23,7 @@ enum class MessageType OnDashEffect, ServerlistRequest, AmmoPickup, + RemoveWorld, Invalid }; diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index 69395a85..3bae27ab 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -40,6 +40,7 @@ protected: void saveToFile(); void updateNetworkData(); void popNetworkSegmentOfHeader(Packet& packet); + void removeWorld(); }; #endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 6acb7081..1f4fb114 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -11,6 +11,7 @@ #include "Network/MessageType.h" #include "Network/PlayerDefinition.h" #include "Core/World.h" +#include "Core/EntityFile.h" #include "Core/EventBroker.h" #include "../Network/Network.h" #include "Input/EInputCommand.h" @@ -24,6 +25,7 @@ #include "Core/EPlayerDeath.h" #include "Network/EPlayerConnected.h" #include "Network/EKillDeath.h" +#include "Core/EWin.h" class Server : public Network { @@ -110,6 +112,8 @@ private: bool OnAmmoPickup(const Events::AmmoPickup& e); EventRelay m_EPlayerDeath; bool OnPlayerDeath(const Events::PlayerDeath& e); + EventRelay m_EWin; + bool OnWin(const Events::Win& e); }; #endif diff --git a/include/Game/Events/ERestart.h b/include/Game/Events/ERestart.h new file mode 100644 index 00000000..4557f6fb --- /dev/null +++ b/include/Game/Events/ERestart.h @@ -0,0 +1,16 @@ +#ifndef Restart_h__ +#define Restart_h__ + +#include "Core/EventBroker.h" +#include "Core/EntityWrapper.h" + +namespace Events +{ + +struct Restart : Event +{ +}; + +} + +#endif \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 695329b4..d25a131f 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -1,5 +1,5 @@ #include "Network/Client.h" -#include "Network/EPlayerDisconnected.h" + using namespace boost::asio::ip; Client::Client(World* world, EventBroker* eventBroker) @@ -159,6 +159,9 @@ void Client::parseMessageType(Packet& packet) case MessageType::AmmoPickup: parseAmmoPickup(packet); break; + case MessageType::RemoveWorld: + parseRemoveWorld(packet); + break; default: break; } @@ -336,6 +339,12 @@ void Client::parseAmmoPickup(Packet & packet) m_EventBroker->Publish(e); } +void Client::parseRemoveWorld(Packet & packet) +{ + removeWorld(); + +} + void Client::updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID) { for (auto field : componentInfo.FieldsInOrder) { @@ -706,19 +715,6 @@ void Client::displayServerlist() } } -void Client::removeWorld() -{ - std::vector childrenToBeDeleted; - auto rootEntites = m_World->GetDirectChildren(EntityID_Invalid); - for (auto it = rootEntites.first; it != rootEntites.second; it++) { - childrenToBeDeleted.push_back(it->second); - } - for (int i = 0; i < childrenToBeDeleted.size(); ++i) { - m_World->DeleteEntity(childrenToBeDeleted[i]); - } -} - - void Client::createMainMenu() { auto entityFile = ResourceManager::Load("Schema/Entities/StartMenu.xml"); diff --git a/src/Engine/Network/Network.cpp b/src/Engine/Network/Network.cpp index 6ac5cf69..a4683e1e 100644 --- a/src/Engine/Network/Network.cpp +++ b/src/Engine/Network/Network.cpp @@ -92,3 +92,15 @@ void Network::popNetworkSegmentOfHeader(Packet & packet) packet.ReadPrimitive(); packet.ReadPrimitive(); } + +void Network::removeWorld() +{ + std::vector childrenToBeDeleted; + auto rootEntites = m_World->GetDirectChildren(EntityID_Invalid); + for (auto it = rootEntites.first; it != rootEntites.second; it++) { + childrenToBeDeleted.push_back(it->second); + } + for (int i = 0; i < childrenToBeDeleted.size(); ++i) { + m_World->DeleteEntity(childrenToBeDeleted[i]); + } +} \ No newline at end of file diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 1f94a137..25d9b666 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -17,6 +17,7 @@ Server::Server(World* world, EventBroker* eventBroker, int port) EVENT_SUBSCRIBE_MEMBER(m_EPlayerDamage, &Server::OnPlayerDamage); EVENT_SUBSCRIBE_MEMBER(m_EAmmoPickup, &Server::OnAmmoPickup); EVENT_SUBSCRIBE_MEMBER(m_EPlayerDeath, &Server::OnPlayerDeath); + EVENT_SUBSCRIBE_MEMBER(m_EWin, &Server::OnWin); // BindWW if (port == 0) { port = config->Get("Networking.Port", 27666); @@ -542,6 +543,18 @@ bool Server::OnPlayerDeath(const Events::PlayerDeath& e) return false; } +bool Server::OnWin(const Events::Win & e) +{ + Packet removeMap(MessageType::RemoveWorld); + reliableBroadcast(removeMap); + removeWorld(); + auto entityFile = ResourceManager::Load("Schema/Entities/CP_Rocky2.xml"); + entityFile->MergeInto(m_World); + Packet newWorld(MessageType::Snapshot); + reliableBroadcast(newWorld); + return true; +} + void Server::parseClientPing() { LOG_INFO("%i: Parsing ping", m_PacketID); From c544f349fd16cf1fb027f73a0c4b9de12f37059c Mon Sep 17 00:00:00 2001 From: Jocke Date: Sat, 12 Mar 2016 17:49:50 +0100 Subject: [PATCH 2/6] The logic for removing the world is working but when we send the map again the clients memory usage goes crazy. --- include/Engine/Network/Client.h | 1 + include/Engine/Network/Server.h | 1 + include/Game/Events/{ERestart.h => EReset.h} | 6 ++-- include/Game/Systems/CapturePointSystem.h | 4 +++ include/Game/Systems/SpectatorCameraSystem.h | 4 +++ src/Engine/Network/Client.cpp | 3 +- src/Engine/Network/Server.cpp | 3 ++ src/Game/Systems/CapturePointSystem.cpp | 35 +++++++++++++++++--- src/Game/Systems/SpectatorCameraSystem.cpp | 19 ++++++++--- 9 files changed, 64 insertions(+), 12 deletions(-) rename include/Game/Events/{ERestart.h => EReset.h} (61%) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index ca7a0e87..eb4ebc16 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -33,6 +33,7 @@ #include "Network/EDisplayServerlist.h" #include "Network/EConnectRequest.h" #include "Network/EPlayerDisconnected.h" +#include "Game/Events/EReset.h" class Client : public Network { diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 1f4fb114..6b5802c5 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -26,6 +26,7 @@ #include "Network/EPlayerConnected.h" #include "Network/EKillDeath.h" #include "Core/EWin.h" +#include "Game/Events/EReset.h" class Server : public Network { diff --git a/include/Game/Events/ERestart.h b/include/Game/Events/EReset.h similarity index 61% rename from include/Game/Events/ERestart.h rename to include/Game/Events/EReset.h index 4557f6fb..39281f8e 100644 --- a/include/Game/Events/ERestart.h +++ b/include/Game/Events/EReset.h @@ -1,5 +1,5 @@ -#ifndef Restart_h__ -#define Restart_h__ +#ifndef Reset_h__ +#define Reset_h__ #include "Core/EventBroker.h" #include "Core/EntityWrapper.h" @@ -7,7 +7,7 @@ namespace Events { -struct Restart : Event +struct Reset : Event { }; diff --git a/include/Game/Systems/CapturePointSystem.h b/include/Game/Systems/CapturePointSystem.h index 6211ad49..0cba5401 100644 --- a/include/Game/Systems/CapturePointSystem.h +++ b/include/Game/Systems/CapturePointSystem.h @@ -9,6 +9,7 @@ #include "Engine/Collision/ETrigger.h" #include "Core/ECaptured.h" #include "Core/EWin.h" +#include "Game/Events/EReset.h" #include #include @@ -23,6 +24,7 @@ public: virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override; private: + void Init(); //methods which will take care of specific events EventRelay m_ETriggerTouch; bool CapturePointSystem::OnTriggerTouch(const Events::TriggerTouch& e); @@ -30,6 +32,8 @@ private: bool CapturePointSystem::OnTriggerLeave(const Events::TriggerLeave& e); EventRelay m_ECaptured; bool CapturePointSystem::OnCaptured(const Events::Captured& e); + EventRelay m_EReset; + bool CapturePointSystem::OnReset(const Events::Reset& e); void ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner); bool m_WinnerWasFound = false; diff --git a/include/Game/Systems/SpectatorCameraSystem.h b/include/Game/Systems/SpectatorCameraSystem.h index bc7aa860..6ba7294d 100644 --- a/include/Game/Systems/SpectatorCameraSystem.h +++ b/include/Game/Systems/SpectatorCameraSystem.h @@ -4,6 +4,7 @@ #include "Core/System.h" #include "Input/EInputCommand.h" #include "Network/EPlayerDisconnected.h" +#include "Game/Events/EReset.h" class SpectatorCameraSystem : public ImpureSystem { @@ -15,11 +16,14 @@ public: private: int m_PickedTeam; bool m_CamSetToTeamPick; + void reset(); EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand& e); EventRelay m_EDisconnect; bool OnDisconnect(const Events::PlayerDisconnected& e); + EventRelay m_EReset; + bool OnReset(const Events::Reset& e); }; #endif \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index d25a131f..480e2653 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -342,7 +342,8 @@ void Client::parseAmmoPickup(Packet & packet) void Client::parseRemoveWorld(Packet & packet) { removeWorld(); - + Events::Reset e; + m_EventBroker->Publish(e); } void Client::updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID) diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 25d9b666..ec4ee000 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -545,9 +545,12 @@ bool Server::OnPlayerDeath(const Events::PlayerDeath& e) bool Server::OnWin(const Events::Win & e) { + 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); diff --git a/src/Game/Systems/CapturePointSystem.cpp b/src/Game/Systems/CapturePointSystem.cpp index 4a511301..b311e0dc 100644 --- a/src/Game/Systems/CapturePointSystem.cpp +++ b/src/Game/Systems/CapturePointSystem.cpp @@ -11,7 +11,25 @@ CapturePointSystem::CapturePointSystem(SystemParams params) EVENT_SUBSCRIBE_MEMBER(m_ETriggerLeave, &CapturePointSystem::OnTriggerLeave); EVENT_SUBSCRIBE_MEMBER(m_ECaptured, &CapturePointSystem::OnCaptured); } + EVENT_SUBSCRIBE_MEMBER(m_EReset, &CapturePointSystem::OnReset); + Init(); +} +void CapturePointSystem::Init() +{ + m_WinnerWasFound = false; + //need to track these variables for the captureSystem to work as per design! + m_RedTeamNextPossibleCapturePoint = m_NotACapturePoint; + m_BlueTeamNextPossibleCapturePoint = m_NotACapturePoint; + m_RedTeamHomeCapturePoint = m_NotACapturePoint; + m_BlueTeamHomeCapturePoint = m_NotACapturePoint; + m_NumberOfCapturePoints = 0; + m_ResetTimers = false; + m_RecentlyCapturedNeedNextCapturePointNow = false; + m_CapturePointNumberToEntityMap.clear(); + //vectors which will keep track of enter/leave changes + m_ETriggerTouchVector.clear(); + m_ETriggerLeaveVector.clear(); } //here all capturepoints will update their component @@ -24,6 +42,9 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp if (m_WinnerWasFound) { return; } + if (!capturePointEntity.Valid()) { + return; + } const int capturePointNumber = cCapturePoint["CapturePointNumber"]; const bool hasTeamComponent = capturePointEntity.HasComponent("Team"); @@ -60,7 +81,7 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp } //if we havent received all capturepoints yet, just return - if (m_NumberOfCapturePoints == 0 || m_NumberOfCapturePoints != m_CapturePointNumberToEntityMap.size()) { + if (m_NumberOfCapturePoints == 0 || m_NumberOfCapturePoints > m_CapturePointNumberToEntityMap.size()) { m_CapturePointNumberToEntityMap.insert(std::make_pair(capturePointNumber, capturePointEntity)); return; } @@ -232,10 +253,10 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp } -void CapturePointSystem::ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner) { +void CapturePointSystem::ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner) +{ (bool&)capturePointModels["Model"]["Visible"] = isOwner; - for (auto& capModel : capturePointModels.ChildrenWithComponent("Transform")) - { + for (auto& capModel : capturePointModels.ChildrenWithComponent("Transform")) { if (capModel.HasComponent("Model")) { (bool&)capModel["Model"]["Visible"] = isOwner; } @@ -269,3 +290,9 @@ bool CapturePointSystem::OnCaptured(const Events::Captured& e) m_ResetTimers = true; return true; } + +bool CapturePointSystem::OnReset(const Events::Reset& e) +{ + Init(); + return true; +} \ No newline at end of file diff --git a/src/Game/Systems/SpectatorCameraSystem.cpp b/src/Game/Systems/SpectatorCameraSystem.cpp index 23dfb164..bfc401c5 100644 --- a/src/Game/Systems/SpectatorCameraSystem.cpp +++ b/src/Game/Systems/SpectatorCameraSystem.cpp @@ -27,6 +27,14 @@ void SpectatorCameraSystem::Update(double dt) } } +void SpectatorCameraSystem::reset() +{ + m_CamSetToTeamPick = false; + // They will also be set to menu, so unlock mouse just in case they were in game with locked mouse. + Events::UnlockMouse unlock; + m_EventBroker->Publish(unlock); +} + bool SpectatorCameraSystem::OnInputCommand(const Events::InputCommand& e) { // Only the client should do this, and only if player is not spawned. @@ -95,10 +103,13 @@ bool SpectatorCameraSystem::OnDisconnect(const Events::PlayerDisconnected& e) // If local player gets disconnected, they should be set to // the spectator camera next time a map loads that has one. if (e.Entity == LocalPlayer.ID) { - m_CamSetToTeamPick = false; - // They will also be set to menu, so unlock mouse just in case they were in game with locked mouse. - Events::UnlockMouse unlock; - m_EventBroker->Publish(unlock); + reset(); } return true; } + +bool SpectatorCameraSystem::OnReset(const Events::Reset & e) +{ + reset(); + return true; +} From 60df30fa59643fab0d66586a6a69b45d56956088 Mon Sep 17 00:00:00 2001 From: Jocke Date: Sat, 12 Mar 2016 19:36:12 +0100 Subject: [PATCH 3/6] Scoreboard is now works. --- include/Engine/Network/Server.h | 1 + include/Game/Systems/ScoreScreenSystem.h | 3 +++ src/Engine/Network/Server.cpp | 13 ++++++++++--- src/Game/Systems/ScoreScreenSystem.cpp | 12 ++++++++++++ src/Game/Systems/SpectatorCameraSystem.cpp | 1 + 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 6b5802c5..86b0e993 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -74,6 +74,7 @@ private: void reliableBroadcast(Packet& packet); void unreliableBroadcast(Packet& packet); void sendSnapshot(); + void createWorldSnapshot(Packet& packet); void addPlayersToPacket(Packet& packet, EntityID entityID); void addChildrenToPacket(Packet& packet, EntityID entityID); void addInputCommandsToPacket(Packet& packet); diff --git a/include/Game/Systems/ScoreScreenSystem.h b/include/Game/Systems/ScoreScreenSystem.h index 2559bfb3..265c8ec0 100644 --- a/include/Game/Systems/ScoreScreenSystem.h +++ b/include/Game/Systems/ScoreScreenSystem.h @@ -8,6 +8,7 @@ #include "Core/EPlayerSpawned.h" #include "Network/EPlayerConnected.h" #include "Network/EPlayerDisconnected.h" +#include "Game/Events/EReset.h" #include "GLM.h" class ScoreScreenSystem : public PureSystem @@ -25,6 +26,8 @@ public: bool OnPlayerConnected(const Events::PlayerConnected& e); EventRelay m_EPlayerDisconnected; bool OnPlayerDisconnected(const Events::PlayerDisconnected& e); + EventRelay m_EReset; + bool OnReset(const Events::Reset& e); private: struct PlayerData { diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index ec4ee000..87be786e 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -174,10 +174,16 @@ void Server::sendSnapshot() Packet packet(MessageType::Snapshot); addInputCommandsToPacket(packet); addPlayersToPacket(packet, EntityID_Invalid); - //addChildrenToPacket(packet, EntityID_Invalid); unreliableBroadcast(packet); } +// Send snapshot fields +void Server::createWorldSnapshot(Packet& packet) +{ + addInputCommandsToPacket(packet); + addChildrenToPacket(packet, EntityID_Invalid); +} + void Server::addInputCommandsToPacket(Packet& packet) { // Number of input commands @@ -380,8 +386,7 @@ void Server::parseTCPConnect(Packet & packet) m_Reliable.Send(connnectPacket, m_ConnectedPlayers.at(playerID)); Packet firstSnapshot(MessageType::Snapshot); - addInputCommandsToPacket(firstSnapshot); - addChildrenToPacket(firstSnapshot, EntityID_Invalid); + createWorldSnapshot(firstSnapshot); m_Reliable.Send(firstSnapshot); // Send notification that a player has connected @@ -545,6 +550,7 @@ 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); @@ -554,6 +560,7 @@ bool Server::OnWin(const Events::Win & e) auto entityFile = ResourceManager::Load("Schema/Entities/CP_Rocky2.xml"); entityFile->MergeInto(m_World); Packet newWorld(MessageType::Snapshot); + createWorldSnapshot(newWorld); reliableBroadcast(newWorld); return true; } diff --git a/src/Game/Systems/ScoreScreenSystem.cpp b/src/Game/Systems/ScoreScreenSystem.cpp index 94674432..58e1190b 100644 --- a/src/Game/Systems/ScoreScreenSystem.cpp +++ b/src/Game/Systems/ScoreScreenSystem.cpp @@ -9,6 +9,7 @@ ScoreScreenSystem::ScoreScreenSystem(SystemParams params) EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &ScoreScreenSystem::OnPlayerSpawn); EVENT_SUBSCRIBE_MEMBER(m_EPlayerConnected, &ScoreScreenSystem::OnPlayerConnected); EVENT_SUBSCRIBE_MEMBER(m_EPlayerDisconnected, &ScoreScreenSystem::OnPlayerDisconnected); + EVENT_SUBSCRIBE_MEMBER(m_EReset, &ScoreScreenSystem::OnReset); } void ScoreScreenSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt) @@ -156,3 +157,14 @@ bool ScoreScreenSystem::OnPlayerDisconnected(const Events::PlayerDisconnected& e m_DisconnectedIdentities.push_back(e.PlayerID); return 0; } + +bool ScoreScreenSystem::OnReset(const Events::Reset & e) +{ + for (auto& it : m_PlayerIdentities) { + it.second.Deaths = 0; + it.second.Kills = 0; + it.second.Team = 1; + it.second.Player = EntityWrapper::Invalid; + } + return true; +} diff --git a/src/Game/Systems/SpectatorCameraSystem.cpp b/src/Game/Systems/SpectatorCameraSystem.cpp index bfc401c5..ed624c69 100644 --- a/src/Game/Systems/SpectatorCameraSystem.cpp +++ b/src/Game/Systems/SpectatorCameraSystem.cpp @@ -9,6 +9,7 @@ SpectatorCameraSystem::SpectatorCameraSystem(SystemParams params) { EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &SpectatorCameraSystem::OnInputCommand); EVENT_SUBSCRIBE_MEMBER(m_EDisconnect, &SpectatorCameraSystem::OnDisconnect); + EVENT_SUBSCRIBE_MEMBER(m_EReset, &SpectatorCameraSystem::OnReset); } void SpectatorCameraSystem::Update(double dt) From f8f536802fab28c0bed29bfd6feccc6f3eacc98b Mon Sep 17 00:00:00 2001 From: Jocke Date: Sat, 12 Mar 2016 20:28:48 +0100 Subject: [PATCH 4/6] Time for ending the game is now in CapturePointGameMode component. The timer i counted down to 0 and then the map is "Reset". --- include/Engine/Network/Client.h | 2 +- include/Engine/Network/Network.h | 2 +- include/Engine/Network/Server.h | 4 +- .../Components/CapturePointGameMode.xml | 1 + .../Components/CapturePointGameMode.xsd | 3 ++ src/Engine/Network/Client.cpp | 2 +- src/Engine/Network/Network.cpp | 2 +- src/Engine/Network/Server.cpp | 52 +++++++++++++------ src/Game/Game.cpp | 4 +- 9 files changed, 50 insertions(+), 22 deletions(-) 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); From b7d88808e2721284cbe725fbea935d9a822e6efe Mon Sep 17 00:00:00 2001 From: Jocke Date: Sat, 12 Mar 2016 21:38:46 +0100 Subject: [PATCH 5/6] Redid timers. --- include/Engine/Network/Client.h | 12 ++++++------ include/Engine/Network/Server.h | 14 +++++++------- src/Engine/Network/Client.cpp | 13 ++++++++----- src/Engine/Network/Server.cpp | 20 +++++++++++--------- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 2993d0e5..29e9ac9a 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -77,10 +77,10 @@ private: // Network logic PlayerDefinition m_PlayerDefinitions[8]; SnapshotDefinitions m_NextSnapshot; - double m_DurationOfPingTime; - std::clock_t m_StartPingTime; - std::clock_t m_TimeSinceSentInputs; - unsigned int m_SendInputIntervalMs; + double m_DurationOfPingTime = 0; + double m_StartPingTime = 0; + double m_TimeSinceSentInputs = 0; + double m_SendInputInterval = 0.033; std::vector m_InputCommandBuffer; // Private member functions @@ -141,8 +141,8 @@ private: UDPClient m_ServerlistRequest; std::vector m_Serverlist; bool m_SearchingForServers = false; - std::clock_t m_StartSearchTime; - double m_SearchingTime = 200; // Config I guess + double m_TimeSearched = 0; + double m_SearchingTime = 0.2; // Config I guess }; #endif diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 52f2a0c2..828a1d99 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -52,14 +52,14 @@ private: char readBuffer[BUFFERSIZE] = { 0 }; size_t bytesRead = 0; // time for previouse message - std::clock_t previousePingMessage = std::clock(); - std::clock_t previousSnapshotMessage = std::clock(); - std::clock_t timOutTimer = std::clock(); + double previousePingMessage = 0; + double previousSnapshotMessage = 0; + double timOutTimer = 0; - // How often we send messages (milliseconds) - float pingIntervalMs; - float snapshotInterval; - int checkTimeOutInterval = 100; + // How often we send messages (seconds) + double pingInterval = 1; + double snapshotInterval = 0.05; + double checkTimeOutInterval = 0.1; int m_NextPlayerID = 0; std::vector m_InputCommandsToBroadcast; //Timers diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 575cb2ff..328a2144 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -12,7 +12,7 @@ Client::Client(World* world, EventBroker* eventBroker) auto config = ResourceManager::Load("Config.ini"); m_PlayerName = config->Get("Networking.Name", "Raptorcopter"); - m_SendInputIntervalMs = config->Get("Networking.SendInputIntervalMs", 33); + m_SendInputInterval = config->Get("Networking.SendInputIntervalMs", 33) / 1000.0; LOG_INFO("Client initialized"); m_ServerlistRequest.Connect(m_PlayerName, "192.168.1.255", 32554); @@ -85,7 +85,9 @@ void Client::Update(double dt) } if (m_SearchingForServers) { - if (m_SearchingTime < (1000* (std::clock() - m_StartSearchTime) / (double)CLOCKS_PER_SEC)) { + m_TimeSearched += dt; + if (m_SearchingTime < m_TimeSearched) { + m_TimeSearched = 0; m_SearchingForServers = false; //displayServerlist(); Events::DisplayServerlist e; @@ -96,9 +98,10 @@ void Client::Update(double dt) if (m_IsConnected) { // Don't send 1 input in 1 packet, bunch em up. - if (m_SendInputIntervalMs < (1000 * (std::clock() - m_TimeSinceSentInputs) / (double)CLOCKS_PER_SEC)) { + m_TimeSinceSentInputs += dt; + if (m_SendInputInterval < m_TimeSinceSentInputs) { sendInputCommands(); - m_TimeSinceSentInputs = std::clock(); + m_TimeSinceSentInputs = 0; } // HACK: Send absolute player positions for now to avoid desync until we have reliable messages sendLocalPlayerTransform(); @@ -593,7 +596,7 @@ bool Client::OnConnectRequest(const Events::ConnectRequest& e) bool Client::OnSearchForServers(const Events::SearchForServers& e) { m_SearchingForServers = true; - m_StartSearchTime = std::clock(); + m_TimeSearched = 0; m_Serverlist.clear(); Packet packet(MessageType::ServerlistRequest); m_ServerlistRequest.Broadcast(packet, 13); // TODO: Config diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 839f3a02..82d5f3b1 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -5,8 +5,8 @@ Server::Server(World* world, EventBroker* eventBroker, int port) , m_ServerlistRequest(13) { ConfigFile* config = ResourceManager::Load("Config.ini"); - snapshotInterval = 1000 * config->Get("Networking.SnapshotInterval", 0.05f); - pingIntervalMs = config->Get("Networking.PingIntervalMs", 1000); + snapshotInterval = config->Get("Networking.SnapshotInterval", 0.05); + pingInterval = config->Get("Networking.PingIntervalMs", 1000) / 1000.0; m_ServerName = config->Get("Networking.Name", "Unnamed"); // Subscribe to events @@ -87,22 +87,24 @@ void Server::Update(double dt) } m_PlayersToDisconnect.clear(); - std::clock_t currentTime = std::clock(); // Send snapshot - if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + previousSnapshotMessage += dt; + if (snapshotInterval < previousSnapshotMessage) { sendSnapshot(); - previousSnapshotMessage = currentTime; + previousSnapshotMessage = 0; } // Send pings each - if (pingIntervalMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { + previousePingMessage += dt; + if (pingInterval < previousePingMessage) { sendPing(); - previousePingMessage = currentTime; + previousePingMessage = 0; } // Time out logic - if (checkTimeOutInterval < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { + timOutTimer += dt; + if (checkTimeOutInterval < timOutTimer) { checkForTimeOuts(); - timOutTimer = currentTime; + timOutTimer = 0; } m_EventBroker->Process(); if (isReadingData) { From ac20e41a5db333885da70f73efca125d13ddcd66 Mon Sep 17 00:00:00 2001 From: William Moberg Date: Sun, 13 Mar 2016 14:23:56 +0100 Subject: [PATCH 6/6] Fixed merge conflicts. Scoreboard updates team when a team is picked. Fixed some code standard violations and misspellings. --- include/Engine/Core/ECaptured.h | 4 ++-- include/Engine/Network/Server.h | 4 ++-- include/Game/Events/EReset.h | 4 ++-- include/Game/Systems/ScoreScreenSystem.h | 3 +++ src/Engine/Network/Server.cpp | 14 +++++++------- src/Game/Systems/CapturePointSystem.cpp | 4 ++-- src/Game/Systems/ScoreScreenSystem.cpp | 12 ++++++++++++ 7 files changed, 30 insertions(+), 15 deletions(-) diff --git a/include/Engine/Core/ECaptured.h b/include/Engine/Core/ECaptured.h index 047c5d7d..e0de0f31 100644 --- a/include/Engine/Core/ECaptured.h +++ b/include/Engine/Core/ECaptured.h @@ -1,5 +1,5 @@ -#ifndef ECaptured_h__ -#define ECaptured_h__ +#ifndef Events_Captured_h__ +#define Events_Captured_h__ #include "EventBroker.h" #include "../Core/Entity.h" diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 828a1d99..67859143 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -52,9 +52,9 @@ private: char readBuffer[BUFFERSIZE] = { 0 }; size_t bytesRead = 0; // time for previouse message - double previousePingMessage = 0; + double previousPingMessage = 0; double previousSnapshotMessage = 0; - double timOutTimer = 0; + double timeOutTimer = 0; // How often we send messages (seconds) double pingInterval = 1; diff --git a/include/Game/Events/EReset.h b/include/Game/Events/EReset.h index 39281f8e..70fea123 100644 --- a/include/Game/Events/EReset.h +++ b/include/Game/Events/EReset.h @@ -1,5 +1,5 @@ -#ifndef Reset_h__ -#define Reset_h__ +#ifndef Events_Reset_h__ +#define Events_Reset_h__ #include "Core/EventBroker.h" #include "Core/EntityWrapper.h" diff --git a/include/Game/Systems/ScoreScreenSystem.h b/include/Game/Systems/ScoreScreenSystem.h index 265c8ec0..6b2bb113 100644 --- a/include/Game/Systems/ScoreScreenSystem.h +++ b/include/Game/Systems/ScoreScreenSystem.h @@ -9,6 +9,7 @@ #include "Network/EPlayerConnected.h" #include "Network/EPlayerDisconnected.h" #include "Game/Events/EReset.h" +#include "Engine/Input/EInputCommand.h" #include "GLM.h" class ScoreScreenSystem : public PureSystem @@ -28,6 +29,8 @@ public: bool OnPlayerDisconnected(const Events::PlayerDisconnected& e); EventRelay m_EReset; bool OnReset(const Events::Reset& e); + EventRelay m_EInputCommand; + bool OnInputCommand(const Events::InputCommand& e); private: struct PlayerData { diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index b769e44e..dc40ea3f 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -94,17 +94,17 @@ void Server::Update(double dt) previousSnapshotMessage = 0; } // Send pings each - previousePingMessage += dt; - if (pingInterval < previousePingMessage) { + previousPingMessage += dt; + if (pingInterval < previousPingMessage) { sendPing(); - previousePingMessage = 0; + previousPingMessage = 0; } // Time out logic - timOutTimer += dt; - if (checkTimeOutInterval < timOutTimer) { + timeOutTimer += dt; + if (checkTimeOutInterval < timeOutTimer) { checkForTimeOuts(); - timOutTimer = 0; + timeOutTimer = 0; } m_EventBroker->Process(); if (isReadingData) { @@ -117,7 +117,7 @@ void Server::Update(double dt) // Take the first CapturePointGameMode component found. ComponentWrapper& modeComponent = *pool->begin(); // Decrease timer. - double& timer = (double&)modeComponent["ResetCountdown"]; + Field timer = modeComponent["ResetCountdown"]; timer -= dt; if (timer < 0) { resetMap(); diff --git a/src/Game/Systems/CapturePointSystem.cpp b/src/Game/Systems/CapturePointSystem.cpp index 16e5b005..6739b814 100644 --- a/src/Game/Systems/CapturePointSystem.cpp +++ b/src/Game/Systems/CapturePointSystem.cpp @@ -10,9 +10,9 @@ CapturePointSystem::CapturePointSystem(SystemParams params) EVENT_SUBSCRIBE_MEMBER(m_ETriggerTouch, &CapturePointSystem::OnTriggerTouch); EVENT_SUBSCRIBE_MEMBER(m_ETriggerLeave, &CapturePointSystem::OnTriggerLeave); EVENT_SUBSCRIBE_MEMBER(m_ECaptured, &CapturePointSystem::OnCaptured); + EVENT_SUBSCRIBE_MEMBER(m_EReset, &CapturePointSystem::OnReset); + Init(); } - EVENT_SUBSCRIBE_MEMBER(m_EReset, &CapturePointSystem::OnReset); - Init(); } void CapturePointSystem::Init() diff --git a/src/Game/Systems/ScoreScreenSystem.cpp b/src/Game/Systems/ScoreScreenSystem.cpp index 78cee3ee..02518b8c 100644 --- a/src/Game/Systems/ScoreScreenSystem.cpp +++ b/src/Game/Systems/ScoreScreenSystem.cpp @@ -10,6 +10,7 @@ ScoreScreenSystem::ScoreScreenSystem(SystemParams params) EVENT_SUBSCRIBE_MEMBER(m_EPlayerConnected, &ScoreScreenSystem::OnPlayerConnected); EVENT_SUBSCRIBE_MEMBER(m_EPlayerDisconnected, &ScoreScreenSystem::OnPlayerDisconnected); EVENT_SUBSCRIBE_MEMBER(m_EReset, &ScoreScreenSystem::OnReset); + EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &ScoreScreenSystem::OnInputCommand); } void ScoreScreenSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt) @@ -168,3 +169,14 @@ bool ScoreScreenSystem::OnReset(const Events::Reset & e) } return true; } + +bool ScoreScreenSystem::OnInputCommand(const Events::InputCommand & e) +{ + if (e.Command != "PickTeam" || e.PlayerID == -1 || e.Value == 0) { + return false; + } + + m_PlayerIdentities.at(e.PlayerID).Team = e.Value; + + return true; +}