From bb66f95d4375bd576b47562675bc3dde03049a51 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Fri, 12 Feb 2016 07:03:14 +0100 Subject: [PATCH] Enabled server broadcasting PlayerDamage events to other players to make damage indicators work --- include/Engine/Network/Client.h | 2 +- include/Engine/Network/Server.h | 4 +++- src/Engine/Network/Client.cpp | 22 +++++++++++++++++++++- src/Engine/Network/Server.cpp | 13 ++++++++++++- src/Game/Systems/DamageIndicatorSystem.cpp | 7 +++++-- src/Game/Systems/HealthSystem.cpp | 4 ++++ 6 files changed, 46 insertions(+), 6 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index f2b18eee..978c9b65 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -109,7 +109,7 @@ public: bool OnPlayerDamage(const Events::PlayerDamage& e); EventRelay m_EPlayerSpawned; bool OnPlayerSpawned(const Events::PlayerSpawned& e); - + void parsePlayerDamage(Packet& packet); private: UDPClient m_Unreliable; TCPClient m_Reliable; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 8a1ee514..b37bffab 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -81,6 +81,7 @@ private: void parseUDPConnect(Packet & packet); void parseTCPConnect(Packet & packet); void parseDisconnect(); + bool shouldSendToClient(EntityWrapper childEntity); // Debug event EventRelay m_EInputCommand; @@ -91,7 +92,8 @@ private: bool OnEntityDeleted(const Events::EntityDeleted& e); EventRelay m_EComponentDeleted; bool OnComponentDeleted(const Events::ComponentDeleted& e); - bool shouldSendToClient(EntityWrapper childEntity); + EventRelay m_EPlayerDamage; + bool OnPlayerDamage(const Events::PlayerDamage& e); }; #endif diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 8de62cb5..43ad8dfb 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -119,6 +119,9 @@ void Client::parseMessageType(Packet& packet) case MessageType::ComponentDeleted: parseComponentDeletion(packet); break; + case MessageType::OnPlayerDamage: + parsePlayerDamage(packet); + break; default: break; } @@ -409,12 +412,17 @@ bool Client::OnInputCommand(const Events::InputCommand & e) bool Client::OnPlayerDamage(const Events::PlayerDamage & e) { + if (e.Inflictor != m_LocalPlayer) { + return false; + } + Packet packet(MessageType::OnPlayerDamage, m_SendPacketID); packet.WritePrimitive(m_ClientIDToServerID.at(e.Inflictor.ID)); packet.WritePrimitive(m_ClientIDToServerID.at(e.Victim.ID)); packet.WritePrimitive(e.Damage); m_Reliable.Send(packet); - return false; + + return true; } bool Client::OnPlayerSpawned(const Events::PlayerSpawned& e) @@ -425,6 +433,18 @@ bool Client::OnPlayerSpawned(const Events::PlayerSpawned& e) return true; } +void Client::parsePlayerDamage(Packet& packet) +{ + Events::PlayerDamage e; + e.Inflictor = EntityWrapper(m_World, m_ServerIDToClientID.at(packet.ReadPrimitive())); + e.Victim = EntityWrapper(m_World, m_ServerIDToClientID.at(packet.ReadPrimitive())); + e.Damage = packet.ReadPrimitive(); + // Don't rebroadcast our own player damage events or we'll have an infinite loop! + if (e.Inflictor != m_LocalPlayer) { + m_EventBroker->Publish(e); + } +} + void Client::sendLocalPlayerTransform() { if (!m_LocalPlayer.Valid()) { diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 7bb2722c..233fecbd 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -11,6 +11,7 @@ Server::Server(World* world, EventBroker* eventBroker, int port) EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &Server::OnPlayerSpawned); EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &Server::OnEntityDeleted); EVENT_SUBSCRIBE_MEMBER(m_EComponentDeleted, &Server::OnComponentDeleted); + EVENT_SUBSCRIBE_MEMBER(m_EPlayerDamage, &Server::OnPlayerDamage); // Bind if (port == 0) { @@ -411,12 +412,22 @@ bool Server::OnComponentDeleted(const Events::ComponentDeleted & e) Packet packet = Packet(MessageType::ComponentDeleted); packet.WritePrimitive(e.Entity); packet.WriteString(e.ComponentType); - reliableBroadcast(packet); + reliableBroadcast(packet); } } return false; } +bool Server::OnPlayerDamage(const Events::PlayerDamage& e) +{ + Packet packet(MessageType::OnPlayerDamage); + packet.WritePrimitive(e.Inflictor.ID); + packet.WritePrimitive(e.Victim.ID); + packet.WritePrimitive(e.Damage); + reliableBroadcast(packet); + + return false; +} void Server::parseClientPing() { diff --git a/src/Game/Systems/DamageIndicatorSystem.cpp b/src/Game/Systems/DamageIndicatorSystem.cpp index 8d586ac1..09db268c 100644 --- a/src/Game/Systems/DamageIndicatorSystem.cpp +++ b/src/Game/Systems/DamageIndicatorSystem.cpp @@ -18,12 +18,15 @@ bool DamageIndicatorSystem::OnPlayerDamage(Events::PlayerDamage& e) return false; } - if (e.Victim != LocalPlayer) { + //if (e.Victim != LocalPlayer) { + // return false; + //} + if (e.Victim != LocalPlayer && !e.Victim.IsChildOf(LocalPlayer)) { return false; } if (!e.Inflictor.Valid() || !e.Victim.Valid()) { - return false; + return false; } //grab players direction diff --git a/src/Game/Systems/HealthSystem.cpp b/src/Game/Systems/HealthSystem.cpp index 719f6c9f..b21c1352 100644 --- a/src/Game/Systems/HealthSystem.cpp +++ b/src/Game/Systems/HealthSystem.cpp @@ -23,6 +23,10 @@ void HealthSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cHea bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e) { + if (!IsServer) { + return false; + } + ComponentWrapper cHealth = e.Victim["Health"]; double& health = cHealth["Health"]; health -= e.Damage;