mirror of
https://github.com/araxiaonline/TrinityCore2.git
synced 2026-06-13 03:22:40 -04:00
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user