diff options
| author | Vincent-Michael <Vincent_Michael@gmx.de> | 2015-04-18 17:02:33 +0200 |
|---|---|---|
| committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2015-04-18 17:02:55 +0200 |
| commit | ca5c939a8951dfb9c5da0757c4c16c00de5a46c5 (patch) | |
| tree | cabc450ef2f93cfef706c9a86bc791458cb1183b /src/server/game/Spells/Spell.cpp | |
| parent | ee6e060be8bd71025ca89338474511c22a8ab98d (diff) | |
Core/PacketIO: Updated and enabled SMSG_SPELL_EXECUTE_LOG for WoD
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 179 |
1 files changed, 97 insertions, 82 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 1df9fd000f6..c7e0a16c9ad 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -58,6 +58,7 @@ #include "Battlefield.h" #include "BattlefieldMgr.h" #include "SpellPackets.h" +#include "CombatLogPackets.h" #include "SpellHistory.h" extern pEffect SpellEffects[TOTAL_SPELL_EFFECTS]; @@ -667,7 +668,7 @@ m_spellValue(new SpellValue(caster->GetMap()->GetDifficultyID(), m_spellInfo)), && !m_spellInfo->IsPassive() && !m_spellInfo->IsPositive(); CleanupTargetList(); - memset(m_effectExecuteData, 0, MAX_SPELL_EFFECTS * sizeof(ByteBuffer*)); + CleanupExecuteLogList(); for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) m_destTargets[i] = SpellDestination(*m_caster); @@ -696,8 +697,7 @@ Spell::~Spell() ASSERT(m_caster->ToPlayer()->m_spellModTakingSpell != this); delete m_spellValue; - - CheckEffectExecuteData(); + CleanupExecuteLogList(); } void Spell::InitExplicitTargets(SpellCastTargets const& targets) @@ -4081,57 +4081,72 @@ void Spell::UpdateSpellCastDataTargets(WorldPackets::Spells::SpellCastData& data m_channelTargetEffectMask = 0; } -void Spell::SendLogExecute() +void Spell::SendSpellExecuteLog() { - WorldPacket data(SMSG_SPELL_EXECUTE_LOG, (8+4+4+4+4+8)); - - data << m_caster->GetPackGUID(); + WorldPackets::CombatLog::SpellExecuteLog spellExecuteLog; - data << uint32(m_spellInfo->Id); + spellExecuteLog.Caster = m_caster->GetGUID(); + spellExecuteLog.SpellID = m_spellInfo->Id; - uint8 effCount = 0; - for (SpellEffectInfo const* effect : GetEffects()) - { - if (effect && m_effectExecuteData[effect->EffectIndex]) - ++effCount; - } - - if (!effCount) + if (_powerDrainTargets->empty() && _extraAttacksTargets->empty() && + _durabilityDamageTargets->empty() && _genericVictimTargets->empty() && + _tradeSkillTargets->empty() && _feedPetTargets->empty()) return; - data << uint32(effCount); for (SpellEffectInfo const* effect : GetEffects()) { - if (!effect || !m_effectExecuteData[effect->EffectIndex]) + WorldPackets::CombatLog::SpellExecuteLog::SpellLogEffect spellLogEffect; + if (!effect) continue; - data << uint32(effect->Effect); // spell effect + spellLogEffect.Effect = effect->Effect; + + for (SpellLogEffectPowerDrainParams const& powerDrainParam : _powerDrainTargets[effect->EffectIndex]) + spellLogEffect.PowerDrainTargets.push_back(powerDrainParam); + + for (SpellLogEffectExtraAttacksParams const& extraAttacksTarget : _extraAttacksTargets[effect->EffectIndex]) + spellLogEffect.ExtraAttacksTargets.push_back(extraAttacksTarget); - data.append(*m_effectExecuteData[effect->EffectIndex]); + for (SpellLogEffectDurabilityDamageParams const& durabilityDamageTarget : _durabilityDamageTargets[effect->EffectIndex]) + spellLogEffect.DurabilityDamageTargets.push_back(durabilityDamageTarget); - delete m_effectExecuteData[effect->EffectIndex]; - m_effectExecuteData[effect->EffectIndex] = NULL; + for (SpellLogEffectGenericVictimParams const& genericVictimTarget : _genericVictimTargets[effect->EffectIndex]) + spellLogEffect.GenericVictimTargets.push_back(genericVictimTarget); + + for (SpellLogEffectTradeSkillItemParams const& tradeSkillTarget : _tradeSkillTargets[effect->EffectIndex]) + spellLogEffect.TradeSkillTargets.push_back(tradeSkillTarget); + + for (SpellLogEffectFeedPetParams const& feedPetTarget : _feedPetTargets[effect->EffectIndex]) + spellLogEffect.FeedPetTargets.push_back(feedPetTarget); + + spellExecuteLog.Effects.push_back(spellLogEffect); } - m_caster->SendMessageToSet(&data, true); + + m_caster->SendMessageToSet(spellExecuteLog.Write(), true); } -void Spell::ExecuteLogEffectTakeTargetPower(uint8 effIndex, Unit* target, uint32 powerType, uint32 powerTaken, float gainMultiplier) +void Spell::ExecuteLogEffectTakeTargetPower(int32 effect, Unit* target, uint32 powerType, uint32 points, float amplitude) { - InitEffectExecuteData(effIndex); - *m_effectExecuteData[effIndex] << target->GetPackGUID(); - *m_effectExecuteData[effIndex] << uint32(powerTaken); - *m_effectExecuteData[effIndex] << uint32(powerType); - *m_effectExecuteData[effIndex] << float(gainMultiplier); + SpellLogEffectPowerDrainParams spellLogEffectPowerDrainParams; + + spellLogEffectPowerDrainParams.Victim = target->GetGUID(); + spellLogEffectPowerDrainParams.Points = points; + spellLogEffectPowerDrainParams.PowerType = powerType; + spellLogEffectPowerDrainParams.Amplitude = amplitude; + + _powerDrainTargets[effect].push_back(spellLogEffectPowerDrainParams); } -void Spell::ExecuteLogEffectExtraAttacks(uint8 effIndex, Unit* victim, uint32 attCount) +void Spell::ExecuteLogEffectExtraAttacks(uint8 effect, Unit* victim, uint32 numAttacks) { - InitEffectExecuteData(effIndex); - *m_effectExecuteData[effIndex] << victim->GetPackGUID(); - *m_effectExecuteData[effIndex] << uint32(attCount); + SpellLogEffectExtraAttacksParams spellLogEffectExtraAttacksParams; + spellLogEffectExtraAttacksParams.Victim = victim->GetGUID(); + spellLogEffectExtraAttacksParams.NumAttacks = numAttacks; + + _extraAttacksTargets[effect].push_back(spellLogEffectExtraAttacksParams); } -void Spell::ExecuteLogEffectInterruptCast(uint8 /*effIndex*/, Unit* victim, uint32 spellId) +void Spell::ExecuteLogEffectInterruptCast(uint8 /*effect*/, Unit* victim, uint32 spellId) { ObjectGuid casterGuid = m_caster->GetGUID(); ObjectGuid targetGuid = victim->GetGUID(); @@ -4176,48 +4191,72 @@ void Spell::ExecuteLogEffectInterruptCast(uint8 /*effIndex*/, Unit* victim, uint m_caster->SendMessageToSet(&data, true); } -void Spell::ExecuteLogEffectDurabilityDamage(uint8 effIndex, Unit* victim, int32 itemId, int32 slot) +void Spell::ExecuteLogEffectDurabilityDamage(uint8 effect, Unit* victim, int32 itemId, int32 amount) { - InitEffectExecuteData(effIndex); - *m_effectExecuteData[effIndex] << victim->GetPackGUID(); - *m_effectExecuteData[effIndex] << int32(itemId); - *m_effectExecuteData[effIndex] << int32(slot); + SpellLogEffectDurabilityDamageParams spellLogEffectDurabilityDamageParams; + spellLogEffectDurabilityDamageParams.Victim = victim->GetGUID(); + spellLogEffectDurabilityDamageParams.ItemID = itemId; + spellLogEffectDurabilityDamageParams.Amount = amount; + + _durabilityDamageTargets[effect].push_back(spellLogEffectDurabilityDamageParams); } -void Spell::ExecuteLogEffectOpenLock(uint8 effIndex, Object* obj) +void Spell::ExecuteLogEffectOpenLock(uint8 effect, Object* obj) { - InitEffectExecuteData(effIndex); - *m_effectExecuteData[effIndex] << obj->GetPackGUID(); + SpellLogEffectGenericVictimParams spellLogEffectGenericVictimParams; + spellLogEffectGenericVictimParams.Victim = obj->GetGUID(); + + _genericVictimTargets[effect].push_back(spellLogEffectGenericVictimParams); } -void Spell::ExecuteLogEffectCreateItem(uint8 effIndex, uint32 entry) +void Spell::ExecuteLogEffectCreateItem(uint8 effect, uint32 entry) { - InitEffectExecuteData(effIndex); - *m_effectExecuteData[effIndex] << uint32(entry); + SpellLogEffectTradeSkillItemParams spellLogEffectTradeSkillItemParams; + spellLogEffectTradeSkillItemParams.ItemID = entry; + + _tradeSkillTargets[effect].push_back(spellLogEffectTradeSkillItemParams); +} + +void Spell::ExecuteLogEffectDestroyItem(uint8 effect, uint32 entry) +{ + SpellLogEffectFeedPetParams spellLogEffectFeedPetParams; + spellLogEffectFeedPetParams.ItemID = entry; + + _feedPetTargets[effect].push_back(spellLogEffectFeedPetParams); } -void Spell::ExecuteLogEffectDestroyItem(uint8 effIndex, uint32 entry) +void Spell::ExecuteLogEffectSummonObject(uint8 effect, WorldObject* obj) { - InitEffectExecuteData(effIndex); - *m_effectExecuteData[effIndex] << uint32(entry); + SpellLogEffectGenericVictimParams spellLogEffectGenericVictimParams; + spellLogEffectGenericVictimParams.Victim = obj->GetGUID(); + + _genericVictimTargets[effect].push_back(spellLogEffectGenericVictimParams); } -void Spell::ExecuteLogEffectSummonObject(uint8 effIndex, WorldObject* obj) +void Spell::ExecuteLogEffectUnsummonObject(uint8 effect, WorldObject* obj) { - InitEffectExecuteData(effIndex); - *m_effectExecuteData[effIndex] << obj->GetPackGUID(); + SpellLogEffectGenericVictimParams spellLogEffectGenericVictimParams; + spellLogEffectGenericVictimParams.Victim = obj->GetGUID(); + + _genericVictimTargets[effect].push_back(spellLogEffectGenericVictimParams); } -void Spell::ExecuteLogEffectUnsummonObject(uint8 effIndex, WorldObject* obj) +void Spell::ExecuteLogEffectResurrect(uint8 effect, Unit* target) { - InitEffectExecuteData(effIndex); - *m_effectExecuteData[effIndex] << obj->GetPackGUID(); + SpellLogEffectGenericVictimParams spellLogEffectGenericVictimParams; + spellLogEffectGenericVictimParams.Victim = target->GetGUID(); + + _genericVictimTargets[effect].push_back(spellLogEffectGenericVictimParams); } -void Spell::ExecuteLogEffectResurrect(uint8 effIndex, Unit* target) +void Spell::CleanupExecuteLogList() { - InitEffectExecuteData(effIndex); - *m_effectExecuteData[effIndex] << target->GetPackGUID(); + _durabilityDamageTargets->clear(); + _extraAttacksTargets->clear(); + _feedPetTargets->clear(); + _genericVictimTargets->clear(); + _powerDrainTargets->clear(); + _tradeSkillTargets->clear(); } void Spell::SendInterrupted(uint8 result) @@ -6946,35 +6985,11 @@ void Spell::SetSpellValue(SpellValueMod mod, int32 value) void Spell::PrepareTargetProcessing() { - CheckEffectExecuteData(); } void Spell::FinishTargetProcessing() { - SendLogExecute(); -} - -void Spell::InitEffectExecuteData(uint32 effIndex) -{ - ASSERT(effIndex < MAX_SPELL_EFFECTS); - if (!m_effectExecuteData[effIndex]) - { - m_effectExecuteData[effIndex] = new ByteBuffer(0x20); - // first dword - target counter - *m_effectExecuteData[effIndex] << uint32(1); - } - else - { - // increase target counter by one - uint32 count = (*m_effectExecuteData[effIndex]).read<uint32>(0); - (*m_effectExecuteData[effIndex]).put<uint32>(0, ++count); - } -} - -void Spell::CheckEffectExecuteData() -{ - for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) - ASSERT(!m_effectExecuteData[i]); + SendSpellExecuteLog(); } void Spell::LoadScripts() |
