2014-12-02 00:55:29 +02:00
|
|
|
/*
|
2016-01-01 00:34:25 +01:00
|
|
|
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
2014-12-02 00:55:29 +02:00
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
|
|
* under the terms of the GNU General Public License as published by the
|
|
|
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
|
|
|
* option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
|
|
|
* more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "CombatLogPackets.h"
|
|
|
|
|
#include "SpellPackets.h"
|
|
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellNonMeleeDamageLog::Write()
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << Me;
|
|
|
|
|
*this << CasterGUID;
|
|
|
|
|
*this << int32(SpellID);
|
|
|
|
|
*this << int32(Damage);
|
|
|
|
|
*this << int32(Overkill);
|
|
|
|
|
*this << uint8(SchoolMask);
|
|
|
|
|
*this << int32(ShieldBlock);
|
|
|
|
|
*this << int32(Resisted);
|
|
|
|
|
*this << int32(Absorbed);
|
|
|
|
|
WriteBit(Periodic);
|
|
|
|
|
WriteBits(Flags, 8);
|
|
|
|
|
WriteBit(false); // Debug info
|
|
|
|
|
WriteLogDataBit();
|
|
|
|
|
FlushBits();
|
|
|
|
|
WriteLogData();
|
2014-12-02 00:55:29 +02:00
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
2015-03-11 16:59:42 +01:00
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::EnvironmentalDamageLog::Write()
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << Victim;
|
|
|
|
|
*this << uint8(Type);
|
|
|
|
|
*this << int32(Amount);
|
|
|
|
|
*this << int32(Resisted);
|
|
|
|
|
*this << int32(Absorbed);
|
|
|
|
|
WriteLogDataBit();
|
|
|
|
|
FlushBits();
|
|
|
|
|
WriteLogData();
|
2015-03-11 16:59:42 +01:00
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
2015-04-18 17:02:33 +02:00
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellExecuteLog::Write()
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << Caster;
|
|
|
|
|
*this << SpellID;
|
|
|
|
|
*this << uint32(Effects.size());
|
2015-04-18 17:02:33 +02:00
|
|
|
|
|
|
|
|
for (SpellLogEffect const& effect : Effects)
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << effect.Effect;
|
2015-04-18 17:02:33 +02:00
|
|
|
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << uint32(effect.PowerDrainTargets.size());
|
|
|
|
|
*this << uint32(effect.ExtraAttacksTargets.size());
|
|
|
|
|
*this << uint32(effect.DurabilityDamageTargets.size());
|
|
|
|
|
*this << uint32(effect.GenericVictimTargets.size());
|
|
|
|
|
*this << uint32(effect.TradeSkillTargets.size());
|
|
|
|
|
*this << uint32(effect.FeedPetTargets.size());
|
2015-04-18 17:02:33 +02:00
|
|
|
|
|
|
|
|
for (SpellLogEffectPowerDrainParams const& powerDrainTarget : effect.PowerDrainTargets)
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << powerDrainTarget.Victim;
|
|
|
|
|
*this << powerDrainTarget.Points;
|
|
|
|
|
*this << powerDrainTarget.PowerType;
|
|
|
|
|
*this << powerDrainTarget.Amplitude;
|
2015-04-18 17:02:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (SpellLogEffectExtraAttacksParams const& extraAttacksTarget : effect.ExtraAttacksTargets)
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << extraAttacksTarget.Victim;
|
|
|
|
|
*this << extraAttacksTarget.NumAttacks;
|
2015-04-18 17:02:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (SpellLogEffectDurabilityDamageParams const& durabilityDamageTarget : effect.DurabilityDamageTargets)
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << durabilityDamageTarget.Victim;
|
|
|
|
|
*this << durabilityDamageTarget.ItemID;
|
|
|
|
|
*this << durabilityDamageTarget.Amount;
|
2015-04-18 17:02:33 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (SpellLogEffectGenericVictimParams const& genericVictimTarget : effect.GenericVictimTargets)
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << genericVictimTarget.Victim;
|
2015-04-18 17:02:33 +02:00
|
|
|
|
|
|
|
|
for (SpellLogEffectTradeSkillItemParams const& tradeSkillTarget : effect.TradeSkillTargets)
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << tradeSkillTarget.ItemID;
|
2015-04-18 17:02:33 +02:00
|
|
|
|
|
|
|
|
for (SpellLogEffectFeedPetParams const& feedPetTarget : effect.FeedPetTargets)
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << feedPetTarget.ItemID;
|
2015-04-18 17:02:33 +02:00
|
|
|
}
|
|
|
|
|
|
2015-08-06 17:08:52 +02:00
|
|
|
WriteLogDataBit();
|
|
|
|
|
FlushBits();
|
|
|
|
|
WriteLogData();
|
2015-04-18 17:02:33 +02:00
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
2015-04-19 00:59:27 +02:00
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellHealLog::Write()
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << TargetGUID;
|
|
|
|
|
*this << CasterGUID;
|
|
|
|
|
*this << int32(SpellID);
|
|
|
|
|
*this << int32(Health);
|
|
|
|
|
*this << int32(OverHeal);
|
|
|
|
|
*this << int32(Absorbed);
|
|
|
|
|
WriteBit(Crit);
|
|
|
|
|
WriteBit(Multistrike);
|
|
|
|
|
WriteBit(CritRollMade.is_initialized());
|
|
|
|
|
WriteBit(CritRollNeeded.is_initialized());
|
|
|
|
|
WriteLogDataBit();
|
|
|
|
|
FlushBits();
|
2015-04-19 00:59:27 +02:00
|
|
|
|
2015-04-26 23:45:52 +02:00
|
|
|
if (CritRollMade)
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << *CritRollMade;
|
2015-04-19 00:59:27 +02:00
|
|
|
|
2015-04-26 23:45:52 +02:00
|
|
|
if (CritRollNeeded)
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << *CritRollNeeded;
|
2015-04-19 00:59:27 +02:00
|
|
|
|
2015-08-06 17:08:52 +02:00
|
|
|
WriteLogData();
|
2015-04-19 00:59:27 +02:00
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
2015-05-26 21:51:01 +02:00
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellPeriodicAuraLog::Write()
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << TargetGUID;
|
|
|
|
|
*this << CasterGUID;
|
|
|
|
|
*this << SpellID;
|
|
|
|
|
*this << uint32(Effects.size());
|
2015-05-26 21:51:01 +02:00
|
|
|
|
|
|
|
|
for (SpellLogEffect const& effect : Effects)
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << effect.Effect;
|
|
|
|
|
*this << int32(effect.Amount);
|
|
|
|
|
*this << int32(effect.OverHealOrKill);
|
|
|
|
|
*this << int32(effect.SchoolMaskOrPower);
|
|
|
|
|
*this << int32(effect.AbsorbedOrAmplitude);
|
|
|
|
|
*this << int32(effect.Resisted);
|
|
|
|
|
WriteBit(effect.Crit);
|
|
|
|
|
WriteBit(effect.Multistrike);
|
|
|
|
|
|
|
|
|
|
if (WriteBit(effect.DebugInfo.is_initialized()))
|
2015-05-26 21:51:01 +02:00
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << float(effect.DebugInfo->CritRollMade);
|
|
|
|
|
*this << float(effect.DebugInfo->CritRollNeeded);
|
2015-05-26 21:51:01 +02:00
|
|
|
}
|
|
|
|
|
|
2015-08-06 17:08:52 +02:00
|
|
|
FlushBits();
|
2015-05-26 21:51:01 +02:00
|
|
|
}
|
|
|
|
|
|
2015-08-06 17:08:52 +02:00
|
|
|
WriteLogDataBit();
|
|
|
|
|
FlushBits();
|
|
|
|
|
WriteLogData();
|
2015-05-26 21:51:01 +02:00
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
2015-06-03 15:02:38 +02:00
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellInterruptLog::Write()
|
|
|
|
|
{
|
|
|
|
|
_worldPacket << Caster;
|
|
|
|
|
_worldPacket << Victim;
|
|
|
|
|
_worldPacket << int32(InterruptedSpellID);
|
|
|
|
|
_worldPacket << int32(SpellID);
|
|
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellEnergizeLog::Write()
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << CasterGUID;
|
|
|
|
|
*this << TargetGUID;
|
2015-06-03 15:02:38 +02:00
|
|
|
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << int32(SpellID);
|
|
|
|
|
*this << int32(Type);
|
|
|
|
|
*this << int32(Amount);
|
2015-06-03 15:02:38 +02:00
|
|
|
|
2015-08-06 17:08:52 +02:00
|
|
|
WriteLogDataBit();
|
|
|
|
|
FlushBits();
|
|
|
|
|
WriteLogData();
|
2015-06-03 15:02:38 +02:00
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
2015-06-07 17:08:45 +02:00
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellInstakillLog::Write()
|
|
|
|
|
{
|
|
|
|
|
_worldPacket << Target;
|
|
|
|
|
_worldPacket << Caster;
|
|
|
|
|
_worldPacket << int32(SpellID);
|
|
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
2015-08-05 00:08:49 +02:00
|
|
|
|
|
|
|
|
ByteBuffer& operator<<(ByteBuffer& buffer, WorldPackets::CombatLog::SpellLogMissDebug const& missDebug)
|
|
|
|
|
{
|
|
|
|
|
buffer << float(missDebug.HitRoll);
|
|
|
|
|
buffer << float(missDebug.HitRollNeeded);
|
|
|
|
|
return buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ByteBuffer& operator<<(ByteBuffer& buffer, WorldPackets::CombatLog::SpellLogMissEntry const& missEntry)
|
|
|
|
|
{
|
|
|
|
|
buffer << missEntry.Victim;
|
|
|
|
|
buffer << uint8(missEntry.MissReason);
|
|
|
|
|
if (buffer.WriteBit(missEntry.Debug.is_initialized()))
|
|
|
|
|
buffer << *missEntry.Debug;
|
|
|
|
|
|
|
|
|
|
buffer.FlushBits();
|
|
|
|
|
return buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellMissLog::Write()
|
|
|
|
|
{
|
|
|
|
|
_worldPacket << int32(SpellID);
|
|
|
|
|
_worldPacket << Caster;
|
|
|
|
|
_worldPacket << uint32(Entries.size());
|
|
|
|
|
for (SpellLogMissEntry const& missEntry : Entries)
|
|
|
|
|
_worldPacket << missEntry;
|
|
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::ProcResist::Write()
|
|
|
|
|
{
|
|
|
|
|
_worldPacket << Caster;
|
|
|
|
|
_worldPacket << Target;
|
|
|
|
|
_worldPacket << int32(SpellID);
|
|
|
|
|
_worldPacket.WriteBit(Rolled.is_initialized());
|
|
|
|
|
_worldPacket.WriteBit(Needed.is_initialized());
|
|
|
|
|
_worldPacket.FlushBits();
|
|
|
|
|
|
|
|
|
|
if (Rolled)
|
|
|
|
|
_worldPacket << *Rolled;
|
|
|
|
|
|
|
|
|
|
if (Needed)
|
|
|
|
|
_worldPacket << *Needed;
|
|
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellOrDamageImmune::Write()
|
|
|
|
|
{
|
|
|
|
|
_worldPacket << CasterGUID;
|
|
|
|
|
_worldPacket << VictimGUID;
|
|
|
|
|
_worldPacket << uint32(SpellID);
|
|
|
|
|
_worldPacket.WriteBit(IsPeriodic);
|
|
|
|
|
_worldPacket.FlushBits();
|
|
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::SpellDamageShield::Write()
|
|
|
|
|
{
|
2015-08-06 17:08:52 +02:00
|
|
|
*this << Attacker;
|
|
|
|
|
*this << Defender;
|
|
|
|
|
*this << int32(SpellID);
|
|
|
|
|
*this << int32(TotalDamage);
|
|
|
|
|
*this << int32(OverKill);
|
|
|
|
|
*this << int32(SchoolMask);
|
|
|
|
|
*this << int32(LogAbsorbed);
|
|
|
|
|
WriteLogDataBit();
|
|
|
|
|
FlushBits();
|
|
|
|
|
WriteLogData();
|
|
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write()
|
|
|
|
|
{
|
|
|
|
|
ByteBuffer attackRoundInfo;
|
|
|
|
|
attackRoundInfo << HitInfo;
|
|
|
|
|
attackRoundInfo << AttackerGUID;
|
|
|
|
|
attackRoundInfo << VictimGUID;
|
|
|
|
|
attackRoundInfo << Damage;
|
|
|
|
|
attackRoundInfo << OverDamage;
|
|
|
|
|
|
|
|
|
|
if (attackRoundInfo.WriteBit(SubDmg.is_initialized()))
|
|
|
|
|
{
|
|
|
|
|
attackRoundInfo << SubDmg->SchoolMask;
|
|
|
|
|
attackRoundInfo << SubDmg->FDamage;
|
|
|
|
|
attackRoundInfo << SubDmg->Damage;
|
|
|
|
|
if (HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB))
|
|
|
|
|
attackRoundInfo << SubDmg->Absorbed;
|
|
|
|
|
if (HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST))
|
|
|
|
|
attackRoundInfo << SubDmg->Resisted;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
attackRoundInfo << VictimState;
|
|
|
|
|
attackRoundInfo << AttackerState;
|
|
|
|
|
attackRoundInfo << MeleeSpellID;
|
|
|
|
|
if (HitInfo & HITINFO_BLOCK)
|
|
|
|
|
attackRoundInfo << BlockAmount;
|
|
|
|
|
|
|
|
|
|
if (HitInfo & HITINFO_RAGE_GAIN)
|
|
|
|
|
attackRoundInfo << RageGained;
|
|
|
|
|
|
|
|
|
|
if (HitInfo & HITINFO_UNK1)
|
|
|
|
|
{
|
|
|
|
|
attackRoundInfo << UnkState.State1;
|
|
|
|
|
attackRoundInfo << UnkState.State2;
|
|
|
|
|
attackRoundInfo << UnkState.State3;
|
|
|
|
|
attackRoundInfo << UnkState.State4;
|
|
|
|
|
attackRoundInfo << UnkState.State5;
|
|
|
|
|
attackRoundInfo << UnkState.State6;
|
|
|
|
|
attackRoundInfo << UnkState.State7;
|
|
|
|
|
attackRoundInfo << UnkState.State8;
|
|
|
|
|
attackRoundInfo << UnkState.State9;
|
|
|
|
|
attackRoundInfo << UnkState.State10;
|
|
|
|
|
attackRoundInfo << UnkState.State11;
|
|
|
|
|
attackRoundInfo << UnkState.State12;
|
|
|
|
|
}
|
|
|
|
|
if (HitInfo & (HITINFO_BLOCK | HITINFO_UNK12))
|
|
|
|
|
attackRoundInfo << Unk;
|
|
|
|
|
|
|
|
|
|
WriteLogDataBit();
|
|
|
|
|
FlushBits();
|
|
|
|
|
WriteLogData();
|
|
|
|
|
|
|
|
|
|
*this << uint32(attackRoundInfo.size());
|
|
|
|
|
_worldPacket.append(attackRoundInfo);
|
|
|
|
|
_fullLogPacket.append(attackRoundInfo);
|
2015-08-05 00:08:49 +02:00
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|
2016-02-29 01:54:18 +00:00
|
|
|
|
|
|
|
|
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)
|
2016-02-29 01:59:53 +00:00
|
|
|
{
|
|
|
|
|
_worldPacket.FlushBits();
|
2016-02-29 01:54:18 +00:00
|
|
|
_worldPacket << data;
|
2016-02-29 01:59:53 +00:00
|
|
|
}
|
2016-02-29 01:54:18 +00:00
|
|
|
|
|
|
|
|
return &_worldPacket;
|
|
|
|
|
}
|