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

Revision 260, 72.0 kB (checked in by yumileroy, 17 years ago)

*DB script table stucture change. Source Mangos. Also fix some bugs. Hopefully this rev will make program usable again.

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