Added logic to go from spectator to player.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ enum class MessageType
|
|||||||
Snapshot,
|
Snapshot,
|
||||||
OnInputCommand,
|
OnInputCommand,
|
||||||
OnPlayerDamage,
|
OnPlayerDamage,
|
||||||
PlayerConnected
|
PlayerConnected,
|
||||||
|
BecomePlayer
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user