From 6d9a0840362447c86e748a0d7fda746d480dab4b Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 30 Jul 2020 20:52:46 +0200 Subject: [PATCH] Core/Commands: Initialize commands on startup instead of first use (cherry picked from commit 0fc7b50c041131b3d6dbc011f29d6547c9ca0660) --- src/server/game/Chat/Chat.cpp | 41 ++++++++++++++++++--------------- src/server/game/Chat/Chat.h | 1 + src/server/game/World/World.cpp | 3 +++ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 146410f0fbc..3a0e77bd294 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -47,29 +47,32 @@ static Optional> commandTableCache; std::vector const& ChatHandler::getCommandTable() { if (!commandTableCache) - { - // We need to initialize this at top since SetDataForCommandInTable - // calls getCommandTable() recursively. - commandTableCache = sScriptMgr->GetChatCommands(); - - WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_COMMANDS); - PreparedQueryResult result = WorldDatabase.Query(stmt); - if (result) - { - do - { - Field* fields = result->Fetch(); - std::string name = fields[0].GetString(); - - SetDataForCommandInTable(*commandTableCache, name.c_str(), fields[1].GetUInt16(), fields[2].GetString(), name); - } - while (result->NextRow()); - } - } + InitializeCommandTable(); return *commandTableCache; } +void ChatHandler::InitializeCommandTable() +{ + // We need to initialize this at top since SetDataForCommandInTable + // calls getCommandTable() recursively. + commandTableCache = sScriptMgr->GetChatCommands(); + + WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_COMMANDS); + PreparedQueryResult result = WorldDatabase.Query(stmt); + if (result) + { + do + { + Field* fields = result->Fetch(); + std::string name = fields[0].GetString(); + + SetDataForCommandInTable(*commandTableCache, name.c_str(), fields[1].GetUInt16(), fields[2].GetString(), name); + } + while (result->NextRow()); + } +} + void ChatHandler::invalidateCommandTable() { commandTableCache.reset(); diff --git a/src/server/game/Chat/Chat.h b/src/server/game/Chat/Chat.h index 3f8bc30522c..7abf8452a3a 100644 --- a/src/server/game/Chat/Chat.h +++ b/src/server/game/Chat/Chat.h @@ -74,6 +74,7 @@ class TC_GAME_API ChatHandler virtual bool ParseCommands(char const* text); static std::vector const& getCommandTable(); + static void InitializeCommandTable(); static void invalidateCommandTable(); void SendGlobalSysMessage(const char *str); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index a2931e2f70a..6c535b1d421 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2309,6 +2309,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Initialize query data..."); sObjectMgr->InitializeQueriesData(QUERY_DATA_ALL); + TC_LOG_INFO("server.loading", "Initialize commands..."); + ChatHandler::InitializeCommandTable(); + ///- Initialize game time and timers TC_LOG_INFO("server.loading", "Initialize game time and timers"); GameTime::UpdateGameTimers();