From cd6725317325f3616e90a0bea1325160a4a52587 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 20 Jan 2016 17:41:16 +0100 Subject: [PATCH] Added logic to go from spectator to player. --- include/Engine/Network/Client.h | 1 + include/Engine/Network/MessageType.h | 3 +- include/Engine/Network/Server.h | 2 +- src/Engine/Network/Client.cpp | 12 ++++++- src/Engine/Network/Server.cpp | 52 +++++++++++++++++++++------- 5 files changed, 55 insertions(+), 15 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 511ce5f7..96511baa 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -82,6 +82,7 @@ private: bool hasServerTimedOut(); EntityID createPlayer(); void sendInputCommands(); + void becomePlayer(); // Mapping Logic // Returns if local EntityID exist in map bool clientServerMapsHasEntity(EntityID clientEntityID); diff --git a/include/Engine/Network/MessageType.h b/include/Engine/Network/MessageType.h index ba9684d9..f0026190 100644 --- a/include/Engine/Network/MessageType.h +++ b/include/Engine/Network/MessageType.h @@ -13,7 +13,8 @@ enum class MessageType Snapshot, OnInputCommand, OnPlayerDamage, - PlayerConnected + PlayerConnected, + BecomePlayer }; #endif diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index e4d11334..8aabceba 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -71,7 +71,7 @@ private: void parseClientPing(); void parseServerPing(); void identifyPacketLoss(); - EntityID createPlayer(); + void createPlayer(); int GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint); // Debug event EventRelay m_EInputCommand; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 5aec3145..8eee335e 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -35,7 +35,7 @@ void Client::Update() { m_EventBroker->Process(); readFromServer(); - if (m_IsConnected) { + if (m_IsConnected) { hasServerTimedOut(); } } @@ -271,6 +271,10 @@ bool Client::OnInputCommand(const Events::InputCommand & e) disconnect(); } return true; + } else if (e.Command == "SwitchToPlayer") { + if (e.Value > 0) { + becomePlayer(); + } } else { m_InputCommandBuffer.push_back(e); //LOG_DEBUG("Client::OnInputCommand: Command is %s. Value is %f. PlayerID is %i.", e.Command.c_str(), e.Value, e.PlayerID); @@ -334,6 +338,12 @@ void Client::sendInputCommands() } } +void Client::becomePlayer() +{ + Packet packet = Packet(MessageType::BecomePlayer, m_SendPacketID); + send(packet); +} + bool Client::clientServerMapsHasEntity(EntityID clientEntityID) { return m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end(); diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 71ca7252..8a194c0e 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -89,6 +89,9 @@ void Server::parseMessageType(Packet& packet) case MessageType::OnPlayerDamage: parseOnPlayerDamage(packet); break; + case MessageType::BecomePlayer: + createPlayer(); + break; default: break; } @@ -123,8 +126,8 @@ void Server::send(Packet & packet) void Server::broadcast(Packet& packet) { - for (int i = 0; i < m_ConnectedUsers.size(); i++) { - if (m_ConnectedUsers[i].Endpoint.address() != boost::asio::ip::address()) { + for (int i = 0; i < m_ConnectedUsers.size(); i++) { + if (m_ConnectedUsers[i].Endpoint.address() != boost::asio::ip::address()) { packet.ChangePacketID(m_ConnectedUsers[i].PacketID); send(packet, i); } @@ -167,7 +170,7 @@ void Server::sendPing() for (int i = 0; i < m_ConnectedUsers.size(); i++) { if (m_ConnectedUsers[i].Endpoint.address() != boost::asio::ip::address()) { int ping = 1000 * (m_ConnectedUsers[i].StopTime - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); - LOG_INFO("Last packetID received %i: User %i's ping: %i", m_ConnectedUsers[i].PacketID, i, ping); + LOG_INFO("Last packetID received %i: User %i's ping: %i", m_ConnectedUsers[i].PacketID, i, std::abs(ping)); } } // Create ping message @@ -319,16 +322,41 @@ void Server::identifyPacketLoss() } } -EntityID Server::createPlayer() +void Server::createPlayer() { - EntityID entityID = m_World->CreateEntity(); - ComponentWrapper transform = m_World->AttachComponent(entityID, "Transform"); - transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); - ComponentWrapper model = m_World->AttachComponent(entityID, "Model"); - model["Resource"] = "Models/Core/UnitSphere.obj"; - model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); - ComponentWrapper player = m_World->AttachComponent(entityID, "Player"); - return entityID; + if (GetPlayerIDFromEndpoint(m_ReceiverEndpoint) != -1) { + // Already connected as player + LOG_WARNING("Already connected!"); + return; + } + int userIndex; + for (userIndex = 0; userIndex < m_ConnectedUsers.size(); userIndex++) { + if (m_ConnectedUsers[userIndex].Endpoint.address() == m_ReceiverEndpoint.address() && + m_ConnectedUsers[userIndex].Endpoint.port() == m_ReceiverEndpoint.port()) { + // Found user + break; + } + } + if (userIndex == m_ConnectedUsers.size()) { + LOG_WARNING("Not a recognized user!"); + return; + } + for (int playerIndex = 0; playerIndex < MAXCONNECTIONS; playerIndex++) { + if (m_PlayerDefinitions[playerIndex].Endpoint.address() == boost::asio::ip::address()) { + m_PlayerDefinitions[playerIndex] = m_ConnectedUsers[userIndex]; + EntityID entityID = m_World->CreateEntity(); + ComponentWrapper transform = m_World->AttachComponent(entityID, "Transform"); + transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); + ComponentWrapper model = m_World->AttachComponent(entityID, "Model"); + model["Resource"] = "Models/Core/UnitSphere.obj"; + model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); + ComponentWrapper player = m_World->AttachComponent(entityID, "Player"); + m_PlayerDefinitions[playerIndex].EntityID = entityID; + return; + } + } + LOG_WARNING("Server is full!"); + } int Server::GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint)