diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Miscellaneous/Formulas.h | 57 | ||||
| -rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 11 |
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; } |
