aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-05-15 13:44:49 -0500
committermegamage <none@none>2009-05-15 13:44:49 -0500
commita442a9b9145586b37b8d1db5efec91a232e7c382 (patch)
tree2ff606f609badef409d3c0036be12a533bc25274 /src
parent0d715cfd8f3e76f2d4deb180ffbc23af93e623a9 (diff)
[7831] Prevent have hunter pet with level greater player levels at level changes. Propertly set hunter pet xp values at level update. Author: VladimirMangos
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/Level2.cpp5
-rw-r--r--src/game/Pet.cpp31
-rw-r--r--src/game/Pet.h1
-rw-r--r--src/game/Player.cpp12
-rw-r--r--src/game/Player.h1
5 files changed, 43 insertions, 7 deletions
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp
index 782b0f9c44e..ef3cb99d919 100644
--- a/src/game/Level2.cpp
+++ b/src/game/Level2.cpp
@@ -1329,6 +1329,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 7edc9144bdc..72a4ef5be07 100644
--- a/src/game/Pet.cpp
+++ b/src/game/Pet.cpp
@@ -362,6 +362,8 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
}
m_loading = false;
+
+ SynchronizeLevelWithOwner();
return true;
}
@@ -727,12 +729,11 @@ void Pet::GivePetXP(uint32 xp)
{
newXP -= nextLvlXP;
- SetLevel( level + 1 );
+ GivePetLevel(level+1);
SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(level+1)*PET_XP_FACTOR);
level = getLevel();
nextLvlXP = GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP);
- GivePetLevel(level);
}
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, newXP);
@@ -1793,3 +1794,29 @@ void Pet::learnSpellHighRank(uint32 spellid)
if(uint32 next = spellmgr.GetNextSpellInChain(spellid))
learnSpellHighRank(next);
}
+
+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 b76b53ab554..e0cf9e49a63 100644
--- a/src/game/Pet.h
+++ b/src/game/Pet.h
@@ -168,6 +168,7 @@ class Pet : public Guardian
HappinessState GetHappinessState();
void GivePetXP(uint32 xp);
void GivePetLevel(uint32 level);
+ void SynchronizeLevelWithOwner();
bool HaveInDiet(ItemPrototype const* item) const;
uint32 GetCurrentFoodBenefitLevel(uint32 itemlevel);
void SetDuration(int32 dur) { m_duration = dur; }
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 0fec855f7a2..0da0fc805db 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -2370,10 +2370,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);
}
@@ -2559,6 +2558,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()
@@ -20653,4 +20656,3 @@ bool Player::canSeeSpellClickOn(Creature const *c) const
}
return false;
}
-
diff --git a/src/game/Player.h b/src/game/Player.h
index 230d80785a7..54560f05f03 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -884,6 +884,7 @@ class TRINITY_DLL_SPEC Player : public Unit
void GiveXP(uint32 xp, Unit* victim);
void GiveLevel(uint32 level);
+
void InitStatsForLevel(bool reapplyMods = false);
// Played Time Stuff