aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.cpp29
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.h23
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp68
4 files changed, 95 insertions, 27 deletions
diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp
index 39cf8fe0284..a1aa276be2a 100644
--- a/src/server/game/Server/Packets/CombatLogPackets.cpp
+++ b/src/server/game/Server/Packets/CombatLogPackets.cpp
@@ -334,3 +334,32 @@ WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write()
return &_worldPacket;
}
+
+ByteBuffer& operator<<(ByteBuffer& buffer, WorldPackets::CombatLog::SpellDispellData const& dispellData)
+{
+ buffer << int32(dispellData.SpellID);
+ buffer.WriteBit(dispellData.Harmful);
+ buffer.WriteBit(dispellData.Rolled.is_initialized());
+ buffer.WriteBit(dispellData.Needed.is_initialized());
+ if (dispellData.Rolled.is_initialized())
+ buffer << int32(*dispellData.Rolled);
+ if (dispellData.Needed.is_initialized())
+ buffer << int32(*dispellData.Needed);
+
+ return buffer;
+}
+
+WorldPacket const* WorldPackets::CombatLog::SpellDispellLog::Write()
+{
+ _worldPacket.WriteBit(IsSteal);
+ _worldPacket.WriteBit(IsBreak);
+ _worldPacket << TargetGUID;
+ _worldPacket << CasterGUID;
+ _worldPacket << int32(DispelledBySpellID);
+
+ _worldPacket << uint32(DispellData.size());
+ for (SpellDispellData const& data : DispellData)
+ _worldPacket << data;
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h
index acad24548e1..050c436a770 100644
--- a/src/server/game/Server/Packets/CombatLogPackets.h
+++ b/src/server/game/Server/Packets/CombatLogPackets.h
@@ -198,6 +198,29 @@ namespace WorldPackets
int32 SpellID = 0;
};
+ struct SpellDispellData
+ {
+ int32 SpellID = 0;
+ bool Harmful = false;
+ Optional<int32> Rolled;
+ Optional<int32> Needed;
+ };
+
+ class SpellDispellLog : public ServerPacket
+ {
+ public:
+ SpellDispellLog() : ServerPacket(SMSG_SPELL_DISPELL_LOG, 1 + 16 + 16 + 4 + 4 + 20) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<SpellDispellData> DispellData;
+ ObjectGuid CasterGUID;
+ ObjectGuid TargetGUID;
+ int32 DispelledBySpellID = 0;
+ bool IsBreak = false;
+ bool IsSteal = false;
+ };
+
class SpellEnergizeLog final : public CombatLogServerPacket
{
public:
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 2ca5024ab67..9c3466d813b 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1605,7 +1605,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DAMAGE_SHIELD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DISPELL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DISPELL_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EXECUTE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index a43c30917b4..9a289d4bd9a 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2365,21 +2365,28 @@ void Spell::EffectDispel(SpellEffIndex effIndex)
if (success_list.empty())
return;
- WorldPacket dataSuccess(SMSG_SPELL_DISPELL_LOG, 8 + 8 + 4 + 1 + 4 + success_list.size() * 5);
- // Send packet header
- dataSuccess << unitTarget->GetPackGUID(); // Victim GUID
- dataSuccess << m_caster->GetPackGUID(); // Caster GUID
- dataSuccess << uint32(m_spellInfo->Id); // dispel spell id
- dataSuccess << uint8(0); // not used
- dataSuccess << uint32(success_list.size()); // count
- for (DispelChargesList::iterator itr = success_list.begin(); itr != success_list.end(); ++itr)
- {
- // Send dispelled spell info
- dataSuccess << uint32(itr->first->GetId()); // Spell Id
- dataSuccess << uint8(0); // 0 - dispelled !=0 cleansed
- unitTarget->RemoveAurasDueToSpellByDispel(itr->first->GetId(), m_spellInfo->Id, itr->first->GetCasterGUID(), m_caster, itr->second);
- }
- m_caster->SendMessageToSet(&dataSuccess, true);
+ WorldPackets::CombatLog::SpellDispellLog spellDispellLog;
+ spellDispellLog.IsBreak = false; // TODO: use me
+ spellDispellLog.IsSteal = false;
+
+ spellDispellLog.TargetGUID = unitTarget->GetGUID();
+ spellDispellLog.CasterGUID = m_caster->GetGUID();
+ spellDispellLog.DispelledBySpellID = m_spellInfo->Id;
+
+ for (std::pair<Aura*, uint8>& const dispellCharge : success_list)
+ {
+ WorldPackets::CombatLog::SpellDispellData dispellData;
+ dispellData.SpellID = dispellCharge.first->GetId();
+ dispellData.Harmful = false; // TODO: use me
+ dispellData.Rolled = boost::none; // TODO: use me
+ dispellData.Needed = boost::none; // TODO: use me
+
+ unitTarget->RemoveAurasDueToSpellByDispel(dispellCharge.first->GetId(), m_spellInfo->Id, dispellCharge.first->GetCasterGUID(), m_caster, dispellCharge.second);
+
+ spellDispellLog.DispellData.emplace_back(dispellData);
+ }
+
+ m_caster->SendMessageToSet(spellDispellLog.Write(), true);
CallScriptSuccessfulDispel(effIndex);
}
@@ -5204,19 +5211,28 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex /*effIndex*/)
if (success_list.empty())
return;
- WorldPacket dataSuccess(SMSG_SPELL_DISPELL_LOG, 8 + 8 + 4 + 1 + 4 + damage * 5);
- dataSuccess << unitTarget->GetPackGUID(); // Victim GUID
- dataSuccess << m_caster->GetPackGUID(); // Caster GUID
- dataSuccess << uint32(m_spellInfo->Id); // dispel spell id
- dataSuccess << uint8(0); // not used
- dataSuccess << uint32(success_list.size()); // count
- for (DispelList::iterator itr = success_list.begin(); itr!=success_list.end(); ++itr)
+ WorldPackets::CombatLog::SpellDispellLog spellDispellLog;
+ spellDispellLog.IsBreak = false; // TODO: use me
+ spellDispellLog.IsSteal = true;
+
+ spellDispellLog.TargetGUID = unitTarget->GetGUID();
+ spellDispellLog.CasterGUID = m_caster->GetGUID();
+ spellDispellLog.DispelledBySpellID = m_spellInfo->Id;
+
+ for (std::pair<uint32, ObjectGuid>& const dispell : success_list)
{
- dataSuccess << uint32(itr->first); // Spell Id
- dataSuccess << uint8(0); // 0 - steals !=0 transfers
- unitTarget->RemoveAurasDueToSpellBySteal(itr->first, itr->second, m_caster);
+ WorldPackets::CombatLog::SpellDispellData dispellData;
+ dispellData.SpellID = dispell.first;
+ dispellData.Harmful = false; // TODO: use me
+ dispellData.Rolled = boost::none; // TODO: use me
+ dispellData.Needed = boost::none; // TODO: use me
+
+ unitTarget->RemoveAurasDueToSpellBySteal(dispell.first, dispell.second, m_caster);
+
+ spellDispellLog.DispellData.emplace_back(dispellData);
}
- m_caster->SendMessageToSet(&dataSuccess, true);
+
+ m_caster->SendMessageToSet(spellDispellLog.Write(), true);
}
void Spell::EffectKillCreditPersonal(SpellEffIndex /*effIndex*/)