diff options
-rw-r--r-- | src/game/Level3.cpp | 4 | ||||
-rw-r--r-- | src/game/Player.cpp | 36 | ||||
-rw-r--r-- | src/game/Player.h | 3 |
3 files changed, 37 insertions, 6 deletions
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 459beeff2f4..5abc05260f1 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -5217,6 +5217,8 @@ bool ChatHandler::HandleResetLevelCommand(const char * args) ? sWorld.getConfig(CONFIG_START_PLAYER_LEVEL) : sWorld.getConfig(CONFIG_START_HEROIC_PLAYER_LEVEL); + target->_ApplyAllLevelScaleItemMods(false); + target->SetLevel(start_level); target->InitRunes(); target->InitStatsForLevel(true); @@ -5225,6 +5227,8 @@ bool ChatHandler::HandleResetLevelCommand(const char * args) target->InitTalentForLevel(); target->SetUInt32Value(PLAYER_XP,0); + target->_ApplyAllLevelScaleItemMods(true); + // reset level for pet if(Pet* pet = target->GetPet()) pet->SynchronizeLevelWithOwner(); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 55815e4acf4..3f0add0373b 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2460,9 +2460,12 @@ void Player::GiveLevel(uint32 level) SetUInt32Value(PLAYER_NEXT_LEVEL_XP, objmgr.GetXPForLevel(level)); //update level, max level of skills - if(getLevel()!= level) - m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset + m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset + + _ApplyAllLevelScaleItemMods(false); + SetLevel(level); + UpdateSkillsForLevel (); // save base values (bonuses already included in stored stats @@ -2490,6 +2493,8 @@ void Player::GiveLevel(uint32 level) SetPower(POWER_FOCUS, 0); SetPower(POWER_HAPPINESS, 0); + _ApplyAllLevelScaleItemMods(true); + // update level to hunter/summon pet if (Pet* pet = GetPet()) pet->SynchronizeLevelWithOwner(); @@ -6666,13 +6671,16 @@ void Player::_ApplyItemMods(Item *item, uint8 slot,bool apply) sLog.outDebug("_ApplyItemMods complete."); } -void Player::_ApplyItemBonuses(ItemPrototype const *proto, uint8 slot, bool apply) +void Player::_ApplyItemBonuses(ItemPrototype const *proto, uint8 slot, bool apply, bool only_level_scale /*= false*/) { if(slot >= INVENTORY_SLOT_BAG_END || !proto) return; - ScalingStatDistributionEntry const *ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : 0; - ScalingStatValuesEntry const *ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(getLevel()) : 0; + ScalingStatDistributionEntry const *ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : NULL; + ScalingStatValuesEntry const *ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(getLevel()) : NULL; + + if(only_level_scale && !(ssd && ssv)) + return; for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) { @@ -7439,6 +7447,24 @@ void Player::_ApplyAllItemMods() sLog.outDebug("_ApplyAllItemMods complete."); } +void Player::_ApplyAllLevelScaleItemMods(bool apply) +{ + for (int i = 0; i < INVENTORY_SLOT_BAG_END; ++i) + { + if(m_items[i]) + { + if(m_items[i]->IsBroken()) + continue; + + ItemPrototype const *proto = m_items[i]->GetProto(); + if(!proto) + continue; + + _ApplyItemBonuses(proto,i, apply, true); + } + } +} + void Player::_ApplyAmmoBonuses() { // check ammo diff --git a/src/game/Player.h b/src/game/Player.h index d99d4966362..0affa3b82fd 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1815,7 +1815,8 @@ class TRINITY_DLL_SPEC Player : public Unit void _ApplyItemMods(Item *item,uint8 slot,bool apply); void _RemoveAllItemMods(); void _ApplyAllItemMods(); - void _ApplyItemBonuses(ItemPrototype const *proto,uint8 slot,bool apply); + void _ApplyAllLevelScaleItemMods(bool apply); + void _ApplyItemBonuses(ItemPrototype const *proto,uint8 slot,bool apply, bool only_level_scale = false); void _ApplyAmmoBonuses(); bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot); void ToggleMetaGemsActive(uint8 exceptslot, bool apply); |