diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 4a16034b..9717d22f 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -20,6 +20,7 @@ #include "Input/EInputCommand.h" #include "Core/EPlayerDamage.h" #include "Network/EInterpolate.h" +#include "Game/Events/EPlayerSpawned.h" class Client : public Network { @@ -77,6 +78,7 @@ private: void parsePlayerConnected(Packet& packet); void parsePing(); void parseKick(); + void parsePlayersSpawned(Packet& packet); void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType); void parseSnapshot(Packet& packet); void identifyPacketLoss(); diff --git a/include/Engine/Network/MessageType.h b/include/Engine/Network/MessageType.h index 7d8094de..13ac5e9d 100644 --- a/include/Engine/Network/MessageType.h +++ b/include/Engine/Network/MessageType.h @@ -5,16 +5,17 @@ // Used to determine what type of message was sent. enum class MessageType { - Connect, - Disconnect, - Ping, - Message, - Snapshot, + Connect, + Disconnect, + Ping, + Message, + Snapshot, OnInputCommand, OnPlayerDamage, PlayerConnected, BecomePlayer, - Kick + Kick, + OnPlayerSpawned }; #endif diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index cbad08b0..cf649dba 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -16,6 +16,8 @@ #include "Core/EPlayerDamage.h" #include "Network/EPlayerDisconnected.h" +#include "Game/Events/EPlayerSpawned.h" + class Server : public Network { public: @@ -58,6 +60,7 @@ private: int receive(char* data); void readFromClients(); void send(Packet& packet, UserID user); + void send(Packet& packet, PlayerID player); void send(Packet& packet); void broadcast(Packet& packet); void sendSnapshot(); @@ -78,6 +81,8 @@ private: // Debug event EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand& e); + EventRelay m_EPlayerSpawned; + bool OnPlayerSpawned(const Events::PlayerSpawned& e); }; #endif diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 129e0b42..fb5c3573 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -92,6 +92,9 @@ void Client::parseMessageType(Packet& packet) case MessageType::Kick: parseKick(); break; + case MessageType::OnPlayerSpawned: + parsePlayersSpawned(); + break; default: break; } @@ -129,6 +132,15 @@ void Client::parseKick() m_IsConnected = false; } +void Client::parsePlayersSpawned(Packet& packet) +{ + Events::PlayerSpawned e; + e.Player = EntityWrapper(m_World, m_ServerIDToClientID[packet.ReadPrimitive()]); + e.Spawner = EntityWrapper(m_World, m_ServerIDToClientID[packet.ReadPrimitive()]); + e.PlayerID = -1; + m_EventBroker->Publish(e); +} + // Fields with strings will not work right now void Client::InterpolateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType) { diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 03b9775a..6f3c6f3a 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -132,6 +132,20 @@ void Server::send(Packet& packet, UserID user) } } +void Server::send(Packet& packet, PlayerID player) +{ + int bytesSent = m_Socket.send_to( + boost::asio::buffer(packet.Data(), packet.Size()), + m_PlayerDefinitions[player].Endpoint, + 0); + // Network Debug data + if (isReadingData) { + m_NetworkData.TotalDataSent += packet.Size(); + m_NetworkData.DataSentThisInterval += packet.Size(); + m_NetworkData.AmountOfMessagesSent++; + } +} + void Server::send(Packet & packet) { m_Socket.send_to( @@ -422,3 +436,12 @@ bool Server::OnInputCommand(const Events::InputCommand & e) return true; } + +bool Server::OnPlayerSpawned(const Events::PlayerSpawned & e) +{ + Packet packet = Packet(MessageType::OnPlayerSpawned); + packet.WritePrimitive(e.Player.ID); + packet.WritePrimitive(e.Spawner.ID); + send(packet, e.PlayerID); + return false; +}