WE now send the map on connect after that only player information.
This commit is contained in:
@@ -6,4 +6,6 @@ NetworkServer::NetworkServer()
|
|||||||
}
|
}
|
||||||
|
|
||||||
NetworkServer::~NetworkServer()
|
NetworkServer::~NetworkServer()
|
||||||
{ }
|
{
|
||||||
|
delete[] m_ReadBuffer;
|
||||||
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ private:
|
|||||||
std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
|
std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
|
||||||
//Timers
|
//Timers
|
||||||
std::clock_t m_StartPingTime;
|
std::clock_t m_StartPingTime;
|
||||||
|
|
||||||
// Packet loss logic
|
// Packet loss logic
|
||||||
PacketID m_PacketID = 0;
|
PacketID m_PacketID = 0;
|
||||||
PacketID m_PreviousPacketID = 0;
|
PacketID m_PreviousPacketID = 0;
|
||||||
@@ -64,6 +64,7 @@ private:
|
|||||||
void reliableBroadcast(Packet& packet);
|
void reliableBroadcast(Packet& packet);
|
||||||
void unreliableBroadcast(Packet& packet);
|
void unreliableBroadcast(Packet& packet);
|
||||||
void sendSnapshot();
|
void sendSnapshot();
|
||||||
|
void addPlayersToPacket(Packet& packet, EntityID entityID);
|
||||||
void addChildrenToPacket(Packet& packet, EntityID entityID);
|
void addChildrenToPacket(Packet& packet, EntityID entityID);
|
||||||
void addInputCommandsToPacket(Packet& packet);
|
void addInputCommandsToPacket(Packet& packet);
|
||||||
void sendPing();
|
void sendPing();
|
||||||
@@ -77,7 +78,7 @@ private:
|
|||||||
void parsePlayerTransform(Packet& packet);
|
void parsePlayerTransform(Packet& packet);
|
||||||
void parseOnInputCommand(Packet& packet);
|
void parseOnInputCommand(Packet& packet);
|
||||||
void parseClientPing();
|
void parseClientPing();
|
||||||
void parsePing();
|
void parsePing();
|
||||||
void parseUDPConnect(Packet & packet);
|
void parseUDPConnect(Packet & packet);
|
||||||
void parseTCPConnect(Packet & packet);
|
void parseTCPConnect(Packet & packet);
|
||||||
void parseDisconnect();
|
void parseDisconnect();
|
||||||
|
|||||||
@@ -6,4 +6,6 @@ NetworkClient::NetworkClient()
|
|||||||
}
|
}
|
||||||
|
|
||||||
NetworkClient::~NetworkClient()
|
NetworkClient::~NetworkClient()
|
||||||
{ }
|
{
|
||||||
|
delete[] m_ReadBuffer;
|
||||||
|
}
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ void Server::sendSnapshot()
|
|||||||
{
|
{
|
||||||
Packet packet(MessageType::Snapshot);
|
Packet packet(MessageType::Snapshot);
|
||||||
addInputCommandsToPacket(packet);
|
addInputCommandsToPacket(packet);
|
||||||
addChildrenToPacket(packet, EntityID_Invalid);
|
addPlayersToPacket(packet, EntityID_Invalid);
|
||||||
unreliableBroadcast(packet);
|
unreliableBroadcast(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ void Server::addInputCommandsToPacket(Packet& packet)
|
|||||||
m_InputCommandsToBroadcast.clear();
|
m_InputCommandsToBroadcast.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::addChildrenToPacket(Packet & packet, EntityID entityID)
|
void Server::addPlayersToPacket(Packet & packet, EntityID entityID)
|
||||||
{
|
{
|
||||||
auto itPair = m_World->GetChildren(entityID);
|
auto itPair = m_World->GetChildren(entityID);
|
||||||
std::unordered_map<std::string, ComponentPool*> worldComponentPools = m_World->GetComponentPools();
|
std::unordered_map<std::string, ComponentPool*> worldComponentPools = m_World->GetComponentPools();
|
||||||
@@ -212,6 +212,49 @@ void Server::addChildrenToPacket(Packet & packet, EntityID entityID)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Server::addChildrenToPacket(Packet & packet, EntityID entityID)
|
||||||
|
{
|
||||||
|
auto itPair = m_World->GetChildren(entityID);
|
||||||
|
std::unordered_map<std::string, ComponentPool*> worldComponentPools = m_World->GetComponentPools();
|
||||||
|
// Loop through every child
|
||||||
|
for (auto it = itPair.first; it != itPair.second; it++) {
|
||||||
|
EntityID childEntityID = it->second;
|
||||||
|
// Write EntityID and parentsID and Entity name
|
||||||
|
packet.WritePrimitive(childEntityID);
|
||||||
|
packet.WritePrimitive(entityID);
|
||||||
|
packet.WriteString(m_World->GetName(childEntityID));
|
||||||
|
// Write components to child
|
||||||
|
int numberOfComponents = 0;
|
||||||
|
for (auto& i : worldComponentPools) {
|
||||||
|
if (i.second->KnowsEntity(childEntityID)) {
|
||||||
|
numberOfComponents++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Write how many components should be read
|
||||||
|
packet.WritePrimitive(numberOfComponents);
|
||||||
|
for (auto& i : worldComponentPools) {
|
||||||
|
// If the entity exist in the pool
|
||||||
|
if (i.second->KnowsEntity(childEntityID)) {
|
||||||
|
ComponentWrapper componentWrapper = i.second->GetByEntity(childEntityID);
|
||||||
|
// ComponentType
|
||||||
|
packet.WriteString(componentWrapper.Info.Name);
|
||||||
|
// Loop through fields
|
||||||
|
for (auto& componentField : componentWrapper.Info.FieldsInOrder) {
|
||||||
|
ComponentInfo::Field_t fieldInfo = componentWrapper.Info.Fields.at(componentField);
|
||||||
|
if (fieldInfo.Type == "string") {
|
||||||
|
std::string& value = componentWrapper[componentField];
|
||||||
|
packet.WriteString(value);
|
||||||
|
} else {
|
||||||
|
packet.WriteData(componentWrapper.Data + fieldInfo.Offset, fieldInfo.Stride);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Go to to your children
|
||||||
|
addChildrenToPacket(packet, childEntityID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Server::sendPing()
|
void Server::sendPing()
|
||||||
{
|
{
|
||||||
// Prints connected players ping
|
// Prints connected players ping
|
||||||
@@ -304,6 +347,11 @@ void Server::parseTCPConnect(Packet & packet)
|
|||||||
connnectPacket.WritePrimitive(playerID);
|
connnectPacket.WritePrimitive(playerID);
|
||||||
m_Reliable.Send(connnectPacket);
|
m_Reliable.Send(connnectPacket);
|
||||||
|
|
||||||
|
Packet firstSnapshot(MessageType::Snapshot);
|
||||||
|
addInputCommandsToPacket(firstSnapshot);
|
||||||
|
addChildrenToPacket(firstSnapshot, EntityID_Invalid);
|
||||||
|
m_Reliable.Send(firstSnapshot);
|
||||||
|
|
||||||
// Send notification that a player has connected
|
// Send notification that a player has connected
|
||||||
//Packet notificationPacket(MessageType::PlayerConnected);
|
//Packet notificationPacket(MessageType::PlayerConnected);
|
||||||
//broadcast(notificationPacket);
|
//broadcast(notificationPacket);
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ size_t TCPClient::readBuffer()
|
|||||||
memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int));
|
memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int));
|
||||||
|
|
||||||
// if the buffer is to small increase the size of it
|
// if the buffer is to small increase the size of it
|
||||||
|
// TODO if message is huge 1 time the buffer will not decrease.
|
||||||
if (sizeOfPacket > m_BufferSize) {
|
if (sizeOfPacket > m_BufferSize) {
|
||||||
delete[] m_ReadBuffer;
|
delete[] m_ReadBuffer;
|
||||||
m_ReadBuffer = new char[sizeOfPacket];
|
m_ReadBuffer = new char[sizeOfPacket];
|
||||||
|
|||||||
@@ -50,10 +50,8 @@ void TCPServer::handle_accept(boost::shared_ptr<tcp::socket> socket,
|
|||||||
|
|
||||||
void TCPServer::Send(Packet & packet, PlayerDefinition & playerDefinition)
|
void TCPServer::Send(Packet & packet, PlayerDefinition & playerDefinition)
|
||||||
{
|
{
|
||||||
if (!playerDefinition.TCPSocket)
|
packet.UpdateSize();
|
||||||
return;
|
|
||||||
try {
|
try {
|
||||||
packet.UpdateSize();
|
|
||||||
int bytesSent = playerDefinition.TCPSocket->send(
|
int bytesSent = playerDefinition.TCPSocket->send(
|
||||||
boost::asio::buffer(packet.Data(), packet.Size()),
|
boost::asio::buffer(packet.Data(), packet.Size()),
|
||||||
0);
|
0);
|
||||||
|
|||||||
Reference in New Issue
Block a user