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();