diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 642d9bad..95888b1f 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -30,6 +30,12 @@ private: boost::asio::io_service m_IOService; boost::asio::ip::udp::socket m_Socket; + // Sending message to server logic + int bytesRead = -1; + char readBuf[1024] = { 0 }; + int snapshotInterval = 33; + std::clock_t previousSnapshotMessage = std::clock(); + // Packet loss logic unsigned int m_PacketID = 0; unsigned int m_PreviousPacketID = 0; @@ -37,8 +43,6 @@ private: // Game logic World* m_World; - std::vector m_PlayersToCreate; - glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; std::string m_PlayerName; int m_PlayerID = -1; @@ -67,9 +71,9 @@ private: void parsePing(); void parseServerPing(); void parseSnapshot(Packet& packet); - void createNewPlayer(int i); void identifyPacketLoss(); bool isConnected(); + EntityID createPlayer(); // Events EventBroker* m_EventBroker; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 99a1b050..5c1ac1fb 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -29,6 +29,18 @@ private: boost::asio::ip::udp::socket m_Socket; PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; + // Sending messages to client logic + char readBuffer[1024] = { 0 }; + int bytesRead = 0; + // time for previouse message + std::clock_t previousePingMessage = std::clock(); + std::clock_t previousSnapshotMessage = std::clock(); + std::clock_t timOutTimer = std::clock(); + // How often we send messages (milliseconds) + int intervalMs = 1000; + int snapshotInterval = 50; + int checkTimeOutInterval = 100; + //Timers std::clock_t m_StartPingTime; std::clock_t m_StopTimes[8]; @@ -67,6 +79,7 @@ private: void parseServerPing(); void parseSnapshot(Packet& packet); void identifyPacketLoss(); + EntityID createPlayer(); }; #endif diff --git a/src/Engine/Input/InputProxy.cpp b/src/Engine/Input/InputProxy.cpp index c3e4d669..ad589df3 100644 --- a/src/Engine/Input/InputProxy.cpp +++ b/src/Engine/Input/InputProxy.cpp @@ -62,7 +62,7 @@ void InputProxy::Process() e.Command = command; e.Value = currentValue; m_EventBroker->Publish(e); - LOG_DEBUG("Input: Published command %s=%f for player %i", e.Command.c_str(), e.Value, e.PlayerID); + //LOG_DEBUG("Input: Published command %s=%f for player %i", e.Command.c_str(), e.Value, e.PlayerID); m_LastCommandValues[command] = currentValue; } } @@ -78,7 +78,7 @@ void InputProxy::Process() } //e.Value = std::max(-1.f, std::min(e.Value, 1.f)); m_EventBroker->Publish(e); - LOG_DEBUG("Input: Published command %s=%f for player %i", e.Command.c_str(), e.Value, e.PlayerID); + //LOG_DEBUG("Input: Published command %s=%f for player %i", e.Command.c_str(), e.Value, e.PlayerID); } m_CommandQueue.clear(); } diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index a43c16eb..8efd97ce 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -37,21 +37,11 @@ void Client::Start(World* world, EventBroker* eventBroker) } m_Socket.connect(m_ReceiverEndpoint); LOG_INFO("I am client. BIP BOP"); - readFromServer(); } void Client::Update() { - while (m_PlayersToCreate.size() > 0) { - unsigned int i = m_PlayersToCreate.size() - 1; - unsigned int tempID = m_World->CreateEntity(); - ComponentWrapper transform = m_World->AttachComponent(tempID, "Transform"); - ComponentWrapper model = m_World->AttachComponent(tempID, "Model"); - model["Resource"] = "Models/Core/UnitSphere.obj"; - ComponentWrapper player = m_World->AttachComponent(tempID, "Player"); - m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = tempID; - m_PlayersToCreate.pop_back(); - } + readFromServer(); } void Client::Close() @@ -65,27 +55,19 @@ void Client::Close() void Client::readFromServer() { - int bytesRead = -1; - char readBuf[1024] = { 0 }; - - int snapshotInterval = 33; - std::clock_t previousSnapshotMessage = std::clock(); - - while (m_ThreadIsRunning) { - if (m_Socket.available()) { - bytesRead = receive(readBuf, INPUTSIZE); - if (bytesRead > 0) { - Packet packet(readBuf, bytesRead); - parseMessageType(packet); - } + if (m_Socket.available()) { + bytesRead = receive(readBuf, INPUTSIZE); + if (bytesRead > 0) { + Packet packet(readBuf, bytesRead); + parseMessageType(packet); } - std::clock_t currentTime = std::clock(); - if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - if (isConnected()) { - sendSnapshotToServer(); - } - previousSnapshotMessage = currentTime; + } + std::clock_t currentTime = std::clock(); + if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + if (isConnected()) { + sendSnapshotToServer(); } + previousSnapshotMessage = currentTime; } } @@ -215,7 +197,7 @@ void Client::parseSnapshot(Packet& packet) // New player connected on the server side if (m_PlayerDefinitions[i].Name == "" && tempName != "") { m_PlayerDefinitions[i].Name = tempName; - m_PlayersToCreate.push_back(i); + m_PlayerDefinitions[i].EntityID = createPlayer(); } else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { // Someone disconnected // TODO: Insert code here @@ -321,13 +303,6 @@ bool Client::OnInputCommand(const Events::InputCommand & e) return false; } -void Client::createNewPlayer(int i) -{ - m_PlayerDefinitions[i].EntityID = m_World->CreateEntity(); - ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[i].EntityID, "Transform"); - ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[i].EntityID, "Model"); - model["Resource"] = "Models/Core/UnitSphere.obj"; -} void Client::identifyPacketLoss() { @@ -347,3 +322,13 @@ bool Client::isConnected() } return false; } + +EntityID Client::createPlayer() +{ + EntityID entityID = m_World->CreateEntity(); + ComponentWrapper transform = m_World->AttachComponent(entityID, "Transform"); + ComponentWrapper model = m_World->AttachComponent(entityID, "Model"); + model["Resource"] = "Models/Core/UnitSphere.obj"; + ComponentWrapper player = m_World->AttachComponent(entityID, "Player"); + return entityID; +} diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index cbe7a378..261583cc 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -15,24 +15,11 @@ void Server::Start(World* world, EventBroker* eventBroker) m_StopTimes[i] = std::clock(); } LOG_INFO("I am Server. BIP BOP\n"); - - readFromClients(); } void Server::Update() { - while (m_PlayersToCreate.size() > 0) { - unsigned int i = m_PlayersToCreate.size() - 1; - unsigned int tempID = m_World->CreateEntity(); - ComponentWrapper transform = m_World->AttachComponent(tempID, "Transform"); - transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); - ComponentWrapper model = m_World->AttachComponent(tempID, "Model"); - model["Resource"] = "Models/Core/UnitSphere.obj"; - model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); - ComponentWrapper player = m_World->AttachComponent(tempID, "Player"); - m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = tempID; - m_PlayersToCreate.pop_back(); - } + readFromClients(); } void Server::Close() @@ -42,50 +29,37 @@ void Server::Close() void Server::readFromClients() { - char readBuffer[1024] = { 0 }; - int bytesRead = 0; - // time for previouse message - std::clock_t previousePingMessage = std::clock(); - std::clock_t previousSnapshotMessage = std::clock(); - std::clock_t timOutTimer = std::clock(); - // How often we send messages (milliseconds) - int intervalMs = 1000; - int snapshotInterval = 50; - int checkTimeOutInterval = 100; + // m_ThreadIsRunning might be unnecessary but the + // program crashed if it executed m_Socket.available() + // when closing the program. - while (m_ThreadIsRunning) { - // m_ThreadIsRunning might be unnecessary but the - // program crashed if it executed m_Socket.available() - // when closing the program. - - if (m_ThreadIsRunning && m_Socket.available()) { - try { - bytesRead = receive(readBuffer, INPUTSIZE); - Packet packet(readBuffer, bytesRead); - parseMessageType(packet); - } catch (const std::exception& err) { - //LOG_ERROR("%i: Read from client crashed %s", m_PacketID, err.what()); - } - - } - std::clock_t currentTime = std::clock(); - // Send snapshot - if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - sendSnapshot(); - previousSnapshotMessage = currentTime; + if (m_Socket.available()) { + try { + bytesRead = receive(readBuffer, INPUTSIZE); + Packet packet(readBuffer, bytesRead); + parseMessageType(packet); + } catch (const std::exception& err) { + //LOG_ERROR("%i: Read from client crashed %s", m_PacketID, err.what()); } - // Send pings each - if (intervalMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { - sendPing(); - previousePingMessage = currentTime; - } + } + std::clock_t currentTime = std::clock(); + // Send snapshot + if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + sendSnapshot(); + previousSnapshotMessage = currentTime; + } - // Time out logic - if (checkTimeOutInterval < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { - checkForTimeOuts(); - timOutTimer = currentTime; - } + // Send pings each + if (intervalMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { + sendPing(); + previousePingMessage = currentTime; + } + + // Time out logic + if (checkTimeOutInterval < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { + checkForTimeOuts(); + timOutTimer = currentTime; } } @@ -291,8 +265,7 @@ void Server::parseConnect(Packet& packet) for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == boost::asio::ip::address()) { // Create new player - m_PlayersToCreate.push_back(i); - + m_PlayerDefinitions[i].EntityID = createPlayer(); m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint; m_PlayerDefinitions[i].Name = packet.ReadString(); @@ -368,3 +341,15 @@ void Server::identifyPacketLoss() LOG_INFO("%i Packet(s) were lost...", difference); } } + +EntityID Server::createPlayer() +{ + EntityID entityID = m_World->CreateEntity(); + ComponentWrapper transform = m_World->AttachComponent(entityID, "Transform"); + transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); + ComponentWrapper model = m_World->AttachComponent(entityID, "Model"); + model["Resource"] = "Models/Core/UnitSphere.obj"; + model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); + ComponentWrapper player = m_World->AttachComponent(entityID, "Player"); + return entityID; +} diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 151d9363..e3f710cb 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -55,7 +55,8 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(m_Renderer); // Invoke network if (m_Config->Get("Networking.StartNetwork", false)) { - boost::thread workerThread(&Game::networkFunction, this); + //boost::thread workerThread(&Game::networkFunction, this); + networkFunction(); } m_LastTime = glfwGetTime(); @@ -153,7 +154,7 @@ void Game::networkFunction() // I don't think we are reaching this part of the code right now. // ~Game() is not called if the game is exited by closing console windows // When server or client is done set it to false. - m_IsClientOrServer = false; + //m_IsClientOrServer = false; // Destroy it! (with fire) - delete m_ClientOrServer; + //delete m_ClientOrServer; } \ No newline at end of file