diff options
| author | Shauren <shauren.trinity@gmail.com> | 2018-10-04 18:50:21 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2018-11-05 00:00:34 +0100 |
| commit | 0a779bd791fb63b2fc1663206279c7eaa9c02c6f (patch) | |
| tree | cf13cec2eaab909646f278242981dd51349fddfd /src/server/game/Entities/Unit | |
| parent | 7512ffb0587eccd8fbb2a2841900d572056dbae3 (diff) | |
Core/PacketIO: Updated packet structures to 8.0.1
Diffstat (limited to 'src/server/game/Entities/Unit')
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 80 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 11 |
2 files changed, 48 insertions, 43 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6edf0663547..bb6a3e9dc5d 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -111,13 +111,13 @@ bool DispelableAura::RollDispel() const } DamageInfo::DamageInfo(Unit* attacker, Unit* victim, uint32 damage, SpellInfo const* spellInfo, SpellSchoolMask schoolMask, DamageEffectType damageType, WeaponAttackType attackType) - : m_attacker(attacker), m_victim(victim), m_damage(damage), m_spellInfo(spellInfo), m_schoolMask(schoolMask), m_damageType(damageType), m_attackType(attackType), + : m_attacker(attacker), m_victim(victim), m_damage(damage), m_originalDamage(damage), m_spellInfo(spellInfo), m_schoolMask(schoolMask), m_damageType(damageType), m_attackType(attackType), m_absorb(0), m_resist(0), m_block(0), m_hitMask(0) { } DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo) - : m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damage), m_spellInfo(nullptr), m_schoolMask(SpellSchoolMask(dmgInfo.damageSchoolMask)), + : m_attacker(dmgInfo.attacker), m_victim(dmgInfo.target), m_damage(dmgInfo.damage), m_originalDamage(dmgInfo.damage), m_spellInfo(nullptr), m_schoolMask(SpellSchoolMask(dmgInfo.damageSchoolMask)), m_damageType(DIRECT_DAMAGE), m_attackType(dmgInfo.attackType), m_absorb(dmgInfo.absorb), m_resist(dmgInfo.resist), m_block(dmgInfo.blocked_amount), m_hitMask(0) { switch (dmgInfo.TargetState) @@ -171,7 +171,7 @@ DamageInfo::DamageInfo(CalcDamageInfo const& dmgInfo) } DamageInfo::DamageInfo(SpellNonMeleeDamage const& spellNonMeleeDamage, DamageEffectType damageType, WeaponAttackType attackType, uint32 hitMask) - : m_attacker(spellNonMeleeDamage.attacker), m_victim(spellNonMeleeDamage.target), m_damage(spellNonMeleeDamage.damage), + : m_attacker(spellNonMeleeDamage.attacker), m_victim(spellNonMeleeDamage.target), m_damage(spellNonMeleeDamage.damage), m_originalDamage(spellNonMeleeDamage.originalDamage), m_spellInfo(sSpellMgr->GetSpellInfo(spellNonMeleeDamage.SpellID)), m_schoolMask(SpellSchoolMask(spellNonMeleeDamage.schoolMask)), m_damageType(damageType), m_attackType(attackType), m_absorb(spellNonMeleeDamage.absorb), m_resist(spellNonMeleeDamage.resist), m_block(spellNonMeleeDamage.blocked), m_hitMask(hitMask) { @@ -226,7 +226,7 @@ uint32 DamageInfo::GetHitMask() const } HealInfo::HealInfo(Unit* healer, Unit* target, uint32 heal, SpellInfo const* spellInfo, SpellSchoolMask schoolMask) - : _healer(healer), _target(target), _heal(heal), _effectiveHeal(0), _absorb(0), _spellInfo(spellInfo), _schoolMask(schoolMask), _hitMask(0) + : _healer(healer), _target(target), _heal(heal), _originalHeal(heal), _effectiveHeal(0), _absorb(0), _spellInfo(spellInfo), _schoolMask(schoolMask), _hitMask(0) { } @@ -279,8 +279,8 @@ SpellSchoolMask ProcEventInfo::GetSchoolMask() const } SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _SpellXSpellVisualID, uint32 _schoolMask, ObjectGuid _castId) - : target(_target), attacker(_attacker), castId(_castId), SpellID(_SpellID), SpellXSpellVisualID(_SpellXSpellVisualID), damage(0), schoolMask(_schoolMask), - absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false), preHitHealth(_target->GetHealth()) + : target(_target), attacker(_attacker), castId(_castId), SpellID(_SpellID), SpellXSpellVisualID(_SpellXSpellVisualID), damage(0), originalDamage(0), + schoolMask(_schoolMask), absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), fullBlock(false), preHitHealth(_target->GetHealth()) { } @@ -297,7 +297,7 @@ Unit::Unit(bool isWorldObject) : m_objectType |= TYPEMASK_UNIT; m_objectTypeId = TYPEID_UNIT; - m_updateFlag = UPDATEFLAG_LIVING; + m_updateFlag.MovementUpdate = true; for (uint32 i = 0; i < MAX_ATTACK; ++i) { @@ -1181,6 +1181,7 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama damage = 0; damageInfo->damage = damage; + damageInfo->originalDamage = damage; DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE, BASE_ATTACK, PROC_HIT_NONE); CalcAbsorbResist(dmgInfo); damageInfo->absorb = dmgInfo.GetAbsorb(); @@ -1227,6 +1228,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam damageInfo->damageSchoolMask = GetMeleeDamageSchoolMask(); damageInfo->attackType = attackType; damageInfo->damage = 0; + damageInfo->originalDamage = 0; damageInfo->cleanDamage = 0; damageInfo->absorb = 0; damageInfo->resist = 0; @@ -1295,17 +1297,20 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam case MELEE_HIT_EVADE: damageInfo->HitInfo |= HITINFO_MISS | HITINFO_SWINGNOHITSOUND; damageInfo->TargetState = VICTIMSTATE_EVADES; + damageInfo->originalDamage = damageInfo->damage; damageInfo->damage = 0; damageInfo->cleanDamage = 0; return; case MELEE_HIT_MISS: damageInfo->HitInfo |= HITINFO_MISS; damageInfo->TargetState = VICTIMSTATE_INTACT; + damageInfo->originalDamage = damageInfo->damage; damageInfo->damage = 0; damageInfo->cleanDamage = 0; break; case MELEE_HIT_NORMAL: damageInfo->TargetState = VICTIMSTATE_HIT; + damageInfo->originalDamage = damageInfo->damage; break; case MELEE_HIT_CRIT: { @@ -1320,21 +1325,26 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam if (mod != 0) AddPct(damageInfo->damage, mod); + + damageInfo->originalDamage = damageInfo->damage; break; } case MELEE_HIT_PARRY: damageInfo->TargetState = VICTIMSTATE_PARRY; + damageInfo->originalDamage = damageInfo->damage; damageInfo->cleanDamage += damageInfo->damage; damageInfo->damage = 0; break; case MELEE_HIT_DODGE: damageInfo->TargetState = VICTIMSTATE_DODGE; + damageInfo->originalDamage = damageInfo->damage; damageInfo->cleanDamage += damageInfo->damage; damageInfo->damage = 0; break; case MELEE_HIT_BLOCK: damageInfo->TargetState = VICTIMSTATE_HIT; damageInfo->HitInfo |= HITINFO_BLOCK; + damageInfo->originalDamage = damageInfo->damage; // 30% damage blocked, double blocked amount if block is critical damageInfo->blocked_amount = CalculatePct(damageInfo->damage, damageInfo->target->isBlockCritical() ? damageInfo->target->GetBlockPercent() * 2 : damageInfo->target->GetBlockPercent()); damageInfo->damage -= damageInfo->blocked_amount; @@ -1344,6 +1354,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam { damageInfo->HitInfo |= HITINFO_GLANCING; damageInfo->TargetState = VICTIMSTATE_HIT; + damageInfo->originalDamage = damageInfo->damage; int32 leveldif = int32(victim->getLevel()) - int32(getLevel()); if (leveldif > 3) leveldif = 3; @@ -1358,6 +1369,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam damageInfo->TargetState = VICTIMSTATE_HIT; // 150% normal damage damageInfo->damage += (damageInfo->damage / 2); + damageInfo->originalDamage = damageInfo->damage; break; default: break; @@ -1372,6 +1384,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, uint32 damage, CalcDamageInfo* dam resilienceReduction = damageInfo->damage - resilienceReduction; damageInfo->damage -= resilienceReduction; damageInfo->cleanDamage += resilienceReduction; + damageInfo->originalDamage -= resilienceReduction; // Calculate absorb resist if (int32(damageInfo->damage) > 0) @@ -1514,7 +1527,6 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) DamageInfo damageInfo(this, victim, damage, spellInfo, spellInfo->GetSchoolMask(), SPELL_DIRECT_DAMAGE, BASE_ATTACK); victim->CalcAbsorbResist(damageInfo); damage = damageInfo.GetDamage(); - // No Unit::CalcAbsorbResist here - opcode doesn't send that data - this damage is probably not affected by that victim->DealDamageMods(this, damage, nullptr); WorldPackets::CombatLog::SpellDamageShield damageShield; @@ -1522,6 +1534,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) damageShield.Defender = GetGUID(); damageShield.SpellID = spellInfo->Id; damageShield.TotalDamage = damage; + damageShield.OriginalDamage = damageInfo.GetOriginalDamage(); damageShield.OverKill = std::max(int32(damage) - int32(GetHealth()), 0); damageShield.SchoolMask = spellInfo->SchoolMask; damageShield.LogAbsorbed = damageInfo.GetAbsorb(); @@ -1881,6 +1894,7 @@ void Unit::CalcAbsorbResist(DamageInfo& damageInfo) CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL); DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, damageInfo.GetSchoolMask(), (*itr)->GetSpellInfo(), false); log.damage = splitDamage; + log.originalDamage = splitDamage; log.absorb = split_absorb; SendSpellNonMeleeDamageLog(&log); @@ -2016,6 +2030,7 @@ void Unit::FakeAttackerStateUpdate(Unit* victim, WeaponAttackType attType /*= BA damageInfo.damageSchoolMask = GetMeleeDamageSchoolMask(); damageInfo.attackType = attType; damageInfo.damage = 0; + damageInfo.originalDamage = 0; damageInfo.cleanDamage = 0; damageInfo.absorb = 0; damageInfo.resist = 0; @@ -4985,6 +5000,7 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log) packet.CastID = log->castId; packet.SpellID = log->SpellID; packet.Damage = log->damage; + packet.OriginalDamage = log->originalDamage; if (log->damage > log->preHitHealth) packet.Overkill = log->damage - log->preHitHealth; else @@ -4997,9 +5013,9 @@ void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log) packet.Periodic = log->periodicLog; packet.Flags = log->HitInfo; - WorldPackets::Spells::SandboxScalingData sandboxScalingData; - if (sandboxScalingData.GenerateDataForUnits(log->attacker, log->target)) - packet.SandboxScaling = sandboxScalingData; + WorldPackets::Spells::ContentTuningParams contentTuningParams; + if (contentTuningParams.GenerateDataForUnits(log->attacker, log->target)) + packet.ContentTuning = contentTuningParams; SendCombatLogMessage(&packet); } @@ -5025,10 +5041,10 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info) data.SpellID = aura->GetId(); data.LogData.Initialize(this); - /// @todo: should send more logs in one packet when multistrike WorldPackets::CombatLog::SpellPeriodicAuraLog::SpellLogEffect spellLogEffect; spellLogEffect.Effect = aura->GetAuraType(); spellLogEffect.Amount = info->damage; + spellLogEffect.OriginalDamage = info->originalDamage; spellLogEffect.OverHealOrKill = info->overDamage; spellLogEffect.SchoolMaskOrPower = aura->GetSpellInfo()->GetSchoolMask(); spellLogEffect.AbsorbedOrAmplitude = info->absorb; @@ -5036,10 +5052,10 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info) spellLogEffect.Crit = info->critical; /// @todo: implement debug info - WorldPackets::Spells::SandboxScalingData sandboxScalingData; + WorldPackets::Spells::ContentTuningParams contentTuningParams; if (Unit* caster = ObjectAccessor::GetUnit(*this, aura->GetCasterGUID())) - if (sandboxScalingData.GenerateDataForUnits(caster, this)) - spellLogEffect.SandboxScaling = sandboxScalingData; + if (contentTuningParams.GenerateDataForUnits(caster, this)) + spellLogEffect.ContentTuning = contentTuningParams; data.Effects.push_back(spellLogEffect); @@ -5081,6 +5097,7 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) packet.AttackerGUID = damageInfo->attacker->GetGUID(); packet.VictimGUID = damageInfo->target->GetGUID(); packet.Damage = damageInfo->damage; + packet.OriginalDamage = damageInfo->originalDamage; int32 overkill = damageInfo->damage - damageInfo->target->GetHealth(); packet.OverDamage = (overkill < 0 ? -1 : overkill); @@ -5096,9 +5113,9 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) packet.LogData.Initialize(damageInfo->attacker); - WorldPackets::Spells::SandboxScalingData sandboxScalingData; - if (sandboxScalingData.GenerateDataForUnits(damageInfo->attacker, damageInfo->target)) - packet.SandboxScaling = sandboxScalingData; + WorldPackets::Spells::ContentTuningParams contentTuningParams; + if (contentTuningParams.GenerateDataForUnits(damageInfo->attacker, damageInfo->target)) + packet.ContentTuning = contentTuningParams; SendCombatLogMessage(&packet); } @@ -5110,6 +5127,7 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType dmgInfo.attacker = this; dmgInfo.target = target; dmgInfo.damage = Damage - AbsorbDamage - Resist - BlockedAmount; + dmgInfo.originalDamage = Damage; dmgInfo.damageSchoolMask = damageSchoolMask; dmgInfo.absorb = AbsorbDamage; dmgInfo.resist = Resist; @@ -6334,32 +6352,12 @@ void Unit::SendHealSpellLog(HealInfo& healInfo, bool critical /*= false*/) spellHealLog.TargetGUID = healInfo.GetTarget()->GetGUID(); spellHealLog.CasterGUID = healInfo.GetHealer()->GetGUID(); - spellHealLog.SpellID = healInfo.GetSpellInfo()->Id; spellHealLog.Health = healInfo.GetHeal(); + spellHealLog.OriginalHeal = healInfo.GetOriginalHeal(); spellHealLog.OverHeal = int32(healInfo.GetHeal()) - healInfo.GetEffectiveHeal(); spellHealLog.Absorbed = healInfo.GetAbsorb(); - spellHealLog.Crit = critical; - - /// @todo: 6.x Has to be implemented - /* - packet.ReadBit("Multistrike"); - - var hasCritRollMade = packet.ReadBit("HasCritRollMade"); - var hasCritRollNeeded = packet.ReadBit("HasCritRollNeeded"); - var hasLogData = packet.ReadBit("HasLogData"); - - if (hasCritRollMade) - packet.ReadSingle("CritRollMade"); - - if (hasCritRollNeeded) - packet.ReadSingle("CritRollNeeded"); - - if (hasLogData) - SpellParsers.ReadSpellCastLogData(packet); - */ - spellHealLog.LogData.Initialize(healInfo.GetTarget()); SendCombatLogMessage(&spellHealLog); } @@ -11665,7 +11663,7 @@ bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry, bool loading /*= fa return false; m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry); - m_updateFlag |= UPDATEFLAG_VEHICLE; + m_updateFlag.Vehicle = true; m_unitTypeMask |= UNIT_MASK_VEHICLE; if (!loading) @@ -11687,7 +11685,7 @@ void Unit::RemoveVehicleKit(bool onRemoveFromWorld /*= false*/) m_vehicleKit = NULL; - m_updateFlag &= ~UPDATEFLAG_VEHICLE; + m_updateFlag.Vehicle = false; m_unitTypeMask &= ~UNIT_MASK_VEHICLE; RemoveFlag64(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK | UNIT_NPC_FLAG_PLAYER_VEHICLE); } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 94d2fa06c75..77e23462cd8 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -576,6 +576,7 @@ class TC_GAME_API DamageInfo Unit* const m_attacker; Unit* const m_victim; uint32 m_damage; + uint32 const m_originalDamage; SpellInfo const* const m_spellInfo; SpellSchoolMask const m_schoolMask; DamageEffectType const m_damageType; @@ -601,6 +602,7 @@ class TC_GAME_API DamageInfo DamageEffectType GetDamageType() const { return m_damageType; } WeaponAttackType GetAttackType() const { return m_attackType; } uint32 GetDamage() const { return m_damage; } + uint32 GetOriginalDamage() const { return m_originalDamage; } uint32 GetAbsorb() const { return m_absorb; } uint32 GetResist() const { return m_resist; } uint32 GetBlock() const { return m_block; } @@ -614,6 +616,7 @@ class TC_GAME_API HealInfo Unit* const _healer; Unit* const _target; uint32 _heal; + uint32 const _originalHeal; uint32 _effectiveHeal; uint32 _absorb; SpellInfo const* const _spellInfo; @@ -629,6 +632,7 @@ class TC_GAME_API HealInfo Unit* GetHealer() const { return _healer; } Unit* GetTarget() const { return _target; } uint32 GetHeal() const { return _heal; } + uint32 GetOriginalHeal() const { return _originalHeal; } uint32 GetEffectiveHeal() const { return _effectiveHeal; } uint32 GetAbsorb() const { return _absorb; } SpellInfo const* GetSpellInfo() const { return _spellInfo; }; @@ -682,6 +686,7 @@ struct CalcDamageInfo Unit *target; // Target for damage uint32 damageSchoolMask; uint32 damage; + uint32 originalDamage; uint32 absorb; uint32 resist; uint32 blocked_amount; @@ -706,6 +711,7 @@ struct TC_GAME_API SpellNonMeleeDamage uint32 SpellID; uint32 SpellXSpellVisualID; uint32 damage; + uint32 originalDamage; uint32 schoolMask; uint32 absorb; uint32 resist; @@ -720,11 +726,12 @@ struct TC_GAME_API SpellNonMeleeDamage struct SpellPeriodicAuraLogInfo { - SpellPeriodicAuraLogInfo(AuraEffect const* _auraEff, uint32 _damage, uint32 _overDamage, uint32 _absorb, uint32 _resist, float _multiplier, bool _critical) - : auraEff(_auraEff), damage(_damage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier), critical(_critical){ } + SpellPeriodicAuraLogInfo(AuraEffect const* _auraEff, uint32 _damage, uint32 _originalDamage, uint32 _overDamage, uint32 _absorb, uint32 _resist, float _multiplier, bool _critical) + : auraEff(_auraEff), damage(_damage), originalDamage(_originalDamage), overDamage(_overDamage), absorb(_absorb), resist(_resist), multiplier(_multiplier), critical(_critical){ } AuraEffect const* auraEff; uint32 damage; + uint32 originalDamage; uint32 overDamage; // overkill/overheal uint32 absorb; uint32 resist; |
