aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp15
-rw-r--r--src/server/game/Server/Packets/GameObjectPackets.cpp11
-rw-r--r--src/server/game/Server/Packets/GameObjectPackets.h14
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
4 files changed, 33 insertions, 9 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index f58fcb8a69d..e39a8c96741 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -1985,14 +1985,13 @@ void GameObject::ModifyHealth(int32 change, Unit* attackerOrHealer /*= NULL*/, u
// dealing damage, send packet
if (player)
{
- WorldPacket data(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, 8 + 8 + 8 + 4 + 4);
- data << GetPackGUID();
- data << attackerOrHealer->GetPackGUID();
- data << player->GetPackGUID();
- data << uint32(-change); // change < 0 triggers SPELL_BUILDING_HEAL combat log event
- // change >= 0 triggers SPELL_BUILDING_DAMAGE event
- data << uint32(spellId);
- player->SendDirectMessage(&data);
+ WorldPackets::GameObject::DestructibleBuildingDamage packet;
+ packet.Caster = attackerOrHealer->GetGUID(); // todo: this can be a GameObject
+ packet.Target = GetGUID();
+ packet.Damage = -change;
+ packet.Owner = player->GetGUID();
+ packet.SpellID = spellId;
+ player->SendDirectMessage(packet.Write());
}
GameObjectDestructibleState newState = GetDestructibleState();
diff --git a/src/server/game/Server/Packets/GameObjectPackets.cpp b/src/server/game/Server/Packets/GameObjectPackets.cpp
index 6c182af8a97..1b8aa3df32b 100644
--- a/src/server/game/Server/Packets/GameObjectPackets.cpp
+++ b/src/server/game/Server/Packets/GameObjectPackets.cpp
@@ -48,3 +48,14 @@ WorldPacket const* WorldPackets::GameObject::GameObjectActivateAnimKit::Write()
return &_worldPacket;
}
+
+WorldPacket const * WorldPackets::GameObject::DestructibleBuildingDamage::Write()
+{
+ _worldPacket << Target;
+ _worldPacket << Owner;
+ _worldPacket << Caster;
+ _worldPacket << int32(Damage);
+ _worldPacket << int32(SpellID);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/GameObjectPackets.h b/src/server/game/Server/Packets/GameObjectPackets.h
index 31aa13f94bc..65eb2c7bed8 100644
--- a/src/server/game/Server/Packets/GameObjectPackets.h
+++ b/src/server/game/Server/Packets/GameObjectPackets.h
@@ -78,6 +78,20 @@ namespace WorldPackets
int32 AnimKitID = 0;
bool Maintain = false;
};
+
+ class DestructibleBuildingDamage final : public ServerPacket
+ {
+ public:
+ DestructibleBuildingDamage() : ServerPacket(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, 16 + 16 + 16 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Target;
+ ObjectGuid Caster;
+ ObjectGuid Owner;
+ int32 Damage = 0;
+ int32 SpellID = 0;
+ };
}
}
#endif // GOPackets_h__
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 1234e7dfcf4..e127b0e1d71 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1018,7 +1018,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DELETE_CHAR, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTROY_ARENA_UNIT, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DIFFERENT_INSTANCE_FROM_PARTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISENCHANT_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_NEVER, CONNECTION_TYPE_REALM);