diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 654e9d964..31211c5ac 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -1283,6 +1283,11 @@ bool ChatHandler::HandleNpcChangeLevelCommand(const char* args) if(pCreature->isPet()) { + if(((Pet*)pCreature)->getPetType()==HUNTER_PET) + { + pCreature->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(lvl)/4); + pCreature->SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); + } ((Pet*)pCreature)->GivePetLevel(lvl); } else diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 7771b165b..607c848c4 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -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; + } +} diff --git a/src/game/Pet.h b/src/game/Pet.h index 08c72e31c..791851cd8 100644 --- a/src/game/Pet.h +++ b/src/game/Pet.h @@ -161,6 +161,7 @@ class Pet : public Creature HappinessState GetHappinessState(); void GivePetXP(uint32 xp); void GivePetLevel(uint32 level); + void SynchronizeLevelWithOwner(); bool InitStatsForLevel(uint32 level); bool HaveInDiet(ItemPrototype const* item) const; uint32 GetCurrentFoodBenefitLevel(uint32 itemlevel); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 131b0310a..b35de7b29 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2302,10 +2302,9 @@ void Player::GiveLevel(uint32 level) SetPower(POWER_FOCUS, 0); SetPower(POWER_HAPPINESS, 0); - // give level to summoned pet - Pet* pet = GetPet(); - if(pet && pet->getPetType()==SUMMON_PET) - pet->GivePetLevel(level); + // update level to hunter/summon pet + if (Pet* pet = GetPet()) + pet->SynchronizeLevelWithOwner(); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL); } @@ -2491,6 +2490,10 @@ void Player::InitStatsForLevel(bool reapplyMods) SetPower(POWER_FOCUS, 0); SetPower(POWER_HAPPINESS, 0); SetPower(POWER_RUNIC_POWER, 0); + + // update level to hunter/summon pet + if (Pet* pet = GetPet()) + pet->SynchronizeLevelWithOwner(); } void Player::SendInitialSpells() @@ -20016,4 +20019,3 @@ bool Player::canSeeSpellClickOn(Creature const *c) const } return false; } - diff --git a/src/game/Player.h b/src/game/Player.h index eadb0e028..20a917b2f 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -906,6 +906,7 @@ class MANGOS_DLL_SPEC Player : public Unit void GiveXP(uint32 xp, Unit* victim); void GiveLevel(uint32 level); + void InitStatsForLevel(bool reapplyMods = false); // Played Time Stuff diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 90577a58e..dbcc5bcf1 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7830" + #define REVISION_NR "7831" #endif // __REVISION_NR_H__