aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/Level3.cpp4
-rw-r--r--src/game/Player.cpp36
-rw-r--r--src/game/Player.h3
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);