[11354] Resolve porblems with Pet regeneration timer conflict with Creature version.

* Creature regeneration code moved to new virtual function RegenerateAll
* Pet instead direct call own regeneration code overwrite now RegenerateAll

Big thanks to Vladskywolf for problem research and original patch version.
This commit is contained in:
VladimirMangos 2011-04-15 02:11:14 +04:00
parent 24853d6410
commit 6f8aa617d0
5 changed files with 64 additions and 47 deletions

View file

@ -592,22 +592,7 @@ void Creature::Update(uint32 update_diff, uint32 diff)
// CORPSE/DEAD state will processed at next tick (in other case death timer will be updated unexpectedly)
if(!isAlive())
break;
if(m_regenTimer > 0)
{
if(update_diff >= m_regenTimer)
m_regenTimer = 0;
else
m_regenTimer -= update_diff;
}
if (m_regenTimer != 0)
break;
if (!isInCombat() || IsPolymorphed())
RegenerateHealth();
RegenerateMana();
m_regenTimer = REGEN_TIME_FULL;
RegenerateAll(update_diff);
break;
}
case CORPSE_FALLING:
@ -637,6 +622,26 @@ void Creature::StopGroupLoot()
m_groupLootId = 0;
}
void Creature::RegenerateAll(uint32 update_diff)
{
if (m_regenTimer > 0)
{
if(update_diff >= m_regenTimer)
m_regenTimer = 0;
else
m_regenTimer -= update_diff;
}
if (m_regenTimer != 0)
return;
if (!isInCombat() || IsPolymorphed())
RegenerateHealth();
RegenerateMana();
m_regenTimer = REGEN_TIME_FULL;
}
void Creature::RegenerateMana()
{
uint32 curValue = GetPower(POWER_MANA);

View file

@ -457,7 +457,9 @@ class MANGOS_DLL_SPEC Creature : public Unit
char const* GetSubName() const { return GetCreatureInfo()->SubName; }
void Update(uint32 update_diff, uint32 time); // overwrite Unit::Update
void Update(uint32 update_diff, uint32 time); // overwrite Unit::Update
virtual void RegenerateAll(uint32 update_diff);
void GetRespawnCoord(float &x, float &y, float &z, float* ori = NULL, float* dist =NULL) const;
uint32 GetEquipmentId() const { return m_equipmentId; }

View file

@ -567,35 +567,6 @@ void Pet::Update(uint32 update_diff, uint32 diff)
return;
}
}
//regenerate focus for hunter pets or energy for deathknight's ghoul
if(m_regenTimer <= update_diff)
{
switch (getPowerType())
{
case POWER_FOCUS:
case POWER_ENERGY:
Regenerate(getPowerType());
break;
default:
break;
}
m_regenTimer = 4000;
}
else
m_regenTimer -= update_diff;
if(getPetType() != HUNTER_PET)
break;
if(m_happinessTimer <= update_diff)
{
LooseHappiness();
m_happinessTimer = 7500;
}
else
m_happinessTimer -= update_diff;
break;
}
default:
@ -605,6 +576,44 @@ void Pet::Update(uint32 update_diff, uint32 diff)
Creature::Update(update_diff, diff);
}
void Pet::RegenerateAll( uint32 update_diff )
{
//regenerate focus for hunter pets or energy for deathknight's ghoul
if (m_regenTimer <= update_diff)
{
switch (getPowerType())
{
case POWER_FOCUS:
case POWER_ENERGY:
Regenerate(getPowerType());
break;
default:
break;
}
if (!isInCombat() || IsPolymorphed())
RegenerateHealth();
RegenerateMana();
m_regenTimer = 4000;
}
else
m_regenTimer -= update_diff;
if (getPetType() != HUNTER_PET)
return;
if(m_happinessTimer <= update_diff)
{
LooseHappiness();
m_happinessTimer = 7500;
}
else
m_happinessTimer -= update_diff;
}
void Pet::Regenerate(Powers power)
{
uint32 curValue = GetPower(power);

View file

@ -168,6 +168,7 @@ class Pet : public Creature
return m_autospells[pos];
}
void RegenerateAll(uint32 update_diff); // overwrite Creature::RegenerateAll
void Regenerate(Powers power);
void LooseHappiness();
HappinessState GetHappinessState();

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "11353"
#define REVISION_NR "11354"
#endif // __REVISION_NR_H__