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);  | 
