Core/Commands: Initialize commands on startup instead of first use

This commit is contained in:
Shauren
2020-08-01 15:23:04 +02:00
committed by Ovahlord
parent 80e4effba5
commit 040140b4ea
3 changed files with 25 additions and 19 deletions

View File

@@ -43,29 +43,31 @@ static Optional<std::vector<ChatCommand>> commandTableCache;
std::vector<ChatCommand> 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();

View File

@@ -83,6 +83,7 @@ class TC_GAME_API ChatHandler
virtual bool ParseCommands(char const* text);
static std::vector<ChatCommand> const& getCommandTable();
static void InitializeCommandTable();
static void invalidateCommandTable();
bool isValidChatMessage(char const* msg);

View File

@@ -2187,6 +2187,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();