aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp49
-rw-r--r--src/server/game/Entities/Unit/Unit.h6
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h12
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp5
4 files changed, 47 insertions, 25 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index e4fa2f4728c..c8e00647418 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -1867,7 +1867,7 @@ void Unit::HandleEmoteCommand(uint32 anim_id)
Unit::DealDamageMods(caster, splitted, &splitted_absorb);
if (Unit* attacker = damageInfo.GetAttacker())
- attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo()->Id, splitted, damageInfo.GetSchoolMask(), splitted_absorb, 0, false, 0, false);
+ attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo()->Id, splitted, damageInfo.GetSchoolMask(), splitted_absorb, 0, damageInfo.GetDamageType() == DOT, 0, false, true);
CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
Unit::DealDamage(damageInfo.GetAttacker(), caster, splitted, &cleanDamage, DIRECT_DAMAGE, damageInfo.GetSchoolMask(), (*itr)->GetSpellInfo(), false);
@@ -1912,7 +1912,7 @@ void Unit::HandleEmoteCommand(uint32 anim_id)
Unit::DealDamageMods(caster, splitDamage, &split_absorb);
if (Unit* attacker = damageInfo.GetAttacker())
- attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo()->Id, splitDamage, damageInfo.GetSchoolMask(), split_absorb, 0, false, 0, false);
+ attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo()->Id, splitDamage, damageInfo.GetSchoolMask(), split_absorb, 0, damageInfo.GetDamageType() == DOT, 0, false, true);
CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
Unit::DealDamage(damageInfo.GetAttacker(), caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, damageInfo.GetSchoolMask(), (*itr)->GetSpellInfo(), false);
@@ -5124,25 +5124,46 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage* log)
data << uint8 (log->schoolMask); // damage school
data << uint32(log->absorb); // AbsorbedDamage
data << uint32(log->resist); // resist
- data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
+ data << uint8 (log->periodicLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
data << uint8 (log->unused); // unused
data << uint32(log->blocked); // blocked
data << uint32(log->HitInfo);
- data << uint8 (0); // flag to use extend data
+ data << uint8 (log->HitInfo & (SPELL_HIT_TYPE_CRIT_DEBUG | SPELL_HIT_TYPE_HIT_DEBUG | SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG));
+ //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
+ //{
+ // data << float(log->CritRoll);
+ // data << float(log->CritNeeded);
+ //}
+ //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
+ //{
+ // data << float(log->HitRoll);
+ // data << float(log->HitNeeded);
+ //}
+ //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
+ //{
+ // data << float(log->MissChance);
+ // data << float(log->DodgeChance);
+ // data << float(log->ParryChance);
+ // data << float(log->BlockChance);
+ // data << float(log->GlanceChance);
+ // data << float(log->CrushChance);
+ //}
SendMessageToSet(&data, true);
}
-void Unit::SendSpellNonMeleeDamageLog(Unit* target, uint32 SpellID, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit)
+void Unit::SendSpellNonMeleeDamageLog(Unit* target, uint32 spellID, uint32 damage, SpellSchoolMask damageSchoolMask, uint32 absorbedDamage, uint32 resist, bool isPeriodic, uint32 blocked, bool criticalHit, bool split)
{
- SpellNonMeleeDamage log(this, target, SpellID, damageSchoolMask);
- log.damage = Damage - AbsorbedDamage - Resist - Blocked;
- log.absorb = AbsorbedDamage;
- log.resist = Resist;
- log.physicalLog = PhysicalDamage;
- log.blocked = Blocked;
- log.HitInfo = SPELL_HIT_TYPE_UNK1 | SPELL_HIT_TYPE_UNK3 | SPELL_HIT_TYPE_UNK6;
- if (CriticalHit)
+ SpellNonMeleeDamage log(this, target, spellID, damageSchoolMask);
+ log.damage = damage - absorbedDamage - resist - blocked;
+ log.absorb = absorbedDamage;
+ log.resist = resist;
+ log.periodicLog = isPeriodic;
+ log.blocked = blocked;
+ log.HitInfo = 0;
+ if (criticalHit)
log.HitInfo |= SPELL_HIT_TYPE_CRIT;
+ if (split)
+ log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
SendSpellNonMeleeDamageLog(&log);
}
@@ -9450,7 +9471,7 @@ void Unit::RemoveFromWorld()
if (IsCharmed())
RemoveCharmedBy(nullptr);
-
+
ASSERT(!GetCharmedGUID(), "Unit %u has charmed guid when removed from world", GetEntry());
ASSERT(!GetCharmerGUID(), "Unit %u has charmer guid when removed from world", GetEntry());
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 869b76c3660..7d3288e092e 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -531,7 +531,7 @@ struct TC_GAME_API 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), fullBlock(false)
+ absorb(0), resist(0), periodicLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false)
{ }
Unit *target;
@@ -542,7 +542,7 @@ struct TC_GAME_API SpellNonMeleeDamage
uint32 schoolMask;
uint32 absorb;
uint32 resist;
- bool physicalLog;
+ bool periodicLog;
bool unused;
uint32 blocked;
uint32 HitInfo;
@@ -1089,7 +1089,7 @@ class TC_GAME_API 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(Unit* target, uint32 spellID, uint32 damage, SpellSchoolMask damageSchoolMask, uint32 absorbedDamage, uint32 resist, bool isPeriodic, uint32 blocked, bool criticalHit = false, bool split = false);
void SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* pInfo);
void SendSpellDamageResist(Unit* target, uint32 spellId);
void SendSpellDamageImmune(Unit* target, uint32 spellId);
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index b6c3ac974b8..932becdffc6 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -1472,12 +1472,12 @@ enum SpellMissInfo
enum SpellHitType
{
- SPELL_HIT_TYPE_UNK1 = 0x00001,
- SPELL_HIT_TYPE_CRIT = 0x00002,
- SPELL_HIT_TYPE_UNK3 = 0x00004,
- SPELL_HIT_TYPE_UNK4 = 0x00008,
- SPELL_HIT_TYPE_UNK5 = 0x00010, // replace caster?
- SPELL_HIT_TYPE_UNK6 = 0x00020
+ SPELL_HIT_TYPE_CRIT_DEBUG = 0x01,
+ SPELL_HIT_TYPE_CRIT = 0x02,
+ SPELL_HIT_TYPE_HIT_DEBUG = 0x04,
+ SPELL_HIT_TYPE_SPLIT = 0x08,
+ SPELL_HIT_TYPE_VICTIM_IS_ATTACKER = 0x10,
+ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG = 0x20
};
enum SpellDmgClass
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 348b3409248..d89a4eb5015 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -5261,7 +5261,7 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c
// SendSpellNonMeleeDamageLog expects non-absorbed/non-resisted damage
if (caster)
- caster->SendSpellNonMeleeDamageLog(target, GetId(), damage, GetSpellInfo()->GetSchoolMask(), absorb, resist, false, 0, crit);
+ caster->SendSpellNonMeleeDamageLog(target, GetId(), damage, GetSpellInfo()->GetSchoolMask(), absorb, resist, true, 0, crit);
damage = damageInfo.GetDamage();
// Set trigger flag
@@ -5393,7 +5393,7 @@ void AuraEffect::HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const
Unit::DealDamageMods(caster, funnelDamage, &funnelAbsorb);
if (caster)
- caster->SendSpellNonMeleeDamageLog(caster, GetId(), funnelDamage, GetSpellInfo()->GetSchoolMask(), funnelAbsorb, 0, false, 0, false);
+ caster->SendSpellNonMeleeDamageLog(caster, GetId(), funnelDamage, GetSpellInfo()->GetSchoolMask(), funnelAbsorb, 0, true, 0, false);
CleanDamage cleanDamage = CleanDamage(0, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
Unit::DealDamage(caster, caster, funnelDamage, &cleanDamage, SELF_DAMAGE, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true);
@@ -5580,6 +5580,7 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con
SpellInfo const* spellProto = GetSpellInfo();
// maybe has to be sent different to client, but not by SMSG_PERIODICAURALOG
SpellNonMeleeDamage damageInfo(caster, target, spellProto->Id, spellProto->SchoolMask);
+ damageInfo.periodicLog = true;
// no SpellDamageBonus for burn mana
caster->CalculateSpellDamageTaken(&damageInfo, int32(gain * dmgMultiplier), spellProto);