From b54793892811bda0764dc0f4dca1b1e35283511a Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 19 Feb 2016 13:24:06 +0100 Subject: [PATCH] timestep logic added, but is not used. --- include/Engine/Network/Client.h | 2 +- include/Engine/Network/Server.h | 2 ++ src/Engine/Network/Client.cpp | 20 ++++++++++----- src/Engine/Network/Server.cpp | 30 +++++++++++++++++------ src/Game/Systems/PlayerMovementSystem.cpp | 10 ++------ 5 files changed, 42 insertions(+), 22 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index af4aff51..4decfa1f 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -89,7 +89,7 @@ private: void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType); void parseSnapshot(Packet& packet); void parseOnInputCommand(Packet& packet); - void publishInputCommands(double dt); + void publishInputCommands(); void identifyPacketLoss(); void hasServerTimedOut(); EntityID createPlayer(); diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index d71bffac..fa926bc0 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -52,6 +52,7 @@ private: int checkTimeOutInterval = 100; int m_NextPlayerID = 0; std::vector m_InputCommandsToBroadcast; + std::vector m_InputCommandsToPublish; //Timers std::clock_t m_StartPingTime; @@ -82,6 +83,7 @@ private: void parseTCPConnect(Packet & packet); void parseDisconnect(); bool shouldSendToClient(EntityWrapper childEntity); + void publishInputCommands(); // Debug event EventRelay m_EInputCommand; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 6cb5dc08..38eeaec6 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -44,8 +44,8 @@ void Client::Connect(std::string address, int port) void Client::Update(double dt) { m_EventBroker->Process(); - m_TimeStamp += dt; - publishInputCommands(dt); + //m_TimeStamp += dt; + publishInputCommands(); while (m_Unreliable.IsSocketAvailable()) { // Packet will get real data in receive Packet packet(MessageType::Invalid); @@ -74,8 +74,9 @@ void Client::Update(double dt) sendInputCommands(); m_TimeSinceSentInputs = std::clock(); } - // HACK: Send absolute player positions for now to avoid desync until we have reliable messages - //sendLocalPlayerTransform(); + // HACK: Send absolute player positions for now to avoid desync until we have reliable messages. + // Reliable messages and timestamps did not fix it. + sendLocalPlayerTransform(); hasServerTimedOut(); } @@ -307,6 +308,13 @@ void Client::parseSnapshot(Packet& packet) // } //} + // Read timestamp + double remoteTimestamp = packet.ReadPrimitive(); + //if (abs(remoteTimestamp - m_TimeStamp) > 0.100) { + // m_TimeStamp = remoteTimestamp; + // LOG_INFO("Resynced remote and local timestamp"); + //} + // Read world state while (packet.DataReadSize() < packet.Size()) { EntityID serverEntityID = packet.ReadPrimitive(); @@ -382,12 +390,12 @@ void Client::parseOnInputCommand(Packet & packet) } } -void Client::publishInputCommands(double dt) +void Client::publishInputCommands() { std::vector notPublishedEvents; for (int i = 0; i < m_ReceivedInputCommands.size(); i++) { if (m_ReceivedInputCommands.at(i).TimeStamp < m_TimeStamp) { - m_EventBroker->Publish(m_ReceivedInputCommands.at(i).TimeStamp); + m_EventBroker->Publish(m_ReceivedInputCommands.at(i)); } else { notPublishedEvents.push_back(m_ReceivedInputCommands.at(i)); diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index f4adad91..7130ec8a 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -1,6 +1,6 @@ #include "Network/Server.h" -Server::Server(World* world, EventBroker* eventBroker, int port) +Server::Server(World* world, EventBroker* eventBroker, int port) : Network(world, eventBroker) { ConfigFile* config = ResourceManager::Load("Config.ini"); @@ -30,6 +30,7 @@ void Server::Update(double dt) { m_EventBroker->Process(); m_TimeStamp += dt; + publishInputCommands(); PlayerDefinition pd; m_Reliable.AcceptNewConnections(m_NextPlayerID, m_ConnectedPlayers); for (auto& kv : m_ConnectedPlayers) { @@ -118,7 +119,7 @@ void Server::parseMessageType(Packet& packet) parseOnPlayerDamage(packet); break; case MessageType::PlayerTransform: -// parsePlayerTransform(packet); + parsePlayerTransform(packet); break; default: break; @@ -146,6 +147,7 @@ void Server::sendSnapshot() { Packet packet(MessageType::Snapshot); //addInputCommandsToPacket(packet); + packet.WritePrimitive(m_TimeStamp/*+ somePingvalue + offset*/); addChildrenToPacket(packet, EntityID_Invalid); unreliableBroadcast(packet); } @@ -280,7 +282,7 @@ void Server::parseTCPConnect(Packet & packet) // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id m_PacketID = packet.ReadPrimitive(); //Read new packet id - + LOG_INFO("Parsing connections"); // Check if player is already connected // Ska vara till lagd i TCPServer receive @@ -333,6 +335,7 @@ void Server::disconnect(PlayerID playerID) e.PlayerID = playerID; m_EventBroker->Publish(e); //m_World->DeleteEntity(m_ConnectedPlayers[playerID].EntityID); + // TODO Kolla Anders crashade efter timeout med break point m_ConnectedPlayers[playerID].TCPSocket->shutdown(boost::asio::ip::tcp::socket::shutdown_both); m_ConnectedPlayers[playerID].TCPSocket->close(); m_World->DeleteEntity(m_ConnectedPlayers[playerID].EntityID); @@ -375,8 +378,7 @@ bool Server::OnInputCommand(const Events::InputCommand & e) } isReadingData = !isReadingData; m_SaveDataTimer = std::clock(); - } - else if (e.Command == "KickPlayer" && e.Value > 0) { + } else if (e.Command == "KickPlayer" && e.Value > 0) { kick(0); } @@ -467,8 +469,8 @@ void Server::parseOnInputCommand(Packet& packet) e.Player = EntityWrapper(m_World, m_ConnectedPlayers.at(player).EntityID); e.Value = packet.ReadPrimitive(); e.TimeStamp = packet.ReadPrimitive(); - /* m_EventBroker->Publish(e);*/ - + /* m_EventBroker->Publish(e);*/ + m_InputCommandsToPublish.push_back(e); if (e.Command == "PrimaryFire" || e.Command == "Reload") { m_InputCommandsToBroadcast.push_back(e); } @@ -518,6 +520,20 @@ bool Server::shouldSendToClient(EntityWrapper childEntity) return childEntity.HasComponent("Player") || childEntity.FirstParentWithComponent("Player").Valid(); } +void Server::publishInputCommands() +{ + std::vector notPublishedEvents; + for (int i = 0; i < m_InputCommandsToPublish.size(); i++) { + if (m_InputCommandsToPublish.at(i).TimeStamp < m_TimeStamp) { + m_EventBroker->Publish(m_InputCommandsToPublish.at(i)); + } else { + LOG_INFO("Did not instantly publish command"); + notPublishedEvents.push_back(m_InputCommandsToPublish.at(i)); + } + } + m_InputCommandsToPublish = notPublishedEvents; +} + PlayerID Server::GetPlayerIDFromEndpoint() { // check both tcp and udp connection diff --git a/src/Game/Systems/PlayerMovementSystem.cpp b/src/Game/Systems/PlayerMovementSystem.cpp index a144dd18..6d541eab 100644 --- a/src/Game/Systems/PlayerMovementSystem.cpp +++ b/src/Game/Systems/PlayerMovementSystem.cpp @@ -16,14 +16,8 @@ PlayerMovementSystem::~PlayerMovementSystem() void PlayerMovementSystem::Update(double dt) { updateMovementControllers(dt); - if (IsServer) { - for (auto& kv : m_PlayerInputControllers) { - updateVelocity(kv.first, dt); - } - } else { - if (LocalPlayer.Valid()) { - updateVelocity(LocalPlayer, dt); - } + if (LocalPlayer.Valid()) { + updateVelocity(LocalPlayer, dt); } }