aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Globals/ObjectMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp69
1 files changed, 47 insertions, 22 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index e26fe6308ee..bbe04f8c383 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3598,58 +3598,83 @@ void ObjectMgr::LoadPlayerInfo()
// Loading levels data (class/race dependent)
TC_LOG_INFO("server.loading", "Loading Player Create Level Stats Data...");
{
+ struct RaceStats
+ {
+ int16 StatModifier[MAX_STATS];
+ };
+
+ std::array<RaceStats, MAX_RACES> raceStatModifiers;
+
uint32 oldMSTime = getMSTime();
- // 0 1 2 3 4 5 6
- QueryResult result = WorldDatabase.Query("SELECT race, class, level, str, agi, sta, inte FROM player_levelstats");
+ QueryResult raceStatsResult = WorldDatabase.Query("SELECT race, str, agi, sta, inte FROM player_racestats");
- if (!result)
+ if (!raceStatsResult)
{
- TC_LOG_ERROR("server.loading", ">> Loaded 0 level stats definitions. DB table `player_levelstats` is empty.");
+ TC_LOG_ERROR("server.loading", ">> Loaded 0 race stats definitions. DB table `player_racestats` is empty.");
exit(1);
}
- uint32 count = 0;
-
do
{
- Field* fields = result->Fetch();
+ Field* fields = raceStatsResult->Fetch();
uint32 current_race = fields[0].GetUInt8();
if (current_race >= MAX_RACES)
{
- TC_LOG_ERROR("sql.sql", "Wrong race %u in `player_levelstats` table, ignoring.", current_race);
+ TC_LOG_ERROR("sql.sql", "Wrong race %u in `player_racestats` table, ignoring.", current_race);
continue;
}
- uint32 current_class = fields[1].GetUInt8();
+ for (uint32 i = 0; i < MAX_STATS; ++i)
+ raceStatModifiers[current_race].StatModifier[i] = fields[i + 1].GetInt16();
+
+ } while (raceStatsResult->NextRow());
+
+ // 0 1 2 3 4 5
+ QueryResult result = WorldDatabase.Query("SELECT class, level, str, agi, sta, inte FROM player_classlevelstats");
+
+ if (!result)
+ {
+ TC_LOG_ERROR("server.loading", ">> Loaded 0 level stats definitions. DB table `player_classlevelstats` is empty.");
+ exit(1);
+ }
+
+ uint32 count = 0;
+
+ do
+ {
+ Field* fields = result->Fetch();
+
+ uint32 current_class = fields[0].GetUInt8();
if (current_class >= MAX_CLASSES)
{
- TC_LOG_ERROR("sql.sql", "Wrong class %u in `player_levelstats` table, ignoring.", current_class);
+ TC_LOG_ERROR("sql.sql", "Wrong class %u in `player_classlevelstats` table, ignoring.", current_class);
continue;
}
- uint32 current_level = fields[2].GetUInt8();
+ uint32 current_level = fields[1].GetUInt8();
if (current_level > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
{
if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
- TC_LOG_ERROR("sql.sql", "Wrong (> %u) level %u in `player_levelstats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
+ TC_LOG_ERROR("sql.sql", "Wrong (> %u) level %u in `player_classlevelstats` table, ignoring.", STRONG_MAX_LEVEL, current_level);
else
- {
- TC_LOG_INFO("misc", "Unused (> MaxPlayerLevel in worldserver.conf) level %u in `player_levelstats` table, ignoring.", current_level);
- ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
- }
+ TC_LOG_INFO("misc", "Unused (> MaxPlayerLevel in worldserver.conf) level %u in `player_classlevelstats` table, ignoring.", current_level);
+
continue;
}
- if (PlayerInfo* info = _playerInfo[current_race][current_class])
+ for (std::size_t race = 0; race < raceStatModifiers.size(); ++race)
{
- if (!info->levelInfo)
- info->levelInfo = new PlayerLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
+ if (PlayerInfo* info = _playerInfo[race][current_class])
+ {
+ if (!info->levelInfo)
+ info->levelInfo = new PlayerLevelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)];
- PlayerLevelInfo& levelInfo = info->levelInfo[current_level - 1];
- for (int i = 0; i < MAX_STATS; i++)
- levelInfo.stats[i] = fields[i + 3].GetUInt16();
+ PlayerLevelInfo& levelInfo = info->levelInfo[current_level - 1];
+ for (int i = 0; i < MAX_STATS; ++i)
+ levelInfo.stats[i] = fields[i + 2].GetUInt16() + raceStatModifiers[race].StatModifier[i];
+ }
}
++count;