diff options
author | Ovahlord <dreadkiller@gmx.de> | 2024-12-26 13:12:19 +0100 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-12-27 12:04:05 +0100 |
commit | aefcd2fac7bb8b1a29a3d346f79bf02d1d5efc4a (patch) | |
tree | 02909ce5934bc819c11263c50f8b832bca9a8ff2 /src | |
parent | 9aeaedeefe66c33bb72b5a1b16b17ba82c191633 (diff) |
Core/Units: moved melee attack rage generation into Unit::AttackerStateUpdate and send the generated rage in combat log packet instead of power update packets
(cherry picked from commit b179a7246d0383a6e0517107844611fa676b71c8)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 43 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 5 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_misc.cpp | 4 |
3 files changed, 35 insertions, 17 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9ddf68e72b7..41238e11aa2 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -887,15 +887,6 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons } } - // Rage from Damage made (only from direct weapon damage) - if (attacker && cleanDamage && (cleanDamage->attackType == BASE_ATTACK || cleanDamage->attackType == OFF_ATTACK) && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->GetPowerType() == POWER_RAGE) - { - uint32 rage = uint32(attacker->GetBaseAttackTime(cleanDamage->attackType) / 1000.f * 1.75f); - if (cleanDamage->attackType == OFF_ATTACK) - rage /= 2; - attacker->RewardRage(rage); - } - if (!damageDone) return 0; @@ -1319,6 +1310,7 @@ void Unit::CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, Weapon damageInfo->Blocked = 0; damageInfo->HitInfo = 0; damageInfo->TargetState = 0; + damageInfo->RageGained = 0; damageInfo->AttackType = attackType; damageInfo->ProcAttacker = PROC_FLAG_NONE; @@ -2208,6 +2200,19 @@ void Unit::DoMeleeAttackIfReady() } } +// Calculates the normalized rage amount per weapon swing +static uint32 CalcMeleeAttackRageGain(Unit const* attacker, WeaponAttackType attType) +{ + if (!attacker || (attType != BASE_ATTACK && attType != OFF_ATTACK)) + return 0; + + uint32 rage = uint32(attacker->GetBaseAttackTime(attType) / 1000.f * 1.75f); + if (attType == OFF_ATTACK) + rage /= 2; + + return rage; +} + void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extra) { if (HasUnitFlag(UNIT_FLAG_PACIFIED)) @@ -2273,6 +2278,16 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extr damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE; } + // Rage reward + if (this != victim && damageInfo.HitOutCome != MELEE_HIT_MISS && GetPowerType() == POWER_RAGE) + { + if (uint32 rageReward = CalcMeleeAttackRageGain(this, attType)) + { + damageInfo.HitInfo |= HITINFO_RAGE_GAIN; + damageInfo.RageGained = RewardRage(rageReward); + } + } + SendAttackStateUpdate(&damageInfo); _lastDamagedTargetGuid = victim->GetGUID(); @@ -2293,7 +2308,7 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extr if (attType == OFF_ATTACK) hitInfo |= HITINFO_OFFHAND; - SendAttackStateUpdate(hitInfo, victim, 0, GetMeleeDamageSchoolMask(), 0, 0, 0, VICTIMSTATE_HIT, 0); + SendAttackStateUpdate(hitInfo, victim, 0, GetMeleeDamageSchoolMask(), 0, 0, 0, VICTIMSTATE_HIT, 0, 0); } } } @@ -5558,6 +5573,7 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) packet.VictimState = damageInfo->TargetState; packet.BlockAmount = damageInfo->Blocked; + packet.RageGained = damageInfo->RageGained; packet.LogData.Initialize(damageInfo->Attacker); @@ -5568,7 +5584,7 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) SendCombatLogMessage(&packet); } -void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType*/, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount) +void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType*/, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount, uint32 RageGained) { CalcDamageInfo dmgInfo; dmgInfo.HitInfo = HitInfo; @@ -5581,6 +5597,7 @@ void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType dmgInfo.Resist = Resist; dmgInfo.TargetState = TargetState; dmgInfo.Blocked = BlockedAmount; + dmgInfo.RageGained = RageGained; SendAttackStateUpdate(&dmgInfo); } @@ -12767,7 +12784,7 @@ void Unit::UpdateHeight(float newZ) } // baseRage means damage taken when attacker = false -void Unit::RewardRage(uint32 baseRage) +int32 Unit::RewardRage(uint32 baseRage) { float addRage = baseRage; @@ -12776,7 +12793,7 @@ void Unit::RewardRage(uint32 baseRage) addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME); - ModifyPower(POWER_RAGE, uint32(addRage * 10)); + return ModifyPower(POWER_RAGE, uint32(addRage * 10), false); } void Unit::StopAttackFaction(uint32 faction_id) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index b3a4f321b8d..873b5f0c80a 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -536,6 +536,7 @@ struct CalcDamageInfo uint32 Blocked; uint32 HitInfo; uint32 TargetState; + uint32 RageGained; // Helpers WeaponAttackType AttackType; // @@ -1112,7 +1113,7 @@ class TC_GAME_API Unit : public WorldObject void DeMorph(); 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 SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount, uint32 RageGained); void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log); void SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* pInfo); void SendSpellDamageResist(Unit* target, uint32 spellId); @@ -1765,7 +1766,7 @@ class TC_GAME_API Unit : public WorldObject float GetHoverOffset() const { return HasUnitMovementFlag(MOVEMENTFLAG_HOVER) ? *m_unitData->HoverHeight : 0.0f; } - void RewardRage(uint32 baseRage); + int32 RewardRage(uint32 baseRage); virtual float GetFollowAngle() const { return static_cast<float>(M_PI/2); } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 8275a80d887..bafc1980807 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -2173,7 +2173,7 @@ public: { Unit::DealDamage(handler->GetSession()->GetPlayer(), target, damage, nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); if (target != handler->GetSession()->GetPlayer()) - handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0); + handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, SPELL_SCHOOL_MASK_NORMAL, damage, 0, 0, VICTIMSTATE_HIT, 0, 0); return true; } @@ -2199,7 +2199,7 @@ public: uint32 resist = dmgInfo.GetResist(); Unit::DealDamageMods(attacker, target, damage, &absorb); Unit::DealDamage(attacker, target, damage, nullptr, DIRECT_DAMAGE, schoolmask, nullptr, false); - attacker->SendAttackStateUpdate(HITINFO_AFFECTS_VICTIM, target, 0, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0); + attacker->SendAttackStateUpdate(HITINFO_AFFECTS_VICTIM, target, 0, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0, 0); return true; } |