Client now has authority over its own absolute position and orientation until we have reliable input messaging

This commit is contained in:
2016-01-24 19:00:50 +01:00
parent 9f3d887ac4
commit 0fb1dbcae1
5 changed files with 61 additions and 3 deletions
+5 -1
View File
@@ -50,6 +50,7 @@ private:
PlayerID m_PlayerID = -1; PlayerID m_PlayerID = -1;
EntityID m_ServerEntityID = std::numeric_limits<EntityID>::max(); EntityID m_ServerEntityID = std::numeric_limits<EntityID>::max();
bool m_IsConnected = false; bool m_IsConnected = false;
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
// Server Client Lookup map // Server Client Lookup map
// Assumes that root node for client and server is EntityID 0. // Assumes that root node for client and server is EntityID 0.
@@ -87,6 +88,7 @@ private:
bool hasServerTimedOut(); bool hasServerTimedOut();
EntityID createPlayer(); EntityID createPlayer();
void sendInputCommands(); void sendInputCommands();
void sendLocalPlayerTransform();
void becomePlayer(); void becomePlayer();
// Mapping Logic // Mapping Logic
// Returns if local EntityID exist in map // Returns if local EntityID exist in map
@@ -100,8 +102,10 @@ private:
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
EventRelay<Client, Events::InputCommand> m_EInputCommand; EventRelay<Client, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e); bool OnInputCommand(const Events::InputCommand& e);
EventRelay<Client, Events::PlayerDamage> m_EPlayeDamage; EventRelay<Client, Events::PlayerDamage> m_EPlayerDamage;
bool OnPlayerDamage(const Events::PlayerDamage& e); bool OnPlayerDamage(const Events::PlayerDamage& e);
EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
}; };
#endif #endif
+2 -1
View File
@@ -17,7 +17,8 @@ enum class MessageType
Kick, Kick,
OnPlayerSpawned, OnPlayerSpawned,
EntityDeleted, EntityDeleted,
ComponentDeleted ComponentDeleted,
PlayerTransform
}; };
#endif #endif
+1
View File
@@ -89,6 +89,7 @@ private:
bool OnEntityDeleted(const Events::EntityDeleted& e); bool OnEntityDeleted(const Events::EntityDeleted& e);
EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted; EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted;
bool OnComponentDeleted(const Events::ComponentDeleted& e); bool OnComponentDeleted(const Events::ComponentDeleted& e);
void parsePlayerTransform(Packet& packet);
}; };
#endif #endif
+30 -1
View File
@@ -31,7 +31,8 @@ void Client::Start(World* world, EventBroker* eventBroker)
// Subscribe to events // Subscribe to events
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Client::OnInputCommand); EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Client::OnInputCommand);
EVENT_SUBSCRIBE_MEMBER(m_EPlayeDamage, &Client::OnPlayerDamage); EVENT_SUBSCRIBE_MEMBER(m_EPlayerDamage, &Client::OnPlayerDamage);
EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &Client::OnPlayerSpawned);
m_Socket.connect(m_ReceiverEndpoint); m_Socket.connect(m_ReceiverEndpoint);
LOG_INFO("I am client. BIP BOP"); LOG_INFO("I am client. BIP BOP");
@@ -48,6 +49,7 @@ void Client::Update()
sendInputCommands(); sendInputCommands();
m_TimeSinceSentInputs = std::clock(); m_TimeSinceSentInputs = std::clock();
} }
sendLocalPlayerTransform();
} }
Network::Update(); Network::Update();
} }
@@ -342,6 +344,33 @@ bool Client::OnPlayerDamage(const Events::PlayerDamage & e)
return false; return false;
} }
bool Client::OnPlayerSpawned(const Events::PlayerSpawned& e)
{
if (e.PlayerID == -1) {
m_LocalPlayer = e.Player;
}
return true;
}
void Client::sendLocalPlayerTransform()
{
if (!m_LocalPlayer.Valid()) {
return;
}
ComponentWrapper cTransform = m_LocalPlayer["Transform"];
glm::vec3& position = cTransform["Position"];
glm::vec3& orientation = cTransform["Orientation"];
Packet packet(MessageType::PlayerTransform, m_SendPacketID);
packet.WritePrimitive(position.x);
packet.WritePrimitive(position.y);
packet.WritePrimitive(position.z);
packet.WritePrimitive(orientation.x);
packet.WritePrimitive(orientation.y);
packet.WritePrimitive(orientation.z);
send(packet);
}
void Client::identifyPacketLoss() void Client::identifyPacketLoss()
{ {
// if no packets lost, difference should be equal to 1 // if no packets lost, difference should be equal to 1
+23
View File
@@ -101,6 +101,9 @@ void Server::parseMessageType(Packet& packet)
case MessageType::BecomePlayer: case MessageType::BecomePlayer:
createPlayer(); createPlayer();
break; break;
case MessageType::PlayerTransform:
parsePlayerTransform(packet);
break;
default: default:
break; break;
} }
@@ -488,3 +491,23 @@ bool Server::OnComponentDeleted(const Events::ComponentDeleted & e)
} }
return false; return false;
} }
void Server::parsePlayerTransform(Packet& packet)
{
glm::vec3 position;
glm::vec3 orientation;
position.x = packet.ReadPrimitive<float>();
position.y = packet.ReadPrimitive<float>();
position.z = packet.ReadPrimitive<float>();
orientation.x = packet.ReadPrimitive<float>();
orientation.y = packet.ReadPrimitive<float>();
orientation.z = packet.ReadPrimitive<float>();
PlayerID playerID = GetPlayerIDFromEndpoint(m_ReceiverEndpoint);
EntityWrapper player(m_World, m_PlayerDefinitions[playerID].EntityID);
if (player.Valid()) {
player["Transform"]["Position"] = position;
player["Transform"]["Orientation"] = orientation;
}
}