From 2b3477fab56ca3cec90a1198d2859e7b17bfc740 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sun, 11 Sep 2022 01:19:47 +0200 Subject: [PATCH] Core/Packets: ported SMSG_SPELL_DAMAGE_SHIELD to packet class and handle its missing field --- src/server/game/Entities/Unit/Unit.cpp | 25 ++++++++++--------- .../game/Server/Packets/CombatLogPackets.cpp | 13 ++++++++++ .../game/Server/Packets/CombatLogPackets.h | 16 ++++++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 2 +- src/server/game/Server/Protocol/Opcodes.h | 2 +- 5 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 2475d5d7d1..9dc30bfe19 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1490,20 +1490,21 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) damage = SpellDamageBonusTaken(caster, spellInfo, damage, SPELL_DIRECT_DAMAGE); } - // No Unit::CalcAbsorbResist here - opcode doesn't send that data - this damage is probably not affected by that - Unit::DealDamageMods(this, damage, nullptr); + DamageInfo dmgInfo(this, victim, damage, spellInfo, spellInfo->GetSchoolMask(), SPELL_DIRECT_DAMAGE, BASE_ATTACK); + victim->CalcAbsorbResist(dmgInfo); + damage = dmgInfo.GetDamage(); + Unit::DealDamageMods(victim, damage, nullptr); /// @todo Move this to a packet handler - WorldPacket data(SMSG_SPELLDAMAGESHIELD, 8 + 8 + 4 + 4 + 4 + 4 + 4); - data << uint64(victim->GetGUID()); - data << uint64(GetGUID()); - data << uint32(spellInfo->Id); - data << uint32(damage); // Damage - int32 const overkill = int32(damage) - int32(GetHealth()); - data << uint32(std::max(overkill, 0)); // Overkill - data << uint32(spellInfo->SchoolMask); - data << uint32(0); // FIX ME: Send resisted damage, both fully resisted and partly resisted - victim->SendMessageToSet(&data, true); + WorldPackets::CombatLog::SpellDamageShield damageShield; + damageShield.Attacker = victim->GetGUID(); + damageShield.Defender = GetGUID(); + damageShield.SpellID = spellInfo->Id; + damageShield.TotalDamage = damage; + damageShield.OverKill = std::max(int32(damage) - int32(GetHealth()), 0); + damageShield.SchoolMask = spellInfo->SchoolMask; + damageShield.LogAbsorbed = dmgInfo.GetAbsorb(); + victim->SendMessageToSet(damageShield.Write(), true); Unit::DealDamage(victim, this, damage, nullptr, SPELL_DIRECT_DAMAGE, spellInfo->GetSchoolMask(), spellInfo, true); } diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index 51a67e127b..e1b404c830 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -90,3 +90,16 @@ WorldPacket const* WorldPackets::CombatLog::EnvironmentalDamageLog::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::CombatLog::SpellDamageShield::Write() +{ + _worldPacket << Defender; + _worldPacket << Attacker; + _worldPacket << int32(SpellID); + _worldPacket << int32(TotalDamage); + _worldPacket << int32(OverKill); + _worldPacket << int32(SchoolMask); + _worldPacket << int32(LogAbsorbed); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index a59d0da9da..5e93231f35 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -101,6 +101,22 @@ namespace WorldPackets int32 Absorbed = 0; uint8 Type = 0; ///< @see enum EnviromentalDamage }; + + class SpellDamageShield final : public ServerPacket + { + public: + SpellDamageShield() : ServerPacket(SMSG_SPELL_DAMAGE_SHIELD, 8 + 8 + 4 + 4 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid Attacker; + ObjectGuid Defender; + int32 SpellID = 0; + int32 TotalDamage = 0; + int32 OverKill = 0; + int32 SchoolMask = 0; + int32 LogAbsorbed = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index f84147d384..dd24c28837 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1219,7 +1219,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOCKET_GEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOR_START_EXPERIENCE_INCOMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLBREAKLOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDAMAGESHIELD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DAMAGE_SHIELD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDISPELLOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLHEALLOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 2124dd80b7..1159d823c9 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1178,7 +1178,7 @@ enum OpcodeServer SMSG_SOCKET_GEMS_RESULT = 0x6014, SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x7CA7, SMSG_SPELLBREAKLOG = 0x6B17, - SMSG_SPELLDAMAGESHIELD = 0x2927, + SMSG_SPELL_DAMAGE_SHIELD = 0x2927, SMSG_SPELLDISPELLOG = 0x4516, SMSG_SPELL_ENERGIZE_LOG = 0x0414, SMSG_SPELLHEALLOG = 0x2816,