diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index 49efd8a5a..ca6051f22 100644 --- a/src/game/Guild.cpp +++ b/src/game/Guild.cpp @@ -363,7 +363,7 @@ bool Guild::FillPlayerData(uint64 guid, MemberSlot* memslot) return false; plLevel = Player::GetUInt32ValueFromDB(UNIT_FIELD_LEVEL, guid); - if(plLevel<1||plLevel>255) // can be at broken `data` field + if(plLevel<1||plLevel>STRONG_MAX_LEVEL) // can be at broken `data` field { sLog.outError("Player (GUID: %u) has a broken data in field `characters`.`data`.",GUID_LOPART(guid)); return false; diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 9931bb39a..3100bbe53 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -3814,8 +3814,8 @@ bool ChatHandler::HandleLevelUpCommand(const char* args) int32 newlevel = oldlevel + addlevel; if(newlevel < 1) newlevel = 1; - if(newlevel > 255) // hardcoded maximum level - newlevel = 255; + if(newlevel > STRONG_MAX_LEVEL) // hardcoded maximum level + newlevel = STRONG_MAX_LEVEL; if(chr) { diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index abfcfa2a1..885af56fc 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -81,7 +81,7 @@ void WorldSession::HandleWhoOpcode( WorldPacket & recv_data ) std::string player_name, guild_name; recv_data >> level_min; // maximal player level, default 0 - recv_data >> level_max; // minimal player level, default 100 + recv_data >> level_max; // minimal player level, default 100 (MAX_LEVEL) recv_data >> player_name; // player name, case sensitive... // recheck @@ -146,8 +146,8 @@ void WorldSession::HandleWhoOpcode( WorldPacket & recv_data ) // client send in case not set max level value 100 but mangos support 255 max level, // update it to show GMs with characters after 100 level - if(level_max >= 100) - level_max = 255; + if(level_max >= MAX_LEVEL) + level_max = STRONG_MAX_LEVEL; uint32 team = _player->GetTeam(); uint32 security = GetSecurity(); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 98dcc0d15..6c2775218 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -1962,8 +1962,8 @@ void ObjectMgr::LoadPetLevelInfo() uint32 current_level = fields[1].GetUInt32(); if(current_level > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL)) { - if(current_level > 255) // hardcoded level maximum - sLog.outErrorDb("Wrong (> 255) level %u in `pet_levelstats` table, ignoring.",current_level); + if(current_level > STRONG_MAX_LEVEL) // hardcoded level maximum + sLog.outErrorDb("Wrong (> %u) level %u in `pet_levelstats` table, ignoring.",STRONG_MAX_LEVEL,current_level); else sLog.outDetail("Unused (> MaxPlayerLevel in mangosd.conf) level %u in `pet_levelstats` table, ignoring.",current_level); continue; @@ -2339,8 +2339,8 @@ void ObjectMgr::LoadPlayerInfo() uint32 current_level = fields[1].GetUInt32(); if(current_level > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL)) { - if(current_level > 255) // hardcoded level maximum - sLog.outErrorDb("Wrong (> 255) level %u in `player_classlevelstats` table, ignoring.",current_level); + if(current_level > STRONG_MAX_LEVEL) // hardcoded level maximum + sLog.outErrorDb("Wrong (> %u) level %u in `player_classlevelstats` table, ignoring.",STRONG_MAX_LEVEL,current_level); else sLog.outDetail("Unused (> MaxPlayerLevel in mangosd.conf) level %u in `player_classlevelstats` table, ignoring.",current_level); continue; @@ -2434,8 +2434,8 @@ void ObjectMgr::LoadPlayerInfo() uint32 current_level = fields[2].GetUInt32(); if(current_level > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL)) { - if(current_level > 255) // hardcoded level maximum - sLog.outErrorDb("Wrong (> 255) level %u in `player_levelstats` table, ignoring.",current_level); + if(current_level > STRONG_MAX_LEVEL) // hardcoded level maximum + sLog.outErrorDb("Wrong (> %u) level %u in `player_levelstats` table, ignoring.",STRONG_MAX_LEVEL,current_level); else sLog.outDetail("Unused (> MaxPlayerLevel in mangosd.conf) level %u in `player_levelstats` table, ignoring.",current_level); continue; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 4824ef166..176211868 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -602,7 +602,7 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8 if (GetSession()->GetSecurity() >= SEC_MODERATOR) SetUInt32Value(UNIT_FIELD_LEVEL, sWorld.getConfig(CONFIG_START_GM_LEVEL)); else - { + { if(getClass() == CLASS_DEATH_KNIGHT) SetUInt32Value(UNIT_FIELD_LEVEL, 55); else @@ -18719,7 +18719,7 @@ uint32 Player::GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 n { uint32 level = getLevel(); - if(level > sGtBarberShopCostBaseStore.GetNumRows()) + if(level > GT_MAX_LEVEL) level = GT_MAX_LEVEL; // max level in this dbc uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2); diff --git a/src/game/World.cpp b/src/game/World.cpp index 149833a12..e20f9c416 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -657,10 +657,10 @@ void World::LoadConfigSettings(bool reload) else m_configs[CONFIG_MAX_PLAYER_LEVEL] = sConfig.GetIntDefault("MaxPlayerLevel", 60); - if(m_configs[CONFIG_MAX_PLAYER_LEVEL] > 100) + if(m_configs[CONFIG_MAX_PLAYER_LEVEL] > MAX_LEVEL) { - sLog.outError("MaxPlayerLevel (%i) must be in range 1..100. Set to 100.",m_configs[CONFIG_MAX_PLAYER_LEVEL]); - m_configs[CONFIG_MAX_PLAYER_LEVEL] = 100; + sLog.outError("MaxPlayerLevel (%i) must be in range 1..%u. Set to %u.",m_configs[CONFIG_MAX_PLAYER_LEVEL],MAX_LEVEL,MAX_LEVEL); + m_configs[CONFIG_MAX_PLAYER_LEVEL] = MAX_LEVEL; } m_configs[CONFIG_START_PLAYER_LEVEL] = sConfig.GetIntDefault("StartPlayerLevel", 1); @@ -763,14 +763,14 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_START_GM_LEVEL] = sConfig.GetIntDefault("GM.StartLevel", 1); if(m_configs[CONFIG_START_GM_LEVEL] < m_configs[CONFIG_START_PLAYER_LEVEL]) { - sLog.outError("GM.StartLevel (%i) must be in range StartPlayerLevel(%u)..100. Set to %u.", - m_configs[CONFIG_START_GM_LEVEL],m_configs[CONFIG_START_PLAYER_LEVEL], m_configs[CONFIG_START_PLAYER_LEVEL]); + sLog.outError("GM.StartLevel (%i) must be in range StartPlayerLevel(%u)..%u. Set to %u.", + m_configs[CONFIG_START_GM_LEVEL],m_configs[CONFIG_START_PLAYER_LEVEL], MAX_LEVEL, m_configs[CONFIG_START_PLAYER_LEVEL]); m_configs[CONFIG_START_GM_LEVEL] = m_configs[CONFIG_START_PLAYER_LEVEL]; } - else if(m_configs[CONFIG_START_GM_LEVEL] > 100) + else if(m_configs[CONFIG_START_GM_LEVEL] > MAX_LEVEL) { - sLog.outError("GM.StartLevel (%i) must be in range 1..100. Set to %u.", m_configs[CONFIG_START_GM_LEVEL], 100); - m_configs[CONFIG_START_GM_LEVEL] = 100; + sLog.outError("GM.StartLevel (%i) must be in range 1..%u. Set to %u.", m_configs[CONFIG_START_GM_LEVEL], MAX_LEVEL, MAX_LEVEL); + m_configs[CONFIG_START_GM_LEVEL] = MAX_LEVEL; } m_configs[CONFIG_GROUP_VISIBILITY] = sConfig.GetIntDefault("Visibility.GroupMode",0); @@ -862,13 +862,13 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_WORLD_BOSS_LEVEL_DIFF] = sConfig.GetIntDefault("WorldBossLevelDiff",3); - // note: disable value (-1) will assigned as 0xFFFFFFF, to prevent overflow at calculations limit it to max possible player level (100) + // note: disable value (-1) will assigned as 0xFFFFFFF, to prevent overflow at calculations limit it to max possible player level MAX_LEVEL(100) m_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = sConfig.GetIntDefault("Quests.LowLevelHideDiff", 4); - if(m_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] > 100) - m_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = 100; + if(m_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] > MAX_LEVEL) + m_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = MAX_LEVEL; m_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] = sConfig.GetIntDefault("Quests.HighLevelHideDiff", 7); - if(m_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] > 100) - m_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] = 100; + if(m_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] > MAX_LEVEL) + m_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] = MAX_LEVEL; m_configs[CONFIG_DETECT_POS_COLLISION] = sConfig.GetBoolDefault("DetectPosCollision", true); diff --git a/src/shared/Database/DBCEnums.h b/src/shared/Database/DBCEnums.h index 8f9d70cb7..4f406c9cc 100644 --- a/src/shared/Database/DBCEnums.h +++ b/src/shared/Database/DBCEnums.h @@ -19,6 +19,14 @@ #ifndef DBCENUMS_H #define DBCENUMS_H +// client supported max level for player/pets/etc. Avoid overflow or client stability affected. +// also see GT_MAX_LEVEL define +#define MAX_LEVEL 100 + +// Server side limitation. Base at used code requirements. +// also see MAX_LEVEL and GT_MAX_LEVEL define +#define STRONG_MAX_LEVEL 255 + enum AreaTeams { AREATEAM_NONE = 0, diff --git a/src/shared/Database/DBCStructure.h b/src/shared/Database/DBCStructure.h index a8f46bea8..cf08161c3 100644 --- a/src/shared/Database/DBCStructure.h +++ b/src/shared/Database/DBCStructure.h @@ -741,6 +741,7 @@ struct GlyphSlotEntry uint32 Order; }; +// All Gt* DBC store data for 100 levels, some by 100 per class/race #define GT_MAX_LEVEL 100 struct GtBarberShopCostBaseEntry