Core/Player: updated per kill experience to Cataclysm

This commit is contained in:
Ovahlord
2024-09-08 13:50:38 +02:00
parent 008dd1edb0
commit f359a8710a
2 changed files with 31 additions and 37 deletions

View File

@@ -65,20 +65,15 @@ namespace Trinity
{
inline uint8 GetGrayLevel(uint8 pl_level)
{
uint8 level;
if (pl_level < 7)
uint8 level = 0;
if (pl_level <= 5)
level = 0;
else if (pl_level < 35)
{
uint8 count = 0;
for (int i = 15; i <= pl_level; ++i)
if (i % 5 == 0) ++count;
level = (pl_level - 7) - (count - 1);
}
else if (pl_level <= 39)
level = pl_level - 5 - pl_level / 10;
else if (pl_level <= 59)
level = pl_level - 1 - pl_level / 5;
else
level = pl_level - 10;
level = pl_level - 9;
sScriptMgr->OnGrayLevelCalculation(level, pl_level);
return level;
@@ -136,15 +131,26 @@ namespace Trinity
return diff;
}
inline uint32 BaseGain(uint8 /*pl_level*/, uint8 /*mob_level*/)
inline uint32 BaseGain(uint8 pl_level, uint8 mob_level, int32 targetExpansion)
{
return 0;
uint32 baseGain = 0;
uint32 baseExperience = 0;
/*
uint32 baseGain;
GtXpEntry const* xpPlayer = sXpGameTable.GetRow(pl_level);
GtXpEntry const* xpMob = sXpGameTable.GetRow(mob_level);
switch (targetExpansion)
{
case EXPANSION_CLASSIC:
baseExperience = 45;
break;
case EXPANSION_THE_BURNING_CRUSADE:
baseExperience = 235;
break;
case EXPANSION_WRATH_OF_THE_LICH_KING:
baseExperience = 580;
break;
default: // -1 = latest expansion and 3 = Cataclysm
baseExperience = 1878;
break;
}
if (mob_level >= pl_level)
{
@@ -152,7 +158,7 @@ namespace Trinity
if (nLevelDiff > 4)
nLevelDiff = 4;
baseGain = uint32(round(xpPlayer->PerKill * (1 + 0.05f * nLevelDiff)));
baseGain = round((mob_level * 5 + baseExperience) * (1 + 0.05f * nLevelDiff));
}
else
{
@@ -160,7 +166,7 @@ namespace Trinity
if (mob_level > gray_level)
{
uint8 ZD = GetZeroDifference(pl_level);
baseGain = uint32(round(xpMob->PerKill * ((1 - ((pl_level - mob_level) / float(ZD))) * (xpMob->Divisor / xpPlayer->Divisor))));
baseGain = round((mob_level * 5 + baseExperience) * ((1 - ((pl_level - mob_level) / float(ZD)))));
}
else
baseGain = 0;
@@ -169,13 +175,12 @@ namespace Trinity
if (sWorld->getIntConfig(CONFIG_MIN_CREATURE_SCALED_XP_RATIO) && pl_level != mob_level)
{
// Use mob level instead of player level to avoid overscaling on gain in a min is enforced
uint32 baseGainMin = BaseGain(pl_level, pl_level) * sWorld->getIntConfig(CONFIG_MIN_CREATURE_SCALED_XP_RATIO) / 100;
uint32 baseGainMin = BaseGain(pl_level, pl_level, targetExpansion) * sWorld->getIntConfig(CONFIG_MIN_CREATURE_SCALED_XP_RATIO) / 100;
baseGain = std::max(baseGainMin, baseGain);
}
sScriptMgr->OnBaseGainCalculation(baseGain, pl_level, mob_level);
return baseGain;
*/
}
inline uint32 Gain(Player* player, Unit* u, bool isBattleGround = false)
@@ -187,14 +192,10 @@ namespace Trinity
{
float xpMod = 1.0f;
gain = BaseGain(player->GetLevel(), u->GetLevelForTarget(player));
gain = BaseGain(player->GetLevel(), u->GetLevelForTarget(player), creature ? creature->GetCreatureDifficulty()->GetHealthScalingExpansion() : GetExpansionForLevel(u->GetLevelForTarget(player)));
if (gain && creature)
{
// Players get only 10% xp for killing creatures of lower expansion levels than himself
if ((uint32(creature->GetCreatureDifficulty()->GetHealthScalingExpansion()) < GetExpansionForLevel(player->GetLevel())))
gain = uint32(round(gain / 10.0f));
if (creature->IsElite())
{
// Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus.

View File

@@ -116,21 +116,14 @@ constexpr uint32 GetMaxLevelForExpansion(uint32 expansion)
case EXPANSION_WRATH_OF_THE_LICH_KING:
return 80;
case EXPANSION_CATACLYSM:
return 85;
case EXPANSION_MISTS_OF_PANDARIA:
return 90;
case EXPANSION_MISTS_OF_PANDARIA: // unsupported expansions will return the same max level as the support one to correctly function (see Player::InitStatsForLevel)
case EXPANSION_WARLORDS_OF_DRAENOR:
return 100;
case EXPANSION_LEGION:
return 110;
case EXPANSION_BATTLE_FOR_AZEROTH:
return 120;
case EXPANSION_SHADOWLANDS:
return 60;
case EXPANSION_DRAGONFLIGHT:
return 70;
case EXPANSION_THE_WAR_WITHIN:
return 80;
return 85;
default:
break;
}