diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 67 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatLogPackets.cpp | 37 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CombatLogPackets.h | 34 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 |
4 files changed, 98 insertions, 42 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 076275bf005..fd33151b37a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4818,50 +4818,37 @@ void Unit::ProcDamageAndSpell(Unit* victim, uint32 procAttacker, uint32 procVict victim->ProcDamageAndSpellFor(true, this, procVictim, procExtra, attType, procSpell, amount, procAura); } -void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* pInfo) +void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info) { - AuraEffect const* aura = pInfo->auraEff; + AuraEffect const* aura = info->auraEff; + WorldPackets::CombatLog::SpellPeriodicAuraLog data; + data.TargetGUID = GetGUID(); + data.CasterGUID = aura->GetCasterGUID(); + data.SpellID = aura->GetId(); - WorldPacket data(SMSG_SPELL_PERIODIC_AURA_LOG, 30); - data << GetPackGUID(); - data << aura->GetCasterGUID().WriteAsPacked(); - data << uint32(aura->GetId()); // spellId - data << uint32(1); // count - data << uint32(aura->GetAuraType()); // auraId - switch (aura->GetAuraType()) - { - case SPELL_AURA_PERIODIC_DAMAGE: - case SPELL_AURA_PERIODIC_DAMAGE_PERCENT: - data << uint32(pInfo->damage); // damage - data << uint32(pInfo->overDamage); // overkill? - data << uint32(aura->GetSpellInfo()->GetSchoolMask()); - data << uint32(pInfo->absorb); // absorb - data << uint32(pInfo->resist); // resist - data << uint8(pInfo->critical); // new 3.1.2 critical tick - break; - case SPELL_AURA_PERIODIC_HEAL: - case SPELL_AURA_OBS_MOD_HEALTH: - data << uint32(pInfo->damage); // damage - data << uint32(pInfo->overDamage); // overheal - data << uint32(pInfo->absorb); // absorb - data << uint8(pInfo->critical); // new 3.1.2 critical tick - break; - case SPELL_AURA_OBS_MOD_POWER: - case SPELL_AURA_PERIODIC_ENERGIZE: - data << uint32(aura->GetMiscValue()); // power type - data << uint32(pInfo->damage); // damage - break; - case SPELL_AURA_PERIODIC_MANA_LEECH: - data << uint32(aura->GetMiscValue()); // power type - data << uint32(pInfo->damage); // amount - data << float(pInfo->multiplier); // gain multiplier - break; - default: - TC_LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura %u", uint32(aura->GetAuraType())); - return; + if (SpellInfo const* spellInfo = aura->GetSpellInfo()) + { + for (SpellEffectInfoMap::const_iterator itr = spellInfo->_effects.begin(); itr != spellInfo->_effects.end(); ++itr) + { + for (SpellEffectInfo const* effect : itr->second) + { + WorldPackets::CombatLog::SpellPeriodicAuraLog::SpellLogEffect spellLogEffect; + spellLogEffect.Effect = effect->Effect; + spellLogEffect.Amount = info->damage; + spellLogEffect.OverHealOrKill = info->overDamage; + spellLogEffect.SchoolMaskOrPower = aura->GetMiscValue(); + spellLogEffect.AbsorbedOrAmplitude = info->absorb; + spellLogEffect.Resisted = info->resist; + spellLogEffect.Crit = info->critical; + spellLogEffect.Multistrike = false; // NYI + /// @todo: implement debug info + + data.Effects.push_back(spellLogEffect); + } + } } - SendMessageToSet(&data, true); + SendMessageToSet(data.Write(), true); } void Unit::SendSpellMiss(Unit* target, uint32 spellID, SpellMissInfo missInfo) diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index 0702ad63f05..6742e797c54 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -147,3 +147,40 @@ WorldPacket const* WorldPackets::CombatLog::SpellHealLog::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::CombatLog::SpellPeriodicAuraLog::Write() +{ + _worldPacket << TargetGUID; + _worldPacket << CasterGUID; + _worldPacket << SpellID; + + _worldPacket << uint32(Effects.size()); + + for (SpellLogEffect const& effect : Effects) + { + _worldPacket << effect.Effect; + _worldPacket << int32(effect.Amount); + _worldPacket << int32(effect.OverHealOrKill); + _worldPacket << int32(effect.SchoolMaskOrPower); + _worldPacket << int32(effect.AbsorbedOrAmplitude); + _worldPacket << int32(effect.Resisted); + + _worldPacket.WriteBit(effect.Crit); + _worldPacket.WriteBit(effect.Multistrike); + + if (_worldPacket.WriteBit(effect.DebugInfo.is_initialized())) + { + _worldPacket << float(effect.DebugInfo->CritRollMade); + _worldPacket << float(effect.DebugInfo->CritRollNeeded); + } + + _worldPacket.FlushBits(); + } + + _worldPacket.WriteBit(LogData.is_initialized()); + _worldPacket.FlushBits(); + if (LogData) + _worldPacket << *LogData; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index c74e8112698..a931166ef80 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -91,7 +91,6 @@ namespace WorldPackets class SpellHealLog final : public ServerPacket { public: - SpellHealLog() : ServerPacket(SMSG_SPELL_HEAL_LOG, 16 + 16 + 4 * 4 + 1) { } WorldPacket const* Write() override; @@ -108,6 +107,39 @@ namespace WorldPackets Optional<float> CritRollNeeded; Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false }; + + class SpellPeriodicAuraLog final : public ServerPacket + { + public: + struct PeriodicalAuraLogEffectDebugInfo + { + float CritRollMade = 0.0f; + float CritRollNeeded = 0.0f; + }; + + struct SpellLogEffect + { + int32 Effect = 0; + int32 Amount = 0; + int32 OverHealOrKill = 0; + int32 SchoolMaskOrPower = 0; + int32 AbsorbedOrAmplitude = 0; + int32 Resisted = 0; + bool Crit = false; + bool Multistrike = false; + Optional<PeriodicalAuraLogEffectDebugInfo> DebugInfo; + }; + + SpellPeriodicAuraLog() : ServerPacket(SMSG_SPELL_PERIODIC_AURA_LOG, 16 + 16 + 4 + 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid TargetGUID; + ObjectGuid CasterGUID; + int32 SpellID = 0; + std::vector<SpellLogEffect> Effects; + Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index e3db4d04917..48cbf7caed2 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1658,7 +1658,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MULTISTRIKE_EFFECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_NON_MELEE_DAMAGE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_OR_DAMAGE_IMMUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PERIODIC_AURA_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PERIODIC_AURA_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM); |