aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp43
-rw-r--r--src/server/game/Entities/Unit/Unit.h5
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp4
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;
}