diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index f2eebd09..cac91f05 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -61,8 +61,10 @@ void Client::ReadFromServer() while (m_ThreadIsRunning) { if (m_Socket.available()) { bytesRead = Receive(readBuf, INPUTSIZE); - Package package(readBuf,bytesRead); - ParseMessageType(package); + if (bytesRead > 0) { + Package package(readBuf, bytesRead); + ParseMessageType(package); + } } std::clock_t currentTime = std::clock(); if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { @@ -75,9 +77,6 @@ void Client::ReadFromServer() void Client::SendSnapshotToServer() { // Reset previouse key state in snapshot. - Package message(MessageType::Event, m_SendPacketID); - message.AddString(m_NextSnapshot.InputForward); - Send(message); m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; // See if any movement keys are down @@ -111,6 +110,8 @@ void Client::SendSnapshotToServer() void Client::ParseMessageType(Package& package) { int messageType = package.PopFrontPrimitive(); + if (messageType == -1) + return; // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id m_PacketID = package.PopFrontPrimitive(); //Read new packet id @@ -143,11 +144,9 @@ void Client::ParseMessageType(Package& package) void Client::ParseConnect(Package& package) { - memcpy(&m_PacketID, data, sizeof(int)); + m_PacketID = package.PopFrontPrimitive(); m_PreviousPacketID = m_PacketID; - MoveMessageHead(data, len, sizeof(int)); - memcpy(&m_PlayerID, data, sizeof(int)); - MoveMessageHead(data, len, sizeof(int)); + m_PlayerID = package.PopFrontPrimitive(); std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; } @@ -168,40 +167,25 @@ void Client::ParseServerPing() void Client::ParseEventMessage(Package& package) { int Id = -1; - std::string command = std::string(data); + std::string command = package.PopFrontString(); if (command.find("+Player") != std::string::npos) { - MoveMessageHead(data, length, command.size() + 1); - memcpy(&Id, data, sizeof(int)); - MoveMessageHead(data, length, sizeof(int)); + Id = package.PopFrontPrimitive(); // Sett Player name m_PlayerDefinitions[Id].Name = command.erase(0, 7); } else { - std::cout << m_PacketID << ": Event message: " << std::string(data) << std::endl; + std::cout << m_PacketID << ": Event message: " << command << std::endl; } - - MoveMessageHead(data, length, std::string(data).size() + 1); } -void Client::ParseSnapshot(char* data, size_t length) +void Client::ParseSnapshot(Package& package) { //std::cout << m_PacketID << ": Parsing incoming snapshot." << std::endl; std::string tempName; for (size_t i = 0; i < MAXCONNECTIONS; i++) { // We're checking for empty name for now. This might not be the best way, // but it is to avoid sending redundant data. - - // Read position data - glm::vec3 playerPos; - memcpy(&playerPos.x, data, sizeof(float)); - MoveMessageHead(data, length, sizeof(float)); - memcpy(&playerPos.y, data, sizeof(float)); - MoveMessageHead(data, length, sizeof(float)); - memcpy(&playerPos.z, data, sizeof(float)); - MoveMessageHead(data, length, sizeof(float)); - - tempName = std::string(data); - // +1 for null terminator - MoveMessageHead(data, length, tempName.size() + 1); + tempName = package.PopFrontString(); + // Apply the position data read to the player entity // New player connected on the server side if (m_PlayerDefinitions[i].Name == "" && tempName != "") { @@ -209,10 +193,17 @@ void Client::ParseSnapshot(char* data, size_t length) } else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { // Someone disconnected // TODO: Insert code here + break; } else if (m_PlayerDefinitions[i].Name == "" && tempName == "") { // Not a connected player break; } + // Read position data + glm::vec3 playerPos; + playerPos.x = package.PopFrontPrimitive(); + playerPos.y = package.PopFrontPrimitive(); + playerPos.z = package.PopFrontPrimitive(); + // Move player to server position m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; m_PlayerDefinitions[i].Name = tempName; } diff --git a/src/Engine/Network/Package.cpp b/src/Engine/Network/Package.cpp index f25d0e5a..729276a3 100644 --- a/src/Engine/Network/Package.cpp +++ b/src/Engine/Network/Package.cpp @@ -38,7 +38,7 @@ std::string Package::PopFrontString() LOG_WARNING("Package PopFrontString(): Oh no! You are trying to remove things outside my memory kingdom"); return "PopFrontString Failed"; } - - m_ReturnDataOffset += returnValue.size(); + // +1 for null terminator. + m_ReturnDataOffset += returnValue.size() + 1; return returnValue; } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 7ede2ce8..969c257e 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -204,6 +204,10 @@ void Server::SendSnapshot() { Package package(MessageType::Snapshot, m_SendPacketID); for (size_t i = 0; i < MAXCONNECTIONS; i++) { + + // Send an empty name if there is no player connected on this position. + package.AddString(m_PlayerDefinitions[i].Name); + if (m_PlayerDefinitions[i].EntityID == -1) { continue; } @@ -212,8 +216,6 @@ void Server::SendSnapshot() package.AddPrimitive(playerPos.x); package.AddPrimitive(playerPos.y); package.AddPrimitive(playerPos.z); - - package.AddString(m_PlayerDefinitions[i].Name); } Broadcast(package); }