diff options
author | Nay <dnpd.dd@gmail.com> | 2012-08-15 13:53:37 -0700 |
---|---|---|
committer | Nay <dnpd.dd@gmail.com> | 2012-08-15 13:53:37 -0700 |
commit | fe0edb08f02dac7a2ef5bbadbfd6a9aeebcbbd73 (patch) | |
tree | 482e9d49f38fb20647f6349687d5750bee37e0a8 | |
parent | ca879e96b08347076f539f74d0725f13322b5606 (diff) | |
parent | e5d43b9c59d805ad5abeb69236c3a01851ede619 (diff) |
Merge pull request #7407 from Tuxity/4.3.4
[434] Haste
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 63 | ||||
-rwxr-xr-x | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 11 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 3 |
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()) { |