diff options
author | DDuarte <dnpd.dd@gmail.com> | 2016-02-29 01:54:18 +0000 |
---|---|---|
committer | DDuarte <dnpd.dd@gmail.com> | 2016-02-29 01:54:18 +0000 |
commit | f76771dca05874b101099f1b79fe17e651ee210a (patch) | |
tree | ba1dd150a1d7d66d84da8d592c9fdc31e99af251 | |
parent | ce0deb10132c6e85253bdc85770e931cb554920b (diff) |
Core/Packets: Updated and enabled SMSG_SPELL_DISPELL_LOG
-rw-r--r-- | src/server/game/Server/Packets/CombatLogPackets.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatLogPackets.h | 23 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 68 |
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*/) |