[7831] Prevent have hunter pet with level greater player levels at level changes. Propertly set hunter pet xp values at level update.

This commit is contained in:
VladimirMangos 2009-05-15 04:56:56 +04:00
parent ac67ac8c28
commit e134b5383b
6 changed files with 44 additions and 8 deletions

View file

@ -345,6 +345,8 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
}
m_loading = false;
SynchronizeLevelWithOwner();
return true;
}
@ -732,12 +734,11 @@ void Pet::GivePetXP(uint32 xp)
{
newXP -= nextLvlXP;
SetLevel( level + 1 );
GivePetLevel(level+1);
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(level+1)/4);
level = getLevel();
nextLvlXP = GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP);
GivePetLevel(level);
}
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, newXP);
@ -1847,3 +1848,29 @@ void Pet::learnSpellHighRank(uint32 spellid)
for(SpellChainMapNext::const_iterator itr = nextMap.lower_bound(spellid); itr != nextMap.upper_bound(spellid); ++itr)
learnSpellHighRank(itr->second);
}
void Pet::SynchronizeLevelWithOwner()
{
Unit* owner = GetOwner();
if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
return;
switch(getPetType())
{
// always same level
case SUMMON_PET:
GivePetLevel(owner->getLevel());
break;
// can't be greater owner level
case HUNTER_PET:
if(getLevel() > owner->getLevel())
{
GivePetLevel(owner->getLevel());
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(owner->getLevel())/4);
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP)-1);
}
break;
default:
break;
}
}