[8203] Correcttly re-apply level scaled item stat mods at player level change. Author: Trogvar
--HG-- branch : trunk
This commit is contained in:
@@ -5217,6 +5217,8 @@ bool ChatHandler::HandleResetLevelCommand(const char * args)
|
|||||||
? sWorld.getConfig(CONFIG_START_PLAYER_LEVEL)
|
? sWorld.getConfig(CONFIG_START_PLAYER_LEVEL)
|
||||||
: sWorld.getConfig(CONFIG_START_HEROIC_PLAYER_LEVEL);
|
: sWorld.getConfig(CONFIG_START_HEROIC_PLAYER_LEVEL);
|
||||||
|
|
||||||
|
target->_ApplyAllLevelScaleItemMods(false);
|
||||||
|
|
||||||
target->SetLevel(start_level);
|
target->SetLevel(start_level);
|
||||||
target->InitRunes();
|
target->InitRunes();
|
||||||
target->InitStatsForLevel(true);
|
target->InitStatsForLevel(true);
|
||||||
@@ -5225,6 +5227,8 @@ bool ChatHandler::HandleResetLevelCommand(const char * args)
|
|||||||
target->InitTalentForLevel();
|
target->InitTalentForLevel();
|
||||||
target->SetUInt32Value(PLAYER_XP,0);
|
target->SetUInt32Value(PLAYER_XP,0);
|
||||||
|
|
||||||
|
target->_ApplyAllLevelScaleItemMods(true);
|
||||||
|
|
||||||
// reset level for pet
|
// reset level for pet
|
||||||
if(Pet* pet = target->GetPet())
|
if(Pet* pet = target->GetPet())
|
||||||
pet->SynchronizeLevelWithOwner();
|
pet->SynchronizeLevelWithOwner();
|
||||||
|
|||||||
+31
-5
@@ -2460,9 +2460,12 @@ void Player::GiveLevel(uint32 level)
|
|||||||
SetUInt32Value(PLAYER_NEXT_LEVEL_XP, objmgr.GetXPForLevel(level));
|
SetUInt32Value(PLAYER_NEXT_LEVEL_XP, objmgr.GetXPForLevel(level));
|
||||||
|
|
||||||
//update level, max level of skills
|
//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);
|
SetLevel(level);
|
||||||
|
|
||||||
UpdateSkillsForLevel ();
|
UpdateSkillsForLevel ();
|
||||||
|
|
||||||
// save base values (bonuses already included in stored stats
|
// save base values (bonuses already included in stored stats
|
||||||
@@ -2490,6 +2493,8 @@ void Player::GiveLevel(uint32 level)
|
|||||||
SetPower(POWER_FOCUS, 0);
|
SetPower(POWER_FOCUS, 0);
|
||||||
SetPower(POWER_HAPPINESS, 0);
|
SetPower(POWER_HAPPINESS, 0);
|
||||||
|
|
||||||
|
_ApplyAllLevelScaleItemMods(true);
|
||||||
|
|
||||||
// update level to hunter/summon pet
|
// update level to hunter/summon pet
|
||||||
if (Pet* pet = GetPet())
|
if (Pet* pet = GetPet())
|
||||||
pet->SynchronizeLevelWithOwner();
|
pet->SynchronizeLevelWithOwner();
|
||||||
@@ -6666,13 +6671,16 @@ void Player::_ApplyItemMods(Item *item, uint8 slot,bool apply)
|
|||||||
sLog.outDebug("_ApplyItemMods complete.");
|
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)
|
if(slot >= INVENTORY_SLOT_BAG_END || !proto)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ScalingStatDistributionEntry const *ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : 0;
|
ScalingStatDistributionEntry const *ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : NULL;
|
||||||
ScalingStatValuesEntry const *ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(getLevel()) : 0;
|
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)
|
for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
|
||||||
{
|
{
|
||||||
@@ -7439,6 +7447,24 @@ void Player::_ApplyAllItemMods()
|
|||||||
sLog.outDebug("_ApplyAllItemMods complete.");
|
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()
|
void Player::_ApplyAmmoBonuses()
|
||||||
{
|
{
|
||||||
// check ammo
|
// check ammo
|
||||||
|
|||||||
+2
-1
@@ -1815,7 +1815,8 @@ class TRINITY_DLL_SPEC Player : public Unit
|
|||||||
void _ApplyItemMods(Item *item,uint8 slot,bool apply);
|
void _ApplyItemMods(Item *item,uint8 slot,bool apply);
|
||||||
void _RemoveAllItemMods();
|
void _RemoveAllItemMods();
|
||||||
void _ApplyAllItemMods();
|
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();
|
void _ApplyAmmoBonuses();
|
||||||
bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot);
|
bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot);
|
||||||
void ToggleMetaGemsActive(uint8 exceptslot, bool apply);
|
void ToggleMetaGemsActive(uint8 exceptslot, bool apply);
|
||||||
|
|||||||
Reference in New Issue
Block a user