mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Packets: Updated and enabled SMSG_SPELL_DISPELL_LOG
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
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(&dataSuccess, true);
|
||||
|
||||
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*/)
|
||||
|
||||
Reference in New Issue
Block a user