Client now has authority over its own absolute position and orientation until we have reliable input messaging
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ enum class MessageType
|
|||||||
Kick,
|
Kick,
|
||||||
OnPlayerSpawned,
|
OnPlayerSpawned,
|
||||||
EntityDeleted,
|
EntityDeleted,
|
||||||
ComponentDeleted
|
ComponentDeleted,
|
||||||
|
PlayerTransform
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user