diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Pet/Pet.cpp | 39 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 2 |
2 files changed, 20 insertions, 21 deletions
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 5c53ca3cbb5..bf32213e118 100755 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -695,45 +695,44 @@ void Pet::GivePetXP(uint32 xp) if (!isAlive()) return; + + uint8 maxlevel = std::min((uint8)sWorld.getIntConfig(CONFIG_MAX_PLAYER_LEVEL), GetOwner()->getLevel()); + uint8 petlevel = getLevel(); - uint8 level = getLevel(); - - // If pet is detected to be equal to player level, don't hand out XP - if (level >= GetOwner()->getLevel()) + // If pet is detected to be at, or above(?) the players level, don't hand out XP + if (petlevel >= maxlevel) return; - uint32 curXP = GetUInt32Value(UNIT_FIELD_PETEXPERIENCE); uint32 nextLvlXP = GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP); + uint32 curXP = GetUInt32Value(UNIT_FIELD_PETEXPERIENCE); uint32 newXP = curXP + xp; // Check how much XP the pet should receive, and hand off have any left from previous levelups - while (newXP >= nextLvlXP && level < sWorld.getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) + while (newXP >= nextLvlXP && petlevel < maxlevel) { - // Subtract newXP from amount needed for nextlevel + // Subtract newXP from amount needed for nextlevel, and give pet the level newXP -= nextLvlXP; - GivePetLevel(level+1); - SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32(sObjectMgr.GetXPForLevel(level+1)*PET_XP_FACTOR)); + ++petlevel; - // Make sure we're working with the upgraded levels for the pet XP-levels - level = getLevel(); - nextLvlXP = GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP); + GivePetLevel(petlevel); - // Hitting the pet/playerlevel combolimitation, set UNIT_FIELD_PETEXPERIENCE (current XP) to 0 - if (level >= GetOwner()->getLevel()) { - newXP = 0; - SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, newXP); - return; - } + nextLvlXP = GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP); } // Not affected by special conditions - give it new XP - SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, newXP); + SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, petlevel < maxlevel ? newXP : 0); } void Pet::GivePetLevel(uint8 level) { - if (!level) + if (!level || level == getLevel()) return; + if (getPetType()==HUNTER_PET) + { + SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, 0); + SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, uint32(sObjectMgr.GetXPForLevel(level)*PET_XP_FACTOR)); + } + InitStatsForLevel(level); InitLevelupSpellsForLevel(); InitTalentForLevel(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index deb9b2c9179..5c28ca96718 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14852,7 +14852,7 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id) return NULL; } - uint8 level = (creatureTarget->getLevel() < (getLevel() - 5)) ? (getLevel() - 5) : creatureTarget->getLevel(); + uint8 level = creatureTarget->getLevel() + 5 < getLevel() ? (getLevel() - 5) : creatureTarget->getLevel(); InitTamedPet(pet, level, spell_id); |