aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp63
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp11
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp3
4 files changed, 55 insertions, 24 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 880d75494b5..1915e2094a7 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -669,6 +669,8 @@ Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_rep
m_regenTimer = 0;
m_regenTimerCount = 0;
+ m_holyPowerRegenTimerCount = 0;
+ m_focusRegenTimerCount = 0;
m_weaponChangeTimer = 0;
m_zoneUpdateId = 0;
@@ -956,6 +958,8 @@ bool Player::Create(uint32 guidlow, CharacterCreateInfo* createInfo)
SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_REGENERATE_POWER);
SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
SetFloatValue(UNIT_MOD_CAST_HASTE, 1.0f);
+ SetFloatValue(PLAYER_FIELD_MOD_HASTE, 1.0f);
+ SetFloatValue(PLAYER_FIELD_MOD_RANGED_HASTE, 1.0f);
SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); // default for players in 3.0.3
// -1 is default value
@@ -2483,8 +2487,13 @@ void Player::RegenerateAll()
m_regenTimerCount += m_regenTimer;
+ if (getClass() == CLASS_PALADIN)
+ m_holyPowerRegenTimerCount += m_regenTimer;
+
+ if (getClass() == CLASS_HUNTER)
+ m_focusRegenTimerCount += m_regenTimer;
+
Regenerate(POWER_ENERGY);
- Regenerate(POWER_FOCUS);
Regenerate(POWER_MANA);
// Runes act as cooldowns, and they don't need to send any data
@@ -2507,6 +2516,12 @@ void Player::RegenerateAll()
}
}
+ if (m_focusRegenTimerCount >= 1000 && getClass() == CLASS_HUNTER)
+ {
+ Regenerate(POWER_FOCUS);
+ m_focusRegenTimerCount -= 1000;
+ }
+
if (m_regenTimerCount >= 2000)
{
// Not in combat or they have regeneration
@@ -2523,6 +2538,12 @@ void Player::RegenerateAll()
m_regenTimerCount -= 2000;
}
+
+ if (m_holyPowerRegenTimerCount >= 10000 && getClass() == CLASS_PALADIN)
+ {
+ Regenerate(POWER_HOLY_POWER);
+ m_holyPowerRegenTimerCount -= 10000;
+ }
m_regenTimer = 0;
}
@@ -2541,6 +2562,11 @@ void Player::Regenerate(Powers power)
float addvalue = 0.0f;
+ // Powers now benefit from haste.
+ float rangedHaste = GetFloatValue(PLAYER_FIELD_MOD_RANGED_HASTE);
+ float meleeHaste = GetFloatValue(PLAYER_FIELD_MOD_HASTE);
+ float spellHaste = GetFloatValue(UNIT_MOD_CAST_SPEED);
+
switch (power)
{
case POWER_MANA:
@@ -2548,26 +2574,26 @@ void Player::Regenerate(Powers power)
bool recentCast = IsUnderLastManaUseEffect();
float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA);
- if (getLevel() < 15)
- ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA) * (2.066f - (getLevel() * 0.066f));
-
if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct
- addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
+ addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * ((0.001f * m_regenTimer) + CalculatePctF(0.001f, spellHaste));
else
- addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
+ addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * ((0.001f * m_regenTimer) + CalculatePctF(0.001f, spellHaste));
}
break;
- case POWER_RAGE: // Regenerate rage
+ case POWER_RAGE: // Regenerate rage
{
if (!isInCombat() && !HasAuraType(SPELL_AURA_INTERRUPT_REGEN))
{
float RageDecreaseRate = sWorld->getRate(RATE_POWER_RAGE_LOSS);
- addvalue += -25 * RageDecreaseRate; // 2.5 rage by tick (= 2 seconds => 1.25 rage/sec)
+ addvalue += -25 * RageDecreaseRate / meleeHaste; // 2.5 rage by tick (= 2 seconds => 1.25 rage/sec)
}
}
break;
- case POWER_ENERGY: // Regenerate energy (rogue)
- addvalue += 0.01f * m_regenTimer * sWorld->getRate(RATE_POWER_ENERGY);
+ case POWER_FOCUS:
+ addvalue += (6.0f + CalculatePctF(6.0f, rangedHaste)) * sWorld->getRate(RATE_POWER_FOCUS);
+ break;
+ case POWER_ENERGY: // Regenerate energy (rogue)
+ addvalue += ((0.01f * m_regenTimer) + CalculatePctF(0.01f, meleeHaste)) * sWorld->getRate(RATE_POWER_ENERGY);
break;
case POWER_RUNIC_POWER:
{
@@ -2578,9 +2604,12 @@ void Player::Regenerate(Powers power)
}
}
break;
- case POWER_FOCUS:
- addvalue += 4.0f * m_modAttackSpeedPct[RANGED_ATTACK] * sWorld->getRate(RATE_POWER_FOCUS);
- break;
+ case POWER_HOLY_POWER: // Regenerate holy power
+ {
+ if (!isInCombat())
+ addvalue += -1.0f; // remove 1 each 10 sec
+ }
+ break;
case POWER_RUNES:
case POWER_HEALTH:
break;
@@ -3209,6 +3238,8 @@ void Player::InitStatsForLevel(bool reapplyMods)
// set default cast time multiplier
SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f);
SetFloatValue(UNIT_MOD_CAST_HASTE, 1.0f);
+ SetFloatValue(PLAYER_FIELD_MOD_HASTE, 1.0f);
+ SetFloatValue(PLAYER_FIELD_MOD_RANGED_HASTE, 1.0f);
// reset size before reapply auras
SetObjectScale(1.0f);
@@ -8136,7 +8167,7 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt
SetBaseWeaponDamage(attType, MAXDAMAGE, damage);
}
- if (proto->Delay && !IsInFeralForm())
+ if (proto->Delay)
{
if (slot == EQUIPMENT_SLOT_RANGED)
SetAttackTime(RANGED_ATTACK, apply ? proto->Delay: BASE_ATTACK_TIME);
@@ -8146,10 +8177,6 @@ void Player::_ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingSt
SetAttackTime(OFF_ATTACK, apply ? proto->Delay: BASE_ATTACK_TIME);
}
- // No need to modify any physical damage for ferals as it is calculated from stats only
- if (IsInFeralForm())
- return;
-
if (CanModifyStats() && (damage || proto->Delay))
UpdateDamagePhysical(attType);
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 98f107fa541..0237a976648 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2610,6 +2610,8 @@ class Player : public Unit, public GridObject<Player>
// Gamemaster whisper whitelist
WhisperListContainer WhisperList;
uint32 m_regenTimerCount;
+ uint32 m_holyPowerRegenTimerCount;
+ uint32 m_focusRegenTimerCount;
float m_powerFraction[MAX_POWERS];
uint32 m_contestedPvPTimer;
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index eef306e5616..35ed65f2727 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -880,9 +880,14 @@ void AuraEffect::CalculatePeriodic(Unit* caster, bool create, bool load)
if (m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
caster->ModSpellCastTime(m_spellInfo, m_amplitude);
}
- // and periodic time of auras affected by SPELL_AURA_PERIODIC_HASTE
- else if (caster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, m_spellInfo) || m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
- m_amplitude = int32(m_amplitude * caster->GetFloatValue(UNIT_MOD_CAST_SPEED));
+ // and periodic time of auras affected by SPELL_AURA_PERIODIC_HASTE on player who have haste
+ else if ((caster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, m_spellInfo) || m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION) && caster->GetFloatValue(UNIT_MOD_CAST_SPEED) != 1.0f)
+ {
+ // Calculate number of ticks we must have
+ float ticks = roundf(GetBase()->GetDuration() / (m_amplitude / (1.0f + (1.0f - caster->GetFloatValue(UNIT_MOD_CAST_SPEED)))));
+
+ m_amplitude = GetBase()->GetDuration() / int32(ticks);
+ }
}
}
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index ed06902178d..771da8162f9 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -2735,9 +2735,6 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA
if (m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
m_originalCaster->ModSpellCastTime(aurSpellInfo, duration, this);
}
- // and duration of auras affected by SPELL_AURA_PERIODIC_HASTE
- else if (m_originalCaster->HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, aurSpellInfo) || m_spellInfo->AttributesEx5 & SPELL_ATTR5_HASTE_AFFECT_DURATION)
- duration = int32(duration * m_originalCaster->GetFloatValue(UNIT_MOD_CAST_SPEED));
if (duration != m_spellAura->GetMaxDuration())
{