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

Revision 79, 59.8 kB (checked in by yumileroy, 17 years ago)

[svn] * Minor code fixes
* Move account related functions from ObjectMgr? to AccountMgr? and drop duplicate functions - source mangos
* recognize the dummy spells 38637, 38638 and 38639 as negative - source mangos
* added new command ".reload all_locales". Now all locales_* tables can be reloaded - source mangos

Original author: KingPin?
Date: 2008-10-20 12:59:45-05:00

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