aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Unit
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-08-08 15:15:14 +0200
committerShauren <shauren.trinity@gmail.com>2015-08-08 15:15:14 +0200
commitfcc8c2d12c775d51b56b280e6684f8d60d798c07 (patch)
tree1b6db969dcc257b7ca0dda6c1633e48996a93629 /src/server/game/Entities/Unit
parentc9e138d66d6a455a72d3fefbc0e4d5998bc338d6 (diff)
Core/PacketIO: Implemented advanced combat logging
Diffstat (limited to 'src/server/game/Entities/Unit')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp75
-rw-r--r--src/server/game/Entities/Unit/Unit.h15
2 files changed, 46 insertions, 44 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 188e39e1e2b..91beb218388 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -164,6 +164,12 @@ ProcEventInfo::ProcEventInfo(Unit* actor, Unit* actionTarget, Unit* procTarget,
_damageInfo(damageInfo), _healInfo(healInfo)
{ }
+SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask)
+ : target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), schoolMask(_schoolMask),
+ absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), preHitHealth(_target->GetHealth())
+{
+}
+
SpellInfo const* ProcEventInfo::GetSpellInfo() const
{
/// WORKAROUND: unfinished new proc system
@@ -1075,29 +1081,29 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama
damageInfo->damage = damage;
}
-void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss)
+uint32 Unit::DealSpellDamage(SpellNonMeleeDamage const* damageInfo, bool durabilityLoss)
{
- if (damageInfo == 0)
- return;
+ if (!damageInfo)
+ return 0;
Unit* victim = damageInfo->target;
if (!victim)
- return;
+ return 0;
if (!victim->IsAlive() || victim->HasUnitState(UNIT_STATE_IN_FLIGHT) || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode()))
- return;
+ return 0;
SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(damageInfo->SpellID);
- if (spellProto == NULL)
+ if (!spellProto)
{
TC_LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo->SpellID: %u", damageInfo->SpellID);
- return;
+ return 0;
}
// Call default DealDamage
CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
- DealDamage(victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss);
+ return DealDamage(victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss);
}
/// @todo for melee need create structure as in
@@ -1418,6 +1424,8 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
damageShield.LogAbsorbed = absorb;
victim->DealDamage(this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
+
+ damageShield.LogData.Initialize(this);
victim->SendCombatLogMessage(&damageShield);
}
}
@@ -1775,10 +1783,12 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe
uint32 split_absorb = 0;
DealDamageMods(caster, splitDamage, &split_absorb);
- SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo()->Id, splitDamage, schoolMask, split_absorb, 0, false, 0, false);
-
+ SpellNonMeleeDamage log(this, caster, (*itr)->GetSpellInfo()->Id, schoolMask);
CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
- DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
+ log.damage = DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
+ log.absorb = split_absorb;
+ SendSpellNonMeleeDamageLog(&log);
+
// break 'Fear' and similar auras
caster->ProcDamageAndSpellFor(true, this, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_NORMAL_HIT, BASE_ATTACK, (*itr)->GetSpellInfo(), splitDamage);
}
@@ -4807,37 +4817,27 @@ void Unit::RemoveAllGameObjects()
}
}
-void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage* log)
+void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log)
{
WorldPackets::CombatLog::SpellNonMeleeDamageLog packet;
packet.Me = log->target->GetGUID();
packet.CasterGUID = log->attacker->GetGUID();
packet.SpellID = log->SpellID;
packet.Damage = log->damage;
- int32 overkill = log->damage - log->target->GetHealth();
- packet.Overkill = (overkill > 0 ? overkill : 0);
+ if (log->damage > log->preHitHealth)
+ packet.Overkill = log->damage - log->preHitHealth;
+ else
+ packet.Overkill = 0;
+
packet.SchoolMask = log->schoolMask;
packet.ShieldBlock = log->blocked;
packet.Resisted = log->resist;
packet.Absorbed = log->absorb;
- packet.Periodic = false;
+ packet.Periodic = log->periodicLog;
packet.Flags = log->HitInfo;
SendCombatLogMessage(&packet);
}
-void Unit::SendSpellNonMeleeDamageLog(Unit* target, uint32 SpellID, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit)
-{
- SpellNonMeleeDamage log(this, target, SpellID, damageSchoolMask);
- log.damage = Damage - AbsorbedDamage - Resist - Blocked;
- log.absorb = AbsorbedDamage;
- log.resist = Resist;
- log.physicalLog = PhysicalDamage;
- log.blocked = Blocked;
- if (CriticalHit)
- log.HitInfo |= SPELL_HIT_TYPE_CRIT;
- SendSpellNonMeleeDamageLog(&log);
-}
-
void Unit::ProcDamageAndSpell(Unit* victim, uint32 procAttacker, uint32 procVictim, uint32 procExtra, uint32 amount, WeaponAttackType attType, SpellInfo const* procSpell, SpellInfo const* procAura)
{
// Not much to do if no flags are set.
@@ -4856,6 +4856,7 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info)
data.TargetGUID = GetGUID();
data.CasterGUID = aura->GetCasterGUID();
data.SpellID = aura->GetId();
+ data.LogData.Initialize(this);
/// @todo: should send more logs in one packet when multistrike
WorldPackets::CombatLog::SpellPeriodicAuraLog::SpellLogEffect spellLogEffect;
@@ -4922,6 +4923,8 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo)
packet.VictimState = damageInfo->TargetState;
packet.BlockAmount = damageInfo->blocked_amount;
+ packet.LogData.Initialize(damageInfo->attacker);
+
SendCombatLogMessage(&packet);
}
@@ -6111,8 +6114,10 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
if (pPet && pPet->GetVictim() && damage && procSpell)
{
uint32 procDmg = damage / 2;
- pPet->SendSpellNonMeleeDamageLog(pPet->GetVictim(), procSpell->Id, procDmg, procSpell->GetSchoolMask(), 0, 0, false, 0, false);
- pPet->DealDamage(pPet->GetVictim(), procDmg, NULL, SPELL_DIRECT_DAMAGE, procSpell->GetSchoolMask(), procSpell, true);
+
+ SpellNonMeleeDamage log(pPet, pPet->GetVictim(), procSpell->Id, procSpell->GetSchoolMask());
+ log.damage = pPet->DealDamage(pPet->GetVictim(), procDmg, NULL, SPELL_DIRECT_DAMAGE, procSpell->GetSchoolMask(), procSpell, true);
+ pPet->SendSpellNonMeleeDamageLog(&log);
break;
}
else
@@ -8135,6 +8140,8 @@ void Unit::SendHealSpellLog(Unit* victim, uint32 spellID, uint32 health, uint32
if (hasLogData)
SpellParsers.ReadSpellCastLogData(packet);
*/
+
+ spellHealLog.LogData.Initialize(victim);
SendCombatLogMessage(&spellHealLog);
}
@@ -8157,18 +8164,18 @@ void Unit::SendEnergizeSpellLog(Unit* victim, uint32 spellId, int32 damage, Powe
data.SpellID = spellId;
data.Type = powerType;
data.Amount = damage;
-
+ data.LogData.Initialize(victim);
SendCombatLogMessage(&data);
}
void Unit::EnergizeBySpell(Unit* victim, uint32 spellId, int32 damage, Powers powerType)
{
- SendEnergizeSpellLog(victim, spellId, damage, powerType);
- // needs to be called after sending spell log
victim->ModifyPower(powerType, damage);
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
victim->getHostileRefManager().threatAssist(this, float(damage) * 0.5f, spellInfo);
+
+ SendEnergizeSpellLog(victim, spellId, damage, powerType);
}
uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack) const
@@ -16453,7 +16460,7 @@ struct CombatLogSender
if (!player->HaveAtClient(i_source))
return;
- if (player->HasAdvancedCombatLogging())
+ if (player->IsAdvancedCombatLoggingEnabled())
player->SendDirectMessage(i_message->GetFullLogPacket());
else
player->SendDirectMessage(i_message->GetBasicLogPacket());
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index e2da54a868d..af2cad003b9 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1033,25 +1033,21 @@ struct CalcDamageInfo
// Spell damage info structure based on structure sending in SMSG_SPELLNONMELEEDAMAGELOG opcode
struct SpellNonMeleeDamage
{
- SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask)
- : target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), overkill(0), schoolMask(_schoolMask),
- absorb(0), resist(0), physicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0)
- { }
+ SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask);
Unit *target;
Unit *attacker;
uint32 SpellID;
uint32 damage;
- uint32 overkill;
uint32 schoolMask;
uint32 absorb;
uint32 resist;
- bool physicalLog;
- bool unused;
+ bool periodicLog;
uint32 blocked;
uint32 HitInfo;
// Used for help
uint32 cleanDamage;
+ uint32 preHitHealth;
};
struct SpellPeriodicAuraLogInfo
@@ -1520,7 +1516,7 @@ class Unit : public WorldObject
void HandleProcExtraAttackFor(Unit* victim);
void CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType = BASE_ATTACK, bool crit = false);
- void DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss);
+ uint32 DealSpellDamage(SpellNonMeleeDamage const* damageInfo, bool durabilityLoss);
// player or player's pet resilience (-1%)
uint32 GetDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, 1.0f, 100.0f, damage); }
@@ -1629,8 +1625,7 @@ class Unit : public WorldObject
void SendAttackStateUpdate(CalcDamageInfo* damageInfo);
void SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount);
- void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage* log);
- void SendSpellNonMeleeDamageLog(Unit* target, uint32 SpellID, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit = false);
+ void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log);
void SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* pInfo);
void SendSpellMiss(Unit* target, uint32 spellID, SpellMissInfo missInfo);
void SendSpellDamageResist(Unit* target, uint32 spellId);