From 6f8f621626bfa3c9bb114145161c69ba51cee36d Mon Sep 17 00:00:00 2001 From: Wyk3d Date: Sat, 13 Dec 2008 22:19:37 +0200 Subject: [PATCH 1/5] [6906] Revert "Reduced number of cells (doubled max visibility distance)." This reverts a part of commit eb60f74c8f9a508fecaa66aa5b8a2fbf026e6479 that caused some performance issues. --- src/game/GridDefines.h | 4 ++-- src/mangosd/mangosd.conf.dist.in | 12 ++++++------ src/shared/revision_nr.h | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/game/GridDefines.h b/src/game/GridDefines.h index ced42871b..0942c5c31 100644 --- a/src/game/GridDefines.h +++ b/src/game/GridDefines.h @@ -41,10 +41,10 @@ class Player; #define MIN_GRID_DELAY MINUTE*1000 #define MIN_MAP_UPDATE_DELAY 50 -#define MAX_NUMBER_OF_CELLS 4 +#define MAX_NUMBER_OF_CELLS 8 #define SIZE_OF_GRID_CELL (SIZE_OF_GRIDS/MAX_NUMBER_OF_CELLS) -#define CENTER_GRID_CELL_ID 128 +#define CENTER_GRID_CELL_ID 256 #define CENTER_GRID_CELL_OFFSET (SIZE_OF_GRID_CELL/2) #define TOTAL_NUMBER_OF_CELLS_PER_MAP (MAX_NUMBER_OF_GRIDS*MAX_NUMBER_OF_CELLS) diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index a7c0be700..f57e25d5a 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -863,9 +863,9 @@ GM.StartLevel = 1 # Visibility.Distance.Creature # Visibility.Distance.Player # Visibility distance for different in game object -# Max limited by active player zone: ~ 333 +# Max limited by active player zone: ~ 166 # Min limit dependent from objects -# Default: 132 (cell size) +# Default: 66 (cell size) # Min limit is max aggro radius (45) * Rate.Creature.Aggro # # Visibility.Distance.Object @@ -891,10 +891,10 @@ GM.StartLevel = 1 ################################################################################################################### Visibility.GroupMode = 0 -Visibility.Distance.Creature = 132 -Visibility.Distance.Player = 132 -Visibility.Distance.Object = 132 -Visibility.Distance.InFlight = 132 +Visibility.Distance.Creature = 66 +Visibility.Distance.Player = 66 +Visibility.Distance.Object = 66 +Visibility.Distance.InFlight = 66 Visibility.Distance.Grey.Unit = 1 Visibility.Distance.Grey.Object = 10 diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 756f31327..06202b88f 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "6905" + #define REVISION_NR "6906" #endif // __REVISION_NR_H__ From 08a31053126e9de24612ac60b52f8c00b699aa2b Mon Sep 17 00:00:00 2001 From: hunuza Date: Sat, 13 Dec 2008 23:58:52 +0100 Subject: [PATCH 2/5] [6907] Make DB access on char rename async. Signed-off-by: hunuza --- src/game/CharacterHandler.cpp | 70 +++++++++++++++++------------------ src/game/WorldSession.h | 3 +- src/shared/revision_nr.h | 2 +- 3 files changed, 36 insertions(+), 39 deletions(-) diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 920bc8b76..50c6df71f 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -899,40 +899,14 @@ void WorldSession::HandleToggleCloakOpcode( WorldPacket & /*recv_data*/ ) void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data) { - CHECK_PACKET_SIZE(recv_data,8+1); - uint64 guid; std::string newname; - std::string oldname; CHECK_PACKET_SIZE(recv_data, 8+1); recv_data >> guid; recv_data >> newname; - QueryResult *result = CharacterDatabase.PQuery("SELECT at_login, name FROM characters WHERE guid ='%u'", GUID_LOPART(guid)); - if (!result) - { - WorldPacket data(SMSG_CHAR_RENAME, 1); - data << (uint8)CHAR_CREATE_ERROR; - SendPacket( &data ); - return; - } - - uint32 at_loginFlags; - Field *fields = result->Fetch(); - at_loginFlags = fields[0].GetUInt32(); - oldname = fields[1].GetCppString(); - delete result; - - if (!(at_loginFlags & AT_LOGIN_RENAME)) - { - WorldPacket data(SMSG_CHAR_RENAME, 1); - data << (uint8)CHAR_CREATE_ERROR; - SendPacket( &data ); - return; - } - // prevent character rename to invalid name if(!normalizePlayerName(newname)) { @@ -959,36 +933,58 @@ void WorldSession::HandleChangePlayerNameOpcode(WorldPacket& recv_data) return; } - if(objmgr.GetPlayerGUIDByName(newname)) // character with this name already exist + CharacterDatabase.escape_string(newname); + + CharacterDatabase.AsyncPQuery(&WorldSession::HandleChangePlayerNameOpcodeCallBack, GUID_LOPART(guid), newname, "SELECT guid, at_login, name FROM characters WHERE guid = '%u' XOR name = '%s'", GUID_LOPART(guid), newname.c_str()); +} + +void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult *result, uint32 accountId, std::string newname) +{ + WorldSession * session = sWorld.FindSession(accountId); + if(!session) + return; + + if (!result || result->GetRowCount() != 1) { WorldPacket data(SMSG_CHAR_RENAME, 1); data << (uint8)CHAR_CREATE_ERROR; - SendPacket( &data ); + session->SendPacket( &data ); return; } - if(newname == oldname) // checked by client + Field *fields = result->Fetch(); + uint32 guidLow = fields[0].GetUInt32(); + uint64 guid = MAKE_NEW_GUID(guidLow, 0, HIGHGUID_PLAYER); + uint32 at_loginFlags = fields[1].GetUInt32(); + std::string oldname = fields[2].GetCppString(); + delete result; + if(oldname == newname) { WorldPacket data(SMSG_CHAR_RENAME, 1); - data << (uint8)CHAR_NAME_FAILURE; - SendPacket( &data ); + data << (uint8)CHAR_CREATE_ERROR; + session->SendPacket( &data ); return; } // we have to check character at_login_flag & AT_LOGIN_RENAME also (fake packets hehe) + if (!(at_loginFlags & AT_LOGIN_RENAME)) + { + WorldPacket data(SMSG_CHAR_RENAME, 1); + data << (uint8)CHAR_CREATE_ERROR; + session->SendPacket( &data ); + return; + } - CharacterDatabase.escape_string(newname); - CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_RENAME),GUID_LOPART(guid)); - CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", GUID_LOPART(guid)); + CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_RENAME),guidLow); + CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", guidLow); - std::string IP_str = GetRemoteAddress(); - sLog.outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s",GetAccountId(),IP_str.c_str(),oldname.c_str(),GUID_LOPART(guid),newname.c_str()); + sLog.outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s",session->GetAccountId(),session->GetRemoteAddress(),oldname.c_str(),guidLow,newname.c_str()); WorldPacket data(SMSG_CHAR_RENAME,1+8+(newname.size()+1)); data << (uint8)RESPONSE_SUCCESS; data << guid; data << newname; - SendPacket(&data); + session->SendPacket(&data); } void WorldSession::HandleDeclinedPlayerNameOpcode(WorldPacket& recv_data) diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index 34a626d80..cd3a4e961 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -91,7 +91,7 @@ class MANGOS_DLL_SPEC WorldSession Player* GetPlayer() const { return _player; } char const* GetPlayerName() const; void SetSecurity(uint32 security) { _security = security; } - std::string& GetRemoteAddress() { return m_Address; } + std::string const& GetRemoteAddress() { return m_Address; } void SetPlayer(Player *plr) { _player = plr; } uint8 Expansion() const { return m_expansion; } @@ -541,6 +541,7 @@ class MANGOS_DLL_SPEC WorldSession void HandleSetActionBar(WorldPacket& recv_data); void HandleChangePlayerNameOpcode(WorldPacket& recv_data); + static void HandleChangePlayerNameOpcodeCallBack(QueryResult *result, uint32 accountId, std::string newname); void HandleDeclinedPlayerNameOpcode(WorldPacket& recv_data); void HandleTotemDestroy(WorldPacket& recv_data); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 06202b88f..a4983290a 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "6906" + #define REVISION_NR "6907" #endif // __REVISION_NR_H__ From 5113af643ecda19b3058e091034befd851ce7847 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 14 Dec 2008 20:51:27 +0300 Subject: [PATCH 3/5] Some fields comments for ChrClass and ChrRace. Also optimize code (set MAX_RACES to max_player_race+1). Note: MAX_* moved out of enum. This is not nice include value _not_ belong to enum values into enum. Maybe in C this not make sense (enum range = int anyway) but in C++ enum values checked at assigning/etc. (cherry picked from commit f157c4e3d5e18878c7ab0dae383acb7704c3ed90) --- src/game/SharedDefines.h | 24 +++++++++++++++++------- src/shared/Database/DBCStructure.h | 8 ++++---- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index 8ae1cf27b..534e3a9ff 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -40,16 +40,24 @@ enum Races RACE_TAUREN = 6, RACE_GNOME = 7, RACE_TROLL = 8, - RACE_GOBLIN = 9, + //RACE_GOBLIN = 9, RACE_BLOODELF = 10, RACE_DRAENEI = 11, - RACE_FEL_ORC = 12, - RACE_NAGA = 13, - RACE_BROKEN = 14, - RACE_SKELETON = 15, - MAX_RACES = 16 + //RACE_FEL_ORC = 12, + //RACE_NAGA = 13, + //RACE_BROKEN = 14, + //RACE_SKELETON = 15, + //RACE_VRYKUL = 16, + //RACE_TUSKARR = 17, + //RACE_FOREST_TROLL = 18, + //RACE_TAUNKA = 19, + //RACE_NORTHREND_SKELETON = 20, + //RACE_ICE_TROLL = 21 }; +// max+1 for player race +#define MAX_RACES 12 + #define RACEMASK_ALL_PLAYABLE \ ((1<<(RACE_HUMAN-1)) |(1<<(RACE_ORC-1)) |(1<<(RACE_DWARF-1)) | \ (1<<(RACE_NIGHTELF-1))|(1<<(RACE_UNDEAD_PLAYER-1))|(1<<(RACE_TAUREN-1)) | \ @@ -70,9 +78,11 @@ enum Classes CLASS_WARLOCK = 9, // CLASS_UNK2 = 10,unused CLASS_DRUID = 11, - MAX_CLASSES = 12 }; +// max+1 for player class +#define MAX_CLASSES 12 + #define CLASSMASK_ALL_PLAYABLE \ ((1<<(CLASS_WARRIOR-1))|(1<<(CLASS_PALADIN-1))|(1<<(CLASS_HUNTER-1))| \ (1<<(CLASS_ROGUE-1)) |(1<<(CLASS_PRIEST-1)) |(1<<(CLASS_SHAMAN-1))| \ diff --git a/src/shared/Database/DBCStructure.h b/src/shared/Database/DBCStructure.h index 59d5d18c4..1d32bfd35 100644 --- a/src/shared/Database/DBCStructure.h +++ b/src/shared/Database/DBCStructure.h @@ -128,9 +128,9 @@ struct ChrClassesEntry // 4, unused //char* name[16]; // 5-20 unused // 21 string flag, unused - //char* string1[16]; // 21-36 unused + //char* nameFemale[16]; // 21-36 unused, if different from base (male) case // 37 string flag, unused - //char* string2[16]; // 38-53 unused + //char* nameNeutralGender[16]; // 38-53 unused, if different from base (male) case // 54 string flag, unused // 55, unused uint32 spellfamily; // 56 @@ -151,9 +151,9 @@ struct ChrRacesEntry uint32 startmovie; // 13 id from CinematicCamera.dbc char* name[16]; // 14-29 used for DBC language detection/selection // 30 string flags, unused - //char* string1[16]; // 31-46 used for DBC language detection/selection + //char* nameFemale[16]; // 31-46, if different from base (male) case // 47 string flags, unused - //char* string2[16]; // 48-63 used for DBC language detection/selection + //char* nameNeutralGender[16]; // 48-63, if different from base (male) case // 64 string flags, unused // 65-67 unused uint32 addon; // 68 (0 - original race, 1 - tbc addon, ...) From 35f54d365df41bd4cc0333235c0dc039578cd9d8 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Sun, 14 Dec 2008 23:52:32 +0300 Subject: [PATCH 4/5] Replace hardcoded client(100) and server side (255) level limtation values by defines. (cherry picked from commit 389a1784e288f11587067d3a6d4b70cce9214cb9) Conflicts: src/game/Player.cpp src/game/World.cpp src/shared/Database/DBCStructure.h --- src/game/Guild.cpp | 2 +- src/game/Level3.cpp | 4 ++-- src/game/MiscHandler.cpp | 6 +++--- src/game/ObjectMgr.cpp | 12 ++++++------ src/game/World.cpp | 31 +++++++++++++++--------------- src/shared/Database/DBCEnums.h | 8 ++++++++ src/shared/Database/DBCStructure.h | 1 + 7 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index 8076757b5..bf6a3ab18 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 4b6372f53..8ede8ba91 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -3805,8 +3805,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 b2c7d7d5a..881270189 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -80,7 +80,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 @@ -145,8 +145,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 1fbdf62c8..040c3ce35 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -1909,8 +1909,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; @@ -2286,8 +2286,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; @@ -2381,8 +2381,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/World.cpp b/src/game/World.cpp index f66846362..e6623a29a 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -650,10 +650,11 @@ void World::LoadConfigSettings(bool reload) } else m_configs[CONFIG_MAX_PLAYER_LEVEL] = sConfig.GetIntDefault("MaxPlayerLevel", 60); - if(m_configs[CONFIG_MAX_PLAYER_LEVEL] > 255) + + if(m_configs[CONFIG_MAX_PLAYER_LEVEL] > MAX_LEVEL) { - sLog.outError("MaxPlayerLevel (%i) must be in range 1..255. Set to 255.",m_configs[CONFIG_MAX_PLAYER_LEVEL]); - m_configs[CONFIG_MAX_PLAYER_LEVEL] = 255; + 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); @@ -756,14 +757,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)..255. 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] > 255) + else if(m_configs[CONFIG_START_GM_LEVEL] > MAX_LEVEL) { - sLog.outError("GM.StartLevel (%i) must be in range 1..255. Set to %u.",m_configs[CONFIG_START_GM_LEVEL],255); - m_configs[CONFIG_START_GM_LEVEL] = 255; + 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); @@ -854,13 +855,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 (255) - m_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = sConfig.GetIntDefault("Quests.LowLevelHideDiff",4); - if(m_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] > 255) - m_configs[CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF] = 255; - m_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] = sConfig.GetIntDefault("Quests.HighLevelHideDiff",7); - if(m_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] > 255) - m_configs[CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF] = 255; + // 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] > 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] > 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 6ad7fdb12..1d54616a2 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 1d32bfd35..acabe18f5 100644 --- a/src/shared/Database/DBCStructure.h +++ b/src/shared/Database/DBCStructure.h @@ -267,6 +267,7 @@ struct GemPropertiesEntry uint32 color; }; +// All Gt* DBC store data for 100 levels, some by 100 per class/race #define GT_MAX_LEVEL 100 struct GtCombatRatingsEntry From a62801aee9566d56090a6f518223e37a0ed8a184 Mon Sep 17 00:00:00 2001 From: balrok Date: Mon, 15 Dec 2008 00:11:12 +0300 Subject: [PATCH 5/5] [6908] Faster setting online=0 at startup and semilar queries. Signed-off-by: VladimirMangos --- src/game/Level2.cpp | 2 +- src/game/Level3.cpp | 2 +- src/mangosd/Master.cpp | 2 +- src/shared/revision_nr.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 901d7513b..db1a6bbfa 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -3137,7 +3137,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args) } }while(result->NextRow()); // set "wpguid" column to "empty" - no visual waypoint spawned - WorldDatabase.PExecuteLog("UPDATE creature_movement SET wpguid = '0'"); + WorldDatabase.PExecuteLog("UPDATE creature_movement SET wpguid = '0' WHERE wpguid <> '0'"); if( hasError ) { diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index 8ede8ba91..fb2c79bce 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -4564,7 +4564,7 @@ bool ChatHandler::HandleResetAllCommand(const char * args) return false; } - CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u'",atLogin); + CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE (at_login & '%u') = '0'",atLogin,atLogin); HashMapHolder::MapType const& plist = ObjectAccessor::Instance().GetPlayers(); for(HashMapHolder::MapType::const_iterator itr = plist.begin(); itr != plist.end(); ++itr) itr->second->SetAtLoginFlag(atLogin); diff --git a/src/mangosd/Master.cpp b/src/mangosd/Master.cpp index 1b6929267..f5ef907bb 100644 --- a/src/mangosd/Master.cpp +++ b/src/mangosd/Master.cpp @@ -459,7 +459,7 @@ void Master::clearOnlineAccounts() "AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = '%d')",realmID); - CharacterDatabase.Execute("UPDATE characters SET online = 0"); + CharacterDatabase.Execute("UPDATE characters SET online = 0 WHERE online<>0"); } /// Handle termination signals diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index a4983290a..2d7234568 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "6907" + #define REVISION_NR "6908" #endif // __REVISION_NR_H__