From d8d63f804a9b11405d15e1ee4ff1794f596ed1a1 Mon Sep 17 00:00:00 2001 From: stiffly Date: Mon, 7 Dec 2015 16:11:27 +0100 Subject: [PATCH 01/60] Added utility headers for network interface. --- include/Engine/Network/MessageType.h | 17 +++++++++++++++++ include/Engine/Network/NetworkDefines.h | 15 +++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 include/Engine/Network/MessageType.h create mode 100644 include/Engine/Network/NetworkDefines.h diff --git a/include/Engine/Network/MessageType.h b/include/Engine/Network/MessageType.h new file mode 100644 index 00000000..8d09c7ee --- /dev/null +++ b/include/Engine/Network/MessageType.h @@ -0,0 +1,17 @@ +#ifndef MessageType_h__ +#define MessageType_h__ + +// Message types used by both server and client. +// Used to determine what type of message was sent. +enum class MessageType +{ + Connect, + Disconnect, + ClientPing, + ServerPing, + Message, + Snapshot, + Event, +}; + +#endif diff --git a/include/Engine/Network/NetworkDefines.h b/include/Engine/Network/NetworkDefines.h new file mode 100644 index 00000000..4d37733e --- /dev/null +++ b/include/Engine/Network/NetworkDefines.h @@ -0,0 +1,15 @@ +#ifndef MessageType_h__ +#define MessageType_h__ + +#include +#include + +#define BOARDSIZE 16 +#define MAXCONNECTIONS 8 +#define INPUTSIZE 128 + +typedef boost::shared_ptr socket_ptr; +typedef boost::shared_ptr string_ptr; +typedef boost::shared_ptr> messageQueue_ptr; + +#endif \ No newline at end of file From de5bdef58cf40e756b53de7cc73e3fbf3d6e9306 Mon Sep 17 00:00:00 2001 From: stiffly Date: Mon, 7 Dec 2015 16:52:42 +0100 Subject: [PATCH 02/60] Rectangle definition conflicted with a definition included by . --- include/Engine/Rendering/IRenderer.h | 2 +- src/Game/Game.cpp | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/include/Engine/Rendering/IRenderer.h b/include/Engine/Rendering/IRenderer.h index 1acb2454..5dce14c7 100644 --- a/include/Engine/Rendering/IRenderer.h +++ b/include/Engine/Rendering/IRenderer.h @@ -35,7 +35,7 @@ public: virtual void Draw(RenderQueueCollection& rq) = 0; protected: - Rectangle m_Resolution = Rectangle(1280, 720); + Rectangle m_Resolution = Rectangle::Rectangle(1280, 720); bool m_Fullscreen = false; bool m_VSYNC = false; int m_GLVersion[2]; diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 10d19baf..611aa328 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -1,5 +1,6 @@ #include "Game.h" #include "HardcodedTestWorld.h" +#include "Network/Client.h" Game::Game(int argc, char* argv[]) { @@ -17,12 +18,12 @@ Game::Game(int argc, char* argv[]) m_Renderer = new Renderer(); m_Renderer->SetFullscreen(m_Config->Get("Video.Fullscreen", false)); m_Renderer->SetVSYNC(m_Config->Get("Video.VSYNC", false)); - m_Renderer->SetResolution(Rectangle( + m_Renderer->SetResolution(Rectangle::Rectangle( 0, 0, m_Config->Get("Video.Width", 1280), m_Config->Get("Video.Height", 720) - )); + )); m_Renderer->Initialize(); // Create input manager @@ -36,6 +37,15 @@ Game::Game(int argc, char* argv[]) // Create a TEST WORLD m_World = new HardcodedTestWorld(); + // TEMP: Invoke network + std::string inputMessage; + std::cout << "Start client or server? (c/s)" << std::endl; + std::cin >> inputMessage; + if (inputMessage == "c" || inputMessage == "C") { + Client client; + client.Start(); + } + m_LastTime = glfwGetTime(); } From cbbb7deaea10a5e52cb1bbbfbe4f05c9009851d9 Mon Sep 17 00:00:00 2001 From: stiffly Date: Mon, 7 Dec 2015 16:53:33 +0100 Subject: [PATCH 03/60] Copy pasta error. Corrected #ifndef --- include/Engine/Network/NetworkDefines.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/Engine/Network/NetworkDefines.h b/include/Engine/Network/NetworkDefines.h index 4d37733e..e9da132f 100644 --- a/include/Engine/Network/NetworkDefines.h +++ b/include/Engine/Network/NetworkDefines.h @@ -1,7 +1,7 @@ -#ifndef MessageType_h__ -#define MessageType_h__ +#ifndef NetworkDefines_h__ +#define NetworkDefines_h__ -#include +#include #include #define BOARDSIZE 16 From 2c993e82d65589080108eb55ce3bab74af70cb80 Mon Sep 17 00:00:00 2001 From: stiffly Date: Mon, 7 Dec 2015 16:55:12 +0100 Subject: [PATCH 04/60] Added the old prototype logic to Client.h. Can now communicate with a external server(on prototype). --- include/Engine/Network/Client.h | 44 ++++- src/Engine/Network/Client.cpp | 317 +++++++++++++++++++++++++++++++- src/Engine/Network/Server.cpp | 2 +- 3 files changed, 358 insertions(+), 5 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index af7c9072..66bb30ed 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -1,14 +1,56 @@ #ifndef Client_h__ #define Client_h__ -#include +#include +#include + +#include +#include +#include + +#include "Network/MessageType.h" +#include "Network/NetworkDefines.h" + class Client { +public: Client(); ~Client(); + void Start(); +private: + // Threaded + void DisplayLoop(); + void ReadFromServer(); + void InputLoop(); + int Receive(char* data, size_t length); + int CreateMessage(MessageType type, std::string message, char* data); + void MoveMessageHead(char*& data, size_t& length, size_t stepSize); + void ParseMessageType(char* data, size_t length); + void ParseEventMessage(char* data, size_t length); + void ParseConnect(char* data, size_t length); + void ParsePing(); + void ParseServerPing(); + void ParseSnapshot(char* data, size_t length); + void SendInput(); + void SendDebugInput(); + void DrawBoard(); + + // udp stuff + boost::asio::ip::udp::endpoint m_ReceiverEndpoint; + boost::asio::io_service m_IOService; + boost::asio::ip::udp::socket m_Socket; + + int m_PlayerID = -1; + char m_GameBoard[BOARDSIZE][BOARDSIZE]; + glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; + std::string m_PlayerNames[MAXCONNECTIONS]; + std::clock_t m_StartPingTime; + double m_DurationOfPingTime; + bool m_ShouldDrawGameBoard = true; + std::string m_PlayerName; }; #endif diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index bc513799..bdb8eebb 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -1,11 +1,322 @@ -#include "Network\Client.h" +#include "Network/Client.h" -Client::Client() +using namespace boost::asio::ip; + + +Client::Client() : m_Socket(m_IOService) { - + // Set up network stream + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); + //Start(); // All logic happens here } Client::~Client() { } + +void Client::Start() +{ + std::cout << "Please enter you name: "; + std::cin >> m_PlayerName; + while (m_PlayerName.size() > 7) { + std::cout << "Please enter you name(No longer than 7 characters): "; + std::cin >> m_PlayerName; + } + + boost::thread_group threads; + socket_ptr sock(new udp::socket(m_IOService)); + + for (size_t i = 0; i < BOARDSIZE; i++) { + for (size_t j = 0; j < BOARDSIZE; j++) { + m_GameBoard[j][i] = ' '; + } + } + + for (size_t i = 0; i < MAXCONNECTIONS; i++) { + m_PlayerPositions[i].x = -1; + m_PlayerPositions[i].y = -1; + m_PlayerNames[i] = "X"; + } + + m_Socket.connect(m_ReceiverEndpoint); + std::cout << "I am client. BIP BOP\n"; + + threads.create_thread(boost::bind(&Client::DisplayLoop, this)); + threads.create_thread(boost::bind(&Client::ReadFromServer, this)); + threads.create_thread(boost::bind(&Client::InputLoop, this)); + + threads.join_all(); +} + +void Client::InputLoop() +{ + int intervallMs = 33; // ~30 times per second + int commandInterval = 200; // for commands like ping and connect, name might be ambigiuos + std::clock_t previousInputTime = std::clock(); + std::clock_t previousCommandTime = std::clock(); + + while (true) { + + std::clock_t currentTime = std::clock(); + int testTimeShit = (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC); + if (commandInterval < (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC)) { + SendDebugInput(); + previousCommandTime = currentTime; + } + + int testTimeShit2 = (1000 * (currentTime - previousInputTime) / (double)CLOCKS_PER_SEC); + if (intervallMs < (1000 * (currentTime - previousInputTime) / (double)CLOCKS_PER_SEC)) { + if (m_PlayerID != -1) { + SendInput(); + } + previousInputTime = currentTime; + } + } +} + +void Client::DisplayLoop() +{ + while (true) { + // Update gameboard + for (size_t i = 0; i < BOARDSIZE; i++) { + for (size_t j = 0; j < BOARDSIZE; j++) { + m_GameBoard[j][i] = ' '; + } + } + if (m_ShouldDrawGameBoard) + DrawBoard(); + boost::this_thread::sleep(boost::posix_time::millisec(100)); + } +} + +void Client::ReadFromServer() +{ + int bytesRead = -1; + char readBuf[1024] = { 0 }; + + for (;;) { + if (m_Socket.available()) { + bytesRead = Receive(readBuf, INPUTSIZE); + ParseMessageType(readBuf, bytesRead); + } + } +} + +void Client::ParseMessageType(char* data, size_t length) +{ + int messageType = -1; + memcpy(&messageType, data, sizeof(int)); // Read what type off message was sent from server + MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from + + switch (static_cast(messageType)) { + case MessageType::Connect: + ParseConnect(data, length); + break; + case MessageType::ClientPing: + ParsePing(); + break; + case MessageType::ServerPing: + ParseServerPing(); + break; + case MessageType::Message: + break; + case MessageType::Snapshot: + ParseSnapshot(data, length); + break; + case MessageType::Disconnect: + break; + case MessageType::Event: + ParseEventMessage(data, length); + break; + default: + break; + } +} + +void Client::ParseConnect(char* data, size_t len) +{ + memcpy(&m_PlayerID, data, sizeof(int)); + std::cout << "I am player: " << m_PlayerID << std::endl; +} + +void Client::ParsePing() +{ + m_DurationOfPingTime = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); + std::cout << "response time with ctime(ms): " << m_DurationOfPingTime << std::endl; +} + +void Client::ParseServerPing() +{ + char* testMsg = new char[128]; + int testOffset = CreateMessage(MessageType::ServerPing, "Ping recieved", testMsg); + + //std::cout << "Parsing ping." << std::endl; + + m_Socket.send_to(boost::asio::buffer( + testMsg, + testOffset), + m_ReceiverEndpoint, 0); +} + +void Client::ParseEventMessage(char* data, size_t length) +{ + int Id = -1; + std::string command = std::string(data); + if (command.find("+Player") != std::string::npos) { + MoveMessageHead(data, length, command.size() + 1); + memcpy(&Id, data, sizeof(int)); + MoveMessageHead(data, length, sizeof(int)); + // Sett Player name + m_PlayerNames[Id] = command.erase(0, 7); + } + else { + std::cout << "Event message: " << std::string(data) << std::endl; + } + + MoveMessageHead(data, length, std::string(data).size() + 1); +} + +void Client::ParseSnapshot(char* data, size_t length) +{ + std::string tempName; + for (size_t i = 0; i < MAXCONNECTIONS; i++) { + memcpy(&m_PlayerPositions[i].x, data, sizeof(float)); + MoveMessageHead(data, length, sizeof(float)); + memcpy(&m_PlayerPositions[i].y, data, sizeof(float)); + MoveMessageHead(data, length, sizeof(float)); + tempName = std::string(data); + m_PlayerNames[i] = tempName; + // +1 for null terminator + MoveMessageHead(data, length, tempName.size() + 1); + } +} + +void Client::DrawBoard() +{ + for (size_t i = 0; i < MAXCONNECTIONS; i++) { + if (m_PlayerPositions[i].x != -1 && m_PlayerPositions[i].y != -1) { + m_GameBoard[static_cast(m_PlayerPositions[i].x)][static_cast(m_PlayerPositions[i].y)] = m_PlayerNames[i][0]; + } + } + + system("cls"); + for (size_t i = 0; i < BOARDSIZE; i++) { + std::cout << '_'; + } + + std::cout << std::endl; + for (size_t i = 0; i < BOARDSIZE; i++) { + for (size_t j = 0; j < BOARDSIZE; j++) { + std::cout << m_GameBoard[j][i]; + } + std::cout << std::endl; + } + + for (size_t i = 0; i < BOARDSIZE; i++) { + std::cout << "^"; + } +} + +int Client::Receive(char* data, size_t length) +{ + int bytesReceived = m_Socket.receive_from(boost + ::asio::buffer((void*)data, length), + m_ReceiverEndpoint, + 0); + return bytesReceived; +} + +int Client::CreateMessage(MessageType type, std::string message, char* data) +{ + int lengthOfMessage = 0; + int messageType = static_cast(type); + lengthOfMessage = message.size(); + + int offset = 0; + // Message type + memcpy(data + offset, &messageType, sizeof(int)); + offset += sizeof(int); + // Message, add one extra byte for null terminator + memcpy(data + offset, message.data(), (lengthOfMessage + 1) * sizeof(char)); + offset += (lengthOfMessage + 1) * sizeof(char); + + return offset; +} + +void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) +{ + data += stepSize; + length -= stepSize; +} + +void Client::SendDebugInput() +{ + char* dataPackage = new char[INPUTSIZE]; + if (GetAsyncKeyState('P')) { // Maybe use previous key here + int length = CreateMessage(MessageType::ClientPing, "Ping", dataPackage); + m_StartPingTime = std::clock(); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + length), + m_ReceiverEndpoint, 0); + } + + if (GetAsyncKeyState('C')) { + int length = CreateMessage(MessageType::Connect, m_PlayerName, dataPackage); + m_StartPingTime = std::clock(); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + length), + m_ReceiverEndpoint, 0); + } + + if (GetAsyncKeyState('Q')) { // Does not work. Plez fix + exit(1); + } + memset(dataPackage, 0, INPUTSIZE); + delete[] dataPackage; +} + +void Client::SendInput() +{ + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + if (GetAsyncKeyState('W')) { + int len = CreateMessage(MessageType::Event, "+Forward", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (GetAsyncKeyState('A')) { + int len = CreateMessage(MessageType::Event, "-Right", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (GetAsyncKeyState('S')) { + int len = CreateMessage(MessageType::Event, "-Forward", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (GetAsyncKeyState('D')) { + int len = CreateMessage(MessageType::Event, "+Right", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (GetAsyncKeyState('V')) { + int len = CreateMessage(MessageType::Disconnect, "+Disconnect", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + + memset(dataPackage, 0, INPUTSIZE); + delete[] dataPackage; +} \ No newline at end of file diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index f65dc834..90c728a0 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -1,4 +1,4 @@ -#include "Network\Server.h" +#include "Network/Server.h" Server::Server() { From b5a010a517f5aabf82c5d25ae74314460b03b876 Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 8 Dec 2015 11:02:40 +0100 Subject: [PATCH 05/60] Network now runs on it's own thread. Network now sends Disconnect message when game is terminated. --- include/Engine/Network/Client.h | 3 +++ include/Game/Game.h | 10 ++++++++++ src/Engine/Network/Client.cpp | 28 ++++++++++++++++++++-------- src/Game/Game.cpp | 20 ++++++++++++-------- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 66bb30ed..f1d60c16 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -18,6 +18,7 @@ public: Client(); ~Client(); void Start(); + void Close(); private: // Threaded @@ -27,6 +28,7 @@ private: int Receive(char* data, size_t length); int CreateMessage(MessageType type, std::string message, char* data); + void Disconnect(); void MoveMessageHead(char*& data, size_t& length, size_t stepSize); void ParseMessageType(char* data, size_t length); void ParseEventMessage(char* data, size_t length); @@ -51,6 +53,7 @@ private: double m_DurationOfPingTime; bool m_ShouldDrawGameBoard = true; std::string m_PlayerName; + bool m_ThreadIsRunning = true; }; #endif diff --git a/include/Game/Game.h b/include/Game/Game.h index 85c0d6c4..cf0c5e6b 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -8,6 +8,9 @@ #include "Core/InputManager.h" #include "GUI/Frame.h" #include "Core/World.h" +// Network +#include +#include "Network/Client.h" class Game { @@ -26,6 +29,13 @@ private: InputManager* m_InputManager; GUI::Frame* m_FrameStack; World* m_World; + // Network viriables + boost::thread m_NetworkThread; + Client m_Client; + + // Network methods + void NetworkFunction(); + }; #endif diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index bdb8eebb..53ec3d9f 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -49,6 +49,12 @@ void Client::Start() threads.join_all(); } +void Client::Close() +{ + Disconnect(); + m_ThreadIsRunning = false; +} + void Client::InputLoop() { int intervallMs = 33; // ~30 times per second @@ -56,7 +62,7 @@ void Client::InputLoop() std::clock_t previousInputTime = std::clock(); std::clock_t previousCommandTime = std::clock(); - while (true) { + while (m_ThreadIsRunning) { std::clock_t currentTime = std::clock(); int testTimeShit = (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC); @@ -77,7 +83,7 @@ void Client::InputLoop() void Client::DisplayLoop() { - while (true) { + while (m_ThreadIsRunning) { // Update gameboard for (size_t i = 0; i < BOARDSIZE; i++) { for (size_t j = 0; j < BOARDSIZE; j++) { @@ -95,7 +101,7 @@ void Client::ReadFromServer() int bytesRead = -1; char readBuf[1024] = { 0 }; - for (;;) { + while (m_ThreadIsRunning) { if (m_Socket.available()) { bytesRead = Receive(readBuf, INPUTSIZE); ParseMessageType(readBuf, bytesRead); @@ -244,6 +250,16 @@ int Client::CreateMessage(MessageType type, std::string message, char* data) return offset; } +void Client::Disconnect() +{ + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + int len = CreateMessage(MessageType::Disconnect, "+Disconnect", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); +} + void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) { data += stepSize; @@ -310,11 +326,7 @@ void Client::SendInput() m_ReceiverEndpoint, 0); } if (GetAsyncKeyState('V')) { - int len = CreateMessage(MessageType::Disconnect, "+Disconnect", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + Disconnect(); } memset(dataPackage, 0, INPUTSIZE); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 611aa328..661cd31a 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -1,6 +1,5 @@ #include "Game.h" #include "HardcodedTestWorld.h" -#include "Network/Client.h" Game::Game(int argc, char* argv[]) { @@ -38,13 +37,7 @@ Game::Game(int argc, char* argv[]) m_World = new HardcodedTestWorld(); // TEMP: Invoke network - std::string inputMessage; - std::cout << "Start client or server? (c/s)" << std::endl; - std::cin >> inputMessage; - if (inputMessage == "c" || inputMessage == "C") { - Client client; - client.Start(); - } + boost::thread workerThread(&Game::NetworkFunction, this); m_LastTime = glfwGetTime(); } @@ -53,6 +46,7 @@ Game::~Game() { delete m_FrameStack; delete m_EventBroker; + m_Client.Close(); } void Game::Tick() @@ -75,3 +69,13 @@ void Game::Tick() glfwPollEvents(); } + +void Game::NetworkFunction() +{ + std::string inputMessage; + std::cout << "Start client or server? (c/s)" << std::endl; + std::cin >> inputMessage; + if (inputMessage == "c" || inputMessage == "C") { + m_Client.Start(); + } +} \ No newline at end of file From c48c9e1f86afe933acc6c895fa23d278c990fdb9 Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 8 Dec 2015 13:54:18 +0100 Subject: [PATCH 06/60] Added leak check when using windows (WinLeakCheck.h). Added server to project. A server can now be started in the project. --- include/Engine/Network/Client.h | 2 + include/Engine/Network/Server.h | 52 +++- include/Engine/Network/WinLeakCheck.h | 17 ++ include/Game/Game.h | 5 +- src/Engine/Network/Client.cpp | 36 ++- src/Engine/Network/Server.cpp | 390 +++++++++++++++++++++++++- src/Game/Game.cpp | 3 + 7 files changed, 485 insertions(+), 20 deletions(-) create mode 100644 include/Engine/Network/WinLeakCheck.h diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index f1d60c16..fbd590ff 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -10,6 +10,7 @@ #include "Network/MessageType.h" #include "Network/NetworkDefines.h" +#include "Network/WinLeakCheck.h" class Client @@ -28,6 +29,7 @@ private: int Receive(char* data, size_t length); int CreateMessage(MessageType type, std::string message, char* data); + void Connect(); void Disconnect(); void MoveMessageHead(char*& data, size_t& length, size_t stepSize); void ParseMessageType(char* data, size_t length); diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index bb198b7e..964f251f 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -1,12 +1,58 @@ #ifndef Server_h__ #define Server_h__ +#include +#include -#include +#include +#include +#include +#include "NetworkDefines.h" +#include "MessageType.h" class Server { - Server(); - ~Server(); +public: + Server(); + ~Server(); + void Start(); + +private: + // udp stuff + boost::asio::ip::udp::endpoint m_ReceiverEndpoint; + boost::asio::io_service m_IOService; + boost::asio::ip::udp::socket m_Socket; + boost::asio::ip::udp::endpoint m_Connections[MAXCONNECTIONS]; + //Timers + std::clock_t m_StartPingTime; + std::clock_t m_StopTimes[8]; + // Game logic + std::string m_PlayerNames[MAXCONNECTIONS]; + char m_GameBoard[BOARDSIZE][BOARDSIZE]; + glm::vec2 m_PlayerPositions[8]; + + // Threaded + void DisplayLoop(); + void ReadFromClients(); + void InputLoop(); + + + int Receive(char* data, size_t length); + int CreateMessage(MessageType type, std::string message, char * data); + void MoveMessageHead(char*& data, size_t& length, size_t stepSize); + void Broadcast(std::string message); + void Broadcast(char* data, size_t length); + void SendSnapshot(); + void SendPing(); + void CheckForTimeOuts(); + int CreateHeader(MessageType type, char* data); + void Disconnect(int i); + void ParseMessageType(char* data, size_t length); + void ParseEvent(char* data, size_t length); + void ParseConnect(char* data, size_t length); + void ParseDisconnect(); + void ParseClientPing(); + void ParseServerPing(); + void ParseSnapshot(char* data, size_t length); }; #endif diff --git a/include/Engine/Network/WinLeakCheck.h b/include/Engine/Network/WinLeakCheck.h new file mode 100644 index 00000000..dc1216a7 --- /dev/null +++ b/include/Engine/Network/WinLeakCheck.h @@ -0,0 +1,17 @@ +#if defined (_WIN64) | defined(_WIN32) +#ifndef WinLeakeCheck_h__ +#define WinLeakeCheck_h__ + +//For memory leak checking +#define _CRTDBG_MAP_ALLOC +#include +#include + +#ifdef _DEBUG +#ifndef DBG_NEW +#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) +#define new DBG_NEW +#endif +#endif // _DEBUG +#endif +#endif \ No newline at end of file diff --git a/include/Game/Game.h b/include/Game/Game.h index 04c5cc9d..2931348a 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -9,10 +9,13 @@ #include "GUI/Frame.h" #include "Core/World.h" #include "Rendering/RenderQueueFactory.h" + // Network #include +#include "Network/Server.h" #include "Network/Client.h" + class Game { public: @@ -33,8 +36,8 @@ private: RenderQueueFactory* m_RenderQueueFactory; // Network variables boost::thread m_NetworkThread; + Server m_Server; Client m_Client; - // Network methods void NetworkFunction(); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 53ec3d9f..8d4088d3 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -12,7 +12,8 @@ Client::Client() : m_Socket(m_IOService) Client::~Client() { - + // will it work on linux? #if defined (_WIN64) | defined(_WIN32) otherwise. + _CrtDumpMemoryLeaks(); } void Client::Start() @@ -25,7 +26,6 @@ void Client::Start() } boost::thread_group threads; - socket_ptr sock(new udp::socket(m_IOService)); for (size_t i = 0; i < BOARDSIZE; i++) { for (size_t j = 0; j < BOARDSIZE; j++) { @@ -53,6 +53,7 @@ void Client::Close() { Disconnect(); m_ThreadIsRunning = false; + m_Socket.close(); } void Client::InputLoop() @@ -154,15 +155,16 @@ void Client::ParsePing() void Client::ParseServerPing() { - char* testMsg = new char[128]; - int testOffset = CreateMessage(MessageType::ServerPing, "Ping recieved", testMsg); + char* testMessage = new char[128]; + int testOffset = CreateMessage(MessageType::ServerPing, "Ping recieved", testMessage); //std::cout << "Parsing ping." << std::endl; m_Socket.send_to(boost::asio::buffer( - testMsg, + testMessage, testOffset), m_ReceiverEndpoint, 0); + delete[] testMessage; } void Client::ParseEventMessage(char* data, size_t length) @@ -250,6 +252,18 @@ int Client::CreateMessage(MessageType type, std::string message, char* data) return offset; } +void Client::Connect() +{ + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + int length = CreateMessage(MessageType::Connect, m_PlayerName, dataPackage); + m_StartPingTime = std::clock(); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + length), + m_ReceiverEndpoint, 0); + delete[] dataPackage; +} + void Client::Disconnect() { char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled @@ -258,6 +272,7 @@ void Client::Disconnect() dataPackage, len), m_ReceiverEndpoint, 0); + delete[] dataPackage; } void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) @@ -279,16 +294,11 @@ void Client::SendDebugInput() } if (GetAsyncKeyState('C')) { - int length = CreateMessage(MessageType::Connect, m_PlayerName, dataPackage); - m_StartPingTime = std::clock(); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - length), - m_ReceiverEndpoint, 0); + Connect(); } - if (GetAsyncKeyState('Q')) { // Does not work. Plez fix - exit(1); + if (GetAsyncKeyState('Q')) { + Disconnect(); } memset(dataPackage, 0, INPUTSIZE); delete[] dataPackage; diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 90c728a0..b66bd7b1 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -1,11 +1,395 @@ #include "Network/Server.h" -Server::Server() -{ - +Server::Server() : m_Socket(m_IOService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 13)) +{ } Server::~Server() { +} + + +void Server::Start() +{ + for (size_t i = 0; i < MAXCONNECTIONS; i++) { + m_StopTimes[i] = std::clock(); + m_PlayerPositions[i].x = -1; + m_PlayerPositions[i].y = -1; + } + m_PlayerPositions[0].x = 0; + m_PlayerPositions[0].y = 0; + boost::thread_group threads; + + std::cout << "I am Server. BIP BOP\n"; + + threads.create_thread(boost::bind(&Server::DisplayLoop, this)); + threads.create_thread(boost::bind(&Server::ReadFromClients, this)); + threads.create_thread(boost::bind(&Server::InputLoop, this)); + + threads.join_all(); +} + +void Server::DisplayLoop() +{ + int lengthOfMsg = -1; + std::clock_t previousePingMessage = std::clock(); + std::clock_t previousSnapshotMessage = std::clock(); + std::clock_t timOutTimer = std::clock(); + int intervallMs = 1000; + int snapshotInterval = 50; + int timeToCheckTimeOutTime = 100; + char* data; + + for (;;) { + + std::clock_t currentTime = std::clock(); + // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); + // Send snapshot + if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + SendSnapshot(); + previousSnapshotMessage = currentTime; + } + + // Send pings each + if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { + SendPing(); + previousePingMessage = currentTime; + } + + // Time out logic + if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { + CheckForTimeOuts(); + timOutTimer = currentTime; + } + } +} + +void Server::ReadFromClients() +{ + char readBuf[1024] = { 0 }; + int bytesRead = 0; + + for (;;) { + if (m_Socket.available()) { + try { + bytesRead = Receive(readBuf, INPUTSIZE); + ParseMessageType(readBuf, bytesRead); + } catch (const std::exception& err) { + // To not spam "socket closed messages" + //if (std::string(err.what()).find("forcefully closed") != std::string::npos) { + std::cout << "Read from client crashed: " << err.what(); + //} + } + } + } +} + +void Server::InputLoop() +{ + char inputBuffer[INPUTSIZE] = { 0 }; + std::string inputMessage; + + for (;;) { + std::cin.getline(inputBuffer, INPUTSIZE); + inputMessage = (std::string)inputBuffer; + + if (!inputMessage.empty()) { + try { + // Broadcast message typed in console + Broadcast(inputMessage); + + } catch (const std::exception& err) { + std::cout << "Read from WriteLoop crashed: " << err.what(); + } + } + if (inputMessage.find("exit") != std::string::npos) + exit(1); + inputMessage.clear(); + memset(inputBuffer, 0, INPUTSIZE); + } +} + +void Server::ParseMessageType(char * data, size_t length) +{ + int messageType = -1; + memcpy(&messageType, data, sizeof(int)); // Read what type off message was sent from server + MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from + + switch (static_cast(messageType)) { + case MessageType::Connect: + ParseConnect(data, length); + break; + case MessageType::ClientPing: + ParseClientPing(); + break; + case MessageType::ServerPing: + ParseServerPing(); + break; + case MessageType::Message: + break; + case MessageType::Snapshot: + ParseSnapshot(data, length); + break; + case MessageType::Disconnect: + ParseDisconnect(); + break; + case MessageType::Event: + ParseEvent(data, length); + break; + default: + break; + } +} + +int Server::Receive(char * data, size_t length) +{ + length = m_Socket.receive_from( + boost::asio::buffer((void*)data + , length) + , m_ReceiverEndpoint, 0); + return length; +} + +int Server::CreateMessage(MessageType type, std::string message, char * data) +{ + int lengthOfMessage = 0; + int offset = 0; + + lengthOfMessage = message.size(); + // Message type + memcpy(data + offset, &type, sizeof(int)); + offset += sizeof(int); + // Message, add one extra byte for null terminator + memcpy(data + offset, message.data(), (lengthOfMessage + 1) * sizeof(char)); + offset += (lengthOfMessage + 1) * sizeof(char); + + return offset; +} + +void Server::MoveMessageHead(char *& data, size_t & length, size_t stepSize) +{ + data += stepSize; + length -= stepSize; +} + +void Server::Broadcast(std::string message) +{ + std::cout << "Broadcast: " << message << std::endl; + char* data = new char[128]; + int offset = CreateMessage(MessageType::Event, message, data); + for (int i = 0; i < MAXCONNECTIONS; i++) { + if (m_Connections[i].address() != boost::asio::ip::address()) { + m_Socket.send_to( + boost::asio::buffer(data, offset), + m_Connections[i], + 0); + } + } + delete[] data; +} + +void Server::Broadcast(char * data, size_t length) +{ + for (int i = 0; i < MAXCONNECTIONS; ++i) { + if (m_Connections[i].address() != boost::asio::ip::address()) { + m_Socket.send_to( + boost::asio::buffer(data, length), + m_Connections[i], + 0); + } + } +} + +void Server::SendSnapshot() +{ + char* data = new char[128]; + int offset = CreateHeader(MessageType::Snapshot, data); + for (size_t i = 0; i < MAXCONNECTIONS; i++) { + memcpy(data + offset, &m_PlayerPositions[i].x, sizeof(float)); + offset += sizeof(float); + memcpy(data + offset, &m_PlayerPositions[i].y, sizeof(float)); + offset += sizeof(float); + // +1 for null terminator + memcpy(data + offset, m_PlayerNames[i].data(), m_PlayerNames[i].size() + 1); + offset += (m_PlayerNames[i].size() + 1) * sizeof(char); + } + Broadcast(data, offset); + delete[] data; +} + +void Server::SendPing() +{ + // Prints connected players ping + for (size_t i = 0; i < MAXCONNECTIONS; i++) { + if (m_Connections[i].address() != boost::asio::ip::address()) + std::cout << "Player " << i << "'s ping: " << 1000 * (m_StopTimes[i] - m_StartPingTime) + / static_cast(CLOCKS_PER_SEC) << std::endl; + } + + // Create ping message + char* data = new char[128]; + int len = CreateMessage(MessageType::ServerPing, "Ping from server", data); + // Time message + m_StartPingTime = std::clock(); + // Send message + Broadcast(data, len); + delete[] data; } + +void Server::CheckForTimeOuts() +{ + int timeOutTimeMs = 5000; + + int tempStartPing = 1000 * m_StartPingTime + / static_cast(CLOCKS_PER_SEC); + + for (size_t i = 0; i < MAXCONNECTIONS; i++) { + if (m_Connections[i].address() != boost::asio::ip::address()) { + int tempStopPing = 1000 * m_StopTimes[i] + / static_cast(CLOCKS_PER_SEC); + if (tempStartPing > tempStopPing + timeOutTimeMs) { + std::cout << "player " << i << " timed out!" << std::endl; + Disconnect(i); + } + + } + } +} + +int Server::CreateHeader(MessageType type, char * data) +{ + int messageType = static_cast(type); + int offset = 0; + memcpy(data, &messageType, sizeof(int)); + offset += sizeof(int); + + return offset; +} + +void Server::Disconnect(int i) +{ + Broadcast("A player disconnected"); + std::cout << "Player " << i << " disconnected/Timed out" << std::endl; + m_Connections[i] = boost::asio::ip::udp::endpoint(); + // Reset disconnected players position + m_PlayerPositions[i].x = -1; + m_PlayerPositions[i].y = -1; +} + +void Server::ParseEvent(char * data, size_t length) +{ + size_t i; + for (i = 0; i < MAXCONNECTIONS; i++) { + if (m_Connections[i].address() == m_ReceiverEndpoint.address()) { + break; + } + } + + if ("+Forward" == std::string(data)) + if (m_PlayerPositions[i].y > 0) + m_PlayerPositions[i].y--; + if ("-Forward" == std::string(data)) + if (m_PlayerPositions[i].y < BOARDSIZE - 1) + m_PlayerPositions[i].y++; + if ("+Right" == std::string(data)) + if (m_PlayerPositions[i].x < BOARDSIZE - 1) + m_PlayerPositions[i].x++; + if ("-Right" == std::string(data)) + if (m_PlayerPositions[i].x > 0) + m_PlayerPositions[i].x--; +} + +void Server::ParseConnect(char * data, size_t length) +{ + std::cout << "Parsing connection." << std::endl; + + for (int i = 0; i < MAXCONNECTIONS; i++) { + if (m_Connections[i].address() == m_ReceiverEndpoint.address()) { + return; + } + } + + for (int i = 0; i < MAXCONNECTIONS; i++) { + if (m_Connections[i].address() == boost::asio::ip::address()) { + m_Connections[i] = m_ReceiverEndpoint; + + m_PlayerNames[i] = std::string(data); + m_PlayerPositions[i].x = 0; + m_PlayerPositions[i].y = 0; + m_StopTimes[i] = std::clock(); + std::cout << "Player \"" << m_PlayerNames[i] << "\" connected on IP: " << m_Connections[i].address().to_string() << std::endl; + + int offset = 0; + char* temp = new char[sizeof(int) * 2]; + int msgType = 0; + memcpy(temp, &msgType, sizeof(int)); + offset += sizeof(int); + memcpy(temp + offset, &i, sizeof(int)); + + m_Socket.send_to( + boost::asio::buffer(temp, sizeof(int) * 2), + m_Connections[i], + 0); + // Send notification that a player has connected + std::string str = "Player " + m_PlayerNames[i] + " connected on: " + m_ReceiverEndpoint.address().to_string(); + Broadcast(str); + // +1 is the null terminator + MoveMessageHead(data, length, m_PlayerNames[i].size() + 1); + delete[] temp; + break; + } + } +} + +void Server::ParseDisconnect() +{ + std::cout << "Parsing disconnect. \n"; + + for (int i = 0; i < MAXCONNECTIONS; i++) { + if (m_Connections[i].address() == m_ReceiverEndpoint.address()) { + Disconnect(i); + break; + } + } +} + +void Server::ParseClientPing() +{ + char* testMesssage = new char[128]; + int testOffset = CreateMessage(MessageType::ClientPing, "Ping recieved", testMesssage); + + std::cout << "Parsing ping." << std::endl; + // Return ping + m_Socket.send_to( + boost::asio::buffer( + testMesssage, + testOffset), + m_ReceiverEndpoint, + 0); + delete[] testMesssage; +} + +void Server::ParseServerPing() +{ + for (int i = 0; i < MAXCONNECTIONS; i++) { + if (m_Connections[i].address() == m_ReceiverEndpoint.address()) { + m_StopTimes[i] = std::clock(); + break; + } + } +} + +void Server::ParseSnapshot(char * data, size_t length) +{ + // Does no logic. Returns snapshot if client request one + // The snapshot is not a real snapshot tho... + for (int i = 0; i < MAXCONNECTIONS; i++) { + if (m_Connections[i].address() != boost::asio::ip::address()) { + m_Socket.send_to( + boost::asio::buffer("I'm sending a snapshot to you guys!"), + m_Connections[i], + 0); + } + } +} \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 4f2f0bc5..ffff8fb6 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -80,4 +80,7 @@ void Game::NetworkFunction() if (inputMessage == "c" || inputMessage == "C") { m_Client.Start(); } + if (inputMessage == "s" || inputMessage == "S") { + m_Server.Start(); + } } \ No newline at end of file From e92119c99ea77765e3391aec483b386d209ae91e Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 8 Dec 2015 16:13:53 +0100 Subject: [PATCH 07/60] WIP trying to get Eventsystem to work in client. --- include/Engine/Network/Client.h | 9 ++++++++- include/Game/Game.h | 2 ++ src/Engine/Network/Client.cpp | 19 ++++++++++++++++--- src/Game/Game.cpp | 16 +++++++++------- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index f1d60c16..83ec0535 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -10,6 +10,8 @@ #include "Network/MessageType.h" #include "Network/NetworkDefines.h" +#include "Core/EventBroker.h" +#include "Core/EKeyDown.h" class Client @@ -17,7 +19,7 @@ class Client public: Client(); ~Client(); - void Start(); + void Start(EventBroker* eventBroker); void Close(); private: @@ -54,6 +56,11 @@ private: bool m_ShouldDrawGameBoard = true; std::string m_PlayerName; bool m_ThreadIsRunning = true; + + // Events + EventBroker* m_EventBroker; + EventRelay m_EKeyDown; + bool OnKeyDown(const Events::KeyDown &e); }; #endif diff --git a/include/Game/Game.h b/include/Game/Game.h index 04c5cc9d..bb1e3b49 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -37,6 +37,8 @@ private: // Network methods void NetworkFunction(); + // Network events + EventRelay m_EKeyDown; }; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 53ec3d9f..602cdbe5 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -5,9 +5,12 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { + //m_EventBroker = eventBroker; // Set up network stream m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); - //Start(); // All logic happens here + + + //EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &Client::OnKeyDown); } Client::~Client() @@ -15,8 +18,12 @@ Client::~Client() } -void Client::Start() +void Client::Start(EventBroker* eventBroker) { + // Subscribe to events + m_EventBroker = eventBroker; + m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1)); + m_EventBroker->Subscribe(m_EKeyDown); std::cout << "Please enter you name: "; std::cin >> m_PlayerName; while (m_PlayerName.size() > 7) { @@ -91,7 +98,7 @@ void Client::DisplayLoop() } } if (m_ShouldDrawGameBoard) - DrawBoard(); + //DrawBoard(); boost::this_thread::sleep(boost::posix_time::millisec(100)); } } @@ -331,4 +338,10 @@ void Client::SendInput() memset(dataPackage, 0, INPUTSIZE); delete[] dataPackage; +} + +bool Client::OnKeyDown(const Events::KeyDown& event) +{ + std::cout << event.KeyCode; + return true; } \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 4f2f0bc5..9c523c4b 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -39,7 +39,8 @@ Game::Game(int argc, char* argv[]) m_World = new HardcodedTestWorld(); // TEMP: Invoke network - boost::thread workerThread(&Game::NetworkFunction, this); + + boost::thread workerThread(&Game::NetworkFunction, this); m_LastTime = glfwGetTime(); } @@ -56,6 +57,7 @@ void Game::Tick() double currentTime = glfwGetTime(); double dt = currentTime - m_LastTime; m_LastTime = currentTime; + m_EventBroker->Process(); m_EventBroker->Swap(); m_InputManager->Update(dt); @@ -74,10 +76,10 @@ void Game::Tick() void Game::NetworkFunction() { - std::string inputMessage; - std::cout << "Start client or server? (c/s)" << std::endl; - std::cin >> inputMessage; - if (inputMessage == "c" || inputMessage == "C") { - m_Client.Start(); - } + std::string inputMessage; + std::cout << "Start client or server? (c/s)" << std::endl; + std::cin >> inputMessage; + if (inputMessage == "c" || inputMessage == "C") { + m_Client.Start(m_EventBroker); + } } \ No newline at end of file From 94adaf8ae335fdecaf847a17f273aca328fdf10c Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 8 Dec 2015 16:41:22 +0100 Subject: [PATCH 08/60] Added support for multiplayer. Reactored code, clumped together variables in PlayerDefinition.h. Integrated server with entity system. --- include/Engine/Network/PlayerDefinition.h | 11 +++ include/Engine/Network/Server.h | 10 +- src/Engine/Network/Server.cpp | 106 ++++++++++++++-------- src/Game/Game.cpp | 2 +- 4 files changed, 85 insertions(+), 44 deletions(-) create mode 100644 include/Engine/Network/PlayerDefinition.h diff --git a/include/Engine/Network/PlayerDefinition.h b/include/Engine/Network/PlayerDefinition.h new file mode 100644 index 00000000..19c2f341 --- /dev/null +++ b/include/Engine/Network/PlayerDefinition.h @@ -0,0 +1,11 @@ +#ifndef PlayerDefinition_h__ +#define PlayerDefinition_h__ +#include + +struct PlayerDefinition { + unsigned int EntityID; + std::string Name; + boost::asio::ip::udp::endpoint Endpoint; +}; + +#endif diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 964f251f..be2e17a8 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -8,27 +8,31 @@ #include #include "NetworkDefines.h" #include "MessageType.h" +#include "Core/World.h" +#include "Network/PlayerDefinition.h" class Server { public: Server(); ~Server(); - void Start(); + void Start(World* m_world); private: // udp stuff boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::io_service m_IOService; boost::asio::ip::udp::socket m_Socket; - boost::asio::ip::udp::endpoint m_Connections[MAXCONNECTIONS]; + // boost::asio::ip::udp::endpoint m_Connections[MAXCONNECTIONS]; + PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; //Timers std::clock_t m_StartPingTime; std::clock_t m_StopTimes[8]; // Game logic - std::string m_PlayerNames[MAXCONNECTIONS]; + // std::string m_PlayerNames[MAXCONNECTIONS]; char m_GameBoard[BOARDSIZE][BOARDSIZE]; glm::vec2 m_PlayerPositions[8]; + World* m_World; // Threaded void DisplayLoop(); diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index b66bd7b1..1fb87cfa 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -9,8 +9,9 @@ Server::~Server() } -void Server::Start() +void Server::Start(World* world) { + m_World = world; for (size_t i = 0; i < MAXCONNECTIONS; i++) { m_StopTimes[i] = std::clock(); m_PlayerPositions[i].x = -1; @@ -178,10 +179,10 @@ void Server::Broadcast(std::string message) char* data = new char[128]; int offset = CreateMessage(MessageType::Event, message, data); for (int i = 0; i < MAXCONNECTIONS; i++) { - if (m_Connections[i].address() != boost::asio::ip::address()) { + if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { m_Socket.send_to( boost::asio::buffer(data, offset), - m_Connections[i], + m_PlayerDefinitions[i].Endpoint, 0); } } @@ -191,10 +192,10 @@ void Server::Broadcast(std::string message) void Server::Broadcast(char * data, size_t length) { for (int i = 0; i < MAXCONNECTIONS; ++i) { - if (m_Connections[i].address() != boost::asio::ip::address()) { + if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { m_Socket.send_to( boost::asio::buffer(data, length), - m_Connections[i], + m_PlayerDefinitions[i].Endpoint, 0); } } @@ -210,8 +211,8 @@ void Server::SendSnapshot() memcpy(data + offset, &m_PlayerPositions[i].y, sizeof(float)); offset += sizeof(float); // +1 for null terminator - memcpy(data + offset, m_PlayerNames[i].data(), m_PlayerNames[i].size() + 1); - offset += (m_PlayerNames[i].size() + 1) * sizeof(char); + memcpy(data + offset, m_PlayerDefinitions[i].Name.data(), m_PlayerDefinitions[i].Name.size() + 1); + offset += (m_PlayerDefinitions[i].Name.size() + 1) * sizeof(char); } Broadcast(data, offset); delete[] data; @@ -221,7 +222,7 @@ void Server::SendPing() { // Prints connected players ping for (size_t i = 0; i < MAXCONNECTIONS; i++) { - if (m_Connections[i].address() != boost::asio::ip::address()) + if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) std::cout << "Player " << i << "'s ping: " << 1000 * (m_StopTimes[i] - m_StartPingTime) / static_cast(CLOCKS_PER_SEC) << std::endl; } @@ -245,14 +246,13 @@ void Server::CheckForTimeOuts() / static_cast(CLOCKS_PER_SEC); for (size_t i = 0; i < MAXCONNECTIONS; i++) { - if (m_Connections[i].address() != boost::asio::ip::address()) { + if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { int tempStopPing = 1000 * m_StopTimes[i] / static_cast(CLOCKS_PER_SEC); if (tempStartPing > tempStopPing + timeOutTimeMs) { std::cout << "player " << i << " timed out!" << std::endl; Disconnect(i); } - } } } @@ -271,7 +271,9 @@ void Server::Disconnect(int i) { Broadcast("A player disconnected"); std::cout << "Player " << i << " disconnected/Timed out" << std::endl; - m_Connections[i] = boost::asio::ip::udp::endpoint(); + m_PlayerDefinitions[i].Endpoint = boost::asio::ip::udp::endpoint(); + m_PlayerDefinitions[i].EntityID = -1; + m_PlayerDefinitions[i].Name = "Name not Set"; // Reset disconnected players position m_PlayerPositions[i].x = -1; m_PlayerPositions[i].y = -1; @@ -281,23 +283,37 @@ void Server::ParseEvent(char * data, size_t length) { size_t i; for (i = 0; i < MAXCONNECTIONS; i++) { - if (m_Connections[i].address() == m_ReceiverEndpoint.address()) { + if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { break; } } + // If no player matches the ip return. + if (i >= 8) + return; - if ("+Forward" == std::string(data)) - if (m_PlayerPositions[i].y > 0) - m_PlayerPositions[i].y--; - if ("-Forward" == std::string(data)) - if (m_PlayerPositions[i].y < BOARDSIZE - 1) - m_PlayerPositions[i].y++; - if ("+Right" == std::string(data)) - if (m_PlayerPositions[i].x < BOARDSIZE - 1) - m_PlayerPositions[i].x++; - if ("-Right" == std::string(data)) - if (m_PlayerPositions[i].x > 0) - m_PlayerPositions[i].x--; + unsigned int entityId = m_PlayerDefinitions[i].EntityID; + if ("+Forward" == std::string(data)) { + glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; + temp.z -= 0.5f; + m_World->GetComponent(entityId, "Transform")["Position"] = temp; + } + if ("-Forward" == std::string(data)) { + glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; + temp.z += 0.5f; + m_World->GetComponent(entityId, "Transform")["Position"] = temp; + } + + if ("+Right" == std::string(data)) { + glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; + temp.x += 0.5f; + m_World->GetComponent(entityId, "Transform")["Position"] = temp; + } + + if ("-Right" == std::string(data)) { + glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; + temp.x -= 0.5f; + m_World->GetComponent(entityId, "Transform")["Position"] = temp; + } } void Server::ParseConnect(char * data, size_t length) @@ -305,37 +321,47 @@ void Server::ParseConnect(char * data, size_t length) std::cout << "Parsing connection." << std::endl; for (int i = 0; i < MAXCONNECTIONS; i++) { - if (m_Connections[i].address() == m_ReceiverEndpoint.address()) { + if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { return; } } for (int i = 0; i < MAXCONNECTIONS; i++) { - if (m_Connections[i].address() == boost::asio::ip::address()) { - m_Connections[i] = m_ReceiverEndpoint; + if (m_PlayerDefinitions[i].Endpoint.address() == boost::asio::ip::address()) { + - m_PlayerNames[i] = std::string(data); - m_PlayerPositions[i].x = 0; - m_PlayerPositions[i].y = 0; + m_PlayerDefinitions[i].EntityID = m_World->CreateEntity(); + ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[i].EntityID, "Transform"); + transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); + ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[i].EntityID, "Model"); + model["Resource"] = "Models/Core/UnitSphere.obj"; + + m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint; + m_PlayerDefinitions[i].Name = std::string(data); m_StopTimes[i] = std::clock(); - std::cout << "Player \"" << m_PlayerNames[i] << "\" connected on IP: " << m_Connections[i].address().to_string() << std::endl; + + std::cout << "Player \"" << m_PlayerDefinitions[i].Name << "\" connected on IP: " << + m_PlayerDefinitions[i].Endpoint.address().to_string() << std::endl; int offset = 0; char* temp = new char[sizeof(int) * 2]; - int msgType = 0; - memcpy(temp, &msgType, sizeof(int)); + int messagType = 0; + + memcpy(temp, &messagType, sizeof(int)); offset += sizeof(int); memcpy(temp + offset, &i, sizeof(int)); m_Socket.send_to( boost::asio::buffer(temp, sizeof(int) * 2), - m_Connections[i], + m_PlayerDefinitions[i].Endpoint, 0); + // Send notification that a player has connected - std::string str = "Player " + m_PlayerNames[i] + " connected on: " + m_ReceiverEndpoint.address().to_string(); + std::string str = "Player " + m_PlayerDefinitions[i].Name + " connected on: " + + m_PlayerDefinitions[i].Endpoint.address().to_string(); Broadcast(str); // +1 is the null terminator - MoveMessageHead(data, length, m_PlayerNames[i].size() + 1); + MoveMessageHead(data, length, m_PlayerDefinitions[i].Name.size() + 1); delete[] temp; break; } @@ -347,7 +373,7 @@ void Server::ParseDisconnect() std::cout << "Parsing disconnect. \n"; for (int i = 0; i < MAXCONNECTIONS; i++) { - if (m_Connections[i].address() == m_ReceiverEndpoint.address()) { + if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { Disconnect(i); break; } @@ -373,7 +399,7 @@ void Server::ParseClientPing() void Server::ParseServerPing() { for (int i = 0; i < MAXCONNECTIONS; i++) { - if (m_Connections[i].address() == m_ReceiverEndpoint.address()) { + if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { m_StopTimes[i] = std::clock(); break; } @@ -385,10 +411,10 @@ void Server::ParseSnapshot(char * data, size_t length) // Does no logic. Returns snapshot if client request one // The snapshot is not a real snapshot tho... for (int i = 0; i < MAXCONNECTIONS; i++) { - if (m_Connections[i].address() != boost::asio::ip::address()) { + if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { m_Socket.send_to( boost::asio::buffer("I'm sending a snapshot to you guys!"), - m_Connections[i], + m_PlayerDefinitions[i].Endpoint, 0); } } diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index ffff8fb6..670d2d13 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -81,6 +81,6 @@ void Game::NetworkFunction() m_Client.Start(); } if (inputMessage == "s" || inputMessage == "S") { - m_Server.Start(); + m_Server.Start(m_World); } } \ No newline at end of file From 27b44d2511e1ce4ad3506f529ba86e090d05a165 Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 8 Dec 2015 16:41:48 +0100 Subject: [PATCH 09/60] Input events for Client done. Instead of windows getAsyncKeyState(); --- include/Engine/Network/Client.h | 3 +- src/Engine/Network/Client.cpp | 89 +++++++++++++++------------------ src/Game/Game.cpp | 7 +-- 3 files changed, 46 insertions(+), 53 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 54d83355..b9c1abcc 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -7,6 +7,7 @@ #include #include #include +#include // For input event #include "Network/MessageType.h" #include "Network/NetworkDefines.h" @@ -40,7 +41,7 @@ private: void ParsePing(); void ParseServerPing(); void ParseSnapshot(char* data, size_t length); - void SendInput(); + //void SendInput(); void SendDebugInput(); void DrawBoard(); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 7ef2c210..9e9e6ed4 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -51,7 +51,7 @@ void Client::Start(EventBroker* eventBroker) threads.create_thread(boost::bind(&Client::DisplayLoop, this)); threads.create_thread(boost::bind(&Client::ReadFromServer, this)); - threads.create_thread(boost::bind(&Client::InputLoop, this)); + //threads.create_thread(boost::bind(&Client::InputLoop, this)); threads.join_all(); } @@ -82,7 +82,7 @@ void Client::InputLoop() int testTimeShit2 = (1000 * (currentTime - previousInputTime) / (double)CLOCKS_PER_SEC); if (intervallMs < (1000 * (currentTime - previousInputTime) / (double)CLOCKS_PER_SEC)) { if (m_PlayerID != -1) { - SendInput(); + //SendInput(); } previousInputTime = currentTime; } @@ -300,58 +300,49 @@ void Client::SendDebugInput() m_ReceiverEndpoint, 0); } - if (GetAsyncKeyState('C')) { - Connect(); - } - - if (GetAsyncKeyState('Q')) { - Disconnect(); - } - memset(dataPackage, 0, INPUTSIZE); - delete[] dataPackage; -} - -void Client::SendInput() -{ - char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled - if (GetAsyncKeyState('W')) { - int len = CreateMessage(MessageType::Event, "+Forward", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); - } - if (GetAsyncKeyState('A')) { - int len = CreateMessage(MessageType::Event, "-Right", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); - } - if (GetAsyncKeyState('S')) { - int len = CreateMessage(MessageType::Event, "-Forward", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); - } - if (GetAsyncKeyState('D')) { - int len = CreateMessage(MessageType::Event, "+Right", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); - } - if (GetAsyncKeyState('V')) { - Disconnect(); - } - memset(dataPackage, 0, INPUTSIZE); delete[] dataPackage; } bool Client::OnKeyDown(const Events::KeyDown& event) { - std::cout << event.KeyCode; + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + if (event.KeyCode == GLFW_KEY_W) { + int len = CreateMessage(MessageType::Event, "+Forward", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (event.KeyCode == GLFW_KEY_A) { + int len = CreateMessage(MessageType::Event, "-Right", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (event.KeyCode == GLFW_KEY_S) { + int len = CreateMessage(MessageType::Event, "-Forward", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (event.KeyCode == GLFW_KEY_D) { + int len = CreateMessage(MessageType::Event, "+Right", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (event.KeyCode == GLFW_KEY_V) { + Disconnect(); + } + if (event.KeyCode == GLFW_KEY_C) { + Connect(); + } + + memset(dataPackage, 0, INPUTSIZE); + delete[] dataPackage; return true; } \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 53f591ba..b9886c18 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -57,15 +57,16 @@ void Game::Tick() double currentTime = glfwGetTime(); double dt = currentTime - m_LastTime; m_LastTime = currentTime; - m_EventBroker->Process(); m_EventBroker->Swap(); m_InputManager->Update(dt); - m_Renderer->Update(dt); m_EventBroker->Swap(); - m_RenderQueueFactory->Update(m_World); + // DO SYSTEM SHIT HERE + m_EventBroker->Process(); + m_Renderer->Update(dt); + m_RenderQueueFactory->Update(m_World); m_Renderer->Draw(m_RenderQueueFactory->RenderQueues()); m_EventBroker->Swap(); From 24dada149f915b15a799b2a14858178073622d3e Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 8 Dec 2015 17:18:03 +0100 Subject: [PATCH 10/60] Cleaned up code in Client.h and Client.cpp. Moved ping code into Ping() function. --- include/Engine/Network/Client.h | 10 +-- src/Engine/Network/Client.cpp | 127 +++++--------------------------- 2 files changed, 20 insertions(+), 117 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index b9c1abcc..e7c346ae 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -4,8 +4,6 @@ #include #include -#include -#include #include #include // For input event @@ -26,14 +24,13 @@ public: private: // Threaded - void DisplayLoop(); void ReadFromServer(); - void InputLoop(); int Receive(char* data, size_t length); int CreateMessage(MessageType type, std::string message, char* data); void Connect(); void Disconnect(); + void Ping(); void MoveMessageHead(char*& data, size_t& length, size_t stepSize); void ParseMessageType(char* data, size_t length); void ParseEventMessage(char* data, size_t length); @@ -41,9 +38,6 @@ private: void ParsePing(); void ParseServerPing(); void ParseSnapshot(char* data, size_t length); - //void SendInput(); - void SendDebugInput(); - void DrawBoard(); // udp stuff boost::asio::ip::udp::endpoint m_ReceiverEndpoint; @@ -51,12 +45,10 @@ private: boost::asio::ip::udp::socket m_Socket; int m_PlayerID = -1; - char m_GameBoard[BOARDSIZE][BOARDSIZE]; glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; std::string m_PlayerNames[MAXCONNECTIONS]; std::clock_t m_StartPingTime; double m_DurationOfPingTime; - bool m_ShouldDrawGameBoard = true; std::string m_PlayerName; bool m_ThreadIsRunning = true; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 9e9e6ed4..e1b970a1 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -5,12 +5,8 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { - //m_EventBroker = eventBroker; // Set up network stream m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); - - - //EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &Client::OnKeyDown); } Client::~Client() @@ -31,29 +27,10 @@ void Client::Start(EventBroker* eventBroker) std::cout << "Please enter you name(No longer than 7 characters): "; std::cin >> m_PlayerName; } - - boost::thread_group threads; - - for (size_t i = 0; i < BOARDSIZE; i++) { - for (size_t j = 0; j < BOARDSIZE; j++) { - m_GameBoard[j][i] = ' '; - } - } - - for (size_t i = 0; i < MAXCONNECTIONS; i++) { - m_PlayerPositions[i].x = -1; - m_PlayerPositions[i].y = -1; - m_PlayerNames[i] = "X"; - } - m_Socket.connect(m_ReceiverEndpoint); std::cout << "I am client. BIP BOP\n"; - threads.create_thread(boost::bind(&Client::DisplayLoop, this)); - threads.create_thread(boost::bind(&Client::ReadFromServer, this)); - //threads.create_thread(boost::bind(&Client::InputLoop, this)); - - threads.join_all(); + ReadFromServer(); } void Client::Close() @@ -63,47 +40,6 @@ void Client::Close() m_Socket.close(); } -void Client::InputLoop() -{ - int intervallMs = 33; // ~30 times per second - int commandInterval = 200; // for commands like ping and connect, name might be ambigiuos - std::clock_t previousInputTime = std::clock(); - std::clock_t previousCommandTime = std::clock(); - - while (m_ThreadIsRunning) { - - std::clock_t currentTime = std::clock(); - int testTimeShit = (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC); - if (commandInterval < (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC)) { - SendDebugInput(); - previousCommandTime = currentTime; - } - - int testTimeShit2 = (1000 * (currentTime - previousInputTime) / (double)CLOCKS_PER_SEC); - if (intervallMs < (1000 * (currentTime - previousInputTime) / (double)CLOCKS_PER_SEC)) { - if (m_PlayerID != -1) { - //SendInput(); - } - previousInputTime = currentTime; - } - } -} - -void Client::DisplayLoop() -{ - while (m_ThreadIsRunning) { - // Update gameboard - for (size_t i = 0; i < BOARDSIZE; i++) { - for (size_t j = 0; j < BOARDSIZE; j++) { - m_GameBoard[j][i] = ' '; - } - } - if (m_ShouldDrawGameBoard) - //DrawBoard(); - boost::this_thread::sleep(boost::posix_time::millisec(100)); - } -} - void Client::ReadFromServer() { int bytesRead = -1; @@ -207,32 +143,6 @@ void Client::ParseSnapshot(char* data, size_t length) } } -void Client::DrawBoard() -{ - for (size_t i = 0; i < MAXCONNECTIONS; i++) { - if (m_PlayerPositions[i].x != -1 && m_PlayerPositions[i].y != -1) { - m_GameBoard[static_cast(m_PlayerPositions[i].x)][static_cast(m_PlayerPositions[i].y)] = m_PlayerNames[i][0]; - } - } - - system("cls"); - for (size_t i = 0; i < BOARDSIZE; i++) { - std::cout << '_'; - } - - std::cout << std::endl; - for (size_t i = 0; i < BOARDSIZE; i++) { - for (size_t j = 0; j < BOARDSIZE; j++) { - std::cout << m_GameBoard[j][i]; - } - std::cout << std::endl; - } - - for (size_t i = 0; i < BOARDSIZE; i++) { - std::cout << "^"; - } -} - int Client::Receive(char* data, size_t length) { int bytesReceived = m_Socket.receive_from(boost @@ -282,28 +192,27 @@ void Client::Disconnect() delete[] dataPackage; } +void Client::Ping() +{ + char* dataPackage = new char[INPUTSIZE]; + if (GetAsyncKeyState('P')) { // Maybe use previous key here + int length = CreateMessage(MessageType::ClientPing, "Ping", dataPackage); + m_StartPingTime = std::clock(); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + length), + m_ReceiverEndpoint, 0); + } + memset(dataPackage, 0, INPUTSIZE); + delete[] dataPackage; +} + void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) { data += stepSize; length -= stepSize; } -void Client::SendDebugInput() -{ - char* dataPackage = new char[INPUTSIZE]; - if (GetAsyncKeyState('P')) { // Maybe use previous key here - int length = CreateMessage(MessageType::ClientPing, "Ping", dataPackage); - m_StartPingTime = std::clock(); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - length), - m_ReceiverEndpoint, 0); - } - - memset(dataPackage, 0, INPUTSIZE); - delete[] dataPackage; -} - bool Client::OnKeyDown(const Events::KeyDown& event) { char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled @@ -341,7 +250,9 @@ bool Client::OnKeyDown(const Events::KeyDown& event) if (event.KeyCode == GLFW_KEY_C) { Connect(); } - + if (event.KeyCode == GLFW_KEY_P) { + Ping(); + } memset(dataPackage, 0, INPUTSIZE); delete[] dataPackage; return true; From 9f54a085366ffa15f9e4d37f8903fece1d17dcbc Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 8 Dec 2015 17:57:01 +0100 Subject: [PATCH 11/60] Implemented new version of snapshot for 3D world. Also some cleanup. --- include/Engine/Network/Client.h | 14 +-- include/Engine/Network/PlayerDefinition.h | 4 +- src/Engine/Network/Client.cpp | 133 ++++++---------------- src/Engine/Network/Server.cpp | 11 +- src/Game/Game.cpp | 2 +- 5 files changed, 52 insertions(+), 112 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index b9c1abcc..eb606678 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -11,7 +11,9 @@ #include "Network/MessageType.h" #include "Network/NetworkDefines.h" +#include "Network/PlayerDefinition.h" #include "Network/WinLeakCheck.h" +#include "Core/World.h" #include "Core/EventBroker.h" #include "Core/EKeyDown.h" @@ -21,14 +23,12 @@ class Client public: Client(); ~Client(); - void Start(EventBroker* eventBroker); + void Start(World* world, EventBroker* eventBroker); void Close(); private: // Threaded - void DisplayLoop(); void ReadFromServer(); - void InputLoop(); int Receive(char* data, size_t length); int CreateMessage(MessageType type, std::string message, char* data); @@ -41,19 +41,19 @@ private: void ParsePing(); void ParseServerPing(); void ParseSnapshot(char* data, size_t length); - //void SendInput(); - void SendDebugInput(); - void DrawBoard(); + void CreateNewPlayer(int i); // udp stuff boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::io_service m_IOService; boost::asio::ip::udp::socket m_Socket; + World* m_World; int m_PlayerID = -1; char m_GameBoard[BOARDSIZE][BOARDSIZE]; glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; - std::string m_PlayerNames[MAXCONNECTIONS]; + //std::string m_PlayerNames[MAXCONNECTIONS]; + PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; std::clock_t m_StartPingTime; double m_DurationOfPingTime; bool m_ShouldDrawGameBoard = true; diff --git a/include/Engine/Network/PlayerDefinition.h b/include/Engine/Network/PlayerDefinition.h index 19c2f341..b35ff463 100644 --- a/include/Engine/Network/PlayerDefinition.h +++ b/include/Engine/Network/PlayerDefinition.h @@ -3,8 +3,8 @@ #include struct PlayerDefinition { - unsigned int EntityID; - std::string Name; + unsigned int EntityID = -1; + std::string Name = ""; boost::asio::ip::udp::endpoint Endpoint; }; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 9e9e6ed4..d22e4e7c 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -19,10 +19,11 @@ Client::~Client() _CrtDumpMemoryLeaks(); } -void Client::Start(EventBroker* eventBroker) +void Client::Start(World* world, EventBroker* eventBroker) { // Subscribe to events m_EventBroker = eventBroker; + m_World = world; m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EKeyDown); std::cout << "Please enter you name: "; @@ -34,24 +35,10 @@ void Client::Start(EventBroker* eventBroker) boost::thread_group threads; - for (size_t i = 0; i < BOARDSIZE; i++) { - for (size_t j = 0; j < BOARDSIZE; j++) { - m_GameBoard[j][i] = ' '; - } - } - - for (size_t i = 0; i < MAXCONNECTIONS; i++) { - m_PlayerPositions[i].x = -1; - m_PlayerPositions[i].y = -1; - m_PlayerNames[i] = "X"; - } - m_Socket.connect(m_ReceiverEndpoint); std::cout << "I am client. BIP BOP\n"; - threads.create_thread(boost::bind(&Client::DisplayLoop, this)); threads.create_thread(boost::bind(&Client::ReadFromServer, this)); - //threads.create_thread(boost::bind(&Client::InputLoop, this)); threads.join_all(); } @@ -63,47 +50,6 @@ void Client::Close() m_Socket.close(); } -void Client::InputLoop() -{ - int intervallMs = 33; // ~30 times per second - int commandInterval = 200; // for commands like ping and connect, name might be ambigiuos - std::clock_t previousInputTime = std::clock(); - std::clock_t previousCommandTime = std::clock(); - - while (m_ThreadIsRunning) { - - std::clock_t currentTime = std::clock(); - int testTimeShit = (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC); - if (commandInterval < (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC)) { - SendDebugInput(); - previousCommandTime = currentTime; - } - - int testTimeShit2 = (1000 * (currentTime - previousInputTime) / (double)CLOCKS_PER_SEC); - if (intervallMs < (1000 * (currentTime - previousInputTime) / (double)CLOCKS_PER_SEC)) { - if (m_PlayerID != -1) { - //SendInput(); - } - previousInputTime = currentTime; - } - } -} - -void Client::DisplayLoop() -{ - while (m_ThreadIsRunning) { - // Update gameboard - for (size_t i = 0; i < BOARDSIZE; i++) { - for (size_t j = 0; j < BOARDSIZE; j++) { - m_GameBoard[j][i] = ' '; - } - } - if (m_ShouldDrawGameBoard) - //DrawBoard(); - boost::this_thread::sleep(boost::posix_time::millisec(100)); - } -} - void Client::ReadFromServer() { int bytesRead = -1; @@ -183,7 +129,7 @@ void Client::ParseEventMessage(char* data, size_t length) memcpy(&Id, data, sizeof(int)); MoveMessageHead(data, length, sizeof(int)); // Sett Player name - m_PlayerNames[Id] = command.erase(0, 7); + m_PlayerDefinitions[Id].Name = command.erase(0, 7); } else { std::cout << "Event message: " << std::string(data) << std::endl; @@ -196,40 +142,37 @@ void Client::ParseSnapshot(char* data, size_t length) { std::string tempName; for (size_t i = 0; i < MAXCONNECTIONS; i++) { - memcpy(&m_PlayerPositions[i].x, data, sizeof(float)); + // 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(&m_PlayerPositions[i].y, data, 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); - m_PlayerNames[i] = tempName; // +1 for null terminator MoveMessageHead(data, length, tempName.size() + 1); - } -} -void Client::DrawBoard() -{ - for (size_t i = 0; i < MAXCONNECTIONS; i++) { - if (m_PlayerPositions[i].x != -1 && m_PlayerPositions[i].y != -1) { - m_GameBoard[static_cast(m_PlayerPositions[i].x)][static_cast(m_PlayerPositions[i].y)] = m_PlayerNames[i][0]; + // Apply the position data read to the player entity + // New player connected on the server side + if (m_PlayerDefinitions[i].Name == "" && tempName != "") { + CreateNewPlayer(i); } - } - - system("cls"); - for (size_t i = 0; i < BOARDSIZE; i++) { - std::cout << '_'; - } - - std::cout << std::endl; - for (size_t i = 0; i < BOARDSIZE; i++) { - for (size_t j = 0; j < BOARDSIZE; j++) { - std::cout << m_GameBoard[j][i]; + else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { + // Someone disconnected + // TODO: Insert code here } - std::cout << std::endl; - } - - for (size_t i = 0; i < BOARDSIZE; i++) { - std::cout << "^"; + else { + // Not a connected player + break; + } + m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; + m_PlayerDefinitions[i].Name = tempName; } } @@ -288,22 +231,6 @@ void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) length -= stepSize; } -void Client::SendDebugInput() -{ - char* dataPackage = new char[INPUTSIZE]; - if (GetAsyncKeyState('P')) { // Maybe use previous key here - int length = CreateMessage(MessageType::ClientPing, "Ping", dataPackage); - m_StartPingTime = std::clock(); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - length), - m_ReceiverEndpoint, 0); - } - - memset(dataPackage, 0, INPUTSIZE); - delete[] dataPackage; -} - bool Client::OnKeyDown(const Events::KeyDown& event) { char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled @@ -345,4 +272,12 @@ bool Client::OnKeyDown(const Events::KeyDown& event) memset(dataPackage, 0, INPUTSIZE); delete[] dataPackage; return true; +} + +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"; } \ No newline at end of file diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 1fb87cfa..718cb596 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -203,14 +203,19 @@ void Server::Broadcast(char * data, size_t length) void Server::SendSnapshot() { - char* data = new char[128]; + char* data = new char[INPUTSIZE]; int offset = CreateHeader(MessageType::Snapshot, data); for (size_t i = 0; i < MAXCONNECTIONS; i++) { - memcpy(data + offset, &m_PlayerPositions[i].x, sizeof(float)); + // Pack player pos into data package + glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; + memcpy(data + offset, &playerPos.x, sizeof(float)); offset += sizeof(float); - memcpy(data + offset, &m_PlayerPositions[i].y, sizeof(float)); + memcpy(data + offset, &playerPos.y, sizeof(float)); offset += sizeof(float); + memcpy(data + offset, &playerPos.z, sizeof(float)); + offset += sizeof(float); // +1 for null terminator + // Pack player name into data package memcpy(data + offset, m_PlayerDefinitions[i].Name.data(), m_PlayerDefinitions[i].Name.size() + 1); offset += (m_PlayerDefinitions[i].Name.size() + 1) * sizeof(char); } diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 36ef8877..d21e64ea 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -81,7 +81,7 @@ void Game::NetworkFunction() std::cout << "Start client or server? (c/s)" << std::endl; std::cin >> inputMessage; if (inputMessage == "c" || inputMessage == "C") { - m_Client.Start(m_EventBroker); + m_Client.Start(m_World, m_EventBroker); } if (inputMessage == "s" || inputMessage == "S") { m_Server.Start(m_World); From 58db7b755a0883b78405b593ceb25f3de9932d56 Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 8 Dec 2015 18:24:08 +0100 Subject: [PATCH 12/60] Random bugfixes and cleanup. --- include/Engine/Network/Server.h | 5 +---- src/Engine/Network/Server.cpp | 17 +++++++---------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index be2e17a8..9a971f4b 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -23,15 +23,12 @@ private: boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::io_service m_IOService; boost::asio::ip::udp::socket m_Socket; - // boost::asio::ip::udp::endpoint m_Connections[MAXCONNECTIONS]; PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; //Timers std::clock_t m_StartPingTime; std::clock_t m_StopTimes[8]; // Game logic - // std::string m_PlayerNames[MAXCONNECTIONS]; - char m_GameBoard[BOARDSIZE][BOARDSIZE]; - glm::vec2 m_PlayerPositions[8]; + World* m_World; // Threaded diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index a6e49560..2e95c0f6 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -14,11 +14,7 @@ void Server::Start(World* world) m_World = world; for (size_t i = 0; i < MAXCONNECTIONS; i++) { m_StopTimes[i] = std::clock(); - m_PlayerPositions[i].x = -1; - m_PlayerPositions[i].y = -1; } - m_PlayerPositions[0].x = 0; - m_PlayerPositions[0].y = 0; boost::thread_group threads; std::cout << "I am Server. BIP BOP\n"; @@ -32,7 +28,7 @@ void Server::Start(World* world) void Server::DisplayLoop() { - int lengthOfMsg = -1; + int lengthOfMessage = -1; std::clock_t previousePingMessage = std::clock(); std::clock_t previousSnapshotMessage = std::clock(); std::clock_t timOutTimer = std::clock(); @@ -279,12 +275,13 @@ void Server::Disconnect(int i) { Broadcast("A player disconnected"); std::cout << "Player " << i << " disconnected/Timed out" << std::endl; + + // Remove enteties and stuff m_PlayerDefinitions[i].Endpoint = boost::asio::ip::udp::endpoint(); - m_PlayerDefinitions[i].EntityID = -1; - m_PlayerDefinitions[i].Name = "Name not Set"; - // Reset disconnected players position - m_PlayerPositions[i].x = -1; - m_PlayerPositions[i].y = -1; + m_PlayerDefinitions[i].EntityID = -1; + m_PlayerDefinitions[i].Name = ""; + + } void Server::ParseEvent(char * data, size_t length) From f83e217638211090b3bd5a3a5d880d26a3a98374 Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 8 Dec 2015 18:35:30 +0100 Subject: [PATCH 13/60] Bugfix. if-statement was incorrect --- src/Engine/Network/Client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 2133e45c..5efa796e 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -157,7 +157,7 @@ void Client::ParseSnapshot(char* data, size_t length) // Someone disconnected // TODO: Insert code here } - else { + else if (m_PlayerDefinitions[i].Name == "" && tempName == "") { // Not a connected player break; } From ce41421dbb81c855e2cea774862017192b77dc73 Mon Sep 17 00:00:00 2001 From: stiffly Date: Wed, 9 Dec 2015 10:37:40 +0100 Subject: [PATCH 14/60] Added a "StartNetwork" bool to DefaultConfig. --- resources/DefaultConfig.ini | 10 +++++++++- src/Game/Game.cpp | 7 ++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/resources/DefaultConfig.ini b/resources/DefaultConfig.ini index ac7e9ec2..9b81923e 100644 --- a/resources/DefaultConfig.ini +++ b/resources/DefaultConfig.ini @@ -1,8 +1,16 @@ [Debug] + LogLevel=1 + [Video] + Fullscreen=false + VSYNC=false + Width=1280 -Height=720 \ No newline at end of file + +Height=720 +[Networking] +StartNetwork=false \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index d21e64ea..2f63e294 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -38,9 +38,10 @@ Game::Game(int argc, char* argv[]) // Create a TEST WORLD m_World = new HardcodedTestWorld(); - // TEMP: Invoke network - - boost::thread workerThread(&Game::NetworkFunction, this); + + // Invoke network + if(m_Config->Get("Networking.StartNetwork", false) == true) + boost::thread workerThread(&Game::NetworkFunction, this); m_LastTime = glfwGetTime(); } From 2a35c3055ee9b5ee78b062aeb4f75168df4e735a Mon Sep 17 00:00:00 2001 From: stiffly Date: Wed, 9 Dec 2015 11:08:57 +0100 Subject: [PATCH 15/60] Renamed NetworkDefines.h --> NetworkDefinitions.h --- include/Engine/Network/Client.h | 2 +- .../Network/{NetworkDefines.h => NetworkDefinitions.h} | 0 include/Engine/Network/Server.h | 8 +++++--- 3 files changed, 6 insertions(+), 4 deletions(-) rename include/Engine/Network/{NetworkDefines.h => NetworkDefinitions.h} (100%) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 2e03f981..94ef3181 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -8,7 +8,7 @@ #include // For input event #include "Network/MessageType.h" -#include "Network/NetworkDefines.h" +#include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" #include "Network/WinLeakCheck.h" #include "Core/World.h" diff --git a/include/Engine/Network/NetworkDefines.h b/include/Engine/Network/NetworkDefinitions.h similarity index 100% rename from include/Engine/Network/NetworkDefines.h rename to include/Engine/Network/NetworkDefinitions.h diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 9a971f4b..752edc6f 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -1,15 +1,17 @@ #ifndef Server_h__ #define Server_h__ + #include #include #include #include #include -#include "NetworkDefines.h" -#include "MessageType.h" -#include "Core/World.h" + +#include "Network/MessageType.h" +#include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" +#include "Core/World.h" class Server { From 247ff09743e198ed1c7cb5bb396b731a8f9a068c Mon Sep 17 00:00:00 2001 From: stiffly Date: Wed, 9 Dec 2015 13:02:39 +0100 Subject: [PATCH 16/60] Smoother movement over network. Some refactoring on client side. Now uses EKeyUp to determine if a key is pressed. --- include/Engine/Network/Client.h | 9 ++- include/Engine/Network/SnapshotDefinitions.h | 12 ++++ src/Engine/Network/Client.cpp | 73 ++++++++++++++------ 3 files changed, 71 insertions(+), 23 deletions(-) create mode 100644 include/Engine/Network/SnapshotDefinitions.h diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 94ef3181..85c106d0 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -10,10 +10,12 @@ #include "Network/MessageType.h" #include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" +#include "Network/SnapshotDefinitions.h" #include "Network/WinLeakCheck.h" #include "Core/World.h" #include "Core/EventBroker.h" #include "Core/EKeyDown.h" +#include "Core/EKeyUp.h" class Client @@ -25,8 +27,8 @@ public: void Close(); private: - // Threaded void ReadFromServer(); + void SendToServer(); int Receive(char* data, size_t length); int CreateMessage(MessageType type, std::string message, char* data); @@ -52,6 +54,7 @@ private: glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; //std::string m_PlayerNames[MAXCONNECTIONS]; PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; + SnapshotDefinitions m_NextSnapshot; std::clock_t m_StartPingTime; double m_DurationOfPingTime; std::string m_PlayerName; @@ -60,7 +63,9 @@ private: // Events EventBroker* m_EventBroker; EventRelay m_EKeyDown; - bool OnKeyDown(const Events::KeyDown &e); + bool OnKeyDown(const Events::KeyDown &e); + EventRelay m_EKeyUp; + bool OnKeyUp(const Events::KeyUp &e); }; #endif diff --git a/include/Engine/Network/SnapshotDefinitions.h b/include/Engine/Network/SnapshotDefinitions.h new file mode 100644 index 00000000..7f9e4ce5 --- /dev/null +++ b/include/Engine/Network/SnapshotDefinitions.h @@ -0,0 +1,12 @@ +#ifndef SnapshotDefinitions_h__ +#define SnapshotDefinitions_h__ + +struct SnapshotDefinitions +{ + // "+Forward" is 8 characters * sizeof(char) = 8 + char* inputForward = new char[8]; + // "+Right" is 6 characters * sizeof(char) = 6 + char* inputRight = new char[6]; +}; + +#endif \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 5efa796e..9a51202c 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -17,11 +17,15 @@ Client::~Client() void Client::Start(World* world, EventBroker* eventBroker) { - // Subscribe to events m_EventBroker = eventBroker; m_World = world; + + // Subscribe to events m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EKeyDown); + m_EKeyUp = decltype(m_EKeyUp)(std::bind(&Client::OnKeyUp, this, std::placeholders::_1)); + m_EventBroker->Subscribe(m_EKeyUp); + std::cout << "Please enter you name: "; std::cin >> m_PlayerName; while (m_PlayerName.size() > 7) { @@ -46,11 +50,40 @@ 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); ParseMessageType(readBuf, bytesRead); } + std::clock_t currentTime = std::clock(); + if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + SendToServer(); + previousSnapshotMessage = currentTime; + } + + } +} + +void Client::SendToServer() +{ + if (m_NextSnapshot.inputForward != "") { + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputForward, dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); + } + if (m_NextSnapshot.inputRight != "") { + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputRight, dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); } } @@ -240,33 +273,18 @@ bool Client::OnKeyDown(const Events::KeyDown& event) { char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled if (event.KeyCode == GLFW_KEY_W) { - int len = CreateMessage(MessageType::Event, "+Forward", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + m_NextSnapshot.inputForward = "+Forward"; } if (event.KeyCode == GLFW_KEY_A) { - int len = CreateMessage(MessageType::Event, "-Right", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + m_NextSnapshot.inputRight = "-Right"; } if (event.KeyCode == GLFW_KEY_S) { - int len = CreateMessage(MessageType::Event, "-Forward", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + m_NextSnapshot.inputForward = "-Forward"; } if (event.KeyCode == GLFW_KEY_D) { - int len = CreateMessage(MessageType::Event, "+Right", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + m_NextSnapshot.inputRight = "+Right"; } + if (event.KeyCode == GLFW_KEY_V) { Disconnect(); } @@ -281,6 +299,19 @@ bool Client::OnKeyDown(const Events::KeyDown& event) return true; } +bool Client::OnKeyUp(const Events::KeyUp & e) +{ + if (e.KeyCode == GLFW_KEY_W || e.KeyCode == GLFW_KEY_S) { + m_NextSnapshot.inputForward = ""; + return true; + } + if (e.KeyCode == GLFW_KEY_A || e.KeyCode == GLFW_KEY_D) { + m_NextSnapshot.inputRight = ""; + return true; + } + return false; +} + void Client::CreateNewPlayer(int i) { m_PlayerDefinitions[i].EntityID = m_World->CreateEntity(); From 0e6353dd7912710d55f66e2969c9c356b5684bf6 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 9 Dec 2015 13:37:02 +0100 Subject: [PATCH 17/60] Fixed bug where closing glwindow as client crashed. Server bug is still present. --- include/Engine/Network/Client.h | 5 ++- src/Engine/Network/Client.cpp | 14 ++++--- src/Engine/Network/Server.cpp | 66 +++++++++++++++++---------------- src/Game/Game.cpp | 5 ++- 4 files changed, 49 insertions(+), 41 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 2e03f981..0ddc03dc 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -23,7 +23,6 @@ public: ~Client(); void Start(World* world, EventBroker* eventBroker); void Close(); - private: // Threaded void ReadFromServer(); @@ -50,12 +49,14 @@ private: World* m_World; int m_PlayerID = -1; glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; - //std::string m_PlayerNames[MAXCONNECTIONS]; PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; std::clock_t m_StartPingTime; double m_DurationOfPingTime; std::string m_PlayerName; bool m_ThreadIsRunning = true; + // Use to check if we should send disconnect message + // if game is turned of by closing window. + bool m_WasStarted = false; // Events EventBroker* m_EventBroker; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 5efa796e..17bcde7e 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -18,10 +18,11 @@ Client::~Client() void Client::Start(World* world, EventBroker* eventBroker) { // Subscribe to events - m_EventBroker = eventBroker; + m_WasStarted = true; + m_EventBroker = eventBroker; m_World = world; m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1)); - m_EventBroker->Subscribe(m_EKeyDown); + m_EventBroker->Subscribe(m_EKeyDown); std::cout << "Please enter you name: "; std::cin >> m_PlayerName; while (m_PlayerName.size() > 7) { @@ -30,15 +31,16 @@ void Client::Start(World* world, EventBroker* eventBroker) } m_Socket.connect(m_ReceiverEndpoint); std::cout << "I am client. BIP BOP\n"; - ReadFromServer(); } void Client::Close() { - Disconnect(); - m_ThreadIsRunning = false; - m_Socket.close(); + if (m_WasStarted) { + Disconnect(); + m_ThreadIsRunning = false; + m_EventBroker->Unsubscribe(m_EKeyDown); + } } void Client::ReadFromServer() diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 2e95c0f6..3dece632 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -28,36 +28,11 @@ void Server::Start(World* world) void Server::DisplayLoop() { - int lengthOfMessage = -1; - std::clock_t previousePingMessage = std::clock(); - std::clock_t previousSnapshotMessage = std::clock(); - std::clock_t timOutTimer = std::clock(); - int intervallMs = 1000; - int snapshotInterval = 50; - int timeToCheckTimeOutTime = 100; - char* data; + for (;;) { - std::clock_t currentTime = std::clock(); - // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); - // Send snapshot - if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - SendSnapshot(); - previousSnapshotMessage = currentTime; - } - - // Send pings each - if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { - SendPing(); - previousePingMessage = currentTime; - } - - // Time out logic - if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { - CheckForTimeOuts(); - timOutTimer = currentTime; - } + } } @@ -65,6 +40,14 @@ void Server::ReadFromClients() { char readBuf[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 offen we send messages (milliseconds) + int intervallMs = 1000; + int snapshotInterval = 50; + int timeToCheckTimeOutTime = 100; for (;;) { if (m_Socket.available()) { @@ -77,6 +60,26 @@ void Server::ReadFromClients() std::cout << "Read from client crashed: " << err.what(); //} } + + std::clock_t currentTime = std::clock(); + // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); + // Send snapshot + if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + SendSnapshot(); + previousSnapshotMessage = currentTime; + } + + // Send pings each + if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { + SendPing(); + previousePingMessage = currentTime; + } + + // Time out logic + if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { + CheckForTimeOuts(); + timOutTimer = currentTime; + } } } } @@ -299,24 +302,24 @@ void Server::ParseEvent(char * data, size_t length) unsigned int entityId = m_PlayerDefinitions[i].EntityID; if ("+Forward" == std::string(data)) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - temp.z -= 0.5f; + temp.z -= 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } if ("-Forward" == std::string(data)) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - temp.z += 0.5f; + temp.z += 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } if ("+Right" == std::string(data)) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - temp.x += 0.5f; + temp.x += 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } if ("-Right" == std::string(data)) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - temp.x -= 0.5f; + temp.x -= 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } } @@ -340,6 +343,7 @@ void Server::ParseConnect(char * data, size_t length) transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[i].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); m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint; m_PlayerDefinitions[i].Name = std::string(data); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index d21e64ea..4b928b15 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -41,15 +41,16 @@ Game::Game(int argc, char* argv[]) // TEMP: Invoke network boost::thread workerThread(&Game::NetworkFunction, this); - m_LastTime = glfwGetTime(); } Game::~Game() { + // Call before to ensure that thread closes correctly. + m_Client.Close(); + delete m_FrameStack; delete m_EventBroker; - m_Client.Close(); } void Game::Tick() From 0807a7d0ae4763ce54c04649f0aeb72268d77679 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 9 Dec 2015 14:43:43 +0100 Subject: [PATCH 18/60] Fixed the bug where starting a server made the program crash on closing. Fixed some memory leaks in Client.cpp. --- include/Engine/Network/Server.h | 6 ++++-- src/Engine/Network/Client.cpp | 3 +++ src/Engine/Network/Server.cpp | 21 +++++++++++---------- src/Game/Game.cpp | 1 + 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 752edc6f..381759d7 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -19,6 +19,7 @@ public: Server(); ~Server(); void Start(World* m_world); + void Close(); private: // udp stuff @@ -30,15 +31,16 @@ private: std::clock_t m_StartPingTime; std::clock_t m_StopTimes[8]; // Game logic - World* m_World; - + // Close logic + bool m_ThreadIsRunning = true; // Threaded void DisplayLoop(); void ReadFromClients(); void InputLoop(); + int Receive(char* data, size_t length); int CreateMessage(MessageType type, std::string message, char * data); void MoveMessageHead(char*& data, size_t& length, size_t stepSize); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 0e13fb4c..df418e06 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -44,6 +44,7 @@ void Client::Close() Disconnect(); m_ThreadIsRunning = false; m_EventBroker->Unsubscribe(m_EKeyDown); + m_EventBroker->Unsubscribe(m_EKeyUp); } } @@ -78,6 +79,7 @@ void Client::SendToServer() dataPackage, len), m_ReceiverEndpoint, 0); + delete[] dataPackage; } if (m_NextSnapshot.inputRight != "") { char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled @@ -86,6 +88,7 @@ void Client::SendToServer() dataPackage, len), m_ReceiverEndpoint, 0); + delete[] dataPackage; } } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 3dece632..344054f6 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -26,14 +26,14 @@ void Server::Start(World* world) threads.join_all(); } +void Server::Close() +{ + m_ThreadIsRunning = false; +} + void Server::DisplayLoop() { - - for (;;) { - - - } } void Server::ReadFromClients() @@ -49,8 +49,11 @@ void Server::ReadFromClients() int snapshotInterval = 50; int timeToCheckTimeOutTime = 100; - for (;;) { - if (m_Socket.available()) { + 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(readBuf, INPUTSIZE); ParseMessageType(readBuf, bytesRead); @@ -89,7 +92,7 @@ void Server::InputLoop() char inputBuffer[INPUTSIZE] = { 0 }; std::string inputMessage; - for (;;) { + while (m_ThreadIsRunning) { std::cin.getline(inputBuffer, INPUTSIZE); inputMessage = (std::string)inputBuffer; @@ -283,8 +286,6 @@ void Server::Disconnect(int i) m_PlayerDefinitions[i].Endpoint = boost::asio::ip::udp::endpoint(); m_PlayerDefinitions[i].EntityID = -1; m_PlayerDefinitions[i].Name = ""; - - } void Server::ParseEvent(char * data, size_t length) diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index c40aa10a..5722eaf2 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -49,6 +49,7 @@ Game::~Game() { // Call before to ensure that thread closes correctly. m_Client.Close(); + m_Server.Close(); delete m_FrameStack; delete m_EventBroker; From 4de613814b1fe31239e17d3ef074690d61138409 Mon Sep 17 00:00:00 2001 From: stiffly Date: Wed, 9 Dec 2015 17:43:36 +0100 Subject: [PATCH 19/60] WIP Packet loss identification. Put packetID in message --- include/Engine/Network/Client.h | 5 ++++ include/Engine/Network/NetworkDefinitions.h | 1 + include/Engine/Network/Server.h | 5 ++++ include/Game/Game.h | 3 +-- src/Engine/Network/Client.cpp | 26 ++++++++++++++++++--- src/Engine/Network/Server.cpp | 12 ++++++++++ src/Game/Game.cpp | 6 +++-- 7 files changed, 51 insertions(+), 7 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 5b2070d6..3485736b 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -42,12 +42,17 @@ private: void ParseServerPing(); void ParseSnapshot(char* data, size_t length); void CreateNewPlayer(int i); + void IdentifyPacketLoss(); // udp stuff boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::io_service m_IOService; boost::asio::ip::udp::socket m_Socket; + // Packet loss logic + unsigned int m_PacketID = 0; + unsigned int m_PreviousPacketID = 0; + World* m_World; int m_PlayerID = -1; glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; diff --git a/include/Engine/Network/NetworkDefinitions.h b/include/Engine/Network/NetworkDefinitions.h index e9da132f..b9d36226 100644 --- a/include/Engine/Network/NetworkDefinitions.h +++ b/include/Engine/Network/NetworkDefinitions.h @@ -7,6 +7,7 @@ #define BOARDSIZE 16 #define MAXCONNECTIONS 8 #define INPUTSIZE 128 +#define PACKETMODULUS 1000 // How many packets before the number resets typedef boost::shared_ptr socket_ptr; typedef boost::shared_ptr string_ptr; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 381759d7..3b476d2a 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -32,6 +32,11 @@ private: std::clock_t m_StopTimes[8]; // Game logic World* m_World; + // Packet loss logic + unsigned int m_PacketCounter = 0; + unsigned int m_PacketID = 0; + const unsigned int m_PacketModolus = 1000; + // Close logic bool m_ThreadIsRunning = true; // Threaded diff --git a/include/Game/Game.h b/include/Game/Game.h index 2763b4dd..8ec4a6d8 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -36,8 +36,7 @@ private: RenderQueueFactory* m_RenderQueueFactory; // Network variables boost::thread m_NetworkThread; - Server m_Server; - Client m_Client; + // Network methods void NetworkFunction(); // Network events diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index df418e06..5e9b1fb3 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -7,6 +7,8 @@ Client::Client() : m_Socket(m_IOService) { // Set up network stream m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); + m_NextSnapshot.inputForward = ""; + m_NextSnapshot.inputRight = ""; } Client::~Client() @@ -72,7 +74,7 @@ void Client::ReadFromServer() void Client::SendToServer() { - if (m_NextSnapshot.inputForward != "") { + if (m_NextSnapshot.inputForward != "" && m_NextSnapshot.inputForward[0] != '\0') { char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputForward, dataPackage); m_Socket.send_to(boost::asio::buffer( @@ -81,7 +83,7 @@ void Client::SendToServer() m_ReceiverEndpoint, 0); delete[] dataPackage; } - if (m_NextSnapshot.inputRight != "") { + if (m_NextSnapshot.inputRight != "" && m_NextSnapshot.inputRight[0] != '\0') { char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputRight, dataPackage); m_Socket.send_to(boost::asio::buffer( @@ -98,6 +100,12 @@ void Client::ParseMessageType(char* data, size_t length) memcpy(&messageType, data, sizeof(int)); // Read what type off message was sent from server MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from + // Read packet ID + m_PreviousPacketID = m_PacketID; + memcpy(&m_PacketID, data, sizeof(int)); + MoveMessageHead(data, length, sizeof(int)); + IdentifyPacketLoss(); + switch (static_cast(messageType)) { case MessageType::Connect: ParseConnect(data, length); @@ -323,4 +331,16 @@ void Client::CreateNewPlayer(int i) 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"; -} \ No newline at end of file +} + +void Client::IdentifyPacketLoss() +{ + // if no packets lost, difference should be equal to 1 + int difference = m_PacketID - m_PreviousPacketID; + if (difference != 1) { + for (int i = m_PreviousPacketID + 1; i < m_PacketID; i++) + { + LOG_INFO("Packet %i was lost...", i); + } + } +} diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 344054f6..235b26ec 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -162,10 +162,15 @@ int Server::CreateMessage(MessageType type, std::string message, char * data) // Message type memcpy(data + offset, &type, sizeof(int)); offset += sizeof(int); + // Packet ID + m_PacketID = m_PacketCounter % 10; + memcpy(data + offset, &m_PacketID, sizeof(int)); + offset += sizeof(int); // Message, add one extra byte for null terminator memcpy(data + offset, message.data(), (lengthOfMessage + 1) * sizeof(char)); offset += (lengthOfMessage + 1) * sizeof(char); + m_PacketCounter++; return offset; } @@ -273,6 +278,9 @@ int Server::CreateHeader(MessageType type, char * data) int offset = 0; memcpy(data, &messageType, sizeof(int)); offset += sizeof(int); + m_PacketID = m_PacketCounter % 10; + memcpy(data + offset, &m_PacketID, sizeof(int)); + offset += sizeof(int); return offset; } @@ -361,6 +369,10 @@ void Server::ParseConnect(char * data, size_t length) offset += sizeof(int); memcpy(temp + offset, &i, sizeof(int)); + memcpy(temp, &m_PacketID, sizeof(int)); + offset += sizeof(int); + m_PacketCounter++; + m_Socket.send_to( boost::asio::buffer(temp, sizeof(int) * 2), m_PlayerDefinitions[i].Endpoint, diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 5722eaf2..affaaa66 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -48,8 +48,8 @@ Game::Game(int argc, char* argv[]) Game::~Game() { // Call before to ensure that thread closes correctly. - m_Client.Close(); - m_Server.Close(); + //m_Client.Close(); + //m_Server.Close(); delete m_FrameStack; delete m_EventBroker; @@ -84,9 +84,11 @@ void Game::NetworkFunction() std::cout << "Start client or server? (c/s)" << std::endl; std::cin >> inputMessage; if (inputMessage == "c" || inputMessage == "C") { + Client m_Client; m_Client.Start(m_World, m_EventBroker); } if (inputMessage == "s" || inputMessage == "S") { + Server m_Server; m_Server.Start(m_World); } } \ No newline at end of file From 663aca26419773c200fd63f7dd3352afd3e56a38 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 9 Dec 2015 17:50:30 +0100 Subject: [PATCH 20/60] Moved client and server from header. Fixed so user are able to start a server and client on the same computer. Starting 2 servers on the same computer will probably still crash the newest server (Don't do it). --- include/Game/Game.h | 2 -- src/Engine/Network/Client.cpp | 19 ++++++++++++++----- src/Game/Game.cpp | 6 ++++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/include/Game/Game.h b/include/Game/Game.h index 2763b4dd..fd4068da 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -36,8 +36,6 @@ private: RenderQueueFactory* m_RenderQueueFactory; // Network variables boost::thread m_NetworkThread; - Server m_Server; - Client m_Client; // Network methods void NetworkFunction(); // Network events diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index df418e06..24085352 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -206,11 +206,20 @@ void Client::ParseSnapshot(char* data, size_t length) int Client::Receive(char* data, size_t length) { - int bytesReceived = m_Socket.receive_from(boost - ::asio::buffer((void*)data, length), - m_ReceiverEndpoint, - 0); - return bytesReceived; + + try { + int bytesReceived = m_Socket.receive_from(boost + ::asio::buffer((void*)data, length), + m_ReceiverEndpoint, + 0); + return bytesReceived; + } catch (const std::exception& err) { + // To not spam "socket closed messages" + //if (std::string(err.what()).find("forcefully closed") != std::string::npos) { + std::cout << "Read from client crashed: " << err.what(); + //} + } + return 0; } int Client::CreateMessage(MessageType type, std::string message, char* data) diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 5722eaf2..12a3a711 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -48,8 +48,8 @@ Game::Game(int argc, char* argv[]) Game::~Game() { // Call before to ensure that thread closes correctly. - m_Client.Close(); - m_Server.Close(); + //m_Client.Close(); + //m_Server.Close(); delete m_FrameStack; delete m_EventBroker; @@ -84,9 +84,11 @@ void Game::NetworkFunction() std::cout << "Start client or server? (c/s)" << std::endl; std::cin >> inputMessage; if (inputMessage == "c" || inputMessage == "C") { + Client m_Client; m_Client.Start(m_World, m_EventBroker); } if (inputMessage == "s" || inputMessage == "S") { + Server m_Server; m_Server.Start(m_World); } } \ No newline at end of file From 9a8f5293afc0b546fd09cd28686f59bc0a22ab4c Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 10 Dec 2015 12:55:28 +0100 Subject: [PATCH 21/60] Can now Identify Packet Loss. Enumerated messages that loops around 0-1000. --- include/Engine/Network/NetworkDefinitions.h | 2 +- src/Engine/Network/Client.cpp | 12 ++-- src/Engine/Network/Server.cpp | 62 +++++++++++---------- 3 files changed, 40 insertions(+), 36 deletions(-) diff --git a/include/Engine/Network/NetworkDefinitions.h b/include/Engine/Network/NetworkDefinitions.h index b9d36226..4ad32e26 100644 --- a/include/Engine/Network/NetworkDefinitions.h +++ b/include/Engine/Network/NetworkDefinitions.h @@ -7,7 +7,7 @@ #define BOARDSIZE 16 #define MAXCONNECTIONS 8 #define INPUTSIZE 128 -#define PACKETMODULUS 1000 // How many packets before the number resets +#define PACKETMODULUS 1000 // How many packets to send before the number resets typedef boost::shared_ptr socket_ptr; typedef boost::shared_ptr string_ptr; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 5e9b1fb3..4f397b5b 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -6,7 +6,7 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { // Set up network stream - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); m_NextSnapshot.inputForward = ""; m_NextSnapshot.inputRight = ""; } @@ -133,14 +133,15 @@ void Client::ParseMessageType(char* data, size_t length) void Client::ParseConnect(char* data, size_t len) { - memcpy(&m_PlayerID, data, sizeof(int)); - std::cout << "I am player: " << m_PlayerID << std::endl; + memcpy(&m_PacketID, data, sizeof(int)); + m_PreviousPacketID = m_PacketID; + std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; } void Client::ParsePing() { m_DurationOfPingTime = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); - std::cout << "response time with ctime(ms): " << m_DurationOfPingTime << std::endl; + std::cout << m_PacketID << ": response time with ctime(ms): " << m_DurationOfPingTime << std::endl; } void Client::ParseServerPing() @@ -169,7 +170,7 @@ void Client::ParseEventMessage(char* data, size_t length) m_PlayerDefinitions[Id].Name = command.erase(0, 7); } else { - std::cout << "Event message: " << std::string(data) << std::endl; + std::cout << m_PacketID << ": Event message: " << std::string(data) << std::endl; } MoveMessageHead(data, length, std::string(data).size() + 1); @@ -177,6 +178,7 @@ void Client::ParseEventMessage(char* data, size_t length) void Client::ParseSnapshot(char* data, size_t length) { + 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, diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 235b26ec..2dea57f5 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -53,6 +53,8 @@ void Server::ReadFromClients() // m_ThreadIsRunning might be unnecessary but the // program crashed if it executed m_Socket.available() // when closing the program. + + // If available message -> Socket.available() = true if (m_ThreadIsRunning && m_Socket.available()) { try { bytesRead = Receive(readBuf, INPUTSIZE); @@ -60,30 +62,29 @@ void Server::ReadFromClients() } catch (const std::exception& err) { // To not spam "socket closed messages" //if (std::string(err.what()).find("forcefully closed") != std::string::npos) { - std::cout << "Read from client crashed: " << err.what(); + std::cout << m_PacketID << ": Read from client crashed: " << err.what(); //} } - - std::clock_t currentTime = std::clock(); - // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); - // Send snapshot - if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - SendSnapshot(); - previousSnapshotMessage = currentTime; - } - - // Send pings each - if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { - SendPing(); - previousePingMessage = currentTime; - } - - // Time out logic - if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { - CheckForTimeOuts(); - timOutTimer = currentTime; - } } + std::clock_t currentTime = std::clock(); + // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); + // Send snapshot + if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + SendSnapshot(); + previousSnapshotMessage = currentTime; + } + + // Send pings each + if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { + SendPing(); + previousePingMessage = currentTime; + } + + // Time out logic + if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { + CheckForTimeOuts(); + timOutTimer = currentTime; + } } } @@ -102,7 +103,7 @@ void Server::InputLoop() Broadcast(inputMessage); } catch (const std::exception& err) { - std::cout << "Read from WriteLoop crashed: " << err.what(); + std::cout << m_PacketID << ": Read from WriteLoop crashed: " << err.what(); } } if (inputMessage.find("exit") != std::string::npos) @@ -163,7 +164,7 @@ int Server::CreateMessage(MessageType type, std::string message, char * data) memcpy(data + offset, &type, sizeof(int)); offset += sizeof(int); // Packet ID - m_PacketID = m_PacketCounter % 10; + m_PacketID = m_PacketCounter % PACKETMODULUS; memcpy(data + offset, &m_PacketID, sizeof(int)); offset += sizeof(int); // Message, add one extra byte for null terminator @@ -182,7 +183,7 @@ void Server::MoveMessageHead(char *& data, size_t & length, size_t stepSize) void Server::Broadcast(std::string message) { - std::cout << "Broadcast: " << message << std::endl; + std::cout << m_PacketID << ": Broadcast: " << message << std::endl; char* data = new char[128]; int offset = CreateMessage(MessageType::Event, message, data); for (int i = 0; i < MAXCONNECTIONS; i++) { @@ -238,7 +239,7 @@ void Server::SendPing() // Prints connected players ping for (size_t i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) - std::cout << "Player " << i << "'s ping: " << 1000 * (m_StopTimes[i] - m_StartPingTime) + std::cout << m_PacketID << ": Player " << i << "'s ping: " << 1000 * (m_StopTimes[i] - m_StartPingTime) / static_cast(CLOCKS_PER_SEC) << std::endl; } @@ -278,9 +279,10 @@ int Server::CreateHeader(MessageType type, char * data) int offset = 0; memcpy(data, &messageType, sizeof(int)); offset += sizeof(int); - m_PacketID = m_PacketCounter % 10; + m_PacketID = m_PacketCounter % PACKETMODULUS; memcpy(data + offset, &m_PacketID, sizeof(int)); offset += sizeof(int); + m_PacketCounter++; return offset; } @@ -358,7 +360,7 @@ void Server::ParseConnect(char * data, size_t length) m_PlayerDefinitions[i].Name = std::string(data); m_StopTimes[i] = std::clock(); - std::cout << "Player \"" << m_PlayerDefinitions[i].Name << "\" connected on IP: " << + std::cout << m_PacketID << ": Player \"" << m_PlayerDefinitions[i].Name << "\" connected on IP: " << m_PlayerDefinitions[i].Endpoint.address().to_string() << std::endl; int offset = 0; @@ -379,7 +381,7 @@ void Server::ParseConnect(char * data, size_t length) 0); // Send notification that a player has connected - std::string str = "Player " + m_PlayerDefinitions[i].Name + " connected on: " + std::string str = m_PacketID + "Player " + m_PlayerDefinitions[i].Name + " connected on: " + m_PlayerDefinitions[i].Endpoint.address().to_string(); Broadcast(str); // +1 is the null terminator @@ -392,7 +394,7 @@ void Server::ParseConnect(char * data, size_t length) void Server::ParseDisconnect() { - std::cout << "Parsing disconnect. \n"; + std::cout << m_PacketID << ":Parsing disconnect. \n"; for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { @@ -407,7 +409,7 @@ void Server::ParseClientPing() char* testMesssage = new char[128]; int testOffset = CreateMessage(MessageType::ClientPing, "Ping recieved", testMesssage); - std::cout << "Parsing ping." << std::endl; + std::cout << m_PacketID << ":Parsing ping." << std::endl; // Return ping m_Socket.send_to( boost::asio::buffer( From f377d9ba7045f6c0deef120df0cff88fca207caa Mon Sep 17 00:00:00 2001 From: Jocke Date: Thu, 10 Dec 2015 14:14:36 +0100 Subject: [PATCH 22/60] Fixed client movement. --- include/Engine/Network/Client.h | 3 +- include/Engine/Network/NetworkDefinitions.h | 3 + include/Engine/Network/SnapshotDefinitions.h | 12 +- src/Engine/Network/Client.cpp | 412 ++++++++++--------- 4 files changed, 234 insertions(+), 196 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 5b2070d6..266fe719 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -27,7 +27,7 @@ public: void Close(); private: void ReadFromServer(); - void SendToServer(); + void SendSnapshotToServer(); int Receive(char* data, size_t length); int CreateMessage(MessageType type, std::string message, char* data); @@ -60,6 +60,7 @@ private: // Use to check if we should send disconnect message // if game is turned of by closing window. bool m_WasStarted = false; + IsWASDKeyDown m_IsWASDKeyDown; // Events EventBroker* m_EventBroker; diff --git a/include/Engine/Network/NetworkDefinitions.h b/include/Engine/Network/NetworkDefinitions.h index e9da132f..469fbcbc 100644 --- a/include/Engine/Network/NetworkDefinitions.h +++ b/include/Engine/Network/NetworkDefinitions.h @@ -7,9 +7,12 @@ #define BOARDSIZE 16 #define MAXCONNECTIONS 8 #define INPUTSIZE 128 +#define PLAYERSPEED 0.2f; typedef boost::shared_ptr socket_ptr; typedef boost::shared_ptr string_ptr; typedef boost::shared_ptr> messageQueue_ptr; + + #endif \ No newline at end of file diff --git a/include/Engine/Network/SnapshotDefinitions.h b/include/Engine/Network/SnapshotDefinitions.h index 7f9e4ce5..2b4ba948 100644 --- a/include/Engine/Network/SnapshotDefinitions.h +++ b/include/Engine/Network/SnapshotDefinitions.h @@ -4,9 +4,17 @@ struct SnapshotDefinitions { // "+Forward" is 8 characters * sizeof(char) = 8 - char* inputForward = new char[8]; + char* InputForward = new char[8]; // "+Right" is 6 characters * sizeof(char) = 6 - char* inputRight = new char[6]; + char* InputRight = new char[6]; +}; + +struct IsWASDKeyDown +{ + bool W = false; + bool A = false; + bool S = false; + bool D = false; }; #endif \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 24085352..423a04ee 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -5,8 +5,8 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { - // Set up network stream - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); + // Set up network stream + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); } Client::~Client() @@ -19,22 +19,22 @@ void Client::Start(World* world, EventBroker* eventBroker) { m_WasStarted = true; m_EventBroker = eventBroker; - m_World = world; - - // Subscribe to events - m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1)); + m_World = world; + + // Subscribe to events + m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EKeyDown); - m_EKeyUp = decltype(m_EKeyUp)(std::bind(&Client::OnKeyUp, this, std::placeholders::_1)); - m_EventBroker->Subscribe(m_EKeyUp); - - std::cout << "Please enter you name: "; - std::cin >> m_PlayerName; - while (m_PlayerName.size() > 7) { - std::cout << "Please enter you name(No longer than 7 characters): "; - std::cin >> m_PlayerName; - } - m_Socket.connect(m_ReceiverEndpoint); - std::cout << "I am client. BIP BOP\n"; + m_EKeyUp = decltype(m_EKeyUp)(std::bind(&Client::OnKeyUp, this, std::placeholders::_1)); + m_EventBroker->Subscribe(m_EKeyUp); + + std::cout << "Please enter you name: "; + std::cin >> m_PlayerName; + while (m_PlayerName.size() > 7) { + std::cout << "Please enter you name(No longer than 7 characters): "; + std::cin >> m_PlayerName; + } + m_Socket.connect(m_ReceiverEndpoint); + std::cout << "I am client. BIP BOP\n"; ReadFromServer(); } @@ -50,193 +50,205 @@ void Client::Close() void Client::ReadFromServer() { - int bytesRead = -1; - char readBuf[1024] = { 0 }; + int bytesRead = -1; + char readBuf[1024] = { 0 }; - int snapshotInterval = 33; - std::clock_t previousSnapshotMessage = std::clock(); + int snapshotInterval = 33; + std::clock_t previousSnapshotMessage = std::clock(); - while (m_ThreadIsRunning) { - if (m_Socket.available()) { - bytesRead = Receive(readBuf, INPUTSIZE); - ParseMessageType(readBuf, bytesRead); - } - std::clock_t currentTime = std::clock(); - if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - SendToServer(); - previousSnapshotMessage = currentTime; - } - - } + while (m_ThreadIsRunning) { + if (m_Socket.available()) { + bytesRead = Receive(readBuf, INPUTSIZE); + ParseMessageType(readBuf, bytesRead); + } + std::clock_t currentTime = std::clock(); + if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + SendSnapshotToServer(); + previousSnapshotMessage = currentTime; + } + + } } -void Client::SendToServer() +void Client::SendSnapshotToServer() { - if (m_NextSnapshot.inputForward != "") { - char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled - int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputForward, dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + // Reset previouse key state in snapshot. + m_NextSnapshot.InputRight = ""; + m_NextSnapshot.InputRight = ""; + // See if any movement keys are down + // We dont care if it's overwritten by later + // if statement. Watcha gonna do, right! + if (m_IsWASDKeyDown.W) { + m_NextSnapshot.InputRight = "+Forward"; + } + if (m_IsWASDKeyDown.A) { + m_NextSnapshot.InputRight = "-Right"; + } + if (m_IsWASDKeyDown.S) { + m_NextSnapshot.InputRight = "-Forward"; + } + if (m_IsWASDKeyDown.D) { + m_NextSnapshot.InputRight = "+Right"; + } + + if (m_NextSnapshot.InputForward != "") { + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + int len = CreateMessage(MessageType::Event, m_NextSnapshot.InputForward, dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); delete[] dataPackage; - } - if (m_NextSnapshot.inputRight != "") { - char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled - int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputRight, dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + } + if (m_NextSnapshot.InputRight != "") { + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + int len = CreateMessage(MessageType::Event, m_NextSnapshot.InputRight, dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); delete[] dataPackage; - } + } } void Client::ParseMessageType(char* data, size_t length) { - int messageType = -1; - memcpy(&messageType, data, sizeof(int)); // Read what type off message was sent from server - MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from + int messageType = -1; + memcpy(&messageType, data, sizeof(int)); // Read what type off message was sent from server + MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from - switch (static_cast(messageType)) { - case MessageType::Connect: - ParseConnect(data, length); - break; - case MessageType::ClientPing: - ParsePing(); - break; - case MessageType::ServerPing: - ParseServerPing(); - break; - case MessageType::Message: - break; - case MessageType::Snapshot: - ParseSnapshot(data, length); - break; - case MessageType::Disconnect: - break; - case MessageType::Event: - ParseEventMessage(data, length); - break; - default: - break; - } + switch (static_cast(messageType)) { + case MessageType::Connect: + ParseConnect(data, length); + break; + case MessageType::ClientPing: + ParsePing(); + break; + case MessageType::ServerPing: + ParseServerPing(); + break; + case MessageType::Message: + break; + case MessageType::Snapshot: + ParseSnapshot(data, length); + break; + case MessageType::Disconnect: + break; + case MessageType::Event: + ParseEventMessage(data, length); + break; + default: + break; + } } void Client::ParseConnect(char* data, size_t len) { - memcpy(&m_PlayerID, data, sizeof(int)); - std::cout << "I am player: " << m_PlayerID << std::endl; + memcpy(&m_PlayerID, data, sizeof(int)); + std::cout << "I am player: " << m_PlayerID << std::endl; } void Client::ParsePing() { - m_DurationOfPingTime = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); - std::cout << "response time with ctime(ms): " << m_DurationOfPingTime << std::endl; + m_DurationOfPingTime = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); + std::cout << "response time with ctime(ms): " << m_DurationOfPingTime << std::endl; } void Client::ParseServerPing() { - char* testMessage = new char[128]; - int testOffset = CreateMessage(MessageType::ServerPing, "Ping recieved", testMessage); + char* testMessage = new char[128]; + int testOffset = CreateMessage(MessageType::ServerPing, "Ping recieved", testMessage); - //std::cout << "Parsing ping." << std::endl; + //std::cout << "Parsing ping." << std::endl; - m_Socket.send_to(boost::asio::buffer( + m_Socket.send_to(boost::asio::buffer( testMessage, - testOffset), - m_ReceiverEndpoint, 0); + testOffset), + m_ReceiverEndpoint, 0); delete[] testMessage; } void Client::ParseEventMessage(char* data, size_t length) { - int Id = -1; - std::string command = std::string(data); - if (command.find("+Player") != std::string::npos) { - MoveMessageHead(data, length, command.size() + 1); - memcpy(&Id, data, sizeof(int)); - MoveMessageHead(data, length, sizeof(int)); - // Sett Player name - m_PlayerDefinitions[Id].Name = command.erase(0, 7); - } - else { - std::cout << "Event message: " << std::string(data) << std::endl; - } + int Id = -1; + std::string command = std::string(data); + if (command.find("+Player") != std::string::npos) { + MoveMessageHead(data, length, command.size() + 1); + memcpy(&Id, data, sizeof(int)); + MoveMessageHead(data, length, sizeof(int)); + // Sett Player name + m_PlayerDefinitions[Id].Name = command.erase(0, 7); + } else { + std::cout << "Event message: " << std::string(data) << std::endl; + } - MoveMessageHead(data, length, std::string(data).size() + 1); + MoveMessageHead(data, length, std::string(data).size() + 1); } void Client::ParseSnapshot(char* data, size_t length) { - 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. + 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); - // Apply the position data read to the player entity - // New player connected on the server side - if (m_PlayerDefinitions[i].Name == "" && tempName != "") { - CreateNewPlayer(i); - } - else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { - // Someone disconnected - // TODO: Insert code here - } - else if (m_PlayerDefinitions[i].Name == "" && tempName == "") { - // Not a connected player - break; - } - m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; - m_PlayerDefinitions[i].Name = tempName; - } + // 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); + // Apply the position data read to the player entity + // New player connected on the server side + if (m_PlayerDefinitions[i].Name == "" && tempName != "") { + CreateNewPlayer(i); + } else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { + // Someone disconnected + // TODO: Insert code here + } else if (m_PlayerDefinitions[i].Name == "" && tempName == "") { + // Not a connected player + break; + } + m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; + m_PlayerDefinitions[i].Name = tempName; + } } int Client::Receive(char* data, size_t length) { + boost::system::error_code error; - try { - int bytesReceived = m_Socket.receive_from(boost - ::asio::buffer((void*)data, length), - m_ReceiverEndpoint, - 0); - return bytesReceived; - } catch (const std::exception& err) { - // To not spam "socket closed messages" - //if (std::string(err.what()).find("forcefully closed") != std::string::npos) { - std::cout << "Read from client crashed: " << err.what(); - //} - } - return 0; + int bytesReceived = m_Socket.receive_from(boost + ::asio::buffer((void*)data, length), + m_ReceiverEndpoint, + 0, error); + + std::cout << "ReadFromServer crashed: " << error.message(); + + return bytesReceived; } int Client::CreateMessage(MessageType type, std::string message, char* data) { - int lengthOfMessage = 0; - int messageType = static_cast(type); - lengthOfMessage = message.size(); + int lengthOfMessage = 0; + int messageType = static_cast(type); + lengthOfMessage = message.size(); - int offset = 0; - // Message type - memcpy(data + offset, &messageType, sizeof(int)); - offset += sizeof(int); - // Message, add one extra byte for null terminator - memcpy(data + offset, message.data(), (lengthOfMessage + 1) * sizeof(char)); - offset += (lengthOfMessage + 1) * sizeof(char); + int offset = 0; + // Message type + memcpy(data + offset, &messageType, sizeof(int)); + offset += sizeof(int); + // Message, add one extra byte for null terminator + memcpy(data + offset, message.data(), (lengthOfMessage + 1) * sizeof(char)); + offset += (lengthOfMessage + 1) * sizeof(char); - return offset; + return offset; } void Client::Connect() @@ -263,7 +275,7 @@ void Client::Disconnect() } void Client::Ping() -{ +{ char* dataPackage = new char[INPUTSIZE]; if (GetAsyncKeyState('P')) { // Maybe use previous key here int length = CreateMessage(MessageType::ClientPing, "Ping", dataPackage); @@ -279,57 +291,71 @@ void Client::Ping() void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) { - data += stepSize; - length -= stepSize; + data += stepSize; + length -= stepSize; } bool Client::OnKeyDown(const Events::KeyDown& event) { - char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled - if (event.KeyCode == GLFW_KEY_W) { - m_NextSnapshot.inputForward = "+Forward"; - } - if (event.KeyCode == GLFW_KEY_A) { - m_NextSnapshot.inputRight = "-Right"; - } - if (event.KeyCode == GLFW_KEY_S) { - m_NextSnapshot.inputForward = "-Forward"; - } - if (event.KeyCode == GLFW_KEY_D) { - m_NextSnapshot.inputRight = "+Right"; - } + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + if (event.KeyCode == GLFW_KEY_W) { + m_IsWASDKeyDown.W = true; + //m_NextSnapshot.inputForward = "+Forward"; + } + if (event.KeyCode == GLFW_KEY_A) { + m_IsWASDKeyDown.A = true; + //m_NextSnapshot.inputRight = "-Right"; + } + if (event.KeyCode == GLFW_KEY_S) { + m_IsWASDKeyDown.S = true; + //m_NextSnapshot.inputForward = "-Forward"; + } + if (event.KeyCode == GLFW_KEY_D) { + m_IsWASDKeyDown.D = true; + //m_NextSnapshot.inputRight = "+Right"; + } - if (event.KeyCode == GLFW_KEY_V) { - Disconnect(); - } - if (event.KeyCode == GLFW_KEY_C) { - Connect(); - } + if (event.KeyCode == GLFW_KEY_V) { + Disconnect(); + } + if (event.KeyCode == GLFW_KEY_C) { + Connect(); + } if (event.KeyCode == GLFW_KEY_P) { Ping(); } - memset(dataPackage, 0, INPUTSIZE); - delete[] dataPackage; - return true; + memset(dataPackage, 0, INPUTSIZE); + delete[] dataPackage; + return true; } bool Client::OnKeyUp(const Events::KeyUp & e) { - if (e.KeyCode == GLFW_KEY_W || e.KeyCode == GLFW_KEY_S) { - m_NextSnapshot.inputForward = ""; - return true; - } - if (e.KeyCode == GLFW_KEY_A || e.KeyCode == GLFW_KEY_D) { - m_NextSnapshot.inputRight = ""; - return true; - } - return false; + if (e.KeyCode == GLFW_KEY_W) { + m_IsWASDKeyDown.W = false; + //m_NextSnapshot.inputForward = ""; + return true; + } + if (e.KeyCode == GLFW_KEY_A){ + m_IsWASDKeyDown.A = false; + return true; + } + if (e.KeyCode == GLFW_KEY_S){ + m_IsWASDKeyDown.S = false; + return true; + } + if (e.KeyCode == GLFW_KEY_D) { + m_IsWASDKeyDown.D = false; + //m_NextSnapshot.inputRight = ""; + return true; + } + 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"; + 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"; } \ No newline at end of file From 58952725e91dad639250ebf70d4ccab47cb64646 Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 10 Dec 2015 17:07:18 +0100 Subject: [PATCH 23/60] Added class Package to help refactor the code. The code got easier to read. --- include/Engine/Network/Client.h | 1 + include/Engine/Network/NetworkDefinitions.h | 2 + include/Engine/Network/Package.h | 32 ++++++ include/Engine/Network/Server.h | 4 +- src/Engine/Network/Client.cpp | 89 +++++---------- src/Engine/Network/Package.cpp | 24 ++++ src/Engine/Network/Server.cpp | 115 +++++++++----------- 7 files changed, 138 insertions(+), 129 deletions(-) create mode 100644 include/Engine/Network/Package.h create mode 100644 src/Engine/Network/Package.cpp diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 3485736b..26f4489d 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -30,6 +30,7 @@ private: void SendToServer(); int Receive(char* data, size_t length); + void Send(Package& message); int CreateMessage(MessageType type, std::string message, char* data); void Connect(); void Disconnect(); diff --git a/include/Engine/Network/NetworkDefinitions.h b/include/Engine/Network/NetworkDefinitions.h index 4ad32e26..8b2ebadf 100644 --- a/include/Engine/Network/NetworkDefinitions.h +++ b/include/Engine/Network/NetworkDefinitions.h @@ -3,6 +3,8 @@ #include #include +#include "Network/Package.h" + #define BOARDSIZE 16 #define MAXCONNECTIONS 8 diff --git a/include/Engine/Network/Package.h b/include/Engine/Network/Package.h new file mode 100644 index 00000000..949fc05b --- /dev/null +++ b/include/Engine/Network/Package.h @@ -0,0 +1,32 @@ +#ifndef Package_h__ +#define Package_h__ + +#include +#include "Network/MessageType.h" + +// Defines the +class Package +{ +public: + // arg1: Type of message (Connect, Disconnect...) + // arg2: PackageID for identifying packet loss. + Package(MessageType type); + ~Package(); + // Add primitive types like int, float, char... + template + void AddPrimitive(T val) + { + memcpy(m_Data + m_Offset, &val, sizeof(T)); + m_Offset += sizeof(T); + } + void AddString(std::string str); + + int Size() { return m_Offset; }; + char* Data() { return m_Data; }; + +private: + char* m_Data = new char[128]; + int m_Offset = 0; +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 3b476d2a..2826684d 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -47,10 +47,12 @@ private: int Receive(char* data, size_t length); + void Send(Package& package, int playerID); + void Send(Package& package); int CreateMessage(MessageType type, std::string message, char * data); void MoveMessageHead(char*& data, size_t& length, size_t stepSize); void Broadcast(std::string message); - void Broadcast(char* data, size_t length); + void Broadcast(Package& package); void SendSnapshot(); void SendPing(); void CheckForTimeOuts(); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 4f397b5b..73b8b823 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -75,22 +75,14 @@ void Client::ReadFromServer() void Client::SendToServer() { if (m_NextSnapshot.inputForward != "" && m_NextSnapshot.inputForward[0] != '\0') { - char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled - int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputForward, dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); - delete[] dataPackage; + Package message(MessageType::Event); + message.AddString(m_NextSnapshot.inputForward); + Send(message); } if (m_NextSnapshot.inputRight != "" && m_NextSnapshot.inputRight[0] != '\0') { - char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled - int len = CreateMessage(MessageType::Event, m_NextSnapshot.inputRight, dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); - delete[] dataPackage; + Package message(MessageType::Event); + message.AddString(m_NextSnapshot.inputRight); + Send(message); } } @@ -146,16 +138,9 @@ void Client::ParsePing() void Client::ParseServerPing() { - char* testMessage = new char[128]; - int testOffset = CreateMessage(MessageType::ServerPing, "Ping recieved", testMessage); - - //std::cout << "Parsing ping." << std::endl; - - m_Socket.send_to(boost::asio::buffer( - testMessage, - testOffset), - m_ReceiverEndpoint, 0); - delete[] testMessage; + Package message(MessageType::ServerPing); + message.AddString("Ping recieved"); + Send(message); } void Client::ParseEventMessage(char* data, size_t length) @@ -223,59 +208,35 @@ int Client::Receive(char* data, size_t length) return bytesReceived; } -int Client::CreateMessage(MessageType type, std::string message, char* data) +void Client::Send(Package& package) { - int lengthOfMessage = 0; - int messageType = static_cast(type); - lengthOfMessage = message.size(); - - int offset = 0; - // Message type - memcpy(data + offset, &messageType, sizeof(int)); - offset += sizeof(int); - // Message, add one extra byte for null terminator - memcpy(data + offset, message.data(), (lengthOfMessage + 1) * sizeof(char)); - offset += (lengthOfMessage + 1) * sizeof(char); - - return offset; + m_Socket.send_to(boost::asio::buffer( + package.Data(), + package.Size()), + m_ReceiverEndpoint, 0); } void Client::Connect() { - char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled - int length = CreateMessage(MessageType::Connect, m_PlayerName, dataPackage); - m_StartPingTime = std::clock(); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - length), - m_ReceiverEndpoint, 0); - delete[] dataPackage; + Package message(MessageType::Connect); + message.AddString(m_PlayerName); + m_StartPingTime = std::clock(); + Send(message); } void Client::Disconnect() { - char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled - int len = CreateMessage(MessageType::Disconnect, "+Disconnect", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); - delete[] dataPackage; + Package message(MessageType::Connect); + message.AddString("+Disconnect"); + Send(message); } void Client::Ping() { - char* dataPackage = new char[INPUTSIZE]; - if (GetAsyncKeyState('P')) { // Maybe use previous key here - int length = CreateMessage(MessageType::ClientPing, "Ping", dataPackage); - m_StartPingTime = std::clock(); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - length), - m_ReceiverEndpoint, 0); - } - memset(dataPackage, 0, INPUTSIZE); - delete[] dataPackage; + Package message(MessageType::Connect); + message.AddString("Ping"); + m_StartPingTime = std::clock(); + Send(message); } void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) diff --git a/src/Engine/Network/Package.cpp b/src/Engine/Network/Package.cpp new file mode 100644 index 00000000..eb363aac --- /dev/null +++ b/src/Engine/Network/Package.cpp @@ -0,0 +1,24 @@ +#include "Network/Package.h" + +Package::Package(MessageType type) +{ + // Create message header + // Add message type + int messageType = static_cast(type); + memcpy(m_Data, &messageType, sizeof(int)); + m_Offset += sizeof(int); +} + +Package::~Package() +{ + delete[] m_Data; +} + + + +void Package::AddString(std::string str) +{ + // Message, add one extra byte for null terminator + memcpy(m_Data + m_Offset, str.data(), (str.size() + 1) * sizeof(char)); + m_Offset += (str.size() + 1) * sizeof(char); +} diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 2dea57f5..fe851ede 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -154,6 +154,24 @@ int Server::Receive(char * data, size_t length) return length; } +void Server::Send(Package& message, int playerID) +{ + m_Socket.send_to( + boost::asio::buffer(message.Data(), message.Size()), + m_PlayerDefinitions[playerID].Endpoint, + 0); +} + +void Server::Send(Package & package) +{ + m_Socket.send_to( + boost::asio::buffer( + package.Data(), + package.Size()), + m_ReceiverEndpoint, + 0); +} + int Server::CreateMessage(MessageType type, std::string message, char * data) { int lengthOfMessage = 0; @@ -183,55 +201,42 @@ void Server::MoveMessageHead(char *& data, size_t & length, size_t stepSize) void Server::Broadcast(std::string message) { - std::cout << m_PacketID << ": Broadcast: " << message << std::endl; - char* data = new char[128]; - int offset = CreateMessage(MessageType::Event, message, data); + Package package(MessageType::Event); + package.AddPrimitive(12); // Input PackageID here + package.AddString(message); for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { - m_Socket.send_to( - boost::asio::buffer(data, offset), - m_PlayerDefinitions[i].Endpoint, - 0); + Send(package, i); } } - delete[] data; } -void Server::Broadcast(char * data, size_t length) +void Server::Broadcast(Package& package) { for (int i = 0; i < MAXCONNECTIONS; ++i) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { - m_Socket.send_to( - boost::asio::buffer(data, length), - m_PlayerDefinitions[i].Endpoint, - 0); + Send(package, i); } } } void Server::SendSnapshot() { - char* data = new char[INPUTSIZE]; - int offset = CreateHeader(MessageType::Snapshot, data); + Package package(MessageType::Snapshot); + package.AddPrimitive(12); // Input PackageID here for (size_t i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].EntityID == -1) { continue; } // Pack player pos into data package glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; - memcpy(data + offset, &playerPos.x, sizeof(float)); - offset += sizeof(float); - memcpy(data + offset, &playerPos.y, sizeof(float)); - offset += sizeof(float); - memcpy(data + offset, &playerPos.z, sizeof(float)); - offset += sizeof(float); - // +1 for null terminator - // Pack player name into data package - memcpy(data + offset, m_PlayerDefinitions[i].Name.data(), m_PlayerDefinitions[i].Name.size() + 1); - offset += (m_PlayerDefinitions[i].Name.size() + 1) * sizeof(char); + package.AddPrimitive(playerPos.x); + package.AddPrimitive(playerPos.y); + package.AddPrimitive(playerPos.z); + + package.AddString(m_PlayerDefinitions[i].Name); } - Broadcast(data, offset); - delete[] data; + Broadcast(package); } void Server::SendPing() @@ -244,14 +249,13 @@ void Server::SendPing() } // Create ping message - char* data = new char[128]; - int len = CreateMessage(MessageType::ServerPing, "Ping from server", data); - // Time message + Package package(MessageType::ServerPing); + package.AddPrimitive(12); // Input PackageID here + package.AddString("Ping from server"); + // Time message m_StartPingTime = std::clock(); // Send message - Broadcast(data, len); - delete[] data; - + Broadcast(package); } void Server::CheckForTimeOuts() @@ -358,35 +362,23 @@ void Server::ParseConnect(char * data, size_t length) m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint; m_PlayerDefinitions[i].Name = std::string(data); + // +1 is the null terminator + MoveMessageHead(data, length, m_PlayerDefinitions[i].Name.size() + 1); m_StopTimes[i] = std::clock(); std::cout << m_PacketID << ": Player \"" << m_PlayerDefinitions[i].Name << "\" connected on IP: " << m_PlayerDefinitions[i].Endpoint.address().to_string() << std::endl; - int offset = 0; - char* temp = new char[sizeof(int) * 2]; - int messagType = 0; - - memcpy(temp, &messagType, sizeof(int)); - offset += sizeof(int); - memcpy(temp + offset, &i, sizeof(int)); - - memcpy(temp, &m_PacketID, sizeof(int)); - offset += sizeof(int); - m_PacketCounter++; - - m_Socket.send_to( - boost::asio::buffer(temp, sizeof(int) * 2), - m_PlayerDefinitions[i].Endpoint, - 0); + Package package(MessageType::Connect); + package.AddPrimitive(12); // Input PackageID here + package.AddPrimitive(i); // Player ID + + Send(package, i); // Send notification that a player has connected std::string str = m_PacketID + "Player " + m_PlayerDefinitions[i].Name + " connected on: " + m_PlayerDefinitions[i].Endpoint.address().to_string(); Broadcast(str); - // +1 is the null terminator - MoveMessageHead(data, length, m_PlayerDefinitions[i].Name.size() + 1); - delete[] temp; break; } } @@ -406,18 +398,12 @@ void Server::ParseDisconnect() void Server::ParseClientPing() { - char* testMesssage = new char[128]; - int testOffset = CreateMessage(MessageType::ClientPing, "Ping recieved", testMesssage); - - std::cout << m_PacketID << ":Parsing ping." << std::endl; - // Return ping - m_Socket.send_to( - boost::asio::buffer( - testMesssage, - testOffset), - m_ReceiverEndpoint, - 0); - delete[] testMesssage; + std::cout << m_PacketID << ":Parsing ping." << std::endl; + // Return ping + Package package(MessageType::ClientPing); + package.AddPrimitive(12); // Insert packet ID here + package.AddString("Ping received"); + Send(package); } void Server::ParseServerPing() @@ -430,6 +416,7 @@ void Server::ParseServerPing() } } +// NOT USED void Server::ParseSnapshot(char * data, size_t length) { // Does no logic. Returns snapshot if client request one From 01d7388f915004e74647f030e8833ed68b661378 Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 11 Dec 2015 11:55:23 +0100 Subject: [PATCH 24/60] Reactored the package loss logic. Server cannot handle multiple clients yet. Fixed WorldTest code by adding astrix. --- include/Engine/Network/Client.h | 3 +- include/Engine/Network/NetworkDefinitions.h | 1 - include/Engine/Network/Package.h | 32 ++++----- include/Engine/Network/Server.h | 17 ++--- src/Engine/Network/Client.cpp | 36 ++++------ src/Engine/Network/Package.cpp | 10 +-- src/Engine/Network/Server.cpp | 73 +++++++-------------- src/Tests/WorldTest.cpp | 2 +- 8 files changed, 70 insertions(+), 104 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 51d66fc8..8e54aabb 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -51,8 +51,9 @@ private: boost::asio::ip::udp::socket m_Socket; // Packet loss logic - unsigned int m_PacketID = 0; + unsigned int m_PacketID = 0; unsigned int m_PreviousPacketID = 0; + unsigned int m_SendPacketID = 0; World* m_World; int m_PlayerID = -1; diff --git a/include/Engine/Network/NetworkDefinitions.h b/include/Engine/Network/NetworkDefinitions.h index 88eab7cf..be76671e 100644 --- a/include/Engine/Network/NetworkDefinitions.h +++ b/include/Engine/Network/NetworkDefinitions.h @@ -9,7 +9,6 @@ #define BOARDSIZE 16 #define MAXCONNECTIONS 8 #define INPUTSIZE 128 -#define PACKETMODULUS 1000 // How many packets to send before the number resets #define PLAYERSPEED 0.2f; typedef boost::shared_ptr socket_ptr; diff --git a/include/Engine/Network/Package.h b/include/Engine/Network/Package.h index 949fc05b..63409bf0 100644 --- a/include/Engine/Network/Package.h +++ b/include/Engine/Network/Package.h @@ -8,25 +8,25 @@ class Package { public: - // arg1: Type of message (Connect, Disconnect...) - // arg2: PackageID for identifying packet loss. - Package(MessageType type); - ~Package(); - // Add primitive types like int, float, char... - template - void AddPrimitive(T val) - { - memcpy(m_Data + m_Offset, &val, sizeof(T)); - m_Offset += sizeof(T); - } - void AddString(std::string str); + // arg1: Type of message (Connect, Disconnect...) + // arg2: PackageID for identifying packet loss. + Package(MessageType type, unsigned int& packageID); + ~Package(); + // Add primitive types like int, float, char... + template + void AddPrimitive(T val) + { + memcpy(m_Data + m_Offset, &val, sizeof(T)); + m_Offset += sizeof(T); + } + void AddString(std::string str); - int Size() { return m_Offset; }; - char* Data() { return m_Data; }; + int Size() { return m_Offset; }; + char* Data() { return m_Data; }; private: - char* m_Data = new char[128]; - int m_Offset = 0; + char* m_Data = new char[128]; + int m_Offset = 0; }; #endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 2826684d..259f47c4 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -32,11 +32,10 @@ private: std::clock_t m_StopTimes[8]; // Game logic World* m_World; - // Packet loss logic - unsigned int m_PacketCounter = 0; - unsigned int m_PacketID = 0; - const unsigned int m_PacketModolus = 1000; - + // Packet loss logic + unsigned int m_PacketID; + unsigned int m_PreviousPacketID; + unsigned int m_SendPacketID; // Close logic bool m_ThreadIsRunning = true; // Threaded @@ -45,18 +44,15 @@ private: void InputLoop(); - int Receive(char* data, size_t length); - void Send(Package& package, int playerID); - void Send(Package& package); - int CreateMessage(MessageType type, std::string message, char * data); + void Send(Package& package, int playerID); + void Send(Package& package); void MoveMessageHead(char*& data, size_t& length, size_t stepSize); void Broadcast(std::string message); void Broadcast(Package& package); void SendSnapshot(); void SendPing(); void CheckForTimeOuts(); - int CreateHeader(MessageType type, char* data); void Disconnect(int i); void ParseMessageType(char* data, size_t length); void ParseEvent(char* data, size_t length); @@ -65,6 +61,7 @@ private: void ParseClientPing(); void ParseServerPing(); void ParseSnapshot(char* data, size_t length); + void IdentifyPacketLoss(); }; #endif diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index f9d20377..c80a6d56 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -6,7 +6,7 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { // Set up network stream - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; } @@ -68,14 +68,13 @@ void Client::ReadFromServer() SendSnapshotToServer(); previousSnapshotMessage = currentTime; } - } } void Client::SendSnapshotToServer() { // Reset previouse key state in snapshot. - Package message(MessageType::Event); + Package message(MessageType::Event, m_SendPacketID); message.AddString(m_NextSnapshot.InputForward); Send(message); m_NextSnapshot.InputRight = ""; @@ -97,12 +96,12 @@ void Client::SendSnapshotToServer() } if (m_NextSnapshot.InputForward != "") { - Package message(MessageType::Event); + Package message(MessageType::Event, m_SendPacketID); message.AddString(m_NextSnapshot.InputForward); Send(message); } if (m_NextSnapshot.InputRight != "") { - Package message(MessageType::Event); + Package message(MessageType::Event, m_SendPacketID); message.AddString(m_NextSnapshot.InputRight); Send(message); } @@ -115,8 +114,8 @@ void Client::ParseMessageType(char* data, size_t length) MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from // Read packet ID - m_PreviousPacketID = m_PacketID; - memcpy(&m_PacketID, data, sizeof(int)); + m_PreviousPacketID = m_PacketID; // Set previous packet id + memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id MoveMessageHead(data, length, sizeof(int)); IdentifyPacketLoss(); @@ -160,7 +159,7 @@ void Client::ParsePing() void Client::ParseServerPing() { - Package message(MessageType::ServerPing); + Package message(MessageType::ServerPing, m_SendPacketID); message.AddString("Ping recieved"); Send(message); //std::cout << "Parsing ping." << std::endl; @@ -228,8 +227,10 @@ int Client::Receive(char* data, size_t length) m_ReceiverEndpoint, 0, error); - std::cout << "ReadFromServer crashed: " << error.message(); - + if (error) { + std::cout << "ReadFromServer crashed: " << error.message(); + } + return bytesReceived; } @@ -243,7 +244,7 @@ void Client::Send(Package& package) void Client::Connect() { - Package message(MessageType::Connect); + Package message(MessageType::Connect, m_SendPacketID); message.AddString(m_PlayerName); m_StartPingTime = std::clock(); Send(message); @@ -251,14 +252,14 @@ void Client::Connect() void Client::Disconnect() { - Package message(MessageType::Connect); + Package message(MessageType::Connect, m_SendPacketID); message.AddString("+Disconnect"); Send(message); } void Client::Ping() { - Package message(MessageType::Connect); + Package message(MessageType::Connect, m_SendPacketID); message.AddString("Ping"); m_StartPingTime = std::clock(); Send(message); @@ -272,22 +273,17 @@ void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) bool Client::OnKeyDown(const Events::KeyDown& event) { - char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled if (event.KeyCode == GLFW_KEY_W) { m_IsWASDKeyDown.W = true; - //m_NextSnapshot.inputForward = "+Forward"; } if (event.KeyCode == GLFW_KEY_A) { m_IsWASDKeyDown.A = true; - //m_NextSnapshot.inputRight = "-Right"; } if (event.KeyCode == GLFW_KEY_S) { m_IsWASDKeyDown.S = true; - //m_NextSnapshot.inputForward = "-Forward"; } if (event.KeyCode == GLFW_KEY_D) { m_IsWASDKeyDown.D = true; - //m_NextSnapshot.inputRight = "+Right"; } if (event.KeyCode == GLFW_KEY_V) { @@ -299,8 +295,6 @@ bool Client::OnKeyDown(const Events::KeyDown& event) if (event.KeyCode == GLFW_KEY_P) { Ping(); } - memset(dataPackage, 0, INPUTSIZE); - delete[] dataPackage; return true; } @@ -308,7 +302,6 @@ bool Client::OnKeyUp(const Events::KeyUp & e) { if (e.KeyCode == GLFW_KEY_W) { m_IsWASDKeyDown.W = false; - //m_NextSnapshot.inputForward = ""; return true; } if (e.KeyCode == GLFW_KEY_A){ @@ -321,7 +314,6 @@ bool Client::OnKeyUp(const Events::KeyUp & e) } if (e.KeyCode == GLFW_KEY_D) { m_IsWASDKeyDown.D = false; - //m_NextSnapshot.inputRight = ""; return true; } return false; diff --git a/src/Engine/Network/Package.cpp b/src/Engine/Network/Package.cpp index eb363aac..665d15ce 100644 --- a/src/Engine/Network/Package.cpp +++ b/src/Engine/Network/Package.cpp @@ -1,12 +1,14 @@ #include "Network/Package.h" -Package::Package(MessageType type) +Package::Package(MessageType type,unsigned int& packageID) { // Create message header // Add message type int messageType = static_cast(type); - memcpy(m_Data, &messageType, sizeof(int)); - m_Offset += sizeof(int); + Package::AddPrimitive(messageType); + packageID = packageID % 1000; // Packet id modulos + Package::AddPrimitive(packageID); + packageID++; } Package::~Package() @@ -14,8 +16,6 @@ Package::~Package() delete[] m_Data; } - - void Package::AddString(std::string str) { // Message, add one extra byte for null terminator diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index fe851ede..494eaaf2 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -119,12 +119,18 @@ void Server::ParseMessageType(char * data, size_t length) memcpy(&messageType, data, sizeof(int)); // Read what type off message was sent from server MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from + // Read packet ID + m_PreviousPacketID = m_PacketID; // Set previous packet id + memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id + MoveMessageHead(data, length, sizeof(int)); + IdentifyPacketLoss(); + switch (static_cast(messageType)) { case MessageType::Connect: ParseConnect(data, length); break; case MessageType::ClientPing: - ParseClientPing(); + //ParseClientPing(); break; case MessageType::ServerPing: ParseServerPing(); @@ -172,27 +178,6 @@ void Server::Send(Package & package) 0); } -int Server::CreateMessage(MessageType type, std::string message, char * data) -{ - int lengthOfMessage = 0; - int offset = 0; - - lengthOfMessage = message.size(); - // Message type - memcpy(data + offset, &type, sizeof(int)); - offset += sizeof(int); - // Packet ID - m_PacketID = m_PacketCounter % PACKETMODULUS; - memcpy(data + offset, &m_PacketID, sizeof(int)); - offset += sizeof(int); - // Message, add one extra byte for null terminator - memcpy(data + offset, message.data(), (lengthOfMessage + 1) * sizeof(char)); - offset += (lengthOfMessage + 1) * sizeof(char); - - m_PacketCounter++; - return offset; -} - void Server::MoveMessageHead(char *& data, size_t & length, size_t stepSize) { data += stepSize; @@ -201,8 +186,7 @@ void Server::MoveMessageHead(char *& data, size_t & length, size_t stepSize) void Server::Broadcast(std::string message) { - Package package(MessageType::Event); - package.AddPrimitive(12); // Input PackageID here + Package package(MessageType::Event, m_SendPacketID); package.AddString(message); for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { @@ -222,8 +206,7 @@ void Server::Broadcast(Package& package) void Server::SendSnapshot() { - Package package(MessageType::Snapshot); - package.AddPrimitive(12); // Input PackageID here + Package package(MessageType::Snapshot, m_SendPacketID); for (size_t i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].EntityID == -1) { continue; @@ -249,8 +232,7 @@ void Server::SendPing() } // Create ping message - Package package(MessageType::ServerPing); - package.AddPrimitive(12); // Input PackageID here + Package package(MessageType::ServerPing, m_SendPacketID); package.AddString("Ping from server"); // Time message m_StartPingTime = std::clock(); @@ -277,20 +259,6 @@ void Server::CheckForTimeOuts() } } -int Server::CreateHeader(MessageType type, char * data) -{ - int messageType = static_cast(type); - int offset = 0; - memcpy(data, &messageType, sizeof(int)); - offset += sizeof(int); - m_PacketID = m_PacketCounter % PACKETMODULUS; - memcpy(data + offset, &m_PacketID, sizeof(int)); - offset += sizeof(int); - m_PacketCounter++; - - return offset; -} - void Server::Disconnect(int i) { Broadcast("A player disconnected"); @@ -369,8 +337,7 @@ void Server::ParseConnect(char * data, size_t length) std::cout << m_PacketID << ": Player \"" << m_PlayerDefinitions[i].Name << "\" connected on IP: " << m_PlayerDefinitions[i].Endpoint.address().to_string() << std::endl; - Package package(MessageType::Connect); - package.AddPrimitive(12); // Input PackageID here + Package package(MessageType::Connect, m_SendPacketID); package.AddPrimitive(i); // Player ID Send(package, i); @@ -400,10 +367,9 @@ void Server::ParseClientPing() { std::cout << m_PacketID << ":Parsing ping." << std::endl; // Return ping - Package package(MessageType::ClientPing); - package.AddPrimitive(12); // Insert packet ID here + Package package(MessageType::ClientPing, m_SendPacketID); package.AddString("Ping received"); - Send(package); + Send(package); // This dosen't work for multiple users } void Server::ParseServerPing() @@ -429,4 +395,15 @@ void Server::ParseSnapshot(char * data, size_t length) 0); } } -} \ No newline at end of file +} + +void Server::IdentifyPacketLoss() +{ + // if no packets lost, difference should be equal to 1 + int difference = m_PacketID - m_PreviousPacketID; + if (difference != 1) { + for (int i = m_PreviousPacketID + 1; i < m_PacketID; i++) { + LOG_INFO("Packet %i was lost...", i); + } + } +} diff --git a/src/Tests/WorldTest.cpp b/src/Tests/WorldTest.cpp index 4fd4ceed..8d92a328 100644 --- a/src/Tests/WorldTest.cpp +++ b/src/Tests/WorldTest.cpp @@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE(WorldTestMultipleAllocations, * utf::tolerance(0.00001)) // Loop through them and check data int i = 0; - for (auto& c : w.GetComponents("Test")) { + for (auto& c : *w.GetComponents("Test")) { BOOST_TEST((int)c["TestInteger"] == i); i++; } From 36ae451ea62c2f9067794e7f431dcdc59a55da31 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 11 Dec 2015 16:22:14 +0100 Subject: [PATCH 25/60] Indentation --- src/Engine/Network/Client.cpp | 103 +++++++++++++++++----------------- 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index c80a6d56..f3840caf 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -6,9 +6,9 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { // Set up network stream - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); - m_NextSnapshot.InputForward = ""; - m_NextSnapshot.InputRight = ""; + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); + m_NextSnapshot.InputForward = ""; + m_NextSnapshot.InputRight = ""; } Client::~Client() @@ -74,9 +74,9 @@ 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); + Package message(MessageType::Event, m_SendPacketID); + message.AddString(m_NextSnapshot.InputForward); + Send(message); m_NextSnapshot.InputRight = ""; m_NextSnapshot.InputRight = ""; // See if any movement keys are down @@ -96,14 +96,14 @@ void Client::SendSnapshotToServer() } if (m_NextSnapshot.InputForward != "") { - Package message(MessageType::Event, m_SendPacketID); - message.AddString(m_NextSnapshot.InputForward); - Send(message); + Package message(MessageType::Event, m_SendPacketID); + message.AddString(m_NextSnapshot.InputForward); + Send(message); } if (m_NextSnapshot.InputRight != "") { - Package message(MessageType::Event, m_SendPacketID); - message.AddString(m_NextSnapshot.InputRight); - Send(message); + Package message(MessageType::Event, m_SendPacketID); + message.AddString(m_NextSnapshot.InputRight); + Send(message); } } @@ -113,11 +113,11 @@ void Client::ParseMessageType(char* data, size_t length) memcpy(&messageType, data, sizeof(int)); // Read what type off message was sent from server MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from - // Read packet ID - m_PreviousPacketID = m_PacketID; // Set previous packet id - memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id - MoveMessageHead(data, length, sizeof(int)); - IdentifyPacketLoss(); + // Read packet ID + m_PreviousPacketID = m_PacketID; // Set previous packet id + memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id + MoveMessageHead(data, length, sizeof(int)); + IdentifyPacketLoss(); switch (static_cast(messageType)) { case MessageType::Connect: @@ -146,22 +146,22 @@ void Client::ParseMessageType(char* data, size_t length) void Client::ParseConnect(char* data, size_t len) { - memcpy(&m_PacketID, data, sizeof(int)); - m_PreviousPacketID = m_PacketID; - std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; + memcpy(&m_PacketID, data, sizeof(int)); + m_PreviousPacketID = m_PacketID; + std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; } void Client::ParsePing() { m_DurationOfPingTime = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); - std::cout << m_PacketID << ": response time with ctime(ms): " << m_DurationOfPingTime << std::endl; + std::cout << m_PacketID << ": response time with ctime(ms): " << m_DurationOfPingTime << std::endl; } void Client::ParseServerPing() { - Package message(MessageType::ServerPing, m_SendPacketID); - message.AddString("Ping recieved"); - Send(message); + Package message(MessageType::ServerPing, m_SendPacketID); + message.AddString("Ping recieved"); + Send(message); //std::cout << "Parsing ping." << std::endl; } @@ -176,7 +176,7 @@ void Client::ParseEventMessage(char* data, size_t length) // 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: " << std::string(data) << std::endl; } MoveMessageHead(data, length, std::string(data).size() + 1); @@ -184,7 +184,7 @@ void Client::ParseEventMessage(char* data, size_t length) void Client::ParseSnapshot(char* data, size_t length) { - std::cout << m_PacketID << ": Parsing incoming snapshot." << std::endl; + 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, @@ -226,7 +226,7 @@ int Client::Receive(char* data, size_t length) ::asio::buffer((void*)data, length), m_ReceiverEndpoint, 0, error); - + if (error) { std::cout << "ReadFromServer crashed: " << error.message(); } @@ -236,33 +236,33 @@ int Client::Receive(char* data, size_t length) void Client::Send(Package& package) { - m_Socket.send_to(boost::asio::buffer( - package.Data(), - package.Size()), - m_ReceiverEndpoint, 0); + m_Socket.send_to(boost::asio::buffer( + package.Data(), + package.Size()), + m_ReceiverEndpoint, 0); } void Client::Connect() { - Package message(MessageType::Connect, m_SendPacketID); - message.AddString(m_PlayerName); - m_StartPingTime = std::clock(); - Send(message); + Package message(MessageType::Connect, m_SendPacketID); + message.AddString(m_PlayerName); + m_StartPingTime = std::clock(); + Send(message); } void Client::Disconnect() { - Package message(MessageType::Connect, m_SendPacketID); - message.AddString("+Disconnect"); - Send(message); + Package message(MessageType::Connect, m_SendPacketID); + message.AddString("+Disconnect"); + Send(message); } void Client::Ping() { - Package message(MessageType::Connect, m_SendPacketID); - message.AddString("Ping"); - m_StartPingTime = std::clock(); - Send(message); + Package message(MessageType::Connect, m_SendPacketID); + message.AddString("Ping"); + m_StartPingTime = std::clock(); + Send(message); } void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) @@ -304,11 +304,11 @@ bool Client::OnKeyUp(const Events::KeyUp & e) m_IsWASDKeyDown.W = false; return true; } - if (e.KeyCode == GLFW_KEY_A){ + if (e.KeyCode == GLFW_KEY_A) { m_IsWASDKeyDown.A = false; return true; } - if (e.KeyCode == GLFW_KEY_S){ + if (e.KeyCode == GLFW_KEY_S) { m_IsWASDKeyDown.S = false; return true; } @@ -329,12 +329,11 @@ void Client::CreateNewPlayer(int i) void Client::IdentifyPacketLoss() { - // if no packets lost, difference should be equal to 1 - int difference = m_PacketID - m_PreviousPacketID; - if (difference != 1) { - for (int i = m_PreviousPacketID + 1; i < m_PacketID; i++) - { - LOG_INFO("Packet %i was lost...", i); - } - } + // if no packets lost, difference should be equal to 1 + int difference = m_PacketID - m_PreviousPacketID; + if (difference != 1) { + for (int i = m_PreviousPacketID + 1; i < m_PacketID; i++) { + LOG_INFO("Packet %i was lost...", i); + } + } } From 63db236dfac94b45a65edbd35d102bfadde48203 Mon Sep 17 00:00:00 2001 From: Jocke Date: Mon, 14 Dec 2015 16:35:43 +0100 Subject: [PATCH 26/60] Fixed bug which made the player not able to move diagonally. Fixed a bug were m_PlayerID was not set for the client when connecting. --- include/Engine/Network/SnapshotDefinitions.h | 4 +- src/Engine/Network/Client.cpp | 16 +-- src/Engine/Network/Server.cpp | 140 +++++++++---------- 3 files changed, 79 insertions(+), 81 deletions(-) diff --git a/include/Engine/Network/SnapshotDefinitions.h b/include/Engine/Network/SnapshotDefinitions.h index 2b4ba948..9fe8beca 100644 --- a/include/Engine/Network/SnapshotDefinitions.h +++ b/include/Engine/Network/SnapshotDefinitions.h @@ -4,9 +4,9 @@ struct SnapshotDefinitions { // "+Forward" is 8 characters * sizeof(char) = 8 - char* InputForward = new char[8]; + std::string InputForward; // "+Right" is 6 characters * sizeof(char) = 6 - char* InputRight = new char[6]; + std::string InputRight; }; struct IsWASDKeyDown diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index c80a6d56..b393a2c2 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -77,19 +77,19 @@ void Client::SendSnapshotToServer() Package message(MessageType::Event, m_SendPacketID); message.AddString(m_NextSnapshot.InputForward); Send(message); - m_NextSnapshot.InputRight = ""; + m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; // See if any movement keys are down // We dont care if it's overwritten by later // if statement. Watcha gonna do, right! if (m_IsWASDKeyDown.W) { - m_NextSnapshot.InputRight = "+Forward"; + m_NextSnapshot.InputForward = "+Forward"; } if (m_IsWASDKeyDown.A) { m_NextSnapshot.InputRight = "-Right"; } if (m_IsWASDKeyDown.S) { - m_NextSnapshot.InputRight = "-Forward"; + m_NextSnapshot.InputForward = "-Forward"; } if (m_IsWASDKeyDown.D) { m_NextSnapshot.InputRight = "+Right"; @@ -148,6 +148,9 @@ void Client::ParseConnect(char* data, size_t len) { memcpy(&m_PacketID, data, sizeof(int)); m_PreviousPacketID = m_PacketID; + MoveMessageHead(data, len, sizeof(int)); + memcpy(&m_PlayerID, data, sizeof(int)); + MoveMessageHead(data, len, sizeof(int)); std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; } @@ -184,7 +187,7 @@ void Client::ParseEventMessage(char* data, size_t length) void Client::ParseSnapshot(char* data, size_t length) { - std::cout << m_PacketID << ": Parsing incoming snapshot." << std::endl; + //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, @@ -332,9 +335,6 @@ void Client::IdentifyPacketLoss() // if no packets lost, difference should be equal to 1 int difference = m_PacketID - m_PreviousPacketID; if (difference != 1) { - for (int i = m_PreviousPacketID + 1; i < m_PacketID; i++) - { - LOG_INFO("Packet %i was lost...", i); - } + LOG_INFO("%i Packet(s) were lost...", difference); } } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 494eaaf2..92eb28f6 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -1,12 +1,10 @@ #include "Network/Server.h" Server::Server() : m_Socket(m_IOService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 13)) -{ -} +{ } Server::~Server() -{ -} +{ } void Server::Start(World* world) @@ -27,7 +25,7 @@ void Server::Start(World* world) } void Server::Close() -{ +{ m_ThreadIsRunning = false; } @@ -49,12 +47,12 @@ void Server::ReadFromClients() int snapshotInterval = 50; int timeToCheckTimeOutTime = 100; - while(m_ThreadIsRunning) { + while (m_ThreadIsRunning) { // m_ThreadIsRunning might be unnecessary but the // program crashed if it executed m_Socket.available() // when closing the program. - // If available message -> Socket.available() = true + // If available message -> Socket.available() = true if (m_ThreadIsRunning && m_Socket.available()) { try { bytesRead = Receive(readBuf, INPUTSIZE); @@ -66,25 +64,25 @@ void Server::ReadFromClients() //} } } - std::clock_t currentTime = std::clock(); - // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); - // Send snapshot - if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - SendSnapshot(); - previousSnapshotMessage = currentTime; - } + std::clock_t currentTime = std::clock(); + // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); + // Send snapshot + if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { + SendSnapshot(); + previousSnapshotMessage = currentTime; + } - // Send pings each - if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { - SendPing(); - previousePingMessage = currentTime; - } + // Send pings each + if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { + SendPing(); + previousePingMessage = currentTime; + } - // Time out logic - if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { - CheckForTimeOuts(); - timOutTimer = currentTime; - } + // Time out logic + if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { + CheckForTimeOuts(); + timOutTimer = currentTime; + } } } @@ -162,20 +160,20 @@ int Server::Receive(char * data, size_t length) void Server::Send(Package& message, int playerID) { - m_Socket.send_to( - boost::asio::buffer(message.Data(), message.Size()), - m_PlayerDefinitions[playerID].Endpoint, - 0); + m_Socket.send_to( + boost::asio::buffer(message.Data(), message.Size()), + m_PlayerDefinitions[playerID].Endpoint, + 0); } void Server::Send(Package & package) { - m_Socket.send_to( - boost::asio::buffer( - package.Data(), - package.Size()), - m_ReceiverEndpoint, - 0); + m_Socket.send_to( + boost::asio::buffer( + package.Data(), + package.Size()), + m_ReceiverEndpoint, + 0); } void Server::MoveMessageHead(char *& data, size_t & length, size_t stepSize) @@ -186,11 +184,11 @@ void Server::MoveMessageHead(char *& data, size_t & length, size_t stepSize) void Server::Broadcast(std::string message) { - Package package(MessageType::Event, m_SendPacketID); - package.AddString(message); + Package package(MessageType::Event, m_SendPacketID); + package.AddString(message); for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { - Send(package, i); + Send(package, i); } } } @@ -199,27 +197,27 @@ void Server::Broadcast(Package& package) { for (int i = 0; i < MAXCONNECTIONS; ++i) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { - Send(package, i); + Send(package, i); } } } void Server::SendSnapshot() { - Package package(MessageType::Snapshot, m_SendPacketID); - for (size_t i = 0; i < MAXCONNECTIONS; i++) { - if (m_PlayerDefinitions[i].EntityID == -1) { - continue; - } - // Pack player pos into data package - glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; - package.AddPrimitive(playerPos.x); - package.AddPrimitive(playerPos.y); - package.AddPrimitive(playerPos.z); + Package package(MessageType::Snapshot, m_SendPacketID); + for (size_t i = 0; i < MAXCONNECTIONS; i++) { + if (m_PlayerDefinitions[i].EntityID == -1) { + continue; + } + // Pack player pos into data package + glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; + package.AddPrimitive(playerPos.x); + package.AddPrimitive(playerPos.y); + package.AddPrimitive(playerPos.z); - package.AddString(m_PlayerDefinitions[i].Name); + package.AddString(m_PlayerDefinitions[i].Name); } - Broadcast(package); + Broadcast(package); } void Server::SendPing() @@ -232,9 +230,9 @@ void Server::SendPing() } // Create ping message - Package package(MessageType::ServerPing, m_SendPacketID); - package.AddString("Ping from server"); - // Time message + Package package(MessageType::ServerPing, m_SendPacketID); + package.AddString("Ping from server"); + // Time message m_StartPingTime = std::clock(); // Send message Broadcast(package); @@ -264,9 +262,9 @@ void Server::Disconnect(int i) Broadcast("A player disconnected"); std::cout << "Player " << i << " disconnected/Timed out" << std::endl; - // Remove enteties and stuff + // Remove enteties and stuff m_PlayerDefinitions[i].Endpoint = boost::asio::ip::udp::endpoint(); - m_PlayerDefinitions[i].EntityID = -1; + m_PlayerDefinitions[i].EntityID = -1; m_PlayerDefinitions[i].Name = ""; } @@ -293,13 +291,13 @@ void Server::ParseEvent(char * data, size_t length) temp.z += 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } - + if ("+Right" == std::string(data)) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; temp.x += 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } - + if ("-Right" == std::string(data)) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; temp.x -= 0.1f; @@ -310,7 +308,7 @@ void Server::ParseEvent(char * data, size_t length) void Server::ParseConnect(char * data, size_t length) { std::cout << "Parsing connection." << std::endl; - + // Check if player is already connected for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { return; @@ -319,7 +317,7 @@ void Server::ParseConnect(char * data, size_t length) for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == boost::asio::ip::address()) { - + m_PlayerDefinitions[i].EntityID = m_World->CreateEntity(); ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[i].EntityID, "Transform"); @@ -330,20 +328,20 @@ void Server::ParseConnect(char * data, size_t length) m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint; m_PlayerDefinitions[i].Name = std::string(data); - // +1 is the null terminator - MoveMessageHead(data, length, m_PlayerDefinitions[i].Name.size() + 1); + // +1 is the null terminator + MoveMessageHead(data, length, m_PlayerDefinitions[i].Name.size() + 1); m_StopTimes[i] = std::clock(); std::cout << m_PacketID << ": Player \"" << m_PlayerDefinitions[i].Name << "\" connected on IP: " << m_PlayerDefinitions[i].Endpoint.address().to_string() << std::endl; - Package package(MessageType::Connect, m_SendPacketID); - package.AddPrimitive(i); // Player ID - - Send(package, i); + Package package(MessageType::Connect, m_SendPacketID); + package.AddPrimitive(i); // Player ID + + Send(package, i); // Send notification that a player has connected - std::string str = m_PacketID + "Player " + m_PlayerDefinitions[i].Name + " connected on: " + std::string str = m_PacketID + "Player " + m_PlayerDefinitions[i].Name + " connected on: " + m_PlayerDefinitions[i].Endpoint.address().to_string(); Broadcast(str); break; @@ -365,11 +363,11 @@ void Server::ParseDisconnect() void Server::ParseClientPing() { - std::cout << m_PacketID << ":Parsing ping." << std::endl; - // Return ping - Package package(MessageType::ClientPing, m_SendPacketID); - package.AddString("Ping received"); - Send(package); // This dosen't work for multiple users + std::cout << m_PacketID << ":Parsing ping." << std::endl; + // Return ping + Package package(MessageType::ClientPing, m_SendPacketID); + package.AddString("Ping received"); + Send(package); // This dosen't work for multiple users } void Server::ParseServerPing() From e52052b4313c728a5c3d2176ff1edbead1f11adf Mon Sep 17 00:00:00 2001 From: Jocke Date: Mon, 14 Dec 2015 16:50:16 +0100 Subject: [PATCH 27/60] IdentifyPacketLoss() crashed when multiple users connected which also crashed the server. The function is not needed for now as the server logic is not implemented. --- src/Engine/Network/Server.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 92eb28f6..fe9454fd 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -121,7 +121,7 @@ void Server::ParseMessageType(char * data, size_t length) m_PreviousPacketID = m_PacketID; // Set previous packet id memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id MoveMessageHead(data, length, sizeof(int)); - IdentifyPacketLoss(); + //IdentifyPacketLoss(); // crashed when it started to spam! switch (static_cast(messageType)) { case MessageType::Connect: @@ -400,8 +400,6 @@ void Server::IdentifyPacketLoss() // if no packets lost, difference should be equal to 1 int difference = m_PacketID - m_PreviousPacketID; if (difference != 1) { - for (int i = m_PreviousPacketID + 1; i < m_PacketID; i++) { - LOG_INFO("Packet %i was lost...", i); - } + LOG_INFO("%i Packet(s) were lost...", difference); } } From bac0a1de26a05914d7d9c38a533b3fbbef028d18 Mon Sep 17 00:00:00 2001 From: stiffly Date: Mon, 14 Dec 2015 16:55:23 +0100 Subject: [PATCH 28/60] Removed annoying cube --- resources/Schema/Entities/Test.xml | 4 ++-- src/Engine/Network/Client.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/Schema/Entities/Test.xml b/resources/Schema/Entities/Test.xml index 4b8fb132..1aa59961 100644 --- a/resources/Schema/Entities/Test.xml +++ b/resources/Schema/Entities/Test.xml @@ -31,7 +31,7 @@ - + diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index d145cbbf..8c8ae5fd 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -6,7 +6,7 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { // Set up network stream - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; } From b698a0d36f1e2ae2761be4e5a7fdfb2891011399 Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 15 Dec 2015 11:21:46 +0100 Subject: [PATCH 29/60] WIP Adding models now crashes. Threading Added a create player event that currently is not used. --- include/Engine/Network/Client.h | 3 + include/Engine/Network/PlayerDefinition.h | 2 +- include/Engine/Network/Server.h | 5 +- include/Game/ECreatePlayer.h | 19 ++++++ include/Game/PlayerSystem.h | 6 ++ resources/Schema/Components/Player.xml | 4 ++ resources/Schema/Components/Player.xsd | 4 ++ src/Engine/Network/Client.cpp | 44 ++++++++++--- src/Engine/Network/Server.cpp | 77 ++++++++++++----------- src/Game/Game.cpp | 5 +- src/Game/PlayerSystem.cpp | 58 +++++++++++------ 11 files changed, 161 insertions(+), 66 deletions(-) create mode 100644 include/Game/ECreatePlayer.h diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 8e54aabb..52459d82 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -16,6 +16,7 @@ #include "Core/EventBroker.h" #include "Core/EKeyDown.h" #include "Core/EKeyUp.h" +#include "Input/EInputCommand.h" class Client @@ -75,6 +76,8 @@ private: bool OnKeyDown(const Events::KeyDown &e); EventRelay m_EKeyUp; bool OnKeyUp(const Events::KeyUp &e); + EventRelay m_EInputCommand; + bool OnInputCommand(const Events::InputCommand &e); }; #endif diff --git a/include/Engine/Network/PlayerDefinition.h b/include/Engine/Network/PlayerDefinition.h index dbacda95..b35ff463 100644 --- a/include/Engine/Network/PlayerDefinition.h +++ b/include/Engine/Network/PlayerDefinition.h @@ -3,7 +3,7 @@ #include struct PlayerDefinition { - int EntityID = -1; + unsigned int EntityID = -1; std::string Name = ""; boost::asio::ip::udp::endpoint Endpoint; }; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 259f47c4..3d77e0d1 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -12,13 +12,15 @@ #include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" #include "Core/World.h" +#include "Core/EventBroker.h" +#include "Game/ECreatePlayer.h" class Server { public: Server(); ~Server(); - void Start(World* m_world); + void Start(World* m_world, EventBroker *eventBroker); void Close(); private: @@ -32,6 +34,7 @@ private: std::clock_t m_StopTimes[8]; // Game logic World* m_World; + EventBroker* m_EventBroker; // Packet loss logic unsigned int m_PacketID; unsigned int m_PreviousPacketID; diff --git a/include/Game/ECreatePlayer.h b/include/Game/ECreatePlayer.h new file mode 100644 index 00000000..bbfd3c6d --- /dev/null +++ b/include/Game/ECreatePlayer.h @@ -0,0 +1,19 @@ +#ifndef Events_CreatePlayer_h__ +#define Events_CreatePlayer_h__ + +#include "Core/EventBroker.h" +#include "Core/World.h" + +namespace Events +{ + +struct CreatePlayer : Event +{ + unsigned int entityID; + std::string modelPath; + World* world; +}; + +} + +#endif diff --git a/include/Game/PlayerSystem.h b/include/Game/PlayerSystem.h index 18752ac6..b5147e1d 100644 --- a/include/Game/PlayerSystem.h +++ b/include/Game/PlayerSystem.h @@ -9,6 +9,7 @@ #include "Core/EventBroker.h" #include "Core/EKeyDown.h" #include "Core/EKeyUp.h" +#include "ECreatePlayer.h" struct KeyInput { @@ -26,6 +27,7 @@ public: { EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PlayerSystem::OnKeyDown); EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PlayerSystem::OnKeyUp); + EVENT_SUBSCRIBE_MEMBER(m_ECreatePlayer, &PlayerSystem::OnCreatePlayer); } virtual void Update(World* world, ComponentWrapper& player, double dt) override; @@ -34,11 +36,15 @@ private: float m_Speed = 5; glm::vec3 m_Direction; KeyInput input; + bool ShouldCreatePlayer = false; + void CreatePlayer(World * world, unsigned int& entityID); EventRelay m_EKeyDown; bool OnKeyDown(const Events::KeyDown &event); EventRelay m_EKeyUp; bool OnKeyUp(const Events::KeyUp &event); + EventRelay m_ECreatePlayer; + bool OnCreatePlayer(const Events::CreatePlayer &event); }; #endif \ No newline at end of file diff --git a/resources/Schema/Components/Player.xml b/resources/Schema/Components/Player.xml index 91a3bb4e..190f2ed0 100644 --- a/resources/Schema/Components/Player.xml +++ b/resources/Schema/Components/Player.xml @@ -1,3 +1,7 @@ + false + false + false + false \ No newline at end of file diff --git a/resources/Schema/Components/Player.xsd b/resources/Schema/Components/Player.xsd index 78c5866b..76a6a8fb 100644 --- a/resources/Schema/Components/Player.xsd +++ b/resources/Schema/Components/Player.xsd @@ -7,6 +7,10 @@ + + + + diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 8c8ae5fd..e4b3bc1b 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -28,7 +28,8 @@ void Client::Start(World* world, EventBroker* eventBroker) m_EventBroker->Subscribe(m_EKeyDown); m_EKeyUp = decltype(m_EKeyUp)(std::bind(&Client::OnKeyUp, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EKeyUp); - + m_EInputCommand = decltype(m_EInputCommand)(std::bind(&Client::OnInputCommand, this, std::placeholders::_1)); + m_EventBroker->Subscribe(m_EInputCommand); std::cout << "Please enter you name: "; std::cin >> m_PlayerName; while (m_PlayerName.size() > 7) { @@ -74,9 +75,9 @@ 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); + //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 @@ -208,7 +209,7 @@ void Client::ParseSnapshot(char* data, size_t length) // Apply the position data read to the player entity // New player connected on the server side if (m_PlayerDefinitions[i].Name == "" && tempName != "") { - CreateNewPlayer(i); + //CreateNewPlayer(i); } else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { // Someone disconnected // TODO: Insert code here @@ -216,7 +217,7 @@ void Client::ParseSnapshot(char* data, size_t length) // Not a connected player break; } - m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; + //m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; m_PlayerDefinitions[i].Name = tempName; } } @@ -322,6 +323,35 @@ bool Client::OnKeyUp(const Events::KeyUp & e) return false; } +bool Client::OnInputCommand(const Events::InputCommand & e) +{ + if (e.Command == "Forward") { + if (e.Value > 0) { + m_IsWASDKeyDown.W = true; + } + else if (e.Value < 0) { + m_IsWASDKeyDown.S = true; + } else { + m_IsWASDKeyDown.W = false; + m_IsWASDKeyDown.S = false; + } + } + if (e.Command == "Right") { + if (e.Value > 0) { + m_IsWASDKeyDown.D = true; + } else if (e.Value < 0) { + m_IsWASDKeyDown.A = true; + } else { + m_IsWASDKeyDown.A = false; + m_IsWASDKeyDown.D = false; + } + } + if (e.Command == "Sprint") { // Temp connect + Connect(); + } + return false; +} + void Client::CreateNewPlayer(int i) { m_PlayerDefinitions[i].EntityID = m_World->CreateEntity(); @@ -335,6 +365,6 @@ void Client::IdentifyPacketLoss() // if no packets lost, difference should be equal to 1 int difference = m_PacketID - m_PreviousPacketID; if (difference != 1) { - LOG_INFO("%i Packet(s) were lost...", difference); + LOG_INFO("%i Packet(s) were lost...", difference); } } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index fe9454fd..0bd13dfe 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -7,9 +7,10 @@ Server::~Server() { } -void Server::Start(World* world) +void Server::Start(World* world, EventBroker* eventBroker) { m_World = world; + m_EventBroker = eventBroker; for (size_t i = 0; i < MAXCONNECTIONS; i++) { m_StopTimes[i] = std::clock(); } @@ -42,7 +43,7 @@ void Server::ReadFromClients() std::clock_t previousePingMessage = std::clock(); std::clock_t previousSnapshotMessage = std::clock(); std::clock_t timOutTimer = std::clock(); - // How offen we send messages (milliseconds) + // How often we send messages (milliseconds) int intervallMs = 1000; int snapshotInterval = 50; int timeToCheckTimeOutTime = 100; @@ -63,6 +64,7 @@ void Server::ReadFromClients() std::cout << m_PacketID << ": Read from client crashed: " << err.what(); //} } + } std::clock_t currentTime = std::clock(); // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); @@ -121,7 +123,7 @@ void Server::ParseMessageType(char * data, size_t length) m_PreviousPacketID = m_PacketID; // Set previous packet id memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id MoveMessageHead(data, length, sizeof(int)); - //IdentifyPacketLoss(); // crashed when it started to spam! + //IdentifyPacketLoss(); switch (static_cast(messageType)) { case MessageType::Connect: @@ -210,7 +212,8 @@ void Server::SendSnapshot() continue; } // Pack player pos into data package - glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; + //glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; + glm::vec3 playerPos = glm::vec3(1.0f); package.AddPrimitive(playerPos.x); package.AddPrimitive(playerPos.y); package.AddPrimitive(playerPos.z); @@ -241,7 +244,6 @@ void Server::SendPing() void Server::CheckForTimeOuts() { int timeOutTimeMs = 5000; - int tempStartPing = 1000 * m_StartPingTime / static_cast(CLOCKS_PER_SEC); @@ -276,33 +278,33 @@ void Server::ParseEvent(char * data, size_t length) break; } } - // If no player matches the ip return. + // If no player matches the address return. if (i >= 8) return; - unsigned int entityId = m_PlayerDefinitions[i].EntityID; - if ("+Forward" == std::string(data)) { - glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - temp.z -= 0.1f; - m_World->GetComponent(entityId, "Transform")["Position"] = temp; - } - if ("-Forward" == std::string(data)) { - glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - temp.z += 0.1f; - m_World->GetComponent(entityId, "Transform")["Position"] = temp; - } + //unsigned int entityId = m_PlayerDefinitions[i].EntityID; + //if ("+Forward" == std::string(data)) { + // glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; + // temp.z -= 0.1f; + // m_World->GetComponent(entityId, "Transform")["Position"] = temp; + //} + //if ("-Forward" == std::string(data)) { + // glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; + // temp.z += 0.1f; + // m_World->GetComponent(entityId, "Transform")["Position"] = temp; + //} - if ("+Right" == std::string(data)) { - glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - temp.x += 0.1f; - m_World->GetComponent(entityId, "Transform")["Position"] = temp; - } + //if ("+Right" == std::string(data)) { + // glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; + // temp.x += 0.1f; + // m_World->GetComponent(entityId, "Transform")["Position"] = temp; + //} - if ("-Right" == std::string(data)) { - glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - temp.x -= 0.1f; - m_World->GetComponent(entityId, "Transform")["Position"] = temp; - } + //if ("-Right" == std::string(data)) { + // glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; + // temp.x -= 0.1f; + // m_World->GetComponent(entityId, "Transform")["Position"] = temp; + //} } void Server::ParseConnect(char * data, size_t length) @@ -317,15 +319,20 @@ void Server::ParseConnect(char * data, size_t length) for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == boost::asio::ip::address()) { + + //Events::CreatePlayer e; + //e.entityID = (m_PlayerDefinitions[i].EntityID); + //e.modelPath = "Models/Core/UnitSphere.obj"; + //e.world = m_World; + //m_EventBroker->Publish(e); - - m_PlayerDefinitions[i].EntityID = m_World->CreateEntity(); - ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[i].EntityID, "Transform"); - transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); - ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[i].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); - + //int 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";//modelPath; // You fix this :) + //model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); + m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint; m_PlayerDefinitions[i].Name = std::string(data); // +1 is the null terminator diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 94c18bfe..efc9e7c4 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -53,9 +53,6 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); - - - // Invoke network if(m_Config->Get("Networking.StartNetwork", false) == true) boost::thread workerThread(&Game::NetworkFunction, this); @@ -144,6 +141,6 @@ void Game::NetworkFunction() } if (inputMessage == "s" || inputMessage == "S") { Server m_Server; - m_Server.Start(m_World); + m_Server.Start(m_World, m_EventBroker); } } \ No newline at end of file diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index 736ea105..d48c02c1 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -3,24 +3,40 @@ void PlayerSystem::Update(World * world, ComponentWrapper & player, double dt) { - if (input.Forward) { - m_Direction.z = -1; - } else if (input.Back) { - m_Direction.z = 1; - } else { - m_Direction.z = 0; - } - if (input.Left) { - m_Direction.x = -1; - } else if (input.Right) { - m_Direction.x = 1; - } else { - m_Direction.x = 0; - } - m_EventBroker->Process(); - ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); - (glm::vec3&)player["Velocity"] = m_Speed * float(dt) * m_Direction; - (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; + //if (player["Forward"]) { + // ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1; + //} + //if (player["Left"]) { + // ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt) * -1; + //} + //if (player["Back"]) { + // ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt); + //} + //if (player["Right"]) { + // ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt); + //} + //ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); + //(glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; + + //m_EventBroker->Process(); + + //// TODO Jag tror inte vi kan göra det vi vill i updaten. + //// om man lägger till parametrar och tar bort overriden så blir det kanske inte så kul? + //// aja, lycka till! + //if (ShouldCreatePlayer) { + // int entityID = world->CreateEntity(); + // ComponentWrapper transform = world->AttachComponent(entityID, "Transform"); + // transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); + // ComponentWrapper model = world->AttachComponent(entityID, "Model"); + // model["Resource"] = "Models/Core/UnitSphere.obj";//modelPath; // You fix this :) + // model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); + // ShouldCreatePlayer = false; + //} +} + +void PlayerSystem::CreatePlayer(World * world, unsigned int& entityID) +{ + } bool PlayerSystem::OnKeyDown(const Events::KeyDown & event) @@ -56,3 +72,9 @@ bool PlayerSystem::OnKeyUp(const Events::KeyUp & event) } return false; } + +bool PlayerSystem::OnCreatePlayer(const Events::CreatePlayer & event) +{ + ShouldCreatePlayer = true; + return false; +} From 478c69231580c0760a04825bfc606c091e9a41c1 Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 15 Dec 2015 14:53:56 +0100 Subject: [PATCH 30/60] Refactoring. Client and server has Update Loop that runs before any game logic each frame. --- include/Engine/Network/Client.h | 4 ++ include/Engine/Network/Server.h | 3 + include/Game/Game.h | 3 + src/Engine/Network/Client.cpp | 18 +++++- src/Engine/Network/Server.cpp | 66 ++++++++++----------- src/Engine/Rendering/RenderQueueFactory.cpp | 16 +++-- src/Game/Game.cpp | 7 ++- src/Game/PlayerSystem.cpp | 28 ++++----- 8 files changed, 88 insertions(+), 57 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 52459d82..0cca0db5 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -25,6 +25,7 @@ public: Client(); ~Client(); void Start(World* world, EventBroker* eventBroker); + void Update(); void Close(); private: void ReadFromServer(); @@ -56,6 +57,9 @@ private: unsigned int m_PreviousPacketID = 0; unsigned int m_SendPacketID = 0; + // Game Logic + std::vector m_PlayersToCreate; + World* m_World; int m_PlayerID = -1; glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 3d77e0d1..610116d4 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -21,6 +21,7 @@ public: Server(); ~Server(); void Start(World* m_world, EventBroker *eventBroker); + void Update(); void Close(); private: @@ -35,6 +36,8 @@ private: // Game logic World* m_World; EventBroker* m_EventBroker; + // size = players to create, stores playerID + std::vector m_PlayersToCreate; // Packet loss logic unsigned int m_PacketID; unsigned int m_PreviousPacketID; diff --git a/include/Game/Game.h b/include/Game/Game.h index a3400679..2ff1d770 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -50,6 +50,9 @@ private: // Network methods void NetworkFunction(); + Client m_Client; + Server m_Server; + bool m_IsClient = false; EventRelay m_EInputCommand; bool debugOnInputCommand(const Events::InputCommand& e); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index e4b3bc1b..2dfdc59d 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -41,6 +41,17 @@ void Client::Start(World* world, EventBroker* eventBroker) ReadFromServer(); } +void Client::Update() +{ + while (m_PlayersToCreate.size() > 0) { + unsigned int i = m_PlayersToCreate.size() - 1; + m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = m_World->CreateEntity(); + ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Transform"); + ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Model"); + model["Resource"] = "Models/Core/UnitSphere.obj"; + } +} + void Client::Close() { if (m_WasStarted) { @@ -210,6 +221,7 @@ void Client::ParseSnapshot(char* data, size_t length) // New player connected on the server side if (m_PlayerDefinitions[i].Name == "" && tempName != "") { //CreateNewPlayer(i); + m_PlayersToCreate.push_back(i); } else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { // Someone disconnected // TODO: Insert code here @@ -217,8 +229,10 @@ void Client::ParseSnapshot(char* data, size_t length) // Not a connected player break; } - //m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; - m_PlayerDefinitions[i].Name = tempName; + if (m_PlayerDefinitions[i].EntityID != -1) { + m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; + m_PlayerDefinitions[i].Name = tempName; + } } } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 0bd13dfe..77eba2ae 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -25,6 +25,20 @@ void Server::Start(World* world, EventBroker* eventBroker) threads.join_all(); } +void Server::Update() +{ + while (m_PlayersToCreate.size() > 0) { + int i = m_PlayersToCreate.size() - 1; + m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = m_World->CreateEntity(); + ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Transform"); + transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); + ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].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); + m_PlayersToCreate.pop_back(); + } +} + void Server::Close() { m_ThreadIsRunning = false; @@ -124,7 +138,6 @@ void Server::ParseMessageType(char * data, size_t length) memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id MoveMessageHead(data, length, sizeof(int)); //IdentifyPacketLoss(); - switch (static_cast(messageType)) { case MessageType::Connect: ParseConnect(data, length); @@ -211,9 +224,10 @@ void Server::SendSnapshot() if (m_PlayerDefinitions[i].EntityID == -1) { continue; } + // Pack player pos into data package - //glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; - glm::vec3 playerPos = glm::vec3(1.0f); + glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; + //glm::vec3 playerPos = glm::vec3(1.0f); package.AddPrimitive(playerPos.x); package.AddPrimitive(playerPos.y); package.AddPrimitive(playerPos.z); @@ -282,29 +296,19 @@ void Server::ParseEvent(char * data, size_t length) if (i >= 8) return; - //unsigned int entityId = m_PlayerDefinitions[i].EntityID; - //if ("+Forward" == std::string(data)) { - // glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - // temp.z -= 0.1f; - // m_World->GetComponent(entityId, "Transform")["Position"] = temp; - //} - //if ("-Forward" == std::string(data)) { - // glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - // temp.z += 0.1f; - // m_World->GetComponent(entityId, "Transform")["Position"] = temp; - //} - - //if ("+Right" == std::string(data)) { - // glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - // temp.x += 0.1f; - // m_World->GetComponent(entityId, "Transform")["Position"] = temp; - //} - - //if ("-Right" == std::string(data)) { - // glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; - // temp.x -= 0.1f; - // m_World->GetComponent(entityId, "Transform")["Position"] = temp; - //} + unsigned int entityId = m_PlayerDefinitions[i].EntityID; + if ("+Forward" == std::string(data)) { + m_World->GetComponent(entityId, "Player")["Forward"] = true; + } + if ("-Forward" == std::string(data)) { + m_World->GetComponent(entityId, "Player")["Back"] = true; + } + if ("+Right" == std::string(data)) { + m_World->GetComponent(entityId, "Player")["Right"] = true; + } + if ("-Right" == std::string(data)) { + m_World->GetComponent(entityId, "Player")["Left"] = true; + } } void Server::ParseConnect(char * data, size_t length) @@ -326,13 +330,9 @@ void Server::ParseConnect(char * data, size_t length) //e.world = m_World; //m_EventBroker->Publish(e); - //int 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";//modelPath; // You fix this :) - //model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); - + // Create new player + m_PlayersToCreate.push_back(i); + m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint; m_PlayerDefinitions[i].Name = std::string(data); // +1 is the null terminator diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 8d5bb420..747e68b1 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -46,9 +46,11 @@ glm::quat RenderQueueFactory::AbsoluteOrientation(World* world, EntityID entity) glm::quat orientation; do { - ComponentWrapper transform = world->GetComponent(entity, "Transform"); - orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation; - entity = world->GetParent(entity); + if (world->HasComponent(entity, "Transform")) { + ComponentWrapper transform = world->GetComponent(entity, "Transform"); + orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation; + entity = world->GetParent(entity); + } } while (entity != 0); return orientation; @@ -59,9 +61,11 @@ glm::vec3 RenderQueueFactory::AbsoluteScale(World* world, EntityID entity) glm::vec3 scale(1.f); do { - ComponentWrapper transform = world->GetComponent(entity, "Transform"); - scale *= (glm::vec3)transform["Scale"]; - entity = world->GetParent(entity); + if (world->HasComponent(entity, "Transform")) { + ComponentWrapper transform = world->GetComponent(entity, "Transform"); + scale *= (glm::vec3)transform["Scale"]; + entity = world->GetParent(entity); + } } while (entity != 0); return scale; diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 5ad730ab..a242f64d 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -89,6 +89,9 @@ void Game::Tick() m_InputProxy->Process(); m_EventBroker->Swap(); + // Update network + m_IsClient ? m_Client.Update() : m_Server.Update(); + // Iterate through systems and update world! m_SystemPipeline->Update(m_World, dt); debugTick(dt); @@ -135,11 +138,11 @@ void Game::NetworkFunction() std::cout << "Start client or server? (c/s)" << std::endl; std::cin >> inputMessage; if (inputMessage == "c" || inputMessage == "C") { - Client m_Client; + m_IsClient = true; m_Client.Start(m_World, m_EventBroker); } if (inputMessage == "s" || inputMessage == "S") { - Server m_Server; + m_IsClient = false; m_Server.Start(m_World, m_EventBroker); } } \ No newline at end of file diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index adfcba9b..6be82702 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -2,20 +2,20 @@ void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, double dt) { - //if (player["Forward"]) { - // ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1; - //} - //if (player["Left"]) { - // ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt) * -1; - //} - //if (player["Back"]) { - // ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt); - //} - //if (player["Right"]) { - // ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt); - //} - //ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); - //(glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; + if (player["Forward"]) { + ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1; + } + if (player["Left"]) { + ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt) * -1; + } + if (player["Back"]) { + ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt); + } + if (player["Right"]) { + ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt); + } + ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); + (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; //m_EventBroker->Process(); From e940c1d60483913fa616b541bc482291ce705d08 Mon Sep 17 00:00:00 2001 From: Jocke Date: Tue, 15 Dec 2015 14:55:56 +0100 Subject: [PATCH 31/60] WIP --- include/Engine/Network/Client.h | 8 +++---- include/Engine/Network/Package.h | 19 ++++++++++++++++ include/Engine/Network/Server.h | 8 +++---- src/Engine/Network/Client.cpp | 27 ++++++++++------------- src/Engine/Network/Package.cpp | 36 +++++++++++++++++++++++------- src/Engine/Network/Server.cpp | 38 +++++++++++++++----------------- 6 files changed, 85 insertions(+), 51 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 8e54aabb..37f524b8 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -36,12 +36,12 @@ private: void Disconnect(); void Ping(); void MoveMessageHead(char*& data, size_t& length, size_t stepSize); - void ParseMessageType(char* data, size_t length); - void ParseEventMessage(char* data, size_t length); - void ParseConnect(char* data, size_t length); + void ParseMessageType(Package& package); + void ParseEventMessage(Package& package); + void ParseConnect(Package& package); void ParsePing(); void ParseServerPing(); - void ParseSnapshot(char* data, size_t length); + void ParseSnapshot(Package& package); void CreateNewPlayer(int i); void IdentifyPacketLoss(); diff --git a/include/Engine/Network/Package.h b/include/Engine/Network/Package.h index 63409bf0..49118b6e 100644 --- a/include/Engine/Network/Package.h +++ b/include/Engine/Network/Package.h @@ -3,6 +3,7 @@ #include #include "Network/MessageType.h" +#include "Core/Util/Logging.h" // Defines the class Package @@ -11,6 +12,8 @@ public: // arg1: Type of message (Connect, Disconnect...) // arg2: PackageID for identifying packet loss. Package(MessageType type, unsigned int& packageID); + // Used to create package from already existing data buffer. + Package(char* data, int sizeOfPackage); ~Package(); // Add primitive types like int, float, char... template @@ -19,13 +22,29 @@ public: memcpy(m_Data + m_Offset, &val, sizeof(T)); m_Offset += sizeof(T); } + // Pops the first element as if it was a primitive. + template + T PopFrontPrimitive() + { + if (m_Offset < m_ReturnDataOffset + sizeof(T)) { + LOG_WARNING("Package PopFrontPrimitive(): You are trying to remove more than what exists in this package!"); + return -1; + } + T returnValue; + memcpy(&returnValue, m_Data + m_ReturnDataOffset, sizeof(T)); + m_ReturnDataOffset += sizeof(T); + return returnValue; + } void AddString(std::string str); + // Pops the first element as if it was a string. + std::string PopFrontString(); int Size() { return m_Offset; }; char* Data() { return m_Data; }; private: char* m_Data = new char[128]; + unsigned int m_ReturnDataOffset = 0; int m_Offset = 0; }; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 259f47c4..1af3d3f6 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -54,13 +54,13 @@ private: void SendPing(); void CheckForTimeOuts(); void Disconnect(int i); - void ParseMessageType(char* data, size_t length); - void ParseEvent(char* data, size_t length); - void ParseConnect(char* data, size_t length); + void ParseMessageType(Package& package); + void ParseEvent(Package& package); + void ParseConnect(Package& package); void ParseDisconnect(); void ParseClientPing(); void ParseServerPing(); - void ParseSnapshot(char* data, size_t length); + void ParseSnapshot(Package& package); void IdentifyPacketLoss(); }; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 8c8ae5fd..f2eebd09 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -6,7 +6,7 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { // Set up network stream - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; } @@ -61,7 +61,8 @@ void Client::ReadFromServer() while (m_ThreadIsRunning) { if (m_Socket.available()) { bytesRead = Receive(readBuf, INPUTSIZE); - ParseMessageType(readBuf, bytesRead); + Package package(readBuf,bytesRead); + ParseMessageType(package); } std::clock_t currentTime = std::clock(); if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { @@ -107,21 +108,17 @@ void Client::SendSnapshotToServer() } } -void Client::ParseMessageType(char* data, size_t length) +void Client::ParseMessageType(Package& package) { - int messageType = -1; - memcpy(&messageType, data, sizeof(int)); // Read what type off message was sent from server - MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from - + int messageType = package.PopFrontPrimitive(); // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id - memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id - MoveMessageHead(data, length, sizeof(int)); + m_PacketID = package.PopFrontPrimitive(); //Read new packet id IdentifyPacketLoss(); switch (static_cast(messageType)) { case MessageType::Connect: - ParseConnect(data, length); + ParseConnect(package); break; case MessageType::ClientPing: ParsePing(); @@ -132,19 +129,19 @@ void Client::ParseMessageType(char* data, size_t length) case MessageType::Message: break; case MessageType::Snapshot: - ParseSnapshot(data, length); + ParseSnapshot(package); break; case MessageType::Disconnect: break; case MessageType::Event: - ParseEventMessage(data, length); + ParseEventMessage(package); break; default: break; } } -void Client::ParseConnect(char* data, size_t len) +void Client::ParseConnect(Package& package) { memcpy(&m_PacketID, data, sizeof(int)); m_PreviousPacketID = m_PacketID; @@ -168,7 +165,7 @@ void Client::ParseServerPing() //std::cout << "Parsing ping." << std::endl; } -void Client::ParseEventMessage(char* data, size_t length) +void Client::ParseEventMessage(Package& package) { int Id = -1; std::string command = std::string(data); @@ -187,7 +184,7 @@ void Client::ParseEventMessage(char* data, size_t length) void Client::ParseSnapshot(char* data, size_t length) { - std::cout << m_PacketID << ": Parsing incoming snapshot." << std::endl; + //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, diff --git a/src/Engine/Network/Package.cpp b/src/Engine/Network/Package.cpp index 665d15ce..f25d0e5a 100644 --- a/src/Engine/Network/Package.cpp +++ b/src/Engine/Network/Package.cpp @@ -1,24 +1,44 @@ #include "Network/Package.h" -Package::Package(MessageType type,unsigned int& packageID) +Package::Package(MessageType type, unsigned int& packageID) { - // Create message header - // Add message type - int messageType = static_cast(type); + // Create message header + // Add message type + int messageType = static_cast(type); Package::AddPrimitive(messageType); packageID = packageID % 1000; // Packet id modulos Package::AddPrimitive(packageID); packageID++; } + +Package::Package(char* data, int sizeOfPackage) +{ + // Create message + memcpy(m_Data, data, sizeOfPackage); + m_Offset = sizeOfPackage; +} + Package::~Package() { - delete[] m_Data; + delete[] m_Data; } void Package::AddString(std::string str) { - // Message, add one extra byte for null terminator - memcpy(m_Data + m_Offset, str.data(), (str.size() + 1) * sizeof(char)); - m_Offset += (str.size() + 1) * sizeof(char); + // Message, add one extra byte for null terminator + memcpy(m_Data + m_Offset, str.data(), (str.size() + 1) * sizeof(char)); + m_Offset += (str.size() + 1) * sizeof(char); +} + +std::string Package::PopFrontString() +{ + std::string returnValue(m_Data + m_ReturnDataOffset); + if (m_Offset < m_ReturnDataOffset + returnValue.size()){ + LOG_WARNING("Package PopFrontString(): Oh no! You are trying to remove things outside my memory kingdom"); + return "PopFrontString Failed"; + } + + m_ReturnDataOffset += returnValue.size(); + return returnValue; } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index fe9454fd..7ede2ce8 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -56,7 +56,8 @@ void Server::ReadFromClients() if (m_ThreadIsRunning && m_Socket.available()) { try { bytesRead = Receive(readBuf, INPUTSIZE); - ParseMessageType(readBuf, bytesRead); + Package package(readBuf, bytesRead); + ParseMessageType(package); } catch (const std::exception& err) { // To not spam "socket closed messages" //if (std::string(err.what()).find("forcefully closed") != std::string::npos) { @@ -111,21 +112,18 @@ void Server::InputLoop() } } -void Server::ParseMessageType(char * data, size_t length) +void Server::ParseMessageType(Package& package) { - int messageType = -1; - memcpy(&messageType, data, sizeof(int)); // Read what type off message was sent from server - MoveMessageHead(data, length, sizeof(int)); // Move the message head to know where to read from + int messageType = package.PopFrontPrimitive(); // Read what type off message was sent from server // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id - memcpy(&m_PacketID, data, sizeof(int)); //Read new packet id - MoveMessageHead(data, length, sizeof(int)); + m_PacketID = package.PopFrontPrimitive(); //Read new packet id //IdentifyPacketLoss(); // crashed when it started to spam! switch (static_cast(messageType)) { case MessageType::Connect: - ParseConnect(data, length); + ParseConnect(package); break; case MessageType::ClientPing: //ParseClientPing(); @@ -136,13 +134,13 @@ void Server::ParseMessageType(char * data, size_t length) case MessageType::Message: break; case MessageType::Snapshot: - ParseSnapshot(data, length); + ParseSnapshot(package); break; case MessageType::Disconnect: ParseDisconnect(); break; case MessageType::Event: - ParseEvent(data, length); + ParseEvent(package); break; default: break; @@ -268,7 +266,7 @@ void Server::Disconnect(int i) m_PlayerDefinitions[i].Name = ""; } -void Server::ParseEvent(char * data, size_t length) +void Server::ParseEvent(Package& package) { size_t i; for (i = 0; i < MAXCONNECTIONS; i++) { @@ -281,31 +279,32 @@ void Server::ParseEvent(char * data, size_t length) return; unsigned int entityId = m_PlayerDefinitions[i].EntityID; - if ("+Forward" == std::string(data)) { + std::string eventString = package.PopFrontString(); + if ("+Forward" == eventString) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; temp.z -= 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } - if ("-Forward" == std::string(data)) { + if ("-Forward" == eventString) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; temp.z += 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } - if ("+Right" == std::string(data)) { + if ("+Right" == eventString) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; temp.x += 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } - if ("-Right" == std::string(data)) { + if ("-Right" == eventString) { glm::vec3 temp = m_World->GetComponent(entityId, "Transform")["Position"]; temp.x -= 0.1f; m_World->GetComponent(entityId, "Transform")["Position"] = temp; } } -void Server::ParseConnect(char * data, size_t length) +void Server::ParseConnect(Package& package) { std::cout << "Parsing connection." << std::endl; // Check if player is already connected @@ -327,9 +326,8 @@ void Server::ParseConnect(char * data, size_t length) model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint; - m_PlayerDefinitions[i].Name = std::string(data); - // +1 is the null terminator - MoveMessageHead(data, length, m_PlayerDefinitions[i].Name.size() + 1); + m_PlayerDefinitions[i].Name = package.PopFrontString(); + m_StopTimes[i] = std::clock(); std::cout << m_PacketID << ": Player \"" << m_PlayerDefinitions[i].Name << "\" connected on IP: " << @@ -381,7 +379,7 @@ void Server::ParseServerPing() } // NOT USED -void Server::ParseSnapshot(char * data, size_t length) +void Server::ParseSnapshot(Package& package) { // Does no logic. Returns snapshot if client request one // The snapshot is not a real snapshot tho... From 472a8db81a28ef3da07f0ce988b0ce7f4f8473ae Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 15 Dec 2015 15:32:31 +0100 Subject: [PATCH 32/60] Various bug fixes. --- src/Engine/Network/Client.cpp | 14 ++++++++++---- src/Engine/Network/Server.cpp | 7 +++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 2dfdc59d..96f218e0 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -6,7 +6,7 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { // Set up network stream - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; } @@ -45,10 +45,13 @@ void Client::Update() { while (m_PlayersToCreate.size() > 0) { unsigned int i = m_PlayersToCreate.size() - 1; - m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = m_World->CreateEntity(); + unsigned int tempID = m_World->CreateEntity(); ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Transform"); ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Model"); model["Resource"] = "Models/Core/UnitSphere.obj"; + ComponentWrapper player = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Player"); + m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = tempID; + m_PlayersToCreate.pop_back(); } } @@ -215,12 +218,14 @@ void Client::ParseSnapshot(char* data, size_t length) MoveMessageHead(data, length, sizeof(float)); tempName = std::string(data); + // +1 for null terminator MoveMessageHead(data, length, tempName.size() + 1); // Apply the position data read to the player entity // New player connected on the server side if (m_PlayerDefinitions[i].Name == "" && tempName != "") { //CreateNewPlayer(i); + m_PlayerDefinitions[i].Name = tempName; m_PlayersToCreate.push_back(i); } else if (m_PlayerDefinitions[i].Name != "" && tempName == "") { // Someone disconnected @@ -230,8 +235,9 @@ void Client::ParseSnapshot(char* data, size_t length) break; } if (m_PlayerDefinitions[i].EntityID != -1) { - m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; - m_PlayerDefinitions[i].Name = tempName; + if (m_World->HasComponent(m_PlayerDefinitions[i].EntityID, "Player")) { + m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; + } } } } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 77eba2ae..e2e65d10 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -28,13 +28,15 @@ void Server::Start(World* world, EventBroker* eventBroker) void Server::Update() { while (m_PlayersToCreate.size() > 0) { - int i = m_PlayersToCreate.size() - 1; - m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = m_World->CreateEntity(); + unsigned int i = m_PlayersToCreate.size() - 1; + unsigned int tempID = m_World->CreateEntity(); ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Transform"); transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].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(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Player"); + m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = tempID; m_PlayersToCreate.pop_back(); } } @@ -225,6 +227,7 @@ void Server::SendSnapshot() continue; } + // Pack player pos into data package glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; //glm::vec3 playerPos = glm::vec3(1.0f); From 1669649186a507a5273f85695d4f28526e7ebcd3 Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 15 Dec 2015 16:24:09 +0100 Subject: [PATCH 33/60] Fixed bug with entityID. Also trying to fix movement WIP. --- src/Engine/Network/Client.cpp | 6 +++--- src/Engine/Network/Server.cpp | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 96f218e0..3d94ad15 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -46,10 +46,10 @@ 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(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Transform"); - ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Model"); + 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(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Player"); + ComponentWrapper player = m_World->AttachComponent(tempID, "Player"); m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = tempID; m_PlayersToCreate.pop_back(); } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index e2e65d10..3800b88e 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -30,12 +30,12 @@ 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(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Transform"); + ComponentWrapper transform = m_World->AttachComponent(tempID, "Transform"); transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); - ComponentWrapper model = m_World->AttachComponent(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Model"); + 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(m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID, "Player"); + ComponentWrapper player = m_World->AttachComponent(tempID, "Player"); m_PlayerDefinitions[m_PlayersToCreate[i]].EntityID = tempID; m_PlayersToCreate.pop_back(); } @@ -300,6 +300,11 @@ void Server::ParseEvent(char * data, size_t length) return; unsigned int entityId = m_PlayerDefinitions[i].EntityID; + m_World->GetComponent(entityId, "Player")["Forward"] = false; + m_World->GetComponent(entityId, "Player")["Left"] = false; + m_World->GetComponent(entityId, "Player")["Back"] = false; + m_World->GetComponent(entityId, "Player")["Right"] = false; + if ("+Forward" == std::string(data)) { m_World->GetComponent(entityId, "Player")["Forward"] = true; } From 889e0bb3d35987e0887ea8e6baad2330a71872f8 Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 15 Dec 2015 16:35:09 +0100 Subject: [PATCH 34/60] Cleaned up PlayerSystem. Sets velocity to 0 every frame. --- include/Game/PlayerSystem.h | 31 +------------------ src/Game/PlayerSystem.cpp | 62 ++----------------------------------- 2 files changed, 3 insertions(+), 90 deletions(-) diff --git a/include/Game/PlayerSystem.h b/include/Game/PlayerSystem.h index b722751c..aad6e3c5 100644 --- a/include/Game/PlayerSystem.h +++ b/include/Game/PlayerSystem.h @@ -6,45 +6,16 @@ #include "Common.h" #include "Core/System.h" -#include "Core/EventBroker.h" -#include "Core/EKeyDown.h" -#include "Core/EKeyUp.h" -#include "ECreatePlayer.h" - -struct KeyInput -{ - bool Forward = false; - bool Left = false; - bool Back = false; - bool Right = false; -}; class PlayerSystem : public PureSystem { public: PlayerSystem(EventBroker* eventBroker) : PureSystem(eventBroker, "Player") - { - EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PlayerSystem::OnKeyDown); - EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PlayerSystem::OnKeyUp); - EVENT_SUBSCRIBE_MEMBER(m_ECreatePlayer, &PlayerSystem::OnCreatePlayer); - } - + { } virtual void UpdateComponent(World* world, ComponentWrapper& player, double dt) override; - private: float m_Speed = 5; - glm::vec3 m_Direction; - KeyInput input; - bool ShouldCreatePlayer = false; - - void CreatePlayer(World * world, unsigned int& entityID); - EventRelay m_EKeyDown; - bool OnKeyDown(const Events::KeyDown &event); - EventRelay m_EKeyUp; - bool OnKeyUp(const Events::KeyUp &event); - EventRelay m_ECreatePlayer; - bool OnCreatePlayer(const Events::CreatePlayer &event); }; #endif \ No newline at end of file diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index 6be82702..02e7ab22 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -2,6 +2,7 @@ void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, double dt) { + (glm::vec3)player["Velocity"] = glm::vec3(0.f); if (player["Forward"]) { ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1; } @@ -14,66 +15,7 @@ void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, dou if (player["Right"]) { ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt); } + ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; - - //m_EventBroker->Process(); - - //// TODO Jag tror inte vi kan göra det vi vill i updaten. - //// om man lägger till parametrar och tar bort overriden så blir det kanske inte så kul? - //// aja, lycka till! - //if (ShouldCreatePlayer) { - // int entityID = world->CreateEntity(); - // ComponentWrapper transform = world->AttachComponent(entityID, "Transform"); - // transform["Position"] = glm::vec3(-1.5f, 0.f, 0.f); - // ComponentWrapper model = world->AttachComponent(entityID, "Model"); - // model["Resource"] = "Models/Core/UnitSphere.obj";//modelPath; // You fix this :) - // model["Color"] = glm::vec4(rand()%255 / 255.f, rand()%255 / 255.f, rand() %255 / 255.f, 1.f); - // ShouldCreatePlayer = false; - //} -} - -void PlayerSystem::CreatePlayer(World * world, unsigned int& entityID) -{ - -} - -bool PlayerSystem::OnKeyDown(const Events::KeyDown & event) -{ - if (event.KeyCode == GLFW_KEY_W) { - input.Forward = true; - } - if (event.KeyCode == GLFW_KEY_A) { - input.Left = true; - } - if (event.KeyCode == GLFW_KEY_S) { - input.Back = true; - } - if (event.KeyCode == GLFW_KEY_D) { - input.Right = true; - } - return true; -} - -bool PlayerSystem::OnKeyUp(const Events::KeyUp & event) -{ - if (event.KeyCode == GLFW_KEY_W) { - input.Forward = false; - } - if (event.KeyCode == GLFW_KEY_A) { - input.Left = false; - } - if (event.KeyCode == GLFW_KEY_S) { - input.Back = false; - } - if (event.KeyCode == GLFW_KEY_D) { - input.Right = false; - } - return false; -} - -bool PlayerSystem::OnCreatePlayer(const Events::CreatePlayer & event) -{ - ShouldCreatePlayer = true; - return false; } From 9b348a7d973a74bf487b6fb868e6e3b20715d2b6 Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 15 Dec 2015 16:50:59 +0100 Subject: [PATCH 35/60] Updated movement code once again. --- src/Engine/Network/Client.cpp | 19 +++++++++++++------ src/Engine/Network/Server.cpp | 22 +++++++++++----------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 3d94ad15..9022b8ac 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -111,14 +111,21 @@ void Client::SendSnapshotToServer() } if (m_NextSnapshot.InputForward != "") { - Package message(MessageType::Event, m_SendPacketID); - message.AddString(m_NextSnapshot.InputForward); - Send(message); + Package package(MessageType::Event, m_SendPacketID); + package.AddString(m_NextSnapshot.InputForward); + Send(package); + } else { + Package package(MessageType::Event, m_SendPacketID); + package.AddString("0Forward"); } if (m_NextSnapshot.InputRight != "") { - Package message(MessageType::Event, m_SendPacketID); - message.AddString(m_NextSnapshot.InputRight); - Send(message); + Package package(MessageType::Event, m_SendPacketID); + package.AddString(m_NextSnapshot.InputRight); + Send(package); + } else { + Package package(MessageType::Event, m_SendPacketID); + package.AddString("0Right"); + Send(package); } } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 3800b88e..46b803bf 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -26,7 +26,7 @@ void Server::Start(World* world, EventBroker* eventBroker) } void Server::Update() -{ +{ while (m_PlayersToCreate.size() > 0) { unsigned int i = m_PlayersToCreate.size() - 1; unsigned int tempID = m_World->CreateEntity(); @@ -80,7 +80,7 @@ void Server::ReadFromClients() std::cout << m_PacketID << ": Read from client crashed: " << err.what(); //} } - + } std::clock_t currentTime = std::clock(); // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); @@ -300,22 +300,22 @@ void Server::ParseEvent(char * data, size_t length) return; unsigned int entityId = m_PlayerDefinitions[i].EntityID; - m_World->GetComponent(entityId, "Player")["Forward"] = false; - m_World->GetComponent(entityId, "Player")["Left"] = false; - m_World->GetComponent(entityId, "Player")["Back"] = false; - m_World->GetComponent(entityId, "Player")["Right"] = false; if ("+Forward" == std::string(data)) { m_World->GetComponent(entityId, "Player")["Forward"] = true; - } - if ("-Forward" == std::string(data)) { + } else if ("-Forward" == std::string(data)) { m_World->GetComponent(entityId, "Player")["Back"] = true; + } else if ("0Forward" == std::string(data)) { + m_World->GetComponent(entityId, "Player")["Forward"] = false; + m_World->GetComponent(entityId, "Player")["Back"] = false; } if ("+Right" == std::string(data)) { m_World->GetComponent(entityId, "Player")["Right"] = true; - } - if ("-Right" == std::string(data)) { + } else if ("-Right" == std::string(data)) { m_World->GetComponent(entityId, "Player")["Left"] = true; + } else if ("0Right" == std::string(data)) { + m_World->GetComponent(entityId, "Player")["Right"] = false; + m_World->GetComponent(entityId, "Player")["Left"] = false; } } @@ -331,7 +331,7 @@ void Server::ParseConnect(char * data, size_t length) for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == boost::asio::ip::address()) { - + //Events::CreatePlayer e; //e.entityID = (m_PlayerDefinitions[i].EntityID); //e.modelPath = "Models/Core/UnitSphere.obj"; From 082b3fd3df2500cd656a8fe44a0eee3daea031ac Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 15 Dec 2015 17:22:46 +0100 Subject: [PATCH 36/60] Removed old input events from client --- include/Engine/Network/Client.h | 4 --- src/Engine/Network/Client.cpp | 55 +-------------------------------- src/Engine/Network/Server.cpp | 4 +++ src/Game/PlayerSystem.cpp | 8 +++-- 4 files changed, 10 insertions(+), 61 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 0cca0db5..ec0123f6 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -76,10 +76,6 @@ private: // Events EventBroker* m_EventBroker; - EventRelay m_EKeyDown; - bool OnKeyDown(const Events::KeyDown &e); - EventRelay m_EKeyUp; - bool OnKeyUp(const Events::KeyUp &e); EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand &e); }; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 9022b8ac..b4ec5b8c 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -24,10 +24,6 @@ void Client::Start(World* world, EventBroker* eventBroker) m_World = world; // Subscribe to events - m_EKeyDown = decltype(m_EKeyDown)(std::bind(&Client::OnKeyDown, this, std::placeholders::_1)); - m_EventBroker->Subscribe(m_EKeyDown); - m_EKeyUp = decltype(m_EKeyUp)(std::bind(&Client::OnKeyUp, this, std::placeholders::_1)); - m_EventBroker->Subscribe(m_EKeyUp); m_EInputCommand = decltype(m_EInputCommand)(std::bind(&Client::OnInputCommand, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EInputCommand); std::cout << "Please enter you name: "; @@ -60,8 +56,7 @@ void Client::Close() if (m_WasStarted) { Disconnect(); m_ThreadIsRunning = false; - m_EventBroker->Unsubscribe(m_EKeyDown); - m_EventBroker->Unsubscribe(m_EKeyUp); + m_EventBroker->Unsubscribe(m_EInputCommand); } } @@ -302,54 +297,6 @@ void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) length -= stepSize; } -bool Client::OnKeyDown(const Events::KeyDown& event) -{ - if (event.KeyCode == GLFW_KEY_W) { - m_IsWASDKeyDown.W = true; - } - if (event.KeyCode == GLFW_KEY_A) { - m_IsWASDKeyDown.A = true; - } - if (event.KeyCode == GLFW_KEY_S) { - m_IsWASDKeyDown.S = true; - } - if (event.KeyCode == GLFW_KEY_D) { - m_IsWASDKeyDown.D = true; - } - - if (event.KeyCode == GLFW_KEY_V) { - Disconnect(); - } - if (event.KeyCode == GLFW_KEY_C) { - Connect(); - } - if (event.KeyCode == GLFW_KEY_P) { - Ping(); - } - return true; -} - -bool Client::OnKeyUp(const Events::KeyUp & e) -{ - if (e.KeyCode == GLFW_KEY_W) { - m_IsWASDKeyDown.W = false; - return true; - } - if (e.KeyCode == GLFW_KEY_A) { - m_IsWASDKeyDown.A = false; - return true; - } - if (e.KeyCode == GLFW_KEY_S) { - m_IsWASDKeyDown.S = false; - return true; - } - if (e.KeyCode == GLFW_KEY_D) { - m_IsWASDKeyDown.D = false; - return true; - } - return false; -} - bool Client::OnInputCommand(const Events::InputCommand & e) { if (e.Command == "Forward") { diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 46b803bf..cffb0d81 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -303,15 +303,19 @@ void Server::ParseEvent(char * data, size_t length) if ("+Forward" == std::string(data)) { m_World->GetComponent(entityId, "Player")["Forward"] = true; + m_World->GetComponent(entityId, "Player")["Back"] = false; } else if ("-Forward" == std::string(data)) { + m_World->GetComponent(entityId, "Player")["Forward"] = false; m_World->GetComponent(entityId, "Player")["Back"] = true; } else if ("0Forward" == std::string(data)) { m_World->GetComponent(entityId, "Player")["Forward"] = false; m_World->GetComponent(entityId, "Player")["Back"] = false; } if ("+Right" == std::string(data)) { + m_World->GetComponent(entityId, "Player")["Left"] = false; m_World->GetComponent(entityId, "Player")["Right"] = true; } else if ("-Right" == std::string(data)) { + m_World->GetComponent(entityId, "Player")["Right"] = false; m_World->GetComponent(entityId, "Player")["Left"] = true; } else if ("0Right" == std::string(data)) { m_World->GetComponent(entityId, "Player")["Right"] = false; diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index 02e7ab22..13c4096a 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -2,7 +2,7 @@ void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, double dt) { - (glm::vec3)player["Velocity"] = glm::vec3(0.f); + (glm::vec3)player["Velocity"] = glm::vec3(0.f, 0.f, 0.f); if (player["Forward"]) { ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1; } @@ -16,6 +16,8 @@ void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, dou ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt); } - ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); - (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; + if ((glm::vec3)player["Velocity"] != glm::vec3(0.f)) { + ComponentWrapper& transform = world->GetComponent(player.EntityID, "Transform"); + (glm::vec3&)transform["Position"] += (glm::vec3)player["Velocity"]; + } } From 3f602c9d63162eef1b21e1b087a3b7a835117892 Mon Sep 17 00:00:00 2001 From: stiffly Date: Tue, 15 Dec 2015 17:55:08 +0100 Subject: [PATCH 37/60] Test code --- src/Engine/Network/Client.cpp | 4 ++++ src/Engine/Network/Server.cpp | 1 + src/Game/PlayerSystem.cpp | 8 ++++---- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index b4ec5b8c..d573472b 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -112,7 +112,11 @@ void Client::SendSnapshotToServer() } else { Package package(MessageType::Event, m_SendPacketID); package.AddString("0Forward"); + Send(package); } + + + if (m_NextSnapshot.InputRight != "") { Package package(MessageType::Event, m_SendPacketID); package.AddString(m_NextSnapshot.InputRight); diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index cffb0d81..ac1ec43e 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -300,6 +300,7 @@ void Server::ParseEvent(char * data, size_t length) return; unsigned int entityId = m_PlayerDefinitions[i].EntityID; + std::string templalala = std::string(data); if ("+Forward" == std::string(data)) { m_World->GetComponent(entityId, "Player")["Forward"] = true; diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index 13c4096a..6c7e8311 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -3,16 +3,16 @@ void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, double dt) { (glm::vec3)player["Velocity"] = glm::vec3(0.f, 0.f, 0.f); - if (player["Forward"]) { + if (static_cast(player["Forward"])== true) { ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1; } - if (player["Left"]) { + if (static_cast(player["Left"]) == true) { ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt) * -1; } - if (player["Back"]) { + if (static_cast(player["Back"]) == true) { ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt); } - if (player["Right"]) { + if (static_cast(player["Right"]) == true) { ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt); } From e74b2b68747c4c4438fb6ff0cd222313143768e4 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 16 Dec 2015 10:40:40 +0100 Subject: [PATCH 38/60] Made it easier for non network members to create packages and extract information from them by addin PopFrontString() and PopFrontPrimitive(). --- src/Engine/Network/Client.cpp | 51 ++++++++++++++-------------------- src/Engine/Network/Package.cpp | 4 +-- src/Engine/Network/Server.cpp | 6 ++-- 3 files changed, 27 insertions(+), 34 deletions(-) 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); } From 50ccf962682048f4e69e3ca6ec6525ad549c7d55 Mon Sep 17 00:00:00 2001 From: stiffly Date: Wed, 16 Dec 2015 13:52:16 +0100 Subject: [PATCH 39/60] Movement code not buggy anymore. Also changed package to not allocate more data than needed. --- include/Engine/Network/Package.h | 4 ++-- src/Engine/Network/Package.cpp | 4 +++- src/Game/PlayerSystem.cpp | 10 +++++----- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/include/Engine/Network/Package.h b/include/Engine/Network/Package.h index 49118b6e..a7b3c126 100644 --- a/include/Engine/Network/Package.h +++ b/include/Engine/Network/Package.h @@ -13,7 +13,7 @@ public: // arg2: PackageID for identifying packet loss. Package(MessageType type, unsigned int& packageID); // Used to create package from already existing data buffer. - Package(char* data, int sizeOfPackage); + Package(char* data, const int sizeOfPackage); ~Package(); // Add primitive types like int, float, char... template @@ -43,7 +43,7 @@ public: char* Data() { return m_Data; }; private: - char* m_Data = new char[128]; + char* m_Data; unsigned int m_ReturnDataOffset = 0; int m_Offset = 0; }; diff --git a/src/Engine/Network/Package.cpp b/src/Engine/Network/Package.cpp index 729276a3..a30d3ee5 100644 --- a/src/Engine/Network/Package.cpp +++ b/src/Engine/Network/Package.cpp @@ -2,6 +2,7 @@ Package::Package(MessageType type, unsigned int& packageID) { + m_Data = new char[128]; // Create message header // Add message type int messageType = static_cast(type); @@ -12,9 +13,10 @@ Package::Package(MessageType type, unsigned int& packageID) } -Package::Package(char* data, int sizeOfPackage) +Package::Package(char* data, const int sizeOfPackage) { // Create message + m_Data = new char[sizeOfPackage]; memcpy(m_Data, data, sizeOfPackage); m_Offset = sizeOfPackage; } diff --git a/src/Game/PlayerSystem.cpp b/src/Game/PlayerSystem.cpp index 6c7e8311..f10dba28 100644 --- a/src/Game/PlayerSystem.cpp +++ b/src/Game/PlayerSystem.cpp @@ -2,17 +2,17 @@ void PlayerSystem::UpdateComponent(World * world, ComponentWrapper & player, double dt) { - (glm::vec3)player["Velocity"] = glm::vec3(0.f, 0.f, 0.f); - if (static_cast(player["Forward"])== true) { + player["Velocity"] = glm::vec3(0.f, 0.f, 0.f); + if ((bool&)player["Forward"] == true) { ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt) * -1; } - if (static_cast(player["Left"]) == true) { + if ((bool&)player["Left"] == true) { ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt) * -1; } - if (static_cast(player["Back"]) == true) { + if ((bool&)player["Back"] == true) { ((glm::vec3&)player["Velocity"]).z = m_Speed * float(dt); } - if (static_cast(player["Right"]) == true) { + if ((bool&)player["Right"] == true) { ((glm::vec3&)player["Velocity"]).x = m_Speed * float(dt); } From 58a9d38e266344776aeda44fccbdb512b9aea4b9 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 16 Dec 2015 14:56:53 +0100 Subject: [PATCH 40/60] Added a class that client and server inherits from. Class and server now share the same pointer i game. You are now able to start a client and a server on the same computer. --- include/Engine/Network/Client.h | 4 ++-- include/Engine/Network/Network.h | 19 +++++++++++++++ include/Engine/Network/Server.h | 3 ++- include/Game/Game.h | 6 ++--- src/Engine/Network/Client.cpp | 2 +- src/Engine/Network/Network.cpp | 13 +++++++++++ src/Game/Game.cpp | 40 +++++++++++++++++++------------- 7 files changed, 64 insertions(+), 23 deletions(-) create mode 100644 include/Engine/Network/Network.h create mode 100644 src/Engine/Network/Network.cpp diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 80958142..21f6ec61 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -17,9 +17,9 @@ #include "Core/EKeyDown.h" #include "Core/EKeyUp.h" #include "Input/EInputCommand.h" +#include "Network/Network.h" - -class Client +class Client : public Network { public: Client(); diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h new file mode 100644 index 00000000..e3b9c1ce --- /dev/null +++ b/include/Engine/Network/Network.h @@ -0,0 +1,19 @@ +#ifndef Network_h__ +#define Network_h__ + +#include "Core/World.h" +#include "Core/EventBroker.h" +#include "Network/Package.h" + +class Network +{ +public: + Network(); + ~Network(); + virtual void Start(World* m_world, EventBroker *eventBroker); + virtual void Update(); +protected: + +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index a9ddceb0..fb49e707 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -14,8 +14,9 @@ #include "Core/World.h" #include "Core/EventBroker.h" #include "Game/ECreatePlayer.h" +#include "Network/Network.h" -class Server +class Server : public Network { public: Server(); diff --git a/include/Game/Game.h b/include/Game/Game.h index 2ff1d770..1b8f9bcf 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -21,6 +21,7 @@ // Network #include +#include "Network/Network.h" #include "Network/Server.h" #include "Network/Client.h" @@ -50,9 +51,8 @@ private: // Network methods void NetworkFunction(); - Client m_Client; - Server m_Server; - bool m_IsClient = false; + Network* m_ClientOrServer; + bool m_IsClientOrServer = false; EventRelay m_EInputCommand; bool debugOnInputCommand(const Events::InputCommand& e); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 01bc9cba..a4199b8e 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -5,8 +5,8 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { - // Set up network stream m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); + // Set up network stream m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; } diff --git a/src/Engine/Network/Network.cpp b/src/Engine/Network/Network.cpp new file mode 100644 index 00000000..51a93407 --- /dev/null +++ b/src/Engine/Network/Network.cpp @@ -0,0 +1,13 @@ +#include "Network/Network.h" + +Network::Network() +{ } + +Network::~Network() +{ } + +void Network::Start(World * m_world, EventBroker * eventBroker) +{ } + +void Network::Update() +{ } \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index a242f64d..6080b8f5 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -20,7 +20,7 @@ Game::Game(int argc, char* argv[]) m_Renderer = new Renderer(m_EventBroker); m_Renderer->SetFullscreen(m_Config->Get("Video.Fullscreen", false)); m_Renderer->SetVSYNC(m_Config->Get("Video.VSYNC", false)); - m_Renderer->SetResolution(Rectangle::Rectangle( + m_Renderer->SetResolution(Rectangle::Rectangle( 0, 0, m_Config->Get("Video.Width", 1280), @@ -53,9 +53,9 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(); - // Invoke network - if(m_Config->Get("Networking.StartNetwork", false) == true) - boost::thread workerThread(&Game::NetworkFunction, this); + // Invoke network + if (m_Config->Get("Networking.StartNetwork", false) == true) + boost::thread workerThread(&Game::NetworkFunction, this); m_LastTime = glfwGetTime(); debugInitialize(); @@ -90,7 +90,9 @@ void Game::Tick() m_EventBroker->Swap(); // Update network - m_IsClient ? m_Client.Update() : m_Server.Update(); + if (m_IsClientOrServer) + m_ClientOrServer->Update(); + // Iterate through systems and update world! m_SystemPipeline->Update(m_World, dt); @@ -133,16 +135,22 @@ void Game::debugTick(double dt) } void Game::NetworkFunction() -{ - std::string inputMessage; - std::cout << "Start client or server? (c/s)" << std::endl; - std::cin >> inputMessage; - if (inputMessage == "c" || inputMessage == "C") { - m_IsClient = true; - m_Client.Start(m_World, m_EventBroker); - } - if (inputMessage == "s" || inputMessage == "S") { - m_IsClient = false; - m_Server.Start(m_World, m_EventBroker); +{ + std::string inputMessage; + std::cout << "Start client or server? (c/s)" << std::endl; + std::cin >> inputMessage; + if (inputMessage == "c" || inputMessage == "C") { + m_IsClientOrServer = true; + m_ClientOrServer = new Client(); } + if (inputMessage == "s" || inputMessage == "S") { + m_IsClientOrServer = true; + m_ClientOrServer = new Server(); + } + m_ClientOrServer->Start(m_World, m_EventBroker); + // I don't think we are reaching this part of the code right now. + // When server or client is done set it to false. + m_IsClientOrServer = false; + // Destroy it! (with fire) + delete m_ClientOrServer; } \ No newline at end of file From 6da5fd1263a8c831fe3a87811412ee73d05f13b0 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 16 Dec 2015 15:47:51 +0100 Subject: [PATCH 41/60] Restructured code and added bool to stop client from spamming Snapshots to a server when it wasn't connected to one. --- include/Engine/Network/Client.h | 52 ++++++++++++++++----------------- include/Engine/Network/Server.h | 2 +- src/Engine/Network/Client.cpp | 7 ++++- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 21f6ec61..00d05a94 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -27,57 +27,57 @@ public: void Start(World* world, EventBroker* eventBroker); void Update(); void Close(); -private: - void ReadFromServer(); - void SendSnapshotToServer(); - int Receive(char* data, size_t length); - void Send(Package& message); - int CreateMessage(MessageType type, std::string message, char* data); - void Connect(); - void Disconnect(); - void Ping(); - void MoveMessageHead(char*& data, size_t& length, size_t stepSize); - void ParseMessageType(Package& package); - void ParseEventMessage(Package& package); - void ParseConnect(Package& package); - void ParsePing(); - void ParseServerPing(); - void ParseSnapshot(Package& package); - void CreateNewPlayer(int i); - void IdentifyPacketLoss(); +private: // udp stuff boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::io_service m_IOService; boost::asio::ip::udp::socket m_Socket; - + //Connection logic + bool m_IsConnected = false; // Packet loss logic unsigned int m_PacketID = 0; unsigned int m_PreviousPacketID = 0; unsigned int m_SendPacketID = 0; - // Game Logic + glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; + PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; std::vector m_PlayersToCreate; - - World* m_World; - int m_PlayerID = -1; - glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; - PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; SnapshotDefinitions m_NextSnapshot; std::clock_t m_StartPingTime; double m_DurationOfPingTime; std::string m_PlayerName; bool m_ThreadIsRunning = true; + int m_PlayerID = -1; + World* m_World; // Use to check if we should send disconnect message // if game is turned of by closing window. bool m_WasStarted = false; IsWASDKeyDown m_IsWASDKeyDown; - // Events EventBroker* m_EventBroker; EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand &e); + + // Network functions + void ReadFromServer(); + void SendSnapshotToServer(); + int Receive(char* data, size_t length); + void Send(Package& message); + int CreateMessage(MessageType type, std::string message, char* data); + void Connect(); + void Disconnect(); + void Ping(); + void MoveMessageHead(char*& data, size_t& length, size_t stepSize); + void ParseMessageType(Package& package); + void ParseEventMessage(Package& package); + void ParseConnect(Package& package); + void ParsePing(); + void ParseServerPing(); + void ParseSnapshot(Package& package); + void CreateNewPlayer(int i); + void IdentifyPacketLoss(); }; #endif diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index fb49e707..65a69bba 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -50,7 +50,7 @@ private: void ReadFromClients(); void InputLoop(); - + // Network functions int Receive(char* data, size_t length); void Send(Package& package, int playerID); void Send(Package& package); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index a4199b8e..b980bfde 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -56,6 +56,7 @@ void Client::Close() if (m_WasStarted) { Disconnect(); m_ThreadIsRunning = false; + m_IsConnected = false; m_EventBroker->Unsubscribe(m_EInputCommand); } } @@ -78,7 +79,9 @@ void Client::ReadFromServer() } std::clock_t currentTime = std::clock(); if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - SendSnapshotToServer(); + if (m_IsConnected) { + SendSnapshotToServer(); + } previousSnapshotMessage = currentTime; } } @@ -168,6 +171,7 @@ void Client::ParseConnect(Package& package) m_PacketID = package.PopFrontPrimitive(); m_PreviousPacketID = m_PacketID; m_PlayerID = package.PopFrontPrimitive(); + m_IsConnected = true; std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; } @@ -267,6 +271,7 @@ void Client::Connect() void Client::Disconnect() { + m_IsConnected = false; Package message(MessageType::Connect, m_SendPacketID); message.AddString("+Disconnect"); Send(message); From 425f3ca3dd7bbb89ac4f65c88876f55e0f37701a Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 16 Dec 2015 16:49:18 +0100 Subject: [PATCH 42/60] Fixed "trying to read more than package size" warnings. --- src/Engine/Network/Client.cpp | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index b980bfde..52037577 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -38,7 +38,7 @@ void Client::Start(World* world, EventBroker* eventBroker) } void Client::Update() -{ +{ while (m_PlayersToCreate.size() > 0) { unsigned int i = m_PlayersToCreate.size() - 1; unsigned int tempID = m_World->CreateEntity(); @@ -117,7 +117,7 @@ void Client::SendSnapshotToServer() package.AddString("0Forward"); Send(package); } - + if (m_NextSnapshot.InputRight != "") { @@ -168,8 +168,6 @@ void Client::ParseMessageType(Package& package) void Client::ParseConnect(Package& package) { - m_PacketID = package.PopFrontPrimitive(); - m_PreviousPacketID = m_PacketID; m_PlayerID = package.PopFrontPrimitive(); m_IsConnected = true; std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; @@ -210,7 +208,7 @@ void Client::ParseSnapshot(Package& package) // We're checking for empty name for now. This might not be the best way, // but it is to avoid sending redundant data. tempName = package.PopFrontString(); - + // Apply the position data read to the player entity // New player connected on the server side @@ -225,13 +223,13 @@ void Client::ParseSnapshot(Package& package) // 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 if (m_PlayerDefinitions[i].EntityID != -1) { + // 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; } } @@ -296,8 +294,7 @@ bool Client::OnInputCommand(const Events::InputCommand & e) if (e.Command == "Forward") { if (e.Value > 0) { m_IsWASDKeyDown.W = true; - } - else if (e.Value < 0) { + } else if (e.Value < 0) { m_IsWASDKeyDown.S = true; } else { m_IsWASDKeyDown.W = false; @@ -333,6 +330,6 @@ void Client::IdentifyPacketLoss() // if no packets lost, difference should be equal to 1 int difference = m_PacketID - m_PreviousPacketID; if (difference != 1) { - LOG_INFO("%i Packet(s) were lost...", difference); + LOG_INFO("%i Packet(s) were lost...", difference); } } From 97a0d97b0b4141cd98aac16cd99b40e9696f3dd4 Mon Sep 17 00:00:00 2001 From: stiffly Date: Wed, 16 Dec 2015 17:56:44 +0100 Subject: [PATCH 43/60] Can now send transform components. --- include/Engine/Network/Package.h | 5 +++++ src/Engine/Network/Client.cpp | 19 +++++++++++-------- src/Engine/Network/Package.cpp | 16 ++++++++++++++++ src/Engine/Network/Server.cpp | 15 ++++++++------- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/include/Engine/Network/Package.h b/include/Engine/Network/Package.h index a7b3c126..9b45101d 100644 --- a/include/Engine/Network/Package.h +++ b/include/Engine/Network/Package.h @@ -14,6 +14,7 @@ public: Package(MessageType type, unsigned int& packageID); // Used to create package from already existing data buffer. Package(char* data, const int sizeOfPackage); + ~Package(); // Add primitive types like int, float, char... template @@ -35,9 +36,13 @@ public: m_ReturnDataOffset += sizeof(T); return returnValue; } + // Add a string to the message void AddString(std::string str); + // Add data to the message + void AddData(char* data, int sizeOfData); // Pops the first element as if it was a string. std::string PopFrontString(); + char* PopData(int SizeOfData); int Size() { return m_Offset; }; char* Data() { return m_Data; }; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index a4199b8e..9c16b6e9 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -5,7 +5,7 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); // Set up network stream m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; @@ -165,8 +165,6 @@ void Client::ParseMessageType(Package& package) void Client::ParseConnect(Package& package) { - m_PacketID = package.PopFrontPrimitive(); - m_PreviousPacketID = m_PacketID; m_PlayerID = package.PopFrontPrimitive(); std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; } @@ -222,13 +220,18 @@ void Client::ParseSnapshot(Package& package) break; } // Read position data - glm::vec3 playerPos; - playerPos.x = package.PopFrontPrimitive(); - playerPos.y = package.PopFrontPrimitive(); - playerPos.z = package.PopFrontPrimitive(); + //glm::vec3 playerPos; + //playerPos.x = package.PopFrontPrimitive(); + //playerPos.y = package.PopFrontPrimitive(); + //playerPos.z = package.PopFrontPrimitive(); + + + // Move player to server position if (m_PlayerDefinitions[i].EntityID != -1) { - m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; + //m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; + int dataSize = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform").Info.Meta.Stride; + memcpy(m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform").Data, package.PopData(dataSize), dataSize); } } } diff --git a/src/Engine/Network/Package.cpp b/src/Engine/Network/Package.cpp index a30d3ee5..43c28837 100644 --- a/src/Engine/Network/Package.cpp +++ b/src/Engine/Network/Package.cpp @@ -33,6 +33,15 @@ void Package::AddString(std::string str) m_Offset += (str.size() + 1) * sizeof(char); } +void Package::AddData(char * data, int sizeOfData) +{ + if (m_Offset + sizeOfData > 128) { + LOG_WARNING("Package::AddData(): Data size in package exceeded maximum package size.\n"); + } + memcpy(m_Data + m_Offset, data, sizeOfData); + m_Offset += sizeOfData; +} + std::string Package::PopFrontString() { std::string returnValue(m_Data + m_ReturnDataOffset); @@ -44,3 +53,10 @@ std::string Package::PopFrontString() m_ReturnDataOffset += returnValue.size() + 1; return returnValue; } + +char * Package::PopData(int SizeOfData) +{ + unsigned int oldReturnDataOffset = m_ReturnDataOffset; + m_ReturnDataOffset += SizeOfData; + return (m_Data + oldReturnDataOffset); +} diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 3d9d171a..d1d0c4c7 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -229,13 +229,14 @@ void Server::SendSnapshot() continue; } - - // Pack player pos into data package - glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; - //glm::vec3 playerPos = glm::vec3(1.0f); - package.AddPrimitive(playerPos.x); - package.AddPrimitive(playerPos.y); - package.AddPrimitive(playerPos.z); + //// Pack player pos into data package + //glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; + ////glm::vec3 playerPos = glm::vec3(1.0f); + //package.AddPrimitive(playerPos.x); + //package.AddPrimitive(playerPos.y); + //package.AddPrimitive(playerPos.z); + auto transform = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform"); + package.AddData(transform.Data, transform.Info.Meta.Stride); } Broadcast(package); } From 4c29e071af1bfa04c1722179df77117e23d2db34 Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 17 Dec 2015 10:47:08 +0100 Subject: [PATCH 44/60] Cleaned code --- include/Engine/Network/Client.h | 73 ++++++++++++++++----------------- src/Engine/Network/Client.cpp | 17 ++++---- 2 files changed, 43 insertions(+), 47 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 21f6ec61..415a8847 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -5,7 +5,6 @@ #include #include -#include // For input event #include "Network/MessageType.h" #include "Network/NetworkDefinitions.h" @@ -14,68 +13,66 @@ #include "Network/WinLeakCheck.h" #include "Core/World.h" #include "Core/EventBroker.h" -#include "Core/EKeyDown.h" -#include "Core/EKeyUp.h" #include "Input/EInputCommand.h" #include "Network/Network.h" class Client : public Network { public: - Client(); - ~Client(); - void Start(World* world, EventBroker* eventBroker); + Client(); + ~Client(); + void Start(World* world, EventBroker* eventBroker); void Update(); void Close(); private: - void ReadFromServer(); - void SendSnapshotToServer(); + void ReadFromServer(); + void SendSnapshotToServer(); - int Receive(char* data, size_t length); - void Send(Package& message); - int CreateMessage(MessageType type, std::string message, char* data); + int Receive(char* data, size_t length); + void Send(Package& message); void Connect(); void Disconnect(); void Ping(); - void MoveMessageHead(char*& data, size_t& length, size_t stepSize); - void ParseMessageType(Package& package); - void ParseEventMessage(Package& package); - void ParseConnect(Package& package); - void ParsePing(); - void ParseServerPing(); - void ParseSnapshot(Package& package); - void CreateNewPlayer(int i); - void IdentifyPacketLoss(); + void MoveMessageHead(char*& data, size_t& length, size_t stepSize); + void ParseMessageType(Package& package); + void ParseEventMessage(Package& package); + void ParseConnect(Package& package); + void ParsePing(); + void ParseServerPing(); + void ParseSnapshot(Package& package); + void CreateNewPlayer(int i); + void IdentifyPacketLoss(); - // udp stuff - boost::asio::ip::udp::endpoint m_ReceiverEndpoint; - boost::asio::io_service m_IOService; - boost::asio::ip::udp::socket m_Socket; + // UDP logic + boost::asio::ip::udp::endpoint m_ReceiverEndpoint; + boost::asio::io_service m_IOService; + boost::asio::ip::udp::socket m_Socket; - // Packet loss logic + // Packet loss logic unsigned int m_PacketID = 0; - unsigned int m_PreviousPacketID = 0; + unsigned int m_PreviousPacketID = 0; unsigned int m_SendPacketID = 0; - // Game Logic + // Game logic + World* m_World; std::vector m_PlayersToCreate; + glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; + std::string m_PlayerName; + int m_PlayerID = -1; + IsWASDKeyDown m_IsWASDKeyDown; - World* m_World; - int m_PlayerID = -1; - glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; - PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; - SnapshotDefinitions m_NextSnapshot; - std::clock_t m_StartPingTime; - double m_DurationOfPingTime; - std::string m_PlayerName; + // Network logic + PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; + SnapshotDefinitions m_NextSnapshot; bool m_ThreadIsRunning = true; + double m_DurationOfPingTime; + std::clock_t m_StartPingTime; // Use to check if we should send disconnect message // if game is turned of by closing window. bool m_WasStarted = false; - IsWASDKeyDown m_IsWASDKeyDown; - // Events - EventBroker* m_EventBroker; + // Events + EventBroker* m_EventBroker; EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand &e); }; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 9c16b6e9..29b7ddde 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -5,7 +5,7 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); // Set up network stream m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; @@ -38,7 +38,7 @@ void Client::Start(World* world, EventBroker* eventBroker) } void Client::Update() -{ +{ while (m_PlayersToCreate.size() > 0) { unsigned int i = m_PlayersToCreate.size() - 1; unsigned int tempID = m_World->CreateEntity(); @@ -114,7 +114,7 @@ void Client::SendSnapshotToServer() package.AddString("0Forward"); Send(package); } - + if (m_NextSnapshot.InputRight != "") { @@ -204,7 +204,7 @@ void Client::ParseSnapshot(Package& package) // We're checking for empty name for now. This might not be the best way, // but it is to avoid sending redundant data. tempName = package.PopFrontString(); - + // Apply the position data read to the player entity // New player connected on the server side @@ -225,7 +225,7 @@ void Client::ParseSnapshot(Package& package) //playerPos.y = package.PopFrontPrimitive(); //playerPos.z = package.PopFrontPrimitive(); - + // Move player to server position if (m_PlayerDefinitions[i].EntityID != -1) { @@ -294,8 +294,7 @@ bool Client::OnInputCommand(const Events::InputCommand & e) if (e.Command == "Forward") { if (e.Value > 0) { m_IsWASDKeyDown.W = true; - } - else if (e.Value < 0) { + } else if (e.Value < 0) { m_IsWASDKeyDown.S = true; } else { m_IsWASDKeyDown.W = false; @@ -312,7 +311,7 @@ bool Client::OnInputCommand(const Events::InputCommand & e) m_IsWASDKeyDown.D = false; } } - if (e.Command == "Sprint") { // Temp connect + if (e.Command == "Sprint") { // Connect for now Connect(); } return false; @@ -331,6 +330,6 @@ void Client::IdentifyPacketLoss() // if no packets lost, difference should be equal to 1 int difference = m_PacketID - m_PreviousPacketID; if (difference != 1) { - LOG_INFO("%i Packet(s) were lost...", difference); + LOG_INFO("%i Packet(s) were lost...", difference); } } From ba831f8a3c38c94d42ec9ab4814a837eb8acb8db Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 17 Dec 2015 10:59:55 +0100 Subject: [PATCH 45/60] WIP Cleaning --- include/Engine/Network/Client.h | 1 - src/Engine/Network/Client.cpp | 33 ++++++++++++++++++--------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 415a8847..025a1259 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -59,7 +59,6 @@ private: glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; std::string m_PlayerName; int m_PlayerID = -1; - IsWASDKeyDown m_IsWASDKeyDown; // Network logic PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 29b7ddde..c2c486ab 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -5,7 +5,7 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); // Set up network stream m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; @@ -89,19 +89,23 @@ void Client::SendSnapshotToServer() // Reset previouse key state in snapshot. m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; + + auto player = m_World->GetComponent(m_PlayerDefinitions[m_PlayerID].EntityID, "Player"); + + // See if any movement keys are down // We dont care if it's overwritten by later // if statement. Watcha gonna do, right! - if (m_IsWASDKeyDown.W) { + if (player["Forward"]) { m_NextSnapshot.InputForward = "+Forward"; } - if (m_IsWASDKeyDown.A) { + if (player["Left"]) { m_NextSnapshot.InputRight = "-Right"; } - if (m_IsWASDKeyDown.S) { + if (player["Back"]) { m_NextSnapshot.InputForward = "-Forward"; } - if (m_IsWASDKeyDown.D) { + if (player["Right"]) { m_NextSnapshot.InputRight = "+Right"; } @@ -115,8 +119,6 @@ void Client::SendSnapshotToServer() Send(package); } - - if (m_NextSnapshot.InputRight != "") { Package package(MessageType::Event, m_SendPacketID); package.AddString(m_NextSnapshot.InputRight); @@ -291,24 +293,25 @@ void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) bool Client::OnInputCommand(const Events::InputCommand & e) { + ComponentWrapper& player = m_World->GetComponent(m_PlayerDefinitions[m_PlayerID].EntityID, "Player"); if (e.Command == "Forward") { if (e.Value > 0) { - m_IsWASDKeyDown.W = true; + (bool&)player["Forward"] = true; } else if (e.Value < 0) { - m_IsWASDKeyDown.S = true; + (bool&)player["Back"] = true; } else { - m_IsWASDKeyDown.W = false; - m_IsWASDKeyDown.S = false; + (bool&)player["Forward"] = false; + (bool&)player["Back"] = false; } } if (e.Command == "Right") { if (e.Value > 0) { - m_IsWASDKeyDown.D = true; + (bool&)player["Right"] = true; } else if (e.Value < 0) { - m_IsWASDKeyDown.A = true; + (bool&)player["Left"] = true; } else { - m_IsWASDKeyDown.A = false; - m_IsWASDKeyDown.D = false; + (bool&)player["Left"] = false; + (bool&)player["Right"] = false; } } if (e.Command == "Sprint") { // Connect for now From 4bb4e2951510528611c82a801e5cd52f9b02ae9a Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 17 Dec 2015 13:23:15 +0100 Subject: [PATCH 46/60] More cleaning code --- include/Engine/Network/Client.h | 39 ++++++------ include/Engine/Network/Server.h | 16 +++-- src/Engine/Network/Client.cpp | 31 ++++----- src/Engine/Network/Server.cpp | 108 ++++++++------------------------ src/Game/Game.cpp | 2 +- 5 files changed, 68 insertions(+), 128 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index ce71b1b1..24b59b59 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -25,25 +25,6 @@ public: void Update(); void Close(); private: - void ReadFromServer(); - void SendSnapshotToServer(); - - int Receive(char* data, size_t length); - void Send(Package& message); - void Connect(); - void Disconnect(); - void Ping(); - void MoveMessageHead(char*& data, size_t& length, size_t stepSize); - void ParseMessageType(Package& package); - void ParseEventMessage(Package& package); - void ParseConnect(Package& package); - void ParsePing(); - void ParseServerPing(); - void ParseSnapshot(Package& package); - void CreateNewPlayer(int i); - void IdentifyPacketLoss(); - bool IsConnected(); - // UDP logic boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::io_service m_IOService; @@ -75,6 +56,26 @@ private: EventBroker* m_EventBroker; EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand &e); + + void ReadFromServer(); + void SendSnapshotToServer(); + + int Receive(char* data, size_t length); + void Send(Package& message); + void Connect(); + void Disconnect(); + void Ping(); + void MoveMessageHead(char*& data, size_t& length, size_t stepSize); + void ParseMessageType(Package& package); + void ParseEventMessage(Package& package); + void ParseConnect(Package& package); + void ParsePing(); + void ParseServerPing(); + void ParseSnapshot(Package& package); + void CreateNewPlayer(int i); + void IdentifyPacketLoss(); + bool IsConnected(); + }; #endif diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 65a69bba..eb625b0d 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -4,8 +4,6 @@ #include #include -#include -#include #include #include "Network/MessageType.h" @@ -13,7 +11,6 @@ #include "Network/PlayerDefinition.h" #include "Core/World.h" #include "Core/EventBroker.h" -#include "Game/ECreatePlayer.h" #include "Network/Network.h" class Server : public Network @@ -26,32 +23,33 @@ public: void Close(); private: - // udp stuff + // UDP logic boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::io_service m_IOService; boost::asio::ip::udp::socket m_Socket; PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; + //Timers std::clock_t m_StartPingTime; std::clock_t m_StopTimes[8]; + // Game logic World* m_World; EventBroker* m_EventBroker; - // size = players to create, stores playerID + // size = ammount of players to create, stores playerID's std::vector m_PlayersToCreate; + // Packet loss logic unsigned int m_PacketID; unsigned int m_PreviousPacketID; unsigned int m_SendPacketID; + // Close logic bool m_ThreadIsRunning = true; - // Threaded - void DisplayLoop(); - void ReadFromClients(); - void InputLoop(); // Network functions int Receive(char* data, size_t length); + void ReadFromClients(); void Send(Package& package, int playerID); void Send(Package& package); void MoveMessageHead(char*& data, size_t& length, size_t stepSize); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index dd0a02bb..bc727e49 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -26,14 +26,15 @@ void Client::Start(World* world, EventBroker* eventBroker) // Subscribe to events m_EInputCommand = decltype(m_EInputCommand)(std::bind(&Client::OnInputCommand, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EInputCommand); - std::cout << "Please enter you name: "; + + LOG_INFO("Please enter your name: "); std::cin >> m_PlayerName; while (m_PlayerName.size() > 7) { - std::cout << "Please enter you name(No longer than 7 characters): "; + LOG_INFO("Please enter your name (No longer than 7 characters):"); std::cin >> m_PlayerName; } m_Socket.connect(m_ReceiverEndpoint); - std::cout << "I am client. BIP BOP\n"; + LOG_INFO("I am client. BIP BOP"); ReadFromServer(); } @@ -170,13 +171,13 @@ void Client::ParseMessageType(Package& package) void Client::ParseConnect(Package& package) { m_PlayerID = package.PopFrontPrimitive(); - std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; + LOG_INFO("%i: I am player: %i", m_PacketID, m_PlayerID); } void Client::ParsePing() { m_DurationOfPingTime = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); - std::cout << m_PacketID << ": response time with ctime(ms): " << m_DurationOfPingTime << std::endl; + LOG_INFO("%i: response time with ctime(ms): %f", m_PacketID, m_DurationOfPingTime); } void Client::ParseServerPing() @@ -184,7 +185,6 @@ void Client::ParseServerPing() Package message(MessageType::ServerPing, m_SendPacketID); message.AddString("Ping recieved"); Send(message); - //std::cout << "Parsing ping." << std::endl; } void Client::ParseEventMessage(Package& package) @@ -196,13 +196,12 @@ void Client::ParseEventMessage(Package& package) // Sett Player name m_PlayerDefinitions[Id].Name = command.erase(0, 7); } else { - std::cout << m_PacketID << ": Event message: " << command << std::endl; + LOG_INFO("%i: Event message: %s", m_PacketID, command); } } 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, @@ -224,16 +223,8 @@ void Client::ParseSnapshot(Package& package) break; } if (m_PlayerDefinitions[i].EntityID != -1) { - // 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; int dataSize = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform").Info.Meta.Stride; memcpy(m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform").Data, package.PopData(dataSize), dataSize); } @@ -250,7 +241,7 @@ int Client::Receive(char* data, size_t length) 0, error); if (error) { - std::cout << "ReadFromServer crashed: " << error.message(); + LOG_ERROR("ReadFromServer: %s", error.message()); } return bytesReceived; @@ -295,13 +286,15 @@ void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) bool Client::OnInputCommand(const Events::InputCommand & e) { - if (m_PlayerID != -1) { + if (IsConnected()) { ComponentWrapper& player = m_World->GetComponent(m_PlayerDefinitions[m_PlayerID].EntityID, "Player"); if (e.Command == "Forward") { if (e.Value > 0) { (bool&)player["Forward"] = true; + (bool&)player["Back"] = false; } else if (e.Value < 0) { (bool&)player["Back"] = true; + (bool&)player["Forward"] = false; } else { (bool&)player["Forward"] = false; (bool&)player["Back"] = false; @@ -310,8 +303,10 @@ bool Client::OnInputCommand(const Events::InputCommand & e) if (e.Command == "Right") { if (e.Value > 0) { (bool&)player["Right"] = true; + (bool&)player["Left"] = false; } else if (e.Value < 0) { (bool&)player["Left"] = true; + (bool&)player["Right"] = false; } else { (bool&)player["Left"] = false; (bool&)player["Right"] = false; diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index d1d0c4c7..e66c0680 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -14,15 +14,9 @@ void Server::Start(World* world, EventBroker* eventBroker) for (size_t i = 0; i < MAXCONNECTIONS; i++) { m_StopTimes[i] = std::clock(); } - boost::thread_group threads; + LOG_INFO("I am Server. BIP BOP\n"); - std::cout << "I am Server. BIP BOP\n"; - - threads.create_thread(boost::bind(&Server::DisplayLoop, this)); - threads.create_thread(boost::bind(&Server::ReadFromClients, this)); - threads.create_thread(boost::bind(&Server::InputLoop, this)); - - threads.join_all(); + ReadFromClients(); } void Server::Update() @@ -46,45 +40,35 @@ void Server::Close() m_ThreadIsRunning = false; } -void Server::DisplayLoop() -{ - -} - void Server::ReadFromClients() { - char readBuf[1024] = { 0 }; + 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 intervallMs = 1000; + int intervalMs = 1000; int snapshotInterval = 50; - int timeToCheckTimeOutTime = 100; + int checkTimeOutInterval = 100; while (m_ThreadIsRunning) { // m_ThreadIsRunning might be unnecessary but the // program crashed if it executed m_Socket.available() // when closing the program. - // If available message -> Socket.available() = true if (m_ThreadIsRunning && m_Socket.available()) { try { - bytesRead = Receive(readBuf, INPUTSIZE); - Package package(readBuf, bytesRead); + bytesRead = Receive(readBuffer, INPUTSIZE); + Package package(readBuffer, bytesRead); ParseMessageType(package); } catch (const std::exception& err) { - // To not spam "socket closed messages" - //if (std::string(err.what()).find("forcefully closed") != std::string::npos) { - std::cout << m_PacketID << ": Read from client crashed: " << err.what(); - //} + LOG_ERROR("%i: Read from client crashed %s", m_PacketID, err.what()); } } std::clock_t currentTime = std::clock(); - // int tempTestRemovePlz = (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC); // Send snapshot if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { SendSnapshot(); @@ -92,44 +76,19 @@ void Server::ReadFromClients() } // Send pings each - if (intervallMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { + if (intervalMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { SendPing(); previousePingMessage = currentTime; } // Time out logic - if (timeToCheckTimeOutTime < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { + if (checkTimeOutInterval < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { CheckForTimeOuts(); timOutTimer = currentTime; } } } -void Server::InputLoop() -{ - char inputBuffer[INPUTSIZE] = { 0 }; - std::string inputMessage; - - while (m_ThreadIsRunning) { - std::cin.getline(inputBuffer, INPUTSIZE); - inputMessage = (std::string)inputBuffer; - - if (!inputMessage.empty()) { - try { - // Broadcast message typed in console - Broadcast(inputMessage); - - } catch (const std::exception& err) { - std::cout << m_PacketID << ": Read from WriteLoop crashed: " << err.what(); - } - } - if (inputMessage.find("exit") != std::string::npos) - exit(1); - inputMessage.clear(); - memset(inputBuffer, 0, INPUTSIZE); - } -} - void Server::ParseMessageType(Package& package) { int messageType = package.PopFrontPrimitive(); // Read what type off message was sent from server @@ -137,7 +96,7 @@ void Server::ParseMessageType(Package& package) // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id m_PacketID = package.PopFrontPrimitive(); //Read new packet id - //IdentifyPacketLoss(); + IdentifyPacketLoss(); switch (static_cast(messageType)) { case MessageType::Connect: ParseConnect(package); @@ -221,22 +180,16 @@ 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; } - - //// Pack player pos into data package - //glm::vec3 playerPos = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"]; - ////glm::vec3 playerPos = glm::vec3(1.0f); - //package.AddPrimitive(playerPos.x); - //package.AddPrimitive(playerPos.y); - //package.AddPrimitive(playerPos.z); + // Pack transfrom component into data package auto transform = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform"); - package.AddData(transform.Data, transform.Info.Meta.Stride); + package.AddData(transform.Data, transform.Info.Meta.Stride); } Broadcast(package); } @@ -245,9 +198,10 @@ void Server::SendPing() { // Prints connected players ping for (size_t i = 0; i < MAXCONNECTIONS; i++) { - if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) - std::cout << m_PacketID << ": Player " << i << "'s ping: " << 1000 * (m_StopTimes[i] - m_StartPingTime) - / static_cast(CLOCKS_PER_SEC) << std::endl; + if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { + int ping = 1000 * (m_StopTimes[i] - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); + LOG_INFO("%i: Player %i's ping: %i", m_PacketID, i, ping); + } } // Create ping message @@ -262,15 +216,15 @@ void Server::SendPing() void Server::CheckForTimeOuts() { int timeOutTimeMs = 5000; - int tempStartPing = 1000 * m_StartPingTime + int startPing = 1000 * m_StartPingTime / static_cast(CLOCKS_PER_SEC); for (size_t i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { - int tempStopPing = 1000 * m_StopTimes[i] + int stopPing = 1000 * m_StopTimes[i] / static_cast(CLOCKS_PER_SEC); - if (tempStartPing > tempStopPing + timeOutTimeMs) { - std::cout << "player " << i << " timed out!" << std::endl; + if (startPing > stopPing + timeOutTimeMs) { + LOG_INFO("Player %i timed out!", i); Disconnect(i); } } @@ -280,7 +234,7 @@ void Server::CheckForTimeOuts() void Server::Disconnect(int i) { Broadcast("A player disconnected"); - std::cout << "Player " << i << " disconnected/Timed out" << std::endl; + LOG_INFO("Player %i disconnected/timed out", i); // Remove enteties and stuff m_PlayerDefinitions[i].Endpoint = boost::asio::ip::udp::endpoint(); @@ -326,7 +280,7 @@ void Server::ParseEvent(Package& package) void Server::ParseConnect(Package& package) { - std::cout << "Parsing connection." << std::endl; + LOG_INFO("Parsing connections"); // Check if player is already connected for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { @@ -336,13 +290,6 @@ void Server::ParseConnect(Package& package) for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == boost::asio::ip::address()) { - - //Events::CreatePlayer e; - //e.entityID = (m_PlayerDefinitions[i].EntityID); - //e.modelPath = "Models/Core/UnitSphere.obj"; - //e.world = m_World; - //m_EventBroker->Publish(e); - // Create new player m_PlayersToCreate.push_back(i); @@ -351,8 +298,7 @@ void Server::ParseConnect(Package& package) m_StopTimes[i] = std::clock(); - std::cout << m_PacketID << ": Player \"" << m_PlayerDefinitions[i].Name << "\" connected on IP: " << - m_PlayerDefinitions[i].Endpoint.address().to_string() << std::endl; + LOG_INFO("Player \"%s\" connected on IP: %s", m_PlayerDefinitions[i].Name, m_PlayerDefinitions[i].Endpoint.address().to_string()); Package package(MessageType::Connect, m_SendPacketID); package.AddPrimitive(i); // Player ID @@ -370,7 +316,7 @@ void Server::ParseConnect(Package& package) void Server::ParseDisconnect() { - std::cout << m_PacketID << ":Parsing disconnect. \n"; + LOG_INFO("%i: Parsing disconnect", m_PacketID); for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { @@ -382,7 +328,7 @@ void Server::ParseDisconnect() void Server::ParseClientPing() { - std::cout << m_PacketID << ":Parsing ping." << std::endl; + LOG_INFO("%i: Parsing ping", m_PacketID); // Return ping Package package(MessageType::ClientPing, m_SendPacketID); package.AddString("Ping received"); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 6080b8f5..5f583f31 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -137,7 +137,7 @@ void Game::debugTick(double dt) void Game::NetworkFunction() { std::string inputMessage; - std::cout << "Start client or server? (c/s)" << std::endl; + LOG_INFO("Start client or server? (c/s)"); std::cin >> inputMessage; if (inputMessage == "c" || inputMessage == "C") { m_IsClientOrServer = true; From 0f0a1ceca7448090476967db602c286427d7d881 Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 17 Dec 2015 14:22:31 +0100 Subject: [PATCH 47/60] No more fake packet loss --- src/Engine/Network/Client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 056b914e..474634d1 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -141,7 +141,7 @@ void Client::ParseMessageType(Package& package) // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id m_PacketID = package.PopFrontPrimitive(); //Read new packet id - IdentifyPacketLoss(); + //IdentifyPacketLoss(); switch (static_cast(messageType)) { case MessageType::Connect: From 51a2da9cc099db3a8a4c4db71232d8479af3e2dc Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 17 Dec 2015 14:28:17 +0100 Subject: [PATCH 48/60] Removed old Event that is not used --- include/Game/ECreatePlayer.h | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 include/Game/ECreatePlayer.h diff --git a/include/Game/ECreatePlayer.h b/include/Game/ECreatePlayer.h deleted file mode 100644 index bbfd3c6d..00000000 --- a/include/Game/ECreatePlayer.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef Events_CreatePlayer_h__ -#define Events_CreatePlayer_h__ - -#include "Core/EventBroker.h" -#include "Core/World.h" - -namespace Events -{ - -struct CreatePlayer : Event -{ - unsigned int entityID; - std::string modelPath; - World* world; -}; - -} - -#endif From 000adb198fe2147dfa674e97ef04604396481f91 Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 17 Dec 2015 14:36:36 +0100 Subject: [PATCH 49/60] Reset RenderQueueFactory.cpp to original state --- src/Engine/Rendering/RenderQueueFactory.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Engine/Rendering/RenderQueueFactory.cpp b/src/Engine/Rendering/RenderQueueFactory.cpp index 747e68b1..8d5bb420 100644 --- a/src/Engine/Rendering/RenderQueueFactory.cpp +++ b/src/Engine/Rendering/RenderQueueFactory.cpp @@ -46,11 +46,9 @@ glm::quat RenderQueueFactory::AbsoluteOrientation(World* world, EntityID entity) glm::quat orientation; do { - if (world->HasComponent(entity, "Transform")) { - ComponentWrapper transform = world->GetComponent(entity, "Transform"); - orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation; - entity = world->GetParent(entity); - } + ComponentWrapper transform = world->GetComponent(entity, "Transform"); + orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation; + entity = world->GetParent(entity); } while (entity != 0); return orientation; @@ -61,11 +59,9 @@ glm::vec3 RenderQueueFactory::AbsoluteScale(World* world, EntityID entity) glm::vec3 scale(1.f); do { - if (world->HasComponent(entity, "Transform")) { - ComponentWrapper transform = world->GetComponent(entity, "Transform"); - scale *= (glm::vec3)transform["Scale"]; - entity = world->GetParent(entity); - } + ComponentWrapper transform = world->GetComponent(entity, "Transform"); + scale *= (glm::vec3)transform["Scale"]; + entity = world->GetParent(entity); } while (entity != 0); return scale; From 076030a252e555d6966861d1722a83feeceb6a0c Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 17 Dec 2015 17:28:43 +0100 Subject: [PATCH 50/60] Fixes, mostly name changes --- include/Engine/Network/Client.h | 41 +++--- include/Engine/Network/Network.h | 2 +- include/Engine/Network/NetworkDefinitions.h | 2 +- .../Engine/Network/{Package.h => Packet.h} | 30 ++-- include/Engine/Network/Server.h | 40 +++--- include/Game/Game.h | 2 +- resources/DefaultConfig.ini | 8 +- src/Engine/Input/InputProxy.cpp | 4 +- src/Engine/Network/Client.cpp | 130 +++++++++--------- .../Network/{Package.cpp => Packet.cpp} | 34 ++--- src/Engine/Network/Server.cpp | 122 ++++++++-------- src/Game/Game.cpp | 10 +- 12 files changed, 212 insertions(+), 213 deletions(-) rename include/Engine/Network/{Package.h => Packet.h} (61%) rename src/Engine/Network/{Package.cpp => Packet.cpp} (53%) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 24b59b59..1bf2f059 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -25,7 +25,7 @@ public: void Update(); void Close(); private: - // UDP logic + // Assio UDP logic boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::io_service m_IOService; boost::asio::ip::udp::socket m_Socket; @@ -52,30 +52,29 @@ private: // if game is turned of by closing window. bool m_WasStarted = false; + // Private member functions + void readFromServer(); + void sendSnapshotToServer(); + int receive(char* data, size_t length); + void send(Packet& packet); + void connect(); + void disconnect(); + void ping(); + void moveMessageHead(char*& data, size_t& length, size_t stepSize); + void parseMessageType(Packet& packet); + void parseEventMessage(Packet& packet); + void parseConnect(Packet& packet); + void parsePing(); + void parseServerPing(); + void parseSnapshot(Packet& packet); + void createNewPlayer(int i); + void identifyPacketLoss(); + bool isConnected(); + // Events EventBroker* m_EventBroker; EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand &e); - - void ReadFromServer(); - void SendSnapshotToServer(); - - int Receive(char* data, size_t length); - void Send(Package& message); - void Connect(); - void Disconnect(); - void Ping(); - void MoveMessageHead(char*& data, size_t& length, size_t stepSize); - void ParseMessageType(Package& package); - void ParseEventMessage(Package& package); - void ParseConnect(Package& package); - void ParsePing(); - void ParseServerPing(); - void ParseSnapshot(Package& package); - void CreateNewPlayer(int i); - void IdentifyPacketLoss(); - bool IsConnected(); - }; #endif diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index e3b9c1ce..d6447a3c 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -3,7 +3,7 @@ #include "Core/World.h" #include "Core/EventBroker.h" -#include "Network/Package.h" +#include "Network/Packet.h" class Network { diff --git a/include/Engine/Network/NetworkDefinitions.h b/include/Engine/Network/NetworkDefinitions.h index be76671e..5a86c50d 100644 --- a/include/Engine/Network/NetworkDefinitions.h +++ b/include/Engine/Network/NetworkDefinitions.h @@ -3,7 +3,7 @@ #include #include -#include "Network/Package.h" +#include "Network/Packet.h" #define BOARDSIZE 16 diff --git a/include/Engine/Network/Package.h b/include/Engine/Network/Packet.h similarity index 61% rename from include/Engine/Network/Package.h rename to include/Engine/Network/Packet.h index 9b45101d..f39cacc9 100644 --- a/include/Engine/Network/Package.h +++ b/include/Engine/Network/Packet.h @@ -1,34 +1,34 @@ -#ifndef Package_h__ -#define Package_h__ +#ifndef Packet_h__ +#define Packet_h__ #include #include "Network/MessageType.h" #include "Core/Util/Logging.h" // Defines the -class Package +class Packet { public: // arg1: Type of message (Connect, Disconnect...) - // arg2: PackageID for identifying packet loss. - Package(MessageType type, unsigned int& packageID); - // Used to create package from already existing data buffer. - Package(char* data, const int sizeOfPackage); + // arg2: PacketID for identifying packet loss. + Packet(MessageType type, unsigned int& packetID); + // Used to create packet from already existing data buffer. + Packet(char* data, const int sizeOfPacket); - ~Package(); + ~Packet(); // Add primitive types like int, float, char... template - void AddPrimitive(T val) + void WritePrimitive(T val) { memcpy(m_Data + m_Offset, &val, sizeof(T)); m_Offset += sizeof(T); } // Pops the first element as if it was a primitive. template - T PopFrontPrimitive() + T ReadPrimitive() { if (m_Offset < m_ReturnDataOffset + sizeof(T)) { - LOG_WARNING("Package PopFrontPrimitive(): You are trying to remove more than what exists in this package!"); + LOG_WARNING("Packaet PopFrontPrimitive(): You are trying to remove more than what exists in this packet!"); return -1; } T returnValue; @@ -37,12 +37,12 @@ public: return returnValue; } // Add a string to the message - void AddString(std::string str); + void WriteString(std::string str); // Add data to the message - void AddData(char* data, int sizeOfData); + void WriteData(char* data, int sizeOfData); // Pops the first element as if it was a string. - std::string PopFrontString(); - char* PopData(int SizeOfData); + std::string ReadString(); + char* ReadData(int SizeOfData); int Size() { return m_Offset; }; char* Data() { return m_Data; }; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index eb625b0d..17ca7136 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -47,26 +47,26 @@ private: // Close logic bool m_ThreadIsRunning = true; - // Network functions - int Receive(char* data, size_t length); - void ReadFromClients(); - void Send(Package& package, int playerID); - void Send(Package& package); - void MoveMessageHead(char*& data, size_t& length, size_t stepSize); - void Broadcast(std::string message); - void Broadcast(Package& package); - void SendSnapshot(); - void SendPing(); - void CheckForTimeOuts(); - void Disconnect(int i); - void ParseMessageType(Package& package); - void ParseEvent(Package& package); - void ParseConnect(Package& package); - void ParseDisconnect(); - void ParseClientPing(); - void ParseServerPing(); - void ParseSnapshot(Package& package); - void IdentifyPacketLoss(); + // Private member functions + int receive(char* data, size_t length); + void readFromClients(); + void send(Packet& packet, int playerID); + void send(Packet& packet); + void moveMessageHead(char*& data, size_t& length, size_t stepSize); + void broadcast(std::string message); + void broadcast(Packet& packet); + void sendSnapshot(); + void sendPing(); + void checkForTimeOuts(); + void disconnect(int i); + void parseMessageType(Packet& packet); + void parseEvent(Packet& packet); + void parseConnect(Packet& packet); + void parseDisconnect(); + void parseClientPing(); + void parseServerPing(); + void parseSnapshot(Packet& packet); + void identifyPacketLoss(); }; #endif diff --git a/include/Game/Game.h b/include/Game/Game.h index 1b8f9bcf..33dc88a6 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -50,7 +50,7 @@ private: boost::thread m_NetworkThread; // Network methods - void NetworkFunction(); + void networkFunction(); Network* m_ClientOrServer; bool m_IsClientOrServer = false; diff --git a/resources/DefaultConfig.ini b/resources/DefaultConfig.ini index c44c8e07..9e4fb885 100644 --- a/resources/DefaultConfig.ini +++ b/resources/DefaultConfig.ini @@ -6,14 +6,12 @@ EditorEnabled=false [Video] - Fullscreen=false - VSYNC=false - Width=1280 - Height=720 FOV=45 [Networking] -StartNetwork=false \ No newline at end of file +StartNetwork=false +Address=0.0.0.0 +Port=0 \ No newline at end of file diff --git a/src/Engine/Input/InputProxy.cpp b/src/Engine/Input/InputProxy.cpp index ad589df3..c3e4d669 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 474634d1..ade0c00e 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -35,7 +35,7 @@ void Client::Start(World* world, EventBroker* eventBroker) } m_Socket.connect(m_ReceiverEndpoint); LOG_INFO("I am client. BIP BOP"); - ReadFromServer(); + readFromServer(); } void Client::Update() @@ -55,13 +55,13 @@ void Client::Update() void Client::Close() { if (m_WasStarted) { - Disconnect(); + disconnect(); m_ThreadIsRunning = false; m_EventBroker->Unsubscribe(m_EInputCommand); } } -void Client::ReadFromServer() +void Client::readFromServer() { int bytesRead = -1; char readBuf[1024] = { 0 }; @@ -71,23 +71,23 @@ void Client::ReadFromServer() while (m_ThreadIsRunning) { if (m_Socket.available()) { - bytesRead = Receive(readBuf, INPUTSIZE); + bytesRead = receive(readBuf, INPUTSIZE); if (bytesRead > 0) { - Package package(readBuf, bytesRead); - ParseMessageType(package); + Packet packet(readBuf, bytesRead); + parseMessageType(packet); } } std::clock_t currentTime = std::clock(); if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - if (IsConnected()) { - SendSnapshotToServer(); + if (isConnected()) { + sendSnapshotToServer(); } previousSnapshotMessage = currentTime; } } } -void Client::SendSnapshotToServer() +void Client::sendSnapshotToServer() { // Reset previouse key state in snapshot. m_NextSnapshot.InputForward = ""; @@ -113,86 +113,86 @@ void Client::SendSnapshotToServer() } if (m_NextSnapshot.InputForward != "") { - Package package(MessageType::Event, m_SendPacketID); - package.AddString(m_NextSnapshot.InputForward); - Send(package); + Packet packet(MessageType::Event, m_SendPacketID); + packet.WriteString(m_NextSnapshot.InputForward); + send(packet); } else { - Package package(MessageType::Event, m_SendPacketID); - package.AddString("0Forward"); - Send(package); + Packet packet(MessageType::Event, m_SendPacketID); + packet.WriteString("0Forward"); + send(packet); } if (m_NextSnapshot.InputRight != "") { - Package package(MessageType::Event, m_SendPacketID); - package.AddString(m_NextSnapshot.InputRight); - Send(package); + Packet packet(MessageType::Event, m_SendPacketID); + packet.WriteString(m_NextSnapshot.InputRight); + send(packet); } else { - Package package(MessageType::Event, m_SendPacketID); - package.AddString("0Right"); - Send(package); + Packet packet(MessageType::Event, m_SendPacketID); + packet.WriteString("0Right"); + send(packet); } } -void Client::ParseMessageType(Package& package) +void Client::parseMessageType(Packet& packet) { - int messageType = package.PopFrontPrimitive(); + int messageType = packet.ReadPrimitive(); if (messageType == -1) return; // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id - m_PacketID = package.PopFrontPrimitive(); //Read new packet id + m_PacketID = packet.ReadPrimitive(); //Read new packet id //IdentifyPacketLoss(); switch (static_cast(messageType)) { case MessageType::Connect: - ParseConnect(package); + parseConnect(packet); break; case MessageType::ClientPing: - ParsePing(); + parsePing(); break; case MessageType::ServerPing: - ParseServerPing(); + parseServerPing(); break; case MessageType::Message: break; case MessageType::Snapshot: - ParseSnapshot(package); + parseSnapshot(packet); break; case MessageType::Disconnect: break; case MessageType::Event: - ParseEventMessage(package); + parseEventMessage(packet); break; default: break; } } -void Client::ParseConnect(Package& package) +void Client::parseConnect(Packet& packet) { - m_PlayerID = package.PopFrontPrimitive(); + m_PlayerID = packet.ReadPrimitive(); LOG_INFO("%i: I am player: %i", m_PacketID, m_PlayerID); } -void Client::ParsePing() +void Client::parsePing() { m_DurationOfPingTime = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); LOG_INFO("%i: response time with ctime(ms): %f", m_PacketID, m_DurationOfPingTime); } -void Client::ParseServerPing() +void Client::parseServerPing() { - Package message(MessageType::ServerPing, m_SendPacketID); - message.AddString("Ping recieved"); - Send(message); + Packet message(MessageType::ServerPing, m_SendPacketID); + message.WriteString("Ping recieved"); + send(message); } -void Client::ParseEventMessage(Package& package) +void Client::parseEventMessage(Packet& packet) { int Id = -1; - std::string command = package.PopFrontString(); + std::string command = packet.ReadString(); if (command.find("+Player") != std::string::npos) { - Id = package.PopFrontPrimitive(); + Id = packet.ReadPrimitive(); // Sett Player name m_PlayerDefinitions[Id].Name = command.erase(0, 7); } else { @@ -200,13 +200,13 @@ void Client::ParseEventMessage(Package& package) } } -void Client::ParseSnapshot(Package& package) +void Client::parseSnapshot(Packet& packet) { 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. - tempName = package.PopFrontString(); + tempName = packet.ReadString(); // Apply the position data read to the player entity @@ -226,12 +226,12 @@ void Client::ParseSnapshot(Package& package) // Move player to server position int dataSize = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform").Info.Meta.Stride; - memcpy(m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform").Data, package.PopData(dataSize), dataSize); + memcpy(m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform").Data, packet.ReadData(dataSize), dataSize); } } } -int Client::Receive(char* data, size_t length) +int Client::receive(char* data, size_t length) { boost::system::error_code error; @@ -241,44 +241,44 @@ int Client::Receive(char* data, size_t length) 0, error); if (error) { - //LOG_ERROR("Receive: %s", error.message().c_str()); + //LOG_ERROR("receive: %s", error.message().c_str()); } return bytesReceived; } -void Client::Send(Package& package) +void Client::send(Packet& packet) { m_Socket.send_to(boost::asio::buffer( - package.Data(), - package.Size()), + packet.Data(), + packet.Size()), m_ReceiverEndpoint, 0); } -void Client::Connect() +void Client::connect() { - Package message(MessageType::Connect, m_SendPacketID); - message.AddString(m_PlayerName); + Packet message(MessageType::Connect, m_SendPacketID); + message.WriteString(m_PlayerName); m_StartPingTime = std::clock(); - Send(message); + send(message); } -void Client::Disconnect() +void Client::disconnect() { - Package message(MessageType::Connect, m_SendPacketID); - message.AddString("+Disconnect"); - Send(message); + Packet message(MessageType::Connect, m_SendPacketID); + message.WriteString("+Disconnect"); + send(message); } -void Client::Ping() +void Client::ping() { - Package message(MessageType::Connect, m_SendPacketID); - message.AddString("Ping"); + Packet message(MessageType::Connect, m_SendPacketID); + message.WriteString("Ping"); m_StartPingTime = std::clock(); - Send(message); + send(message); } -void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) +void Client::moveMessageHead(char*& data, size_t& length, size_t stepSize) { data += stepSize; length -= stepSize; @@ -286,7 +286,7 @@ void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) bool Client::OnInputCommand(const Events::InputCommand & e) { - if (IsConnected()) { + if (isConnected()) { ComponentWrapper& player = m_World->GetComponent(m_PlayerDefinitions[m_PlayerID].EntityID, "Player"); if (e.Command == "Forward") { if (e.Value > 0) { @@ -314,12 +314,12 @@ bool Client::OnInputCommand(const Events::InputCommand & e) } } if (e.Command == "ConnectToServer") { // Connect for now - Connect(); + connect(); } return false; } -void Client::CreateNewPlayer(int i) +void Client::createNewPlayer(int i) { m_PlayerDefinitions[i].EntityID = m_World->CreateEntity(); ComponentWrapper transform = m_World->AttachComponent(m_PlayerDefinitions[i].EntityID, "Transform"); @@ -327,7 +327,7 @@ void Client::CreateNewPlayer(int i) model["Resource"] = "Models/Core/UnitSphere.obj"; } -void Client::IdentifyPacketLoss() +void Client::identifyPacketLoss() { // if no packets lost, difference should be equal to 1 int difference = m_PacketID - m_PreviousPacketID; @@ -336,7 +336,7 @@ void Client::IdentifyPacketLoss() } } -bool Client::IsConnected() +bool Client::isConnected() { if (m_PlayerID != -1) { if (m_PlayerDefinitions[m_PlayerID].EntityID != -1) { diff --git a/src/Engine/Network/Package.cpp b/src/Engine/Network/Packet.cpp similarity index 53% rename from src/Engine/Network/Package.cpp rename to src/Engine/Network/Packet.cpp index 43c28837..84f4c440 100644 --- a/src/Engine/Network/Package.cpp +++ b/src/Engine/Network/Packet.cpp @@ -1,52 +1,52 @@ -#include "Network/Package.h" +#include "Network/Packet.h" -Package::Package(MessageType type, unsigned int& packageID) +Packet::Packet(MessageType type, unsigned int& packetID) { m_Data = new char[128]; // Create message header // Add message type int messageType = static_cast(type); - Package::AddPrimitive(messageType); - packageID = packageID % 1000; // Packet id modulos - Package::AddPrimitive(packageID); - packageID++; + Packet::WritePrimitive(messageType); + packetID = packetID % 1000; // Packet id modulos + Packet::WritePrimitive(packetID); + packetID++; } -Package::Package(char* data, const int sizeOfPackage) +Packet::Packet(char* data, const int sizeOfPacket) { // Create message - m_Data = new char[sizeOfPackage]; - memcpy(m_Data, data, sizeOfPackage); - m_Offset = sizeOfPackage; + m_Data = new char[sizeOfPacket]; + memcpy(m_Data, data, sizeOfPacket); + m_Offset = sizeOfPacket; } -Package::~Package() +Packet::~Packet() { delete[] m_Data; } -void Package::AddString(std::string str) +void Packet::WriteString(std::string str) { // Message, add one extra byte for null terminator memcpy(m_Data + m_Offset, str.data(), (str.size() + 1) * sizeof(char)); m_Offset += (str.size() + 1) * sizeof(char); } -void Package::AddData(char * data, int sizeOfData) +void Packet::WriteData(char * data, int sizeOfData) { if (m_Offset + sizeOfData > 128) { - LOG_WARNING("Package::AddData(): Data size in package exceeded maximum package size.\n"); + LOG_WARNING("Packet::AddData(): Data size in packet exceeded maximum packet size.\n"); } memcpy(m_Data + m_Offset, data, sizeOfData); m_Offset += sizeOfData; } -std::string Package::PopFrontString() +std::string Packet::ReadString() { std::string returnValue(m_Data + m_ReturnDataOffset); if (m_Offset < m_ReturnDataOffset + returnValue.size()){ - LOG_WARNING("Package PopFrontString(): Oh no! You are trying to remove things outside my memory kingdom"); + LOG_WARNING("packet PopFrontString(): Oh no! You are trying to remove things outside my memory kingdom"); return "PopFrontString Failed"; } // +1 for null terminator. @@ -54,7 +54,7 @@ std::string Package::PopFrontString() return returnValue; } -char * Package::PopData(int SizeOfData) +char * Packet::ReadData(int SizeOfData) { unsigned int oldReturnDataOffset = m_ReturnDataOffset; m_ReturnDataOffset += SizeOfData; diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 2bf96528..cbe7a378 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -16,7 +16,7 @@ void Server::Start(World* world, EventBroker* eventBroker) } LOG_INFO("I am Server. BIP BOP\n"); - ReadFromClients(); + readFromClients(); } void Server::Update() @@ -40,7 +40,7 @@ void Server::Close() m_ThreadIsRunning = false; } -void Server::ReadFromClients() +void Server::readFromClients() { char readBuffer[1024] = { 0 }; int bytesRead = 0; @@ -60,9 +60,9 @@ void Server::ReadFromClients() if (m_ThreadIsRunning && m_Socket.available()) { try { - bytesRead = Receive(readBuffer, INPUTSIZE); - Package package(readBuffer, bytesRead); - ParseMessageType(package); + 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()); } @@ -71,59 +71,59 @@ void Server::ReadFromClients() std::clock_t currentTime = std::clock(); // Send snapshot if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - SendSnapshot(); + sendSnapshot(); previousSnapshotMessage = currentTime; } // Send pings each if (intervalMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) { - SendPing(); + sendPing(); previousePingMessage = currentTime; } // Time out logic if (checkTimeOutInterval < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) { - CheckForTimeOuts(); + checkForTimeOuts(); timOutTimer = currentTime; } } } -void Server::ParseMessageType(Package& package) +void Server::parseMessageType(Packet& packet) { - int messageType = package.PopFrontPrimitive(); // Read what type off message was sent from server + int messageType = packet.ReadPrimitive(); // Read what type off message was sent from server // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id - m_PacketID = package.PopFrontPrimitive(); //Read new packet id + m_PacketID = packet.ReadPrimitive(); //Read new packet id //IdentifyPacketLoss(); switch (static_cast(messageType)) { case MessageType::Connect: - ParseConnect(package); + parseConnect(packet); break; case MessageType::ClientPing: - //ParseClientPing(); + //parseClientPing(); break; case MessageType::ServerPing: - ParseServerPing(); + parseServerPing(); break; case MessageType::Message: break; case MessageType::Snapshot: - ParseSnapshot(package); + parseSnapshot(packet); break; case MessageType::Disconnect: - ParseDisconnect(); + parseDisconnect(); break; case MessageType::Event: - ParseEvent(package); + parseEvent(packet); break; default: break; } } -int Server::Receive(char * data, size_t length) +int Server::receive(char * data, size_t length) { length = m_Socket.receive_from( boost::asio::buffer((void*)data @@ -132,69 +132,69 @@ int Server::Receive(char * data, size_t length) return length; } -void Server::Send(Package& message, int playerID) +void Server::send(Packet& packet, int playerID) { m_Socket.send_to( - boost::asio::buffer(message.Data(), message.Size()), + boost::asio::buffer(packet.Data(), packet.Size()), m_PlayerDefinitions[playerID].Endpoint, 0); } -void Server::Send(Package & package) +void Server::send(Packet & packet) { m_Socket.send_to( boost::asio::buffer( - package.Data(), - package.Size()), + packet.Data(), + packet.Size()), m_ReceiverEndpoint, 0); } -void Server::MoveMessageHead(char *& data, size_t & length, size_t stepSize) +void Server::moveMessageHead(char *& data, size_t & length, size_t stepSize) { data += stepSize; length -= stepSize; } -void Server::Broadcast(std::string message) +void Server::broadcast(std::string message) { - Package package(MessageType::Event, m_SendPacketID); - package.AddString(message); + Packet packet(MessageType::Event, m_SendPacketID); + packet.WriteString(message); for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { - Send(package, i); + send(packet, i); } } } -void Server::Broadcast(Package& package) +void Server::broadcast(Packet& packet) { for (int i = 0; i < MAXCONNECTIONS; ++i) { if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { - Send(package, i); + send(packet, i); } } } -void Server::SendSnapshot() +void Server::sendSnapshot() { - Package package(MessageType::Snapshot, m_SendPacketID); + Packet packet(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); + packet.WriteString(m_PlayerDefinitions[i].Name); if (m_PlayerDefinitions[i].EntityID == -1) { continue; } - // Pack transfrom component into data package + // Pack transfrom component into data packet auto transform = m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform"); - package.AddData(transform.Data, transform.Info.Meta.Stride); + packet.WriteData(transform.Data, transform.Info.Meta.Stride); } - Broadcast(package); + broadcast(packet); } -void Server::SendPing() +void Server::sendPing() { // Prints connected players ping for (size_t i = 0; i < MAXCONNECTIONS; i++) { @@ -205,15 +205,15 @@ void Server::SendPing() } // Create ping message - Package package(MessageType::ServerPing, m_SendPacketID); - package.AddString("Ping from server"); + Packet packet(MessageType::ServerPing, m_SendPacketID); + packet.WriteString("Ping from server"); // Time message m_StartPingTime = std::clock(); // Send message - Broadcast(package); + broadcast(packet); } -void Server::CheckForTimeOuts() +void Server::checkForTimeOuts() { int timeOutTimeMs = 5000; int startPing = 1000 * m_StartPingTime @@ -225,15 +225,15 @@ void Server::CheckForTimeOuts() / static_cast(CLOCKS_PER_SEC); if (startPing > stopPing + timeOutTimeMs) { LOG_INFO("Player %i timed out!", i); - Disconnect(i); + disconnect(i); } } } } -void Server::Disconnect(int i) +void Server::disconnect(int i) { - Broadcast("A player disconnected"); + broadcast("A player disconnected"); LOG_INFO("Player %i disconnected/timed out", i); // Remove enteties and stuff @@ -242,7 +242,7 @@ void Server::Disconnect(int i) m_PlayerDefinitions[i].Name = ""; } -void Server::ParseEvent(Package& package) +void Server::parseEvent(Packet& packet) { size_t i; for (i = 0; i < MAXCONNECTIONS; i++) { @@ -255,7 +255,7 @@ void Server::ParseEvent(Package& package) return; unsigned int entityId = m_PlayerDefinitions[i].EntityID; - std::string eventString = package.PopFrontString(); + std::string eventString = packet.ReadString(); if ("+Forward" == eventString) { m_World->GetComponent(entityId, "Player")["Forward"] = true; m_World->GetComponent(entityId, "Player")["Back"] = false; @@ -278,7 +278,7 @@ void Server::ParseEvent(Package& package) } } -void Server::ParseConnect(Package& package) +void Server::parseConnect(Packet& packet) { LOG_INFO("Parsing connections"); // Check if player is already connected @@ -294,48 +294,48 @@ void Server::ParseConnect(Package& package) m_PlayersToCreate.push_back(i); m_PlayerDefinitions[i].Endpoint = m_ReceiverEndpoint; - m_PlayerDefinitions[i].Name = package.PopFrontString(); + m_PlayerDefinitions[i].Name = packet.ReadString(); m_StopTimes[i] = std::clock(); LOG_INFO("Player \"%s\" connected on IP: %s", m_PlayerDefinitions[i].Name, m_PlayerDefinitions[i].Endpoint.address().to_string()); - Package package(MessageType::Connect, m_SendPacketID); - package.AddPrimitive(i); // Player ID + Packet packet(MessageType::Connect, m_SendPacketID); + packet.WritePrimitive(i); // Player ID - Send(package, i); + send(packet, i); // Send notification that a player has connected std::string str = m_PacketID + "Player " + m_PlayerDefinitions[i].Name + " connected on: " + m_PlayerDefinitions[i].Endpoint.address().to_string(); - Broadcast(str); + broadcast(str); break; } } } -void Server::ParseDisconnect() +void Server::parseDisconnect() { LOG_INFO("%i: Parsing disconnect", m_PacketID); for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { - Disconnect(i); + disconnect(i); break; } } } -void Server::ParseClientPing() +void Server::parseClientPing() { LOG_INFO("%i: Parsing ping", m_PacketID); // Return ping - Package package(MessageType::ClientPing, m_SendPacketID); - package.AddString("Ping received"); - Send(package); // This dosen't work for multiple users + Packet packet(MessageType::ClientPing, m_SendPacketID); + packet.WriteString("Ping received"); + send(packet); // This dosen't work for multiple users } -void Server::ParseServerPing() +void Server::parseServerPing() { for (int i = 0; i < MAXCONNECTIONS; i++) { if (m_PlayerDefinitions[i].Endpoint.address() == m_ReceiverEndpoint.address()) { @@ -346,7 +346,7 @@ void Server::ParseServerPing() } // NOT USED -void Server::ParseSnapshot(Package& package) +void Server::parseSnapshot(Packet& packet) { // Does no logic. Returns snapshot if client request one // The snapshot is not a real snapshot tho... @@ -360,7 +360,7 @@ void Server::ParseSnapshot(Package& package) } } -void Server::IdentifyPacketLoss() +void Server::identifyPacketLoss() { // if no packets lost, difference should be equal to 1 int difference = m_PacketID - m_PreviousPacketID; diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 6f8c3bac..90dd3773 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -54,8 +54,9 @@ Game::Game(int argc, char* argv[]) m_SystemPipeline->AddSystem(); m_SystemPipeline->AddSystem(m_Renderer); // Invoke network - if (m_Config->Get("Networking.StartNetwork", false) == true) - boost::thread workerThread(&Game::NetworkFunction, this); + if (m_Config->Get("Networking.StartNetwork", false)) { + boost::thread workerThread(&Game::networkFunction, this); + } m_LastTime = glfwGetTime(); debugInitialize(); @@ -90,8 +91,9 @@ void Game::Tick() m_EventBroker->Swap(); // Update network - if (m_IsClientOrServer) + if (m_IsClientOrServer) { m_ClientOrServer->Update(); + } // Iterate through systems and update world! @@ -134,7 +136,7 @@ void Game::debugTick(double dt) m_EventBroker->Process(); } -void Game::NetworkFunction() +void Game::networkFunction() { std::string inputMessage; LOG_INFO("Start client or server? (c/s)"); From db5b6ad51908cdf1603ec02a4fc00c2675b1150d Mon Sep 17 00:00:00 2001 From: Jocke Date: Thu, 17 Dec 2015 17:32:49 +0100 Subject: [PATCH 51/60] Added more error code to Packet class --- include/Engine/Network/Package.h | 7 ++++++- src/Engine/Network/Package.cpp | 22 +++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/include/Engine/Network/Package.h b/include/Engine/Network/Package.h index 9b45101d..2d9f766f 100644 --- a/include/Engine/Network/Package.h +++ b/include/Engine/Network/Package.h @@ -20,6 +20,10 @@ public: template void AddPrimitive(T val) { + // Check if we are trying to add more than the package can fit. + if (m_MaxPacketSize < m_Offset + sizeof(T)) { + LOG_WARNING("Packet AddPrimitive(): You are trying to add more than we have allocated for!"); + } memcpy(m_Data + m_Offset, &val, sizeof(T)); m_Offset += sizeof(T); } @@ -28,7 +32,7 @@ public: T PopFrontPrimitive() { if (m_Offset < m_ReturnDataOffset + sizeof(T)) { - LOG_WARNING("Package PopFrontPrimitive(): You are trying to remove more than what exists in this package!"); + LOG_WARNING("Packet PopFrontPrimitive(): You are trying to remove more than what exists in this package!"); return -1; } T returnValue; @@ -51,6 +55,7 @@ private: char* m_Data; unsigned int m_ReturnDataOffset = 0; int m_Offset = 0; + unsigned int m_MaxPacketSize = 128; }; #endif \ No newline at end of file diff --git a/src/Engine/Network/Package.cpp b/src/Engine/Network/Package.cpp index 43c28837..be99e4a3 100644 --- a/src/Engine/Network/Package.cpp +++ b/src/Engine/Network/Package.cpp @@ -16,7 +16,11 @@ Package::Package(MessageType type, unsigned int& packageID) Package::Package(char* data, const int sizeOfPackage) { // Create message + + // Resize message + m_MaxPacketSize = sizeOfPackage; m_Data = new char[sizeOfPackage]; + // Copy data newly allocated memory memcpy(m_Data, data, sizeOfPackage); m_Offset = sizeOfPackage; } @@ -29,14 +33,18 @@ Package::~Package() void Package::AddString(std::string str) { // Message, add one extra byte for null terminator - memcpy(m_Data + m_Offset, str.data(), (str.size() + 1) * sizeof(char)); - m_Offset += (str.size() + 1) * sizeof(char); + int sizeOfString = str.size() + 1; + if (m_Offset + sizeOfString > m_MaxPacketSize) { + LOG_WARNING("Package::AddString(): Data size in packet exceeded maximum package size.\n"); + } + memcpy(m_Data + m_Offset, str.data(), sizeOfString * sizeof(char)); + m_Offset += sizeOfString * sizeof(char); } void Package::AddData(char * data, int sizeOfData) { - if (m_Offset + sizeOfData > 128) { - LOG_WARNING("Package::AddData(): Data size in package exceeded maximum package size.\n"); + if (m_Offset + sizeOfData > m_MaxPacketSize) { + LOG_WARNING("Package::AddData(): Data size in packet exceeded maximum package size.\n"); } memcpy(m_Data + m_Offset, data, sizeOfData); m_Offset += sizeOfData; @@ -46,7 +54,7 @@ std::string Package::PopFrontString() { std::string returnValue(m_Data + m_ReturnDataOffset); if (m_Offset < m_ReturnDataOffset + returnValue.size()){ - LOG_WARNING("Package PopFrontString(): Oh no! You are trying to remove things outside my memory kingdom"); + LOG_WARNING("packet PopFrontString(): Oh no! You are trying to remove things outside my memory kingdom"); return "PopFrontString Failed"; } // +1 for null terminator. @@ -56,6 +64,10 @@ std::string Package::PopFrontString() char * Package::PopData(int SizeOfData) { + if (m_Offset < m_ReturnDataOffset + SizeOfData) { + LOG_WARNING("packet PopData(): Oh no! You are trying to remove things outside my memory kingdom"); + return nullptr; + } unsigned int oldReturnDataOffset = m_ReturnDataOffset; m_ReturnDataOffset += SizeOfData; return (m_Data + oldReturnDataOffset); From 0b714e593f9ed298cc3bb6962e91b655a68113d5 Mon Sep 17 00:00:00 2001 From: stiffly Date: Thu, 17 Dec 2015 17:56:15 +0100 Subject: [PATCH 52/60] Removed WinLeakCheck. Minor variable name changes. removed IsWASDKeyDown struct --- include/Engine/Network/Client.h | 1 - include/Engine/Network/Server.h | 2 +- include/Engine/Network/SnapshotDefinitions.h | 8 ------ include/Engine/Network/WinLeakCheck.h | 17 ------------ src/Engine/Network/Client.cpp | 27 ++++++++++---------- 5 files changed, 14 insertions(+), 41 deletions(-) delete mode 100644 include/Engine/Network/WinLeakCheck.h diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 1bf2f059..2b1f65f8 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -10,7 +10,6 @@ #include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" #include "Network/SnapshotDefinitions.h" -#include "Network/WinLeakCheck.h" #include "Core/World.h" #include "Core/EventBroker.h" #include "Input/EInputCommand.h" diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 17ca7136..4e298213 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -36,7 +36,7 @@ private: // Game logic World* m_World; EventBroker* m_EventBroker; - // size = ammount of players to create, stores playerID's + // vec.size() = ammount of players to create, stores playerID's std::vector m_PlayersToCreate; // Packet loss logic diff --git a/include/Engine/Network/SnapshotDefinitions.h b/include/Engine/Network/SnapshotDefinitions.h index 9fe8beca..b643d18c 100644 --- a/include/Engine/Network/SnapshotDefinitions.h +++ b/include/Engine/Network/SnapshotDefinitions.h @@ -9,12 +9,4 @@ struct SnapshotDefinitions std::string InputRight; }; -struct IsWASDKeyDown -{ - bool W = false; - bool A = false; - bool S = false; - bool D = false; -}; - #endif \ No newline at end of file diff --git a/include/Engine/Network/WinLeakCheck.h b/include/Engine/Network/WinLeakCheck.h deleted file mode 100644 index dc1216a7..00000000 --- a/include/Engine/Network/WinLeakCheck.h +++ /dev/null @@ -1,17 +0,0 @@ -#if defined (_WIN64) | defined(_WIN32) -#ifndef WinLeakeCheck_h__ -#define WinLeakeCheck_h__ - -//For memory leak checking -#define _CRTDBG_MAP_ALLOC -#include -#include - -#ifdef _DEBUG -#ifndef DBG_NEW -#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) -#define new DBG_NEW -#endif -#endif // _DEBUG -#endif -#endif \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index ade0c00e..69513022 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -13,8 +13,7 @@ Client::Client() : m_Socket(m_IOService) Client::~Client() { - // will it work on linux? #if defined (_WIN64) | defined(_WIN32) otherwise. - _CrtDumpMemoryLeaks(); + } void Client::Start(World* world, EventBroker* eventBroker) @@ -182,9 +181,9 @@ void Client::parsePing() void Client::parseServerPing() { - Packet message(MessageType::ServerPing, m_SendPacketID); - message.WriteString("Ping recieved"); - send(message); + Packet packet(MessageType::ServerPing, m_SendPacketID); + packet.WriteString("Ping recieved"); + send(packet); } void Client::parseEventMessage(Packet& packet) @@ -257,25 +256,25 @@ void Client::send(Packet& packet) void Client::connect() { - Packet message(MessageType::Connect, m_SendPacketID); - message.WriteString(m_PlayerName); + Packet packet(MessageType::Connect, m_SendPacketID); + packet.WriteString(m_PlayerName); m_StartPingTime = std::clock(); - send(message); + send(packet); } void Client::disconnect() { - Packet message(MessageType::Connect, m_SendPacketID); - message.WriteString("+Disconnect"); - send(message); + Packet packet(MessageType::Connect, m_SendPacketID); + packet.WriteString("+Disconnect"); + send(packet); } void Client::ping() { - Packet message(MessageType::Connect, m_SendPacketID); - message.WriteString("Ping"); + Packet packet(MessageType::Connect, m_SendPacketID); + packet.WriteString("Ping"); m_StartPingTime = std::clock(); - send(message); + send(packet); } void Client::moveMessageHead(char*& data, size_t& length, size_t stepSize) From 97f8be1915f4f7ed426cf5c3a6915c1b417bbefd Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 18 Dec 2015 10:21:56 +0100 Subject: [PATCH 53/60] Made Network.h's Start() and Update pure virtual and removed cpp. Removed unnecessary code from NetworkDefinitions.h. Renamed sizeOfPackage to sizeOfPacket in Packet.cpp. --- include/Engine/Network/Client.h | 5 +++-- include/Engine/Network/Network.h | 9 +++------ include/Engine/Network/NetworkDefinitions.h | 12 ------------ include/Engine/Network/Server.h | 5 +++-- src/Engine/Network/Client.cpp | 2 +- src/Engine/Network/Network.cpp | 13 ------------- src/Engine/Network/Packet.cpp | 17 +++++++++-------- 7 files changed, 19 insertions(+), 44 deletions(-) delete mode 100644 src/Engine/Network/Network.cpp diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 1bf2f059..743f7510 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -5,6 +5,7 @@ #include #include +#include #include "Network/MessageType.h" #include "Network/NetworkDefinitions.h" @@ -21,8 +22,8 @@ class Client : public Network public: Client(); ~Client(); - void Start(World* world, EventBroker* eventBroker); - void Update(); + void Start(World* world, EventBroker* eventBroker) override; + void Update() override; void Close(); private: // Assio UDP logic diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index d6447a3c..31c6b8b0 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -8,12 +8,9 @@ class Network { public: - Network(); - ~Network(); - virtual void Start(World* m_world, EventBroker *eventBroker); - virtual void Update(); -protected: - + virtual ~Network() { }; + virtual void Start(World* m_world, EventBroker *eventBroker) = 0; + virtual void Update() = 0; }; #endif \ No newline at end of file diff --git a/include/Engine/Network/NetworkDefinitions.h b/include/Engine/Network/NetworkDefinitions.h index 5a86c50d..336daf86 100644 --- a/include/Engine/Network/NetworkDefinitions.h +++ b/include/Engine/Network/NetworkDefinitions.h @@ -1,20 +1,8 @@ #ifndef NetworkDefines_h__ #define NetworkDefines_h__ -#include -#include -#include "Network/Packet.h" - - -#define BOARDSIZE 16 #define MAXCONNECTIONS 8 #define INPUTSIZE 128 #define PLAYERSPEED 0.2f; -typedef boost::shared_ptr socket_ptr; -typedef boost::shared_ptr string_ptr; -typedef boost::shared_ptr> messageQueue_ptr; - - - #endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 17ca7136..092c3be0 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -5,6 +5,7 @@ #include #include +#include #include "Network/MessageType.h" #include "Network/NetworkDefinitions.h" @@ -18,8 +19,8 @@ class Server : public Network public: Server(); ~Server(); - void Start(World* m_world, EventBroker *eventBroker); - void Update(); + void Start(World* m_world, EventBroker *eventBroker) override; + void Update() override; void Close(); private: diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index ade0c00e..4966b477 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -5,7 +5,7 @@ using namespace boost::asio::ip; Client::Client() : m_Socket(m_IOService) { - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.6"), 13); // Set up network stream m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; diff --git a/src/Engine/Network/Network.cpp b/src/Engine/Network/Network.cpp deleted file mode 100644 index 51a93407..00000000 --- a/src/Engine/Network/Network.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "Network/Network.h" - -Network::Network() -{ } - -Network::~Network() -{ } - -void Network::Start(World * m_world, EventBroker * eventBroker) -{ } - -void Network::Update() -{ } \ No newline at end of file diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 4a9b77ae..328e0d12 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -12,14 +12,15 @@ Packet::Packet(MessageType type, unsigned int& packetID) packetID++; } - +// Create message Packet::Packet(char* data, const int sizeOfPacket) { - // Create message - // Resize message - m_MaxPacketSize = sizeOfPackage; + m_MaxPacketSize = sizeOfPacket; // Copy data newly allocated memory + m_Data = new char[sizeOfPacket]; + memcpy(m_Data, data, sizeOfPacket); + m_Offset = sizeOfPacket; } Packet::~Packet() @@ -39,7 +40,7 @@ void Packet::WriteString(std::string str) } void Packet::WriteData(char * data, int sizeOfData) -{ +{ if (m_Offset + sizeOfData > m_MaxPacketSize) { LOG_WARNING("Packet::WriteData(): Data size in packet exceeded maximum packet size.\n"); } @@ -50,10 +51,10 @@ void Packet::WriteData(char * data, int sizeOfData) std::string Packet::ReadString() { std::string returnValue(m_Data + m_ReturnDataOffset); - if (m_Offset < m_ReturnDataOffset + returnValue.size()){ + if (m_Offset < m_ReturnDataOffset + returnValue.size()) { LOG_WARNING("packet ReadString(): Oh no! You are trying to remove things outside my memory kingdom"); return "PopFrontString Failed"; - } + } // +1 for null terminator. m_ReturnDataOffset += returnValue.size() + 1; return returnValue; @@ -68,4 +69,4 @@ char * Packet::ReadData(int SizeOfData) unsigned int oldReturnDataOffset = m_ReturnDataOffset; m_ReturnDataOffset += SizeOfData; return (m_Data + oldReturnDataOffset); -} +} \ No newline at end of file From 30db0b10fdcb464eea3dc919d0bfb1d880082fa5 Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 18 Dec 2015 10:36:14 +0100 Subject: [PATCH 54/60] Removed NetworkDefinitions.h and moved #define MAXCONNECTIONS 8 #define INPUTSIZE 128 to Network.h. --- include/Engine/Network/Client.h | 1 - include/Engine/Network/Network.h | 3 +++ include/Engine/Network/NetworkDefinitions.h | 8 -------- include/Engine/Network/Server.h | 1 - 4 files changed, 3 insertions(+), 10 deletions(-) delete mode 100644 include/Engine/Network/NetworkDefinitions.h diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 743f7510..bf421ecc 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -8,7 +8,6 @@ #include #include "Network/MessageType.h" -#include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" #include "Network/SnapshotDefinitions.h" #include "Network/WinLeakCheck.h" diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index 31c6b8b0..0f7baefe 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -5,6 +5,9 @@ #include "Core/EventBroker.h" #include "Network/Packet.h" +#define MAXCONNECTIONS 8 +#define INPUTSIZE 128 + class Network { public: diff --git a/include/Engine/Network/NetworkDefinitions.h b/include/Engine/Network/NetworkDefinitions.h deleted file mode 100644 index 336daf86..00000000 --- a/include/Engine/Network/NetworkDefinitions.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef NetworkDefines_h__ -#define NetworkDefines_h__ - -#define MAXCONNECTIONS 8 -#define INPUTSIZE 128 -#define PLAYERSPEED 0.2f; - -#endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 092c3be0..a081ec00 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -8,7 +8,6 @@ #include #include "Network/MessageType.h" -#include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" #include "Core/World.h" #include "Core/EventBroker.h" From 002e1d8c5a434002e1ddc131117de8871719f293 Mon Sep 17 00:00:00 2001 From: Jocke Date: Fri, 18 Dec 2015 10:52:46 +0100 Subject: [PATCH 55/60] Removed magic number from Packet constructor in Packet.cpp. --- src/Engine/Network/Packet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 328e0d12..52b15065 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -2,7 +2,7 @@ Packet::Packet(MessageType type, unsigned int& packetID) { - m_Data = new char[128]; + m_Data = new char[m_MaxPacketSize]; // Create message header // Add message type int messageType = static_cast(type); From 5c1a93021b57ea8b22b03c49be0523082e3f0f73 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 18 Dec 2015 11:22:13 +0100 Subject: [PATCH 56/60] Client now reads address and port from config file. Default address is set to local host. --- include/Engine/Network/Client.h | 5 +++-- resources/DefaultConfig.ini | 5 ++--- src/Engine/Network/Client.cpp | 7 +++++-- src/Game/Game.cpp | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 2b1f65f8..2869bfb2 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -6,19 +6,20 @@ #include +#include "Network/Network.h" #include "Network/MessageType.h" #include "Network/NetworkDefinitions.h" #include "Network/PlayerDefinition.h" #include "Network/SnapshotDefinitions.h" #include "Core/World.h" #include "Core/EventBroker.h" +#include "Core/ConfigFile.h" #include "Input/EInputCommand.h" -#include "Network/Network.h" class Client : public Network { public: - Client(); + Client(ConfigFile* config); ~Client(); void Start(World* world, EventBroker* eventBroker); void Update(); diff --git a/resources/DefaultConfig.ini b/resources/DefaultConfig.ini index 9e4fb885..6c6d4808 100644 --- a/resources/DefaultConfig.ini +++ b/resources/DefaultConfig.ini @@ -1,5 +1,4 @@ [Debug] - LogLevel=1 LoadMap= EditorEnabled=false @@ -13,5 +12,5 @@ Height=720 FOV=45 [Networking] StartNetwork=false -Address=0.0.0.0 -Port=0 \ No newline at end of file +Address=127.0.0.1 +Port=13 \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 69513022..a43c16eb 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -3,9 +3,12 @@ using namespace boost::asio::ip; -Client::Client() : m_Socket(m_IOService) +Client::Client(ConfigFile* config) : m_Socket(m_IOService) { - m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 13); + // Default is local host + std::string address = config->Get("Networking.Address", "127.0.0.1"); + int port = config->Get("Networking.Port", 13); + m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string(address), port); // Set up network stream m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 90dd3773..151d9363 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -143,7 +143,7 @@ void Game::networkFunction() std::cin >> inputMessage; if (inputMessage == "c" || inputMessage == "C") { m_IsClientOrServer = true; - m_ClientOrServer = new Client(); + m_ClientOrServer = new Client(m_Config); } if (inputMessage == "s" || inputMessage == "S") { m_IsClientOrServer = true; From a858dab8b665672f98da51d3ba4f72eae0c9894f Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 18 Dec 2015 12:00:14 +0100 Subject: [PATCH 57/60] Network not longer threaded --- include/Engine/Network/Client.h | 10 +++- include/Engine/Network/Server.h | 13 +++++ src/Engine/Input/InputProxy.cpp | 4 +- src/Engine/Network/Client.cpp | 61 ++++++++------------- src/Engine/Network/Server.cpp | 97 ++++++++++++++------------------- src/Game/Game.cpp | 7 ++- 6 files changed, 90 insertions(+), 102 deletions(-) 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 From a0255f1b318a0089b6e3715d917fe4fc85f675f4 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 18 Dec 2015 13:34:21 +0100 Subject: [PATCH 58/60] Now uses config file to determine if client or server should be started. --- resources/DefaultConfig.ini | 3 +++ resources/DefaultInput.ini | 4 +++- src/Engine/Network/Client.cpp | 12 ++++++------ src/Game/Game.cpp | 21 ++++++++++++++------- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/resources/DefaultConfig.ini b/resources/DefaultConfig.ini index 6c6d4808..3ab402ad 100644 --- a/resources/DefaultConfig.ini +++ b/resources/DefaultConfig.ini @@ -10,7 +10,10 @@ VSYNC=false Width=1280 Height=720 FOV=45 + [Networking] StartNetwork=false +IsServer=false +Name=Bob Address=127.0.0.1 Port=13 \ No newline at end of file diff --git a/resources/DefaultInput.ini b/resources/DefaultInput.ini index 9246de59..95ebbc22 100644 --- a/resources/DefaultInput.ini +++ b/resources/DefaultInput.ini @@ -19,4 +19,6 @@ F1=ToggleEditor 2=EditorToolRotate 3=EditorToolScale X=EditorToggleTransformSpace -C=ConnectToServer \ No newline at end of file +C=ConnectToServer +N=SwitchToServer +M=SwitchToClient \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 8efd97ce..5c7e9c8f 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -10,6 +10,7 @@ Client::Client(ConfigFile* config) : m_Socket(m_IOService) int port = config->Get("Networking.Port", 13); m_ReceiverEndpoint = udp::endpoint(boost::asio::ip::address::from_string(address), port); // Set up network stream + m_PlayerName = config->Get("Networking.Name", "Raptorcopter"); m_NextSnapshot.InputForward = ""; m_NextSnapshot.InputRight = ""; } @@ -29,12 +30,11 @@ void Client::Start(World* world, EventBroker* eventBroker) m_EInputCommand = decltype(m_EInputCommand)(std::bind(&Client::OnInputCommand, this, std::placeholders::_1)); m_EventBroker->Subscribe(m_EInputCommand); - LOG_INFO("Please enter your name: "); - std::cin >> m_PlayerName; - while (m_PlayerName.size() > 7) { - LOG_INFO("Please enter your name (No longer than 7 characters):"); - std::cin >> m_PlayerName; - } + + //while (m_PlayerName.size() > 7) { + // LOG_INFO("Please enter your name (No longer than 7 characters):"); + // std::cin >> m_PlayerName; + //} m_Socket.connect(m_ReceiverEndpoint); LOG_INFO("I am client. BIP BOP"); } diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index e3f710cb..a02e2c62 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -96,7 +96,6 @@ void Game::Tick() m_ClientOrServer->Update(); } - // Iterate through systems and update world! m_SystemPipeline->Update(m_World, dt); debugTick(dt); @@ -123,6 +122,16 @@ bool Game::debugOnInputCommand(const Events::InputCommand& e) ResourceManager::Load(mapToLoad)->PopulateWorld(m_World); } } + if (e.Command == "SwitchToServer" && e.Value > 0) { + m_ClientOrServer = new Server(); + LOG_INFO("Switching to server"); + m_ClientOrServer->Start(m_World, m_EventBroker); + } + if (e.Command == "SwitchToClient" && e.Value > 0) { + m_ClientOrServer = new Client(m_Config); + m_ClientOrServer->Start(m_World, m_EventBroker); + LOG_INFO("Switching to client"); + } return false; } @@ -139,14 +148,12 @@ void Game::debugTick(double dt) void Game::networkFunction() { - std::string inputMessage; - LOG_INFO("Start client or server? (c/s)"); - std::cin >> inputMessage; - if (inputMessage == "c" || inputMessage == "C") { + bool isServer = m_Config->Get("Networking.IsServer", false); + if (!isServer) { m_IsClientOrServer = true; m_ClientOrServer = new Client(m_Config); } - if (inputMessage == "s" || inputMessage == "S") { + if (isServer) { m_IsClientOrServer = true; m_ClientOrServer = new Server(); } @@ -155,6 +162,6 @@ void Game::networkFunction() // ~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; - // Destroy it! (with fire) + // Destroy it //delete m_ClientOrServer; } \ No newline at end of file From 00bc55370d1d48ad3c7caf1dafc38640260d849b Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 18 Dec 2015 14:19:28 +0100 Subject: [PATCH 59/60] Added error check in Collision.cpp --- src/Engine/Collision/Collision.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Engine/Collision/Collision.cpp b/src/Engine/Collision/Collision.cpp index d076d1c2..c4af6258 100644 --- a/src/Engine/Collision/Collision.cpp +++ b/src/Engine/Collision/Collision.cpp @@ -252,6 +252,9 @@ bool GetEntityBox(World* world, ComponentWrapper& AABBComponent, AABB& outBox) glm::vec3 mini = outBox.MinCorner(); glm::vec3 maxi = outBox.MaxCorner(); + if (modelRes == nullptr) { + return false; + } glm::mat4 modelMatrix = modelRes->m_Matrix * glm::translate(glm::mat4(), (glm::vec3)cTrans["Position"]) * glm::scale((glm::vec3)cTrans["Scale"]); From a550b6077e0daae83d0997148d275d91195283c1 Mon Sep 17 00:00:00 2001 From: stiffly Date: Fri, 18 Dec 2015 14:25:55 +0100 Subject: [PATCH 60/60] Re-enabled InputCommand debugging info in console --- src/Engine/Input/InputProxy.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Engine/Input/InputProxy.cpp b/src/Engine/Input/InputProxy.cpp index ad589df3..c3e4d669 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(); }