root/trunk/src/game/Chat.cpp @ 168

Revision 168, 66.0 kB (checked in by yumileroy, 17 years ago)

[svn] *** Source Mangos ***
*Load npc_options at server startup, use cached data at creature gossip menu init.
* Also new .reload table command added
*Implement npc_option localization support, also store in DB BoxText/BoxMoney/Coded?
* Use characters.guid instead low guid value from characters.data in charcter enum data prepering for client.
* Fixed crash at .pinfo command use from console.
* Fixed windows ad.exe build
*Creature related code and DB cleanups.
* Rename 2 creature_template fields to more clean names and related code update also.
* Use enum values instead raw values for type_flags, use halper functions instead code repeating.
* Move tamed pet creating code to new function.

** Small code changes to make things compliant with above changes.
** Another rev with big changes so test away.

Original author: KingPin?
Date: 2008-11-05 09:22:56-06:00

Line 
1/*
2 * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
3 *
4 * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#include "Common.h"
22#include "Language.h"
23#include "Database/DatabaseEnv.h"
24#include "WorldPacket.h"
25#include "WorldSession.h"
26#include "Opcodes.h"
27#include "Log.h"
28#include "World.h"
29#include "ObjectMgr.h"
30#include "Player.h"
31#include "UpdateMask.h"
32#include "Chat.h"
33#include "MapManager.h"
34#include "GridNotifiersImpl.h"
35#include "CellImpl.h"
36
37bool ChatHandler::load_command_table = true;
38
39ChatCommand * ChatHandler::getCommandTable()
40{
41        static ChatCommand accountSetCommandTable[] =
42        {
43                { "addon",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleAccountSetAddonCommand,     "", NULL },
44                { "gmlevel",        SEC_CONSOLE,        true,  &ChatHandler::HandleAccountSetGmLevelCommand,   "", NULL },
45                { "password",       SEC_CONSOLE,        true,  &ChatHandler::HandleAccountSetPasswordCommand,  "", NULL },
46                { NULL,             0,                  false, NULL,                                           "", NULL }
47        };
48
49        static ChatCommand accountCommandTable[] =
50        {
51                { "create",         SEC_CONSOLE,        true,  &ChatHandler::HandleAccountCreateCommand,       "", NULL },
52                { "delete",         SEC_CONSOLE,        true,  &ChatHandler::HandleAccountDeleteCommand,       "", NULL },
53                { "onlinelist",     SEC_CONSOLE,        true,  &ChatHandler::HandleAccountOnlineListCommand,   "", NULL },
54                { "set",            SEC_ADMINISTRATOR,  true,  NULL,                                           "", accountSetCommandTable },
55                { "",               SEC_PLAYER,         false, &ChatHandler::HandleAccountCommand,             "", NULL },
56                { NULL,             0,                  false, NULL,                                           "", NULL }
57        };
58
59        static ChatCommand serverSetCommandTable[] =
60        {
61                { "loglevel",       SEC_CONSOLE,        true,  &ChatHandler::HandleServerSetLogLevelCommand,   "", NULL },
62                { "motd",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleServerSetMotdCommand,       "", NULL },
63                { NULL,             0,                  false, NULL,                                           "", NULL }
64        };
65
66    static ChatCommand serverCommandTable[] =
67    {
68        { "corpses",        SEC_GAMEMASTER,     true,  &ChatHandler::HandleServerCorpsesCommand,       "", NULL },
69                { "exit",           SEC_CONSOLE,        true,  &ChatHandler::HandleServerExitCommand,          "", NULL },
70                { "idlerestart",    SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleIdleRestartCommand,         "", NULL },
71                { "idleshutdown",   SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleIdleShutDownCommand,        "", NULL },
72                { "info",           SEC_PLAYER,         true,  &ChatHandler::HandleServerInfoCommand,          "", NULL },
73                { "motd",           SEC_PLAYER,         true,  &ChatHandler::HandleServerMotdCommand,          "", NULL },
74                { "restart",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleRestartCommand,             "", NULL },
75                { "shutdown",       SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleShutDownCommand,            "", NULL },
76                { "set",            SEC_ADMINISTRATOR,  true,  NULL,                                           "", serverSetCommandTable },
77                { NULL,             0,                  false, NULL,                                           "", NULL }
78    };
79
80    static ChatCommand modifyCommandTable[] =
81    {
82        { "hp",             SEC_MODERATOR,      false, &ChatHandler::HandleModifyHPCommand,            "", NULL },
83                { "mana",           SEC_MODERATOR,      false, &ChatHandler::HandleModifyManaCommand,          "", NULL },
84                { "rage",           SEC_MODERATOR,      false, &ChatHandler::HandleModifyRageCommand,          "", NULL },
85                { "energy",         SEC_MODERATOR,      false, &ChatHandler::HandleModifyEnergyCommand,        "", NULL },
86                { "money",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyMoneyCommand,         "", NULL },
87                { "speed",          SEC_MODERATOR,      false, &ChatHandler::HandleModifySpeedCommand,         "", NULL },
88                { "swim",           SEC_MODERATOR,      false, &ChatHandler::HandleModifySwimCommand,          "", NULL },
89                { "scale",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyScaleCommand,         "", NULL },
90                { "bit",            SEC_MODERATOR,      false, &ChatHandler::HandleModifyBitCommand,           "", NULL },
91                { "bwalk",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyBWalkCommand,         "", NULL },
92                { "fly",            SEC_MODERATOR,      false, &ChatHandler::HandleModifyFlyCommand,           "", NULL },
93                { "aspeed",         SEC_MODERATOR,      false, &ChatHandler::HandleModifyASpeedCommand,        "", NULL },
94                { "faction",        SEC_MODERATOR,      false, &ChatHandler::HandleModifyFactionCommand,       "", NULL },
95                { "spell",          SEC_MODERATOR,      false, &ChatHandler::HandleModifySpellCommand,         "", NULL },
96                { "tp",             SEC_MODERATOR,      false, &ChatHandler::HandleModifyTalentCommand,        "", NULL },
97                { "titles",         SEC_MODERATOR,      false, &ChatHandler::HandleModifyKnownTitlesCommand,   "", NULL },
98                { "mount",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyMountCommand,         "", NULL },
99                { "honor",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyHonorCommand,         "", NULL },
100                { "rep",            SEC_MODERATOR,      false, &ChatHandler::HandleModifyRepCommand,           "", NULL },
101                { "arena",          SEC_MODERATOR,      false, &ChatHandler::HandleModifyArenaCommand,         "", NULL },
102                { "drunk",          SEC_MODERATOR,      false, &ChatHandler::HandleDrunkCommand,               "", NULL },
103                { "standstate",     SEC_GAMEMASTER,     false, &ChatHandler::HandleStandStateCommand,          "", NULL },
104                { "morph",          SEC_GAMEMASTER,     false, &ChatHandler::HandleMorphCommand,               "", NULL },
105        { "gender",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleModifyGenderCommand,        "", NULL },
106                { NULL,             0,                  false, NULL,                                           "", NULL }
107    };
108
109    static ChatCommand wpCommandTable[] =
110    {
111        { "show",           SEC_GAMEMASTER,     false, &ChatHandler::HandleWpShowCommand,              "", NULL },
112                { "add",            SEC_GAMEMASTER,     false, &ChatHandler::HandleWpAddCommand,               "", NULL },
113                { "modify",         SEC_GAMEMASTER,     false, &ChatHandler::HandleWpModifyCommand,            "", NULL },
114                { "export",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleWpExportCommand,            "", NULL },
115                { "import",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleWpImportCommand,            "", NULL },
116                { NULL,             0,                  false, NULL,                                           "", NULL }
117    };
118
119        static ChatCommand banCommandTable[] =
120        {
121                { "account",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanAccountCommand,          "", NULL },
122                { "character",      SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanCharacterCommand,        "", NULL },
123                { "ip",             SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanIPCommand,               "", NULL },
124                { NULL,             0,                  false, NULL,                                           "", NULL }
125        };
126
127        static ChatCommand baninfoCommandTable[] =
128        {
129                { "account",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanInfoAccountCommand,      "", NULL },
130                { "character",      SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanInfoCharacterCommand,    "", NULL },
131                { "ip",             SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanInfoIPCommand,           "", NULL },
132                { NULL,             0,                  false, NULL,                                           "", NULL }
133        };
134
135        static ChatCommand banlistCommandTable[] =
136        {
137                { "account",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanListAccountCommand,      "", NULL },
138                { "character",      SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanListCharacterCommand,    "", NULL },
139                { "ip",             SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleBanListIPCommand,           "", NULL },
140                { NULL,             0,                  false, NULL,                                           "", NULL }
141        };
142
143        static ChatCommand unbanCommandTable[] =
144        {
145                { "account",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleUnBanAccountCommand,      "", NULL },
146                { "character",      SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleUnBanCharacterCommand,    "", NULL },
147                { "ip",             SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleUnBanIPCommand,           "", NULL },
148                { NULL,             0,                  false, NULL,                                           "", NULL }
149        };
150
151    static ChatCommand debugCommandTable[] =
152    {
153        { "inarc",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleDebugInArcCommand,          "", NULL },
154                { "spellfail",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleDebugSpellFailCommand,      "", NULL },
155                { "setpoi",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSetPoiCommand,              "", NULL },
156                { "qpartymsg",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendQuestPartyMsgCommand,   "", NULL },
157                { "qinvalidmsg",    SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendQuestInvalidMsgCommand, "", NULL },
158                { "equiperr",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleEquipErrorCommand,          "", NULL },
159                { "sellerr",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSellErrorCommand,           "", NULL },
160                { "buyerr",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleBuyErrorCommand,            "", NULL },
161                { "sendopcode",     SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendOpcodeCommand,          "", NULL },
162                { "uws",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleUpdateWorldStateCommand,    "", NULL },
163                { "ps",             SEC_ADMINISTRATOR,  false, &ChatHandler::HandlePlaySound2Command,          "", NULL },
164                { "scn",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendChannelNotifyCommand,   "", NULL },
165                { "scm",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSendChatMsgCommand,         "", NULL },
166                { "getitemstate",   SEC_ADMINISTRATOR,  false, &ChatHandler::HandleGetItemState,               "", NULL },
167                { "playsound",      SEC_MODERATOR,      false, &ChatHandler::HandlePlaySoundCommand,           "", NULL },
168                { "update",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleUpdate,                     "", NULL },
169                { "setvalue",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSetValue,                   "", NULL },
170                { "getvalue",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleGetValue,                   "", NULL },
171                { "Mod32Value",     SEC_ADMINISTRATOR,  false, &ChatHandler::HandleMod32Value,                 "", NULL },
172                { "anim",           SEC_GAMEMASTER,     false, &ChatHandler::HandleAnimCommand,                "", NULL },
173                { "lootrecipient",  SEC_GAMEMASTER,     false, &ChatHandler::HandleGetLootRecipient,           "", NULL },
174                { NULL,             0,                  false, NULL,                                           "", NULL }
175    };
176
177    static ChatCommand eventCommandTable[] =
178    {
179        { "activelist",     SEC_GAMEMASTER,     true,  &ChatHandler::HandleEventActiveListCommand,     "", NULL },
180                { "start",          SEC_GAMEMASTER,     true,  &ChatHandler::HandleEventStartCommand,          "", NULL },
181                { "stop",           SEC_GAMEMASTER,     true,  &ChatHandler::HandleEventStopCommand,           "", NULL },
182                { "",               SEC_GAMEMASTER,     true, &ChatHandler::HandleEventInfoCommand,            "", NULL },
183                { NULL,             0,                  false, NULL,                                           "", NULL }
184    };
185
186    static ChatCommand learnCommandTable[] =
187    {
188        { "all",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnAllCommand,            "", NULL },
189                { "all_gm",         SEC_GAMEMASTER,     false, &ChatHandler::HandleLearnAllGMCommand,          "", NULL },
190                { "all_crafts",     SEC_GAMEMASTER,     false, &ChatHandler::HandleLearnAllCraftsCommand,      "", NULL },
191                { "all_default",    SEC_MODERATOR,      false, &ChatHandler::HandleLearnAllDefaultCommand,     "", NULL },
192                { "all_lang",       SEC_MODERATOR,      false, &ChatHandler::HandleLearnAllLangCommand,        "", NULL },
193                { "all_myclass",    SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnAllMyClassCommand,     "", NULL },
194                { "all_myspells",   SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnAllMySpellsCommand,    "", NULL },
195                { "all_mytalents",  SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnAllMyTalentsCommand,   "", NULL },
196                { "all_recipes",    SEC_GAMEMASTER,     false, &ChatHandler::HandleLearnAllRecipesCommand,     "", NULL },
197                { "",               SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLearnCommand,               "", NULL },
198                { NULL,             0,                  false, NULL,                                           "", NULL }
199    };
200
201    static ChatCommand reloadCommandTable[] =
202    {
203        { "all", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllCommand, "", NULL },
204                {"all_loot", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLootCommand, "", NULL },
205                { "all_npc", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllNpcCommand, "", NULL },
206                { "all_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllQuestCommand, "", NULL },
207                { "all_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllScriptsCommand, "", NULL },
208                { "all_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllSpellCommand, "", NULL },
209                { "all_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllItemCommand, "", NULL },
210                { "all_locales", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAllLocalesCommand, "", NULL },
211
212                { "config", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadConfigCommand, "", NULL },
213
214                { "areatrigger_tavern", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTavernCommand, "", NULL },
215                { "areatrigger_teleport", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadAreaTriggerTeleportCommand, "", NULL },
216                { "areatrigger_involvedrelation",SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestAreaTriggersCommand, "", NULL },
217                { "event_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadEventScriptsCommand, "", NULL },
218                { "command", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommandCommand, "", NULL },
219                { "creature_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestInvRelationsCommand,"",NULL },
220                { "creature_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesCreatureCommand, "", NULL },
221                { "creature_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCreatureQuestRelationsCommand, "", NULL },
222                { "disenchant_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesDisenchantCommand, "", NULL },
223                { "fishing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesFishingCommand, "", NULL },
224                { "game_graveyard_zone", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameGraveyardZoneCommand, "", NULL },
225                { "game_tele", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameTeleCommand, "", NULL },
226                { "gameobject_involvedrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestInvRelationsCommand, "", NULL },
227                { "gameobject_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesGameobjectCommand, "", NULL },
228                { "gameobject_questrelation", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGOQuestRelationsCommand, "", NULL },
229                { "gameobject_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadGameObjectScriptsCommand, "", NULL },
230                { "item_enchantment_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadItemEnchantementsCommand, "", NULL },
231                { "item_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesItemCommand, "", NULL },
232                { "trinity_string", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadTrinityStringCommand, "", NULL },
233                { "npc_gossip", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcGossipCommand, "", NULL },
234        { "npc_option",                  SEC_ADMINISTRATOR, true,  &ChatHandler::HandleReloadNpcOptionCommand,               "", NULL },
235                { "npc_trainer", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcTrainerCommand, "", NULL },
236                { "npc_vendor", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadNpcVendorCommand, "", NULL },
237                { "page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadPageTextsCommand, "", NULL },
238                { "pickpocketing_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesPickpocketingCommand,"",NULL},
239                { "prospecting_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesProspectingCommand,"", NULL },
240                { "quest_mail_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesQuestMailCommand, "", NULL },
241                { "quest_end_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestEndScriptsCommand, "", NULL },
242                { "quest_start_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestStartScriptsCommand, "", NULL },
243                { "quest_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadQuestTemplateCommand, "", NULL },
244                { "reference_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesReferenceCommand, "", NULL },
245                { "reserved_name", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadReservedNameCommand, "", NULL },
246                { "skill_discovery_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillDiscoveryTemplateCommand, "", NULL },
247                { "skill_extra_item_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillExtraItemTemplateCommand, "", NULL },
248                { "skill_fishing_base_level", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSkillFishingBaseLevelCommand, "", NULL },
249                { "skinning_loot_template", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLootTemplatesSkinningCommand, "", NULL },
250                { "spell_affect", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellAffectCommand, "", NULL },
251                { "spell_chain", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellChainCommand, "", NULL },
252                { "spell_elixir", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellElixirCommand, "", NULL },
253                { "spell_learn_spell", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellLearnSpellCommand, "", NULL },
254                { "spell_pet_auras", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellPetAurasCommand, "", NULL },
255                { "spell_proc_event", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellProcEventCommand, "", NULL },
256                { "spell_script_target", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptTargetCommand, "", NULL },
257                { "spell_scripts", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellScriptsCommand, "", NULL },
258                { "spell_target_position", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellTargetPositionCommand, "", NULL },
259                { "spell_threats", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadSpellThreatsCommand, "", NULL },
260                { "locales_creature", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesCreatureCommand, "", NULL },
261                { "locales_gameobject", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesGameobjectCommand, "", NULL },
262                { "locales_item", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesItemCommand, "", NULL },
263                { "locales_npc_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesNpcTextCommand, "", NULL },
264                { "locales_page_text", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesPageTextCommand, "", NULL },
265                { "locales_quest", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadLocalesQuestCommand, "", NULL },
266
267                { "", SEC_ADMINISTRATOR, true, &ChatHandler::HandleReloadCommand, "", NULL },
268                { NULL,                          0,                 false, NULL,                                                     "", NULL }
269    };
270
271    static ChatCommand honorCommandTable[] =
272    {
273        { "add",            SEC_GAMEMASTER,     false, &ChatHandler::HandleAddHonorCommand,            "", NULL },
274                { "addkill",        SEC_GAMEMASTER,     false, &ChatHandler::HandleHonorAddKillCommand,        "", NULL },
275                { "update",         SEC_GAMEMASTER,     false, &ChatHandler::HandleUpdateHonorFieldsCommand,   "", NULL },
276                { NULL,             0,                  false, NULL,                                           "", NULL }
277    };
278
279    static ChatCommand guildCommandTable[] =
280    {
281                { "create",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildCreateCommand,         "", NULL },
282                { "delete",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildDeleteCommand,         "", NULL },
283                { "invite",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildInviteCommand,         "", NULL },
284                { "uninvite",       SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildUninviteCommand,       "", NULL },
285                { "rank",           SEC_GAMEMASTER,     true,  &ChatHandler::HandleGuildRankCommand,           "", NULL },
286                { NULL,             0,                  false, NULL,                                           "", NULL }
287    };
288   
289    static ChatCommand petCommandTable[] =
290        {
291                { "create",         SEC_GAMEMASTER,     false, &ChatHandler::HandleCreatePetCommand,           "", NULL },
292                { "learn",          SEC_GAMEMASTER,     false, &ChatHandler::HandlePetLearnCommand,            "", NULL },
293                { "unlearn",        SEC_GAMEMASTER,     false, &ChatHandler::HandlePetUnlearnCommand,          "", NULL },
294                { "tp",             SEC_GAMEMASTER,     false, &ChatHandler::HandlePetTpCommand,               "", NULL },
295                { NULL,             0,                  false, NULL,                                           "", NULL }
296        };
297
298
299    static ChatCommand groupCommandTable[] =
300    {
301        { "leader",         SEC_ADMINISTRATOR,     false,  &ChatHandler::HandleGroupLeaderCommand,         "", NULL },
302        { "disband",        SEC_ADMINISTRATOR,     false,  &ChatHandler::HandleGroupDisbandCommand,        "", NULL },
303        { "remove",         SEC_ADMINISTRATOR,     false,  &ChatHandler::HandleGroupRemoveCommand,         "", NULL },
304        { NULL,             0,                                     false, NULL,                                           "", NULL }
305    };
306
307    static ChatCommand lookupPlayerCommandTable[] =
308    {
309                { "ip", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL },
310                { "account", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerAccountCommand, "", NULL },
311                { "email", SEC_GAMEMASTER, true, &ChatHandler::HandleLookupPlayerEmailCommand, "", NULL },
312                { NULL,             0,                  false, NULL,                                            "", NULL }
313    };
314
315    static ChatCommand lookupCommandTable[] =
316    {
317        { "area",           SEC_MODERATOR,      true,  &ChatHandler::HandleLookupAreaCommand,          "", NULL },
318                { "creature",       SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupCreatureCommand,      "", NULL },
319                { "event",          SEC_GAMEMASTER,     true,  &ChatHandler::HandleLookupEventCommand,         "", NULL },
320                { "faction",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupFactionCommand,       "", NULL },
321                { "item",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupItemCommand,          "", NULL },
322                { "itemset",        SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupItemSetCommand,       "", NULL },
323                { "object",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupObjectCommand,        "", NULL },
324                { "quest",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupQuestCommand,         "", NULL },
325                { "player",         SEC_GAMEMASTER,     true,  NULL,                                           "", lookupPlayerCommandTable },
326                { "skill",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupSkillCommand,         "", NULL },
327                { "spell",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLookupSpellCommand,         "", NULL },
328                { "tele",           SEC_MODERATOR,      true,  &ChatHandler::HandleLookupTeleCommand,          "", NULL },
329                { NULL,             0,                  false, NULL,                                           "", NULL }
330    };
331
332    static ChatCommand resetCommandTable[] =
333    {
334        { "honor",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetHonorCommand,          "", NULL },
335                { "level",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetLevelCommand,          "", NULL },
336                { "spells",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetSpellsCommand,         "", NULL },
337                { "stats",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetStatsCommand,          "", NULL },
338                { "talents",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetTalentsCommand,        "", NULL },
339                { "all",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleResetAllCommand,            "", NULL },
340                { NULL,             0,                  false, NULL,                                           "", NULL }
341    };
342
343    static ChatCommand castCommandTable[] =
344    {
345        { "back",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastBackCommand,            "", NULL },
346                { "dist",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastDistCommand,            "", NULL },
347                { "self",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastSelfCommand,            "", NULL },
348                { "target",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastTargetCommand,          "", NULL },
349                { "",               SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCastCommand,                "", NULL },
350                { NULL,             0,                  false, NULL,                                           "", NULL }
351    };
352
353    static ChatCommand pdumpCommandTable[] =
354    {
355        { "load",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLoadPDumpCommand,           "", NULL },
356                { "write",          SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleWritePDumpCommand,          "", NULL },
357                { NULL,             0,                  false, NULL,                                           "", NULL }
358    };
359
360    static ChatCommand listCommandTable[] =
361    {
362        { "creature",       SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleListCreatureCommand,        "", NULL },
363                { "item",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleListItemCommand,            "", NULL },
364                { "object",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleListObjectCommand,          "", NULL },
365                { "auras",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleListAurasCommand,           "", NULL },
366                { NULL,             0,                  false, NULL,                                           "", NULL }
367    };
368
369    static ChatCommand teleCommandTable[] =
370    {
371        { "add",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddTeleCommand,             "", NULL },
372                { "del",            SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleDelTeleCommand,             "", NULL },
373                { "name",           SEC_MODERATOR,      true,  &ChatHandler::HandleNameTeleCommand,            "", NULL },
374                { "group",          SEC_MODERATOR,      false, &ChatHandler::HandleGroupTeleCommand,           "", NULL },
375                { "",               SEC_MODERATOR,      false, &ChatHandler::HandleTeleCommand,                "", NULL },
376                { NULL,             0,                  false, NULL,                                           "", NULL }
377    };
378
379    static ChatCommand npcCommandTable[] =
380    {
381        { "say",            SEC_MODERATOR,      false, &ChatHandler::HandleSayCommand,                 "", NULL },
382                { "whisper",        SEC_MODERATOR,      false, &ChatHandler::HandleNpcWhisperCommand,          "", NULL },
383                { "yell",           SEC_MODERATOR,      false, &ChatHandler::HandleYellCommand,                "", NULL },
384                { "textemote",      SEC_MODERATOR,      false, &ChatHandler::HandleTextEmoteCommand,           "", NULL },
385                { "add",            SEC_GAMEMASTER,     false, &ChatHandler::HandleAddSpwCommand,              "", NULL },
386                { "delete",         SEC_GAMEMASTER,     false, &ChatHandler::HandleDelCreatureCommand,         "", NULL },
387                { "spawndist",      SEC_GAMEMASTER,     false, &ChatHandler::HandleSpawnDistCommand,           "", NULL },
388                { "spawntime",      SEC_GAMEMASTER,     false, &ChatHandler::HandleSpawnTimeCommand,           "", NULL },
389                { "factionid",      SEC_GAMEMASTER,     false, &ChatHandler::HandleFactionIdCommand,           "", NULL },
390                { "addmove",        SEC_GAMEMASTER,     false, &ChatHandler::HandleAddMoveCommand,             "", NULL },
391                { "setmovetype",    SEC_GAMEMASTER,     false, &ChatHandler::HandleSetMoveTypeCommand,         "", NULL },
392                { "move",           SEC_GAMEMASTER,     false, &ChatHandler::HandleMoveCreatureCommand,        "", NULL },
393                { "changelevel",    SEC_GAMEMASTER,     false, &ChatHandler::HandleChangeLevelCommand,         "", NULL },
394                { "setmodel",       SEC_GAMEMASTER,     false, &ChatHandler::HandleSetModelCommand,            "", NULL },
395                { "additem",        SEC_GAMEMASTER,     false, &ChatHandler::HandleAddVendorItemCommand,       "", NULL },
396                { "delitem",        SEC_GAMEMASTER,     false, &ChatHandler::HandleDelVendorItemCommand,       "", NULL },
397                { "flag",           SEC_GAMEMASTER,     false, &ChatHandler::HandleNPCFlagCommand,             "", NULL },
398                { "changeentry",    SEC_ADMINISTRATOR,  false, &ChatHandler::HandleChangeEntryCommand,         "", NULL },
399                { "info",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleNpcInfoCommand,             "", NULL },
400                { "playemote",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandlePlayEmoteCommand,           "", NULL },
401        { "follow",         SEC_GAMEMASTER,     false, &ChatHandler::HandleNpcFollowCommand,           "", NULL },
402        { "unfollow",       SEC_GAMEMASTER,     false, &ChatHandler::HandleNpcUnFollowCommand,         "", NULL },
403
404        //{ TODO: fix or remove this commands
405        { "name",           SEC_GAMEMASTER,     false, &ChatHandler::HandleNameCommand,                "", NULL },
406                { "subname",        SEC_GAMEMASTER,     false, &ChatHandler::HandleSubNameCommand,             "", NULL },
407                { "addweapon",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddWeaponCommand,           "", NULL },
408        //}
409
410        { NULL,             0,                  false, NULL,                                           "", NULL }
411    };
412
413    static ChatCommand goCommandTable[] =
414    {
415        { "grid",           SEC_MODERATOR,      false, &ChatHandler::HandleGoGridCommand,              "", NULL },
416                { "creature",       SEC_GAMEMASTER,     false, &ChatHandler::HandleGoCreatureCommand,          "", NULL },
417                { "object",         SEC_GAMEMASTER,     false, &ChatHandler::HandleGoObjectCommand,            "", NULL },
418                { "trigger",        SEC_GAMEMASTER,     false, &ChatHandler::HandleGoTriggerCommand,           "", NULL },
419                { "graveyard",      SEC_GAMEMASTER,     false, &ChatHandler::HandleGoGraveyardCommand,         "", NULL },
420                { "zonexy",         SEC_MODERATOR,      false, &ChatHandler::HandleGoZoneXYCommand,            "", NULL },
421                { "xy",             SEC_MODERATOR,      false, &ChatHandler::HandleGoXYCommand,                "", NULL },
422                { "xyz",            SEC_MODERATOR,      false, &ChatHandler::HandleGoXYZCommand,               "", NULL },
423                { "",               SEC_MODERATOR,      false, &ChatHandler::HandleGoXYZCommand,               "", NULL },
424                { NULL,             0,                  false, NULL,                                           "", NULL }
425    };
426
427    static ChatCommand gobjectCommandTable[] =
428    {
429        { "add",            SEC_GAMEMASTER,     false, &ChatHandler::HandleGameObjectCommand,          "", NULL },
430                { "delete",         SEC_GAMEMASTER,     false, &ChatHandler::HandleDelObjectCommand,           "", NULL },
431                { "target",         SEC_GAMEMASTER,     false, &ChatHandler::HandleTargetObjectCommand,        "", NULL },
432                { "turn",           SEC_GAMEMASTER,     false, &ChatHandler::HandleTurnObjectCommand,          "", NULL },
433                { "move",           SEC_GAMEMASTER,     false, &ChatHandler::HandleMoveObjectCommand,          "", NULL },
434                { "near",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleNearObjectCommand,          "", NULL },
435        { "activate",       SEC_GAMEMASTER,     false, &ChatHandler::HandleActivateObjectCommand,      "", NULL },
436                { NULL,             0,                  false, NULL,                                           "", NULL }
437    };
438
439    static ChatCommand questCommandTable[] =
440    {
441        { "add",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddQuest,                   "", NULL },
442                { "complete",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCompleteQuest,              "", NULL },
443                { "remove",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleRemoveQuest,                "", NULL },
444                { NULL,             0,                  false, NULL,                                           "", NULL }
445    };
446
447    static ChatCommand gmCommandTable[] =
448    {
449        { "chat",           SEC_MODERATOR,      false, &ChatHandler::HandleGMChatCommand,              "", NULL },
450                { "ingame",         SEC_PLAYER,         true,  &ChatHandler::HandleGMListIngameCommand,        "", NULL },
451                { "list",           SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleGMListFullCommand,          "", NULL },
452                { "visible",        SEC_MODERATOR,      false, &ChatHandler::HandleVisibleCommand,             "", NULL },
453                { "fly",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleFlyModeCommand,             "", NULL },
454                { "",               SEC_MODERATOR,      false, &ChatHandler::HandleGMmodeCommand,              "", NULL },
455                { NULL,             0,                  false, NULL,                                           "", NULL }
456    };
457
458    static ChatCommand instanceCommandTable[] =
459    {
460       { "listbinds",      SEC_MODERATOR,      false, &ChatHandler::HandleInstanceListBindsCommand,   "", NULL },
461           { "unbind",         SEC_MODERATOR,      false, &ChatHandler::HandleInstanceUnbindCommand,      "", NULL },
462           { "stats",          SEC_MODERATOR,      true,  &ChatHandler::HandleInstanceStatsCommand,       "", NULL },
463           { "savedata",       SEC_MODERATOR,      false, &ChatHandler::HandleInstanceSaveDataCommand,    "", NULL },
464           { NULL,             0,                  false, NULL,                                           "", NULL }
465    };
466
467    static ChatCommand commandTable[] =
468    {
469        { "account",        SEC_PLAYER,         true,  NULL,                                           "", accountCommandTable },
470                { "gm",             SEC_MODERATOR,      true,  NULL,                                           "", gmCommandTable },
471                { "npc",            SEC_MODERATOR,      false, NULL,                                           "", npcCommandTable },
472                { "go",             SEC_MODERATOR,      false, NULL,                                           "", goCommandTable },
473                { "learn",          SEC_MODERATOR,      false, NULL,                                           "", learnCommandTable },
474                { "modify",         SEC_MODERATOR,      false, NULL,                                           "", modifyCommandTable },
475                { "debug",          SEC_MODERATOR,      false, NULL,                                           "", debugCommandTable },
476                { "tele",           SEC_MODERATOR,      true,  NULL,                                           "", teleCommandTable },
477                { "event",          SEC_GAMEMASTER,     false, NULL,                                           "", eventCommandTable },
478                { "gobject",        SEC_GAMEMASTER,     false, NULL,                                           "", gobjectCommandTable },
479                { "honor",          SEC_GAMEMASTER,     false, NULL,                                           "", honorCommandTable },
480                { "wp",             SEC_GAMEMASTER,     false, NULL,                                           "", wpCommandTable },
481                { "quest",          SEC_ADMINISTRATOR,  false, NULL,                                           "", questCommandTable },
482                { "reload",         SEC_ADMINISTRATOR,  true,  NULL,                                           "", reloadCommandTable },
483                { "list",           SEC_ADMINISTRATOR,  true,  NULL,                                           "", listCommandTable },
484                { "lookup",         SEC_ADMINISTRATOR,  true,  NULL,                                           "", lookupCommandTable },
485                { "pdump",          SEC_ADMINISTRATOR,  true,  NULL,                                           "", pdumpCommandTable },
486                { "guild",          SEC_ADMINISTRATOR,  true,  NULL,                                           "", guildCommandTable },
487                { "cast",           SEC_ADMINISTRATOR,  false, NULL,                                           "", castCommandTable },
488                { "reset",          SEC_ADMINISTRATOR,  false, NULL,                                           "", resetCommandTable },
489                { "instance",       SEC_ADMINISTRATOR,  true,  NULL,                                           "", instanceCommandTable },
490                { "server",         SEC_ADMINISTRATOR,  true,  NULL,                                           "", serverCommandTable },
491        { "pet",            SEC_GAMEMASTER,     false, NULL,                                           "", petCommandTable },
492
493                { "aura",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAuraCommand,                "", NULL },
494                { "unaura",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleUnAuraCommand,              "", NULL },
495                { "nameannounce",   SEC_MODERATOR,      false, &ChatHandler::HandleNameAnnounceCommand,        "", NULL }, 
496                { "announce",       SEC_MODERATOR,      true,  &ChatHandler::HandleAnnounceCommand,            "", NULL },
497                { "notify",         SEC_MODERATOR,      true,  &ChatHandler::HandleNotifyCommand,              "", NULL },
498                { "goname",         SEC_MODERATOR,      false, &ChatHandler::HandleGonameCommand,              "", NULL },
499                { "namego",         SEC_MODERATOR,      false, &ChatHandler::HandleNamegoCommand,              "", NULL },
500                { "groupgo",        SEC_MODERATOR,      false, &ChatHandler::HandleGroupgoCommand,             "", NULL },
501                { "commands",       SEC_PLAYER,         true,  &ChatHandler::HandleCommandsCommand,            "", NULL },
502                { "demorph",        SEC_GAMEMASTER,     false, &ChatHandler::HandleDeMorphCommand,             "", NULL },
503                { "die",            SEC_ADMINISTRATOR,  false, &ChatHandler::HandleDieCommand,                 "", NULL },
504                { "revive",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleReviveCommand,              "", NULL },
505                { "dismount",       SEC_PLAYER,         false, &ChatHandler::HandleDismountCommand,            "", NULL },
506                { "gps",            SEC_MODERATOR,      false, &ChatHandler::HandleGPSCommand,                 "", NULL },
507                { "guid",           SEC_GAMEMASTER,     false, &ChatHandler::HandleGUIDCommand,                "", NULL },
508                { "help",           SEC_PLAYER,         true,  &ChatHandler::HandleHelpCommand,                "", NULL },
509                { "itemmove",       SEC_GAMEMASTER,     false, &ChatHandler::HandleItemMoveCommand,            "", NULL },
510                { "cooldown",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleCooldownCommand,            "", NULL },
511                { "unlearn",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleUnLearnCommand,             "", NULL },
512                { "distance",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleGetDistanceCommand,         "", NULL },
513                { "recall",         SEC_MODERATOR,      false, &ChatHandler::HandleRecallCommand,              "", NULL },
514                { "save",           SEC_PLAYER,         false, &ChatHandler::HandleSaveCommand,                "", NULL },
515                { "saveall",        SEC_MODERATOR,      true,  &ChatHandler::HandleSaveAllCommand,             "", NULL },
516                { "kick",           SEC_GAMEMASTER,     true,  &ChatHandler::HandleKickPlayerCommand,          "", NULL },
517                { "ban",            SEC_ADMINISTRATOR,  true,  NULL,                                           "", banCommandTable },
518                { "unban",          SEC_ADMINISTRATOR,  true,  NULL,                                           "", unbanCommandTable },
519                { "baninfo",        SEC_ADMINISTRATOR,  false, NULL,                                           "", baninfoCommandTable },
520                { "banlist",        SEC_ADMINISTRATOR,  true,  NULL,                                           "", banlistCommandTable },
521                { "plimit",         SEC_ADMINISTRATOR,  true,  &ChatHandler::HandlePLimitCommand,              "", NULL },
522                { "start",          SEC_PLAYER,         false, &ChatHandler::HandleStartCommand,               "", NULL },
523                { "taxicheat",      SEC_MODERATOR,      false, &ChatHandler::HandleTaxiCheatCommand,           "", NULL },
524                { "allowmove",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAllowMovementCommand,       "", NULL },
525                { "linkgrave",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLinkGraveCommand,           "", NULL },
526                { "neargrave",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleNearGraveCommand,           "", NULL },
527                { "explorecheat",   SEC_ADMINISTRATOR,  false, &ChatHandler::HandleExploreCheatCommand,        "", NULL },
528                { "hover",          SEC_ADMINISTRATOR,  false, &ChatHandler::HandleHoverCommand,               "", NULL },
529                { "waterwalk",      SEC_ADMINISTRATOR,  false, &ChatHandler::HandleWaterwalkCommand,           "", NULL },
530                { "levelup",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleLevelUpCommand,             "", NULL },
531                { "showarea",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleShowAreaCommand,            "", NULL },
532                { "hidearea",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleHideAreaCommand,            "", NULL },
533                { "additem",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddItemCommand,             "", NULL },
534                { "additemset",     SEC_ADMINISTRATOR,  false, &ChatHandler::HandleAddItemSetCommand,          "", NULL },
535                { "bank",           SEC_ADMINISTRATOR,  false, &ChatHandler::HandleBankCommand,                "", NULL },
536                { "wchange",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleChangeWeather,              "", NULL },
537                { "ticket",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleTicketCommand,              "", NULL },
538                { "delticket",      SEC_GAMEMASTER,     true,  &ChatHandler::HandleDelTicketCommand,           "", NULL },
539                { "maxskill",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleMaxSkillCommand,            "", NULL },
540                { "setskill",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleSetSkillCommand,            "", NULL },
541                { "whispers",       SEC_MODERATOR,      false, &ChatHandler::HandleWhispersCommand,            "", NULL },
542                { "pinfo",          SEC_GAMEMASTER,     true,  &ChatHandler::HandlePInfoCommand,               "", NULL },
543                { "password",       SEC_PLAYER,         false, &ChatHandler::HandlePasswordCommand,            "", NULL },
544                { "lockaccount",    SEC_PLAYER,         false, &ChatHandler::HandleLockAccountCommand,         "", NULL },
545                { "respawn",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandleRespawnCommand,             "", NULL },
546                { "sendmail",       SEC_MODERATOR,      false, &ChatHandler::HandleSendMailCommand,            "", NULL },
547                { "rename",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleRenameCommand,              "", NULL },
548                { "loadscripts",    SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleLoadScriptsCommand,         "", NULL },
549                { "mute",           SEC_GAMEMASTER,     true,  &ChatHandler::HandleMuteCommand,                "", NULL },
550                { "unmute",         SEC_GAMEMASTER,     true,  &ChatHandler::HandleUnmuteCommand,              "", NULL },
551                { "movegens",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleMovegensCommand,            "", NULL },
552                { "cometome",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleComeToMeCommand,            "", NULL },
553                { "damage",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleDamageCommand,              "", NULL },
554                { "combatstop",     SEC_GAMEMASTER,     false, &ChatHandler::HandleCombatStopCommand,          "", NULL },
555                { "chardelete",     SEC_CONSOLE,        true,  &ChatHandler::HandleCharacterDeleteCommand,     "", NULL },
556                { "sendmessage",    SEC_ADMINISTRATOR,  true,  &ChatHandler::HandleSendMessageCommand,         "", NULL },
557        { "playall",        SEC_ADMINISTRATOR,  false, &ChatHandler::HandlePlayAllCommand,             "", NULL },
558        { "repairitems",    SEC_GAMEMASTER,     false, &ChatHandler::HandleRepairitemsCommand,         "", NULL },
559                { "freeze",         SEC_ADMINISTRATOR,  false, &ChatHandler::HandleFreezeCommand,              "", NULL }, 
560                { "unfreeze",       SEC_ADMINISTRATOR,  false, &ChatHandler::HandleUnFreezeCommand,            "", NULL }, 
561                { "listfreeze",     SEC_ADMINISTRATOR,  false, &ChatHandler::HandleListFreezeCommand,          "", NULL }, 
562                { "flusharenapoints", SEC_ADMINISTRATOR, false, &ChatHandler::HandleFlushArenaPointsCommand,   "", NULL }, 
563
564                { NULL,             0,                  false, NULL,                                           "", NULL }
565    };
566
567    if(load_command_table)
568    {
569        load_command_table = false;
570
571        QueryResult *result = WorldDatabase.Query("SELECT name,security,help FROM command");
572        if (result)
573        {
574            do
575            {
576                Field *fields = result->Fetch();
577                std::string name = fields[0].GetCppString();
578                for(uint32 i = 0; commandTable[i].Name != NULL; i++)
579                {
580                    if (name == commandTable[i].Name)
581                    {
582                        commandTable[i].SecurityLevel = (uint16)fields[1].GetUInt16();
583                        commandTable[i].Help = fields[2].GetCppString();
584                    }
585                    if(commandTable[i].ChildCommands != NULL)
586                    {
587                        ChatCommand *ptable = commandTable[i].ChildCommands;
588                        for(uint32 j = 0; ptable[j].Name != NULL; j++)
589                        {
590                            // first case for "" named subcommand
591                            if (ptable[j].Name[0]=='\0' && name == commandTable[i].Name ||
592                                name == fmtstring("%s %s", commandTable[i].Name, ptable[j].Name) )
593                            {
594                                ptable[j].SecurityLevel = (uint16)fields[1].GetUInt16();
595                                ptable[j].Help = fields[2].GetCppString();
596                            }
597                        }
598                    }
599                }
600            } while(result->NextRow());
601            delete result;
602        }
603    }
604
605    return commandTable;
606}
607
608const char *ChatHandler::GetTrinityString(int32 entry) const
609{
610    return m_session->GetTrinityString(entry);
611}
612
613bool ChatHandler::isAvailable(ChatCommand const& cmd) const
614{
615        // check security level only for simple  command (without child commands)
616        return m_session->GetSecurity() >= cmd.SecurityLevel;
617}
618
619bool ChatHandler::hasStringAbbr(const char* name, const char* part)
620{
621    // non "" command
622    if( *name )
623    {
624        // "" part from non-"" command
625        if( !*part )
626            return false;
627
628        for(;;)
629        {
630            if( !*part )
631                return true;
632            else if( !*name )
633                return false;
634            else if( tolower( *name ) != tolower( *part ) )
635                return false;
636            ++name; ++part;
637        }
638    }
639    // allow with any for ""
640
641    return true;
642}
643
644void ChatHandler::SendSysMessage(const char *str)
645{
646    WorldPacket data;
647
648    // need copy to prevent corruption by strtok call in LineFromMessage original string
649    char* buf = strdup(str);
650    char* pos = buf;
651
652    while(char* line = LineFromMessage(pos))
653    {
654        FillSystemMessageData(&data, line);
655        m_session->SendPacket(&data);
656    }
657
658    free(buf);
659}
660
661void ChatHandler::SendGlobalSysMessage(const char *str)
662{
663        // Chat output
664    WorldPacket data;
665
666    // need copy to prevent corruption by strtok call in LineFromMessage original string
667    char* buf = strdup(str);
668    char* pos = buf;
669
670    while(char* line = LineFromMessage(pos))
671    {
672        FillSystemMessageData(&data, line);
673        sWorld.SendGlobalMessage(&data);
674    }
675
676    free(buf);
677}
678
679void ChatHandler::SendSysMessage(int32 entry)
680{
681    SendSysMessage(GetTrinityString(entry));
682}
683
684void ChatHandler::PSendSysMessage(int32 entry, ...)
685{
686    const char *format = GetTrinityString(entry);
687    va_list ap;
688    char str [1024];
689    va_start(ap, entry);
690    vsnprintf(str,1024,format, ap );
691    va_end(ap);
692    SendSysMessage(str);
693}
694
695void ChatHandler::PSendSysMessage(const char *format, ...)
696{
697    va_list ap;
698    char str [1024];
699    va_start(ap, format);
700    vsnprintf(str,1024,format, ap );
701    va_end(ap);
702    SendSysMessage(str);
703}
704
705bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, std::string fullcmd)
706{
707    char const* oldtext = text;
708    std::string cmd = "";
709
710    while (*text != ' ' && *text != '\0')
711    {
712        cmd += *text;
713        ++text;
714    }
715
716    while (*text == ' ') ++text;
717
718    for(uint32 i = 0; table[i].Name != NULL; i++)
719    {
720        if( !hasStringAbbr(table[i].Name, cmd.c_str()) )
721            continue;
722
723        // select subcommand from child commands list
724        if(table[i].ChildCommands != NULL)
725        {
726            if(!ExecuteCommandInTable(table[i].ChildCommands, text, fullcmd))
727            {
728                if(text && text[0] != '\0')
729                    SendSysMessage(LANG_NO_SUBCMD);
730                else
731                    SendSysMessage(LANG_CMD_SYNTAX);
732
733                ShowHelpForCommand(table[i].ChildCommands,text);
734            }
735
736            return true;
737        }
738
739        // must be available and have handler
740                if(!table[i].Handler || !isAvailable(table[i]))
741            continue;
742
743        SetSentErrorMessage(false);
744        // table[i].Name == "" is special case: send original command to handler
745        if((this->*(table[i].Handler))(strlen(table[i].Name)!=0 ? text : oldtext))
746        {
747            if(table[i].SecurityLevel > SEC_PLAYER)
748            {
749                // chat case
750                                if(m_session)
751                                {
752                                        Player* p = m_session->GetPlayer();
753                                        uint64 sel_guid = p->GetSelection();
754                                        sLog.outCommand("Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]",
755                                                fullcmd.c_str(),p->GetName(),m_session->GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(),
756                                                GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid));
757                                }
758            }
759        }
760        // some commands have custom error messages. Don't send the default one in these cases.
761        else if(!sentErrorMessage)
762        {
763            if(!table[i].Help.empty())
764                SendSysMessage(table[i].Help.c_str());
765            else
766                SendSysMessage(LANG_CMD_SYNTAX);
767        }
768
769        return true;
770    }
771
772    return false;
773}
774
775int ChatHandler::ParseCommands(const char* text)
776{
777    ASSERT(text);
778    ASSERT(*text);
779
780    //if(m_session->GetSecurity() == 0)
781    //    return 0;
782
783    /// chat case (.command or !command format)
784        if(m_session)
785        {
786                if(text[0] != '!' && text[0] != '.')
787                        return 0;
788        }
789
790    /// ignore single . and ! in line
791    if(strlen(text) < 2)
792        return 0;
793
794    /// ignore messages staring from many dots.
795    if(text[0] == '.' && text[1] == '.' || text[0] == '!' && text[1] == '!')
796        return 0;
797
798    /// skip first . or ! (in console allowed use command with . and ! and without its)
799        if(text[0] == '!' || text[0] == '.')
800                ++text;
801
802    std::string fullcmd = text;                             // original `text` can't be used. It content destroyed in command code processing.
803
804    if(!ExecuteCommandInTable(getCommandTable(), text, fullcmd))
805        SendSysMessage(LANG_NO_CMD);
806
807    return 1;
808}
809
810bool ChatHandler::ShowHelpForSubCommands(ChatCommand *table, char const* cmd, char const* subcmd)
811{
812    std::string list;
813    for(uint32 i = 0; table[i].Name != NULL; ++i)
814    {
815                // must be available (ignore handler existence for show command with possibe avalable subcomands
816        if(!isAvailable(table[i]))
817            continue;
818
819        if( *subcmd && !hasStringAbbr(table[i].Name, subcmd))
820            continue;
821
822        if(m_session)
823            list += "\n    ";
824        else
825            list += "\n\r    ";
826
827        list += table[i].Name;
828
829                if(table[i].ChildCommands)
830                        list += " ...";
831    }
832
833    if(list.empty())
834        return false;
835
836    if(table==getCommandTable())
837    {
838        SendSysMessage(LANG_AVIABLE_CMD);
839        PSendSysMessage("%s",list.c_str());
840    }
841    else
842        PSendSysMessage(LANG_SUBCMDS_LIST,cmd,list.c_str());
843
844    return true;
845}
846
847bool ChatHandler::ShowHelpForCommand(ChatCommand *table, const char* cmd)
848{
849    if(*cmd)
850    {
851        for(uint32 i = 0; table[i].Name != NULL; ++i)
852        {
853                        // must be available (ignore handler existence for show command with possibe avalable subcomands
854            if(!isAvailable(table[i]))
855                continue;
856
857            if( !hasStringAbbr(table[i].Name, cmd) )
858                continue;
859
860            // have subcommand
861            char const* subcmd = (*cmd) ? strtok(NULL, " ") : "";
862
863            if(table[i].ChildCommands && subcmd && *subcmd)
864            {
865                if(ShowHelpForCommand(table[i].ChildCommands, subcmd))
866                    return true;
867            }
868
869            if(!table[i].Help.empty())
870                SendSysMessage(table[i].Help.c_str());
871
872            if(table[i].ChildCommands)
873                if(ShowHelpForSubCommands(table[i].ChildCommands,table[i].Name,subcmd ? subcmd : ""))
874                    return true;
875
876            return !table[i].Help.empty();
877        }
878    }
879    else
880    {
881        for(uint32 i = 0; table[i].Name != NULL; ++i)
882        {
883                        // must be available (ignore handler existence for show command with possibe avalable subcomands
884            if(!isAvailable(table[i]))
885                continue;
886
887            if(strlen(table[i].Name))
888                continue;
889
890            if(!table[i].Help.empty())
891                SendSysMessage(table[i].Help.c_str());
892
893            if(table[i].ChildCommands)
894                if(ShowHelpForSubCommands(table[i].ChildCommands,"",""))
895                    return true;
896
897            return !table[i].Help.empty();
898        }
899    }
900
901    return ShowHelpForSubCommands(table,"",cmd);
902}
903
904//Note: target_guid used only in CHAT_MSG_WHISPER_INFORM mode (in this case channelName ignored)
905void ChatHandler::FillMessageData( WorldPacket *data, WorldSession* session, uint8 type, uint32 language, const char *channelName, uint64 target_guid, const char *message, Unit *speaker)
906{
907    uint32 messageLength = (message ? strlen(message) : 0) + 1;
908
909    data->Initialize(SMSG_MESSAGECHAT, 100);                // guess size
910    *data << uint8(type);
911    if ((type != CHAT_MSG_CHANNEL && type != CHAT_MSG_WHISPER) || language == LANG_ADDON)
912        *data << uint32(language);
913    else
914        *data << uint32(LANG_UNIVERSAL);
915
916    switch(type)
917    {
918        case CHAT_MSG_SAY:
919        case CHAT_MSG_PARTY:
920        case CHAT_MSG_RAID:
921        case CHAT_MSG_GUILD:
922        case CHAT_MSG_OFFICER:
923        case CHAT_MSG_YELL:
924        case CHAT_MSG_WHISPER:
925        case CHAT_MSG_CHANNEL:
926        case CHAT_MSG_RAID_LEADER:
927        case CHAT_MSG_RAID_WARNING:
928        case CHAT_MSG_BG_SYSTEM_NEUTRAL:
929        case CHAT_MSG_BG_SYSTEM_ALLIANCE:
930        case CHAT_MSG_BG_SYSTEM_HORDE:
931        case CHAT_MSG_BATTLEGROUND:
932        case CHAT_MSG_BATTLEGROUND_LEADER:
933            target_guid = session ? session->GetPlayer()->GetGUID() : 0;
934            break;
935        case CHAT_MSG_MONSTER_SAY:
936        case CHAT_MSG_MONSTER_PARTY:
937        case CHAT_MSG_MONSTER_YELL:
938        case CHAT_MSG_MONSTER_WHISPER:
939        case CHAT_MSG_MONSTER_EMOTE:
940        case CHAT_MSG_RAID_BOSS_WHISPER:
941        case CHAT_MSG_RAID_BOSS_EMOTE:
942        {
943            *data << uint64(speaker->GetGUID());
944            *data << uint32(0);                             // 2.1.0
945            *data << uint32(strlen(speaker->GetName()) + 1);
946            *data << speaker->GetName();
947            uint64 listener_guid = 0;
948            *data << uint64(listener_guid);
949            if(listener_guid && !IS_PLAYER_GUID(listener_guid))
950            {
951                *data << uint32(1);                         // string listener_name_length
952                *data << uint8(0);                          // string listener_name
953            }
954            *data << uint32(messageLength);
955            *data << message;
956            *data << uint8(0);
957            return;
958        }
959        default:
960            if (type != CHAT_MSG_REPLY && type != CHAT_MSG_IGNORED && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
961                target_guid = 0;                            // only for CHAT_MSG_WHISPER_INFORM used original value target_guid
962            break;
963    }
964
965    *data << uint64(target_guid);                           // there 0 for BG messages
966    *data << uint32(0);                                     // can be chat msg group or something
967
968    if (type == CHAT_MSG_CHANNEL)
969    {
970        ASSERT(channelName);
971        *data << channelName;
972    }
973
974    *data << uint64(target_guid);
975    *data << uint32(messageLength);
976    *data << message;
977    if(session != 0 && type != CHAT_MSG_REPLY && type != CHAT_MSG_DND && type != CHAT_MSG_AFK)
978        *data << uint8(session->GetPlayer()->chatTag());
979    else
980        *data << uint8(0);
981}
982
983Player * ChatHandler::getSelectedPlayer()
984{
985        if(!m_session)
986                return NULL;
987
988    uint64 guid  = m_session->GetPlayer()->GetSelection();
989
990    if (guid == 0)
991        return m_session->GetPlayer();
992
993    return objmgr.GetPlayer(guid);
994}
995
996Unit* ChatHandler::getSelectedUnit()
997{
998        if(!m_session)
999                return NULL;
1000
1001    uint64 guid = m_session->GetPlayer()->GetSelection();
1002
1003    if (guid == 0)
1004        return m_session->GetPlayer();
1005
1006    return ObjectAccessor::GetUnit(*m_session->GetPlayer(),guid);
1007}
1008
1009Creature* ChatHandler::getSelectedCreature()
1010{
1011        if(!m_session)
1012                return NULL;
1013
1014    return ObjectAccessor::GetCreatureOrPet(*m_session->GetPlayer(),m_session->GetPlayer()->GetSelection());
1015}
1016
1017char* ChatHandler::extractKeyFromLink(char* text, char const* linkType, char** something1)
1018{
1019    // skip empty
1020    if(!text)
1021        return NULL;
1022
1023    // skip speces
1024    while(*text==' '||*text=='\t'||*text=='\b')
1025        ++text;
1026
1027    if(!*text)
1028        return NULL;
1029
1030    // return non link case
1031    if(text[0]!='|')
1032        return strtok(text, " ");
1033
1034    // [name] Shift-click form |color|linkType:key|h[name]|h|r
1035    // or
1036    // [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r
1037
1038    char* check = strtok(text, "|");                        // skip color
1039    if(!check)
1040        return NULL;                                        // end of data
1041
1042    char* cLinkType = strtok(NULL, ":");                    // linktype
1043    if(!cLinkType)
1044        return NULL;                                        // end of data
1045
1046    if(strcmp(cLinkType,linkType) != 0)
1047    {
1048        strtok(NULL, " ");                                  // skip link tail (to allow continue strtok(NULL,s) use after retturn from function
1049        SendSysMessage(LANG_WRONG_LINK_TYPE);
1050        return NULL;
1051    }
1052
1053    char* cKeys = strtok(NULL, "|");                        // extract keys and values
1054    char* cKeysTail = strtok(NULL, "");
1055
1056    char* cKey = strtok(cKeys, ":|");                       // extract key
1057    if(something1)
1058        *something1 = strtok(NULL, ":|");                   // extract something
1059
1060    strtok(cKeysTail, "]");                                 // restart scan tail and skip name with possible spaces
1061    strtok(NULL, " ");                                      // skip link tail (to allow continue strtok(NULL,s) use after retturn from function
1062    return cKey;
1063}
1064
1065char* ChatHandler::extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1)
1066{
1067    // skip empty
1068    if(!text)
1069        return NULL;
1070
1071    // skip speces
1072    while(*text==' '||*text=='\t'||*text=='\b')
1073        ++text;
1074
1075    if(!*text)
1076        return NULL;
1077
1078    // return non link case
1079    if(text[0]!='|')
1080        return strtok(text, " ");
1081
1082    // [name] Shift-click form |color|linkType:key|h[name]|h|r
1083    // or
1084    // [name] Shift-click form |color|linkType:key:something1:...:somethingN|h[name]|h|r
1085
1086    char* check = strtok(text, "|");                        // skip color
1087    if(!check)
1088        return NULL;                                        // end of data
1089
1090    char* cLinkType = strtok(NULL, ":");                    // linktype
1091    if(!cLinkType)
1092        return NULL;                                        // end of data
1093
1094    for(int i = 0; linkTypes[i]; ++i)
1095    {
1096        if(strcmp(cLinkType,linkTypes[i]) == 0)
1097        {
1098            char* cKeys = strtok(NULL, "|");                // extract keys and values
1099            char* cKeysTail = strtok(NULL, "");
1100
1101            char* cKey = strtok(cKeys, ":|");               // extract key
1102            if(something1)
1103                *something1 = strtok(NULL, ":|");           // extract something
1104
1105            strtok(cKeysTail, "]");                         // restart scan tail and skip name with possible spaces
1106            strtok(NULL, " ");                              // skip link tail (to allow continue strtok(NULL,s) use after return from function
1107            if(found_idx)
1108                *found_idx = i;
1109            return cKey;
1110        }
1111    }
1112
1113    strtok(NULL, " ");                                      // skip link tail (to allow continue strtok(NULL,s) use after return from function
1114    SendSysMessage(LANG_WRONG_LINK_TYPE);
1115    return NULL;
1116}
1117
1118char const *fmtstring( char const *format, ... )
1119{
1120    va_list        argptr;
1121    #define    MAX_FMT_STRING    32000
1122    static char        temp_buffer[MAX_FMT_STRING];
1123    static char        string[MAX_FMT_STRING];
1124    static int        index = 0;
1125    char    *buf;
1126    int len;
1127
1128    va_start(argptr, format);
1129    vsnprintf(temp_buffer,MAX_FMT_STRING, format, argptr);
1130    va_end(argptr);
1131
1132    len = strlen(temp_buffer);
1133
1134    if( len >= MAX_FMT_STRING )
1135        return "ERROR";
1136
1137    if (len + index >= MAX_FMT_STRING-1)
1138    {
1139        index = 0;
1140    }
1141
1142    buf = &string[index];
1143    memcpy( buf, temp_buffer, len+1 );
1144
1145    index += len + 1;
1146
1147    return buf;
1148}
1149
1150GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry)
1151{
1152        if(!m_session)
1153                return NULL;
1154
1155    Player* pl = m_session->GetPlayer();
1156
1157    GameObject* obj = ObjectAccessor::GetGameObject(*pl, MAKE_NEW_GUID(lowguid, entry, HIGHGUID_GAMEOBJECT));
1158
1159    if(!obj && objmgr.GetGOData(lowguid))                   // guid is DB guid of object
1160    {
1161        // search near player then
1162        CellPair p(Trinity::ComputeCellPair(pl->GetPositionX(), pl->GetPositionY()));
1163        Cell cell(p);
1164        cell.data.Part.reserved = ALL_DISTRICT;
1165
1166        Trinity::GameObjectWithDbGUIDCheck go_check(*pl,lowguid);
1167        Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(obj,go_check);
1168
1169        TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker);
1170        CellLock<GridReadGuard> cell_lock(cell, p);
1171        cell_lock->Visit(cell_lock, object_checker, *MapManager::Instance().GetMap(pl->GetMapId(), pl));
1172    }
1173
1174    return obj;
1175}
1176
1177static char const* const spellTalentKeys[] = {
1178    "Hspell",
1179    "Htalent",
1180    0
1181};
1182
1183uint32 ChatHandler::extractSpellIdFromLink(char* text)
1184{
1185    // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r
1186    // number or [name] Shift-click form |color|Htalent:telen_id,rank|h[name]|h|r
1187    int type = 0;
1188    char* rankS = NULL;
1189    char* idS = extractKeyFromLink(text,spellTalentKeys,&type,&rankS);
1190    if(!idS)
1191        return 0;
1192
1193    uint32 id = (uint32)atol(idS);
1194
1195    // spell
1196    if(type==0)
1197        return id;
1198
1199    // talent
1200    TalentEntry const* talentEntry = sTalentStore.LookupEntry(id);
1201    if(!talentEntry)
1202        return 0;
1203
1204    int32 rank = rankS ? (uint32)atol(rankS) : 0;
1205    if(rank >= 5)
1206        return 0;
1207
1208    if(rank < 0)
1209        rank = 0;
1210
1211    return talentEntry->RankID[rank];
1212}
1213
1214GameTele const* ChatHandler::extractGameTeleFromLink(char* text)
1215{
1216    // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
1217    char* cId = extractKeyFromLink(text,"Htele");
1218    if(!cId)
1219        return false;
1220
1221    // id case (explicit or from shift link)
1222    if(cId[0] >= '0' || cId[0] >= '9')
1223        if(uint32 id = atoi(cId))
1224            return objmgr.GetGameTele(id);
1225
1226    return objmgr.GetGameTele(cId);
1227}
1228
1229const char *ChatHandler::GetName() const
1230{
1231    return m_session->GetPlayer()->GetName();
1232}
1233
1234bool ChatHandler::needReportToTarget(Player* chr) const
1235{
1236    Player* pl = m_session->GetPlayer();
1237    return pl != chr && pl->IsVisibleGloballyFor(chr);
1238}
1239   
1240const char *CliHandler::GetTrinityString(int32 entry) const
1241{
1242        return objmgr.GetTrinityStringForDBCLocale(entry);
1243}
1244
1245bool CliHandler::isAvailable(ChatCommand const& cmd) const
1246{
1247        // skip non-console commands in console case
1248        return cmd.AllowConsole;
1249}
1250
1251void CliHandler::SendSysMessage(const char *str)
1252{
1253        m_print(str);
1254        m_print("\r\n");
1255}
1256
1257const char *CliHandler::GetName() const
1258{
1259    return GetTrinityString(LANG_CONSOLE_COMMAND);
1260}
1261
1262bool CliHandler::needReportToTarget(Player* /*chr*/) const
1263{
1264    return true;
1265}
1266
1267bool ChatHandler::GetPlayerGroupAndGUIDByName(const char* cname, Player* &plr, Group* &group, uint64 &guid, bool offline)
1268{
1269    plr  = NULL;
1270    guid = 0;
1271
1272    if(cname)
1273    {
1274        std::string name = cname;
1275        if(!name.empty())
1276        {
1277            if(!normalizePlayerName(name))
1278            {
1279                PSendSysMessage(LANG_PLAYER_NOT_FOUND);
1280                SetSentErrorMessage(true);
1281                return false;
1282            }
1283
1284            plr = objmgr.GetPlayer(name.c_str());
1285            if(offline)
1286                guid = objmgr.GetPlayerGUIDByName(name.c_str());
1287        }
1288    }
1289
1290    if(plr)
1291    {
1292        group = plr->GetGroup();
1293        if(!guid || !offline)
1294            guid = plr->GetGUID();
1295    }
1296    else
1297    {
1298        if(getSelectedPlayer())
1299            plr = getSelectedPlayer();
1300        else
1301            plr = m_session->GetPlayer();
1302
1303        if(!guid || !offline)
1304            guid  = plr->GetGUID();
1305        group = plr->GetGroup();
1306    }
1307
1308    return true;
1309}
Note: See TracBrowser for help on using the browser.