mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 08:55:32 +01:00
Core/PacketIO: updated structure of SMSG_SPELL_PERIODIC_AURA_LOG
* debug info is no implemented since we don't know the right usage
This commit is contained in:
@@ -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())
|
||||
if (SpellInfo const* spellInfo = aura->GetSpellInfo())
|
||||
{
|
||||
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;
|
||||
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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user