Added logic to go from spectator to player.

This commit is contained in:
Jocke
2016-01-20 17:41:16 +01:00
parent 00588b07c5
commit cd67253173
5 changed files with 55 additions and 15 deletions
+1
View File
@@ -82,6 +82,7 @@ private:
bool hasServerTimedOut(); bool hasServerTimedOut();
EntityID createPlayer(); EntityID createPlayer();
void sendInputCommands(); void sendInputCommands();
void becomePlayer();
// Mapping Logic // Mapping Logic
// Returns if local EntityID exist in map // Returns if local EntityID exist in map
bool clientServerMapsHasEntity(EntityID clientEntityID); bool clientServerMapsHasEntity(EntityID clientEntityID);
+2 -1
View File
@@ -13,7 +13,8 @@ enum class MessageType
Snapshot, Snapshot,
OnInputCommand, OnInputCommand,
OnPlayerDamage, OnPlayerDamage,
PlayerConnected PlayerConnected,
BecomePlayer
}; };
#endif #endif
+1 -1
View File
@@ -71,7 +71,7 @@ private:
void parseClientPing(); void parseClientPing();
void parseServerPing(); void parseServerPing();
void identifyPacketLoss(); void identifyPacketLoss();
EntityID createPlayer(); void createPlayer();
int GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint); int GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint);
// Debug event // Debug event
EventRelay<Server, Events::InputCommand> m_EInputCommand; EventRelay<Server, Events::InputCommand> m_EInputCommand;
+11 -1
View File
@@ -35,7 +35,7 @@ void Client::Update()
{ {
m_EventBroker->Process<Client>(); m_EventBroker->Process<Client>();
readFromServer(); readFromServer();
if (m_IsConnected) { if (m_IsConnected) {
hasServerTimedOut(); hasServerTimedOut();
} }
} }
@@ -271,6 +271,10 @@ bool Client::OnInputCommand(const Events::InputCommand & e)
disconnect(); disconnect();
} }
return true; return true;
} else if (e.Command == "SwitchToPlayer") {
if (e.Value > 0) {
becomePlayer();
}
} else { } else {
m_InputCommandBuffer.push_back(e); 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); //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) bool Client::clientServerMapsHasEntity(EntityID clientEntityID)
{ {
return m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end(); return m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end();
+40 -12
View File
@@ -89,6 +89,9 @@ void Server::parseMessageType(Packet& packet)
case MessageType::OnPlayerDamage: case MessageType::OnPlayerDamage:
parseOnPlayerDamage(packet); parseOnPlayerDamage(packet);
break; break;
case MessageType::BecomePlayer:
createPlayer();
break;
default: default:
break; break;
} }
@@ -123,8 +126,8 @@ void Server::send(Packet & packet)
void Server::broadcast(Packet& packet) void Server::broadcast(Packet& packet)
{ {
for (int i = 0; i < m_ConnectedUsers.size(); i++) { for (int i = 0; i < m_ConnectedUsers.size(); i++) {
if (m_ConnectedUsers[i].Endpoint.address() != boost::asio::ip::address()) { if (m_ConnectedUsers[i].Endpoint.address() != boost::asio::ip::address()) {
packet.ChangePacketID(m_ConnectedUsers[i].PacketID); packet.ChangePacketID(m_ConnectedUsers[i].PacketID);
send(packet, i); send(packet, i);
} }
@@ -167,7 +170,7 @@ void Server::sendPing()
for (int i = 0; i < m_ConnectedUsers.size(); i++) { for (int i = 0; i < m_ConnectedUsers.size(); i++) {
if (m_ConnectedUsers[i].Endpoint.address() != boost::asio::ip::address()) { if (m_ConnectedUsers[i].Endpoint.address() != boost::asio::ip::address()) {
int ping = 1000 * (m_ConnectedUsers[i].StopTime - m_StartPingTime) / static_cast<double>(CLOCKS_PER_SEC); int ping = 1000 * (m_ConnectedUsers[i].StopTime - m_StartPingTime) / static_cast<double>(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 // Create ping message
@@ -319,16 +322,41 @@ void Server::identifyPacketLoss()
} }
} }
EntityID Server::createPlayer() void Server::createPlayer()
{ {
EntityID entityID = m_World->CreateEntity(); if (GetPlayerIDFromEndpoint(m_ReceiverEndpoint) != -1) {
ComponentWrapper transform = m_World->AttachComponent(entityID, "Transform"); // Already connected as player
transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); LOG_WARNING("Already connected!");
ComponentWrapper model = m_World->AttachComponent(entityID, "Model"); return;
model["Resource"] = "Models/Core/UnitSphere.obj"; }
model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); int userIndex;
ComponentWrapper player = m_World->AttachComponent(entityID, "Player"); for (userIndex = 0; userIndex < m_ConnectedUsers.size(); userIndex++) {
return entityID; 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) int Server::GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint)