Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion src/game/ChatCommands/ReloadCommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "CreatureEventAIMgr.h"
#include "BattleGroundMgr.h"
#include "ItemEnchantmentMgr.h"
#include "CommandMgr.h"

/**********************************************************************
CommandTable : commandTable
Expand Down Expand Up @@ -186,6 +187,7 @@ bool ChatHandler::HandleReloadAllLocalesCommand(char* /*args*/)
HandleReloadLocalesPageTextCommand((char*)"a");
HandleReloadLocalesPointsOfInterestCommand((char*)"a");
HandleReloadLocalesQuestCommand((char*)"a");
HandleReloadLocalesCommandHelpCommand((char*)"a");
return true;
}

Expand Down Expand Up @@ -576,7 +578,6 @@ bool ChatHandler::HandleReloadSpellPetAurasCommand(char* /*args*/)
return true;
}


bool ChatHandler::HandleReloadPageTextsCommand(char* /*args*/)
{
sLog.outString("Re-Loading Page Texts...");
Expand Down Expand Up @@ -866,6 +867,14 @@ bool ChatHandler::HandleReloadLocalesNpcTextCommand(char* /*args*/)
return true;
}

bool ChatHandler::HandleReloadLocalesCommandHelpCommand(char* /*args*/)
{
sLog.outString("Re-Loading Locales Command Help ... ");
sCommandMgr.LoadCommandHelpLocale();
SendGlobalSysMessage("DB table `locales_command` reloaded.", SEC_MODERATOR);
return true;
}

