Enabled server broadcasting PlayerDamage events to other players to make damage indicators work

This commit is contained in:
2016-02-12 07:03:14 +01:00
parent cc422cf73a
commit bb66f95d43
6 changed files with 46 additions and 6 deletions
+1 -1
View File
@@ -109,7 +109,7 @@ public:
bool OnPlayerDamage(const Events::PlayerDamage& e); bool OnPlayerDamage(const Events::PlayerDamage& e);
EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned; EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawned(const Events::PlayerSpawned& e); bool OnPlayerSpawned(const Events::PlayerSpawned& e);
void parsePlayerDamage(Packet& packet);
private: private:
UDPClient m_Unreliable; UDPClient m_Unreliable;
TCPClient m_Reliable; TCPClient m_Reliable;
+3 -1
View File
@@ -81,6 +81,7 @@ private:
void parseUDPConnect(Packet & packet); void parseUDPConnect(Packet & packet);
void parseTCPConnect(Packet & packet); void parseTCPConnect(Packet & packet);
void parseDisconnect(); void parseDisconnect();
bool shouldSendToClient(EntityWrapper childEntity);
// Debug event // Debug event
EventRelay<Server, Events::InputCommand> m_EInputCommand; EventRelay<Server, Events::InputCommand> m_EInputCommand;
@@ -91,7 +92,8 @@ private:
bool OnEntityDeleted(const Events::EntityDeleted& e); bool OnEntityDeleted(const Events::EntityDeleted& e);
EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted; EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted;
bool OnComponentDeleted(const Events::ComponentDeleted& e); bool OnComponentDeleted(const Events::ComponentDeleted& e);
bool shouldSendToClient(EntityWrapper childEntity); EventRelay<Server, Events::PlayerDamage> m_EPlayerDamage;
bool OnPlayerDamage(const Events::PlayerDamage& e);
}; };
#endif #endif
+21 -1
View File
@@ -119,6 +119,9 @@ void Client::parseMessageType(Packet& packet)
case MessageType::ComponentDeleted: case MessageType::ComponentDeleted:
parseComponentDeletion(packet); parseComponentDeletion(packet);
break; break;
case MessageType::OnPlayerDamage:
parsePlayerDamage(packet);
break;
default: default:
break; break;
} }
@@ -409,12 +412,17 @@ bool Client::OnInputCommand(const Events::InputCommand & e)
bool Client::OnPlayerDamage(const Events::PlayerDamage & e) bool Client::OnPlayerDamage(const Events::PlayerDamage & e)
{ {
if (e.Inflictor != m_LocalPlayer) {
return false;
}
Packet packet(MessageType::OnPlayerDamage, m_SendPacketID); Packet packet(MessageType::OnPlayerDamage, m_SendPacketID);
packet.WritePrimitive(m_ClientIDToServerID.at(e.Inflictor.ID)); packet.WritePrimitive(m_ClientIDToServerID.at(e.Inflictor.ID));
packet.WritePrimitive(m_ClientIDToServerID.at(e.Victim.ID)); packet.WritePrimitive(m_ClientIDToServerID.at(e.Victim.ID));
packet.WritePrimitive(e.Damage); packet.WritePrimitive(e.Damage);
m_Reliable.Send(packet); m_Reliable.Send(packet);
return false;
return true;
} }
bool Client::OnPlayerSpawned(const Events::PlayerSpawned& e) bool Client::OnPlayerSpawned(const Events::PlayerSpawned& e)
@@ -425,6 +433,18 @@ bool Client::OnPlayerSpawned(const Events::PlayerSpawned& e)
return true; return true;
} }
void Client::parsePlayerDamage(Packet& packet)
{
Events::PlayerDamage e;
e.Inflictor = EntityWrapper(m_World, m_ServerIDToClientID.at(packet.ReadPrimitive<EntityID>()));
e.Victim = EntityWrapper(m_World, m_ServerIDToClientID.at(packet.ReadPrimitive<EntityID>()));
e.Damage = packet.ReadPrimitive<double>();
// 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() void Client::sendLocalPlayerTransform()
{ {
if (!m_LocalPlayer.Valid()) { if (!m_LocalPlayer.Valid()) {
+12 -1
View File
@@ -11,6 +11,7 @@ Server::Server(World* world, EventBroker* eventBroker, int port)
EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &Server::OnPlayerSpawned); EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &Server::OnPlayerSpawned);
EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &Server::OnEntityDeleted); EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &Server::OnEntityDeleted);
EVENT_SUBSCRIBE_MEMBER(m_EComponentDeleted, &Server::OnComponentDeleted); EVENT_SUBSCRIBE_MEMBER(m_EComponentDeleted, &Server::OnComponentDeleted);
EVENT_SUBSCRIBE_MEMBER(m_EPlayerDamage, &Server::OnPlayerDamage);
// Bind // Bind
if (port == 0) { if (port == 0) {
@@ -411,12 +412,22 @@ bool Server::OnComponentDeleted(const Events::ComponentDeleted & e)
Packet packet = Packet(MessageType::ComponentDeleted); Packet packet = Packet(MessageType::ComponentDeleted);
packet.WritePrimitive<EntityID>(e.Entity); packet.WritePrimitive<EntityID>(e.Entity);
packet.WriteString(e.ComponentType); packet.WriteString(e.ComponentType);
reliableBroadcast(packet); reliableBroadcast(packet);
} }
} }
return false; 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() void Server::parseClientPing()
{ {
+4 -1
View File
@@ -18,7 +18,10 @@ bool DamageIndicatorSystem::OnPlayerDamage(Events::PlayerDamage& e)
return false; return false;
} }
if (e.Victim != LocalPlayer) { //if (e.Victim != LocalPlayer) {
// return false;
//}
if (e.Victim != LocalPlayer && !e.Victim.IsChildOf(LocalPlayer)) {
return false; return false;
} }
+4
View File
@@ -23,6 +23,10 @@ void HealthSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& cHea
bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e) bool HealthSystem::OnPlayerDamaged(Events::PlayerDamage& e)
{ {
if (!IsServer) {
return false;
}
ComponentWrapper cHealth = e.Victim["Health"]; ComponentWrapper cHealth = e.Victim["Health"];
double& health = cHealth["Health"]; double& health = cHealth["Health"];
health -= e.Damage; health -= e.Damage;