aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Miscellaneous/Formulas.h57
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h11
2 files changed, 31 insertions, 37 deletions
diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
index b98b5fc5ada..f636da5045e 100644
--- a/src/server/game/Miscellaneous/Formulas.h
+++ b/src/server/game/Miscellaneous/Formulas.h
@@ -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.
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index af1d754ab20..43665c1da5a 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -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;
}