bool ChatHandler::HandleReloadLocalesPageTextCommand(char* /*args*/)
{
sLog.outString("Re-Loading Locales Page Text ... ");
Expand Down
37 changes: 29 additions & 8 deletions src/game/WorldHandlers/Chat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
#include "PoolManager.h"
#include "GameEventMgr.h"
#include "AuctionHouseBot/AuctionHouseBot.h"
#include "CommandMgr.h"

#ifdef ENABLE_ELUNA
#include "LuaEngine.h"
Expand Down Expand Up @@ -532,6 +533,7 @@ ChatCommand* ChatHandler::getCommandTable()
{ "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
{ "locales_points_of_interest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPointsOfInterestCommand, "", NULL },
{ "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
{ "locales_command", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesCommandHelpCommand, "", NULL },
{ "mail_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesMailCommand, "", NULL },
{ "mangos_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadMangosStringCommand, "", NULL },
{ "npc_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcTextCommand, "", NULL },
Expand Down Expand Up @@ -807,15 +809,15 @@ ChatCommand* ChatHandler::getCommandTable()
// check hardcoded part integrity
CheckIntegrity(commandTable, NULL);

QueryResult* result = WorldDatabase.Query("SELECT `name`,`security`,`help` FROM `command`");
QueryResult* result = WorldDatabase.Query("SELECT `id`, `command_text`,`security`,`help_text` FROM `command`");
if (result)
{
do
{
Field* fields = result->Fetch();
std::string name = fields[0].GetCppString();

SetDataForCommandInTable(commandTable, name.c_str(), fields[1].GetUInt16(), fields[2].GetCppString());
uint32 id = fields[0].GetUInt32();
std::string name = fields[1].GetCppString();
SetDataForCommandInTable(commandTable, id, name.c_str(), fields[2].GetUInt16(), fields[3].GetCppString());
}
while (result->NextRow());
delete result;
Expand Down Expand Up @@ -1305,7 +1307,16 @@ void ChatHandler::ExecuteCommand(const char* text)
{
if (!command->Help.empty())
{
SendSysMessage(command->Help.c_str());
std::string helpText = command->Help;

// Attemp to localize help text if not in CLI mode
if (m_session)
{
int loc_idx = m_session->GetSessionDbLocaleIndex();
sCommandMgr.GetCommandHelpLocaleString(command->Id, loc_idx, &helpText);
}

SendSysMessage(helpText.c_str());
}
else
{
Expand Down Expand Up @@ -1362,7 +1373,7 @@ void ChatHandler::ExecuteCommand(const char* text)
*
* All problems found while command search and updated output as to DB errors log
*/
bool ChatHandler::SetDataForCommandInTable(ChatCommand* commandTable, const char* text, uint32 security, std::string const& help)
bool ChatHandler::SetDataForCommandInTable(ChatCommand* commandTable, uint32 id, const char* text, uint32 security, std::string const& help)
{
std::string fullcommand = text; // original `text` can't be used. It content destroyed in command code processing.

Expand All @@ -1379,6 +1390,7 @@ bool ChatHandler::SetDataForCommandInTable(ChatCommand* commandTable, const char
DETAIL_LOG("Table `command` overwrite for command '%s' default security (%u) by %u",
fullcommand.c_str(), command->SecurityLevel, security);

command->Id = id;
command->SecurityLevel = security;
command->Help = help;
return true;
Expand Down Expand Up @@ -1534,9 +1546,18 @@ bool ChatHandler::ShowHelpForCommand(ChatCommand* table, const char* cmd)
break;
}

if (command && !command->Help.empty())
if (!command->Help.empty())
{
SendSysMessage(command->Help.c_str());
std::string helpText = command->Help;

// Attemp to localize help text if not in CLI mode
if (m_session)
{
int loc_idx = m_session->GetSessionDbLocaleIndex();
sCommandMgr.GetCommandHelpLocaleString(command->Id, loc_idx, &helpText);
}

SendSysMessage(helpText.c_str());
}

if (childCommands)
Expand Down
36 changes: 28 additions & 8 deletions src/game/WorldHandlers/Chat.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,32 @@ class Unit;

class ChatCommand
{
public:
const char* Name;
uint32 SecurityLevel; // function pointer required correct align (use uint32)
bool AllowConsole;
bool (ChatHandler::*Handler)(char* args);
std::string Help;
ChatCommand* ChildCommands;
public:
uint32 Id;
const char* Name;
uint32 SecurityLevel; // function pointer required correct align (use uint32)
bool AllowConsole;
bool (ChatHandler::* Handler)(char* args);
std::string Help;
ChatCommand* ChildCommands;

ChatCommand(
const char* pName,
uint32 pSecurityLevel,
bool pAllowConsole,
bool (ChatHandler::* pHandler)(char* args),
std::string pHelp,
ChatCommand* pChildCommands
)
: Id(-1)
{
Name = pName;
SecurityLevel = pSecurityLevel;
AllowConsole = pAllowConsole;
Handler = pHandler;
Help = pHelp;
ChildCommands = pChildCommands;
}
};

enum ChatCommandSearchResult
Expand Down Expand Up @@ -152,7 +171,7 @@ class ChatHandler

void SendGlobalSysMessage(const char* str, AccountTypes minSec = SEC_PLAYER);

bool SetDataForCommandInTable(ChatCommand* table, const char* text, uint32 security, std::string const& help);
bool SetDataForCommandInTable(ChatCommand* table, uint32 id, const char* text, uint32 security, std::string const& help);
void ExecuteCommand(const char* text);
void LogCommand(char const* fullcmd);

Expand Down Expand Up @@ -444,6 +463,7 @@ class ChatHandler
bool HandleReloadLocalesPageTextCommand(char* args);
bool HandleReloadLocalesPointsOfInterestCommand(char* args);
bool HandleReloadLocalesQuestCommand(char* args);
bool HandleReloadLocalesCommandHelpCommand(char* args);
bool HandleReloadLootTemplatesCreatureCommand(char* args);
bool HandleReloadLootTemplatesDisenchantCommand(char* args);
bool HandleReloadLootTemplatesFishingCommand(char* args);
Expand Down
120 changes: 120 additions & 0 deletions src/game/WorldHandlers/CommandMgr.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/*
* Copyright (C) 2015-2020 MaNGOS project <https://getmangos.eu>
* Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include "Common.h"
#include "SharedDefines.h"
#include "Policies/Singleton.h"
#include "ObjectGuid.h"
#include "Language.h"
#include "CommandMgr.h"
#include "ObjectMgr.h"
#include "ProgressBar.h"

class ChatCommand; // Forward declaration of

INSTANTIATE_SINGLETON_1(CommandMgr);

CommandMgr::CommandMgr() {}
CommandMgr::~CommandMgr() {}

// Perhaps migrate all this in ObjectMgr.cpp ?
void CommandMgr::LoadCommandHelpLocale()
{
m_CommandHelpLocaleMap.clear();

uint32 count=0;

QueryResult* result = WorldDatabase.Query("SELECT "
"`id`,"
"`help_text_loc1`,"
"`help_text_loc2`,"
"`help_text_loc3`,"
"`help_text_loc4`,"
"`help_text_loc5`,"
"`help_text_loc6`,"
"`help_text_loc7`,"
"`help_text_loc8`"
" FROM `locales_command` ORDER BY `id` ASC "
);

if (!result)
{
sLog.outString();
sLog.outString(">> Loaded 0 locales command help definitions. DB table `locales_command` is empty.");
return;
}

BarGoLink bar(result->GetRowCount());

do
{
Field* fields = result->Fetch();
bar.step();

uint32 commandId = fields[0].GetUInt32(); // to assign with db data

CommandHelpLocale& data = m_CommandHelpLocaleMap[commandId];
for (int i = 1; i <= MAX_LOCALE; ++i)
{
std::string str = fields[i].GetCppString();
if (!str.empty())
{
int idx = sObjectMgr.GetOrNewIndexForLocale(LocaleConstant(i));
if (idx >= 0)
{
if ((int32)data.HelpText.size() <= idx)
{
data.HelpText.resize(idx + 1);
}
data.HelpText[idx] = str;
}
}
}

++count;
} while (result->NextRow());

sLog.outString();
sLog.outString(">> Loaded %u locale command help definitions", count);

}

CommandHelpLocale const* CommandMgr::GetCommandLocale(uint32 commandId) const
{
CommandHelpLocaleMap::const_iterator itr = m_CommandHelpLocaleMap.find(commandId);
if (itr == m_CommandHelpLocaleMap.end())
{
return NULL;
}
return &itr->second;
}

void CommandMgr::GetCommandHelpLocaleString(uint32 commandId, int32 loc_idx, std::string* namePtr) const
{
if (loc_idx >= 0)
{
if (CommandHelpLocale const* il = GetCommandLocale(commandId))
{
if (namePtr && il->HelpText.size() > size_t(loc_idx) && !il->HelpText[loc_idx].empty())
{
*namePtr = il->HelpText[loc_idx];
}
}
}
}
49 changes: 49 additions & 0 deletions src/game/WorldHandlers/CommandMgr.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Copyright (C) 2015-2020 MaNGOS project <https://getmangos.eu>
* Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef COMMANDMGR_H
#define COMMANDMGR_H


struct CommandHelpLocale
{
std::vector<std::string> HelpText;
};

typedef UNORDERED_MAP<uint32, CommandHelpLocale> CommandHelpLocaleMap;


class CommandMgr
{
public:
CommandMgr();
~CommandMgr();

void LoadCommandHelpLocale();
void GetCommandHelpLocaleString(uint32 entry, int32 loc_idx, std::string* namePtr) const;

private:
CommandHelpLocale const* GetCommandLocale(uint32 commandId) const;
CommandHelpLocaleMap m_CommandHelpLocaleMap;
};


#define sCommandMgr MaNGOS::Singleton<CommandMgr>::Instance()

#endif
2 changes: 2 additions & 0 deletions src/game/WorldHandlers/World.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
#include "LFGMgr.h"
#include "DisableMgr.h"
#include "Language.h"
#include "CommandMgr.h"
#include "revision.h"

#ifdef ENABLE_ELUNA
Expand Down Expand Up @@ -1301,6 +1302,7 @@ void World::SetInitialWorldSettings()
sObjectMgr.LoadPageTextLocales(); // must be after PageText loading
sObjectMgr.LoadGossipMenuItemsLocales(); // must be after gossip menu items loading
sObjectMgr.LoadPointOfInterestLocales(); // must be after POI loading
sCommandMgr.LoadCommandHelpLocale();
sLog.outString(">>> Localization strings loaded");
sLog.outString();

Expand Down
4 changes: 2 additions & 2 deletions src/shared/revision.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
#define CHAR_DB_UPDATE_DESCRIPTION "Add_Field_Comments"

#define WORLD_DB_VERSION_NR 21
#define WORLD_DB_STRUCTURE_NR 19
#define WORLD_DB_STRUCTURE_NR 20
#define WORLD_DB_CONTENT_NR 001
#define WORLD_DB_UPDATE_DESCRIPTION "GM_tickets_handling_fixes_pt2"
#define WORLD_DB_UPDATE_DESCRIPTION "GM_Commands_localization"
#endif // __REVISION_H__