From fa0b52caec253c9c8fcb504986c1789c670be608 Mon Sep 17 00:00:00 2001 From: stiffly Date: Wed, 9 Mar 2016 15:49:42 +0100 Subject: [PATCH] When you disconnect you will delete the world and return to the menu. --- include/Engine/Network/Client.h | 4 +++- src/Engine/Network/Client.cpp | 42 +++++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 9be447be..3033542d 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -17,6 +17,7 @@ #include "Network/TCPClient.h" #include "Network/SnapshotDefinitions.h" #include "Core/World.h" +#include "Core/EntityFile.h" #include "Core/EventBroker.h" #include "Core/ConfigFile.h" #include "Core/EPlayerDeath.h" @@ -31,7 +32,6 @@ #include "../Game/Events/EDashAbility.h" #include "Network/EDisplayServerlist.h" #include "Network/EConnectRequest.h" - class Client : public Network { public: @@ -109,6 +109,8 @@ private: void sendLocalPlayerTransform(); void becomePlayer(); void displayServerlist(); + void removeWorld(); + void createMainMenu(); // Mapping Logic // Returns if local EntityID exist in map bool clientServerMapsHasEntity(EntityID clientEntityID); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 6b5dd092..f9905511 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -181,8 +181,8 @@ void Client::parseTCPConnect(Packet& packet) Packet UnreliablePacket(MessageType::Connect, m_SendPacketID); // Add player id and other stuff packet.WritePrimitive(m_PlayerID); - // m_Unreliable.Send(packet); - // LOG_INFO("Sent UDP Connect Server"); + // m_Unreliable.Send(packet); + // LOG_INFO("Sent UDP Connect Server"); } void Client::parsePlayerConnected(Packet & packet) @@ -457,12 +457,14 @@ void Client::parseSnapshot(Packet& packet) void Client::disconnect() { + removeWorld(); m_IsConnected = false; m_PreviousPacketID = 0; m_PacketID = 0; Packet packet(MessageType::Disconnect, m_SendPacketID); m_Reliable.Send(packet); m_Reliable.Disconnect(); + createMainMenu(); } bool Client::OnInputCommand(const Events::InputCommand & e) @@ -549,22 +551,16 @@ bool Client::OnDashAbility(const Events::DashAbility& e) bool Client::OnConnectRequest(const Events::ConnectRequest& e) { - 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]); - } - if (m_Reliable.Connect(m_PlayerName, e.IP, e.Port)) { - // The client send a successful connect message + removeWorld(); + if (m_Reliable.Connect(m_PlayerName, e.IP, e.Port)) { + // The client sent a successful connect message return true; } else { // The client could not send a successful connect message + createMainMenu(); + // Load the main menu again ? return false; - // Load the main menu again ? } return false; } @@ -695,6 +691,26 @@ 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/MainMenu.xml"); + entityFile->MergeInto(m_World); +} + bool Client::clientServerMapsHasEntity(EntityID clientEntityID) { if (m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end()) {