aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Pet/Pet.cpp39
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp2
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);