diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 49 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 6 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 12 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 5 |
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); |