rendered paste bodyIndex: Player.cpp===================================================================--- Player.cpp (revision 5465)+++ Player.cpp (working copy)@@ -110,7 +110,9 @@ m_usedTalentCount = 0; - m_regenTimer = 0;+ m_healthRegenTimer = 0;+ for (uint32 i = 0; i < MAX_POWERS; i++)+ m_powerRegenTimers[i] = 0; m_weaponChangeTimer = 0; m_zoneUpdateId = 0;@@ -162,8 +164,6 @@ m_DailyQuestChanged = false; m_lastDailyQuestTime = 0; - m_regenTimer = 0;- m_weaponChangeTimer = 0; m_breathTimer = 0; m_isunderwater = 0; m_isInWater = false;@@ -939,14 +939,6 @@ } } - if(m_regenTimer > 0)- {- if(p_time >= m_regenTimer)- m_regenTimer = 0;- else- m_regenTimer -= p_time;- }- if (m_weaponChangeTimer > 0) { if(p_time >= m_weaponChangeTimer)@@ -979,6 +971,10 @@ if (isAlive()) {+ m_healthRegenTimer -= p_time;+ for (uint32 i = 0; i < MAX_POWERS; i++)+ m_powerRegenTimers[i] -= p_time;+ RegenerateAll(); } @@ -1725,24 +1721,38 @@ void Player::RegenerateAll() {- if (m_regenTimer != 0)- return;- uint32 regenDelay = 2000;- // Not in combat or they have regeneration if( !isInCombat() || HasAuraType(SPELL_AURA_MOD_REGEN_DURING_COMBAT) || HasAuraType(SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT) || IsPolymorphed() ) {- RegenerateHealth();- if (!isInCombat() && !HasAuraType(SPELL_AURA_INTERRUPT_REGEN))- Regenerate(POWER_RAGE);+ while (m_healthRegenTimer <= 0)+ {+ RegenerateHealth();+ m_healthRegenTimer += 2000;+ } } - Regenerate( POWER_ENERGY );+ while (m_powerRegenTimers[POWER_MANA] <= 0)+ {+ Regenerate( POWER_MANA );+ m_powerRegenTimers[POWER_MANA] += 2000;+ } - Regenerate( POWER_MANA );+ while (m_powerRegenTimers[POWER_RAGE] <= 0)+ {+ Regenerate(POWER_RAGE);+ m_powerRegenTimers[POWER_RAGE] += 3000;+ } - m_regenTimer = regenDelay;+ m_powerRegenTimers[POWER_FOCUS] = 0;++ while (m_powerRegenTimers[POWER_ENERGY] <= 0)+ {+ Regenerate(POWER_ENERGY);+ m_powerRegenTimers[POWER_ENERGY] += 2000;+ }++ m_powerRegenTimers[POWER_HAPPINESS] = 0; } void Player::Regenerate(Powers power)@@ -1768,8 +1778,15 @@ } break; case POWER_RAGE: // Regenerate rage {- float RageDecreaseRate = sWorld.getRate(RATE_POWER_RAGE_LOSS);- addvalue = 30 * RageDecreaseRate; // 3 rage by tick+ int32 amount = 0;+ AuraList const& ModPowerRegenAuras = GetAurasByType(SPELL_AURA_MOD_POWER_REGEN);+ for(AuraList::const_iterator i = ModPowerRegenAuras.begin();i != ModPowerRegenAuras.end(); ++i)+ if ((*i)->GetModifier()->m_miscvalue == POWER_RAGE)+ amount += (*i)->GetModifier()->m_amount;+ addvalue = floor(float(3 * amount) / 5.0f); // stored as rage*10 per 5s, convert to rage*10 per 3s+ if (!isInCombat() && !HasAuraType(SPELL_AURA_INTERRUPT_REGEN))+ addvalue -= 30.0f; // loss of 3 rage per tick+ addvalue *= sWorld.getRate(RATE_POWER_RAGE_LOSS); } break; case POWER_ENERGY: // Regenerate energy (rogue) addvalue = 20;@@ -1787,20 +1804,12 @@ addvalue *= ((*i)->GetModifier()->m_amount + 100) / 100.0; } - if (power != POWER_RAGE)- {- curValue += uint32(addvalue);- if (curValue > maxValue)- curValue = maxValue;- }- else- {- if(curValue <= uint32(addvalue))- curValue = 0;- else- curValue -= uint32(addvalue);- }- SetPower(power, curValue);+ int32 newValue = int32(curValue) + int32(addvalue);+ if (newValue < 0)+ newValue = 0;+ if (newValue > maxValue)+ newValue = maxValue;+ SetPower(power, uint32(newValue)); } void Player::RegenerateHealth()Index: Player.h===================================================================--- Player.h (revision 5465)+++ Player.h (working copy)@@ -1205,7 +1205,8 @@ void RegenerateAll(); void Regenerate(Powers power); void RegenerateHealth();- void setRegenTimer(uint32 time) {m_regenTimer = time;}+ void setHealthRegenTimer(uint32 time) {m_healthRegenTimer = (int32)time;}+ void setPowerRegenTimer(Powers power, uint32 time) { if (power < MAX_POWERS) m_powerRegenTimers[power] = (int32)time; }; void setWeaponChangeTimer(uint32 time) {m_weaponChangeTimer = time;} uint32 GetMoney() { return GetUInt32Value (PLAYER_FIELD_COINAGE); }@@ -2033,7 +2034,8 @@ bool m_DailyQuestChanged; time_t m_lastDailyQuestTime; - uint32 m_regenTimer;+ int32 m_healthRegenTimer;+ int32 m_powerRegenTimers[MAX_POWERS]; uint32 m_breathTimer; uint32 m_drunkTimer; uint16 m_drunk;Index: SpellAuras.cpp===================================================================--- SpellAuras.cpp (revision 5465)+++ SpellAuras.cpp (working copy)@@ -1810,7 +1810,7 @@ // for players, start regeneration after 1s (in polymorph fast regeneration case) if(m_target->GetTypeId() == TYPEID_PLAYER) if (m_target->IsPolymorphed())- ((Player*)m_target)->setRegenTimer(1000);+ ((Player*)m_target)->setHealthRegenTimer(1000); Unit* caster = GetCaster(); @@ -3615,12 +3615,8 @@ m_target->HandleEmoteCommand(398); } - // Prevent rage regeneration in combat with rage loss slowdown warrior talent and 0<->1 switching range out combat.- if( !(pt == POWER_RAGE && (m_target->isInCombat() || m_target->GetPower(POWER_RAGE) == 0)) )- {- if(pt != POWER_MANA)- m_target->ModifyPower(pt, m_modifier.m_amount*2/5);- }+ if((pt != POWER_MANA) && (pt != POWER_RAGE))+ m_target->ModifyPower(pt, m_modifier.m_amount*2/5); } m_isPeriodic = apply; }